diff --git a/BABaseProject.xcodeproj/project.pbxproj b/BABaseProject.xcodeproj/project.pbxproj index 53b35c2..6dfd249 100755 --- a/BABaseProject.xcodeproj/project.pbxproj +++ b/BABaseProject.xcodeproj/project.pbxproj @@ -9,8 +9,13 @@ /* Begin PBXBuildFile section */ 0A2263DDA3BEC585020264E0 /* libPods-BABaseProjectUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 77795B692E80399FDA1BD963 /* libPods-BABaseProjectUITests.a */; }; 5C5C57EED15443424D1F9E04 /* libPods-BABaseProjectTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1574EF9FCBB113FDCC972156 /* libPods-BABaseProjectTests.a */; }; - 6E470DCC8E8F7DFE93E782E5 /* libPods-BABaseProject-BABaseProjectUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EB54BFBC1CA5F4765E84B54C /* libPods-BABaseProject-BABaseProjectUITests.a */; }; - C3F6369929471C65565BE195 /* libPods-BABaseProject-BABaseProjectTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF87F3C10B89949A3DB1CDEC /* libPods-BABaseProject-BABaseProjectTests.a */; }; + 859CBDBC1C0B897C477F1830 /* libPods-BABaseProject.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 539C5D5ABB06B9E52C89A5CE /* libPods-BABaseProject.a */; }; + 9C93D6B420BD2718002FB06B /* HMSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C93D6B220BD2718002FB06B /* HMSegmentedControl.m */; }; + BC125F9D71FBD9A5C5530CAA /* libPods-BABaseProject-BABaseProjectUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7379A219A22C69FA7095C49C /* libPods-BABaseProject-BABaseProjectUITests.a */; }; + C07169A416BB3C73F9B14968 /* libPods-BABaseProject-BABaseProjectTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1694997B390478F9A51051C8 /* libPods-BABaseProject-BABaseProjectTests.a */; }; + C407E5501DE533FD00FB1244 /* NSMutableArray+BASort.m in Sources */ = {isa = PBXBuildFile; fileRef = C407E54F1DE533FD00FB1244 /* NSMutableArray+BASort.m */; }; + C407E5541DE5343000FB1244 /* DemoVC2_07.m in Sources */ = {isa = PBXBuildFile; fileRef = C407E5521DE5343000FB1244 /* DemoVC2_07.m */; }; + C407E5551DE5343000FB1244 /* DemoVC2_07.xib in Resources */ = {isa = PBXBuildFile; fileRef = C407E5531DE5343000FB1244 /* DemoVC2_07.xib */; }; C408527C1CD990B00004A671 /* BABaseTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C408527B1CD990B00004A671 /* BABaseTableViewController.m */; }; C40852801CD995200004A671 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = C408527F1CD995200004A671 /* Reachability.m */; }; C40852881CD9C34F0004A671 /* BABaseView.m in Sources */ = {isa = PBXBuildFile; fileRef = C40852871CD9C34F0004A671 /* BABaseView.m */; }; @@ -27,6 +32,14 @@ C40852E81CDA263B0004A671 /* RDVTabBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C40852E51CDA263B0004A671 /* RDVTabBarItem.m */; }; C40852E91CDA263B0004A671 /* RDVTabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = C40852E71CDA263B0004A671 /* RDVTabBar.m */; }; C40852EC1CDA26680004A671 /* RDVTabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C40852EB1CDA26680004A671 /* RDVTabBarController.m */; }; + C41175501DF7C08E00802612 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C411754F1DF7C08E00802612 /* SystemConfiguration.framework */; }; + C41175521DF7C09700802612 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C41175511DF7C09700802612 /* CoreTelephony.framework */; }; + C41175541DF7C0A000802612 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C41175531DF7C0A000802612 /* ImageIO.framework */; }; + C41175561DF7C0A900802612 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C41175551DF7C0A900802612 /* libsqlite3.tbd */; }; + C41175581DF7C0B300802612 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C41175571DF7C0B300802612 /* libz.tbd */; }; + C411755A1DF7C0D200802612 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C41175591DF7C0D200802612 /* libc++.tbd */; }; + C411755C1DF7E55700802612 /* BAUmengFile.txt in Resources */ = {isa = PBXBuildFile; fileRef = C411755B1DF7E55700802612 /* BAUmengFile.txt */; }; + C411755E1DF7FD6600802612 /* gif3.gif in Resources */ = {isa = PBXBuildFile; fileRef = C411755D1DF7FD6600802612 /* gif3.gif */; }; C41CA8C41D3FA049006296BD /* DemoVC2_02_studentModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C41CA8C31D3FA049006296BD /* DemoVC2_02_studentModel.m */; }; C41CA8C71D3FA185006296BD /* DemoVC2_02_classModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C41CA8C61D3FA185006296BD /* DemoVC2_02_classModel.m */; }; C41CA8CA1D3FA3BF006296BD /* DemoVC2_02_studentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C41CA8C91D3FA3BF006296BD /* DemoVC2_02_studentCell.m */; }; @@ -37,40 +50,31 @@ C427811D1D2D2881003E6694 /* BABaseCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C427811C1D2D2881003E6694 /* BABaseCell.m */; }; C42781201D2D315B003E6694 /* BABaseCollectionCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C427811F1D2D315B003E6694 /* BABaseCollectionCell.m */; }; C42781231D2D338F003E6694 /* DemoVC2_01_cell.m in Sources */ = {isa = PBXBuildFile; fileRef = C42781221D2D338F003E6694 /* DemoVC2_01_cell.m */; }; - C427812E1D2D39B1003E6694 /* GCDGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C42781271D2D39B1003E6694 /* GCDGroup.m */; }; - C427812F1D2D39B1003E6694 /* GCDQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = C42781291D2D39B1003E6694 /* GCDQueue.m */; }; - C42781301D2D39B1003E6694 /* GCDSemaphore.m in Sources */ = {isa = PBXBuildFile; fileRef = C427812B1D2D39B1003E6694 /* GCDSemaphore.m */; }; - C42781311D2D39B1003E6694 /* GCDTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = C427812D1D2D39B1003E6694 /* GCDTimer.m */; }; - C42A6AE31CDAE10500D534EE /* BATabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = C42A6ADE1CDAE10500D534EE /* BATabBar.m */; }; - C42A6AE41CDAE10500D534EE /* BATabBarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = C42A6AE01CDAE10500D534EE /* BATabBarButton.m */; }; C42A6AE51CDAE10500D534EE /* BABadgeView.m in Sources */ = {isa = PBXBuildFile; fileRef = C42A6AE21CDAE10500D534EE /* BABadgeView.m */; }; - C42A6AE81CDAE10D00D534EE /* BATabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C42A6AE71CDAE10D00D534EE /* BATabBarController.m */; }; C42DAA431D37269300FE8B3E /* DemoVC2_03.m in Sources */ = {isa = PBXBuildFile; fileRef = C42DAA421D37269300FE8B3E /* DemoVC2_03.m */; }; C42DAA481D3763A800FE8B3E /* discoverVC.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C42DAA441D3763A700FE8B3E /* discoverVC.bundle */; }; C42DAA491D3763A800FE8B3E /* homeVC.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C42DAA451D3763A700FE8B3E /* homeVC.bundle */; }; C42DAA4A1D3763A800FE8B3E /* messageVC.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C42DAA461D3763A700FE8B3E /* messageVC.bundle */; }; C42DAA4B1D3763A800FE8B3E /* profileVC.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C42DAA471D3763A700FE8B3E /* profileVC.bundle */; }; C42DAA4D1D37669C00FE8B3E /* otherImages.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C42DAA4C1D37669C00FE8B3E /* otherImages.bundle */; }; + C4309BB11DCAD4D50016ABE6 /* BALoadingHubView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4309BB01DCAD4D50016ABE6 /* BALoadingHubView.m */; }; + C4309BBC1DCAD5C40016ABE6 /* BAUserStatistics.m in Sources */ = {isa = PBXBuildFile; fileRef = C4309BB51DCAD5C40016ABE6 /* BAUserStatistics.m */; }; + C4309BBD1DCAD5C40016ABE6 /* NSObject+BAHook.m in Sources */ = {isa = PBXBuildFile; fileRef = C4309BB71DCAD5C40016ABE6 /* NSObject+BAHook.m */; }; + C4309BBE1DCAD5C40016ABE6 /* UIControl+BAUserStastistics.m in Sources */ = {isa = PBXBuildFile; fileRef = C4309BB91DCAD5C40016ABE6 /* UIControl+BAUserStastistics.m */; }; + C4309BBF1DCAD5C40016ABE6 /* UIViewController+BAHook.m in Sources */ = {isa = PBXBuildFile; fileRef = C4309BBB1DCAD5C40016ABE6 /* UIViewController+BAHook.m */; }; C430AB761CDC8A360086DDD6 /* DemoVC3.m in Sources */ = {isa = PBXBuildFile; fileRef = C430AB751CDC8A360086DDD6 /* DemoVC3.m */; }; - C44423261D2E5D67004ACAA8 /* BAKitManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423251D2E5D66004ACAA8 /* BAKitManager.m */; }; - C444232A1D2E5E07004ACAA8 /* BAKitManager+BALabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423291D2E5E07004ACAA8 /* BAKitManager+BALabel.m */; }; - C44423301D2E738A004ACAA8 /* BAAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = C444232D1D2E738A004ACAA8 /* BAAlertView.m */; }; - C44423311D2E738A004ACAA8 /* BAModal.m in Sources */ = {isa = PBXBuildFile; fileRef = C444232F1D2E738A004ACAA8 /* BAModal.m */; }; + C43222D41DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = C43222D31DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.m */; }; C44423341D2E7775004ACAA8 /* BABaseHeaderFooterView.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423331D2E7775004ACAA8 /* BABaseHeaderFooterView.m */; }; - C44423381D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423371D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.m */; }; - C44423451D2E824D004ACAA8 /* BARotateView.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423441D2E824D004ACAA8 /* BARotateView.m */; }; C44423491D2E85B8004ACAA8 /* DemoVC2_02.m in Sources */ = {isa = PBXBuildFile; fileRef = C44423481D2E85B8004ACAA8 /* DemoVC2_02.m */; }; C444234C1D2E8680004ACAA8 /* DemoVC2_02_HeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = C444234B1D2E8680004ACAA8 /* DemoVC2_02_HeaderView.m */; }; - C445E1CE1D1B86FE00D7654A /* SXColorGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1C11D1B86FE00D7654A /* SXColorGradientView.m */; }; - C445E1CF1D1B86FE00D7654A /* SXColorLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1C31D1B86FE00D7654A /* SXColorLabel.m */; }; - C445E1D01D1B86FE00D7654A /* SXHeadLine.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1C51D1B86FE00D7654A /* SXHeadLine.m */; }; - C445E1D11D1B86FE00D7654A /* SXMarquee.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1C71D1B86FE00D7654A /* SXMarquee.m */; }; - C445E1D21D1B86FE00D7654A /* UIColor+Separate.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1C91D1B86FE00D7654A /* UIColor+Separate.m */; }; - C445E1D31D1B86FE00D7654A /* UIColor+Wonderful.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1CB1D1B86FE00D7654A /* UIColor+Wonderful.m */; }; - C445E1D41D1B86FE00D7654A /* UILabel+Wonderful.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1CD1D1B86FE00D7654A /* UILabel+Wonderful.m */; }; + C44564311E791BE3007D5692 /* BALoginViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C44564301E791BE3007D5692 /* BALoginViewModel.m */; }; C445E1F51D1BF10A00D7654A /* DemoVC13.m in Sources */ = {isa = PBXBuildFile; fileRef = C445E1F41D1BF10A00D7654A /* DemoVC13.m */; }; + C44C00CE1DCB268C00BAAAEC /* DemoVC2_05_test2.m in Sources */ = {isa = PBXBuildFile; fileRef = C44C00CD1DCB268C00BAAAEC /* DemoVC2_05_test2.m */; }; + C44C00D01DCB283700BAAAEC /* BADemoUserStatisticsConfig.plist in Resources */ = {isa = PBXBuildFile; fileRef = C44C00CF1DCB283700BAAAEC /* BADemoUserStatisticsConfig.plist */; }; + C44C00D31DCB30BA00BAAAEC /* UIButton+BAHook.m in Sources */ = {isa = PBXBuildFile; fileRef = C44C00D21DCB30BA00BAAAEC /* UIButton+BAHook.m */; }; C4562C6B1CDD9F05000F5710 /* DemoVC4.m in Sources */ = {isa = PBXBuildFile; fileRef = C4562C6A1CDD9F05000F5710 /* DemoVC4.m */; }; C4562C7E1CDDBE44000F5710 /* DemoVC5.m in Sources */ = {isa = PBXBuildFile; fileRef = C4562C7D1CDDBE44000F5710 /* DemoVC5.m */; }; + C457EA461DADD6E600CD0B91 /* DemoVC2_06.m in Sources */ = {isa = PBXBuildFile; fileRef = C457EA451DADD6E600CD0B91 /* DemoVC2_06.m */; }; C46B89F91CE055DD00005E2B /* DemoVC5Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = C46B89F81CE055DD00005E2B /* DemoVC5Cell.m */; }; C46B89FC1CE0AE3400005E2B /* DemoVC5_TextPart.m in Sources */ = {isa = PBXBuildFile; fileRef = C46B89FB1CE0AE3400005E2B /* DemoVC5_TextPart.m */; }; C46B8A041CE0BAC200005E2B /* RegexKitLite.m in Sources */ = {isa = PBXBuildFile; fileRef = C46B8A031CE0BAC200005E2B /* RegexKitLite.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; @@ -79,60 +83,65 @@ C473CC791CF72372001883A9 /* DemoVC9.m in Sources */ = {isa = PBXBuildFile; fileRef = C473CC781CF72372001883A9 /* DemoVC9.m */; }; C473CC7B1CF72439001883A9 /* BACollectionView.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C473CC7A1CF72439001883A9 /* BACollectionView.bundle */; }; C473CC811CF72960001883A9 /* DemoVC9_Model.m in Sources */ = {isa = PBXBuildFile; fileRef = C473CC801CF72960001883A9 /* DemoVC9_Model.m */; }; + C474FE771DACB996007755D3 /* DemoVC2_05.m in Sources */ = {isa = PBXBuildFile; fileRef = C474FE751DACB996007755D3 /* DemoVC2_05.m */; }; + C474FE781DACB996007755D3 /* DemoVC2_05.xib in Resources */ = {isa = PBXBuildFile; fileRef = C474FE761DACB996007755D3 /* DemoVC2_05.xib */; }; + C47660A61DE82C2E00522BEE /* BAProfileViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C47660A51DE82C2E00522BEE /* BAProfileViewController.xib */; }; + C4772B1E1D8F8DB6002B73CD /* BATabBar.m in Sources */ = {isa = PBXBuildFile; fileRef = C4772B1B1D8F8DB6002B73CD /* BATabBar.m */; }; + C4772B1F1D8F8DB6002B73CD /* BATabBarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = C4772B1D1D8F8DB6002B73CD /* BATabBarButton.m */; }; + C4772B221D8F8F16002B73CD /* BATabBarController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4772B211D8F8F16002B73CD /* BATabBarController.m */; }; C48026C71D191EC90087BBB9 /* DemoVC11.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026C01D191EC90087BBB9 /* DemoVC11.m */; }; C48026C81D191EC90087BBB9 /* DemoVC11_AutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026C21D191EC90087BBB9 /* DemoVC11_AutoLayout.m */; }; C48026C91D191EC90087BBB9 /* DemoVC11_Cell.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026C41D191EC90087BBB9 /* DemoVC11_Cell.m */; }; C48026CA1D191EC90087BBB9 /* DemoVC11_model.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026C61D191EC90087BBB9 /* DemoVC11_model.m */; }; C48026CE1D191F720087BBB9 /* DemoVC12.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026CD1D191F720087BBB9 /* DemoVC12.m */; }; - C48026D11D1920110087BBB9 /* DemoVC12View.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026D01D1920110087BBB9 /* DemoVC12View.m */; }; - C480272D1D1928290087BBB9 /* BAAPP.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026D51D1928290087BBB9 /* BAAPP.m */; }; - C480272E1D1928290087BBB9 /* BAAutoSizeWithWH.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026D71D1928290087BBB9 /* BAAutoSizeWithWH.m */; }; - C480272F1D1928290087BBB9 /* BALog.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026D91D1928290087BBB9 /* BALog.m */; }; - C48027311D1928290087BBB9 /* BAPassword.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026DD1D1928290087BBB9 /* BAPassword.m */; }; - C48027321D1928290087BBB9 /* BARegularExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026DF1D1928290087BBB9 /* BARegularExpression.m */; }; - C48027341D1928290087BBB9 /* BASystemSound.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026E31D1928290087BBB9 /* BASystemSound.m */; }; - C48027351D1928290087BBB9 /* BATouchID.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026E51D1928290087BBB9 /* BATouchID.m */; }; - C48027361D1928290087BBB9 /* NSArray+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026E91D1928290087BBB9 /* NSArray+BAKit.m */; }; - C48027371D1928290087BBB9 /* NSData+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026EB1D1928290087BBB9 /* NSData+BAKit.m */; }; - C48027381D1928290087BBB9 /* NSDate+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026ED1D1928290087BBB9 /* NSDate+BAKit.m */; }; - C48027391D1928290087BBB9 /* NSDictionary+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026EF1D1928290087BBB9 /* NSDictionary+BAKit.m */; }; - C480273A1D1928290087BBB9 /* NSFileManager+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026F11D1928290087BBB9 /* NSFileManager+BAKit.m */; }; - C480273B1D1928290087BBB9 /* NSMutableArray+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026F31D1928290087BBB9 /* NSMutableArray+BAKit.m */; }; - C480273C1D1928290087BBB9 /* NSMutableDictionary+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026F51D1928290087BBB9 /* NSMutableDictionary+BAKit.m */; }; - C480273D1D1928290087BBB9 /* NSNumber+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026F71D1928290087BBB9 /* NSNumber+BAKit.m */; }; - C480273E1D1928290087BBB9 /* NSProcessInfo+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026F91D1928290087BBB9 /* NSProcessInfo+BAKit.m */; }; - C48027401D1928290087BBB9 /* NSThread+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48026FD1D1928290087BBB9 /* NSThread+BAKit.m */; }; - C48027411D1928290087BBB9 /* BACustomModalTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027001D1928290087BBB9 /* BACustomModalTransition.m */; }; - C48027421D1928290087BBB9 /* BAPickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027021D1928290087BBB9 /* BAPickerView.m */; }; - C48027431D1928290087BBB9 /* BATextView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027041D1928290087BBB9 /* BATextView.m */; }; - C48027441D1928290087BBB9 /* UIButton+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027061D1928290087BBB9 /* UIButton+BAKit.m */; }; - C48027451D1928290087BBB9 /* UIColor+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027081D1928290087BBB9 /* UIColor+BAKit.m */; }; - C48027461D1928290087BBB9 /* UIDevice+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480270A1D1928290087BBB9 /* UIDevice+BAKit.m */; }; - C48027471D1928290087BBB9 /* UIFont+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480270C1D1928290087BBB9 /* UIFont+BAKit.m */; }; - C48027481D1928290087BBB9 /* UIImage+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480270E1D1928290087BBB9 /* UIImage+BAKit.m */; }; - C48027491D1928290087BBB9 /* UIImageView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027101D1928290087BBB9 /* UIImageView+BAKit.m */; }; - C480274A1D1928290087BBB9 /* UILabel+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027121D1928290087BBB9 /* UILabel+BAKit.m */; }; - C480274B1D1928290087BBB9 /* UIScrollView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027141D1928290087BBB9 /* UIScrollView+BAKit.m */; }; - C480274C1D1928290087BBB9 /* UITableView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027161D1928290087BBB9 /* UITableView+BAKit.m */; }; - C480274D1D1928290087BBB9 /* UITextField+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027181D1928290087BBB9 /* UITextField+BAKit.m */; }; - C480274E1D1928290087BBB9 /* UIView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480271A1D1928290087BBB9 /* UIView+BAKit.m */; }; - C480274F1D1928290087BBB9 /* UIWebView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480271C1D1928290087BBB9 /* UIWebView+BAKit.m */; }; - C48027501D1928290087BBB9 /* UIWindow+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C480271E1D1928290087BBB9 /* UIWindow+BAKit.m */; }; - C48027511D1928290087BBB9 /* BAFadeBlackView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027221D1928290087BBB9 /* BAFadeBlackView.m */; }; - C48027521D1928290087BBB9 /* BASnowView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027241D1928290087BBB9 /* BASnowView.m */; }; - C48027531D1928290087BBB9 /* BAUpdatingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027261D1928290087BBB9 /* BAUpdatingView.m */; }; - C48027541D1928290087BBB9 /* CALayer+BAMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C48027281D1928290087BBB9 /* CALayer+BAMaskLayer.m */; }; - C48027551D1928290087BBB9 /* EmitterLayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = C480272A1D1928290087BBB9 /* EmitterLayerView.m */; }; - C48027561D1928290087BBB9 /* UIView+BAGlowView.m in Sources */ = {isa = PBXBuildFile; fileRef = C480272C1D1928290087BBB9 /* UIView+BAGlowView.m */; }; - C485562C1D3CB01700002FA2 /* UINavigationController+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C485562B1D3CB01700002FA2 /* UINavigationController+BAKit.m */; }; - C48556301D3CB2DD00002FA2 /* UINavigationBar+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C485562F1D3CB2DD00002FA2 /* UINavigationBar+BAKit.m */; }; - C48556331D3CC39900002FA2 /* UIBarButtonItem+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48556321D3CC39900002FA2 /* UIBarButtonItem+BAKit.m */; }; - C48556361D3CC74600002FA2 /* NSDateFormatter+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C48556351D3CC74600002FA2 /* NSDateFormatter+BAKit.m */; }; + C484C0C21DED4D25004D54C0 /* BAProfileHeadCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C484C0C01DED4D25004D54C0 /* BAProfileHeadCell.m */; }; + C484C0C31DED4D25004D54C0 /* BAProfileHeadCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = C484C0C11DED4D25004D54C0 /* BAProfileHeadCell.xib */; }; + C48E37571EE29B9E0047A7C8 /* CustomView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37511EE29B9E0047A7C8 /* CustomView.m */; }; + C48E37581EE29B9E0047A7C8 /* ViewController2.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37531EE29B9E0047A7C8 /* ViewController2.m */; }; + C48E37591EE29B9E0047A7C8 /* 123.png in Resources */ = {isa = PBXBuildFile; fileRef = C48E37541EE29B9E0047A7C8 /* 123.png */; }; + C48E375A1EE29B9E0047A7C8 /* 背景.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C48E37551EE29B9E0047A7C8 /* 背景.jpg */; }; + C48E375B1EE29B9E0047A7C8 /* 美女.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C48E37561EE29B9E0047A7C8 /* 美女.jpg */; }; + C48E376B1EE2A43B0047A7C8 /* SXColorGradientView.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E375E1EE2A43B0047A7C8 /* SXColorGradientView.m */; }; + C48E376C1EE2A43B0047A7C8 /* SXColorLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37601EE2A43B0047A7C8 /* SXColorLabel.m */; }; + C48E376D1EE2A43B0047A7C8 /* SXHeadLine.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37621EE2A43B0047A7C8 /* SXHeadLine.m */; }; + C48E376E1EE2A43B0047A7C8 /* SXMarquee.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37641EE2A43B0047A7C8 /* SXMarquee.m */; }; + C48E376F1EE2A43B0047A7C8 /* UIColor+Separate.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37661EE2A43B0047A7C8 /* UIColor+Separate.m */; }; + C48E37701EE2A43B0047A7C8 /* UIColor+Wonderful.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37681EE2A43B0047A7C8 /* UIColor+Wonderful.m */; }; + C48E37711EE2A43B0047A7C8 /* UILabel+Wonderful.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E376A1EE2A43B0047A7C8 /* UILabel+Wonderful.m */; }; + C48E37741EE2A5B50047A7C8 /* BAKit_RegularExpression.m in Sources */ = {isa = PBXBuildFile; fileRef = C48E37731EE2A5B50047A7C8 /* BAKit_RegularExpression.m */; }; + C4A737E91DEC124400C93B40 /* BAUserSqlite.m in Sources */ = {isa = PBXBuildFile; fileRef = C4A737E81DEC124400C93B40 /* BAUserSqlite.m */; }; + C4AC635D1EEF70AD00DEEDC7 /* DemoVC2_05_test3.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC635C1EEF70AD00DEEDC7 /* DemoVC2_05_test3.m */; }; + C4AC636B1EEF717C00DEEDC7 /* BAKit_Const.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63611EEF717C00DEEDC7 /* BAKit_Const.m */; }; + C4AC636C1EEF717C00DEEDC7 /* BAKit_Const_Color.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63631EEF717C00DEEDC7 /* BAKit_Const_Color.m */; }; + C4AC63881EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC636F1EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.m */; }; + C4AC63891EEF71AB00DEEDC7 /* NSString+BAColor.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63711EEF71AB00DEEDC7 /* NSString+BAColor.m */; }; + C4AC638A1EEF71AB00DEEDC7 /* NSString+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63731EEF71AB00DEEDC7 /* NSString+BAKit.m */; }; + C4AC638B1EEF71AB00DEEDC7 /* NSString+BANSNumber.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63751EEF71AB00DEEDC7 /* NSString+BANSNumber.m */; }; + C4AC638C1EEF71AB00DEEDC7 /* NSString+BARange.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63771EEF71AB00DEEDC7 /* NSString+BARange.m */; }; + C4AC638D1EEF71AB00DEEDC7 /* NSString+BARegular.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63791EEF71AB00DEEDC7 /* NSString+BARegular.m */; }; + C4AC638E1EEF71AB00DEEDC7 /* NSString+BASize.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC637B1EEF71AB00DEEDC7 /* NSString+BASize.m */; }; + C4AC638F1EEF71AB00DEEDC7 /* NSString+BATime.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC637D1EEF71AB00DEEDC7 /* NSString+BATime.m */; }; + C4AC63901EEF71AB00DEEDC7 /* NSString+BATransform.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC637F1EEF71AB00DEEDC7 /* NSString+BATransform.m */; }; + C4AC63911EEF71AB00DEEDC7 /* NSString+BATrims.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63811EEF71AB00DEEDC7 /* NSString+BATrims.m */; }; + C4AC63921EEF71AB00DEEDC7 /* NSString+BAUIButton.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63831EEF71AB00DEEDC7 /* NSString+BAUIButton.m */; }; + C4AC63931EEF71AB00DEEDC7 /* NSString+BAEncrypt.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63851EEF71AB00DEEDC7 /* NSString+BAEncrypt.m */; }; + C4AC63941EEF71AB00DEEDC7 /* NSString+BAEmoji.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63871EEF71AB00DEEDC7 /* NSString+BAEmoji.m */; }; + C4AC63971EEF74F500DEEDC7 /* BAKit_ClearCacheManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63961EEF74F500DEEDC7 /* BAKit_ClearCacheManager.m */; }; + C4AC639A1EEF783B00DEEDC7 /* UIAlertController+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63991EEF783B00DEEDC7 /* UIAlertController+BAKit.m */; }; + C4AC639F1EEF7BA500DEEDC7 /* NSDate+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC639C1EEF7BA500DEEDC7 /* NSDate+BAKit.m */; }; + C4AC63A01EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC639E1EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.m */; }; + C4AC63A81EEF800800DEEDC7 /* BAKit_UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63A31EEF800800DEEDC7 /* BAKit_UserDefaults.m */; }; + C4AC63A91EEF800800DEEDC7 /* NSFileManager+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63A51EEF800800DEEDC7 /* NSFileManager+BAKit.m */; }; + C4AC63AA1EEF800800DEEDC7 /* NSString+BAFileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4AC63A71EEF800800DEEDC7 /* NSString+BAFileManager.m */; }; C4ACE2FC1CF5C19500313DD4 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4ACE2FB1CF5C19500313DD4 /* WebKit.framework */; }; C4ACE2FF1CF5C53100313DD4 /* DemoVC7.m in Sources */ = {isa = PBXBuildFile; fileRef = C4ACE2FE1CF5C53100313DD4 /* DemoVC7.m */; }; C4ACE3031CF5C90C00313DD4 /* DemoVC8.m in Sources */ = {isa = PBXBuildFile; fileRef = C4ACE3021CF5C90C00313DD4 /* DemoVC8.m */; }; C4ACE3051CF5C96200313DD4 /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4ACE3041CF5C96200313DD4 /* EventKit.framework */; }; C4ACE3071CF5C96B00313DD4 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4ACE3061CF5C96B00313DD4 /* CoreGraphics.framework */; }; + C4B3CB031DFFA67000B5A7B3 /* DemoVC2_08.m in Sources */ = {isa = PBXBuildFile; fileRef = C4B3CB011DFFA67000B5A7B3 /* DemoVC2_08.m */; }; + C4B3CB041DFFA67000B5A7B3 /* DemoVC2_08.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4B3CB021DFFA67000B5A7B3 /* DemoVC2_08.xib */; }; + C4B3CB061DFFA6F700B5A7B3 /* DemoVC2_08.html in Resources */ = {isa = PBXBuildFile; fileRef = C4B3CB051DFFA6F700B5A7B3 /* DemoVC2_08.html */; }; + C4B3CB081DFFF9F700B5A7B3 /* jquery-1.7.2.min.js in Resources */ = {isa = PBXBuildFile; fileRef = C4B3CB071DFFF9F700B5A7B3 /* jquery-1.7.2.min.js */; }; C4B963D01D33A5AF005926B8 /* Contents.json in Resources */ = {isa = PBXBuildFile; fileRef = C4B963141D33A5AF005926B8 /* Contents.json */; }; C4B963D11D33A5B1005926B8 /* dropdown_anim__0001@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C4B963151D33A5AF005926B8 /* dropdown_anim__0001@2x.png */; }; C4B963D21D33A5B1005926B8 /* Contents.json in Resources */ = {isa = PBXBuildFile; fileRef = C4B963171D33A5AF005926B8 /* Contents.json */; }; @@ -259,18 +268,100 @@ C4B9644B1D33A5B1005926B8 /* dropdown_loading_02@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C4B963CC1D33A5AF005926B8 /* dropdown_loading_02@2x.png */; }; C4B9644C1D33A5B1005926B8 /* Contents.json in Resources */ = {isa = PBXBuildFile; fileRef = C4B963CE1D33A5AF005926B8 /* Contents.json */; }; C4B9644D1D33A5B1005926B8 /* dropdown_loading_03@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C4B963CF1D33A5AF005926B8 /* dropdown_loading_03@2x.png */; }; - C4B964511D33A630005926B8 /* BACustomMJFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C4B964501D33A630005926B8 /* BACustomMJFooter.m */; }; - C4B964541D33B5E8005926B8 /* BACustomMJHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = C4B964531D33B5E8005926B8 /* BACustomMJHeader.m */; }; + C4C6E02D1DD05B170031395C /* UILabel+BAAttributeTextTapAction.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C6E02C1DD05B170031395C /* UILabel+BAAttributeTextTapAction.m */; }; + C4C7432A1DC7295A00E747D8 /* AppDelegate+BABaiduMap.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C742631DC7295A00E747D8 /* AppDelegate+BABaiduMap.m */; }; + C4C7432B1DC7295A00E747D8 /* AppDelegate+BACategory.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C742651DC7295A00E747D8 /* AppDelegate+BACategory.m */; }; + C4C7432C1DC7295A00E747D8 /* NSObject+BAMJParse.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C742671DC7295A00E747D8 /* NSObject+BAMJParse.m */; }; + C4C7432D1DC7295A00E747D8 /* NSObject+BANetwork.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C742691DC7295A00E747D8 /* NSObject+BANetwork.m */; }; + C4C7432E1DC7295A00E747D8 /* NSObject+BAProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7426B1DC7295A00E747D8 /* NSObject+BAProgressHUD.m */; }; + C4C7432F1DC7295A00E747D8 /* UIBarButtonItem+Item.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7426D1DC7295A00E747D8 /* UIBarButtonItem+Item.m */; }; + C4C743301DC7295A00E747D8 /* UIViewController+BAAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7426F1DC7295A00E747D8 /* UIViewController+BAAlertView.m */; }; + C4C7437B1DC7295B00E747D8 /* BABaseNetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743221DC7295A00E747D8 /* BABaseNetManager.m */; }; + C4C7437D1DC7295B00E747D8 /* BANewsNetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743261DC7295A00E747D8 /* BANewsNetManager.m */; }; + C4C744361DC72DB300E747D8 /* BAAutoSizeWithWH.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743881DC72DB300E747D8 /* BAAutoSizeWithWH.m */; }; + C4C744371DC72DB300E747D8 /* BACommon.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7438B1DC72DB300E747D8 /* BACommon.m */; }; + C4C744381DC72DB300E747D8 /* BAJumpManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7438E1DC72DB300E747D8 /* BAJumpManager.m */; }; + C4C744391DC72DB300E747D8 /* BALocalNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743911DC72DB300E747D8 /* BALocalNotification.m */; }; + C4C7443A1DC72DB300E747D8 /* BACustomBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743941DC72DB300E747D8 /* BACustomBarItem.m */; }; + C4C7443B1DC72DB300E747D8 /* UINavigationItem+CustomItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743961DC72DB300E747D8 /* UINavigationItem+CustomItem.m */; }; + C4C7443F1DC72DB300E747D8 /* BAShareManage.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743A11DC72DB300E747D8 /* BAShareManage.m */; }; + C4C744411DC72DB300E747D8 /* BASharManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C4C743A41DC72DB300E747D8 /* BASharManager.bundle */; }; + C4C744421DC72DB300E747D8 /* BASystermSetting.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743A71DC72DB300E747D8 /* BASystermSetting.m */; }; + C4C744441DC72DB300E747D8 /* BACustomMJFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743AD1DC72DB300E747D8 /* BACustomMJFooter.m */; }; + C4C744451DC72DB300E747D8 /* BACustomMJHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743AF1DC72DB300E747D8 /* BACustomMJHeader.m */; }; + C4C744461DC72DB300E747D8 /* BAKitManager+BALabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743B31DC72DB300E747D8 /* BAKitManager+BALabel.m */; }; + C4C744471DC72DB300E747D8 /* BAKitManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743B51DC72DB300E747D8 /* BAKitManager.m */; }; + C4C744481DC72DB300E747D8 /* NSArray+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743B81DC72DB300E747D8 /* NSArray+BAKit.m */; }; + C4C744491DC72DB300E747D8 /* NSData+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743BA1DC72DB300E747D8 /* NSData+BAKit.m */; }; + C4C7444C1DC72DB300E747D8 /* NSDictionary+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743C01DC72DB300E747D8 /* NSDictionary+BAKit.m */; }; + C4C7444D1DC72DB300E747D8 /* NSFileManager+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743C21DC72DB300E747D8 /* NSFileManager+BAKit.m */; }; + C4C7444E1DC72DB300E747D8 /* NSMutableArray+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743C41DC72DB300E747D8 /* NSMutableArray+BAKit.m */; }; + C4C7444F1DC72DB300E747D8 /* NSMutableDictionary+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743C61DC72DB300E747D8 /* NSMutableDictionary+BAKit.m */; }; + C4C744501DC72DB300E747D8 /* NSNumber+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743C81DC72DB300E747D8 /* NSNumber+BAKit.m */; }; + C4C744511DC72DB300E747D8 /* NSObject+BARunTime.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743CA1DC72DB300E747D8 /* NSObject+BARunTime.m */; }; + C4C744521DC72DB300E747D8 /* NSProcessInfo+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743CC1DC72DB300E747D8 /* NSProcessInfo+BAKit.m */; }; + C4C744531DC72DB300E747D8 /* NSShadow+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743CE1DC72DB300E747D8 /* NSShadow+BAKit.m */; }; + C4C744581DC72DB300E747D8 /* NSThread+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743D91DC72DB300E747D8 /* NSThread+BAKit.m */; }; + C4C744591DC72DB300E747D8 /* GCDGroup.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743DD1DC72DB300E747D8 /* GCDGroup.m */; }; + C4C7445A1DC72DB300E747D8 /* GCDQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743DF1DC72DB300E747D8 /* GCDQueue.m */; }; + C4C7445B1DC72DB300E747D8 /* GCDSemaphore.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743E11DC72DB300E747D8 /* GCDSemaphore.m */; }; + C4C7445C1DC72DB300E747D8 /* GCDTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743E31DC72DB300E747D8 /* GCDTimer.m */; }; + C4C7445D1DC72DB300E747D8 /* BAAPP.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743E61DC72DB300E747D8 /* BAAPP.m */; }; + C4C7445E1DC72DB300E747D8 /* BALog.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743E81DC72DB300E747D8 /* BALog.m */; }; + C4C7445F1DC72DB300E747D8 /* BAPassword.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743EA1DC72DB300E747D8 /* BAPassword.m */; }; + C4C744601DC72DB300E747D8 /* BASystemService.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743EC1DC72DB300E747D8 /* BASystemService.m */; }; + C4C744611DC72DB300E747D8 /* BASystemSound.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743EE1DC72DB300E747D8 /* BASystemSound.m */; }; + C4C744621DC72DB300E747D8 /* BATouchID.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743F01DC72DB300E747D8 /* BATouchID.m */; }; + C4C744631DC72DB300E747D8 /* UIApplication+AppInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743F21DC72DB300E747D8 /* UIApplication+AppInfo.m */; }; + C4C744641DC72DB300E747D8 /* BACustomModalTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743F51DC72DB300E747D8 /* BACustomModalTransition.m */; }; + C4C744671DC72DB300E747D8 /* BATextView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743FB1DC72DB300E747D8 /* BATextView.m */; }; + C4C744681DC72DB300E747D8 /* UIBarButtonItem+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C743FD1DC72DB300E747D8 /* UIBarButtonItem+BAKit.m */; }; + C4C7446A1DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744011DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.m */; }; + C4C7446B1DC72DB300E747D8 /* UIColor+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744031DC72DB300E747D8 /* UIColor+BAKit.m */; }; + C4C7446C1DC72DB300E747D8 /* UIDevice+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744051DC72DB300E747D8 /* UIDevice+BAKit.m */; }; + C4C7446D1DC72DB300E747D8 /* UIFont+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744071DC72DB300E747D8 /* UIFont+BAKit.m */; }; + C4C7446E1DC72DB300E747D8 /* UIImage+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744091DC72DB300E747D8 /* UIImage+BAKit.m */; }; + C4C7446F1DC72DB300E747D8 /* UIImageView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7440B1DC72DB300E747D8 /* UIImageView+BAKit.m */; }; + C4C744701DC72DB300E747D8 /* UILabel+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7440D1DC72DB300E747D8 /* UILabel+BAKit.m */; }; + C4C744711DC72DB300E747D8 /* UINavigationBar+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7440F1DC72DB300E747D8 /* UINavigationBar+BAKit.m */; }; + C4C744721DC72DB300E747D8 /* UINavigationController+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744111DC72DB300E747D8 /* UINavigationController+BAKit.m */; }; + C4C744731DC72DB300E747D8 /* UIScrollView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744131DC72DB300E747D8 /* UIScrollView+BAKit.m */; }; + C4C744741DC72DB300E747D8 /* UITableView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744151DC72DB300E747D8 /* UITableView+BAKit.m */; }; + C4C744751DC72DB300E747D8 /* UITableViewCell+Reuse.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744171DC72DB300E747D8 /* UITableViewCell+Reuse.m */; }; + C4C744761DC72DB300E747D8 /* UITextField+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744191DC72DB300E747D8 /* UITextField+BAKit.m */; }; + C4C744771DC72DB300E747D8 /* UIView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7441B1DC72DB300E747D8 /* UIView+BAKit.m */; }; + C4C744781DC72DB300E747D8 /* UIWebView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7441D1DC72DB300E747D8 /* UIWebView+BAKit.m */; }; + C4C744791DC72DB300E747D8 /* UIWindow+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7441F1DC72DB300E747D8 /* UIWindow+BAKit.m */; }; + C4C7447A1DC72DB300E747D8 /* BARotateView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744241DC72DB300E747D8 /* BARotateView.m */; }; + C4C7447B1DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744261DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.m */; }; + C4C7447C1DC72DB300E747D8 /* BAFadeBlackView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744291DC72DB300E747D8 /* BAFadeBlackView.m */; }; + C4C7447D1DC72DB300E747D8 /* BASnowView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7442B1DC72DB300E747D8 /* BASnowView.m */; }; + C4C7447E1DC72DB300E747D8 /* BAUpdatingView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7442D1DC72DB300E747D8 /* BAUpdatingView.m */; }; + C4C7447F1DC72DB300E747D8 /* CALayer+BAMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C7442F1DC72DB300E747D8 /* CALayer+BAMaskLayer.m */; }; + C4C744801DC72DB300E747D8 /* EmitterLayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744311DC72DB300E747D8 /* EmitterLayerView.m */; }; + C4C744811DC72DB300E747D8 /* UIView+BAGlowView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744331DC72DB300E747D8 /* UIView+BAGlowView.m */; }; + C4C744841DC7306800E747D8 /* DemoVC2_05_test.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C744831DC7306800E747D8 /* DemoVC2_05_test.m */; }; C4C802511CF5AFAE00AD5B3B /* BAWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4C8024F1CF5AFAE00AD5B3B /* BAWebViewController.m */; }; C4D108021CE2FC1C00F735B9 /* view1.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D107FB1CE2FC1C00F735B9 /* view1.m */; }; C4D108031CE2FC1C00F735B9 /* view2.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D107FD1CE2FC1C00F735B9 /* view2.m */; }; C4D108041CE2FC1C00F735B9 /* view3.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D107FF1CE2FC1C00F735B9 /* view3.m */; }; C4D108051CE2FC1C00F735B9 /* view4.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D108011CE2FC1C00F735B9 /* view4.m */; }; - C4DEB3741D0C2FC8001F1585 /* BANetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DEB3721D0C2FC8001F1585 /* BANetManager.m */; }; + C4D1092D1D9271400057B2DC /* DemoVC2_04.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D1092B1D9271400057B2DC /* DemoVC2_04.m */; }; + C4D26F471E03D41A0040AC3E /* BAPage.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D26F461E03D41A0040AC3E /* BAPage.m */; }; + C4D26F521E03F4420040AC3E /* DemoVC2_09.m in Sources */ = {isa = PBXBuildFile; fileRef = C4D26F511E03F4420040AC3E /* DemoVC2_09.m */; }; + C4D26F541E03F44D0040AC3E /* DemoVC2_09.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4D26F531E03F44D0040AC3E /* DemoVC2_09.xib */; }; + C4DD40581DE819050084CBCA /* JKDBHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD40551DE819050084CBCA /* JKDBHelper.m */; }; + C4DD40591DE819050084CBCA /* JKDBModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD40571DE819050084CBCA /* JKDBModel.m */; }; + C4DD40681DE81A290084CBCA /* BALoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD40631DE81A290084CBCA /* BALoginViewController.m */; }; + C4DD40691DE81A290084CBCA /* BALoginViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4DD40641DE81A290084CBCA /* BALoginViewController.xib */; }; + C4DD406A1DE81A290084CBCA /* BARegistViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD40661DE81A290084CBCA /* BARegistViewController.m */; }; + C4DD406B1DE81A290084CBCA /* BARegistViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = C4DD40671DE81A290084CBCA /* BARegistViewController.xib */; }; + C4DD406E1DE81A330084CBCA /* BAUserModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DD406D1DE81A330084CBCA /* BAUserModel.m */; }; C4DEB3771D0C332C001F1585 /* BATabBarController2.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DEB3761D0C332C001F1585 /* BATabBarController2.m */; }; C4DEB37A1D0C3351001F1585 /* BATabBar2.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DEB3791D0C3351001F1585 /* BATabBar2.m */; }; C4DEB37D1D0C33E8001F1585 /* BANavigationController2.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DEB37C1D0C33E8001F1585 /* BANavigationController2.m */; }; C4DEB3851D0C34B0001F1585 /* BAPublishViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4DEB3841D0C34B0001F1585 /* BAPublishViewController.m */; }; + C4E0154B1E0A35F200CCC322 /* BATextField.m in Sources */ = {isa = PBXBuildFile; fileRef = C4E0154A1E0A35F200CCC322 /* BATextField.m */; }; C4EA25811CF7DFEC00F6081C /* DemoVC10.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EA25801CF7DFEC00F6081C /* DemoVC10.m */; }; C4EA25841CF7E10600F6081C /* DemoVC10_CollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EA25831CF7E10600F6081C /* DemoVC10_CollectionView.m */; }; C4EADCE51D02C0130086979C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C4EADCE71D02C0130086979C /* Localizable.strings */; }; @@ -288,21 +379,12 @@ C4EB5BB71CD8B250003A7094 /* BAFPSLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AE11CD8B24F003A7094 /* BAFPSLabel.m */; }; C4EB5BB81CD8B250003A7094 /* BANavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AE31CD8B24F003A7094 /* BANavigationBar.m */; }; C4EB5BB91CD8B250003A7094 /* BABaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AE61CD8B24F003A7094 /* BABaseViewController.m */; }; - C4EB5BBB1CD8B250003A7094 /* BAGIFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AEB1CD8B24F003A7094 /* BAGIFImageView.m */; }; C4EB5BBC1CD8B250003A7094 /* BADiscoverViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AF41CD8B24F003A7094 /* BADiscoverViewController.m */; }; C4EB5BBD1CD8B250003A7094 /* BAHomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5AFA1CD8B24F003A7094 /* BAHomeViewController.m */; }; C4EB5BBE1CD8B250003A7094 /* BAMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B021CD8B24F003A7094 /* BAMessageViewController.m */; }; C4EB5BBF1CD8B250003A7094 /* BAProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B081CD8B24F003A7094 /* BAProfileViewController.m */; }; C4EB5BC21CD8B250003A7094 /* LPLevelView.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5B121CD8B24F003A7094 /* LPLevelView.bundle */; }; C4EB5BC31CD8B250003A7094 /* LPLevelView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B141CD8B24F003A7094 /* LPLevelView.m */; }; - C4EB5BCB1CD8B250003A7094 /* AppDelegate+BACategory.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B291CD8B24F003A7094 /* AppDelegate+BACategory.m */; }; - C4EB5BCC1CD8B250003A7094 /* NSObject+BAMJParse.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B2B1CD8B24F003A7094 /* NSObject+BAMJParse.m */; }; - C4EB5BCD1CD8B250003A7094 /* NSObject+BAProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B2D1CD8B24F003A7094 /* NSObject+BAProgressHUD.m */; }; - C4EB5BCE1CD8B250003A7094 /* NSObject+BANetwork.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B2F1CD8B24F003A7094 /* NSObject+BANetwork.m */; }; - C4EB5BCF1CD8B250003A7094 /* UIBarButtonItem+Item.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B311CD8B24F003A7094 /* UIBarButtonItem+Item.m */; }; - C4EB5BD11CD8B250003A7094 /* UIViewController+BAAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B351CD8B24F003A7094 /* UIViewController+BAAlertView.m */; }; - C4EB5BD21CD8B250003A7094 /* BABaseNetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B3F1CD8B24F003A7094 /* BABaseNetManager.m */; }; - C4EB5BD31CD8B250003A7094 /* BANewsNetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EB5B411CD8B24F003A7094 /* BANewsNetManager.m */; }; C4EB5BD41CD8B250003A7094 /* area.plist in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5B461CD8B24F003A7094 /* area.plist */; }; C4EB5BD61CD8B250003A7094 /* img0.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5B4A1CD8B24F003A7094 /* img0.jpg */; }; C4EB5BD71CD8B250003A7094 /* img1.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5B4B1CD8B24F003A7094 /* img1.jpg */; }; @@ -392,23 +474,18 @@ C4EB5C2B1CD8B251003A7094 /* 烟花背景.jpg in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5BA51CD8B250003A7094 /* 烟花背景.jpg */; }; C4EB5C2C1CD8B251003A7094 /* 金元宝.png in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5BA61CD8B250003A7094 /* 金元宝.png */; }; C4EB5C2D1CD8B251003A7094 /* 雪花.png in Resources */ = {isa = PBXBuildFile; fileRef = C4EB5BA71CD8B250003A7094 /* 雪花.png */; }; + C4EBE1EA1D94C4FC00020C1F /* MyAnimatedAnnotationView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EBE1E91D94C4FC00020C1F /* MyAnimatedAnnotationView.m */; }; + C4EBE1F21D95015D00020C1F /* poi_1.png in Resources */ = {isa = PBXBuildFile; fileRef = C4EBE1EF1D95015D00020C1F /* poi_1.png */; }; + C4EBE1F31D95015D00020C1F /* poi_2.png in Resources */ = {isa = PBXBuildFile; fileRef = C4EBE1F01D95015D00020C1F /* poi_2.png */; }; + C4EBE1F41D95015D00020C1F /* poi_3.png in Resources */ = {isa = PBXBuildFile; fileRef = C4EBE1F11D95015D00020C1F /* poi_3.png */; }; C4EE1C5E1D2288BF005046A6 /* DemoVC2_01.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EE1C5D1D2288BF005046A6 /* DemoVC2_01.m */; }; C4EE1C611D228AE9005046A6 /* DemoVC2_01_Model.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EE1C601D228AE9005046A6 /* DemoVC2_01_Model.m */; }; - C4EE1C651D228E34005046A6 /* NSString+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EE1C641D228E34005046A6 /* NSString+BAKit.m */; }; C4EE1C691D2295E2005046A6 /* BACellDataAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = C4EE1C681D2295E2005046A6 /* BACellDataAdapter.m */; }; C4F59F871D54680E00AA822A /* BANewFeatureVC.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F59F861D54680E00AA822A /* BANewFeatureVC.m */; }; C4F59F8A1D54684E00AA822A /* BAADScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F59F891D54684E00AA822A /* BAADScrollView.m */; }; C4F59F8D1D5468B900AA822A /* BAADLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F59F8C1D5468B900AA822A /* BAADLabel.m */; }; - C4F74A881D37BDEB0014C396 /* BAClearCacheManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A871D37BDEB0014C396 /* BAClearCacheManager.m */; }; - C4F74A9C1D37C1BD0014C396 /* BALocalNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A8B1D37C1BD0014C396 /* BALocalNotification.m */; }; - C4F74A9D1D37C1BD0014C396 /* BACustomBarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A8E1D37C1BD0014C396 /* BACustomBarItem.m */; }; - C4F74A9E1D37C1BD0014C396 /* UINavigationItem+CustomItem.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A901D37C1BD0014C396 /* UINavigationItem+CustomItem.m */; }; - C4F74A9F1D37C1BD0014C396 /* HMSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A931D37C1BD0014C396 /* HMSegmentedControl.m */; }; - C4F74AA01D37C1BD0014C396 /* BAShareAnimationView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A961D37C1BD0014C396 /* BAShareAnimationView.m */; }; - C4F74AA11D37C1BD0014C396 /* BAShareManage.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A981D37C1BD0014C396 /* BAShareManage.m */; }; - C4F74AA21D37C1BD0014C396 /* BAShareManageView.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F74A9A1D37C1BD0014C396 /* BAShareManageView.m */; }; - C4F74AA31D37C1BD0014C396 /* BASharManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = C4F74A9B1D37C1BD0014C396 /* BASharManager.bundle */; }; - E1C6EFD156F8206BA6582EBE /* libPods-BABaseProject.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 46504BE330E8BECB1887138B /* libPods-BABaseProject.a */; }; + C4FB59DB1DDD42F7002F5A03 /* DemoVC14.m in Sources */ = {isa = PBXBuildFile; fileRef = C4FB59DA1DDD42F7002F5A03 /* DemoVC14.m */; }; + C4FB59DE1DDD4302002F5A03 /* Dog.m in Sources */ = {isa = PBXBuildFile; fileRef = C4FB59DD1DDD4302002F5A03 /* Dog.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -431,17 +508,25 @@ /* Begin PBXFileReference section */ 0C9CD344414868DF018ED31B /* Pods-BABaseProjectUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProjectUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProjectUITests/Pods-BABaseProjectUITests.release.xcconfig"; sourceTree = ""; }; 1574EF9FCBB113FDCC972156 /* libPods-BABaseProjectTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProjectTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 46504BE330E8BECB1887138B /* libPods-BABaseProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 1694997B390478F9A51051C8 /* libPods-BABaseProject-BABaseProjectTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 4AD2C0DE7422AACAB30B1B51 /* Pods-BABaseProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.debug.xcconfig"; sourceTree = ""; }; 4E9FC567E3607A554D963AC3 /* Pods-BABaseProject-BABaseProjectUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject-BABaseProjectUITests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.release.xcconfig"; sourceTree = ""; }; + 539C5D5ABB06B9E52C89A5CE /* libPods-BABaseProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 7379A219A22C69FA7095C49C /* libPods-BABaseProject-BABaseProjectUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 77795B692E80399FDA1BD963 /* libPods-BABaseProjectUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProjectUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 7E6875B539C22C6BAC2A5D03 /* Pods-BABaseProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject.release.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.release.xcconfig"; sourceTree = ""; }; 85433259C94DA94EF8BE73D7 /* Pods-BABaseProjectTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProjectTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProjectTests/Pods-BABaseProjectTests.release.xcconfig"; sourceTree = ""; }; + 9C93D6B220BD2718002FB06B /* HMSegmentedControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMSegmentedControl.m; sourceTree = ""; }; + 9C93D6B320BD2718002FB06B /* HMSegmentedControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HMSegmentedControl.h; sourceTree = ""; }; 9F749E1D19424B075A7198FF /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject-BABaseProjectTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.release.xcconfig"; sourceTree = ""; }; AE682D062D927BDA40F4BE28 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject-BABaseProjectTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.debug.xcconfig"; sourceTree = ""; }; B1C444FFA4B8F0D1E86C9B57 /* Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig"; sourceTree = ""; }; B703AA4647AF54EFA05E072A /* Pods-BABaseProjectTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProjectTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProjectTests/Pods-BABaseProjectTests.debug.xcconfig"; sourceTree = ""; }; - BF87F3C10B89949A3DB1CDEC /* libPods-BABaseProject-BABaseProjectTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C407E54E1DE533FD00FB1244 /* NSMutableArray+BASort.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+BASort.h"; sourceTree = ""; }; + C407E54F1DE533FD00FB1244 /* NSMutableArray+BASort.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+BASort.m"; sourceTree = ""; }; + C407E5511DE5343000FB1244 /* DemoVC2_07.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_07.h; sourceTree = ""; }; + C407E5521DE5343000FB1244 /* DemoVC2_07.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_07.m; sourceTree = ""; }; + C407E5531DE5343000FB1244 /* DemoVC2_07.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoVC2_07.xib; sourceTree = ""; }; C408527A1CD990B00004A671 /* BABaseTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseTableViewController.h; sourceTree = ""; }; C408527B1CD990B00004A671 /* BABaseTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseTableViewController.m; sourceTree = ""; }; C408527E1CD995200004A671 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = ""; }; @@ -470,6 +555,14 @@ C40852E71CDA263B0004A671 /* RDVTabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RDVTabBar.m; sourceTree = ""; }; C40852EA1CDA26680004A671 /* RDVTabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RDVTabBarController.h; sourceTree = ""; }; C40852EB1CDA26680004A671 /* RDVTabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RDVTabBarController.m; sourceTree = ""; }; + C411754F1DF7C08E00802612 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + C41175511DF7C09700802612 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; + C41175531DF7C0A000802612 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; + C41175551DF7C0A900802612 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + C41175571DF7C0B300802612 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + C41175591DF7C0D200802612 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + C411755B1DF7E55700802612 /* BAUmengFile.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BAUmengFile.txt; sourceTree = ""; }; + C411755D1DF7FD6600802612 /* gif3.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = gif3.gif; sourceTree = ""; }; C41CA8C21D3FA049006296BD /* DemoVC2_02_studentModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_02_studentModel.h; sourceTree = ""; }; C41CA8C31D3FA049006296BD /* DemoVC2_02_studentModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_02_studentModel.m; sourceTree = ""; }; C41CA8C51D3FA185006296BD /* DemoVC2_02_classModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_02_classModel.h; sourceTree = ""; }; @@ -490,23 +583,8 @@ C427811F1D2D315B003E6694 /* BABaseCollectionCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseCollectionCell.m; sourceTree = ""; }; C42781211D2D338F003E6694 /* DemoVC2_01_cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_01_cell.h; sourceTree = ""; }; C42781221D2D338F003E6694 /* DemoVC2_01_cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_01_cell.m; sourceTree = ""; }; - C42781251D2D39B1003E6694 /* GCD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCD.h; sourceTree = ""; }; - C42781261D2D39B1003E6694 /* GCDGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDGroup.h; sourceTree = ""; }; - C42781271D2D39B1003E6694 /* GCDGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDGroup.m; sourceTree = ""; }; - C42781281D2D39B1003E6694 /* GCDQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDQueue.h; sourceTree = ""; }; - C42781291D2D39B1003E6694 /* GCDQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDQueue.m; sourceTree = ""; }; - C427812A1D2D39B1003E6694 /* GCDSemaphore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDSemaphore.h; sourceTree = ""; }; - C427812B1D2D39B1003E6694 /* GCDSemaphore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDSemaphore.m; sourceTree = ""; }; - C427812C1D2D39B1003E6694 /* GCDTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDTimer.h; sourceTree = ""; }; - C427812D1D2D39B1003E6694 /* GCDTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDTimer.m; sourceTree = ""; }; - C42A6ADD1CDAE10500D534EE /* BATabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBar.h; sourceTree = ""; }; - C42A6ADE1CDAE10500D534EE /* BATabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBar.m; sourceTree = ""; }; - C42A6ADF1CDAE10500D534EE /* BATabBarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBarButton.h; sourceTree = ""; }; - C42A6AE01CDAE10500D534EE /* BATabBarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBarButton.m; sourceTree = ""; }; C42A6AE11CDAE10500D534EE /* BABadgeView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABadgeView.h; sourceTree = ""; }; C42A6AE21CDAE10500D534EE /* BABadgeView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABadgeView.m; sourceTree = ""; }; - C42A6AE61CDAE10D00D534EE /* BATabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBarController.h; sourceTree = ""; }; - C42A6AE71CDAE10D00D534EE /* BATabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBarController.m; sourceTree = ""; }; C42DAA411D37269300FE8B3E /* DemoVC2_03.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_03.h; sourceTree = ""; }; C42DAA421D37269300FE8B3E /* DemoVC2_03.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_03.m; sourceTree = ""; }; C42DAA441D3763A700FE8B3E /* discoverVC.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = discoverVC.bundle; sourceTree = ""; }; @@ -514,48 +592,43 @@ C42DAA461D3763A700FE8B3E /* messageVC.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = messageVC.bundle; sourceTree = ""; }; C42DAA471D3763A700FE8B3E /* profileVC.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = profileVC.bundle; sourceTree = ""; }; C42DAA4C1D37669C00FE8B3E /* otherImages.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = otherImages.bundle; sourceTree = ""; }; + C4309BAF1DCAD4D50016ABE6 /* BALoadingHubView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALoadingHubView.h; sourceTree = ""; }; + C4309BB01DCAD4D50016ABE6 /* BALoadingHubView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALoadingHubView.m; sourceTree = ""; }; + C4309BB31DCAD5C40016ABE6 /* BAEventIDConstant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAEventIDConstant.h; sourceTree = ""; }; + C4309BB41DCAD5C40016ABE6 /* BAUserStatistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAUserStatistics.h; sourceTree = ""; }; + C4309BB51DCAD5C40016ABE6 /* BAUserStatistics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAUserStatistics.m; sourceTree = ""; }; + C4309BB61DCAD5C40016ABE6 /* NSObject+BAHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BAHook.h"; sourceTree = ""; }; + C4309BB71DCAD5C40016ABE6 /* NSObject+BAHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BAHook.m"; sourceTree = ""; }; + C4309BB81DCAD5C40016ABE6 /* UIControl+BAUserStastistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIControl+BAUserStastistics.h"; sourceTree = ""; }; + C4309BB91DCAD5C40016ABE6 /* UIControl+BAUserStastistics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIControl+BAUserStastistics.m"; sourceTree = ""; }; + C4309BBA1DCAD5C40016ABE6 /* UIViewController+BAHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+BAHook.h"; sourceTree = ""; }; + C4309BBB1DCAD5C40016ABE6 /* UIViewController+BAHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+BAHook.m"; sourceTree = ""; }; C430AB741CDC8A360086DDD6 /* DemoVC3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC3.h; sourceTree = ""; }; C430AB751CDC8A360086DDD6 /* DemoVC3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC3.m; sourceTree = ""; }; - C44423241D2E5D66004ACAA8 /* BAKitManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKitManager.h; sourceTree = ""; }; - C44423251D2E5D66004ACAA8 /* BAKitManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKitManager.m; sourceTree = ""; }; - C44423281D2E5E07004ACAA8 /* BAKitManager+BALabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BAKitManager+BALabel.h"; sourceTree = ""; }; - C44423291D2E5E07004ACAA8 /* BAKitManager+BALabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BAKitManager+BALabel.m"; sourceTree = ""; }; - C444232C1D2E738A004ACAA8 /* BAAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAAlertView.h; sourceTree = ""; }; - C444232D1D2E738A004ACAA8 /* BAAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAAlertView.m; sourceTree = ""; }; - C444232E1D2E738A004ACAA8 /* BAModal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAModal.h; sourceTree = ""; }; - C444232F1D2E738A004ACAA8 /* BAModal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAModal.m; sourceTree = ""; }; + C43222D21DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+BAUMengAnalytics.h"; sourceTree = ""; }; + C43222D31DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+BAUMengAnalytics.m"; sourceTree = ""; }; C44423321D2E7775004ACAA8 /* BABaseHeaderFooterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseHeaderFooterView.h; sourceTree = ""; }; C44423331D2E7775004ACAA8 /* BABaseHeaderFooterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseHeaderFooterView.m; sourceTree = ""; }; - C44423361D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BARotateAnimationProtocol.h"; sourceTree = ""; }; - C44423371D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BARotateAnimationProtocol.m"; sourceTree = ""; }; - C44423401D2E81AC004ACAA8 /* BARotateAnimationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARotateAnimationProtocol.h; sourceTree = ""; }; - C44423431D2E824D004ACAA8 /* BARotateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARotateView.h; sourceTree = ""; }; - C44423441D2E824D004ACAA8 /* BARotateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BARotateView.m; sourceTree = ""; }; C44423471D2E85B8004ACAA8 /* DemoVC2_02.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_02.h; sourceTree = ""; }; C44423481D2E85B8004ACAA8 /* DemoVC2_02.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_02.m; sourceTree = ""; }; C444234A1D2E8680004ACAA8 /* DemoVC2_02_HeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_02_HeaderView.h; sourceTree = ""; }; C444234B1D2E8680004ACAA8 /* DemoVC2_02_HeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_02_HeaderView.m; sourceTree = ""; }; - C445E1C01D1B86FE00D7654A /* SXColorGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXColorGradientView.h; sourceTree = ""; }; - C445E1C11D1B86FE00D7654A /* SXColorGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXColorGradientView.m; sourceTree = ""; }; - C445E1C21D1B86FE00D7654A /* SXColorLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXColorLabel.h; sourceTree = ""; }; - C445E1C31D1B86FE00D7654A /* SXColorLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXColorLabel.m; sourceTree = ""; }; - C445E1C41D1B86FE00D7654A /* SXHeadLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXHeadLine.h; sourceTree = ""; }; - C445E1C51D1B86FE00D7654A /* SXHeadLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXHeadLine.m; sourceTree = ""; }; - C445E1C61D1B86FE00D7654A /* SXMarquee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXMarquee.h; sourceTree = ""; }; - C445E1C71D1B86FE00D7654A /* SXMarquee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXMarquee.m; sourceTree = ""; }; - C445E1C81D1B86FE00D7654A /* UIColor+Separate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Separate.h"; sourceTree = ""; }; - C445E1C91D1B86FE00D7654A /* UIColor+Separate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Separate.m"; sourceTree = ""; }; - C445E1CA1D1B86FE00D7654A /* UIColor+Wonderful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Wonderful.h"; sourceTree = ""; }; - C445E1CB1D1B86FE00D7654A /* UIColor+Wonderful.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Wonderful.m"; sourceTree = ""; }; - C445E1CC1D1B86FE00D7654A /* UILabel+Wonderful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+Wonderful.h"; sourceTree = ""; }; - C445E1CD1D1B86FE00D7654A /* UILabel+Wonderful.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Wonderful.m"; sourceTree = ""; }; + C445642F1E791BE3007D5692 /* BALoginViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALoginViewModel.h; sourceTree = ""; }; + C44564301E791BE3007D5692 /* BALoginViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALoginViewModel.m; sourceTree = ""; }; C445E1F31D1BF10A00D7654A /* DemoVC13.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC13.h; sourceTree = ""; }; C445E1F41D1BF10A00D7654A /* DemoVC13.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC13.m; sourceTree = ""; }; + C44C00CC1DCB268C00BAAAEC /* DemoVC2_05_test2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_05_test2.h; sourceTree = ""; }; + C44C00CD1DCB268C00BAAAEC /* DemoVC2_05_test2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_05_test2.m; sourceTree = ""; }; + C44C00CF1DCB283700BAAAEC /* BADemoUserStatisticsConfig.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = BADemoUserStatisticsConfig.plist; sourceTree = ""; }; + C44C00D11DCB30BA00BAAAEC /* UIButton+BAHook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+BAHook.h"; sourceTree = ""; }; + C44C00D21DCB30BA00BAAAEC /* UIButton+BAHook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+BAHook.m"; sourceTree = ""; }; C4562C641CDD8969000F5710 /* BABaseProjectNoti.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseProjectNoti.h; sourceTree = ""; }; C4562C691CDD9F05000F5710 /* DemoVC4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC4.h; sourceTree = ""; }; C4562C6A1CDD9F05000F5710 /* DemoVC4.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC4.m; sourceTree = ""; }; C4562C7C1CDDBE44000F5710 /* DemoVC5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC5.h; sourceTree = ""; }; C4562C7D1CDDBE44000F5710 /* DemoVC5.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC5.m; sourceTree = ""; }; + C457EA441DADD6E600CD0B91 /* DemoVC2_06.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_06.h; sourceTree = ""; }; + C457EA451DADD6E600CD0B91 /* DemoVC2_06.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_06.m; sourceTree = ""; }; C46B89F71CE055DD00005E2B /* DemoVC5Cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC5Cell.h; sourceTree = ""; }; C46B89F81CE055DD00005E2B /* DemoVC5Cell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC5Cell.m; sourceTree = ""; }; C46B89FA1CE0AE3400005E2B /* DemoVC5_TextPart.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC5_TextPart.h; sourceTree = ""; }; @@ -570,6 +643,16 @@ C473CC7A1CF72439001883A9 /* BACollectionView.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = BACollectionView.bundle; sourceTree = ""; }; C473CC7F1CF72960001883A9 /* DemoVC9_Model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC9_Model.h; sourceTree = ""; }; C473CC801CF72960001883A9 /* DemoVC9_Model.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC9_Model.m; sourceTree = ""; }; + C474FE741DACB996007755D3 /* DemoVC2_05.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_05.h; sourceTree = ""; }; + C474FE751DACB996007755D3 /* DemoVC2_05.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_05.m; sourceTree = ""; }; + C474FE761DACB996007755D3 /* DemoVC2_05.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoVC2_05.xib; sourceTree = ""; }; + C47660A51DE82C2E00522BEE /* BAProfileViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BAProfileViewController.xib; sourceTree = ""; }; + C4772B1A1D8F8DB6002B73CD /* BATabBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBar.h; sourceTree = ""; }; + C4772B1B1D8F8DB6002B73CD /* BATabBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBar.m; sourceTree = ""; }; + C4772B1C1D8F8DB6002B73CD /* BATabBarButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBarButton.h; sourceTree = ""; }; + C4772B1D1D8F8DB6002B73CD /* BATabBarButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBarButton.m; sourceTree = ""; }; + C4772B201D8F8F16002B73CD /* BATabBarController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBarController.h; sourceTree = ""; }; + C4772B211D8F8F16002B73CD /* BATabBarController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBarController.m; sourceTree = ""; }; C48026BF1D191EC90087BBB9 /* DemoVC11.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC11.h; sourceTree = ""; }; C48026C01D191EC90087BBB9 /* DemoVC11.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC11.m; sourceTree = ""; }; C48026C11D191EC90087BBB9 /* DemoVC11_AutoLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC11_AutoLayout.h; sourceTree = ""; }; @@ -580,95 +663,90 @@ C48026C61D191EC90087BBB9 /* DemoVC11_model.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC11_model.m; sourceTree = ""; }; C48026CC1D191F720087BBB9 /* DemoVC12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC12.h; sourceTree = ""; }; C48026CD1D191F720087BBB9 /* DemoVC12.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC12.m; sourceTree = ""; }; - C48026CF1D1920110087BBB9 /* DemoVC12View.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC12View.h; sourceTree = ""; }; - C48026D01D1920110087BBB9 /* DemoVC12View.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC12View.m; sourceTree = ""; }; - C48026D41D1928290087BBB9 /* BAAPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAAPP.h; sourceTree = ""; }; - C48026D51D1928290087BBB9 /* BAAPP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAAPP.m; sourceTree = ""; }; - C48026D61D1928290087BBB9 /* BAAutoSizeWithWH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAAutoSizeWithWH.h; sourceTree = ""; }; - C48026D71D1928290087BBB9 /* BAAutoSizeWithWH.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAAutoSizeWithWH.m; sourceTree = ""; }; - C48026D81D1928290087BBB9 /* BALog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALog.h; sourceTree = ""; }; - C48026D91D1928290087BBB9 /* BALog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALog.m; sourceTree = ""; }; - C48026DC1D1928290087BBB9 /* BAPassword.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAPassword.h; sourceTree = ""; }; - C48026DD1D1928290087BBB9 /* BAPassword.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAPassword.m; sourceTree = ""; }; - C48026DE1D1928290087BBB9 /* BARegularExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARegularExpression.h; sourceTree = ""; }; - C48026DF1D1928290087BBB9 /* BARegularExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BARegularExpression.m; sourceTree = ""; }; - C48026E21D1928290087BBB9 /* BASystemSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASystemSound.h; sourceTree = ""; }; - C48026E31D1928290087BBB9 /* BASystemSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASystemSound.m; sourceTree = ""; }; - C48026E41D1928290087BBB9 /* BATouchID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATouchID.h; sourceTree = ""; }; - C48026E51D1928290087BBB9 /* BATouchID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATouchID.m; sourceTree = ""; }; - C48026E61D1928290087BBB9 /* BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit.h; sourceTree = ""; }; - C48026E81D1928290087BBB9 /* NSArray+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+BAKit.h"; sourceTree = ""; }; - C48026E91D1928290087BBB9 /* NSArray+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+BAKit.m"; sourceTree = ""; }; - C48026EA1D1928290087BBB9 /* NSData+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+BAKit.h"; sourceTree = ""; }; - C48026EB1D1928290087BBB9 /* NSData+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+BAKit.m"; sourceTree = ""; }; - C48026EC1D1928290087BBB9 /* NSDate+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+BAKit.h"; sourceTree = ""; }; - C48026ED1D1928290087BBB9 /* NSDate+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+BAKit.m"; sourceTree = ""; }; - C48026EE1D1928290087BBB9 /* NSDictionary+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+BAKit.h"; sourceTree = ""; }; - C48026EF1D1928290087BBB9 /* NSDictionary+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+BAKit.m"; sourceTree = ""; }; - C48026F01D1928290087BBB9 /* NSFileManager+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+BAKit.h"; sourceTree = ""; }; - C48026F11D1928290087BBB9 /* NSFileManager+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+BAKit.m"; sourceTree = ""; }; - C48026F21D1928290087BBB9 /* NSMutableArray+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+BAKit.h"; sourceTree = ""; }; - C48026F31D1928290087BBB9 /* NSMutableArray+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+BAKit.m"; sourceTree = ""; }; - C48026F41D1928290087BBB9 /* NSMutableDictionary+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+BAKit.h"; sourceTree = ""; }; - C48026F51D1928290087BBB9 /* NSMutableDictionary+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+BAKit.m"; sourceTree = ""; }; - C48026F61D1928290087BBB9 /* NSNumber+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+BAKit.h"; sourceTree = ""; }; - C48026F71D1928290087BBB9 /* NSNumber+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+BAKit.m"; sourceTree = ""; }; - C48026F81D1928290087BBB9 /* NSProcessInfo+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSProcessInfo+BAKit.h"; sourceTree = ""; }; - C48026F91D1928290087BBB9 /* NSProcessInfo+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSProcessInfo+BAKit.m"; sourceTree = ""; }; - C48026FC1D1928290087BBB9 /* NSThread+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSThread+BAKit.h"; sourceTree = ""; }; - C48026FD1D1928290087BBB9 /* NSThread+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSThread+BAKit.m"; sourceTree = ""; }; - C48026FF1D1928290087BBB9 /* BACustomModalTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomModalTransition.h; sourceTree = ""; }; - C48027001D1928290087BBB9 /* BACustomModalTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomModalTransition.m; sourceTree = ""; }; - C48027011D1928290087BBB9 /* BAPickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAPickerView.h; sourceTree = ""; }; - C48027021D1928290087BBB9 /* BAPickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAPickerView.m; sourceTree = ""; }; - C48027031D1928290087BBB9 /* BATextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATextView.h; sourceTree = ""; }; - C48027041D1928290087BBB9 /* BATextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATextView.m; sourceTree = ""; }; - C48027051D1928290087BBB9 /* UIButton+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIButton+BAKit.h"; sourceTree = ""; }; - C48027061D1928290087BBB9 /* UIButton+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIButton+BAKit.m"; sourceTree = ""; }; - C48027071D1928290087BBB9 /* UIColor+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+BAKit.h"; sourceTree = ""; }; - C48027081D1928290087BBB9 /* UIColor+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+BAKit.m"; sourceTree = ""; }; - C48027091D1928290087BBB9 /* UIDevice+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+BAKit.h"; sourceTree = ""; }; - C480270A1D1928290087BBB9 /* UIDevice+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+BAKit.m"; sourceTree = ""; }; - C480270B1D1928290087BBB9 /* UIFont+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIFont+BAKit.h"; sourceTree = ""; }; - C480270C1D1928290087BBB9 /* UIFont+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIFont+BAKit.m"; sourceTree = ""; }; - C480270D1D1928290087BBB9 /* UIImage+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+BAKit.h"; sourceTree = ""; }; - C480270E1D1928290087BBB9 /* UIImage+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+BAKit.m"; sourceTree = ""; }; - C480270F1D1928290087BBB9 /* UIImageView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+BAKit.h"; sourceTree = ""; }; - C48027101D1928290087BBB9 /* UIImageView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+BAKit.m"; sourceTree = ""; }; - C48027111D1928290087BBB9 /* UILabel+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+BAKit.h"; sourceTree = ""; }; - C48027121D1928290087BBB9 /* UILabel+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+BAKit.m"; sourceTree = ""; }; - C48027131D1928290087BBB9 /* UIScrollView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+BAKit.h"; sourceTree = ""; }; - C48027141D1928290087BBB9 /* UIScrollView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+BAKit.m"; sourceTree = ""; }; - C48027151D1928290087BBB9 /* UITableView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+BAKit.h"; sourceTree = ""; }; - C48027161D1928290087BBB9 /* UITableView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+BAKit.m"; sourceTree = ""; }; - C48027171D1928290087BBB9 /* UITextField+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+BAKit.h"; sourceTree = ""; }; - C48027181D1928290087BBB9 /* UITextField+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+BAKit.m"; sourceTree = ""; }; - C48027191D1928290087BBB9 /* UIView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BAKit.h"; sourceTree = ""; }; - C480271A1D1928290087BBB9 /* UIView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BAKit.m"; sourceTree = ""; }; - C480271B1D1928290087BBB9 /* UIWebView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWebView+BAKit.h"; sourceTree = ""; }; - C480271C1D1928290087BBB9 /* UIWebView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+BAKit.m"; sourceTree = ""; }; - C480271D1D1928290087BBB9 /* UIWindow+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+BAKit.h"; sourceTree = ""; }; - C480271E1D1928290087BBB9 /* UIWindow+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+BAKit.m"; sourceTree = ""; }; - C48027211D1928290087BBB9 /* BAFadeBlackView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAFadeBlackView.h; sourceTree = ""; }; - C48027221D1928290087BBB9 /* BAFadeBlackView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAFadeBlackView.m; sourceTree = ""; }; - C48027231D1928290087BBB9 /* BASnowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASnowView.h; sourceTree = ""; }; - C48027241D1928290087BBB9 /* BASnowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASnowView.m; sourceTree = ""; }; - C48027251D1928290087BBB9 /* BAUpdatingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAUpdatingView.h; sourceTree = ""; }; - C48027261D1928290087BBB9 /* BAUpdatingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAUpdatingView.m; sourceTree = ""; }; - C48027271D1928290087BBB9 /* CALayer+BAMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CALayer+BAMaskLayer.h"; sourceTree = ""; }; - C48027281D1928290087BBB9 /* CALayer+BAMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CALayer+BAMaskLayer.m"; sourceTree = ""; }; - C48027291D1928290087BBB9 /* EmitterLayerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmitterLayerView.h; sourceTree = ""; }; - C480272A1D1928290087BBB9 /* EmitterLayerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmitterLayerView.m; sourceTree = ""; }; - C480272B1D1928290087BBB9 /* UIView+BAGlowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BAGlowView.h"; sourceTree = ""; }; - C480272C1D1928290087BBB9 /* UIView+BAGlowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BAGlowView.m"; sourceTree = ""; }; - C485562B1D3CB01700002FA2 /* UINavigationController+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+BAKit.m"; sourceTree = ""; }; - C485562D1D3CB02000002FA2 /* UINavigationController+BAKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+BAKit.h"; sourceTree = ""; }; - C485562E1D3CB2DD00002FA2 /* UINavigationBar+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationBar+BAKit.h"; sourceTree = ""; }; - C485562F1D3CB2DD00002FA2 /* UINavigationBar+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationBar+BAKit.m"; sourceTree = ""; }; - C48556311D3CC39900002FA2 /* UIBarButtonItem+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+BAKit.h"; sourceTree = ""; }; - C48556321D3CC39900002FA2 /* UIBarButtonItem+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+BAKit.m"; sourceTree = ""; }; - C48556341D3CC74600002FA2 /* NSDateFormatter+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDateFormatter+BAKit.h"; sourceTree = ""; }; - C48556351D3CC74600002FA2 /* NSDateFormatter+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDateFormatter+BAKit.m"; sourceTree = ""; }; + C484C0BF1DED4D25004D54C0 /* BAProfileHeadCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAProfileHeadCell.h; sourceTree = ""; }; + C484C0C01DED4D25004D54C0 /* BAProfileHeadCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAProfileHeadCell.m; sourceTree = ""; }; + C484C0C11DED4D25004D54C0 /* BAProfileHeadCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BAProfileHeadCell.xib; sourceTree = ""; }; + C48E37501EE29B9E0047A7C8 /* CustomView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomView.h; sourceTree = ""; }; + C48E37511EE29B9E0047A7C8 /* CustomView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomView.m; sourceTree = ""; }; + C48E37521EE29B9E0047A7C8 /* ViewController2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewController2.h; sourceTree = ""; }; + C48E37531EE29B9E0047A7C8 /* ViewController2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewController2.m; sourceTree = ""; }; + C48E37541EE29B9E0047A7C8 /* 123.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 123.png; sourceTree = ""; }; + C48E37551EE29B9E0047A7C8 /* 背景.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "背景.jpg"; sourceTree = ""; }; + C48E37561EE29B9E0047A7C8 /* 美女.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "美女.jpg"; sourceTree = ""; }; + C48E375D1EE2A43B0047A7C8 /* SXColorGradientView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXColorGradientView.h; sourceTree = ""; }; + C48E375E1EE2A43B0047A7C8 /* SXColorGradientView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXColorGradientView.m; sourceTree = ""; }; + C48E375F1EE2A43B0047A7C8 /* SXColorLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXColorLabel.h; sourceTree = ""; }; + C48E37601EE2A43B0047A7C8 /* SXColorLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXColorLabel.m; sourceTree = ""; }; + C48E37611EE2A43B0047A7C8 /* SXHeadLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXHeadLine.h; sourceTree = ""; }; + C48E37621EE2A43B0047A7C8 /* SXHeadLine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXHeadLine.m; sourceTree = ""; }; + C48E37631EE2A43B0047A7C8 /* SXMarquee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SXMarquee.h; sourceTree = ""; }; + C48E37641EE2A43B0047A7C8 /* SXMarquee.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SXMarquee.m; sourceTree = ""; }; + C48E37651EE2A43B0047A7C8 /* UIColor+Separate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Separate.h"; sourceTree = ""; }; + C48E37661EE2A43B0047A7C8 /* UIColor+Separate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Separate.m"; sourceTree = ""; }; + C48E37671EE2A43B0047A7C8 /* UIColor+Wonderful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+Wonderful.h"; sourceTree = ""; }; + C48E37681EE2A43B0047A7C8 /* UIColor+Wonderful.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+Wonderful.m"; sourceTree = ""; }; + C48E37691EE2A43B0047A7C8 /* UILabel+Wonderful.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+Wonderful.h"; sourceTree = ""; }; + C48E376A1EE2A43B0047A7C8 /* UILabel+Wonderful.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+Wonderful.m"; sourceTree = ""; }; + C48E37721EE2A5B50047A7C8 /* BAKit_RegularExpression.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_RegularExpression.h; sourceTree = ""; }; + C48E37731EE2A5B50047A7C8 /* BAKit_RegularExpression.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKit_RegularExpression.m; sourceTree = ""; }; + C4A737E71DEC124400C93B40 /* BAUserSqlite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAUserSqlite.h; sourceTree = ""; }; + C4A737E81DEC124400C93B40 /* BAUserSqlite.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAUserSqlite.m; sourceTree = ""; }; + C4AC635B1EEF70AD00DEEDC7 /* DemoVC2_05_test3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_05_test3.h; sourceTree = ""; }; + C4AC635C1EEF70AD00DEEDC7 /* DemoVC2_05_test3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_05_test3.m; sourceTree = ""; }; + C4AC635E1EEF717C00DEEDC7 /* BAKit_DefineAppKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineAppKey.h; sourceTree = ""; }; + C4AC635F1EEF717C00DEEDC7 /* BAKit_DefineCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineCommon.h; sourceTree = ""; }; + C4AC63601EEF717C00DEEDC7 /* BAKit_Const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_Const.h; sourceTree = ""; }; + C4AC63611EEF717C00DEEDC7 /* BAKit_Const.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKit_Const.m; sourceTree = ""; }; + C4AC63621EEF717C00DEEDC7 /* BAKit_Const_Color.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_Const_Color.h; sourceTree = ""; }; + C4AC63631EEF717C00DEEDC7 /* BAKit_Const_Color.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKit_Const_Color.m; sourceTree = ""; }; + C4AC63641EEF717C00DEEDC7 /* BAKit_Define.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_Define.h; sourceTree = ""; }; + C4AC63651EEF717C00DEEDC7 /* BAKit_DefineFont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineFont.h; sourceTree = ""; }; + C4AC63661EEF717C00DEEDC7 /* BAKit_DefineFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineFrame.h; sourceTree = ""; }; + C4AC63671EEF717C00DEEDC7 /* BAKit_DefineNoti.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineNoti.h; sourceTree = ""; }; + C4AC63681EEF717C00DEEDC7 /* BAKit_Singleton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_Singleton.h; sourceTree = ""; }; + C4AC63691EEF717C00DEEDC7 /* BAKit_DefineCurrent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineCurrent.h; sourceTree = ""; }; + C4AC636A1EEF717C00DEEDC7 /* BAKit_DefineFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_DefineFormat.h; sourceTree = ""; }; + C4AC636D1EEF71AB00DEEDC7 /* BAKit_NSString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_NSString.h; sourceTree = ""; }; + C4AC636E1EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableAttributedString+BAKit.h"; sourceTree = ""; }; + C4AC636F1EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableAttributedString+BAKit.m"; sourceTree = ""; }; + C4AC63701EEF71AB00DEEDC7 /* NSString+BAColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAColor.h"; sourceTree = ""; }; + C4AC63711EEF71AB00DEEDC7 /* NSString+BAColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAColor.m"; sourceTree = ""; }; + C4AC63721EEF71AB00DEEDC7 /* NSString+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAKit.h"; sourceTree = ""; }; + C4AC63731EEF71AB00DEEDC7 /* NSString+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAKit.m"; sourceTree = ""; }; + C4AC63741EEF71AB00DEEDC7 /* NSString+BANSNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BANSNumber.h"; sourceTree = ""; }; + C4AC63751EEF71AB00DEEDC7 /* NSString+BANSNumber.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BANSNumber.m"; sourceTree = ""; }; + C4AC63761EEF71AB00DEEDC7 /* NSString+BARange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BARange.h"; sourceTree = ""; }; + C4AC63771EEF71AB00DEEDC7 /* NSString+BARange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BARange.m"; sourceTree = ""; }; + C4AC63781EEF71AB00DEEDC7 /* NSString+BARegular.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BARegular.h"; sourceTree = ""; }; + C4AC63791EEF71AB00DEEDC7 /* NSString+BARegular.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BARegular.m"; sourceTree = ""; }; + C4AC637A1EEF71AB00DEEDC7 /* NSString+BASize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BASize.h"; sourceTree = ""; }; + C4AC637B1EEF71AB00DEEDC7 /* NSString+BASize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BASize.m"; sourceTree = ""; }; + C4AC637C1EEF71AB00DEEDC7 /* NSString+BATime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BATime.h"; sourceTree = ""; }; + C4AC637D1EEF71AB00DEEDC7 /* NSString+BATime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BATime.m"; sourceTree = ""; }; + C4AC637E1EEF71AB00DEEDC7 /* NSString+BATransform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BATransform.h"; sourceTree = ""; }; + C4AC637F1EEF71AB00DEEDC7 /* NSString+BATransform.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BATransform.m"; sourceTree = ""; }; + C4AC63801EEF71AB00DEEDC7 /* NSString+BATrims.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BATrims.h"; sourceTree = ""; }; + C4AC63811EEF71AB00DEEDC7 /* NSString+BATrims.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BATrims.m"; sourceTree = ""; }; + C4AC63821EEF71AB00DEEDC7 /* NSString+BAUIButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAUIButton.h"; sourceTree = ""; }; + C4AC63831EEF71AB00DEEDC7 /* NSString+BAUIButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAUIButton.m"; sourceTree = ""; }; + C4AC63841EEF71AB00DEEDC7 /* NSString+BAEncrypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAEncrypt.h"; sourceTree = ""; }; + C4AC63851EEF71AB00DEEDC7 /* NSString+BAEncrypt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAEncrypt.m"; sourceTree = ""; }; + C4AC63861EEF71AB00DEEDC7 /* NSString+BAEmoji.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAEmoji.h"; sourceTree = ""; }; + C4AC63871EEF71AB00DEEDC7 /* NSString+BAEmoji.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAEmoji.m"; sourceTree = ""; }; + C4AC63951EEF74F500DEEDC7 /* BAKit_ClearCacheManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_ClearCacheManager.h; sourceTree = ""; }; + C4AC63961EEF74F500DEEDC7 /* BAKit_ClearCacheManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKit_ClearCacheManager.m; sourceTree = ""; }; + C4AC63981EEF783B00DEEDC7 /* UIAlertController+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIAlertController+BAKit.h"; sourceTree = ""; }; + C4AC63991EEF783B00DEEDC7 /* UIAlertController+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIAlertController+BAKit.m"; sourceTree = ""; }; + C4AC639B1EEF7BA500DEEDC7 /* NSDate+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDate+BAKit.h"; sourceTree = ""; }; + C4AC639C1EEF7BA500DEEDC7 /* NSDate+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDate+BAKit.m"; sourceTree = ""; }; + C4AC639D1EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDateFormatter+BAKit.h"; sourceTree = ""; }; + C4AC639E1EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDateFormatter+BAKit.m"; sourceTree = ""; }; + C4AC63A21EEF800800DEEDC7 /* BAKit_UserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit_UserDefaults.h; sourceTree = ""; }; + C4AC63A31EEF800800DEEDC7 /* BAKit_UserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKit_UserDefaults.m; sourceTree = ""; }; + C4AC63A41EEF800800DEEDC7 /* NSFileManager+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+BAKit.h"; sourceTree = ""; }; + C4AC63A51EEF800800DEEDC7 /* NSFileManager+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+BAKit.m"; sourceTree = ""; }; + C4AC63A61EEF800800DEEDC7 /* NSString+BAFileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAFileManager.h"; sourceTree = ""; }; + C4AC63A71EEF800800DEEDC7 /* NSString+BAFileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAFileManager.m"; sourceTree = ""; }; C4ACE2FB1CF5C19500313DD4 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; C4ACE2FD1CF5C53100313DD4 /* DemoVC7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC7.h; sourceTree = ""; }; C4ACE2FE1CF5C53100313DD4 /* DemoVC7.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC7.m; sourceTree = ""; }; @@ -676,6 +754,11 @@ C4ACE3021CF5C90C00313DD4 /* DemoVC8.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC8.m; sourceTree = ""; }; C4ACE3041CF5C96200313DD4 /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = System/Library/Frameworks/EventKit.framework; sourceTree = SDKROOT; }; C4ACE3061CF5C96B00313DD4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + C4B3CB001DFFA67000B5A7B3 /* DemoVC2_08.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_08.h; sourceTree = ""; }; + C4B3CB011DFFA67000B5A7B3 /* DemoVC2_08.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_08.m; sourceTree = ""; }; + C4B3CB021DFFA67000B5A7B3 /* DemoVC2_08.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoVC2_08.xib; sourceTree = ""; }; + C4B3CB051DFFA6F700B5A7B3 /* DemoVC2_08.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DemoVC2_08.html; sourceTree = ""; }; + C4B3CB071DFFF9F700B5A7B3 /* jquery-1.7.2.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jquery-1.7.2.min.js"; sourceTree = ""; }; C4B963141D33A5AF005926B8 /* Contents.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Contents.json; sourceTree = ""; }; C4B963151D33A5AF005926B8 /* dropdown_anim__0001@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dropdown_anim__0001@2x.png"; sourceTree = ""; }; C4B963171D33A5AF005926B8 /* Contents.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Contents.json; sourceTree = ""; }; @@ -802,10 +885,158 @@ C4B963CC1D33A5AF005926B8 /* dropdown_loading_02@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dropdown_loading_02@2x.png"; sourceTree = ""; }; C4B963CE1D33A5AF005926B8 /* Contents.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Contents.json; sourceTree = ""; }; C4B963CF1D33A5AF005926B8 /* dropdown_loading_03@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "dropdown_loading_03@2x.png"; sourceTree = ""; }; - C4B9644F1D33A630005926B8 /* BACustomMJFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomMJFooter.h; sourceTree = ""; }; - C4B964501D33A630005926B8 /* BACustomMJFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomMJFooter.m; sourceTree = ""; }; - C4B964521D33B5E8005926B8 /* BACustomMJHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomMJHeader.h; sourceTree = ""; }; - C4B964531D33B5E8005926B8 /* BACustomMJHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomMJHeader.m; sourceTree = ""; }; + C4C6E02B1DD05B170031395C /* UILabel+BAAttributeTextTapAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+BAAttributeTextTapAction.h"; sourceTree = ""; }; + C4C6E02C1DD05B170031395C /* UILabel+BAAttributeTextTapAction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+BAAttributeTextTapAction.m"; sourceTree = ""; }; + C4C742621DC7295A00E747D8 /* AppDelegate+BABaiduMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+BABaiduMap.h"; sourceTree = ""; }; + C4C742631DC7295A00E747D8 /* AppDelegate+BABaiduMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+BABaiduMap.m"; sourceTree = ""; }; + C4C742641DC7295A00E747D8 /* AppDelegate+BACategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+BACategory.h"; sourceTree = ""; }; + C4C742651DC7295A00E747D8 /* AppDelegate+BACategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+BACategory.m"; sourceTree = ""; }; + C4C742661DC7295A00E747D8 /* NSObject+BAMJParse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BAMJParse.h"; sourceTree = ""; }; + C4C742671DC7295A00E747D8 /* NSObject+BAMJParse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BAMJParse.m"; sourceTree = ""; }; + C4C742681DC7295A00E747D8 /* NSObject+BANetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BANetwork.h"; sourceTree = ""; }; + C4C742691DC7295A00E747D8 /* NSObject+BANetwork.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BANetwork.m"; sourceTree = ""; }; + C4C7426A1DC7295A00E747D8 /* NSObject+BAProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BAProgressHUD.h"; sourceTree = ""; }; + C4C7426B1DC7295A00E747D8 /* NSObject+BAProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BAProgressHUD.m"; sourceTree = ""; }; + C4C7426C1DC7295A00E747D8 /* UIBarButtonItem+Item.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+Item.h"; sourceTree = ""; }; + C4C7426D1DC7295A00E747D8 /* UIBarButtonItem+Item.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+Item.m"; sourceTree = ""; }; + C4C7426E1DC7295A00E747D8 /* UIViewController+BAAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+BAAlertView.h"; sourceTree = ""; }; + C4C7426F1DC7295A00E747D8 /* UIViewController+BAAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+BAAlertView.m"; sourceTree = ""; }; + C4C7431C1DC7295A00E747D8 /* BABaseProject.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseProject.pch; sourceTree = ""; }; + C4C7431E1DC7295A00E747D8 /* BADefin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BADefin.h; sourceTree = ""; }; + C4C7431F1DC7295A00E747D8 /* BAFrameHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAFrameHeader.h; sourceTree = ""; }; + C4C743211DC7295A00E747D8 /* BABaseNetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseNetManager.h; sourceTree = ""; }; + C4C743221DC7295A00E747D8 /* BABaseNetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseNetManager.m; sourceTree = ""; }; + C4C743251DC7295A00E747D8 /* BANewsNetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BANewsNetManager.h; sourceTree = ""; }; + C4C743261DC7295A00E747D8 /* BANewsNetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BANewsNetManager.m; sourceTree = ""; }; + C4C743271DC7295A00E747D8 /* BAURLsPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAURLsPath.h; sourceTree = ""; }; + C4C743871DC72DB300E747D8 /* BAAutoSizeWithWH.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAAutoSizeWithWH.h; sourceTree = ""; }; + C4C743881DC72DB300E747D8 /* BAAutoSizeWithWH.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAAutoSizeWithWH.m; sourceTree = ""; }; + C4C7438A1DC72DB300E747D8 /* BACommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACommon.h; sourceTree = ""; }; + C4C7438B1DC72DB300E747D8 /* BACommon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACommon.m; sourceTree = ""; }; + C4C7438D1DC72DB300E747D8 /* BAJumpManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAJumpManager.h; sourceTree = ""; }; + C4C7438E1DC72DB300E747D8 /* BAJumpManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAJumpManager.m; sourceTree = ""; }; + C4C743901DC72DB300E747D8 /* BALocalNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALocalNotification.h; sourceTree = ""; }; + C4C743911DC72DB300E747D8 /* BALocalNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALocalNotification.m; sourceTree = ""; }; + C4C743931DC72DB300E747D8 /* BACustomBarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomBarItem.h; sourceTree = ""; }; + C4C743941DC72DB300E747D8 /* BACustomBarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomBarItem.m; sourceTree = ""; }; + C4C743951DC72DB300E747D8 /* UINavigationItem+CustomItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationItem+CustomItem.h"; sourceTree = ""; }; + C4C743961DC72DB300E747D8 /* UINavigationItem+CustomItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationItem+CustomItem.m"; sourceTree = ""; }; + C4C743A01DC72DB300E747D8 /* BAShareManage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAShareManage.h; sourceTree = ""; }; + C4C743A11DC72DB300E747D8 /* BAShareManage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAShareManage.m; sourceTree = ""; }; + C4C743A41DC72DB300E747D8 /* BASharManager.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = BASharManager.bundle; sourceTree = ""; }; + C4C743A61DC72DB300E747D8 /* BASystermSetting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASystermSetting.h; sourceTree = ""; }; + C4C743A71DC72DB300E747D8 /* BASystermSetting.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASystermSetting.m; sourceTree = ""; }; + C4C743AC1DC72DB300E747D8 /* BACustomMJFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomMJFooter.h; sourceTree = ""; }; + C4C743AD1DC72DB300E747D8 /* BACustomMJFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomMJFooter.m; sourceTree = ""; }; + C4C743AE1DC72DB300E747D8 /* BACustomMJHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomMJHeader.h; sourceTree = ""; }; + C4C743AF1DC72DB300E747D8 /* BACustomMJHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomMJHeader.m; sourceTree = ""; }; + C4C743B01DC72DB300E747D8 /* BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKit.h; sourceTree = ""; }; + C4C743B21DC72DB300E747D8 /* BAKitManager+BALabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "BAKitManager+BALabel.h"; sourceTree = ""; }; + C4C743B31DC72DB300E747D8 /* BAKitManager+BALabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "BAKitManager+BALabel.m"; sourceTree = ""; }; + C4C743B41DC72DB300E747D8 /* BAKitManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAKitManager.h; sourceTree = ""; }; + C4C743B51DC72DB300E747D8 /* BAKitManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAKitManager.m; sourceTree = ""; }; + C4C743B71DC72DB300E747D8 /* NSArray+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+BAKit.h"; sourceTree = ""; }; + C4C743B81DC72DB300E747D8 /* NSArray+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+BAKit.m"; sourceTree = ""; }; + C4C743B91DC72DB300E747D8 /* NSData+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+BAKit.h"; sourceTree = ""; }; + C4C743BA1DC72DB300E747D8 /* NSData+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSData+BAKit.m"; sourceTree = ""; }; + C4C743BF1DC72DB300E747D8 /* NSDictionary+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+BAKit.h"; sourceTree = ""; }; + C4C743C01DC72DB300E747D8 /* NSDictionary+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+BAKit.m"; sourceTree = ""; }; + C4C743C11DC72DB300E747D8 /* NSFileManager+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSFileManager+BAKit.h"; sourceTree = ""; }; + C4C743C21DC72DB300E747D8 /* NSFileManager+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSFileManager+BAKit.m"; sourceTree = ""; }; + C4C743C31DC72DB300E747D8 /* NSMutableArray+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+BAKit.h"; sourceTree = ""; }; + C4C743C41DC72DB300E747D8 /* NSMutableArray+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+BAKit.m"; sourceTree = ""; }; + C4C743C51DC72DB300E747D8 /* NSMutableDictionary+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableDictionary+BAKit.h"; sourceTree = ""; }; + C4C743C61DC72DB300E747D8 /* NSMutableDictionary+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableDictionary+BAKit.m"; sourceTree = ""; }; + C4C743C71DC72DB300E747D8 /* NSNumber+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNumber+BAKit.h"; sourceTree = ""; }; + C4C743C81DC72DB300E747D8 /* NSNumber+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSNumber+BAKit.m"; sourceTree = ""; }; + C4C743C91DC72DB300E747D8 /* NSObject+BARunTime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BARunTime.h"; sourceTree = ""; }; + C4C743CA1DC72DB300E747D8 /* NSObject+BARunTime.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BARunTime.m"; sourceTree = ""; }; + C4C743CB1DC72DB300E747D8 /* NSProcessInfo+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSProcessInfo+BAKit.h"; sourceTree = ""; }; + C4C743CC1DC72DB300E747D8 /* NSProcessInfo+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSProcessInfo+BAKit.m"; sourceTree = ""; }; + C4C743CD1DC72DB300E747D8 /* NSShadow+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSShadow+BAKit.h"; sourceTree = ""; }; + C4C743CE1DC72DB300E747D8 /* NSShadow+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSShadow+BAKit.m"; sourceTree = ""; }; + C4C743D81DC72DB300E747D8 /* NSThread+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSThread+BAKit.h"; sourceTree = ""; }; + C4C743D91DC72DB300E747D8 /* NSThread+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSThread+BAKit.m"; sourceTree = ""; }; + C4C743DB1DC72DB300E747D8 /* GCD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCD.h; sourceTree = ""; }; + C4C743DC1DC72DB300E747D8 /* GCDGroup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDGroup.h; sourceTree = ""; }; + C4C743DD1DC72DB300E747D8 /* GCDGroup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDGroup.m; sourceTree = ""; }; + C4C743DE1DC72DB300E747D8 /* GCDQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDQueue.h; sourceTree = ""; }; + C4C743DF1DC72DB300E747D8 /* GCDQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDQueue.m; sourceTree = ""; }; + C4C743E01DC72DB300E747D8 /* GCDSemaphore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDSemaphore.h; sourceTree = ""; }; + C4C743E11DC72DB300E747D8 /* GCDSemaphore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDSemaphore.m; sourceTree = ""; }; + C4C743E21DC72DB300E747D8 /* GCDTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCDTimer.h; sourceTree = ""; }; + C4C743E31DC72DB300E747D8 /* GCDTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GCDTimer.m; sourceTree = ""; }; + C4C743E51DC72DB300E747D8 /* BAAPP.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAAPP.h; sourceTree = ""; }; + C4C743E61DC72DB300E747D8 /* BAAPP.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAAPP.m; sourceTree = ""; }; + C4C743E71DC72DB300E747D8 /* BALog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALog.h; sourceTree = ""; }; + C4C743E81DC72DB300E747D8 /* BALog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALog.m; sourceTree = ""; }; + C4C743E91DC72DB300E747D8 /* BAPassword.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAPassword.h; sourceTree = ""; }; + C4C743EA1DC72DB300E747D8 /* BAPassword.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAPassword.m; sourceTree = ""; }; + C4C743EB1DC72DB300E747D8 /* BASystemService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASystemService.h; sourceTree = ""; }; + C4C743EC1DC72DB300E747D8 /* BASystemService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASystemService.m; sourceTree = ""; }; + C4C743ED1DC72DB300E747D8 /* BASystemSound.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASystemSound.h; sourceTree = ""; }; + C4C743EE1DC72DB300E747D8 /* BASystemSound.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASystemSound.m; sourceTree = ""; }; + C4C743EF1DC72DB300E747D8 /* BATouchID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATouchID.h; sourceTree = ""; }; + C4C743F01DC72DB300E747D8 /* BATouchID.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATouchID.m; sourceTree = ""; }; + C4C743F11DC72DB300E747D8 /* UIApplication+AppInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIApplication+AppInfo.h"; sourceTree = ""; }; + C4C743F21DC72DB300E747D8 /* UIApplication+AppInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIApplication+AppInfo.m"; sourceTree = ""; }; + C4C743F41DC72DB300E747D8 /* BACustomModalTransition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomModalTransition.h; sourceTree = ""; }; + C4C743F51DC72DB300E747D8 /* BACustomModalTransition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomModalTransition.m; sourceTree = ""; }; + C4C743FA1DC72DB300E747D8 /* BATextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATextView.h; sourceTree = ""; }; + C4C743FB1DC72DB300E747D8 /* BATextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATextView.m; sourceTree = ""; }; + C4C743FC1DC72DB300E747D8 /* UIBarButtonItem+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+BAKit.h"; sourceTree = ""; }; + C4C743FD1DC72DB300E747D8 /* UIBarButtonItem+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+BAKit.m"; sourceTree = ""; }; + C4C744001DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UICollectionView+ARDynamicCacheHeightLayoutCell.h"; sourceTree = ""; }; + C4C744011DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionView+ARDynamicCacheHeightLayoutCell.m"; sourceTree = ""; }; + C4C744021DC72DB300E747D8 /* UIColor+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+BAKit.h"; sourceTree = ""; }; + C4C744031DC72DB300E747D8 /* UIColor+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+BAKit.m"; sourceTree = ""; }; + C4C744041DC72DB300E747D8 /* UIDevice+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+BAKit.h"; sourceTree = ""; }; + C4C744051DC72DB300E747D8 /* UIDevice+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+BAKit.m"; sourceTree = ""; }; + C4C744061DC72DB300E747D8 /* UIFont+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIFont+BAKit.h"; sourceTree = ""; }; + C4C744071DC72DB300E747D8 /* UIFont+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIFont+BAKit.m"; sourceTree = ""; }; + C4C744081DC72DB300E747D8 /* UIImage+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+BAKit.h"; sourceTree = ""; }; + C4C744091DC72DB300E747D8 /* UIImage+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+BAKit.m"; sourceTree = ""; }; + C4C7440A1DC72DB300E747D8 /* UIImageView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImageView+BAKit.h"; sourceTree = ""; }; + C4C7440B1DC72DB300E747D8 /* UIImageView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImageView+BAKit.m"; sourceTree = ""; }; + C4C7440C1DC72DB300E747D8 /* UILabel+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UILabel+BAKit.h"; sourceTree = ""; }; + C4C7440D1DC72DB300E747D8 /* UILabel+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UILabel+BAKit.m"; sourceTree = ""; }; + C4C7440E1DC72DB300E747D8 /* UINavigationBar+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationBar+BAKit.h"; sourceTree = ""; }; + C4C7440F1DC72DB300E747D8 /* UINavigationBar+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationBar+BAKit.m"; sourceTree = ""; }; + C4C744101DC72DB300E747D8 /* UINavigationController+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+BAKit.h"; sourceTree = ""; }; + C4C744111DC72DB300E747D8 /* UINavigationController+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+BAKit.m"; sourceTree = ""; }; + C4C744121DC72DB300E747D8 /* UIScrollView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+BAKit.h"; sourceTree = ""; }; + C4C744131DC72DB300E747D8 /* UIScrollView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+BAKit.m"; sourceTree = ""; }; + C4C744141DC72DB300E747D8 /* UITableView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+BAKit.h"; sourceTree = ""; }; + C4C744151DC72DB300E747D8 /* UITableView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+BAKit.m"; sourceTree = ""; }; + C4C744161DC72DB300E747D8 /* UITableViewCell+Reuse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableViewCell+Reuse.h"; sourceTree = ""; }; + C4C744171DC72DB300E747D8 /* UITableViewCell+Reuse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableViewCell+Reuse.m"; sourceTree = ""; }; + C4C744181DC72DB300E747D8 /* UITextField+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITextField+BAKit.h"; sourceTree = ""; }; + C4C744191DC72DB300E747D8 /* UITextField+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextField+BAKit.m"; sourceTree = ""; }; + C4C7441A1DC72DB300E747D8 /* UIView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BAKit.h"; sourceTree = ""; }; + C4C7441B1DC72DB300E747D8 /* UIView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BAKit.m"; sourceTree = ""; }; + C4C7441C1DC72DB300E747D8 /* UIWebView+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWebView+BAKit.h"; sourceTree = ""; }; + C4C7441D1DC72DB300E747D8 /* UIWebView+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+BAKit.m"; sourceTree = ""; }; + C4C7441E1DC72DB300E747D8 /* UIWindow+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIWindow+BAKit.h"; sourceTree = ""; }; + C4C7441F1DC72DB300E747D8 /* UIWindow+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWindow+BAKit.m"; sourceTree = ""; }; + C4C744221DC72DB300E747D8 /* BARotateAnimationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARotateAnimationProtocol.h; sourceTree = ""; }; + C4C744231DC72DB300E747D8 /* BARotateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARotateView.h; sourceTree = ""; }; + C4C744241DC72DB300E747D8 /* BARotateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BARotateView.m; sourceTree = ""; }; + C4C744251DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BARotateAnimationProtocol.h"; sourceTree = ""; }; + C4C744261DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BARotateAnimationProtocol.m"; sourceTree = ""; }; + C4C744281DC72DB300E747D8 /* BAFadeBlackView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAFadeBlackView.h; sourceTree = ""; }; + C4C744291DC72DB300E747D8 /* BAFadeBlackView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAFadeBlackView.m; sourceTree = ""; }; + C4C7442A1DC72DB300E747D8 /* BASnowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BASnowView.h; sourceTree = ""; }; + C4C7442B1DC72DB300E747D8 /* BASnowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BASnowView.m; sourceTree = ""; }; + C4C7442C1DC72DB300E747D8 /* BAUpdatingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAUpdatingView.h; sourceTree = ""; }; + C4C7442D1DC72DB300E747D8 /* BAUpdatingView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAUpdatingView.m; sourceTree = ""; }; + C4C7442E1DC72DB300E747D8 /* CALayer+BAMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CALayer+BAMaskLayer.h"; sourceTree = ""; }; + C4C7442F1DC72DB300E747D8 /* CALayer+BAMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CALayer+BAMaskLayer.m"; sourceTree = ""; }; + C4C744301DC72DB300E747D8 /* EmitterLayerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EmitterLayerView.h; sourceTree = ""; }; + C4C744311DC72DB300E747D8 /* EmitterLayerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EmitterLayerView.m; sourceTree = ""; }; + C4C744321DC72DB300E747D8 /* UIView+BAGlowView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+BAGlowView.h"; sourceTree = ""; }; + C4C744331DC72DB300E747D8 /* UIView+BAGlowView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+BAGlowView.m"; sourceTree = ""; }; + C4C744821DC7306800E747D8 /* DemoVC2_05_test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_05_test.h; sourceTree = ""; }; + C4C744831DC7306800E747D8 /* DemoVC2_05_test.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_05_test.m; sourceTree = ""; }; C4C8024F1CF5AFAE00AD5B3B /* BAWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAWebViewController.m; sourceTree = ""; }; C4C802501CF5AFAE00AD5B3B /* BAWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAWebViewController.h; sourceTree = ""; }; C4D107FA1CE2FC1C00F735B9 /* view1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = view1.h; sourceTree = ""; }; @@ -816,8 +1047,25 @@ C4D107FF1CE2FC1C00F735B9 /* view3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = view3.m; sourceTree = ""; }; C4D108001CE2FC1C00F735B9 /* view4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = view4.h; sourceTree = ""; }; C4D108011CE2FC1C00F735B9 /* view4.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = view4.m; sourceTree = ""; }; - C4DEB3721D0C2FC8001F1585 /* BANetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BANetManager.m; sourceTree = ""; }; - C4DEB3731D0C2FC8001F1585 /* BANetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BANetManager.h; sourceTree = ""; }; + C4D1092A1D9271400057B2DC /* DemoVC2_04.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_04.h; sourceTree = ""; }; + C4D1092B1D9271400057B2DC /* DemoVC2_04.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_04.m; sourceTree = ""; }; + C4D26F451E03D41A0040AC3E /* BAPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAPage.h; sourceTree = ""; }; + C4D26F461E03D41A0040AC3E /* BAPage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAPage.m; sourceTree = ""; }; + C4D26F501E03F4420040AC3E /* DemoVC2_09.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_09.h; sourceTree = ""; }; + C4D26F511E03F4420040AC3E /* DemoVC2_09.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_09.m; sourceTree = ""; }; + C4D26F531E03F44D0040AC3E /* DemoVC2_09.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DemoVC2_09.xib; sourceTree = ""; }; + C4DD40541DE819050084CBCA /* JKDBHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JKDBHelper.h; sourceTree = ""; }; + C4DD40551DE819050084CBCA /* JKDBHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JKDBHelper.m; sourceTree = ""; }; + C4DD40561DE819050084CBCA /* JKDBModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JKDBModel.h; sourceTree = ""; }; + C4DD40571DE819050084CBCA /* JKDBModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JKDBModel.m; sourceTree = ""; }; + C4DD40621DE81A290084CBCA /* BALoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALoginViewController.h; sourceTree = ""; }; + C4DD40631DE81A290084CBCA /* BALoginViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALoginViewController.m; sourceTree = ""; }; + C4DD40641DE81A290084CBCA /* BALoginViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BALoginViewController.xib; sourceTree = ""; }; + C4DD40651DE81A290084CBCA /* BARegistViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BARegistViewController.h; sourceTree = ""; }; + C4DD40661DE81A290084CBCA /* BARegistViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BARegistViewController.m; sourceTree = ""; }; + C4DD40671DE81A290084CBCA /* BARegistViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BARegistViewController.xib; sourceTree = ""; }; + C4DD406C1DE81A330084CBCA /* BAUserModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAUserModel.h; sourceTree = ""; }; + C4DD406D1DE81A330084CBCA /* BAUserModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAUserModel.m; sourceTree = ""; }; C4DEB3751D0C332C001F1585 /* BATabBarController2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATabBarController2.h; sourceTree = ""; }; C4DEB3761D0C332C001F1585 /* BATabBarController2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATabBarController2.m; sourceTree = ""; }; C4DEB3781D0C3351001F1585 /* BATabBar2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BATabBar2.h; path = ../Controller/BATabBar2.h; sourceTree = ""; }; @@ -826,6 +1074,8 @@ C4DEB37C1D0C33E8001F1585 /* BANavigationController2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BANavigationController2.m; sourceTree = ""; }; C4DEB3831D0C34B0001F1585 /* BAPublishViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAPublishViewController.h; sourceTree = ""; }; C4DEB3841D0C34B0001F1585 /* BAPublishViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAPublishViewController.m; sourceTree = ""; }; + C4E015491E0A35F200CCC322 /* BATextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BATextField.h; sourceTree = ""; }; + C4E0154A1E0A35F200CCC322 /* BATextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BATextField.m; sourceTree = ""; }; C4EA257F1CF7DFEC00F6081C /* DemoVC10.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC10.h; sourceTree = ""; }; C4EA25801CF7DFEC00F6081C /* DemoVC10.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC10.m; sourceTree = ""; }; C4EA25821CF7E10600F6081C /* DemoVC10_CollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC10_CollectionView.h; sourceTree = ""; }; @@ -861,8 +1111,6 @@ C4EB5AE31CD8B24F003A7094 /* BANavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BANavigationBar.m; sourceTree = ""; }; C4EB5AE51CD8B24F003A7094 /* BABaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseViewController.h; sourceTree = ""; }; C4EB5AE61CD8B24F003A7094 /* BABaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseViewController.m; sourceTree = ""; }; - C4EB5AEA1CD8B24F003A7094 /* BAGIFImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAGIFImageView.h; sourceTree = ""; }; - C4EB5AEB1CD8B24F003A7094 /* BAGIFImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAGIFImageView.m; sourceTree = ""; }; C4EB5AF31CD8B24F003A7094 /* BADiscoverViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BADiscoverViewController.h; sourceTree = ""; }; C4EB5AF41CD8B24F003A7094 /* BADiscoverViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BADiscoverViewController.m; sourceTree = ""; }; C4EB5AF91CD8B24F003A7094 /* BAHomeViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAHomeViewController.h; sourceTree = ""; }; @@ -874,26 +1122,6 @@ C4EB5B121CD8B24F003A7094 /* LPLevelView.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = LPLevelView.bundle; sourceTree = ""; }; C4EB5B131CD8B24F003A7094 /* LPLevelView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LPLevelView.h; sourceTree = ""; }; C4EB5B141CD8B24F003A7094 /* LPLevelView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LPLevelView.m; sourceTree = ""; }; - C4EB5B281CD8B24F003A7094 /* AppDelegate+BACategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AppDelegate+BACategory.h"; sourceTree = ""; }; - C4EB5B291CD8B24F003A7094 /* AppDelegate+BACategory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AppDelegate+BACategory.m"; sourceTree = ""; }; - C4EB5B2A1CD8B24F003A7094 /* NSObject+BAMJParse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BAMJParse.h"; sourceTree = ""; }; - C4EB5B2B1CD8B24F003A7094 /* NSObject+BAMJParse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BAMJParse.m"; sourceTree = ""; }; - C4EB5B2C1CD8B24F003A7094 /* NSObject+BAProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BAProgressHUD.h"; sourceTree = ""; }; - C4EB5B2D1CD8B24F003A7094 /* NSObject+BAProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BAProgressHUD.m"; sourceTree = ""; }; - C4EB5B2E1CD8B24F003A7094 /* NSObject+BANetwork.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+BANetwork.h"; sourceTree = ""; }; - C4EB5B2F1CD8B24F003A7094 /* NSObject+BANetwork.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+BANetwork.m"; sourceTree = ""; }; - C4EB5B301CD8B24F003A7094 /* UIBarButtonItem+Item.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+Item.h"; sourceTree = ""; }; - C4EB5B311CD8B24F003A7094 /* UIBarButtonItem+Item.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+Item.m"; sourceTree = ""; }; - C4EB5B341CD8B24F003A7094 /* UIViewController+BAAlertView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIViewController+BAAlertView.h"; sourceTree = ""; }; - C4EB5B351CD8B24F003A7094 /* UIViewController+BAAlertView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+BAAlertView.m"; sourceTree = ""; }; - C4EB5B381CD8B24F003A7094 /* BAColorHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAColorHeader.h; sourceTree = ""; }; - C4EB5B391CD8B24F003A7094 /* BADefin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BADefin.h; sourceTree = ""; }; - C4EB5B3B1CD8B24F003A7094 /* BAFrameHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAFrameHeader.h; sourceTree = ""; }; - C4EB5B3E1CD8B24F003A7094 /* BABaseNetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseNetManager.h; sourceTree = ""; }; - C4EB5B3F1CD8B24F003A7094 /* BABaseNetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BABaseNetManager.m; sourceTree = ""; }; - C4EB5B401CD8B24F003A7094 /* BANewsNetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BANewsNetManager.h; sourceTree = ""; }; - C4EB5B411CD8B24F003A7094 /* BANewsNetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BANewsNetManager.m; sourceTree = ""; }; - C4EB5B421CD8B24F003A7094 /* BAURLsPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAURLsPath.h; sourceTree = ""; }; C4EB5B461CD8B24F003A7094 /* area.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = area.plist; sourceTree = ""; }; C4EB5B4A1CD8B24F003A7094 /* img0.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = img0.jpg; sourceTree = ""; }; C4EB5B4B1CD8B24F003A7094 /* img1.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = img1.jpg; sourceTree = ""; }; @@ -983,14 +1211,16 @@ C4EB5BA51CD8B250003A7094 /* 烟花背景.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "烟花背景.jpg"; sourceTree = ""; }; C4EB5BA61CD8B250003A7094 /* 金元宝.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "金元宝.png"; sourceTree = ""; }; C4EB5BA71CD8B250003A7094 /* 雪花.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "雪花.png"; sourceTree = ""; }; - C4EB5C321CD8B530003A7094 /* BABaseProject.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BABaseProject.pch; sourceTree = ""; }; C4EB5C9D1CD8BDAE003A7094 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C4EBE1E81D94C4FC00020C1F /* MyAnimatedAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MyAnimatedAnnotationView.h; sourceTree = ""; }; + C4EBE1E91D94C4FC00020C1F /* MyAnimatedAnnotationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MyAnimatedAnnotationView.m; sourceTree = ""; }; + C4EBE1EF1D95015D00020C1F /* poi_1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = poi_1.png; sourceTree = ""; }; + C4EBE1F01D95015D00020C1F /* poi_2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = poi_2.png; sourceTree = ""; }; + C4EBE1F11D95015D00020C1F /* poi_3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = poi_3.png; sourceTree = ""; }; C4EE1C5C1D2288BF005046A6 /* DemoVC2_01.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_01.h; sourceTree = ""; }; C4EE1C5D1D2288BF005046A6 /* DemoVC2_01.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_01.m; sourceTree = ""; }; C4EE1C5F1D228AE9005046A6 /* DemoVC2_01_Model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC2_01_Model.h; sourceTree = ""; }; C4EE1C601D228AE9005046A6 /* DemoVC2_01_Model.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC2_01_Model.m; sourceTree = ""; }; - C4EE1C631D228E34005046A6 /* NSString+BAKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+BAKit.h"; sourceTree = ""; }; - C4EE1C641D228E34005046A6 /* NSString+BAKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+BAKit.m"; sourceTree = ""; }; C4EE1C671D2295E2005046A6 /* BACellDataAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACellDataAdapter.h; sourceTree = ""; }; C4EE1C681D2295E2005046A6 /* BACellDataAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACellDataAdapter.m; sourceTree = ""; }; C4F59F851D54680E00AA822A /* BANewFeatureVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BANewFeatureVC.h; sourceTree = ""; }; @@ -999,25 +1229,11 @@ C4F59F891D54684E00AA822A /* BAADScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAADScrollView.m; sourceTree = ""; }; C4F59F8B1D5468B900AA822A /* BAADLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAADLabel.h; sourceTree = ""; }; C4F59F8C1D5468B900AA822A /* BAADLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAADLabel.m; sourceTree = ""; }; - C4F74A861D37BDEB0014C396 /* BAClearCacheManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAClearCacheManager.h; sourceTree = ""; }; - C4F74A871D37BDEB0014C396 /* BAClearCacheManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAClearCacheManager.m; sourceTree = ""; }; - C4F74A8A1D37C1BD0014C396 /* BALocalNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BALocalNotification.h; sourceTree = ""; }; - C4F74A8B1D37C1BD0014C396 /* BALocalNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BALocalNotification.m; sourceTree = ""; }; - C4F74A8D1D37C1BD0014C396 /* BACustomBarItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BACustomBarItem.h; sourceTree = ""; }; - C4F74A8E1D37C1BD0014C396 /* BACustomBarItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BACustomBarItem.m; sourceTree = ""; }; - C4F74A8F1D37C1BD0014C396 /* UINavigationItem+CustomItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationItem+CustomItem.h"; sourceTree = ""; }; - C4F74A901D37C1BD0014C396 /* UINavigationItem+CustomItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationItem+CustomItem.m"; sourceTree = ""; }; - C4F74A921D37C1BD0014C396 /* HMSegmentedControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HMSegmentedControl.h; sourceTree = ""; }; - C4F74A931D37C1BD0014C396 /* HMSegmentedControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HMSegmentedControl.m; sourceTree = ""; }; - C4F74A951D37C1BD0014C396 /* BAShareAnimationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAShareAnimationView.h; sourceTree = ""; }; - C4F74A961D37C1BD0014C396 /* BAShareAnimationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAShareAnimationView.m; sourceTree = ""; }; - C4F74A971D37C1BD0014C396 /* BAShareManage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAShareManage.h; sourceTree = ""; }; - C4F74A981D37C1BD0014C396 /* BAShareManage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAShareManage.m; sourceTree = ""; }; - C4F74A991D37C1BD0014C396 /* BAShareManageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BAShareManageView.h; sourceTree = ""; }; - C4F74A9A1D37C1BD0014C396 /* BAShareManageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BAShareManageView.m; sourceTree = ""; }; - C4F74A9B1D37C1BD0014C396 /* BASharManager.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = BASharManager.bundle; sourceTree = ""; }; + C4FB59D91DDD42F7002F5A03 /* DemoVC14.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoVC14.h; sourceTree = ""; }; + C4FB59DA1DDD42F7002F5A03 /* DemoVC14.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoVC14.m; sourceTree = ""; }; + C4FB59DC1DDD4302002F5A03 /* Dog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dog.h; sourceTree = ""; }; + C4FB59DD1DDD4302002F5A03 /* Dog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Dog.m; sourceTree = ""; }; DF2E61F00C0958F539053F08 /* Pods-BABaseProjectUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BABaseProjectUITests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-BABaseProjectUITests/Pods-BABaseProjectUITests.debug.xcconfig"; sourceTree = ""; }; - EB54BFBC1CA5F4765E84B54C /* libPods-BABaseProject-BABaseProjectUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -1025,11 +1241,17 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C411755A1DF7C0D200802612 /* libc++.tbd in Frameworks */, + C41175581DF7C0B300802612 /* libz.tbd in Frameworks */, + C41175561DF7C0A900802612 /* libsqlite3.tbd in Frameworks */, + C41175541DF7C0A000802612 /* ImageIO.framework in Frameworks */, + C41175521DF7C09700802612 /* CoreTelephony.framework in Frameworks */, + C41175501DF7C08E00802612 /* SystemConfiguration.framework in Frameworks */, C4ACE3071CF5C96B00313DD4 /* CoreGraphics.framework in Frameworks */, C4ACE3051CF5C96200313DD4 /* EventKit.framework in Frameworks */, C4ACE2FC1CF5C19500313DD4 /* WebKit.framework in Frameworks */, C46B8A061CE0BB7D00005E2B /* libicucore.tbd in Frameworks */, - E1C6EFD156F8206BA6582EBE /* libPods-BABaseProject.a in Frameworks */, + 859CBDBC1C0B897C477F1830 /* libPods-BABaseProject.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1038,7 +1260,7 @@ buildActionMask = 2147483647; files = ( 5C5C57EED15443424D1F9E04 /* libPods-BABaseProjectTests.a in Frameworks */, - C3F6369929471C65565BE195 /* libPods-BABaseProject-BABaseProjectTests.a in Frameworks */, + C07169A416BB3C73F9B14968 /* libPods-BABaseProject-BABaseProjectTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1047,7 +1269,7 @@ buildActionMask = 2147483647; files = ( 0A2263DDA3BEC585020264E0 /* libPods-BABaseProjectUITests.a in Frameworks */, - 6E470DCC8E8F7DFE93E782E5 /* libPods-BABaseProject-BABaseProjectUITests.a in Frameworks */, + BC125F9D71FBD9A5C5530CAA /* libPods-BABaseProject-BABaseProjectUITests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1074,19 +1296,35 @@ B678F676F10C8EB64082087B /* Frameworks */ = { isa = PBXGroup; children = ( + C41175591DF7C0D200802612 /* libc++.tbd */, + C41175571DF7C0B300802612 /* libz.tbd */, + C41175551DF7C0A900802612 /* libsqlite3.tbd */, + C41175531DF7C0A000802612 /* ImageIO.framework */, + C41175511DF7C09700802612 /* CoreTelephony.framework */, + C411754F1DF7C08E00802612 /* SystemConfiguration.framework */, C4ACE3061CF5C96B00313DD4 /* CoreGraphics.framework */, C4ACE3041CF5C96200313DD4 /* EventKit.framework */, C4ACE2FB1CF5C19500313DD4 /* WebKit.framework */, C46B8A051CE0BB7D00005E2B /* libicucore.tbd */, - 46504BE330E8BECB1887138B /* libPods-BABaseProject.a */, 1574EF9FCBB113FDCC972156 /* libPods-BABaseProjectTests.a */, 77795B692E80399FDA1BD963 /* libPods-BABaseProjectUITests.a */, - BF87F3C10B89949A3DB1CDEC /* libPods-BABaseProject-BABaseProjectTests.a */, - EB54BFBC1CA5F4765E84B54C /* libPods-BABaseProject-BABaseProjectUITests.a */, + 539C5D5ABB06B9E52C89A5CE /* libPods-BABaseProject.a */, + 1694997B390478F9A51051C8 /* libPods-BABaseProject-BABaseProjectTests.a */, + 7379A219A22C69FA7095C49C /* libPods-BABaseProject-BABaseProjectUITests.a */, ); name = Frameworks; sourceTree = ""; }; + C407E54D1DE533C200FB1244 /* DemoVC2-7 */ = { + isa = PBXGroup; + children = ( + C407E5511DE5343000FB1244 /* DemoVC2_07.h */, + C407E5521DE5343000FB1244 /* DemoVC2_07.m */, + C407E5531DE5343000FB1244 /* DemoVC2_07.xib */, + ); + path = "DemoVC2-7"; + sourceTree = ""; + }; C408527D1CD995200004A671 /* Reachability */ = { isa = PBXGroup; children = ( @@ -1125,6 +1363,7 @@ C48026BE1D191EC90087BBB9 /* DemoVC11 */, C48026CB1D191EDC0087BBB9 /* DemoVC12 */, C445E1F21D1BF0E100D7654A /* DemoVC13 */, + C4FB59D81DDD42D3002F5A03 /* DemoVC14 */, ); path = DemoVC; sourceTree = ""; @@ -1156,22 +1395,6 @@ path = DemoVC6; sourceTree = ""; }; - C42781241D2D39B1003E6694 /* GCD */ = { - isa = PBXGroup; - children = ( - C42781251D2D39B1003E6694 /* GCD.h */, - C42781261D2D39B1003E6694 /* GCDGroup.h */, - C42781271D2D39B1003E6694 /* GCDGroup.m */, - C42781281D2D39B1003E6694 /* GCDQueue.h */, - C42781291D2D39B1003E6694 /* GCDQueue.m */, - C427812A1D2D39B1003E6694 /* GCDSemaphore.h */, - C427812B1D2D39B1003E6694 /* GCDSemaphore.m */, - C427812C1D2D39B1003E6694 /* GCDTimer.h */, - C427812D1D2D39B1003E6694 /* GCDTimer.m */, - ); - path = GCD; - sourceTree = ""; - }; C42DAA401D37265500FE8B3E /* DemoVC2-3 */ = { isa = PBXGroup; children = ( @@ -1181,54 +1404,57 @@ path = "DemoVC2-3"; sourceTree = ""; }; - C430AB731CDC8A170086DDD6 /* DemoVC3 */ = { + C4309BAE1DCAD4D50016ABE6 /* BALoadingHubView */ = { isa = PBXGroup; children = ( - C430AB741CDC8A360086DDD6 /* DemoVC3.h */, - C430AB751CDC8A360086DDD6 /* DemoVC3.m */, + C4309BAF1DCAD4D50016ABE6 /* BALoadingHubView.h */, + C4309BB01DCAD4D50016ABE6 /* BALoadingHubView.m */, ); - path = DemoVC3; + path = BALoadingHubView; sourceTree = ""; }; - C437CB201CEF0AFD00FCA331 /* DemoVC7 */ = { + C4309BB21DCAD5C40016ABE6 /* BAHook */ = { isa = PBXGroup; children = ( - C4ACE2FD1CF5C53100313DD4 /* DemoVC7.h */, - C4ACE2FE1CF5C53100313DD4 /* DemoVC7.m */, + C44C00CF1DCB283700BAAAEC /* BADemoUserStatisticsConfig.plist */, + C4309BB31DCAD5C40016ABE6 /* BAEventIDConstant.h */, + C4309BB41DCAD5C40016ABE6 /* BAUserStatistics.h */, + C4309BB51DCAD5C40016ABE6 /* BAUserStatistics.m */, + C4309BB61DCAD5C40016ABE6 /* NSObject+BAHook.h */, + C4309BB71DCAD5C40016ABE6 /* NSObject+BAHook.m */, + C4309BB81DCAD5C40016ABE6 /* UIControl+BAUserStastistics.h */, + C4309BB91DCAD5C40016ABE6 /* UIControl+BAUserStastistics.m */, + C4309BBA1DCAD5C40016ABE6 /* UIViewController+BAHook.h */, + C4309BBB1DCAD5C40016ABE6 /* UIViewController+BAHook.m */, + C44C00D11DCB30BA00BAAAEC /* UIButton+BAHook.h */, + C44C00D21DCB30BA00BAAAEC /* UIButton+BAHook.m */, ); - path = DemoVC7; + path = BAHook; sourceTree = ""; }; - C44423271D2E5DE1004ACAA8 /* BAKitManager */ = { + C4309BC01DCAD5CE0016ABE6 /* UIViewController */ = { isa = PBXGroup; children = ( - C44423281D2E5E07004ACAA8 /* BAKitManager+BALabel.h */, - C44423291D2E5E07004ACAA8 /* BAKitManager+BALabel.m */, ); - path = BAKitManager; + path = UIViewController; sourceTree = ""; }; - C444232B1D2E738A004ACAA8 /* BAAlert */ = { + C430AB731CDC8A170086DDD6 /* DemoVC3 */ = { isa = PBXGroup; children = ( - C444232C1D2E738A004ACAA8 /* BAAlertView.h */, - C444232D1D2E738A004ACAA8 /* BAAlertView.m */, - C444232E1D2E738A004ACAA8 /* BAModal.h */, - C444232F1D2E738A004ACAA8 /* BAModal.m */, + C430AB741CDC8A360086DDD6 /* DemoVC3.h */, + C430AB751CDC8A360086DDD6 /* DemoVC3.m */, ); - path = BAAlert; + path = DemoVC3; sourceTree = ""; }; - C44423351D2E7E37004ACAA8 /* BARotateView */ = { + C437CB201CEF0AFD00FCA331 /* DemoVC7 */ = { isa = PBXGroup; children = ( - C44423431D2E824D004ACAA8 /* BARotateView.h */, - C44423441D2E824D004ACAA8 /* BARotateView.m */, - C44423401D2E81AC004ACAA8 /* BARotateAnimationProtocol.h */, - C44423361D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.h */, - C44423371D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.m */, + C4ACE2FD1CF5C53100313DD4 /* DemoVC7.h */, + C4ACE2FE1CF5C53100313DD4 /* DemoVC7.m */, ); - path = BARotateView; + path = DemoVC7; sourceTree = ""; }; C44423461D2E8596004ACAA8 /* DemoVC2-2 */ = { @@ -1248,25 +1474,13 @@ path = "DemoVC2-2"; sourceTree = ""; }; - C445E1BF1D1B86FE00D7654A /* Wonderful */ = { + C445642E1E791BC1007D5692 /* ViewModel */ = { isa = PBXGroup; children = ( - C445E1C01D1B86FE00D7654A /* SXColorGradientView.h */, - C445E1C11D1B86FE00D7654A /* SXColorGradientView.m */, - C445E1C21D1B86FE00D7654A /* SXColorLabel.h */, - C445E1C31D1B86FE00D7654A /* SXColorLabel.m */, - C445E1C41D1B86FE00D7654A /* SXHeadLine.h */, - C445E1C51D1B86FE00D7654A /* SXHeadLine.m */, - C445E1C61D1B86FE00D7654A /* SXMarquee.h */, - C445E1C71D1B86FE00D7654A /* SXMarquee.m */, - C445E1C81D1B86FE00D7654A /* UIColor+Separate.h */, - C445E1C91D1B86FE00D7654A /* UIColor+Separate.m */, - C445E1CA1D1B86FE00D7654A /* UIColor+Wonderful.h */, - C445E1CB1D1B86FE00D7654A /* UIColor+Wonderful.m */, - C445E1CC1D1B86FE00D7654A /* UILabel+Wonderful.h */, - C445E1CD1D1B86FE00D7654A /* UILabel+Wonderful.m */, + C445642F1E791BE3007D5692 /* BALoginViewModel.h */, + C44564301E791BE3007D5692 /* BALoginViewModel.m */, ); - path = Wonderful; + path = ViewModel; sourceTree = ""; }; C445E1F21D1BF0E100D7654A /* DemoVC13 */ = { @@ -1283,6 +1497,7 @@ children = ( C4562C691CDD9F05000F5710 /* DemoVC4.h */, C4562C6A1CDD9F05000F5710 /* DemoVC4.m */, + C411755B1DF7E55700802612 /* BAUmengFile.txt */, ); path = DemoVC4; sourceTree = ""; @@ -1294,13 +1509,6 @@ path = ViewModel; sourceTree = ""; }; - C4562C6D1CDDA184000F5710 /* ViewModel */ = { - isa = PBXGroup; - children = ( - ); - path = ViewModel; - sourceTree = ""; - }; C4562C6E1CDDA18A000F5710 /* ViewModel */ = { isa = PBXGroup; children = ( @@ -1321,6 +1529,15 @@ path = DemoVC5; sourceTree = ""; }; + C457EA401DADD65600CD0B91 /* DemoVC2-6 */ = { + isa = PBXGroup; + children = ( + C457EA441DADD6E600CD0B91 /* DemoVC2_06.h */, + C457EA451DADD6E600CD0B91 /* DemoVC2_06.m */, + ); + path = "DemoVC2-6"; + sourceTree = ""; + }; C46B8A011CE0BAC200005E2B /* RegexKitLite */ = { isa = PBXGroup; children = ( @@ -1351,6 +1568,22 @@ path = DemoVC9; sourceTree = ""; }; + C474FE701DACB94A007755D3 /* DemoVC2-5 */ = { + isa = PBXGroup; + children = ( + C474FE741DACB996007755D3 /* DemoVC2_05.h */, + C474FE751DACB996007755D3 /* DemoVC2_05.m */, + C474FE761DACB996007755D3 /* DemoVC2_05.xib */, + C4C744821DC7306800E747D8 /* DemoVC2_05_test.h */, + C4C744831DC7306800E747D8 /* DemoVC2_05_test.m */, + C44C00CC1DCB268C00BAAAEC /* DemoVC2_05_test2.h */, + C44C00CD1DCB268C00BAAAEC /* DemoVC2_05_test2.m */, + C4AC635B1EEF70AD00DEEDC7 /* DemoVC2_05_test3.h */, + C4AC635C1EEF70AD00DEEDC7 /* DemoVC2_05_test3.m */, + ); + path = "DemoVC2-5"; + sourceTree = ""; + }; C48026BE1D191EC90087BBB9 /* DemoVC11 */ = { isa = PBXGroup; children = ( @@ -1371,157 +1604,95 @@ children = ( C48026CC1D191F720087BBB9 /* DemoVC12.h */, C48026CD1D191F720087BBB9 /* DemoVC12.m */, - C48026CF1D1920110087BBB9 /* DemoVC12View.h */, - C48026D01D1920110087BBB9 /* DemoVC12View.m */, + C48E37501EE29B9E0047A7C8 /* CustomView.h */, + C48E37511EE29B9E0047A7C8 /* CustomView.m */, + C48E37521EE29B9E0047A7C8 /* ViewController2.h */, + C48E37531EE29B9E0047A7C8 /* ViewController2.m */, + C48E37541EE29B9E0047A7C8 /* 123.png */, + C48E37551EE29B9E0047A7C8 /* 背景.jpg */, + C48E37561EE29B9E0047A7C8 /* 美女.jpg */, ); path = DemoVC12; sourceTree = ""; }; - C48026D21D1928290087BBB9 /* BAKit(工具类) */ = { + C484C0B81DED4CFD004D54C0 /* Model */ = { isa = PBXGroup; children = ( - C48026E61D1928290087BBB9 /* BAKit.h */, - C44423241D2E5D66004ACAA8 /* BAKitManager.h */, - C44423251D2E5D66004ACAA8 /* BAKitManager.m */, - C44423271D2E5DE1004ACAA8 /* BAKitManager */, - C48026D31D1928290087BBB9 /* BACustom */, - C48026E71D1928290087BBB9 /* Foundation */, - C48026FE1D1928290087BBB9 /* UIKit */, - C480271F1D1928290087BBB9 /* 动画 */, - C42781241D2D39B1003E6694 /* GCD */, ); - path = "BAKit(工具类)"; + path = Model; sourceTree = ""; }; - C48026D31D1928290087BBB9 /* BACustom */ = { - isa = PBXGroup; - children = ( - C4F74A891D37C1BD0014C396 /* BALocalNotification */, - C4F74A8C1D37C1BD0014C396 /* BANavigationItem */, - C4F74A911D37C1BD0014C396 /* BASegmentControl */, - C4F74A941D37C1BD0014C396 /* BASharManager */, - C4F74A851D37BDB60014C396 /* 清理缓存 */, - C4B9644E1D33A5FB005926B8 /* 自定义下拉刷新动画 */, - C444232B1D2E738A004ACAA8 /* BAAlert */, - C48026D41D1928290087BBB9 /* BAAPP.h */, - C48026D51D1928290087BBB9 /* BAAPP.m */, - C48026D61D1928290087BBB9 /* BAAutoSizeWithWH.h */, - C48026D71D1928290087BBB9 /* BAAutoSizeWithWH.m */, - C48026D81D1928290087BBB9 /* BALog.h */, - C48026D91D1928290087BBB9 /* BALog.m */, - C48026DC1D1928290087BBB9 /* BAPassword.h */, - C48026DD1D1928290087BBB9 /* BAPassword.m */, - C48026DE1D1928290087BBB9 /* BARegularExpression.h */, - C48026DF1D1928290087BBB9 /* BARegularExpression.m */, - C48026E21D1928290087BBB9 /* BASystemSound.h */, - C48026E31D1928290087BBB9 /* BASystemSound.m */, - C48026E41D1928290087BBB9 /* BATouchID.h */, - C48026E51D1928290087BBB9 /* BATouchID.m */, + C484C0B91DED4CFD004D54C0 /* View */ = { + isa = PBXGroup; + children = ( + C484C0BF1DED4D25004D54C0 /* BAProfileHeadCell.h */, + C484C0C01DED4D25004D54C0 /* BAProfileHeadCell.m */, + C484C0C11DED4D25004D54C0 /* BAProfileHeadCell.xib */, ); - path = BACustom; + path = View; sourceTree = ""; }; - C48026E71D1928290087BBB9 /* Foundation */ = { - isa = PBXGroup; - children = ( - C4EE1C621D228E34005046A6 /* NSString */, - C48026E81D1928290087BBB9 /* NSArray+BAKit.h */, - C48026E91D1928290087BBB9 /* NSArray+BAKit.m */, - C48026EA1D1928290087BBB9 /* NSData+BAKit.h */, - C48026EB1D1928290087BBB9 /* NSData+BAKit.m */, - C48026EC1D1928290087BBB9 /* NSDate+BAKit.h */, - C48026ED1D1928290087BBB9 /* NSDate+BAKit.m */, - C48556341D3CC74600002FA2 /* NSDateFormatter+BAKit.h */, - C48556351D3CC74600002FA2 /* NSDateFormatter+BAKit.m */, - C48026EE1D1928290087BBB9 /* NSDictionary+BAKit.h */, - C48026EF1D1928290087BBB9 /* NSDictionary+BAKit.m */, - C48026F01D1928290087BBB9 /* NSFileManager+BAKit.h */, - C48026F11D1928290087BBB9 /* NSFileManager+BAKit.m */, - C48026F21D1928290087BBB9 /* NSMutableArray+BAKit.h */, - C48026F31D1928290087BBB9 /* NSMutableArray+BAKit.m */, - C48026F41D1928290087BBB9 /* NSMutableDictionary+BAKit.h */, - C48026F51D1928290087BBB9 /* NSMutableDictionary+BAKit.m */, - C48026F61D1928290087BBB9 /* NSNumber+BAKit.h */, - C48026F71D1928290087BBB9 /* NSNumber+BAKit.m */, - C48026F81D1928290087BBB9 /* NSProcessInfo+BAKit.h */, - C48026F91D1928290087BBB9 /* NSProcessInfo+BAKit.m */, - C48026FC1D1928290087BBB9 /* NSThread+BAKit.h */, - C48026FD1D1928290087BBB9 /* NSThread+BAKit.m */, + C48E375C1EE2A43B0047A7C8 /* Wonderful */ = { + isa = PBXGroup; + children = ( + C48E375D1EE2A43B0047A7C8 /* SXColorGradientView.h */, + C48E375E1EE2A43B0047A7C8 /* SXColorGradientView.m */, + C48E375F1EE2A43B0047A7C8 /* SXColorLabel.h */, + C48E37601EE2A43B0047A7C8 /* SXColorLabel.m */, + C48E37611EE2A43B0047A7C8 /* SXHeadLine.h */, + C48E37621EE2A43B0047A7C8 /* SXHeadLine.m */, + C48E37631EE2A43B0047A7C8 /* SXMarquee.h */, + C48E37641EE2A43B0047A7C8 /* SXMarquee.m */, + C48E37651EE2A43B0047A7C8 /* UIColor+Separate.h */, + C48E37661EE2A43B0047A7C8 /* UIColor+Separate.m */, + C48E37671EE2A43B0047A7C8 /* UIColor+Wonderful.h */, + C48E37681EE2A43B0047A7C8 /* UIColor+Wonderful.m */, + C48E37691EE2A43B0047A7C8 /* UILabel+Wonderful.h */, + C48E376A1EE2A43B0047A7C8 /* UILabel+Wonderful.m */, ); - path = Foundation; + path = Wonderful; sourceTree = ""; }; - C48026FE1D1928290087BBB9 /* UIKit */ = { - isa = PBXGroup; - children = ( - C48026FF1D1928290087BBB9 /* BACustomModalTransition.h */, - C48027001D1928290087BBB9 /* BACustomModalTransition.m */, - C48027011D1928290087BBB9 /* BAPickerView.h */, - C48027021D1928290087BBB9 /* BAPickerView.m */, - C48027031D1928290087BBB9 /* BATextView.h */, - C48027041D1928290087BBB9 /* BATextView.m */, - C48027051D1928290087BBB9 /* UIButton+BAKit.h */, - C48027061D1928290087BBB9 /* UIButton+BAKit.m */, - C485562D1D3CB02000002FA2 /* UINavigationController+BAKit.h */, - C485562B1D3CB01700002FA2 /* UINavigationController+BAKit.m */, - C485562E1D3CB2DD00002FA2 /* UINavigationBar+BAKit.h */, - C485562F1D3CB2DD00002FA2 /* UINavigationBar+BAKit.m */, - C48556311D3CC39900002FA2 /* UIBarButtonItem+BAKit.h */, - C48556321D3CC39900002FA2 /* UIBarButtonItem+BAKit.m */, - C48027071D1928290087BBB9 /* UIColor+BAKit.h */, - C48027081D1928290087BBB9 /* UIColor+BAKit.m */, - C48027091D1928290087BBB9 /* UIDevice+BAKit.h */, - C480270A1D1928290087BBB9 /* UIDevice+BAKit.m */, - C480270B1D1928290087BBB9 /* UIFont+BAKit.h */, - C480270C1D1928290087BBB9 /* UIFont+BAKit.m */, - C480270D1D1928290087BBB9 /* UIImage+BAKit.h */, - C480270E1D1928290087BBB9 /* UIImage+BAKit.m */, - C480270F1D1928290087BBB9 /* UIImageView+BAKit.h */, - C48027101D1928290087BBB9 /* UIImageView+BAKit.m */, - C48027111D1928290087BBB9 /* UILabel+BAKit.h */, - C48027121D1928290087BBB9 /* UILabel+BAKit.m */, - C48027131D1928290087BBB9 /* UIScrollView+BAKit.h */, - C48027141D1928290087BBB9 /* UIScrollView+BAKit.m */, - C48027151D1928290087BBB9 /* UITableView+BAKit.h */, - C48027161D1928290087BBB9 /* UITableView+BAKit.m */, - C48027171D1928290087BBB9 /* UITextField+BAKit.h */, - C48027181D1928290087BBB9 /* UITextField+BAKit.m */, - C48027191D1928290087BBB9 /* UIView+BAKit.h */, - C480271A1D1928290087BBB9 /* UIView+BAKit.m */, - C480271B1D1928290087BBB9 /* UIWebView+BAKit.h */, - C480271C1D1928290087BBB9 /* UIWebView+BAKit.m */, - C480271D1D1928290087BBB9 /* UIWindow+BAKit.h */, - C480271E1D1928290087BBB9 /* UIWindow+BAKit.m */, + C48E37751EE2ABA70047A7C8 /* BAKit_Define */ = { + isa = PBXGroup; + children = ( + C4AC635E1EEF717C00DEEDC7 /* BAKit_DefineAppKey.h */, + C4AC635F1EEF717C00DEEDC7 /* BAKit_DefineCommon.h */, + C4AC63601EEF717C00DEEDC7 /* BAKit_Const.h */, + C4AC63611EEF717C00DEEDC7 /* BAKit_Const.m */, + C4AC63621EEF717C00DEEDC7 /* BAKit_Const_Color.h */, + C4AC63631EEF717C00DEEDC7 /* BAKit_Const_Color.m */, + C4AC63641EEF717C00DEEDC7 /* BAKit_Define.h */, + C4AC63651EEF717C00DEEDC7 /* BAKit_DefineFont.h */, + C4AC63661EEF717C00DEEDC7 /* BAKit_DefineFrame.h */, + C4AC63671EEF717C00DEEDC7 /* BAKit_DefineNoti.h */, + C4AC63681EEF717C00DEEDC7 /* BAKit_Singleton.h */, + C4AC63691EEF717C00DEEDC7 /* BAKit_DefineCurrent.h */, + C4AC636A1EEF717C00DEEDC7 /* BAKit_DefineFormat.h */, ); - path = UIKit; + path = BAKit_Define; sourceTree = ""; }; - C480271F1D1928290087BBB9 /* 动画 */ = { + C4A737E61DEC120E00C93B40 /* BASqlite(数据库) */ = { isa = PBXGroup; children = ( - C44423351D2E7E37004ACAA8 /* BARotateView */, - C48027201D1928290087BBB9 /* 雪花加载动画 */, + C4A737E71DEC124400C93B40 /* BAUserSqlite.h */, + C4A737E81DEC124400C93B40 /* BAUserSqlite.m */, ); - path = "动画"; + path = "BASqlite(数据库)"; sourceTree = ""; }; - C48027201D1928290087BBB9 /* 雪花加载动画 */ = { + C4AC63A11EEF800800DEEDC7 /* NSUserDefaults */ = { isa = PBXGroup; children = ( - C48027211D1928290087BBB9 /* BAFadeBlackView.h */, - C48027221D1928290087BBB9 /* BAFadeBlackView.m */, - C48027231D1928290087BBB9 /* BASnowView.h */, - C48027241D1928290087BBB9 /* BASnowView.m */, - C48027251D1928290087BBB9 /* BAUpdatingView.h */, - C48027261D1928290087BBB9 /* BAUpdatingView.m */, - C48027271D1928290087BBB9 /* CALayer+BAMaskLayer.h */, - C48027281D1928290087BBB9 /* CALayer+BAMaskLayer.m */, - C48027291D1928290087BBB9 /* EmitterLayerView.h */, - C480272A1D1928290087BBB9 /* EmitterLayerView.m */, - C480272B1D1928290087BBB9 /* UIView+BAGlowView.h */, - C480272C1D1928290087BBB9 /* UIView+BAGlowView.m */, + C4AC63A21EEF800800DEEDC7 /* BAKit_UserDefaults.h */, + C4AC63A31EEF800800DEEDC7 /* BAKit_UserDefaults.m */, + C4AC63A41EEF800800DEEDC7 /* NSFileManager+BAKit.h */, + C4AC63A51EEF800800DEEDC7 /* NSFileManager+BAKit.m */, + C4AC63A61EEF800800DEEDC7 /* NSString+BAFileManager.h */, + C4AC63A71EEF800800DEEDC7 /* NSString+BAFileManager.m */, ); - path = "雪花加载动画"; + path = NSUserDefaults; sourceTree = ""; }; C4ACE3001CF5C8FA00313DD4 /* DemoVC8 */ = { @@ -1533,6 +1704,18 @@ path = DemoVC8; sourceTree = ""; }; + C4B3CAFC1DFFA5AA00B5A7B3 /* DemoVC2-8 */ = { + isa = PBXGroup; + children = ( + C4B3CB001DFFA67000B5A7B3 /* DemoVC2_08.h */, + C4B3CB011DFFA67000B5A7B3 /* DemoVC2_08.m */, + C4B3CB021DFFA67000B5A7B3 /* DemoVC2_08.xib */, + C4B3CB051DFFA6F700B5A7B3 /* DemoVC2_08.html */, + C4B3CB071DFFF9F700B5A7B3 /* jquery-1.7.2.min.js */, + ); + path = "DemoVC2-8"; + sourceTree = ""; + }; C4B963121D33A5AF005926B8 /* DianPing */ = { isa = PBXGroup; children = ( @@ -2170,17 +2353,489 @@ path = dropdown_loading_03.imageset; sourceTree = ""; }; - C4B9644E1D33A5FB005926B8 /* 自定义下拉刷新动画 */ = { + C4C742601DC7295A00E747D8 /* BATools(工具类) */ = { + isa = PBXGroup; + children = ( + C4A737E61DEC120E00C93B40 /* BASqlite(数据库) */, + C4C7437F1DC72DB300E747D8 /* BAKit(工具类) */, + C4C742611DC7295A00E747D8 /* BACategory(分类) */, + C4C7431B1DC7295A00E747D8 /* BAMacros(宏) */, + C4C743201DC7295A00E747D8 /* BANetManager(网络类) */, + ); + path = "BATools(工具类)"; + sourceTree = ""; + }; + C4C742611DC7295A00E747D8 /* BACategory(分类) */ = { isa = PBXGroup; children = ( - C4B9644F1D33A630005926B8 /* BACustomMJFooter.h */, - C4B964501D33A630005926B8 /* BACustomMJFooter.m */, - C4B964521D33B5E8005926B8 /* BACustomMJHeader.h */, - C4B964531D33B5E8005926B8 /* BACustomMJHeader.m */, + C4C742621DC7295A00E747D8 /* AppDelegate+BABaiduMap.h */, + C4C742631DC7295A00E747D8 /* AppDelegate+BABaiduMap.m */, + C4C742641DC7295A00E747D8 /* AppDelegate+BACategory.h */, + C4C742651DC7295A00E747D8 /* AppDelegate+BACategory.m */, + C43222D21DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.h */, + C43222D31DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.m */, + C4C742661DC7295A00E747D8 /* NSObject+BAMJParse.h */, + C4C742671DC7295A00E747D8 /* NSObject+BAMJParse.m */, + C4C742681DC7295A00E747D8 /* NSObject+BANetwork.h */, + C4C742691DC7295A00E747D8 /* NSObject+BANetwork.m */, + C4C7426A1DC7295A00E747D8 /* NSObject+BAProgressHUD.h */, + C4C7426B1DC7295A00E747D8 /* NSObject+BAProgressHUD.m */, + C4C7426C1DC7295A00E747D8 /* UIBarButtonItem+Item.h */, + C4C7426D1DC7295A00E747D8 /* UIBarButtonItem+Item.m */, + C4C7426E1DC7295A00E747D8 /* UIViewController+BAAlertView.h */, + C4C7426F1DC7295A00E747D8 /* UIViewController+BAAlertView.m */, + ); + path = "BACategory(分类)"; + sourceTree = ""; + }; + C4C7431B1DC7295A00E747D8 /* BAMacros(宏) */ = { + isa = PBXGroup; + children = ( + C4C7431C1DC7295A00E747D8 /* BABaseProject.pch */, + C4C7431E1DC7295A00E747D8 /* BADefin.h */, + C4C7431F1DC7295A00E747D8 /* BAFrameHeader.h */, + ); + path = "BAMacros(宏)"; + sourceTree = ""; + }; + C4C743201DC7295A00E747D8 /* BANetManager(网络类) */ = { + isa = PBXGroup; + children = ( + C4C743211DC7295A00E747D8 /* BABaseNetManager.h */, + C4C743221DC7295A00E747D8 /* BABaseNetManager.m */, + C4D26F451E03D41A0040AC3E /* BAPage.h */, + C4D26F461E03D41A0040AC3E /* BAPage.m */, + C4C743251DC7295A00E747D8 /* BANewsNetManager.h */, + C4C743261DC7295A00E747D8 /* BANewsNetManager.m */, + C4C743271DC7295A00E747D8 /* BAURLsPath.h */, + ); + path = "BANetManager(网络类)"; + sourceTree = ""; + }; + C4C7437F1DC72DB300E747D8 /* BAKit(工具类) */ = { + isa = PBXGroup; + children = ( + C4C743B01DC72DB300E747D8 /* BAKit.h */, + C48E37751EE2ABA70047A7C8 /* BAKit_Define */, + C4C743801DC72DB300E747D8 /* BACustom */, + C4C743B11DC72DB300E747D8 /* BAKitManager */, + C4C743B61DC72DB300E747D8 /* Foundation */, + C4C743DA1DC72DB300E747D8 /* GCD */, + C4C743E41DC72DB300E747D8 /* UIApplication */, + C4C743F31DC72DB300E747D8 /* UIKit */, + C4C744201DC72DB300E747D8 /* 动画 */, + ); + path = "BAKit(工具类)"; + sourceTree = ""; + }; + C4C743801DC72DB300E747D8 /* BACustom */ = { + isa = PBXGroup; + children = ( + C4309BB21DCAD5C40016ABE6 /* BAHook */, + C4309BAE1DCAD4D50016ABE6 /* BALoadingHubView */, + C4C743861DC72DB300E747D8 /* BAAutoSizeWithWH */, + C4C743891DC72DB300E747D8 /* BACommon */, + C4C7438C1DC72DB300E747D8 /* BAJumpManager */, + C4C7438F1DC72DB300E747D8 /* BALocalNotification */, + C4C743921DC72DB300E747D8 /* BANavigationItem */, + C4C743971DC72DB300E747D8 /* BARegularExpression */, + C4C7439A1DC72DB300E747D8 /* BASegmentControl */, + C4C7439D1DC72DB300E747D8 /* BASharManager */, + C4C743A51DC72DB300E747D8 /* BASystermSetting */, + C4C743A81DC72DB300E747D8 /* 清理缓存 */, + C4C743AB1DC72DB300E747D8 /* 自定义下拉刷新动画 */, + ); + path = BACustom; + sourceTree = ""; + }; + C4C743861DC72DB300E747D8 /* BAAutoSizeWithWH */ = { + isa = PBXGroup; + children = ( + C4C743871DC72DB300E747D8 /* BAAutoSizeWithWH.h */, + C4C743881DC72DB300E747D8 /* BAAutoSizeWithWH.m */, + ); + path = BAAutoSizeWithWH; + sourceTree = ""; + }; + C4C743891DC72DB300E747D8 /* BACommon */ = { + isa = PBXGroup; + children = ( + C4C7438A1DC72DB300E747D8 /* BACommon.h */, + C4C7438B1DC72DB300E747D8 /* BACommon.m */, + ); + path = BACommon; + sourceTree = ""; + }; + C4C7438C1DC72DB300E747D8 /* BAJumpManager */ = { + isa = PBXGroup; + children = ( + C4C7438D1DC72DB300E747D8 /* BAJumpManager.h */, + C4C7438E1DC72DB300E747D8 /* BAJumpManager.m */, + ); + path = BAJumpManager; + sourceTree = ""; + }; + C4C7438F1DC72DB300E747D8 /* BALocalNotification */ = { + isa = PBXGroup; + children = ( + C4C743901DC72DB300E747D8 /* BALocalNotification.h */, + C4C743911DC72DB300E747D8 /* BALocalNotification.m */, + ); + path = BALocalNotification; + sourceTree = ""; + }; + C4C743921DC72DB300E747D8 /* BANavigationItem */ = { + isa = PBXGroup; + children = ( + C4C743931DC72DB300E747D8 /* BACustomBarItem.h */, + C4C743941DC72DB300E747D8 /* BACustomBarItem.m */, + C4C743951DC72DB300E747D8 /* UINavigationItem+CustomItem.h */, + C4C743961DC72DB300E747D8 /* UINavigationItem+CustomItem.m */, + ); + path = BANavigationItem; + sourceTree = ""; + }; + C4C743971DC72DB300E747D8 /* BARegularExpression */ = { + isa = PBXGroup; + children = ( + C48E37721EE2A5B50047A7C8 /* BAKit_RegularExpression.h */, + C48E37731EE2A5B50047A7C8 /* BAKit_RegularExpression.m */, + ); + path = BARegularExpression; + sourceTree = ""; + }; + C4C7439A1DC72DB300E747D8 /* BASegmentControl */ = { + isa = PBXGroup; + children = ( + 9C93D6B320BD2718002FB06B /* HMSegmentedControl.h */, + 9C93D6B220BD2718002FB06B /* HMSegmentedControl.m */, + ); + path = BASegmentControl; + sourceTree = ""; + }; + C4C7439D1DC72DB300E747D8 /* BASharManager */ = { + isa = PBXGroup; + children = ( + C4C743A01DC72DB300E747D8 /* BAShareManage.h */, + C4C743A11DC72DB300E747D8 /* BAShareManage.m */, + C4C743A41DC72DB300E747D8 /* BASharManager.bundle */, + ); + path = BASharManager; + sourceTree = ""; + }; + C4C743A51DC72DB300E747D8 /* BASystermSetting */ = { + isa = PBXGroup; + children = ( + C4C743A61DC72DB300E747D8 /* BASystermSetting.h */, + C4C743A71DC72DB300E747D8 /* BASystermSetting.m */, + ); + path = BASystermSetting; + sourceTree = ""; + }; + C4C743A81DC72DB300E747D8 /* 清理缓存 */ = { + isa = PBXGroup; + children = ( + C4AC63951EEF74F500DEEDC7 /* BAKit_ClearCacheManager.h */, + C4AC63961EEF74F500DEEDC7 /* BAKit_ClearCacheManager.m */, + ); + path = "清理缓存"; + sourceTree = ""; + }; + C4C743AB1DC72DB300E747D8 /* 自定义下拉刷新动画 */ = { + isa = PBXGroup; + children = ( + C4C743AC1DC72DB300E747D8 /* BACustomMJFooter.h */, + C4C743AD1DC72DB300E747D8 /* BACustomMJFooter.m */, + C4C743AE1DC72DB300E747D8 /* BACustomMJHeader.h */, + C4C743AF1DC72DB300E747D8 /* BACustomMJHeader.m */, ); path = "自定义下拉刷新动画"; sourceTree = ""; }; + C4C743B11DC72DB300E747D8 /* BAKitManager */ = { + isa = PBXGroup; + children = ( + C4C743B21DC72DB300E747D8 /* BAKitManager+BALabel.h */, + C4C743B31DC72DB300E747D8 /* BAKitManager+BALabel.m */, + C4C743B41DC72DB300E747D8 /* BAKitManager.h */, + C4C743B51DC72DB300E747D8 /* BAKitManager.m */, + ); + path = BAKitManager; + sourceTree = ""; + }; + C4C743B61DC72DB300E747D8 /* Foundation */ = { + isa = PBXGroup; + children = ( + C4AC63A11EEF800800DEEDC7 /* NSUserDefaults */, + C4C743CF1DC72DB300E747D8 /* NSString */, + C4C743B71DC72DB300E747D8 /* NSArray+BAKit.h */, + C4C743B81DC72DB300E747D8 /* NSArray+BAKit.m */, + C4C743B91DC72DB300E747D8 /* NSData+BAKit.h */, + C4C743BA1DC72DB300E747D8 /* NSData+BAKit.m */, + C4AC639B1EEF7BA500DEEDC7 /* NSDate+BAKit.h */, + C4AC639C1EEF7BA500DEEDC7 /* NSDate+BAKit.m */, + C4AC639D1EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.h */, + C4AC639E1EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.m */, + C4C743BF1DC72DB300E747D8 /* NSDictionary+BAKit.h */, + C4C743C01DC72DB300E747D8 /* NSDictionary+BAKit.m */, + C4C743C11DC72DB300E747D8 /* NSFileManager+BAKit.h */, + C4C743C21DC72DB300E747D8 /* NSFileManager+BAKit.m */, + C4C743C31DC72DB300E747D8 /* NSMutableArray+BAKit.h */, + C4C743C41DC72DB300E747D8 /* NSMutableArray+BAKit.m */, + C407E54E1DE533FD00FB1244 /* NSMutableArray+BASort.h */, + C407E54F1DE533FD00FB1244 /* NSMutableArray+BASort.m */, + C4C743C51DC72DB300E747D8 /* NSMutableDictionary+BAKit.h */, + C4C743C61DC72DB300E747D8 /* NSMutableDictionary+BAKit.m */, + C4C743C71DC72DB300E747D8 /* NSNumber+BAKit.h */, + C4C743C81DC72DB300E747D8 /* NSNumber+BAKit.m */, + C4C743C91DC72DB300E747D8 /* NSObject+BARunTime.h */, + C4C743CA1DC72DB300E747D8 /* NSObject+BARunTime.m */, + C4C743CB1DC72DB300E747D8 /* NSProcessInfo+BAKit.h */, + C4C743CC1DC72DB300E747D8 /* NSProcessInfo+BAKit.m */, + C4C743CD1DC72DB300E747D8 /* NSShadow+BAKit.h */, + C4C743CE1DC72DB300E747D8 /* NSShadow+BAKit.m */, + C4C743D81DC72DB300E747D8 /* NSThread+BAKit.h */, + C4C743D91DC72DB300E747D8 /* NSThread+BAKit.m */, + ); + path = Foundation; + sourceTree = ""; + }; + C4C743CF1DC72DB300E747D8 /* NSString */ = { + isa = PBXGroup; + children = ( + C4AC636D1EEF71AB00DEEDC7 /* BAKit_NSString.h */, + C4AC636E1EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.h */, + C4AC636F1EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.m */, + C4AC63701EEF71AB00DEEDC7 /* NSString+BAColor.h */, + C4AC63711EEF71AB00DEEDC7 /* NSString+BAColor.m */, + C4AC63721EEF71AB00DEEDC7 /* NSString+BAKit.h */, + C4AC63731EEF71AB00DEEDC7 /* NSString+BAKit.m */, + C4AC63741EEF71AB00DEEDC7 /* NSString+BANSNumber.h */, + C4AC63751EEF71AB00DEEDC7 /* NSString+BANSNumber.m */, + C4AC63761EEF71AB00DEEDC7 /* NSString+BARange.h */, + C4AC63771EEF71AB00DEEDC7 /* NSString+BARange.m */, + C4AC63781EEF71AB00DEEDC7 /* NSString+BARegular.h */, + C4AC63791EEF71AB00DEEDC7 /* NSString+BARegular.m */, + C4AC637A1EEF71AB00DEEDC7 /* NSString+BASize.h */, + C4AC637B1EEF71AB00DEEDC7 /* NSString+BASize.m */, + C4AC637C1EEF71AB00DEEDC7 /* NSString+BATime.h */, + C4AC637D1EEF71AB00DEEDC7 /* NSString+BATime.m */, + C4AC637E1EEF71AB00DEEDC7 /* NSString+BATransform.h */, + C4AC637F1EEF71AB00DEEDC7 /* NSString+BATransform.m */, + C4AC63801EEF71AB00DEEDC7 /* NSString+BATrims.h */, + C4AC63811EEF71AB00DEEDC7 /* NSString+BATrims.m */, + C4AC63821EEF71AB00DEEDC7 /* NSString+BAUIButton.h */, + C4AC63831EEF71AB00DEEDC7 /* NSString+BAUIButton.m */, + C4AC63841EEF71AB00DEEDC7 /* NSString+BAEncrypt.h */, + C4AC63851EEF71AB00DEEDC7 /* NSString+BAEncrypt.m */, + C4AC63861EEF71AB00DEEDC7 /* NSString+BAEmoji.h */, + C4AC63871EEF71AB00DEEDC7 /* NSString+BAEmoji.m */, + ); + path = NSString; + sourceTree = ""; + }; + C4C743DA1DC72DB300E747D8 /* GCD */ = { + isa = PBXGroup; + children = ( + C4C743DB1DC72DB300E747D8 /* GCD.h */, + C4C743DC1DC72DB300E747D8 /* GCDGroup.h */, + C4C743DD1DC72DB300E747D8 /* GCDGroup.m */, + C4C743DE1DC72DB300E747D8 /* GCDQueue.h */, + C4C743DF1DC72DB300E747D8 /* GCDQueue.m */, + C4C743E01DC72DB300E747D8 /* GCDSemaphore.h */, + C4C743E11DC72DB300E747D8 /* GCDSemaphore.m */, + C4C743E21DC72DB300E747D8 /* GCDTimer.h */, + C4C743E31DC72DB300E747D8 /* GCDTimer.m */, + ); + path = GCD; + sourceTree = ""; + }; + C4C743E41DC72DB300E747D8 /* UIApplication */ = { + isa = PBXGroup; + children = ( + C4C743E51DC72DB300E747D8 /* BAAPP.h */, + C4C743E61DC72DB300E747D8 /* BAAPP.m */, + C4C743E71DC72DB300E747D8 /* BALog.h */, + C4C743E81DC72DB300E747D8 /* BALog.m */, + C4C743E91DC72DB300E747D8 /* BAPassword.h */, + C4C743EA1DC72DB300E747D8 /* BAPassword.m */, + C4C743EB1DC72DB300E747D8 /* BASystemService.h */, + C4C743EC1DC72DB300E747D8 /* BASystemService.m */, + C4C743ED1DC72DB300E747D8 /* BASystemSound.h */, + C4C743EE1DC72DB300E747D8 /* BASystemSound.m */, + C4C743EF1DC72DB300E747D8 /* BATouchID.h */, + C4C743F01DC72DB300E747D8 /* BATouchID.m */, + C4C743F11DC72DB300E747D8 /* UIApplication+AppInfo.h */, + C4C743F21DC72DB300E747D8 /* UIApplication+AppInfo.m */, + ); + path = UIApplication; + sourceTree = ""; + }; + C4C743F31DC72DB300E747D8 /* UIKit */ = { + isa = PBXGroup; + children = ( + C4AC63981EEF783B00DEEDC7 /* UIAlertController+BAKit.h */, + C4AC63991EEF783B00DEEDC7 /* UIAlertController+BAKit.m */, + C4309BC01DCAD5CE0016ABE6 /* UIViewController */, + C4C743F41DC72DB300E747D8 /* BACustomModalTransition.h */, + C4C743F51DC72DB300E747D8 /* BACustomModalTransition.m */, + C4E015491E0A35F200CCC322 /* BATextField.h */, + C4E0154A1E0A35F200CCC322 /* BATextField.m */, + C4C743FA1DC72DB300E747D8 /* BATextView.h */, + C4C743FB1DC72DB300E747D8 /* BATextView.m */, + C4C6E02B1DD05B170031395C /* UILabel+BAAttributeTextTapAction.h */, + C4C6E02C1DD05B170031395C /* UILabel+BAAttributeTextTapAction.m */, + C4C743FC1DC72DB300E747D8 /* UIBarButtonItem+BAKit.h */, + C4C743FD1DC72DB300E747D8 /* UIBarButtonItem+BAKit.m */, + C4C744001DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.h */, + C4C744011DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.m */, + C4C744021DC72DB300E747D8 /* UIColor+BAKit.h */, + C4C744031DC72DB300E747D8 /* UIColor+BAKit.m */, + C4C744041DC72DB300E747D8 /* UIDevice+BAKit.h */, + C4C744051DC72DB300E747D8 /* UIDevice+BAKit.m */, + C4C744061DC72DB300E747D8 /* UIFont+BAKit.h */, + C4C744071DC72DB300E747D8 /* UIFont+BAKit.m */, + C4C744081DC72DB300E747D8 /* UIImage+BAKit.h */, + C4C744091DC72DB300E747D8 /* UIImage+BAKit.m */, + C4C7440A1DC72DB300E747D8 /* UIImageView+BAKit.h */, + C4C7440B1DC72DB300E747D8 /* UIImageView+BAKit.m */, + C4C7440C1DC72DB300E747D8 /* UILabel+BAKit.h */, + C4C7440D1DC72DB300E747D8 /* UILabel+BAKit.m */, + C4C7440E1DC72DB300E747D8 /* UINavigationBar+BAKit.h */, + C4C7440F1DC72DB300E747D8 /* UINavigationBar+BAKit.m */, + C4C744101DC72DB300E747D8 /* UINavigationController+BAKit.h */, + C4C744111DC72DB300E747D8 /* UINavigationController+BAKit.m */, + C4C744121DC72DB300E747D8 /* UIScrollView+BAKit.h */, + C4C744131DC72DB300E747D8 /* UIScrollView+BAKit.m */, + C4C744141DC72DB300E747D8 /* UITableView+BAKit.h */, + C4C744151DC72DB300E747D8 /* UITableView+BAKit.m */, + C4C744161DC72DB300E747D8 /* UITableViewCell+Reuse.h */, + C4C744171DC72DB300E747D8 /* UITableViewCell+Reuse.m */, + C4C744181DC72DB300E747D8 /* UITextField+BAKit.h */, + C4C744191DC72DB300E747D8 /* UITextField+BAKit.m */, + C4C7441A1DC72DB300E747D8 /* UIView+BAKit.h */, + C4C7441B1DC72DB300E747D8 /* UIView+BAKit.m */, + C4C7441C1DC72DB300E747D8 /* UIWebView+BAKit.h */, + C4C7441D1DC72DB300E747D8 /* UIWebView+BAKit.m */, + C4C7441E1DC72DB300E747D8 /* UIWindow+BAKit.h */, + C4C7441F1DC72DB300E747D8 /* UIWindow+BAKit.m */, + ); + path = UIKit; + sourceTree = ""; + }; + C4C744201DC72DB300E747D8 /* 动画 */ = { + isa = PBXGroup; + children = ( + C4C744211DC72DB300E747D8 /* BARotateView */, + C4C744271DC72DB300E747D8 /* 雪花加载动画 */, + ); + path = "动画"; + sourceTree = ""; + }; + C4C744211DC72DB300E747D8 /* BARotateView */ = { + isa = PBXGroup; + children = ( + C4C744221DC72DB300E747D8 /* BARotateAnimationProtocol.h */, + C4C744231DC72DB300E747D8 /* BARotateView.h */, + C4C744241DC72DB300E747D8 /* BARotateView.m */, + C4C744251DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.h */, + C4C744261DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.m */, + ); + path = BARotateView; + sourceTree = ""; + }; + C4C744271DC72DB300E747D8 /* 雪花加载动画 */ = { + isa = PBXGroup; + children = ( + C4C744281DC72DB300E747D8 /* BAFadeBlackView.h */, + C4C744291DC72DB300E747D8 /* BAFadeBlackView.m */, + C4C7442A1DC72DB300E747D8 /* BASnowView.h */, + C4C7442B1DC72DB300E747D8 /* BASnowView.m */, + C4C7442C1DC72DB300E747D8 /* BAUpdatingView.h */, + C4C7442D1DC72DB300E747D8 /* BAUpdatingView.m */, + C4C7442E1DC72DB300E747D8 /* CALayer+BAMaskLayer.h */, + C4C7442F1DC72DB300E747D8 /* CALayer+BAMaskLayer.m */, + C4C744301DC72DB300E747D8 /* EmitterLayerView.h */, + C4C744311DC72DB300E747D8 /* EmitterLayerView.m */, + C4C744321DC72DB300E747D8 /* UIView+BAGlowView.h */, + C4C744331DC72DB300E747D8 /* UIView+BAGlowView.m */, + ); + path = "雪花加载动画"; + sourceTree = ""; + }; + C4D109291D9270BA0057B2DC /* DemoVC2-4 */ = { + isa = PBXGroup; + children = ( + C4EBE1EE1D95015D00020C1F /* 百度地图Image */, + C4D1092A1D9271400057B2DC /* DemoVC2_04.h */, + C4D1092B1D9271400057B2DC /* DemoVC2_04.m */, + C4EBE1E81D94C4FC00020C1F /* MyAnimatedAnnotationView.h */, + C4EBE1E91D94C4FC00020C1F /* MyAnimatedAnnotationView.m */, + ); + path = "DemoVC2-4"; + sourceTree = ""; + }; + C4D26F4F1E03F4140040AC3E /* DemoVC2-9 */ = { + isa = PBXGroup; + children = ( + C4D26F501E03F4420040AC3E /* DemoVC2_09.h */, + C4D26F511E03F4420040AC3E /* DemoVC2_09.m */, + C4D26F531E03F44D0040AC3E /* DemoVC2_09.xib */, + ); + path = "DemoVC2-9"; + sourceTree = ""; + }; + C4DD40481DE817A90084CBCA /* Login(登陆) */ = { + isa = PBXGroup; + children = ( + C445642E1E791BC1007D5692 /* ViewModel */, + C4DD405F1DE81A290084CBCA /* Model */, + C4DD40601DE81A290084CBCA /* View */, + C4DD40611DE81A290084CBCA /* ViewController */, + ); + path = "Login(登陆)"; + sourceTree = ""; + }; + C4DD40531DE819050084CBCA /* FMDB封装 */ = { + isa = PBXGroup; + children = ( + C4DD40541DE819050084CBCA /* JKDBHelper.h */, + C4DD40551DE819050084CBCA /* JKDBHelper.m */, + C4DD40561DE819050084CBCA /* JKDBModel.h */, + C4DD40571DE819050084CBCA /* JKDBModel.m */, + ); + path = "FMDB封装"; + sourceTree = ""; + }; + C4DD405F1DE81A290084CBCA /* Model */ = { + isa = PBXGroup; + children = ( + C4DD406C1DE81A330084CBCA /* BAUserModel.h */, + C4DD406D1DE81A330084CBCA /* BAUserModel.m */, + ); + path = Model; + sourceTree = ""; + }; + C4DD40601DE81A290084CBCA /* View */ = { + isa = PBXGroup; + children = ( + ); + path = View; + sourceTree = ""; + }; + C4DD40611DE81A290084CBCA /* ViewController */ = { + isa = PBXGroup; + children = ( + C4DD40621DE81A290084CBCA /* BALoginViewController.h */, + C4DD40631DE81A290084CBCA /* BALoginViewController.m */, + C4DD40641DE81A290084CBCA /* BALoginViewController.xib */, + C4DD40651DE81A290084CBCA /* BARegistViewController.h */, + C4DD40661DE81A290084CBCA /* BARegistViewController.m */, + C4DD40671DE81A290084CBCA /* BARegistViewController.xib */, + ); + path = ViewController; + sourceTree = ""; + }; C4DEB37E1D0C348E001F1585 /* Publish(发布) */ = { isa = PBXGroup; children = ( @@ -2309,8 +2964,8 @@ C4EB5AEC1CD8B24F003A7094 /* BACode */, C4F59F811D5467C100AA822A /* BANewFeatures(新特性) */, C4EB5AD71CD8B24F003A7094 /* BABaseData(基类) */, + C4C742601DC7295A00E747D8 /* BATools(工具类) */, C4EB5B0B1CD8B24F003A7094 /* BALib(三方库) */, - C4EB5B241CD8B24F003A7094 /* BATools(工具类) */, C4EB5B441CD8B24F003A7094 /* Resources(资源) */, C4EB5C9C1CD8BD18003A7094 /* Other */, ); @@ -2373,8 +3028,6 @@ C4EB5AE91CD8B24F003A7094 /* BABaseView */ = { isa = PBXGroup; children = ( - C4EB5AEA1CD8B24F003A7094 /* BAGIFImageView.h */, - C4EB5AEB1CD8B24F003A7094 /* BAGIFImageView.m */, C40852861CD9C34F0004A671 /* BABaseView.h */, C40852871CD9C34F0004A671 /* BABaseView.m */, ); @@ -2384,11 +3037,12 @@ C4EB5AEC1CD8B24F003A7094 /* BACode */ = { isa = PBXGroup; children = ( + C4DD40481DE817A90084CBCA /* Login(登陆) */, C4EB5AF71CD8B24F003A7094 /* Home(首页) */, C4EB5AFF1CD8B24F003A7094 /* Message(消息) */, C4EB5AF11CD8B24F003A7094 /* Discover(发现) */, - C4EB5B051CD8B24F003A7094 /* Profile(我) */, C4DEB37E1D0C348E001F1585 /* Publish(发布) */, + C4EB5B051CD8B24F003A7094 /* Profile(我) */, ); path = BACode; sourceTree = ""; @@ -2512,10 +3166,9 @@ C4EB5B051CD8B24F003A7094 /* Profile(我) */ = { isa = PBXGroup; children = ( - C4562C6D1CDDA184000F5710 /* ViewModel */, C4EB5B061CD8B24F003A7094 /* Controller */, - C4EB5B091CD8B24F003A7094 /* Model */, - C4EB5B0A1CD8B24F003A7094 /* View */, + C484C0B81DED4CFD004D54C0 /* Model */, + C484C0B91DED4CFD004D54C0 /* View */, ); path = "Profile(我)"; sourceTree = ""; @@ -2525,28 +3178,16 @@ children = ( C4EB5B071CD8B24F003A7094 /* BAProfileViewController.h */, C4EB5B081CD8B24F003A7094 /* BAProfileViewController.m */, + C47660A51DE82C2E00522BEE /* BAProfileViewController.xib */, ); path = Controller; sourceTree = ""; }; - C4EB5B091CD8B24F003A7094 /* Model */ = { - isa = PBXGroup; - children = ( - ); - path = Model; - sourceTree = ""; - }; - C4EB5B0A1CD8B24F003A7094 /* View */ = { - isa = PBXGroup; - children = ( - ); - path = View; - sourceTree = ""; - }; C4EB5B0B1CD8B24F003A7094 /* BALib(三方库) */ = { isa = PBXGroup; children = ( - C445E1BF1D1B86FE00D7654A /* Wonderful */, + C48E375C1EE2A43B0047A7C8 /* Wonderful */, + C4DD40531DE819050084CBCA /* FMDB封装 */, C46B8A011CE0BAC200005E2B /* RegexKitLite */, C408527D1CD995200004A671 /* Reachability */, C4EB5B111CD8B24F003A7094 /* LPLevelView */, @@ -2564,69 +3205,6 @@ path = LPLevelView; sourceTree = ""; }; - C4EB5B241CD8B24F003A7094 /* BATools(工具类) */ = { - isa = PBXGroup; - children = ( - C4EB5B251CD8B24F003A7094 /* BACategory(分类) */, - C4EB5B361CD8B24F003A7094 /* BADataBase(数据库) */, - C4EB5B371CD8B24F003A7094 /* BAMacros(宏) */, - C4EB5B3D1CD8B24F003A7094 /* BANetManager(网络类) */, - C48026D21D1928290087BBB9 /* BAKit(工具类) */, - ); - path = "BATools(工具类)"; - sourceTree = ""; - }; - C4EB5B251CD8B24F003A7094 /* BACategory(分类) */ = { - isa = PBXGroup; - children = ( - C4EB5B281CD8B24F003A7094 /* AppDelegate+BACategory.h */, - C4EB5B291CD8B24F003A7094 /* AppDelegate+BACategory.m */, - C4EB5B2A1CD8B24F003A7094 /* NSObject+BAMJParse.h */, - C4EB5B2B1CD8B24F003A7094 /* NSObject+BAMJParse.m */, - C4EB5B2C1CD8B24F003A7094 /* NSObject+BAProgressHUD.h */, - C4EB5B2D1CD8B24F003A7094 /* NSObject+BAProgressHUD.m */, - C4EB5B2E1CD8B24F003A7094 /* NSObject+BANetwork.h */, - C4EB5B2F1CD8B24F003A7094 /* NSObject+BANetwork.m */, - C4EB5B301CD8B24F003A7094 /* UIBarButtonItem+Item.h */, - C4EB5B311CD8B24F003A7094 /* UIBarButtonItem+Item.m */, - C4EB5B341CD8B24F003A7094 /* UIViewController+BAAlertView.h */, - C4EB5B351CD8B24F003A7094 /* UIViewController+BAAlertView.m */, - ); - path = "BACategory(分类)"; - sourceTree = ""; - }; - C4EB5B361CD8B24F003A7094 /* BADataBase(数据库) */ = { - isa = PBXGroup; - children = ( - ); - path = "BADataBase(数据库)"; - sourceTree = ""; - }; - C4EB5B371CD8B24F003A7094 /* BAMacros(宏) */ = { - isa = PBXGroup; - children = ( - C4EB5B381CD8B24F003A7094 /* BAColorHeader.h */, - C4EB5B391CD8B24F003A7094 /* BADefin.h */, - C4EB5C321CD8B530003A7094 /* BABaseProject.pch */, - C4EB5B3B1CD8B24F003A7094 /* BAFrameHeader.h */, - ); - path = "BAMacros(宏)"; - sourceTree = ""; - }; - C4EB5B3D1CD8B24F003A7094 /* BANetManager(网络类) */ = { - isa = PBXGroup; - children = ( - C4EB5B3E1CD8B24F003A7094 /* BABaseNetManager.h */, - C4EB5B3F1CD8B24F003A7094 /* BABaseNetManager.m */, - C4DEB3731D0C2FC8001F1585 /* BANetManager.h */, - C4DEB3721D0C2FC8001F1585 /* BANetManager.m */, - C4EB5B401CD8B24F003A7094 /* BANewsNetManager.h */, - C4EB5B411CD8B24F003A7094 /* BANewsNetManager.m */, - C4EB5B421CD8B24F003A7094 /* BAURLsPath.h */, - ); - path = "BANetManager(网络类)"; - sourceTree = ""; - }; C4EB5B441CD8B24F003A7094 /* Resources(资源) */ = { isa = PBXGroup; children = ( @@ -2712,6 +3290,7 @@ children = ( C4EB5B681CD8B24F003A7094 /* gif1.gif */, C4EB5B691CD8B24F003A7094 /* gif2.gif */, + C411755D1DF7FD6600802612 /* gif3.gif */, C4B963121D33A5AF005926B8 /* DianPing */, ); path = gif; @@ -2820,8 +3399,8 @@ children = ( C40852EA1CDA26680004A671 /* RDVTabBarController.h */, C40852EB1CDA26680004A671 /* RDVTabBarController.m */, - C42A6AE61CDAE10D00D534EE /* BATabBarController.h */, - C42A6AE71CDAE10D00D534EE /* BATabBarController.m */, + C4772B201D8F8F16002B73CD /* BATabBarController.h */, + C4772B211D8F8F16002B73CD /* BATabBarController.m */, C4DEB3751D0C332C001F1585 /* BATabBarController2.h */, C4DEB3761D0C332C001F1585 /* BATabBarController2.m */, ); @@ -2842,12 +3421,12 @@ C40852E51CDA263B0004A671 /* RDVTabBarItem.m */, C40852E61CDA263B0004A671 /* RDVTabBar.h */, C40852E71CDA263B0004A671 /* RDVTabBar.m */, - C42A6ADD1CDAE10500D534EE /* BATabBar.h */, - C42A6ADE1CDAE10500D534EE /* BATabBar.m */, + C4772B1A1D8F8DB6002B73CD /* BATabBar.h */, + C4772B1B1D8F8DB6002B73CD /* BATabBar.m */, + C4772B1C1D8F8DB6002B73CD /* BATabBarButton.h */, + C4772B1D1D8F8DB6002B73CD /* BATabBarButton.m */, C4DEB3781D0C3351001F1585 /* BATabBar2.h */, C4DEB3791D0C3351001F1585 /* BATabBar2.m */, - C42A6ADF1CDAE10500D534EE /* BATabBarButton.h */, - C42A6AE01CDAE10500D534EE /* BATabBarButton.m */, C42A6AE11CDAE10500D534EE /* BABadgeView.h */, C42A6AE21CDAE10500D534EE /* BABadgeView.m */, ); @@ -2861,12 +3440,28 @@ path = Other; sourceTree = ""; }; + C4EBE1EE1D95015D00020C1F /* 百度地图Image */ = { + isa = PBXGroup; + children = ( + C4EBE1EF1D95015D00020C1F /* poi_1.png */, + C4EBE1F01D95015D00020C1F /* poi_2.png */, + C4EBE1F11D95015D00020C1F /* poi_3.png */, + ); + path = "百度地图Image"; + sourceTree = ""; + }; C4EE1C5A1D22871D005046A6 /* DemoVC */ = { isa = PBXGroup; children = ( C4EE1C5B1D22871D005046A6 /* DemoVC2-1 */, C44423461D2E8596004ACAA8 /* DemoVC2-2 */, C42DAA401D37265500FE8B3E /* DemoVC2-3 */, + C4D109291D9270BA0057B2DC /* DemoVC2-4 */, + C474FE701DACB94A007755D3 /* DemoVC2-5 */, + C457EA401DADD65600CD0B91 /* DemoVC2-6 */, + C407E54D1DE533C200FB1244 /* DemoVC2-7 */, + C4B3CAFC1DFFA5AA00B5A7B3 /* DemoVC2-8 */, + C4D26F4F1E03F4140040AC3E /* DemoVC2-9 */, ); path = DemoVC; sourceTree = ""; @@ -2884,15 +3479,6 @@ path = "DemoVC2-1"; sourceTree = ""; }; - C4EE1C621D228E34005046A6 /* NSString */ = { - isa = PBXGroup; - children = ( - C4EE1C631D228E34005046A6 /* NSString+BAKit.h */, - C4EE1C641D228E34005046A6 /* NSString+BAKit.m */, - ); - path = NSString; - sourceTree = ""; - }; C4EE1C661D2295B0005046A6 /* BABaseCell */ = { isa = PBXGroup; children = ( @@ -2945,56 +3531,15 @@ path = ViewController; sourceTree = ""; }; - C4F74A851D37BDB60014C396 /* 清理缓存 */ = { + C4FB59D81DDD42D3002F5A03 /* DemoVC14 */ = { isa = PBXGroup; children = ( - C4F74A861D37BDEB0014C396 /* BAClearCacheManager.h */, - C4F74A871D37BDEB0014C396 /* BAClearCacheManager.m */, + C4FB59D91DDD42F7002F5A03 /* DemoVC14.h */, + C4FB59DA1DDD42F7002F5A03 /* DemoVC14.m */, + C4FB59DC1DDD4302002F5A03 /* Dog.h */, + C4FB59DD1DDD4302002F5A03 /* Dog.m */, ); - path = "清理缓存"; - sourceTree = ""; - }; - C4F74A891D37C1BD0014C396 /* BALocalNotification */ = { - isa = PBXGroup; - children = ( - C4F74A8A1D37C1BD0014C396 /* BALocalNotification.h */, - C4F74A8B1D37C1BD0014C396 /* BALocalNotification.m */, - ); - path = BALocalNotification; - sourceTree = ""; - }; - C4F74A8C1D37C1BD0014C396 /* BANavigationItem */ = { - isa = PBXGroup; - children = ( - C4F74A8D1D37C1BD0014C396 /* BACustomBarItem.h */, - C4F74A8E1D37C1BD0014C396 /* BACustomBarItem.m */, - C4F74A8F1D37C1BD0014C396 /* UINavigationItem+CustomItem.h */, - C4F74A901D37C1BD0014C396 /* UINavigationItem+CustomItem.m */, - ); - path = BANavigationItem; - sourceTree = ""; - }; - C4F74A911D37C1BD0014C396 /* BASegmentControl */ = { - isa = PBXGroup; - children = ( - C4F74A921D37C1BD0014C396 /* HMSegmentedControl.h */, - C4F74A931D37C1BD0014C396 /* HMSegmentedControl.m */, - ); - path = BASegmentControl; - sourceTree = ""; - }; - C4F74A941D37C1BD0014C396 /* BASharManager */ = { - isa = PBXGroup; - children = ( - C4F74A951D37C1BD0014C396 /* BAShareAnimationView.h */, - C4F74A961D37C1BD0014C396 /* BAShareAnimationView.m */, - C4F74A971D37C1BD0014C396 /* BAShareManage.h */, - C4F74A981D37C1BD0014C396 /* BAShareManage.m */, - C4F74A991D37C1BD0014C396 /* BAShareManageView.h */, - C4F74A9A1D37C1BD0014C396 /* BAShareManageView.m */, - C4F74A9B1D37C1BD0014C396 /* BASharManager.bundle */, - ); - path = BASharManager; + path = DemoVC14; sourceTree = ""; }; /* End PBXGroup section */ @@ -3050,6 +3595,7 @@ C4EB5AC11CD8B04B003A7094 /* Frameworks */, C4EB5AC21CD8B04B003A7094 /* Resources */, 506D9245C67DCD36FDEA4BE1 /* [CP] Copy Pods Resources */, + B6A714841A6340FB4E5AC33D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -3073,7 +3619,7 @@ TargetAttributes = { C4EB5A9F1CD8B04B003A7094 = { CreatedOnToolsVersion = 7.2; - DevelopmentTeam = TRVB83KBJJ; + DevelopmentTeam = A7FRU6ZJRL; }; C4EB5AB81CD8B04B003A7094 = { CreatedOnToolsVersion = 7.2; @@ -3156,9 +3702,12 @@ C4EB5C051CD8B251003A7094 /* 3.jpg in Resources */, C4EB5C041CD8B251003A7094 /* 23.jpg in Resources */, C4EB5BF11CD8B250003A7094 /* icon-xjt@2x.png in Resources */, + C47660A61DE82C2E00522BEE /* BAProfileViewController.xib in Resources */, C4EB5BE01CD8B250003A7094 /* img5.jpg in Resources */, C4B964081D33A5B1005926B8 /* Contents.json in Resources */, + C4DD406B1DE81A290084CBCA /* BARegistViewController.xib in Resources */, C4B9644A1D33A5B1005926B8 /* Contents.json in Resources */, + C474FE781DACB996007755D3 /* DemoVC2_05.xib in Resources */, C4B9642D1D33A5B1005926B8 /* dropdown_anim__00051@2x.png in Resources */, C4B964051D33A5B1005926B8 /* dropdown_anim__00033@2x.png in Resources */, C4EB5C191CD8B251003A7094 /* pic6.jpg in Resources */, @@ -3167,6 +3716,7 @@ C4B963D11D33A5B1005926B8 /* dropdown_anim__0001@2x.png in Resources */, C4EB5C2B1CD8B251003A7094 /* 烟花背景.jpg in Resources */, C4B9641D1D33A5B1005926B8 /* dropdown_anim__00044@2x.png in Resources */, + C48E375A1EE29B9E0047A7C8 /* 背景.jpg in Resources */, C40852A01CD9CD860004A671 /* Lato-Regular.ttf in Resources */, C4B9642B1D33A5B1005926B8 /* dropdown_anim__00050@2x.png in Resources */, C4B964241D33A5B1005926B8 /* Contents.json in Resources */, @@ -3189,14 +3739,17 @@ C4EB5BF91CD8B250003A7094 /* 13.jpg in Resources */, C4B963FF1D33A5B1005926B8 /* dropdown_anim__00030@2x.png in Resources */, C4EB5BF61CD8B250003A7094 /* 10.jpg in Resources */, + C48E37591EE29B9E0047A7C8 /* 123.png in Resources */, C4B964441D33A5B1005926B8 /* Contents.json in Resources */, C4EB5BEB1CD8B250003A7094 /* icon-5@2x.png in Resources */, C4EB5BF71CD8B250003A7094 /* 11.jpg in Resources */, C4B964221D33A5B1005926B8 /* Contents.json in Resources */, C4EB5BE21CD8B250003A7094 /* img7.jpg in Resources */, + C4DD40691DE81A290084CBCA /* BALoginViewController.xib in Resources */, C4B963F71D33A5B1005926B8 /* dropdown_anim__00027@2x.png in Resources */, C4B964041D33A5B1005926B8 /* Contents.json in Resources */, C4EB5C121CD8B251003A7094 /* pbg.jpg in Resources */, + C411755E1DF7FD6600802612 /* gif3.gif in Resources */, C4B9640B1D33A5B1005926B8 /* dropdown_anim__00036@2x.png in Resources */, C4B963F41D33A5B1005926B8 /* Contents.json in Resources */, C4B964091D33A5B1005926B8 /* dropdown_anim__00035@2x.png in Resources */, @@ -3223,12 +3776,14 @@ C4B964101D33A5B1005926B8 /* Contents.json in Resources */, C4B964001D33A5B1005926B8 /* Contents.json in Resources */, C4EB5BDD1CD8B250003A7094 /* img2.jpg in Resources */, + C4B3CB041DFFA67000B5A7B3 /* DemoVC2_08.xib in Resources */, C4B964421D33A5B1005926B8 /* Contents.json in Resources */, C4EB5C221CD8B251003A7094 /* ball.png in Resources */, C4EB5BDF1CD8B250003A7094 /* img4.jpg in Resources */, C4B9640E1D33A5B1005926B8 /* Contents.json in Resources */, C4B964231D33A5B1005926B8 /* dropdown_anim__00047@2x.png in Resources */, C4B964461D33A5B1005926B8 /* Contents.json in Resources */, + C4B3CB081DFFF9F700B5A7B3 /* jquery-1.7.2.min.js in Resources */, C4EB5C0B1CD8B251003A7094 /* 9.jpg in Resources */, C4EB5C1D1CD8B251003A7094 /* test0.jpg in Resources */, C4EB5BE91CD8B250003A7094 /* icon-3@2x.png in Resources */, @@ -3236,8 +3791,10 @@ C4EB5BFC1CD8B251003A7094 /* 16.jpg in Resources */, C4B963D31D33A5B1005926B8 /* dropdown_anim__00010@2x.png in Resources */, C4EB5C281CD8B251003A7094 /* 樱花树3.jpg in Resources */, + C4EBE1F21D95015D00020C1F /* poi_1.png in Resources */, C4B963D01D33A5AF005926B8 /* Contents.json in Resources */, C4B9640F1D33A5B1005926B8 /* dropdown_anim__00038@2x.png in Resources */, + C411755C1DF7E55700802612 /* BAUmengFile.txt in Resources */, C4EB5C101CD8B251003A7094 /* icon3.jpg in Resources */, C4EB5C1A1CD8B251003A7094 /* pic7.jpg in Resources */, C4B964371D33A5B1005926B8 /* dropdown_anim__00056@2x.png in Resources */, @@ -3248,6 +3805,7 @@ C4B9643A1D33A5B1005926B8 /* Contents.json in Resources */, C4B964411D33A5B1005926B8 /* dropdown_anim__00060@2x.png in Resources */, C4B964111D33A5B1005926B8 /* dropdown_anim__00039@2x.png in Resources */, + C44C00D01DCB283700BAAAEC /* BADemoUserStatisticsConfig.plist in Resources */, C4EB5C061CD8B251003A7094 /* 4.jpg in Resources */, C4B9641E1D33A5B1005926B8 /* Contents.json in Resources */, C4EB5BEC1CD8B250003A7094 /* icon-6@2x.png in Resources */, @@ -3259,6 +3817,7 @@ C408529F1CD9CD860004A671 /* Lato-Light.ttf in Resources */, C4EB5BC21CD8B250003A7094 /* LPLevelView.bundle in Resources */, C4EB5C261CD8B251003A7094 /* 樱花树1.jpg in Resources */, + C4C744411DC72DB300E747D8 /* BASharManager.bundle in Resources */, C4B963EA1D33A5B1005926B8 /* Contents.json in Resources */, C4B963E61D33A5B1005926B8 /* Contents.json in Resources */, C4EB5C131CD8B251003A7094 /* pic0.jpg in Resources */, @@ -3275,7 +3834,6 @@ C4B964191D33A5B1005926B8 /* dropdown_anim__00042@2x.png in Resources */, C4B964401D33A5B1005926B8 /* Contents.json in Resources */, C4B963D71D33A5B1005926B8 /* dropdown_anim__00012@2x.png in Resources */, - C4F74AA31D37C1BD0014C396 /* BASharManager.bundle in Resources */, C4EB5C251CD8B251003A7094 /* snowbg.jpg in Resources */, C40852A21CD9CD860004A671 /* Lato-ThinItalic.ttf in Resources */, C4EADCE91D02C0200086979C /* InfoPlist.strings in Resources */, @@ -3289,6 +3847,7 @@ C4B964061D33A5B1005926B8 /* Contents.json in Resources */, C4B964141D33A5B1005926B8 /* Contents.json in Resources */, C4B964381D33A5B1005926B8 /* Contents.json in Resources */, + C4EBE1F41D95015D00020C1F /* poi_3.png in Resources */, C4EB5C151CD8B251003A7094 /* pic2.jpg in Resources */, C4B964031D33A5B1005926B8 /* dropdown_anim__00032@2x.png in Resources */, C4EB5AB01CD8B04B003A7094 /* Assets.xcassets in Resources */, @@ -3297,6 +3856,7 @@ C4B963E21D33A5B1005926B8 /* Contents.json in Resources */, C4EB5BD71CD8B250003A7094 /* img1.jpg in Resources */, C4EADCE51D02C0130086979C /* Localizable.strings in Resources */, + C4EBE1F31D95015D00020C1F /* poi_2.png in Resources */, C4EB5BF41CD8B250003A7094 /* 0.jpg in Resources */, C4B964391D33A5B1005926B8 /* dropdown_anim__00057@2x.png in Resources */, C4EB5BEA1CD8B250003A7094 /* icon-4@2x.png in Resources */, @@ -3316,6 +3876,7 @@ C4EB5BE61CD8B250003A7094 /* icon-10@2x.png in Resources */, C42DAA4B1D3763A800FE8B3E /* profileVC.bundle in Resources */, C4EB5BE31CD8B250003A7094 /* img8.jpg in Resources */, + C407E5551DE5343000FB1244 /* DemoVC2_07.xib in Resources */, C4EB5C1C1CD8B251003A7094 /* picon.jpg in Resources */, C4EB5BD61CD8B250003A7094 /* img0.jpg in Resources */, C4EB5BF81CD8B250003A7094 /* 12.jpg in Resources */, @@ -3334,16 +3895,20 @@ C4B9640A1D33A5B1005926B8 /* Contents.json in Resources */, C4B964431D33A5B1005926B8 /* dropdown_anim__0007@2x.png in Resources */, C4B964291D33A5B1005926B8 /* dropdown_anim__0005@2x.png in Resources */, + C4D26F541E03F44D0040AC3E /* DemoVC2_09.xib in Resources */, C4B964271D33A5B1005926B8 /* dropdown_anim__00049@2x.png in Resources */, C4B964351D33A5B1005926B8 /* dropdown_anim__00055@2x.png in Resources */, C4EB5BEE1CD8B250003A7094 /* icon-8@2x.png in Resources */, + C48E375B1EE29B9E0047A7C8 /* 美女.jpg in Resources */, C42DAA4D1D37669C00FE8B3E /* otherImages.bundle in Resources */, C4EB5C211CD8B251003A7094 /* test4.jpg in Resources */, C4B964011D33A5B1005926B8 /* dropdown_anim__00031@2x.png in Resources */, C4EB5BFB1CD8B251003A7094 /* 15.jpg in Resources */, + C484C0C31DED4D25004D54C0 /* BAProfileHeadCell.xib in Resources */, C4EB5C291CD8B251003A7094 /* 樱花瓣1.jpg in Resources */, C4B963DA1D33A5B1005926B8 /* Contents.json in Resources */, C4B9644C1D33A5B1005926B8 /* Contents.json in Resources */, + C4B3CB061DFFA6F700B5A7B3 /* DemoVC2_08.html in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3424,6 +3989,21 @@ shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-resources.sh\"\n"; showEnvVarsInLog = 0; }; + B6A714841A6340FB4E5AC33D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; E529F28772B974488CBD1AB9 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -3451,7 +4031,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; EF5B19CC6D0A6B2D1857956F /* [CP] Check Pods Manifest.lock */ = { @@ -3466,7 +4046,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; F8AC0514F3C56B806478C29A /* [CP] Check Pods Manifest.lock */ = { @@ -3481,7 +4061,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -3491,163 +4071,215 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C48556331D3CC39900002FA2 /* UIBarButtonItem+BAKit.m in Sources */, + C4C7443A1DC72DB300E747D8 /* BACustomBarItem.m in Sources */, C4D108051CE2FC1C00F735B9 /* view4.m in Sources */, - C4EB5BD21CD8B250003A7094 /* BABaseNetManager.m in Sources */, + C48E376F1EE2A43B0047A7C8 /* UIColor+Separate.m in Sources */, + C4C7447B1DC72DB300E747D8 /* UIView+BARotateAnimationProtocol.m in Sources */, C4DEB37D1D0C33E8001F1585 /* BANavigationController2.m in Sources */, - C48027441D1928290087BBB9 /* UIButton+BAKit.m in Sources */, C40852A91CD9FD760004A671 /* BAHomeViewCell.m in Sources */, + C4C7445C1DC72DB300E747D8 /* GCDTimer.m in Sources */, C40852E81CDA263B0004A671 /* RDVTabBarItem.m in Sources */, C40852E31CDA229B0004A671 /* BANavigationController.m in Sources */, - C4EB5BCF1CD8B250003A7094 /* UIBarButtonItem+Item.m in Sources */, - C48026D11D1920110087BBB9 /* DemoVC12View.m in Sources */, C46B89F91CE055DD00005E2B /* DemoVC5Cell.m in Sources */, - C44423301D2E738A004ACAA8 /* BAAlertView.m in Sources */, - C4F74A9C1D37C1BD0014C396 /* BALocalNotification.m in Sources */, - C48027341D1928290087BBB9 /* BASystemSound.m in Sources */, C4EB5BBE1CD8B250003A7094 /* BAMessageViewController.m in Sources */, - C445E1D41D1B86FE00D7654A /* UILabel+Wonderful.m in Sources */, + C4C7446E1DC72DB300E747D8 /* UIImage+BAKit.m in Sources */, + C4C7443F1DC72DB300E747D8 /* BAShareManage.m in Sources */, + C4D26F521E03F4420040AC3E /* DemoVC2_09.m in Sources */, + C4C7446F1DC72DB300E747D8 /* UIImageView+BAKit.m in Sources */, + C4C744501DC72DB300E747D8 /* NSNumber+BAKit.m in Sources */, C40852EC1CDA26680004A671 /* RDVTabBarController.m in Sources */, + C4E0154B1E0A35F200CCC322 /* BATextField.m in Sources */, + C4DD40591DE819050084CBCA /* JKDBModel.m in Sources */, + C4C744681DC72DB300E747D8 /* UIBarButtonItem+BAKit.m in Sources */, C48026CA1D191EC90087BBB9 /* DemoVC11_model.m in Sources */, + C4AC636C1EEF717C00DEEDC7 /* BAKit_Const_Color.m in Sources */, + C4309BBD1DCAD5C40016ABE6 /* NSObject+BAHook.m in Sources */, + C4772B1E1D8F8DB6002B73CD /* BATabBar.m in Sources */, + C48E37581EE29B9E0047A7C8 /* ViewController2.m in Sources */, + C44C00CE1DCB268C00BAAAEC /* DemoVC2_05_test2.m in Sources */, + C4772B1F1D8F8DB6002B73CD /* BATabBarButton.m in Sources */, + C474FE771DACB996007755D3 /* DemoVC2_05.m in Sources */, + C4C744481DC72DB300E747D8 /* NSArray+BAKit.m in Sources */, C4ACE2FF1CF5C53100313DD4 /* DemoVC7.m in Sources */, - C48027471D1928290087BBB9 /* UIFont+BAKit.m in Sources */, + C4C744601DC72DB300E747D8 /* BASystemService.m in Sources */, + C44C00D31DCB30BA00BAAAEC /* UIButton+BAHook.m in Sources */, + C48E376C1EE2A43B0047A7C8 /* SXColorLabel.m in Sources */, C46B8A041CE0BAC200005E2B /* RegexKitLite.m in Sources */, - C485562C1D3CB01700002FA2 /* UINavigationController+BAKit.m in Sources */, C4EB5AA81CD8B04B003A7094 /* AppDelegate.m in Sources */, + C4AC63A91EEF800800DEEDC7 /* NSFileManager+BAKit.m in Sources */, + C4C744771DC72DB300E747D8 /* UIView+BAKit.m in Sources */, C4F59F8A1D54684E00AA822A /* BAADScrollView.m in Sources */, + C4C744701DC72DB300E747D8 /* UILabel+BAKit.m in Sources */, + C48E376D1EE2A43B0047A7C8 /* SXHeadLine.m in Sources */, + C4C7447E1DC72DB300E747D8 /* BAUpdatingView.m in Sources */, C430AB761CDC8A360086DDD6 /* DemoVC3.m in Sources */, - C42A6AE41CDAE10500D534EE /* BATabBarButton.m in Sources */, C4EB5BBD1CD8B250003A7094 /* BAHomeViewController.m in Sources */, - C4F74A9F1D37C1BD0014C396 /* HMSegmentedControl.m in Sources */, C4EA25841CF7E10600F6081C /* DemoVC10_CollectionView.m in Sources */, - C480274C1D1928290087BBB9 /* UITableView+BAKit.m in Sources */, C4EE1C611D228AE9005046A6 /* DemoVC2_01_Model.m in Sources */, - C4EE1C651D228E34005046A6 /* NSString+BAKit.m in Sources */, - C48027391D1928290087BBB9 /* NSDictionary+BAKit.m in Sources */, C427811D1D2D2881003E6694 /* BABaseCell.m in Sources */, - C4EB5BCE1CD8B250003A7094 /* NSObject+BANetwork.m in Sources */, - C48027381D1928290087BBB9 /* NSDate+BAKit.m in Sources */, + C4AC63901EEF71AB00DEEDC7 /* NSString+BATransform.m in Sources */, + C4C743301DC7295A00E747D8 /* UIViewController+BAAlertView.m in Sources */, + C4C7432C1DC7295A00E747D8 /* NSObject+BAMJParse.m in Sources */, + C4772B221D8F8F16002B73CD /* BATabBarController.m in Sources */, C4EB5BBC1CD8B250003A7094 /* BADiscoverViewController.m in Sources */, + C4C7444D1DC72DB300E747D8 /* NSFileManager+BAKit.m in Sources */, C444234C1D2E8680004ACAA8 /* DemoVC2_02_HeaderView.m in Sources */, - C4B964511D33A630005926B8 /* BACustomMJFooter.m in Sources */, C42781201D2D315B003E6694 /* BABaseCollectionCell.m in Sources */, - C4EB5BCC1CD8B250003A7094 /* NSObject+BAMJParse.m in Sources */, + C4C7444E1DC72DB300E747D8 /* NSMutableArray+BAKit.m in Sources */, + C4C744721DC72DB300E747D8 /* UINavigationController+BAKit.m in Sources */, C44423491D2E85B8004ACAA8 /* DemoVC2_02.m in Sources */, - C4EB5BCB1CD8B250003A7094 /* AppDelegate+BACategory.m in Sources */, - C48556301D3CB2DD00002FA2 /* UINavigationBar+BAKit.m in Sources */, - C480272F1D1928290087BBB9 /* BALog.m in Sources */, - C427812E1D2D39B1003E6694 /* GCDGroup.m in Sources */, - C48027551D1928290087BBB9 /* EmitterLayerView.m in Sources */, - C4F74A9E1D37C1BD0014C396 /* UINavigationItem+CustomItem.m in Sources */, + C4AC63921EEF71AB00DEEDC7 /* NSString+BAUIButton.m in Sources */, + C48E376B1EE2A43B0047A7C8 /* SXColorGradientView.m in Sources */, + C4EBE1EA1D94C4FC00020C1F /* MyAnimatedAnnotationView.m in Sources */, C4EB5BB51CD8B250003A7094 /* BABaseViewModel.m in Sources */, - C44423261D2E5D67004ACAA8 /* BAKitManager.m in Sources */, - C445E1D21D1B86FE00D7654A /* UIColor+Separate.m in Sources */, - C4F74A881D37BDEB0014C396 /* BAClearCacheManager.m in Sources */, + C4309BBC1DCAD5C40016ABE6 /* BAUserStatistics.m in Sources */, + C4C744491DC72DB300E747D8 /* NSData+BAKit.m in Sources */, + C4C7437B1DC7295B00E747D8 /* BABaseNetManager.m in Sources */, + C4B3CB031DFFA67000B5A7B3 /* DemoVC2_08.m in Sources */, + C4309BBF1DCAD5C40016ABE6 /* UIViewController+BAHook.m in Sources */, + C484C0C21DED4D25004D54C0 /* BAProfileHeadCell.m in Sources */, + C4C7445E1DC72DB300E747D8 /* BALog.m in Sources */, C445E1F51D1BF10A00D7654A /* DemoVC13.m in Sources */, - C480273C1D1928290087BBB9 /* NSMutableDictionary+BAKit.m in Sources */, C4F59F871D54680E00AA822A /* BANewFeatureVC.m in Sources */, - C427812F1D2D39B1003E6694 /* GCDQueue.m in Sources */, + C4AC639F1EEF7BA500DEEDC7 /* NSDate+BAKit.m in Sources */, + C4AC635D1EEF70AD00DEEDC7 /* DemoVC2_05_test3.m in Sources */, C4D108031CE2FC1C00F735B9 /* view2.m in Sources */, - C48027451D1928290087BBB9 /* UIColor+BAKit.m in Sources */, - C42A6AE31CDAE10500D534EE /* BATabBar.m in Sources */, C4562C7E1CDDBE44000F5710 /* DemoVC5.m in Sources */, - C480272D1D1928290087BBB9 /* BAAPP.m in Sources */, + C4C744531DC72DB300E747D8 /* NSShadow+BAKit.m in Sources */, + C4C744791DC72DB300E747D8 /* UIWindow+BAKit.m in Sources */, + C4FB59DE1DDD4302002F5A03 /* Dog.m in Sources */, + C4C7446B1DC72DB300E747D8 /* UIColor+BAKit.m in Sources */, + C4AC63931EEF71AB00DEEDC7 /* NSString+BAEncrypt.m in Sources */, + C4AC63A01EEF7BA500DEEDC7 /* NSDateFormatter+BAKit.m in Sources */, C423217F1CE72ABC00D91F45 /* DemoVC6.m in Sources */, - C48027541D1928290087BBB9 /* CALayer+BAMaskLayer.m in Sources */, - C48027351D1928290087BBB9 /* BATouchID.m in Sources */, + C4C7447F1DC72DB300E747D8 /* CALayer+BAMaskLayer.m in Sources */, + C4C7432A1DC7295A00E747D8 /* AppDelegate+BABaiduMap.m in Sources */, + C4C744741DC72DB300E747D8 /* UITableView+BAKit.m in Sources */, + C4C7444F1DC72DB300E747D8 /* NSMutableDictionary+BAKit.m in Sources */, + C4AC63941EEF71AB00DEEDC7 /* NSString+BAEmoji.m in Sources */, C4EE1C691D2295E2005046A6 /* BACellDataAdapter.m in Sources */, C4EA25811CF7DFEC00F6081C /* DemoVC10.m in Sources */, + C4C744451DC72DB300E747D8 /* BACustomMJHeader.m in Sources */, + C4C744461DC72DB300E747D8 /* BAKitManager+BALabel.m in Sources */, + C4C744421DC72DB300E747D8 /* BASystermSetting.m in Sources */, + C4C7445F1DC72DB300E747D8 /* BAPassword.m in Sources */, C40852881CD9C34F0004A671 /* BABaseView.m in Sources */, + C48E37711EE2A43B0047A7C8 /* UILabel+Wonderful.m in Sources */, + C4FB59DB1DDD42F7002F5A03 /* DemoVC14.m in Sources */, + C4AC638A1EEF71AB00DEEDC7 /* NSString+BAKit.m in Sources */, + C4AC63A81EEF800800DEEDC7 /* BAKit_UserDefaults.m in Sources */, + C48E37701EE2A43B0047A7C8 /* UIColor+Wonderful.m in Sources */, + C4C744751DC72DB300E747D8 /* UITableViewCell+Reuse.m in Sources */, + C4C7432F1DC7295A00E747D8 /* UIBarButtonItem+Item.m in Sources */, + C4AC638F1EEF71AB00DEEDC7 /* NSString+BATime.m in Sources */, + C4C7446A1DC72DB300E747D8 /* UICollectionView+ARDynamicCacheHeightLayoutCell.m in Sources */, + C4C7432D1DC7295A00E747D8 /* NSObject+BANetwork.m in Sources */, + C4DD40581DE819050084CBCA /* JKDBHelper.m in Sources */, C42A6AE51CDAE10500D534EE /* BABadgeView.m in Sources */, C40852801CD995200004A671 /* Reachability.m in Sources */, + C43222D41DC9D18800AE63F2 /* AppDelegate+BAUMengAnalytics.m in Sources */, C41CA8CA1D3FA3BF006296BD /* DemoVC2_02_studentCell.m in Sources */, - C48027461D1928290087BBB9 /* UIDevice+BAKit.m in Sources */, - C445E1CE1D1B86FE00D7654A /* SXColorGradientView.m in Sources */, C48026C81D191EC90087BBB9 /* DemoVC11_AutoLayout.m in Sources */, + C4C7447C1DC72DB300E747D8 /* BAFadeBlackView.m in Sources */, + C4C7446D1DC72DB300E747D8 /* UIFont+BAKit.m in Sources */, + C4C744381DC72DB300E747D8 /* BAJumpManager.m in Sources */, C42781231D2D338F003E6694 /* DemoVC2_01_cell.m in Sources */, C46C5AB91CDB75B9002F707F /* BAHomeViewModel.m in Sources */, - C445E1D31D1B86FE00D7654A /* UIColor+Wonderful.m in Sources */, + C4C744731DC72DB300E747D8 /* UIScrollView+BAKit.m in Sources */, C4EE1C5E1D2288BF005046A6 /* DemoVC2_01.m in Sources */, - C480273B1D1928290087BBB9 /* NSMutableArray+BAKit.m in Sources */, - C444232A1D2E5E07004ACAA8 /* BAKitManager+BALabel.m in Sources */, - C480273A1D1928290087BBB9 /* NSFileManager+BAKit.m in Sources */, - C48027311D1928290087BBB9 /* BAPassword.m in Sources */, + C4C744711DC72DB300E747D8 /* UINavigationBar+BAKit.m in Sources */, + C4D1092D1D9271400057B2DC /* DemoVC2_04.m in Sources */, + C48E37571EE29B9E0047A7C8 /* CustomView.m in Sources */, C40852AD1CD9FDD50004A671 /* BAHomeVCModel.m in Sources */, + C4DD406E1DE81A330084CBCA /* BAUserModel.m in Sources */, C41F625C1CFC265300294C35 /* DemoVC10_ReusableView.m in Sources */, + C4AC63911EEF71AB00DEEDC7 /* NSString+BATrims.m in Sources */, + C48E37741EE2A5B50047A7C8 /* BAKit_RegularExpression.m in Sources */, + C4DD406A1DE81A290084CBCA /* BARegistViewController.m in Sources */, + C4309BBE1DCAD5C40016ABE6 /* UIControl+BAUserStastistics.m in Sources */, + C4C744781DC72DB300E747D8 /* UIWebView+BAKit.m in Sources */, + C407E5501DE533FD00FB1244 /* NSMutableArray+BASort.m in Sources */, C4D108041CE2FC1C00F735B9 /* view3.m in Sources */, + 9C93D6B420BD2718002FB06B /* HMSegmentedControl.m in Sources */, C41CA8C71D3FA185006296BD /* DemoVC2_02_classModel.m in Sources */, - C48027431D1928290087BBB9 /* BATextView.m in Sources */, - C4EB5BCD1CD8B250003A7094 /* NSObject+BAProgressHUD.m in Sources */, - C42781301D2D39B1003E6694 /* GCDSemaphore.m in Sources */, - C4B964541D33B5E8005926B8 /* BACustomMJHeader.m in Sources */, - C480274D1D1928290087BBB9 /* UITextField+BAKit.m in Sources */, - C48027561D1928290087BBB9 /* UIView+BAGlowView.m in Sources */, C41F62591CFC253600294C35 /* DemoVC10Model.m in Sources */, + C4C744391DC72DB300E747D8 /* BALocalNotification.m in Sources */, + C4C744641DC72DB300E747D8 /* BACustomModalTransition.m in Sources */, C41CA8C41D3FA049006296BD /* DemoVC2_02_studentModel.m in Sources */, + C4C744671DC72DB300E747D8 /* BATextView.m in Sources */, C4EB5AA51CD8B04B003A7094 /* main.m in Sources */, - C480272E1D1928290087BBB9 /* BAAutoSizeWithWH.m in Sources */, - C44423451D2E824D004ACAA8 /* BARotateView.m in Sources */, - C48556361D3CC74600002FA2 /* NSDateFormatter+BAKit.m in Sources */, - C48027481D1928290087BBB9 /* UIImage+BAKit.m in Sources */, - C48027371D1928290087BBB9 /* NSData+BAKit.m in Sources */, C4DEB3851D0C34B0001F1585 /* BAPublishViewController.m in Sources */, - C480273D1D1928290087BBB9 /* NSNumber+BAKit.m in Sources */, C46B89FC1CE0AE3400005E2B /* DemoVC5_TextPart.m in Sources */, - C480274A1D1928290087BBB9 /* UILabel+BAKit.m in Sources */, - C445E1CF1D1B86FE00D7654A /* SXColorLabel.m in Sources */, - C480274F1D1928290087BBB9 /* UIWebView+BAKit.m in Sources */, C42DAA431D37269300FE8B3E /* DemoVC2_03.m in Sources */, - C4EB5BBB1CD8B250003A7094 /* BAGIFImageView.m in Sources */, C41F62561CFC250500294C35 /* DemoVC10Cell.m in Sources */, + C4C6E02D1DD05B170031395C /* UILabel+BAAttributeTextTapAction.m in Sources */, + C4AC63881EEF71AB00DEEDC7 /* NSMutableAttributedString+BAKit.m in Sources */, C40852B81CDA08F10004A671 /* DemoVC1.m in Sources */, - C4F74AA11D37C1BD0014C396 /* BAShareManage.m in Sources */, - C480274B1D1928290087BBB9 /* UIScrollView+BAKit.m in Sources */, - C4DEB3741D0C2FC8001F1585 /* BANetManager.m in Sources */, C4EB5BC31CD8B250003A7094 /* LPLevelView.m in Sources */, C48026CE1D191F720087BBB9 /* DemoVC12.m in Sources */, + C4C744591DC72DB300E747D8 /* GCDGroup.m in Sources */, + C4AC638B1EEF71AB00DEEDC7 /* NSString+BANSNumber.m in Sources */, + C44564311E791BE3007D5692 /* BALoginViewModel.m in Sources */, C4EB5BB81CD8B250003A7094 /* BANavigationBar.m in Sources */, + C4C744631DC72DB300E747D8 /* UIApplication+AppInfo.m in Sources */, + C48E376E1EE2A43B0047A7C8 /* SXMarquee.m in Sources */, C408527C1CD990B00004A671 /* BABaseTableViewController.m in Sources */, + C4C744471DC72DB300E747D8 /* BAKitManager.m in Sources */, + C4C7445B1DC72DB300E747D8 /* GCDSemaphore.m in Sources */, + C4C744801DC72DB300E747D8 /* EmitterLayerView.m in Sources */, + C4C7443B1DC72DB300E747D8 /* UINavigationItem+CustomItem.m in Sources */, + C4AC638C1EEF71AB00DEEDC7 /* NSString+BARange.m in Sources */, + C4C7444C1DC72DB300E747D8 /* NSDictionary+BAKit.m in Sources */, C4C802511CF5AFAE00AD5B3B /* BAWebViewController.m in Sources */, + C4C744621DC72DB300E747D8 /* BATouchID.m in Sources */, C40852E91CDA263B0004A671 /* RDVTabBar.m in Sources */, + C4AC63AA1EEF800800DEEDC7 /* NSString+BAFileManager.m in Sources */, C4F59F8D1D5468B900AA822A /* BAADLabel.m in Sources */, - C4EB5BD11CD8B250003A7094 /* UIViewController+BAAlertView.m in Sources */, - C42A6AE81CDAE10D00D534EE /* BATabBarController.m in Sources */, - C4F74A9D1D37C1BD0014C396 /* BACustomBarItem.m in Sources */, - C48027501D1928290087BBB9 /* UIWindow+BAKit.m in Sources */, + C4C744611DC72DB300E747D8 /* BASystemSound.m in Sources */, + C4AC63971EEF74F500DEEDC7 /* BAKit_ClearCacheManager.m in Sources */, + C4C744521DC72DB300E747D8 /* NSProcessInfo+BAKit.m in Sources */, C44423341D2E7775004ACAA8 /* BABaseHeaderFooterView.m in Sources */, - C42781311D2D39B1003E6694 /* GCDTimer.m in Sources */, - C48027521D1928290087BBB9 /* BASnowView.m in Sources */, - C4F74AA21D37C1BD0014C396 /* BAShareManageView.m in Sources */, - C48027321D1928290087BBB9 /* BARegularExpression.m in Sources */, + C4A737E91DEC124400C93B40 /* BAUserSqlite.m in Sources */, C4EB5BB71CD8B250003A7094 /* BAFPSLabel.m in Sources */, - C480274E1D1928290087BBB9 /* UIView+BAKit.m in Sources */, + C4C744811DC72DB300E747D8 /* UIView+BAGlowView.m in Sources */, + C4DD40681DE81A290084CBCA /* BALoginViewController.m in Sources */, + C407E5541DE5343000FB1244 /* DemoVC2_07.m in Sources */, C4562C6B1CDD9F05000F5710 /* DemoVC4.m in Sources */, C4D108021CE2FC1C00F735B9 /* view1.m in Sources */, - C445E1D11D1B86FE00D7654A /* SXMarquee.m in Sources */, - C445E1D01D1B86FE00D7654A /* SXHeadLine.m in Sources */, - C48027401D1928290087BBB9 /* NSThread+BAKit.m in Sources */, - C48027421D1928290087BBB9 /* BAPickerView.m in Sources */, - C48027531D1928290087BBB9 /* BAUpdatingView.m in Sources */, + C4C7432E1DC7295A00E747D8 /* NSObject+BAProgressHUD.m in Sources */, + C4AC638E1EEF71AB00DEEDC7 /* NSString+BASize.m in Sources */, C4ACE3031CF5C90C00313DD4 /* DemoVC8.m in Sources */, + C4C7447D1DC72DB300E747D8 /* BASnowView.m in Sources */, + C4AC63891EEF71AB00DEEDC7 /* NSString+BAColor.m in Sources */, C473CC791CF72372001883A9 /* DemoVC9.m in Sources */, C4DEB3771D0C332C001F1585 /* BATabBarController2.m in Sources */, - C480273E1D1928290087BBB9 /* NSProcessInfo+BAKit.m in Sources */, + C4C7445A1DC72DB300E747D8 /* GCDQueue.m in Sources */, + C4309BB11DCAD4D50016ABE6 /* BALoadingHubView.m in Sources */, + C4C744511DC72DB300E747D8 /* NSObject+BARunTime.m in Sources */, + C4D26F471E03D41A0040AC3E /* BAPage.m in Sources */, + C4C744371DC72DB300E747D8 /* BACommon.m in Sources */, + C4C744361DC72DB300E747D8 /* BAAutoSizeWithWH.m in Sources */, + C4AC636B1EEF717C00DEEDC7 /* BAKit_Const.m in Sources */, C4EB5BB91CD8B250003A7094 /* BABaseViewController.m in Sources */, - C48027491D1928290087BBB9 /* UIImageView+BAKit.m in Sources */, + C4C744581DC72DB300E747D8 /* NSThread+BAKit.m in Sources */, C4EB5BB61CD8B250003A7094 /* BAVideoModel.m in Sources */, + C4C7447A1DC72DB300E747D8 /* BARotateView.m in Sources */, C4EB5BB41CD8B250003A7094 /* BABaseModel.m in Sources */, + C4C7445D1DC72DB300E747D8 /* BAAPP.m in Sources */, + C4C7437D1DC7295B00E747D8 /* BANewsNetManager.m in Sources */, + C4C744841DC7306800E747D8 /* DemoVC2_05_test.m in Sources */, C4DEB37A1D0C3351001F1585 /* BATabBar2.m in Sources */, - C48027361D1928290087BBB9 /* NSArray+BAKit.m in Sources */, - C44423381D2E7E69004ACAA8 /* UIView+BARotateAnimationProtocol.m in Sources */, - C44423311D2E738A004ACAA8 /* BAModal.m in Sources */, - C4EB5BD31CD8B250003A7094 /* BANewsNetManager.m in Sources */, - C48027511D1928290087BBB9 /* BAFadeBlackView.m in Sources */, + C4AC638D1EEF71AB00DEEDC7 /* NSString+BARegular.m in Sources */, + C4AC639A1EEF783B00DEEDC7 /* UIAlertController+BAKit.m in Sources */, C473CC811CF72960001883A9 /* DemoVC9_Model.m in Sources */, - C4F74AA01D37C1BD0014C396 /* BAShareAnimationView.m in Sources */, + C4C744441DC72DB300E747D8 /* BACustomMJFooter.m in Sources */, C48026C91D191EC90087BBB9 /* DemoVC11_Cell.m in Sources */, C40852BC1CDA09100004A671 /* DemoVC2.m in Sources */, + C4C7446C1DC72DB300E747D8 /* UIDevice+BAKit.m in Sources */, + C4C744761DC72DB300E747D8 /* UITextField+BAKit.m in Sources */, + C4C7432B1DC7295A00E747D8 /* AppDelegate+BACategory.m in Sources */, + C457EA461DADD6E600CD0B91 /* DemoVC2_06.m in Sources */, C48026C71D191EC90087BBB9 /* DemoVC11.m in Sources */, - C48027411D1928290087BBB9 /* BACustomModalTransition.m in Sources */, C4EB5BBF1CD8B250003A7094 /* BAProfileViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -3810,14 +4442,17 @@ baseConfigurationReference = 4AD2C0DE7422AACAB30B1B51 /* Pods-BABaseProject.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = A7FRU6ZJRL; ENABLE_BITCODE = NO; GCC_PREFIX_HEADER = "$(PRODUCT_NAME)/BAMainCode/BATools(工具类)/BAMacros(宏)/BABaseProject.pch"; INFOPLIST_FILE = "$(SRCROOT)/BABaseProject/BAMainCode/Resources(资源)/Plist/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.boai.BABaseProject1; + PRODUCT_BUNDLE_IDENTIFIER = com.boaihome.BABaseProject; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; }; @@ -3828,14 +4463,17 @@ baseConfigurationReference = 7E6875B539C22C6BAC2A5D03 /* Pods-BABaseProject.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + DEVELOPMENT_TEAM = A7FRU6ZJRL; ENABLE_BITCODE = NO; GCC_PREFIX_HEADER = "$(PRODUCT_NAME)/BAMainCode/BATools(工具类)/BAMacros(宏)/BABaseProject.pch"; INFOPLIST_FILE = "$(SRCROOT)/BABaseProject/BAMainCode/Resources(资源)/Plist/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.boai.BABaseProject1; + PRODUCT_BUNDLE_IDENTIFIER = com.boaihome.BABaseProject; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; }; diff --git a/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BABaseProject.xcscheme b/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BABaseProject.xcscheme new file mode 100644 index 0000000..88d670d --- /dev/null +++ b/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BABaseProject.xcscheme @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist b/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..487274f --- /dev/null +++ b/BABaseProject.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,32 @@ + + + + + SchemeUserState + + BABaseProject.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + C4EB5A9F1CD8B04B003A7094 + + primary + + + C4EB5AB81CD8B04B003A7094 + + primary + + + C4EB5AC31CD8B04B003A7094 + + primary + + + + + diff --git a/BABaseProject.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist b/BABaseProject.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..a8bee3d --- /dev/null +++ b/BABaseProject.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + BABaseProject.xcscheme + + orderHint + 1 + + + + diff --git a/BABaseProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BABaseProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/BABaseProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/BABaseProject.xcworkspace/xcuserdata/boai.xcuserdatad/UserInterfaceState.xcuserstate b/BABaseProject.xcworkspace/xcuserdata/boai.xcuserdatad/UserInterfaceState.xcuserstate index 4a36cdc..8d96784 100755 Binary files a/BABaseProject.xcworkspace/xcuserdata/boai.xcuserdatad/UserInterfaceState.xcuserstate and b/BABaseProject.xcworkspace/xcuserdata/boai.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/UserInterfaceState.xcuserstate b/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..b0a8d4d Binary files /dev/null and b/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..3f326d5 --- /dev/null +++ b/BABaseProject.xcworkspace/xcuserdata/luxiaofeng.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/UserInterfaceState.xcuserstate b/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..c845652 Binary files /dev/null and b/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..ef07a38 --- /dev/null +++ b/BABaseProject.xcworkspace/xcuserdata/sunboyan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/BABaseProject/AppDelegate.h b/BABaseProject/AppDelegate.h index ccef1d8..9690201 100755 --- a/BABaseProject/AppDelegate.h +++ b/BABaseProject/AppDelegate.h @@ -60,9 +60,12 @@ #import +#import -@interface AppDelegate : UIResponder - +@interface AppDelegate : UIResponder +{ + BMKMapManager *_mapManager; +} @property (strong, nonatomic) UIWindow *window; @property (nonatomic, strong) UIViewController *viewController; /*! 本地通知保存字典 */ diff --git a/BABaseProject/AppDelegate.m b/BABaseProject/AppDelegate.m index 51ae056..3a1faaf 100755 --- a/BABaseProject/AppDelegate.m +++ b/BABaseProject/AppDelegate.m @@ -60,6 +60,11 @@ #import "AppDelegate.h" #import "AppDelegate+BACategory.h" +/*! 百度地图 */ +#import "AppDelegate+BABaiduMap.h" +/*! 友盟统计 */ +#import "AppDelegate+BAUMengAnalytics.h" + #import "BABaseNetManager.h" @interface AppDelegate () @@ -72,18 +77,25 @@ @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /*! 是否使用自定义TabVC * YES:使用,NO:使用RDVTabVC , 这行注掉后还可以使用SB看看,具体使用:请前往工程中修改Main显示即可!*/ - [self isBATabVC:YES]; + [self isBATabVC:NO]; - /*! 设置3DTouch */ - [self ba_setup3DTouch]; + /*! 判断当前设备是否支持 3D Touch */ + if (self.window.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) + { + /*! 设置3DTouch */ + [self ba_setup3DTouch]; + } /*!把各种初始化操作,固定的操作 写入到类别中 */ // [self BA_initializeWithApplication:application]; - [BANetManager ba_startNetWorkMonitoring]; +// [BANetManager ba_startNetWorkMonitoring]; /*! 友盟分享/登陆 */ [self BA_YMShareSetting]; + /*! 友盟统计 */ + [self ba_setuUMengAnalytics]; + /*! 键盘处理 */ [self BA_KeyboardSetting]; @@ -96,6 +108,12 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( /*! 测试信息 */ [self test]; + /*! 配置百度地图 */ + [self ba_setupBaiduMap]; + + /*! 网页端打开 APP */ +// NSString *urlString = []; + return YES; } diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Contents.json b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Contents.json index eeea76c..9b43ccd 100755 --- a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,67 +2,100 @@ "images" : [ { "idiom" : "iphone", - "size" : "29x29", + "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", - "size" : "29x29", + "size" : "20x20", "scale" : "3x" }, { + "size" : "29x29", "idiom" : "iphone", - "size" : "40x40", + "filename" : "Icon-29.0@2x.png", "scale" : "2x" }, { + "size" : "29x29", "idiom" : "iphone", - "size" : "40x40", + "filename" : "Icon-29.0@3x.png", "scale" : "3x" }, { + "size" : "40x40", "idiom" : "iphone", - "size" : "60x60", + "filename" : "Icon-40.0@2x.png", "scale" : "2x" }, { + "size" : "40x40", "idiom" : "iphone", + "filename" : "Icon-40.0@3x.png", + "scale" : "3x" + }, + { "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60.0@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60.0@3x.png", "scale" : "3x" }, { "idiom" : "ipad", - "size" : "29x29", + "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", - "size" : "29x29", + "size" : "20x20", "scale" : "2x" }, { + "size" : "29x29", "idiom" : "ipad", - "size" : "40x40", + "filename" : "Icon-29.0@1x.png", "scale" : "1x" }, { + "size" : "29x29", "idiom" : "ipad", - "size" : "40x40", + "filename" : "Icon-29.0@2x.png", "scale" : "2x" }, { + "size" : "40x40", "idiom" : "ipad", - "size" : "76x76", + "filename" : "Icon-40.0@1x.png", "scale" : "1x" }, { + "size" : "40x40", "idiom" : "ipad", - "size" : "76x76", + "filename" : "Icon-40.0@2x.png", "scale" : "2x" }, { + "size" : "76x76", "idiom" : "ipad", + "filename" : "Icon-76.0@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.0@2x.png", + "scale" : "2x" + }, + { "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-83.5@2x.png", "scale" : "2x" } ], diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@1x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@1x.png new file mode 100644 index 0000000..dd9c543 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@1x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@2x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@2x.png new file mode 100644 index 0000000..00295c3 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@2x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@3x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@3x.png new file mode 100644 index 0000000..058cc77 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-29.0@3x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@1x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@1x.png new file mode 100644 index 0000000..0028728 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@1x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@2x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@2x.png new file mode 100644 index 0000000..4fac51c Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@2x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@3x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@3x.png new file mode 100644 index 0000000..2d846f6 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-40.0@3x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@2x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@2x.png new file mode 100644 index 0000000..2d846f6 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@2x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@3x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@3x.png new file mode 100644 index 0000000..ed22215 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-60.0@3x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@1x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@1x.png new file mode 100644 index 0000000..6c369f9 Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@1x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@2x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@2x.png new file mode 100644 index 0000000..d1436db Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-76.0@2x.png differ diff --git a/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png new file mode 100644 index 0000000..77d382f Binary files /dev/null and b/BABaseProject/Assets.xcassets/AppIcon.appiconset/Icon-83.5@2x.png differ diff --git a/BABaseProject/Assets.xcassets/Contents.json b/BABaseProject/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/Contents.json b/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/Contents.json old mode 100755 new mode 100644 diff --git a/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/nav-back@2x.png b/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/nav-back@2x.png old mode 100755 new mode 100644 diff --git a/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/nav-back@3x.PNG b/BABaseProject/Assets.xcassets/NavigationBar/nav-back.imageset/nav-back@3x.PNG old mode 100755 new mode 100644 diff --git a/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/Contents.json b/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/Contents.json old mode 100755 new mode 100644 index 2cf5504..17b3bd3 --- a/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/Contents.json +++ b/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/Contents.json @@ -6,13 +6,13 @@ }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "navigationbar_back@2x.png" + "filename" : "navigationbar_back@2x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "navigationbar_back@3x.png" + "filename" : "navigationbar_back@3x.png", + "scale" : "3x" } ], "info" : { diff --git a/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/navigationbar_back@2x.png b/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/navigationbar_back@2x.png old mode 100755 new mode 100644 diff --git a/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/navigationbar_back@3x.png b/BABaseProject/Assets.xcassets/NavigationBar/navigationbar_back.imageset/navigationbar_back@3x.png old mode 100755 new mode 100644 diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/Contents.json b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/Contents.json new file mode 100644 index 0000000..d2294e6 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "hot_share_p@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "hot_share_p@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@2x.png b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@2x.png new file mode 100644 index 0000000..ce18b8e Binary files /dev/null and b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@2x.png differ diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@3x.png b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@3x.png new file mode 100644 index 0000000..92ac4ed Binary files /dev/null and b/BABaseProject/Assets.xcassets/Pictures/hot_share_p.imageset/hot_share_p@3x.png differ diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/Contents.json b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/Contents.json new file mode 100644 index 0000000..af1aab6 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "hot_support_p@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "hot_support_p@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@2x.png b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@2x.png new file mode 100644 index 0000000..1ad5600 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@2x.png differ diff --git a/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@3x.png b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@3x.png new file mode 100644 index 0000000..09cfaa3 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Pictures/hot_support_p.imageset/hot_support_p@3x.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom1.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom1.imageset/Contents.json new file mode 100644 index 0000000..41ca48a --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom1.imageset/tom1.png b/BABaseProject/Assets.xcassets/Tom/tom1.imageset/tom1.png new file mode 100644 index 0000000..1984297 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom1.imageset/tom1.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom2.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom2.imageset/Contents.json new file mode 100644 index 0000000..2f31400 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom2.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom2.imageset/tom2.png b/BABaseProject/Assets.xcassets/Tom/tom2.imageset/tom2.png new file mode 100644 index 0000000..15379ce Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom2.imageset/tom2.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom3.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom3.imageset/Contents.json new file mode 100644 index 0000000..af6c66a --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom3.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom3.imageset/tom3.png b/BABaseProject/Assets.xcassets/Tom/tom3.imageset/tom3.png new file mode 100644 index 0000000..e9f6576 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom3.imageset/tom3.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom4.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom4.imageset/Contents.json new file mode 100644 index 0000000..58c812d --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom4.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom4.imageset/tom4.png b/BABaseProject/Assets.xcassets/Tom/tom4.imageset/tom4.png new file mode 100644 index 0000000..9494147 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom4.imageset/tom4.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom5.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom5.imageset/Contents.json new file mode 100644 index 0000000..7d5d3d2 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom5.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom5-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom5.imageset/tom5-1.png b/BABaseProject/Assets.xcassets/Tom/tom5.imageset/tom5-1.png new file mode 100644 index 0000000..efe0290 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom5.imageset/tom5-1.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom6.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom6.imageset/Contents.json new file mode 100644 index 0000000..c92b959 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom6.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom6.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom6.imageset/tom6.png b/BABaseProject/Assets.xcassets/Tom/tom6.imageset/tom6.png new file mode 100644 index 0000000..90daf52 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom6.imageset/tom6.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom7.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom7.imageset/Contents.json new file mode 100644 index 0000000..3ce7ab3 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom7.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "animation7.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom7.imageset/animation7.png b/BABaseProject/Assets.xcassets/Tom/tom7.imageset/animation7.png new file mode 100644 index 0000000..bd9f4d7 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom7.imageset/animation7.png differ diff --git a/BABaseProject/Assets.xcassets/Tom/tom8.imageset/Contents.json b/BABaseProject/Assets.xcassets/Tom/tom8.imageset/Contents.json new file mode 100644 index 0000000..9dfb517 --- /dev/null +++ b/BABaseProject/Assets.xcassets/Tom/tom8.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "tom8-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/BABaseProject/Assets.xcassets/Tom/tom8.imageset/tom8-1.png b/BABaseProject/Assets.xcassets/Tom/tom8.imageset/tom8-1.png new file mode 100644 index 0000000..d224598 Binary files /dev/null and b/BABaseProject/Assets.xcassets/Tom/tom8.imageset/tom8-1.png differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/Contents.json" new file mode 100644 index 0000000..da4a164 --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/Contents.json" @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/Contents.json" new file mode 100644 index 0000000..b4ff5ee --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "client@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "client@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@2x.png" new file mode 100644 index 0000000..107e563 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@3x.png" new file mode 100644 index 0000000..4845f07 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/client.imageset/client@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/Contents.json" new file mode 100644 index 0000000..e94ca1b --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "distance@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "distance@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@2x.png" new file mode 100644 index 0000000..33ebe9b Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@3x.png" new file mode 100644 index 0000000..f2e3d7c Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/distance.imageset/distance@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/Contents.json" new file mode 100644 index 0000000..677ff4d --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "locate@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "locate@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@2x.png" new file mode 100644 index 0000000..ef4e384 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@3x.png" new file mode 100644 index 0000000..d7dd917 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/locate.imageset/locate@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/Contents.json" new file mode 100644 index 0000000..e94ca1b --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "distance@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "distance@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@2x.png" new file mode 100644 index 0000000..33ebe9b Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@3x.png" new file mode 100644 index 0000000..f2e3d7c Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_distance.imageset/distance@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/Contents.json" new file mode 100644 index 0000000..e6b0dc8 --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "search@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "search@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@2x.png" new file mode 100644 index 0000000..0e534ed Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@3x.png" new file mode 100644 index 0000000..d17f387 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_search.imageset/search@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/Contents.json" new file mode 100644 index 0000000..0816264 --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "voice@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "voice@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@2x.png" new file mode 100644 index 0000000..3183fd0 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@3x.png" new file mode 100644 index 0000000..66afb46 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/map_voice.imageset/voice@3x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/Contents.json" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/Contents.json" new file mode 100644 index 0000000..d7ca900 --- /dev/null +++ "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/Contents.json" @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "定位@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "定位@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@2x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@2x.png" new file mode 100644 index 0000000..4057761 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@2x.png" differ diff --git "a/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@3x.png" "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@3x.png" new file mode 100644 index 0000000..5f44698 Binary files /dev/null and "b/BABaseProject/Assets.xcassets/\345\221\250\350\276\271/\345\256\232\344\275\215.imageset/\345\256\232\344\275\215@3x.png" differ diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.h" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.h" index 657a841..7de9798 100755 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.h" +++ "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.h" @@ -63,14 +63,25 @@ //#pragma mark - ***** 设置navi - +@class BATabBarButton; @interface BABaseViewController : UIViewController @property (nonatomic, strong) UIColor *vcBgColor; +@property (nonatomic, strong) BATabBarButton *TabBarbutton; + + #pragma mark - ***** 显示自定义加载框 + +/*! + * 三个球 自定义加载动画 + * + * @param isShow yes:显示,no:隐藏 + */ +- (void)ba_showBallLoadingView:(BOOL)isShow; + /*! * 显示雪花加载框 * @@ -92,93 +103,6 @@ */ - (void)ba_netUse4Gnet; -#pragma mark - ***** app跳转到系统的各种基本设置选项 -/*! - * 跳转系统通知 - */ -- (void)ba_gotoSystermSettings; - -/*! - * 跳到WIFI界面 - */ -- (void)ba_gotoSystermWIFISettings; - -/*! - * 跳到About关于本机界面 - */ -- (void)ba_gotoSystermAboutSettings; - -/*! - * 跳到Accessibility辅助功能界面 - */ -- (void)ba_gotoSystermAccessibilitySettings; - -/*! - * 跳到AirplaneModeOn飞行模式界面 - */ -- (void)ba_gotoSystermAirplaneModeOnSettings; - -/*! - * 跳到Auto-Lock自动锁屏时间界面 - */ -- (void)ba_gotoSystermAutoLockSettings; - -/*! - * 跳到Brightness自动锁定界面 - */ -- (void)ba_gotoSystermBrightnessSettings; - -/*! - * 跳到MICROPHONE麦克风界面 - */ -- (void)ba_gotoSystermMICROPHONESettings; - -/*! - * 跳到CONTACTS通讯录界面 - */ -- (void)ba_gotoSystermCONTACTSSettings; - -/*! - * 跳到Bluetooth蓝牙界面 - */ -- (void)ba_gotoSystermBluetoothSettings; - -/*! - * 跳到DATE_AND_TIME日期和时间界面 - */ -- (void)ba_gotoSystermDATE_AND_TIMESettings; - -/*! - * 跳到FaceTime界面 - */ -- (void)ba_gotoSystermFaceTimeSettings; - -/*! - * 跳到General界面 - */ -- (void)ba_gotoSystermGeneralSettings; - -/*! - * 跳到Keyboard界面 - */ -- (void)ba_gotoSystermKeyboardSettings; - -/*! - * 跳到iCloud界面 - */ -- (void)ba_gotoSystermiCloudSettings; - - -/*! - * 跳转Safari浏览器 - * - * @param url 需要用Safari打开的url - */ -- (void)ba_gotoSafariBrowserWithURL:(NSString *)url; - - - - #pragma mark - ***** VC的基本设置 /*! * 设置VC的背景颜色 diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.m" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.m" index ee39709..1d2f737 100755 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.m" +++ "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BABaseViewController.m" @@ -61,14 +61,15 @@ #import "BABaseViewController.h" #import "BANavigationBar.h" -// GIF动画 -#import "BAGIFImageView.h" #import "BASnowView.h" // 更新 + 变黑 #import "BAUpdatingView.h" #import "BAFadeBlackView.h" +#import "RDVTabBarController.h" + + @interface BABaseViewController () @@ -84,6 +85,7 @@ @interface BABaseViewController () @property (strong, nonatomic) BAFadeBlackView *fadeBlackView; @property (strong, nonatomic) BAUpdatingView *upDatingView; +@property (nonatomic, strong) BALoadingHubView *loadingHubView; @end @@ -91,17 +93,16 @@ @implementation BABaseViewController -- (void)viewWillAppear:(BOOL)animated -{ +- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; -// [self.navigationController setNavigationBarHidden:NO animated:YES]; + [[self rdv_tabBarController] setTabBarHidden:YES animated:YES]; } -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; +- (void)viewWillDisappear:(BOOL)animated { + [[self rdv_tabBarController] setTabBarHidden:NO animated:YES]; + [super viewWillDisappear:animated]; } - (void)viewDidLoad { @@ -127,7 +128,7 @@ - (void)ba_setupUI - (void)setupBase { - self.view.backgroundColor = BA_White_Color; + self.view.backgroundColor = BAKit_Color_White; } @@ -337,7 +338,7 @@ - (void)ba_networkChangeWith:(UIViewController *)viewController AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; // 2.设置网络状态改变后的处理 - BA_Weak; + BA_WEAKSELF; [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { // 当网络状态改变了, 就会调用这个block @@ -359,7 +360,7 @@ - (void)ba_networkChangeWith:(UIViewController *)viewController } if (index == 1) { - [weakSelf ba_gotoSystermSettings]; + [[BASystermSetting ba_systermSettingManage] ba_gotoSystermSettings]; } }]; break; @@ -400,222 +401,6 @@ - (void)ba_netUse4Gnet BALog(@"使用3G/4G网络情况处理方法调用!"); } -#pragma mark - ***** app跳转到系统的各种基本设置选项 -/*! - * 跳转系统通知 - */ -- (void)ba_gotoSystermSettings -{ - NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { -// [[UIApplication sharedApplication] openURL:url]; - BA_OpenUrl(UIApplicationOpenSettingsURLString); - } -} - -/*! - * 跳到WIFI界面 - */ -- (void)ba_gotoSystermWIFISettings -{ - /*! - (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 - */ - NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=WIFI"); - } -} - -/*! - * 跳到About关于本机界面 - */ -- (void)ba_gotoSystermAboutSettings -{ - /*! - (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 - */ - NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=About"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General&path=About"); - } -} - -/*! - * 跳到Accessibility辅助功能界面 - */ -- (void)ba_gotoSystermAccessibilitySettings -{ - /*! - (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 - */ - NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=ACCESSIBILITY"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General&path=ACCESSIBILITY"); - } -} - -/*! - * 跳到AirplaneModeOn飞行模式界面 - */ -- (void)ba_gotoSystermAirplaneModeOnSettings -{ - /*! - (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 - */ - NSURL *url = [NSURL URLWithString:@"prefs:root=AIRPLANE_MODE"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=AIRPLANE_MODE"); - } -} - -/*! - * 跳到Auto-Lock自动锁屏时间界面 - */ -- (void)ba_gotoSystermAutoLockSettings -{ - /*! - (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 - */ - NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=AUTOLOCK"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General&path=AUTOLOCK"); - } -} - -/*! - * 跳到Brightness自动锁定界面 - */ -- (void)ba_gotoSystermBrightnessSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=Brightness"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=Brightness"); - } -} - -/*! - * 跳到MICROPHONE麦克风界面 - */ -- (void)ba_gotoSystermMICROPHONESettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy&path=MICROPHONE"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=Privacy&path=MICROPHONE"); - } -} - -/*! - * 跳到CONTACTS通讯录界面 - */ -- (void)ba_gotoSystermCONTACTSSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy&path=CONTACTS"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=Privacy&path=CONTACTS"); - } -} - -/*! - * 跳到Bluetooth蓝牙界面 - */ -- (void)ba_gotoSystermBluetoothSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=Bluetooth"); - } -} - -/*! - * 跳到DATE_AND_TIME日期和时间界面 - */ -- (void)ba_gotoSystermDATE_AND_TIMESettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=DATE_AND_TIME"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General&path=DATE_AND_TIME"); - } -} - -/*! - * 跳到FaceTime界面 - */ -- (void)ba_gotoSystermFaceTimeSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=FACETIME"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=FACETIME"); - } -} - -/*! - * 跳到General界面 - */ -- (void)ba_gotoSystermGeneralSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=General"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General"); - } -} - -/*! - * 跳到Keyboard界面 - */ -- (void)ba_gotoSystermKeyboardSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=Keyboard"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=General&path=Keyboard"); - } -} - -/*! - * 跳到iCloud界面 - */ -- (void)ba_gotoSystermiCloudSettings -{ - NSURL *url = [NSURL URLWithString:@"prefs:root=CASTLE"]; - if ([[UIApplication sharedApplication] canOpenURL:url]) - { - BA_OpenUrl(@"prefs:root=CASTLE"); - } -} - - -/*! - * 跳转Safari浏览器 - */ -- (void)ba_gotoSafariBrowserWithURL:(NSString *)url -{ - if ([BARegularExpression ba_isUrl:url]) - { - /*! 跳转系统通知 */ - BA_OpenUrl(url); - } - else - { - [self.view ba_showAlertView:@"温馨提示:" message:@"url错误,请重新输入!"]; - } - -} - - #pragma mark - ***** 其他设置 /*! @@ -634,6 +419,24 @@ - (void)ba_setNavbarBackgroundHidden:(BOOL)hidden } #pragma mark - ***** 各种动画开关 + +/*! 三个球 自定义加载动画 */ +- (void)ba_showBallLoadingView:(BOOL)isShow +{ + if (isShow) + { + _loadingHubView = [[BALoadingHubView alloc] initWithFrame:CGRectMake(85, 80, 150, 150)]; + _loadingHubView.center = self.view.center; +// _loadingHubView = [[BALoadingHubView alloc] initWithFrame:CGRectMake(85, 80, 150, 150)]; + [self.view addSubview:_loadingHubView]; + [_loadingHubView showHub]; + } + else + { + [_loadingHubView dismissHub]; + } +} + /*! * 开启樱花动画 */ @@ -871,22 +674,6 @@ - (void)ba_starYanHuaCoreAnimation [self.view.layer addSublayer:fireworksEmitter]; } -/*! - * gif动画 - * - * @param gifImageName gifImageName - * @param imgFrame imgFrame - */ -- (void)ba_useGIFImageViewWithGifImageName:(NSString *)gifImageName frame:(CGRect)imgFrame -{ - BAGIFImageView *GIFimgView = [BAGIFImageView new]; - GIFimgView.frame = imgFrame; - [self.view addSubview:GIFimgView]; - // gifImageName = @"xia.gif"; - GIFimgView.gifPath = [[NSBundle mainBundle] pathForResource:gifImageName ofType:nil]; - [GIFimgView startGIF]; -} - /*! love动画 */ - (void)ba_isShowLoveReplicatorLayer:(BOOL)show { diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BANavigationController.m" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BANavigationController.m" index 82ed0a6..3cde09c 100755 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BANavigationController.m" +++ "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BANavigationController.m" @@ -94,14 +94,14 @@ - (void)viewDidLoad { // [bar setBarTintColor:BA_White_Color]; // [bar setTranslucent:NO]; // 半透明 - bar.barTintColor = BA_Red_Color; + bar.barTintColor = BAKit_Color_Red; // 去掉导航分割线 [bar setShadowImage:[UIImage new]]; // 设置导航条按钮的文字颜色 NSMutableDictionary *titleAttr = [NSMutableDictionary dictionary]; - titleAttr[NSForegroundColorAttributeName] = BA_White_Color; + titleAttr[NSForegroundColorAttributeName] = BAKit_Color_White; titleAttr[NSFontAttributeName] = BA_FontSize(18); [bar setTitleTextAttributes:titleAttr]; @@ -148,26 +148,26 @@ - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)ani // 设置导航条的内容 // 设置导航条左边 右边 // 左边 -// viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; + viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"navigationbar_back"] highImage:[UIImage imageNamed:@"navigationbar_back_highlighted"] target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; - UIBarButtonItem *left; - /*! 从这里统一设置四个tabbarVC推出的子VC的navi的返回按钮图片 */ - if ([self.viewControllers.firstObject isKindOfClass:[BAHomeViewController class]]) - { - left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"profileVC.bundle/返回白色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; - } - else if ([self.viewControllers.firstObject isKindOfClass:[BAMessageViewController class]]) - { - left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"otherImages.bundle/返回黄色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; - } - else if ([self.viewControllers.firstObject isKindOfClass:[BADiscoverViewController class]]) - { - left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"otherImages.bundle/返回绿色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; - } - else if ([self.viewControllers.firstObject isKindOfClass:[BAProfileViewController class]]) - { - left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"profileVC.bundle/返回蓝色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; - } +// UIBarButtonItem *left; +// /*! 从这里统一设置四个tabbarVC推出的子VC的navi的返回按钮图片 */ +// if ([self.viewControllers.firstObject isKindOfClass:[BAHomeViewController class]]) +// { +// left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"profileVC.bundle/返回白色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; +// } +// else if ([self.viewControllers.firstObject isKindOfClass:[BAMessageViewController class]]) +// { +// left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"otherImages.bundle/返回黄色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; +// } +// else if ([self.viewControllers.firstObject isKindOfClass:[BADiscoverViewController class]]) +// { +// left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"otherImages.bundle/返回绿色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; +// } +// else if ([self.viewControllers.firstObject isKindOfClass:[BAProfileViewController class]]) +// { +// left = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"profileVC.bundle/返回蓝色"] highImage:nil target:self action:@selector(backToPre) forControlEvents:UIControlEventTouchUpInside]; +// } // 设置导航条的按钮 viewController.navigationItem.leftBarButtonItem = left; diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BAWebViewController.m" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BAWebViewController.m" index a7d5159..838c6c8 100755 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BAWebViewController.m" +++ "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseVC/BAWebViewController.m" @@ -95,7 +95,7 @@ - (UIProgressView *)progressView if (!_progressView) { UIProgressView *progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 0)]; - progressView.tintColor = BA_Orange_Color; + progressView.tintColor = BAKit_Color_Orange; progressView.trackTintColor = [UIColor whiteColor]; [self.view addSubview:progressView]; self.progressView = progressView; @@ -113,7 +113,7 @@ - (void)configUI // self.urlString = @"http://boai.github.io"; - // 网页 + /*! 网页 */ if (IOS8x) { WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds]; wkWebView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; @@ -164,7 +164,7 @@ - (void)configBackItem UIImage *backImage = [UIImage imageNamed:@"navigationbar_back"]; backImage = [backImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIButton *backBtn = [[UIButton alloc] init]; - [backBtn setTintColor:BA_Orange_Color]; + [backBtn setTintColor:BAKit_Color_Orange]; [backBtn setBackgroundImage:backImage forState:UIControlStateNormal]; [backBtn addTarget:self action:@selector(backBtnAction:) forControlEvents:UIControlEventTouchUpInside]; [backBtn sizeToFit]; @@ -179,7 +179,7 @@ - (void)configMenuItem UIImage *menuImage = [UIImage imageNamed:@"navigationbar_more"]; menuImage = [menuImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; UIButton *menuBtn = [[UIButton alloc] init]; - [menuBtn setTintColor:BA_Orange_Color]; + [menuBtn setTintColor:BAKit_Color_Orange]; [menuBtn setImage:menuImage forState:UIControlStateNormal]; [menuBtn addTarget:self action:@selector(menuBtnAction:) forControlEvents:UIControlEventTouchUpInside]; [menuBtn sizeToFit]; @@ -193,7 +193,7 @@ - (void)configColseItem { UIButton *colseBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 44, 44)]; [colseBtn setTitle:@"关闭" forState:UIControlStateNormal]; - [colseBtn setTitleColor:BA_Orange_Color forState:UIControlStateNormal]; + [colseBtn setTitleColor:BAKit_Color_Orange forState:UIControlStateNormal]; [colseBtn addTarget:self action:@selector(colseBtnAction:) forControlEvents:UIControlEventTouchUpInside]; [colseBtn sizeToFit]; @@ -247,7 +247,7 @@ - (void)menuBtnAction:(UIButton *)sender if (index == 1) { /*! safari打开 */ - [self ba_gotoSafariBrowserWithURL:urlStr]; + [[BASystermSetting ba_systermSettingManage] ba_gotoSafariBrowserWithURL:urlStr]; } else if (index == 2) { @@ -261,12 +261,13 @@ - (void)menuBtnAction:(UIButton *)sender } else if (index == 3) { + NSString *shareTitle = @"博爱分享 2.0 版"; NSString *shareUrlSrt = @"http://www.cnblogs.com/boai/"; - NSString *shareText = [NSString stringWithFormat:@"测试(博爱BABaseProject)分享【博爱之家】!详情点击:%@", shareUrlSrt]; + NSString *shareContent = [NSString stringWithFormat:@"测试(博爱BABaseProject)分享【博爱之家】!详情点击:%@", shareUrlSrt]; // 注意:图片不能为空 UIImage *shareImage = [UIImage imageNamed:@"icon1.jpg"]; - [[BAShareManage shareManage] BA_UMshareListWithViewControll:self withShareText:shareText image:shareImage url:shareUrlSrt]; +// [BASHAREMANAGER ba_UMshareListWithViewControll:self title:shareTitle shareContent:shareContent image:shareImage url:shareUrlSrt]; } else if (index == 4) { diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.h" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.h" deleted file mode 100755 index 9c54055..0000000 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.h" +++ /dev/null @@ -1,53 +0,0 @@ -// -// BAGIFImageView.h -// UIImageView-PlayGIF -// -// Created by Yang Fei on 14-3-26. -// Copyright (c) 2014年 yangfei.me. All rights reserved. -// - -/******************************************************* - * Dependencies: - * - QuartzCore.framework - * - ImageIO.framework - * Parameters: - * Pass value to one of them: - * - gifData NSData from a GIF - * - gifPath local path of a GIF - * Usage: - * - startGIF - * - stopGIF - * - isGIFPlaying - * P.S.: - * Need category? Use UIImageView+PlayGIF.h/m - *******************************************************/ - -/******************************************************* - * 依赖: - * - QuartzCore.framework - * - ImageIO.framework - * 参数: - * 以下传参2选1: - * - gifData GIF图片的NSData - * - gifPath GIF图片的本地路径 - * 调用: - * - startGIF 开始播放 - * - stopGIF 结束播放 - * - isGIFPlaying 判断是否正在播放 - * 另外: - * 想用 category?请使用 UIImageView+PlayGIF.h/m - *******************************************************/ - -#import -#import -#import - -@interface BAGIFImageView : UIImageView -@property (nonatomic, strong) NSString *gifPath; -@property (nonatomic, strong) NSData *gifData; - -- (void)startGIF; -- (void)stopGIF; -- (BOOL)isGIFPlaying; - -@end diff --git "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.m" "b/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.m" deleted file mode 100755 index ec93197..0000000 --- "a/BABaseProject/BAMainCode/BABaseData(\345\237\272\347\261\273)/BABaseView/BAGIFImageView.m" +++ /dev/null @@ -1,145 +0,0 @@ -// -// BAGIFImageView.m -// UIImageView-PlayGIF -// -// Created by Yang Fei on 14-3-26. -// Copyright (c) 2014年 yangfei.me. All rights reserved. -// - -/**********************************************************************/ -#import -#import "BAGIFImageView.h" - -@interface BAGIFManager : NSObject -@property (nonatomic, strong) CADisplayLink *displayLink; -@property (nonatomic, strong) NSHashTable *gifViewHashTable; - -+ (BAGIFManager *)shared; -- (void)stopGIFView:(BAGIFImageView *)view; - -@end - -@implementation BAGIFManager - -+ (BAGIFManager *)shared{ - static BAGIFManager *_sharedInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - _sharedInstance = [[BAGIFManager alloc] init]; - }); - return _sharedInstance; -} -- (id)init{ - self = [super init]; - if (self) { - _gifViewHashTable = [NSHashTable hashTableWithOptions:NSHashTableWeakMemory]; - } - return self; -} -- (void)play{ - for (BAGIFImageView *imageView in _gifViewHashTable) { - [imageView performSelector:@selector(play)]; - } -} -- (void)stopDisplayLink{ - if (self.displayLink) { - [self.displayLink invalidate]; - self.displayLink = nil; - } -} -- (void)stopGIFView:(BAGIFImageView *)view{ - [_gifViewHashTable removeObject:view]; - if (_gifViewHashTable.count<1 && !_displayLink) { - [self stopDisplayLink]; - } -} -@end -/**********************************************************************/ - -#import "BAGIFImageView.h" - -@interface BAGIFImageView(){ - size_t _index; - size_t _frameCount; - float _timestamp; - CGImageSourceRef _gifSourceRef; -} -@end - -@implementation BAGIFImageView - -- (void)removeFromSuperview{ - [super removeFromSuperview]; - [self stopGIF]; -} - -- (void)startGIF{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ - if (![[BAGIFManager shared].gifViewHashTable containsObject:self]) { - if ((self.gifData || self.gifPath)) { - CGImageSourceRef gifSourceRef; - if (self.gifData) { - gifSourceRef = CGImageSourceCreateWithData((__bridge CFDataRef)(self.gifData), NULL); - }else{ - gifSourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)[NSURL fileURLWithPath:self.gifPath], NULL); - } - if (!gifSourceRef) { - return; - } - dispatch_async(dispatch_get_main_queue(), ^{ - [[BAGIFManager shared].gifViewHashTable addObject:self]; - _gifSourceRef = gifSourceRef; - _frameCount = CGImageSourceGetCount(gifSourceRef); - }); - } - } - }); - if (![BAGIFManager shared].displayLink) { - [BAGIFManager shared].displayLink = [CADisplayLink displayLinkWithTarget:[BAGIFManager shared] selector:@selector(play)]; - [[BAGIFManager shared].displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; - } -} - -- (void)stopGIF{ - if (_gifSourceRef) { - CFRelease(_gifSourceRef); - _gifSourceRef = nil; - } - [[BAGIFManager shared] stopGIFView:self]; -} - -- (void)play{ - float nextFrameDuration = [self frameDurationAtIndex:MIN(_index+1, _frameCount-1)]; - if (_timestamp < nextFrameDuration) { - _timestamp += [BAGIFManager shared].displayLink.duration; - return; - } - _index ++; - _index = _index%_frameCount; - CGImageRef ref = CGImageSourceCreateImageAtIndex(_gifSourceRef, _index, NULL); - self.layer.contents = (__bridge id)(ref); - CGImageRelease(ref); - _timestamp = 0; -} - -- (BOOL)isGIFPlaying{ - return _gifSourceRef?YES:NO; -} - -- (float)frameDurationAtIndex:(size_t)index{ - CFDictionaryRef dictRef = CGImageSourceCopyPropertiesAtIndex(_gifSourceRef, index, NULL); - NSDictionary *dict = (__bridge NSDictionary *)dictRef; - NSDictionary *gifDict = (dict[(NSString *)kCGImagePropertyGIFDictionary]); - NSNumber *unclampedDelayTime = gifDict[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; - NSNumber *delayTime = gifDict[(NSString *)kCGImagePropertyGIFDelayTime]; - CFRelease(dictRef); - if (unclampedDelayTime.floatValue) { - return unclampedDelayTime.floatValue; - }else if (delayTime.floatValue) { - return delayTime.floatValue; - }else{ - return 1/24.0; - } -} - -@end diff --git "a/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.h" "b/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.h" index 760b2df..5336d10 100755 --- "a/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.h" +++ "b/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.h" @@ -6,8 +6,8 @@ // Copyright © 2016年 博爱之家. All rights reserved. // -#import "BABaseViewController.h" +#import "BADiscoverViewController.h" -@interface BADiscoverViewController : BABaseViewController +@interface BADiscoverViewController : UIViewController @end diff --git "a/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.m" "b/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.m" index b587017..16f16cd 100755 --- "a/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.m" +++ "b/BABaseProject/BAMainCode/BACode/Discover(\345\217\221\347\216\260)/Controller/BADiscoverViewController.m" @@ -28,7 +28,7 @@ - (void)viewDidLoad { // Do any additional setup after loading the view. self.title = @"发 现"; - self.vcBgColor = BA_Green_Color; + self.view.backgroundColor = BAKit_Color_Green; [self test]; } diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.h" index 100d6eb..f82ba9e 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.h" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.h" @@ -58,8 +58,8 @@ */ -#import "BABaseViewController.h" +#import "BAHomeViewController.h" -@interface BAHomeViewController : BABaseViewController +@interface BAHomeViewController : UIViewController @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.m" index 0b84d93..0b121b8 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Controller/BAHomeViewController.m" @@ -103,7 +103,7 @@ - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - self.vcBgColor = BA_White_Color; + self.view.backgroundColor = BAKit_Color_White; /*! 设置CGRectZero从导航栏下开始计算 */ if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { @@ -112,7 +112,7 @@ - (void)viewDidLoad { // [self setupNavi]; // 判断网络 - [self ba_networkChangeWith:self]; +// [self ba_networkChangeWith:self]; [BAFPSLabel showInWindow:[UIApplication sharedApplication].keyWindow]; @@ -155,11 +155,11 @@ - (HMSegmentedControl *)segmentedControl /*! 标题背景颜色 */ _segmentedControl.backgroundColor = [UIColor clearColor]; /*! 标题默认字体颜色 */ - _segmentedControl.titleTextAttributes = @{NSForegroundColorAttributeName : BA_LightGray_Color, NSFontAttributeName: BA_FontSize(16)}; + _segmentedControl.titleTextAttributes = @{NSForegroundColorAttributeName : BAKit_Color_LightGray, NSFontAttributeName: BA_FontSize(16)}; /*! 标题选中字体颜色 */ - _segmentedControl.selectedTitleTextAttributes = @{NSForegroundColorAttributeName : BA_White_Color, NSFontAttributeName: BA_FontSize(18)}; + _segmentedControl.selectedTitleTextAttributes = @{NSForegroundColorAttributeName : BAKit_Color_White, NSFontAttributeName: BA_FontSize(18)}; /*! 标题选中的下划线的颜色 */ - _segmentedControl.selectionIndicatorColor = BA_Green_Color; + _segmentedControl.selectionIndicatorColor = BAKit_Color_Green; /*! 标题选中的下划线的高度 */ _segmentedControl.selectionIndicatorHeight = 2.0f; /*! 标题选中的样式:本样式为下划线 */ @@ -169,14 +169,14 @@ - (HMSegmentedControl *)segmentedControl /*! 标题的中间的隔线:默认为:NO */ _segmentedControl.verticalDividerEnabled = YES; /*! 标题的中间的隔线颜色 */ - _segmentedControl.verticalDividerColor = BA_LightGray_Color; + _segmentedControl.verticalDividerColor = BAKit_Color_LightGray; /*! 标题的中间的隔线宽度 */ _segmentedControl.verticalDividerWidth = 1.0f; // [self.view addSubview:_segmentedControl]; /*! 标题点击事件 */ - BA_Weak; + BA_WEAKSELF; [_segmentedControl setIndexChangeBlock:^(NSInteger index) { [weakSelf.scrollView scrollRectToVisible:CGRectMake(BA_SCREEN_WIDTH * index, 0, BA_SCREEN_WIDTH, weakSelf.scrollView.height) animated:YES]; }]; @@ -197,7 +197,7 @@ - (UIScrollView *)scrollView self.scrollView.bounces = NO; self.scrollView.contentSize = CGSizeMake(BA_SCREEN_WIDTH * (_segmentedControl.sectionTitles.count), self.scrollView.frame.size.height); self.scrollView.delegate = self; - self.scrollView.backgroundColor = BA_Green_Color; + self.scrollView.backgroundColor = BAKit_Color_Green; [self.scrollView scrollRectToVisible:CGRectMake(0, 0, BA_SCREEN_WIDTH, self.scrollView.frame.size.height) animated:NO]; [self.view addSubview:self.scrollView]; diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC1/DemoVC1.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC1/DemoVC1.m" index b25efff..cc23724 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC1/DemoVC1.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC1/DemoVC1.m" @@ -38,21 +38,26 @@ - (void)viewWillDisappear:(BOOL)animated - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - self.vcBgColor = BA_Yellow_Color; + self.vcBgColor = BAKit_Color_Yellow; [self getData]; } - (void)getData { - [self BA_showAlert:BA_Loading]; +// [self BA_showAlert:BA_Loading]; + BA_WEAKSELF; +// BA_WeakSelf(self); + [self ba_showBallLoadingView:YES]; [BANewsNetManager getVideosWithStartIndex:1 completionHandle:^(id model, NSError *error) { - [self BA_hideProgress]; +// [weakSelf BA_hideProgress]; +// [weakSelf ba_showBallLoadingView:NO]; + if (!error) { BALog(@"model: %@", model); - [self BA_showAlertWithTitle:@"数据解析成功!请查看!"]; + [weakSelf BA_showAlertWithTitle:@"数据解析成功!请查看!"]; } else { diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10.m" index c626d34..5b37624 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10.m" @@ -30,7 +30,7 @@ - (void)viewDidLoad self.title = NSLocalizedString(@"DemoVC10Title", nil); - self.vcBgColor = BA_Yellow_Color; + self.vcBgColor = BAKit_Color_Yellow; self.collectionView.hidden = NO; self.editButton.hidden = NO; @@ -42,7 +42,7 @@ - (UIButton *)editButton if (!_editButton) { _editButton = [[UIButton alloc] init]; - [_editButton setTintColor:BA_Orange_Color]; + [_editButton setTintColor:BAKit_Color_Orange]; [_editButton setTitle:@"编辑" forState:UIControlStateNormal]; [_editButton addTarget:self action:@selector(editButtonAction:) forControlEvents:UIControlEventTouchUpInside]; [_editButton sizeToFit]; @@ -79,7 +79,7 @@ - (IBAction)editButtonAction:(UIButton *)sender #pragma mark - ***** setter / getter - (DemoVC10_CollectionView *)collectionView { - BA_Weak; + BA_WEAKSELF; if (!_collectionView) { _collectionView = [[DemoVC10_CollectionView alloc] initWithFrame:CGRectZero withblock:^(UICollectionView *collection, NSIndexPath *indexPath, NSArray *dataArray) { diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10Cell.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10Cell.m" index 5828e25..a701e22 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10Cell.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10Cell.m" @@ -38,7 +38,7 @@ - (UIImageView *)imageView if (!_imageView) { _imageView = [UIImageView new]; - _imageView.frame = CGRectMake(0, 0, (SCREEN_WIDTH - 30)/2, (SCREEN_WIDTH - 60)/2); + _imageView.frame = CGRectMake(0, 0, (BA_SCREEN_WIDTH - 30)/2, (BA_SCREEN_WIDTH - 60)/2); _imageView.userInteractionEnabled = YES; [self.contentView addSubview:self.imageView]; } @@ -50,7 +50,7 @@ - (UILabel *)descLabel if (!_descLabel) { _descLabel = [UILabel new]; - _descLabel.frame = CGRectMake(0, (SCREEN_WIDTH - 60)/2, (SCREEN_WIDTH - 30)/2, 20); + _descLabel.frame = CGRectMake(0, (BA_SCREEN_WIDTH - 60)/2, (BA_SCREEN_WIDTH - 30)/2, 20); _descLabel.textColor = [UIColor blackColor]; _descLabel.textAlignment = NSTextAlignmentCenter; @@ -63,7 +63,7 @@ - (UIButton *)deleteButton { if (!_deleteButton) { - _deleteButton = [[UIButton alloc] initWithFrame:CGRectMake((SCREEN_WIDTH - 30)/2 - 35, 5, 30, 30)]; + _deleteButton = [[UIButton alloc] initWithFrame:CGRectMake((BA_SCREEN_WIDTH - 30)/2 - 35, 5, 30, 30)]; [self.deleteButton setImage:[UIImage imageNamed:@"BACollectionView.bundle/close.png"] forState:UIControlStateNormal]; /*! 先设置不可见 */ [self.deleteButton setHidden:YES]; diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10_CollectionView.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10_CollectionView.m" index e0250ac..e6dbe76 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10_CollectionView.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC10/DemoVC10_CollectionView.m" @@ -201,7 +201,7 @@ - (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICol static CGFloat initialDelay = 0.2f; static CGFloat stutter = 0.06f; - cell.contentView.transform = CGAffineTransformMakeTranslation(SCREEN_WIDTH, 0); + cell.contentView.transform = CGAffineTransformMakeTranslation(BA_SCREEN_WIDTH, 0); [UIView animateWithDuration:1.0f delay:initialDelay + ((indexPath.row) * stutter) usingSpringWithDamping:0.6 initialSpringVelocity:0 options:0 animations:^{ cell.contentView.transform = CGAffineTransformIdentity; @@ -240,7 +240,7 @@ - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UIColl - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - return CGSizeMake((SCREEN_WIDTH - 30)/2, (SCREEN_WIDTH - 60)/2 + 20); + return CGSizeMake((BA_SCREEN_WIDTH - 30)/2, (BA_SCREEN_WIDTH - 60)/2 + 20); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC11/DemoVC11.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC11/DemoVC11.m" index aad6282..3f09443 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC11/DemoVC11.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC11/DemoVC11.m" @@ -62,7 +62,7 @@ - (UICollectionView *)collectionView _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; - _collectionView.backgroundColor = BA_Yellow_Color; + _collectionView.backgroundColor = BAKit_Color_Yellow; _collectionView.delegate = self; _collectionView.dataSource = self; @@ -89,7 +89,7 @@ - (NSMutableArray *)dataArray #pragma mark - ***** 添加上下拉刷新 - (void)setupRefreshView { - BA_Weak; + BA_WEAKSELF; // 设置回调(一旦进入刷新状态就会调用这个refreshingBlock) // [self.collectionView addHeaderRefresh:^{ [self loadNewData]; @@ -101,6 +101,8 @@ - (void)setupRefreshView [self.collectionView addFooterRefresh:^{ [weakSelf loadMoreData]; }]; + + self.collectionView.mj_footer.automaticallyHidden = true; } - (void)loadNewData @@ -128,14 +130,16 @@ - (void)getDataWithHead:(BOOL)isHead } } - NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@(page), @"page", @"", @"per_page", nil];; + NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@(page).stringValue, @"page", @"", @"per_page", nil];; - BA_Weak; - [self BA_showAlert:BA_Loading]; + BA_WEAKSELF; +// [self BA_showAlert:BA_Loading]; + [self ba_showBallLoadingView:YES]; [BANewsNetManager postDemoVC11DataWithParameters:parameters completionHandle:^(id model, NSError *error) { - [weakSelf BA_hideProgress]; - +// [weakSelf BA_hideProgress]; + [weakSelf ba_showBallLoadingView:NO]; + if (isHead) { [weakSelf.collectionView.mj_header endRefreshing]; @@ -168,11 +172,11 @@ - (void)getDataWithHead:(BOOL)isHead { if (page > 1) { - [(MJRefreshAutoGifFooter *)weakSelf.collectionView.mj_footer setTitle:@"空空如也" forState:MJRefreshStateIdle]; +// [(MJRefreshAutoGifFooter *)weakSelf.collectionView.mj_footer setTitle:@"空空如也" forState:MJRefreshStateIdle]; } else { - [(MJRefreshAutoGifFooter *)weakSelf.collectionView.mj_footer setTitle:@"" forState:MJRefreshStateIdle]; +// [(MJRefreshAutoGifFooter *)weakSelf.collectionView.mj_footer setTitle:@"" forState:MJRefreshStateIdle]; } } } @@ -194,15 +198,16 @@ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cell DemoVC11_Cell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:DemoVC11_cellID forIndexPath:indexPath]; DemoVC11_model *model = self.dataArray[indexPath.row]; cell.model = model; - cell.backgroundColor = BA_Green_Color; + cell.backgroundColor = BAKit_Color_Green; - if ([NSString BA_NSStringIsNULL:cell.model.desc]) + if (![cell.model.desc ba_stringIsNotBlank]) { cell.titleLabel.text = @(indexPath.item).stringValue; } else + { cell.titleLabel.text = cell.model.desc; - + } return cell; } diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/123.png" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/123.png" new file mode 100644 index 0000000..0e76387 Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/123.png" differ diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.h" new file mode 100644 index 0000000..0b22568 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.h" @@ -0,0 +1,17 @@ +// +// CustomView.h +// BAAlert +// +// Created by boai on 2017/5/12. +// Copyright © 2017年 boai. All rights reserved. +// + +#import + +typedef void (^HandleButtonActionBlock)(NSInteger index); + +@interface CustomView : UIView + +@property(nonatomic, copy) HandleButtonActionBlock block; + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.m" new file mode 100644 index 0000000..c73d6a4 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/CustomView.m" @@ -0,0 +1,230 @@ +// +// CustomView.m +// BAAlert +// +// Created by boai on 2017/5/12. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "CustomView.h" +#import "BAAlert_OC.h" + +@interface CustomView () + +@property (nonatomic, strong) UIView *viewPwdBgView; +@property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) UIView *lineView1; +@property (nonatomic, strong) UITextField *pwdTextField; +@property (nonatomic, strong) UIView *lineView2; +@property (nonatomic, strong) UIButton *cancleButton; +@property (nonatomic, strong) UIButton *sureButton; + +@property(nonatomic, strong) BAAlert *alert; + +@end + +@implementation CustomView + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self setupUI]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupUI]; + } + return self; +} + +- (void)setupUI +{ + self.viewPwdBgView.backgroundColor = [UIColor whiteColor]; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + self.viewPwdBgView.frame = self.bounds; + + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + CGFloat button_h = 40; + CGFloat view_w = CGRectGetWidth(self.viewPwdBgView.frame); + + min_w = view_w; + min_h = button_h; + self.titleLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_y = CGRectGetMaxY(self.titleLabel.frame); + min_h = 1; + self.lineView1.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = 50; + min_y = CGRectGetMaxY(self.lineView1.frame) + 20; + min_w = view_w - 50 * 2; + min_h = button_h; + self.pwdTextField.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = 0; + min_y = CGRectGetMaxY(self.pwdTextField.frame) + 20; + min_w = view_w; + min_h = 1; + self.lineView2.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_y = CGRectGetMaxY(self.lineView2.frame); + min_w = view_w/2; + min_h = button_h; + self.cancleButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = CGRectGetMaxX(self.cancleButton.frame); + self.sureButton.frame = CGRectMake(min_x, min_y, min_w, min_h); +} + +#pragma mark - custom method + +- (void)handleButtonAction:(UIButton *)sender +{ + [_pwdTextField resignFirstResponder]; + + if (self.block) + { + self.block(sender.tag); + } + if (sender.tag == 1) + { + NSLog(@"点击了取消按钮!"); + } + else + { + if (_pwdTextField.text.length < 4 || _pwdTextField.text.length > 8 ) + { + self.pwdTextField.text = @""; + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:@"请输入正确的密码!" image:nil buttonTitleArray:@[@"确定"] buttonTitleColorArray:@[[UIColor redColor], [UIColor cyanColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + self.alert = tempView; + } actionBlock:^(NSInteger index) { + + [self.alert ba_alertHidden]; + }]; + } + } +} + +- (void)dealloc +{ + [self removeFromSuperview]; +} + +#pragma mark - setter / getter + +- (UIView *)viewPwdBgView +{ + if (!_viewPwdBgView) + { + _viewPwdBgView = [UIView new]; + + _viewPwdBgView.layer.masksToBounds = YES; + _viewPwdBgView.layer.cornerRadius = 10.0f; + + [self addSubview:self.viewPwdBgView]; + } + return _viewPwdBgView; +} + +- (UILabel *)titleLabel +{ + if (!_titleLabel) + { + _titleLabel = [UILabel new]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.font = [UIFont systemFontOfSize:18]; + _titleLabel.text = @"请补全好友姓名,确保信息安全"; + + [self.viewPwdBgView addSubview:self.titleLabel]; + } + return _titleLabel; +} + +- (UIView *)lineView1 +{ + if (!_lineView1) + { + _lineView1 = [UIView new]; + _lineView1.backgroundColor = [UIColor lightGrayColor]; + + [self.viewPwdBgView addSubview:self.lineView1]; + } + return _lineView1; +} + +- (UITextField *)pwdTextField +{ + if (!_pwdTextField) + { + _pwdTextField = [UITextField new]; + _pwdTextField.borderStyle = UITextBorderStyleRoundedRect; + _pwdTextField.textAlignment = NSTextAlignmentCenter; + _pwdTextField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + + [self.viewPwdBgView addSubview:self.pwdTextField]; + } + return _pwdTextField; +} + +- (UIView *)lineView2 +{ + if (!_lineView2) + { + _lineView2 = [UIView new]; + _lineView2.backgroundColor = [UIColor lightGrayColor]; + + [self.viewPwdBgView addSubview:self.lineView2]; + } + return _lineView2; +} + +- (UIButton *)cancleButton +{ + if (!_cancleButton) + { + _cancleButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_cancleButton setTitle:@"取消" forState:UIControlStateNormal]; + [_cancleButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_cancleButton addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + _cancleButton.backgroundColor = [UIColor greenColor]; + _cancleButton.tag = 1; + + [self.viewPwdBgView addSubview:self.cancleButton]; + } + return _cancleButton; +} + +- (UIButton *)sureButton +{ + if (!_sureButton) + { + _sureButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_sureButton setTitle:@"确定" forState:UIControlStateNormal]; + [_sureButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [_sureButton addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + _sureButton.backgroundColor = [UIColor redColor]; + _sureButton.tag = 2; + + [self.viewPwdBgView addSubview:self.sureButton]; + } + return _sureButton; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12.m" index 79abeb1..eda0baa 100644 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12.m" @@ -7,40 +7,486 @@ // #import "DemoVC12.h" -#import "DemoVC12View.h" -@interface DemoVC12 () +#import "ViewController2.h" +#import "CustomView.h" -@property (nonatomic, strong) DemoVC12View *view1; +/*! 使用方法一:文件夹拖入 */ +#import "BAAlert_OC.h" + +///*! 使用方法二:pod */ +//#import + +/*! VC 用 BAKit_ShowAlertWithMsg */ +#define BAKit_ShowAlertWithMsg_ios8(msg) UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:msg preferredStyle:UIAlertControllerStyleAlert];\ +UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确 定" style:UIAlertActionStyleDefault handler:nil];\ +[alert addAction:sureAction];\ +[self presentViewController:alert animated:YES completion:nil]; + + +static NSString * const title0 = @"温馨提示"; +static NSString * const titleMsg0 = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。\n对于 MacBook,我们给自己设定了一个几乎不可能实现的目标:在有史以来最为轻盈纤薄的 Mac 笔记本电脑上,打造全尺寸的使用体验。这就要求每个元素都必须重新构想,不仅令其更为纤薄轻巧,还要更加出色。最终我们带来的,不仅是一部新款的笔记本电脑,更是一种对笔记本电脑的前瞻性思考。现在,有了第六代 Intel 处理器、提升的图形处理性能、高速闪存和最长可达 10 小时的电池使用时间*,MacBook 的强大更进一步。\n欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。\n对于 MacBook,我们给自己设定了一个几乎不可能实现的目标:在有史以来最为轻盈纤薄的 Mac 笔记本电脑上,打造全尺寸的使用体验。这就要求每个元素都必须重新构想,不仅令其更为纤薄轻巧,还要更加出色。最终我们带来的,不仅是一部新款的笔记本电脑,更是一种对笔记本电脑的前瞻性思考。现在,有了第六代 Intel 处理器、提升的图形处理性能、高速闪存和最长可达 10 小时的电池使用时间*,MacBook 的强大更进一步。"; + +static NSString * const titleMsg1 = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。"; +static NSString * const titleMsg2 = @"对于 MacBook,我们给自己设定了一个几乎不可能实现的目标:在有史以来最为轻盈纤薄的 Mac 笔记本电脑上,打造全尺寸的使用体验。这就要求每个元素都必须重新构想,不仅令其更为纤薄轻巧,还要更加出色。最终我们带来的,不仅是一部新款的笔记本电脑,更是一种对笔记本电脑的前瞻性思考。现在,有了第六代 Intel 处理器、提升的图形处理性能、高速闪存和最长可达 10 小时的电池使用时间*,MacBook 的强大更进一步。"; + +@interface DemoVC12 () + +@property (nonatomic, strong) UITableView *tableView; + +@property (nonatomic, strong) BAAlert *alertView1; +@property (nonatomic, strong) BAAlert *alertView2; +@property (nonatomic, strong) BAAlert *alertView3; +@property (nonatomic, strong) BAAlert *alertView4; +@property (nonatomic, strong) BAAlert *alertView5; + +@property (nonatomic, strong) BAActionSheet *actionSheet; + +@property(nonatomic, strong) CustomView *customView; + +@property (strong, nonatomic) NSArray *dataArray; @end @implementation DemoVC12 + - (void)viewDidLoad { + [super viewDidLoad]; + + self.tableView.estimatedRowHeight = 44.f; + self.tableView.rowHeight = UITableViewAutomaticDimension; + + self.title = @"BAAlert-OC"; +} + +#pragma mark - UITableViewDataSource / UITableViewDelegate +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return self.dataArray.count; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return [self.dataArray[section] count]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *identifier = @"cell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; + + if ( !cell ) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; + cell.textLabel.numberOfLines = 0; + + cell.accessoryType = 0 == indexPath.section?UITableViewCellAccessoryDisclosureIndicator:UITableViewCellAccessoryNone; + cell.selectionStyle = 0 == indexPath.section?UITableViewCellSelectionStyleDefault:UITableViewCellSelectionStyleNone; + } + NSArray *tempArray = self.dataArray[indexPath.section]; + cell.textLabel.text = tempArray[indexPath.row]; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + if ( 0 == indexPath.section ) + { + [self showAlertAction:indexPath.row + 1]; + }else if ( 1 == indexPath.section ) + { + switch ( indexPath.row ) { + case 0: + { + [self actionSheet1]; + } + break; + case 1: + { + [self actionSheet2]; + } + break; + case 2: + { + [self actionSheet3]; + } + break; + default: + break; + } + } + [tableView deselectRowAtIndexPath:indexPath animated:YES]; +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section +{ + UIView *headerView = [UIView new]; + + UILabel *headerTitle = [UILabel new]; + headerTitle.font = [UIFont systemFontOfSize:14]; + headerTitle.textColor = [UIColor redColor]; + headerTitle.numberOfLines = 0; + [headerView addSubview:headerTitle]; + + headerTitle.frame = CGRectMake(20, 0, SCREENWIDTH - 40, 40); + + if (0 == section) + { + headerTitle.text = @"BAAlert 的几种日常用法,高斯模糊、炫酷动画,应有尽有!"; + } + else if (1 == section) + { + headerTitle.text = @"BAActionSheet"; + } + else if (2 == section) + { + headerTitle.text = @"BAAlert特点"; + } + + return headerView; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section +{ + return 40; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section +{ + return FLT_MIN; +} +#pragma mark - 点击事件 +- (void)showAlertAction:(NSInteger)index +{ + switch (index) { + case 1: + [self performSelector:@selector(alert1)]; + break; + case 2: + [self performSelector:@selector(alert2)]; + break; + case 3: + [self performSelector:@selector(alert3)]; + break; + case 4: + [self performSelector:@selector(alert4)]; + break; + case 5: + [self performSelector:@selector(alert5)]; + break; + + default: + break; + } +} + +- (void)actionSheet1 +{ + NSMutableArray *dataArray = [NSMutableArray array]; + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户"]; + NSArray *subContentArray = @[@"", @"18588888888", @"余额:¥480.00"]; + NSArray *imageArray = @[@"123.png", @"背景.jpg", @"美女.jpg"]; - [self setupSubViews]; + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; + model.imageUrl = imageArray[i]; + model.content = contentArray[i]; + model.subContent = subContentArray[i]; + + [dataArray addObject:model]; + } + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf + tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.isTouchEdgeHide = NO; + tempView.showAnimate = YES; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + BAKit_ShowAlertWithMsg_ios8(model.content); + }]; +} + +- (void)actionSheet2 +{ + NSMutableArray *dataArray = [NSMutableArray array]; + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户"]; + + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; +// model.imageUrl = imageArray[i]; + model.content = contentArray[i]; +// model.subContent = subContentArray[i]; + + [dataArray addObject:model]; + } + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf +// tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.actionSheetType = BAActionSheetTypeCustom; + // tempView.isTouchEdgeHide = NO; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + BAKit_ShowAlertWithMsg_ios8(model.content); + }]; +} + +- (void)actionSheet3 +{ + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户", @"中行"]; + NSArray *subContentArray = @[ + @[@"微信支付1", @"微信支付2", @"微信支付3"], + @[@"支付宝1", @"支付宝2", @"支付宝3", @"支付宝4"], + @[], + @[@"中行1", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7"] + ]; + + NSMutableArray *dataArray = @[].mutableCopy; + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; + model.content = contentArray[i]; + + NSMutableArray *mutArray = @[].mutableCopy; + for (NSInteger j = 0; j < subContentArray[i].count; j ++) + { + BAActionSheetSubContentModel *subContentModel = [BAActionSheetSubContentModel new]; + subContentModel.subContent = subContentArray[i][j]; + [mutArray addObject:subContentModel]; + } + model.subContentArray = mutArray; + + [dataArray addObject:model]; + } + + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf + tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.actionSheetType = BAActionSheetTypeExpand; + // tempView.isTouchEdgeHide = NO; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + if (model.subContentArray.count > 0) + { + BAKit_ShowAlertWithMsg_ios8(model.subContentArray[indexPath.row].subContent); + } + else + { + BAKit_ShowAlertWithMsg_ios8(model.content); + } + }]; +} + + +- (void)alert1 +{ + BAKit_WeakSelf + /*! 第一种封装使用示例 */ + [BAAlert ba_alertShowWithTitle:title0 message:titleMsg0 image:nil buttonTitleArray:@[@"取消",@"确定",@"确定2",@"确定3"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor], [UIColor grayColor], [UIColor purpleColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + // temp.bgColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:0.3]; + /*! 开启边缘触摸隐藏alertView */ + tempView.isTouchEdgeHide = YES; + /*! 添加高斯模糊的样式 */ + tempView.blurEffectStyle = BAAlertBlurEffectStyleLight; + /*! 开启动画 */ + tempView.showAnimate = YES; + // /*! 进出场动画样式 默认为:1 */ + // tempView.animatingStyle = 1; + self.alertView1 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView1 ba_alertHidden]; + if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert1"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert2 +{ +// /*! 2、自定义按钮颜色 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg2 image:nil buttonTitleArray:@[@"取消", @"跳转VC2"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + tempView.bgColor = [UIColor colorWithRed:1.0 green:1.0 blue:0 alpha:0.3]; + tempView.isTouchEdgeHide = YES; + + /*! 是否开启进出场动画 默认:NO,如果 YES ,并且同步设置进出场动画枚举为默认值:1 */ + tempView.showAnimate = YES; + tempView.animatingStyle = BAAlertAnimatingStyleShake; + + self.alertView2 = tempView; + + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView2 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert2"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert3 +{ + /*! 3、自定义背景图片 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg1 image:nil buttonTitleArray:@[@"取消", @"确定"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + /*! 自定义alert的背景图片 */ + tempView.bgImageName = @"背景.jpg"; + /*! 开启动画,并且设置动画样式,默认:1 */ +// tempView.showAnimate = YES; + + /*! 没有开启动画,直接进出场动画样式,默认开启动画 */ + tempView.animatingStyle = BAAlertAnimatingStyleFall; + + self.alertView3 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView3 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert3"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert4 +{ + /*! 4、内置图片和文字,可滑动查看 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg1 image:[UIImage imageNamed:@"美女.jpg"] buttonTitleArray:@[@"取消", @"跳转VC2"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + /*! 自定义alert的背景图片 */ + tempView.bgImageName = @"背景.jpg"; + /*! 是否显示动画效果 */ + tempView.showAnimate = YES; + self.alertView4 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView4 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert4"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; } -- (void)setupSubViews +- (void)alert5 { - self.view1.hidden = NO; + /*! 5、完全自定义alert */ + _customView = [CustomView new]; + self.customView.frame = CGRectMake(50, SCREENHEIGHT - 300, SCREENWIDTH - 50 * 2, 162); + + BAKit_WeakSelf + [BAAlert ba_alertShowCustomView:self.customView configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + tempView.isTouchEdgeHide = YES; + tempView.animatingStyle = BAAlertAnimatingStyleScale; + self.alertView5 = tempView; + }]; + + self.customView.block = ^(NSInteger index) { + BAKit_StrongSelf + if (index == 1) + { + [self.alertView5 ba_alertHidden]; + } + }; +} + +- (BOOL)prefersStatusBarHidden { + return false; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + self.tableView.frame = self.view.bounds; } -- (DemoVC12View *)view1 +#pragma mark - setter / getter + +- (UITableView *)tableView { - if (!_view1) + if (!_tableView) { - _view1 = [[DemoVC12View alloc] initWithFrame:CGRectMake(0, 0, BA_SCREEN_WIDTH, BA_SCREEN_HEIGHT) withSelectRowBlock:^(UITableView *tableView, NSIndexPath *indexPath, NSArray *dataArray) { - - }]; - [self.view addSubview:_view1]; + _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped]; + self.tableView.delegate = self; + self.tableView.dataSource = self; + + [self.view addSubview:self.tableView]; } - return _view1; + return _tableView; } +- (NSArray *)dataArray +{ + if ( !_dataArray ) + { + _dataArray = [NSArray arrayWithObjects:@[@"1、类似系统alert【加边缘手势消失】", + @"2、自定义按钮颜色", + @"3、自定义背景图片", + @"4、内置图片和文字,可滑动查看", + @"5、完全自定义alert" + ], + @[@"1、actionsheet 默认样式:title、subTitle、image", + @"2、actionsheet custom样式,类似于微博的 actionsheet", + @"3、actionsheet 展开选择样式,可以展开收回"], + @[@"1、手势触摸隐藏开关,可随时开关\n2、可以自定义背景图片、背景颜色、按钮颜色\n3、可以添加文字和图片,且可以滑动查看!\n4、横竖屏适配完美\n5、有各种炫酷动画展示你的alert\n6、可以自定义按钮颜色\n7、理论完全兼容现有所有 iOS 系统版本" + ], nil]; + } + return _dataArray; +} @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.h" deleted file mode 100644 index 0615807..0000000 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.h" +++ /dev/null @@ -1,22 +0,0 @@ -// -// DemoVC12View.h -// BABaseProject -// -// Created by 博爱 on 16/6/21. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import - -typedef void (^selectRowBlock)(UITableView *tableView, NSIndexPath *indexPath, NSArray *dataArray); - -@interface DemoVC12View : UIView - -@property (nonatomic, strong) UITableView *tableView; -@property (nonatomic, copy ) selectRowBlock selectBlock; - -- (instancetype)initWithFrame:(CGRect)frame withSelectRowBlock:(selectRowBlock)selectRowBlock; - - - -@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.m" deleted file mode 100644 index 6a9935c..0000000 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/DemoVC12View.m" +++ /dev/null @@ -1,406 +0,0 @@ -// -// DemoVC12View.m -// BABaseProject -// -// Created by 博爱 on 16/6/21. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import "DemoVC12View.h" - -static NSString * const titleMsg = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。"; -@interface DemoVC12View () -< - UITableViewDelegate, - UITableViewDataSource -> -@property (nonatomic, strong) NSArray *titleArray; -@property (nonatomic, strong) BAModal *modal1; -@property (nonatomic, strong) UILabel *label1; -@property (nonatomic, strong) UIView *bgView; - -@property (nonatomic, strong) BACustomButton *button1; -@property (nonatomic, strong) BACustomButton *button2; -@property (nonatomic, strong) BACustomButton *button3; -@property (nonatomic, strong) BACustomButton *button4; -@property (nonatomic, strong) BACustomButton *sureButton; - - - -@end - -@implementation DemoVC12View - -- (UITableView *)tableView -{ - if (!_tableView) - { - _tableView = [[UITableView alloc] init]; - // _tableView.frame = CGRectMake(0, 0, BA_SCREEN_WIDTH, BA_SCREEN_HEIGHT - BA_getTabbarHeight); - - _tableView.delegate = self; - _tableView.dataSource = self; - _tableView.separatorColor = [UIColor redColor]; - - [self addSubview:_tableView]; - - [_tableView mas_makeConstraints:^(MASConstraintMaker *make) { - make.edges.mas_equalTo(UIEdgeInsetsMake(0 , 0, 0, 0)); - }]; - - _tableView.tableFooterView = [UIView new]; - } - return _tableView; -} - -- (NSArray *)titleArray -{ - if (!_titleArray) - { - _titleArray = @[@"1、自定义弹窗1", - @"2、自定义弹窗2【带图片,按钮】", - @"3、自定义警告框3【类似系统警告框, 不带button】", - @"4、自定义警告框4【类似系统警告框, 带延时】", - @"5、自定义警告框5【类似系统警告框, 带图片,按钮】", - @"6、系统警告框6【兼容iOS 7、8】", - @"7、系统ActionSheet【兼容iOS 7、8】"]; - } - return _titleArray; -} - -- (instancetype)initWithFrame:(CGRect)frame withSelectRowBlock:(selectRowBlock)selectRowBlock -{ - if (self = [super initWithFrame:frame]) - { - self.selectBlock = selectRowBlock; - - self.tableView.hidden = NO; - } - return self; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return self.titleArray.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; - - if (!cell) - { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; - } - - cell.textLabel.text = self.titleArray[indexPath.row]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - /*! 点击立刻取消该cell的选中状态 */ - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - if (indexPath.row == 0) - { - [self alert1]; - } - if (indexPath.row == 1) - { - [self alert2]; - } - if (indexPath.row == 2) - { - [self alert3]; - } - if (indexPath.row == 3) - { - [self alert4]; - } - if (indexPath.row == 4) - { - [self alert5]; - } - if (indexPath.row == 5) - { - [self alert6]; - } - if (indexPath.row == 6) - { - [self ActionSheet1]; - } - -} - -- (void)alert1 -{ - BALog(@"此方法待调试!"); -// if (!_modal1) -// { -// _modal1 = [self creatModal:nil]; -// } -// -// self.bgView.hidden = NO; -// -// [_modal1 showContentView:_bgView animated:YES]; -} - -- (void)alert2 -{ - BAAlertView *alert = [[BAAlertView alloc] initWithTitle:@"这里是自定义弹框2" - image:[UIImage imageNamed:@"img0.jpg"] - message:titleMsg buttonTitles:@[@"Cancle", @"Sure"]]; - alert.hideWhenTapOutside = YES; -// alert.bgroundColor = BA_Yellow_Color; -// alert.titleColor = BA_Red_Color; - - - [alert setDidShowHandler:^{ - BALog(@"alert显示了!"); - }]; - [alert setDidHideHandler:^{ - BALog(@"alert隐藏了!"); - }]; - - [alert setActionHandler:^(NSInteger index) { - - if (index == 0) - { - BALog(@"点击了取消按钮!"); - return ; - } - if (index == 1) - { - BA_OpenUrl(@"http://boai.github.io"); - } - }]; - [alert show:YES]; -} - -- (void)alert3 -{ - [BAAlertView showTitle:@"警 告3" message:titleMsg]; -} - -- (void)alert4 -{ - [BAAlertView showTitle:@"警 告4" message:titleMsg hideDelay:5]; -} - -- (void)alert5 -{ - [BAAlertView showTitle:@"警 告5" image:[UIImage imageNamed:@"img1.jpg"] message:titleMsg buttonTitles:@[@"Cancle", @"Sure"] handler:^(NSInteger index) { - - if (index == 0) - { - BALog(@"点击了取消按钮!"); - return ; - } - if (index == 1) - { - BA_OpenUrl(@"http://boai.github.io"); - } - - }]; -} - -- (void)alert6 -{ - [[self getCurrentViewController] BAAlertWithTitle:@"警 告6" message:titleMsg andOthers:@[@"Cancle", @"Sure"] animated:YES action:^(NSInteger index) { - - if (index == 0) - { - BALog(@"点击了取消按钮!"); - return ; - } - if (index == 1) - { - BA_OpenUrl(@"http://boai.github.io"); - } - - }]; -} - -- (void)ActionSheet1 -{ - [[self getCurrentViewController] BAActionSheetWithTitle:@"警 告7" message:titleMsg destructive:nil destructiveAction:nil andOthers:@[@"Cancle", @"Sure", @"复制", @"粘贴"] animated:YES action:^(NSInteger index) { - - if (index == 0) - { - BALog(@"点击了取消按钮!"); - return ; - } - if (index == 1) - { - BA_OpenUrl(@"http://boai.github.io"); - } - if (index == 2) - { - BALog(@"点击了复制按钮!"); - return ; - } - if (index == 3) - { - BALog(@"点击了粘贴按钮!"); - return ; - } - }]; -} - -- (BAModal *)creatModal:(UIView *)contentView -{ - BAModal *modal = [BAModal ba_modalWithContentView:contentView]; - modal.hideWhenTouchOutside = YES; - return modal; -} - -- (UILabel *)creatLabel -{ - UILabel *label = [UILabel new]; - label.numberOfLines = 0; - label.textAlignment = NSTextAlignmentLeft; - label.textColor = [UIColor colorWithWhite:1 alpha:0.85]; - return label; -} - -- (UIView *)bgView -{ - if (!_bgView) - { - _bgView = [UIView new]; - _bgView.frame = CGRectMake(10, self.tableView.centerX, BA_SCREEN_WIDTH - 20, 200); - _bgView.backgroundColor = BA_Green_Color; - _bgView.layer.masksToBounds = YES; - _bgView.clipsToBounds = YES; - _bgView.layer.cornerRadius = 8.0f; - - UILabel *titleLabel = [UILabel new]; - titleLabel.frame = CGRectMake(0, 0, _bgView.width, 50); - titleLabel.text = @"打赏红包(有币)"; - titleLabel.font = [UIFont boldSystemFontOfSize:17]; - titleLabel.textAlignment = NSTextAlignmentCenter; - - UIView *lineView = [UIView new]; - lineView.frame = CGRectMake(0, titleLabel.bottom, _bgView.width, 1); - lineView.backgroundColor = BA_Red_Color; - - _button1 = [self creatButtonWithFrame:CGRectMake(10, lineView.bottom + 10, (_bgView.width - 30) / 2, 30) title:@"88"]; - _button2 = [self creatButtonWithFrame:CGRectMake(_button1.right + 10, _button1.top, _button1.width, _button1.height) title:@"168"]; - _button3 = [self creatButtonWithFrame:CGRectMake(_button1.x, _button1.bottom + 10, _button1.width, _button1.height) title:@"288"]; - _button4 = [self creatButtonWithFrame:CGRectMake(_button3.right + 10, _button3.top, _button1.width, _button1.height) title:@"388"]; - - _sureButton = [BACustomButton buttonWithType:UIButtonTypeCustom]; - _sureButton.frame = CGRectMake(_button1.x, _button3.bottom + 20, _bgView.width - 20, _button1.height); - _sureButton.backgroundColor = [UIColor redColor]; - _sureButton.layer.masksToBounds = YES; - _sureButton.layer.cornerRadius = 5.0f; - [_sureButton setTitle:@"确 定" forState:UIControlStateNormal]; - [_sureButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [_sureButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; - - _button1.selected = YES; - - _button1.tag = 1; - _button2.tag = 2; - _button3.tag = 3; - _button4.tag = 4; - _sureButton.tag = 5; - - [_bgView ba_AddSubViewsWithArray:@[titleLabel, lineView, _button1, _button2, _button3, _button4, _sureButton]]; - - } - return _bgView; -} - -- (BACustomButton *)creatButtonWithFrame:(CGRect)frame title:(NSString *)title -{ - BACustomButton *btn = [BACustomButton buttonWithType:UIButtonTypeCustom]; - btn.frame = frame; -// btn.clipsToBounds = YES; - btn.layer.masksToBounds = YES; - btn.layer.cornerRadius = 5.0f; - btn.layer.borderWidth = 1.0f; - - if (btn.selected) - { - btn.layer.borderColor = BA_Red_Color.CGColor; - } - else - btn.layer.borderColor = BA_TEXTGrayColor.CGColor; - - [btn setTitle:title forState:UIControlStateNormal]; - [btn setTitleColor:BA_Red_Color forState:UIControlStateSelected]; - [btn setTitleColor:BA_TEXTGrayColor forState:UIControlStateNormal]; - - [btn setImage:[UIImage imageNamed:@"otherImages.bundle/有币"] forState:UIControlStateNormal]; - [btn setImage:[UIImage imageNamed:@"otherImages.bundle/有币"] forState:UIControlStateSelected]; - - [btn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; - - return btn; -} - -- (IBAction)buttonAction:(UIButton *)sender -{ - - sender.selected = !sender.selected; - BALog(@"你点击了第 %ld 个button!", sender.tag); - - if (sender.tag == 1) - { -// _awardNum = @"88"; - _button2.selected = NO; - _button3.selected = NO; - _button4.selected = NO; - - _button1.layer.borderColor = BA_Red_Color.CGColor; - _button2.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button3.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button4.layer.borderColor = BA_TEXTGrayColor.CGColor; - } - if (sender.tag == 2) - { - _button1.selected = NO; - _button3.selected = NO; - _button4.selected = NO; - - _button1.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button2.layer.borderColor = BA_Red_Color.CGColor; - _button3.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button4.layer.borderColor = BA_TEXTGrayColor.CGColor; - } - if (sender.tag == 3) - { - _button2.selected = NO; - _button1.selected = NO; - _button4.selected = NO; - - _button1.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button2.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button3.layer.borderColor = BA_Red_Color.CGColor; - _button4.layer.borderColor = BA_TEXTGrayColor.CGColor; - } - if (sender.tag == 4) - { - _button2.selected = NO; - _button1.selected = NO; - _button3.selected = NO; - - _button1.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button2.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button3.layer.borderColor = BA_TEXTGrayColor.CGColor; - _button4.layer.borderColor = BA_Red_Color.CGColor; - } - if (sender.tag == 5) - { - BALog(@"你点击了 确定 button!"); - } - -} - - - - -@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.h" new file mode 100644 index 0000000..623a913 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.h" @@ -0,0 +1,13 @@ +// +// ViewController2.h +// DSAlertDemo +// +// Created by boai on 16/8/31. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface ViewController2 : UIViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.m" new file mode 100644 index 0000000..0628b7a --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/ViewController2.m" @@ -0,0 +1,43 @@ + +/*! + * @brief DSAlert-OC + * + * @author DS-Team + * @copyright Copyright © 2016年 DS-Team. All rights reserved. + * @version V1.1.0 + */ + + +#import "ViewController2.h" +//#import + +@interface ViewController2 () + +@end + +@implementation ViewController2 + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + + self.view.backgroundColor = [UIColor redColor]; + +} + +- (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/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\347\276\216\345\245\263.jpg" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\347\276\216\345\245\263.jpg" new file mode 100644 index 0000000..38c006c Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\347\276\216\345\245\263.jpg" differ diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\350\203\214\346\231\257.jpg" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\350\203\214\346\231\257.jpg" new file mode 100644 index 0000000..ec0133d Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC12/\350\203\214\346\231\257.jpg" differ diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC13/DemoVC13.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC13/DemoVC13.m" index 4064208..57f71b9 100644 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC13/DemoVC13.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC13/DemoVC13.m" @@ -23,7 +23,9 @@ - (void)viewDidLoad { // [self test3]; // [self test4]; // [self test5]; - [self test6]; +// [self test6]; + + [self test11]; } /*! @@ -262,7 +264,504 @@ - (void)test6 } +- (void)test11 +{ + // [self ba_syncConcurrent]; + + // [self ba_asyncConcurrent]; + + // [self ba_syncSerial]; + + // [self ba_asyncSerial]; + + // [self ba_syncMain]; + + // dispatch_async(dispatch_queue_create("boai.queue", DISPATCH_QUEUE_CONCURRENT), ^{ + // [self ba_syncMain]; + // }); + + // [self ba_asyncMain]; + + // [self ba_asyncMain2]; + + // [self ba_barrier]; + + // [self ba_dispatch_after]; + + // [self ba_dispatch_once]; + + // [self ba_dispatch_apply]; + + [self ba_dispatch_group_async]; +} + +#pragma mark - **** 1. 并发队列 + 同步执行 不会开启新线程,执行完一个任务,再执行下一个任务 +- (void)ba_syncConcurrent +{ + NSLog(@"syncConcurrent---begin"); + dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程1-1------%@",[NSThread currentThread]); + } + }); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程1-2------%@",[NSThread currentThread]); + } + }); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程1-3------%@",[NSThread currentThread]); + } + }); + + NSLog(@"syncConcurrent---end"); + + /*! + 从并发队列 + 同步执行中可以看到,所有任务都是在主线程中执行的。由于只有一个线程,所以任务只能一个一个执行。 + 同时我们还可以看到,所有任务都在打印的syncConcurrent---begin和syncConcurrent---end之间,这说明任务是添加到队列中马上执行的。 + */ + + /*! + 输出结果: + 2016-11-16 14:37:47.411 GCDTestDemo[18432:559826] syncConcurrent---begin + 2016-11-16 14:37:47.413 GCDTestDemo[18432:559826] 线程1------{number = 1, name = main} + 2016-11-16 14:37:47.413 GCDTestDemo[18432:559826] 线程1------{number = 1, name = main} + 2016-11-16 14:37:47.413 GCDTestDemo[18432:559826] 线程1------{number = 1, name = main} + 2016-11-16 14:37:47.413 GCDTestDemo[18432:559826] 线程2------{number = 1, name = main} + 2016-11-16 14:37:47.413 GCDTestDemo[18432:559826] 线程2------{number = 1, name = main} + 2016-11-16 14:37:47.414 GCDTestDemo[18432:559826] 线程2------{number = 1, name = main} + 2016-11-16 14:37:47.414 GCDTestDemo[18432:559826] 线程3------{number = 1, name = main} + 2016-11-16 14:37:47.414 GCDTestDemo[18432:559826] 线程3------{number = 1, name = main} + 2016-11-16 14:37:47.414 GCDTestDemo[18432:559826] 线程3------{number = 1, name = main} + 2016-11-16 14:37:47.414 GCDTestDemo[18432:559826] syncConcurrent---end + + */ +} + +#pragma mark - **** 2. 并发队列 + 异步执行 可同时开启多线程,任务交替执行 +- (void)ba_asyncConcurrent +{ + NSLog(@"asyncConcurrent---begin"); + + dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程2-1------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程2-2------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程2-3------%@",[NSThread currentThread]); + } + }); + + NSLog(@"asyncConcurrent---end"); + + /*! + 在并发队列 + 异步执行中可以看出,除了主线程,又开启了3个线程,并且任务是交替着同时执行的。 + 另一方面可以看出,所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。说明任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。 + */ + + /*! + 输出结果: + + 2016-11-16 14:48:16.639 GCDTestDemo[18669:577059] asyncConcurrent---begin + 2016-11-16 14:48:16.640 GCDTestDemo[18669:577102] 线程2-1------{number = 2, name = (null)} + 2016-11-16 14:48:16.640 GCDTestDemo[18669:577059] asyncConcurrent---end + 2016-11-16 14:48:16.640 GCDTestDemo[18669:577103] 线程2-2------{number = 3, name = (null)} + 2016-11-16 14:48:16.640 GCDTestDemo[18669:577146] 线程2-3------{number = 4, name = (null)} + 2016-11-16 14:48:16.640 GCDTestDemo[18669:577102] 线程2-1------{number = 2, name = (null)} + 2016-11-16 14:48:16.641 GCDTestDemo[18669:577103] 线程2-2------{number = 3, name = (null)} + 2016-11-16 14:48:16.641 GCDTestDemo[18669:577146] 线程2-3------{number = 4, name = (null)} + 2016-11-16 14:48:16.641 GCDTestDemo[18669:577102] 线程2-1------{number = 2, name = (null)} + 2016-11-16 14:48:16.642 GCDTestDemo[18669:577103] 线程2-2------{number = 3, name = (null)} + 2016-11-16 14:48:16.643 GCDTestDemo[18669:577146] 线程2-3------{number = 4, name = (null)} + */ +} + +#pragma mark - **** 3. 串行队列 + 同步执行 不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务 +- (void)ba_syncSerial +{ + NSLog(@"syncSerial---begin"); + + dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_SERIAL); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 2; ++i) { + NSLog(@"线程3-1------%@",[NSThread currentThread]); + } + }); + dispatch_sync(queue, ^{ + for (int i = 0; i < 2; ++i) { + NSLog(@"线程3-2------%@",[NSThread currentThread]); + } + }); + dispatch_sync(queue, ^{ + for (int i = 0; i < 2; ++i) { + NSLog(@"线程3-3------%@",[NSThread currentThread]); + } + }); + + NSLog(@"syncSerial---end"); + + /*! + 在串行队列 + 同步执行可以看到,所有任务都是在主线程中执行的,并没有开启新的线程。而且由于串行队列,所以按顺序一个一个执行。 + 同时我们还可以看到,所有任务都在打印的syncConcurrent---begin和syncConcurrent---end之间,这说明任务是添加到队列中马上执行的。 + */ + + /*! + 输出结果: + 2016-11-16 14:54:30.971 GCDTestDemo[18818:587736] syncSerial---begin + 2016-11-16 14:54:30.972 GCDTestDemo[18818:587736] 1------{number = 1, name = main} + 2016-11-16 14:54:30.972 GCDTestDemo[18818:587736] 1------{number = 1, name = main} + 2016-11-16 14:54:30.974 GCDTestDemo[18818:587736] 2------{number = 1, name = main} + 2016-11-16 14:54:30.975 GCDTestDemo[18818:587736] 2------{number = 1, name = main} + 2016-11-16 14:54:30.976 GCDTestDemo[18818:587736] 3------{number = 1, name = main} + 2016-11-16 14:54:30.976 GCDTestDemo[18818:587736] 3------{number = 1, name = main} + 2016-11-16 14:54:30.977 GCDTestDemo[18818:587736] syncSerial---end + */ +} + +#pragma mark - **** 4. 串行队列 + 异步执行 会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务 +- (void)ba_asyncSerial +{ + NSLog(@"asyncSerial---begin"); + + dispatch_queue_t queue = dispatch_queue_create("boai.queue", DISPATCH_QUEUE_SERIAL); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程4-1------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程4-2------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程4-3------%@",[NSThread currentThread]); + } + }); + + NSLog(@"asyncSerial---end"); + + /*! + 在串行队列 + 异步执行可以看到,开启了一条新线程,但是任务还是串行,所以任务是一个一个执行。 + 另一方面可以看出,所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。说明任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。 + */ + + /*! + 输出结果: + 2016-11-16 15:02:33.771 GCDTestDemo[18998:601095] asyncSerial---begin + 2016-11-16 15:02:33.772 GCDTestDemo[18998:601095] asyncSerial---end + 2016-11-16 15:02:33.772 GCDTestDemo[18998:601340] 线程4-1------{number = 2, name = (null)} + 2016-11-16 15:02:33.772 GCDTestDemo[18998:601340] 线程4-1------{number = 2, name = (null)} + 2016-11-16 15:02:33.773 GCDTestDemo[18998:601340] 线程4-1------{number = 2, name = (null)} + 2016-11-16 15:02:33.773 GCDTestDemo[18998:601340] 线程4-2------{number = 2, name = (null)} + 2016-11-16 15:02:33.774 GCDTestDemo[18998:601340] 线程4-2------{number = 2, name = (null)} + 2016-11-16 15:02:33.774 GCDTestDemo[18998:601340] 线程4-2------{number = 2, name = (null)} + 2016-11-16 15:02:33.775 GCDTestDemo[18998:601340] 线程4-3------{number = 2, name = (null)} + 2016-11-16 15:02:33.775 GCDTestDemo[18998:601340] 线程4-3------{number = 2, name = (null)} + 2016-11-16 15:02:33.775 GCDTestDemo[18998:601340] 线程4-3------{number = 2, name = (null)} + */ +} +#pragma mark - **** 5. 主队列 + 同步执行 互等卡住不可行(在主线程中调用) +- (void)ba_syncMain +{ + NSLog(@"syncMain---begin"); + + dispatch_queue_t queue = dispatch_get_main_queue(); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程5-1------%@",[NSThread currentThread]); + } + }); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程5-2------%@",[NSThread currentThread]); + } + }); + + dispatch_sync(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程5-3------%@",[NSThread currentThread]); + } + }); + + + NSLog(@"syncMain---end"); + + /*! + 这时候,我们惊奇的发现,在主线程中使用主队列 + 同步执行,任务不再执行了,而且syncMain---end也没有打印。这是为什么呢? + + 这是因为我们在主线程中执行这段代码。我们把任务放到了主队列中,也就是放到了主线程的队列中。而同步执行有个特点,就是对于任务是立马执行的。那么当我们把第一个任务放进主队列中,它就会立马执行。但是主线程现在正在处理syncMain方法,所以任务需要等syncMain执行完才能执行。而syncMain执行到第一个任务的时候,又要等第一个任务执行完才能往下执行第二个和第三个任务。 + + 那么,现在的情况就是syncMain方法和第一个任务都在等对方执行完毕。这样大家互相等待,所以就卡住了,所以我们的任务执行不了,而且syncMain---end也没有打印。 + */ + + /*! + 输出结果: + + 2016-11-16 15:14:56.652 GCDTestDemo[19238:622720] syncMain---begin + */ + + /*! + 要是如果不再主线程中调用,而在其他线程中调用会如何呢? + + 不会开启新线程,执行完一个任务,再执行下一个任务(在其他线程中调用) + + dispatch_queue_t queue = dispatch_queue_create("test.queue", DISPATCH_QUEUE_CONCURRENT); + + dispatch_async(queue, ^{ + [self syncMain]; + }); + + 在其他线程中使用主队列 + 同步执行可看到:所有任务都是在主线程中执行的,并没有开启新的线程。而且由于主队列是串行队列,所以按顺序一个一个执行。 + 另一方面可以看出,所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。说明任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。 + + 2016-11-16 15:20:31.785 GCDTestDemo[19365:631782] syncMain---begin + 2016-11-16 15:20:31.789 GCDTestDemo[19365:631710] 线程5-1------{number = 1, name = main} + 2016-11-16 15:20:31.790 GCDTestDemo[19365:631710] 线程5-1------{number = 1, name = main} + 2016-11-16 15:20:31.790 GCDTestDemo[19365:631710] 线程5-1------{number = 1, name = main} + 2016-11-16 15:20:31.791 GCDTestDemo[19365:631710] 线程5-2------{number = 1, name = main} + 2016-11-16 15:20:31.791 GCDTestDemo[19365:631710] 线程5-2------{number = 1, name = main} + 2016-11-16 15:20:31.791 GCDTestDemo[19365:631710] 线程5-2------{number = 1, name = main} + 2016-11-16 15:20:31.792 GCDTestDemo[19365:631710] 线程5-3------{number = 1, name = main} + 2016-11-16 15:20:31.792 GCDTestDemo[19365:631710] 线程5-3------{number = 1, name = main} + 2016-11-16 15:20:31.792 GCDTestDemo[19365:631710] 线程5-3------{number = 1, name = main} + 2016-11-16 15:20:31.793 GCDTestDemo[19365:631782] syncMain---end + + */ + +} + +#pragma mark - **** 6. 主队列 + 异步执行 只在主线程中执行任务,执行完一个任务,再执行下一个任务 +- (void)ba_asyncMain +{ + NSLog(@"asyncMain---begin"); + + dispatch_queue_t queue = dispatch_get_main_queue(); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程6-1------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程6-2------%@",[NSThread currentThread]); + } + }); + + dispatch_async(queue, ^{ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程6-3------%@",[NSThread currentThread]); + } + }); + + + NSLog(@"asyncMain---end"); + + /*! + 我们发现所有任务都在主线程中,虽然是异步执行,具备开启线程的能力,但因为是主队列,所以所有任务都在主线程中,并且一个接一个执行。 + 另一方面可以看出,所有任务是在打印的syncConcurrent---begin和syncConcurrent---end之后才开始执行的。说明任务不是马上执行,而是将所有任务添加到队列之后才开始同步执行。 + */ + + /*! + 输出结果: + 2016-11-16 15:53:19.216 GCDTestDemo[19969:684717] asyncMain---begin + 2016-11-16 15:53:19.217 GCDTestDemo[19969:684717] asyncMain---end + 2016-11-16 15:53:19.224 GCDTestDemo[19969:684717] 线程6-1------{number = 1, name = main} + 2016-11-16 15:53:19.225 GCDTestDemo[19969:684717] 线程6-1------{number = 1, name = main} + 2016-11-16 15:53:19.226 GCDTestDemo[19969:684717] 线程6-1------{number = 1, name = main} + 2016-11-16 15:53:19.227 GCDTestDemo[19969:684717] 线程6-2------{number = 1, name = main} + 2016-11-16 15:53:19.228 GCDTestDemo[19969:684717] 线程6-2------{number = 1, name = main} + 2016-11-16 15:53:19.229 GCDTestDemo[19969:684717] 线程6-2------{number = 1, name = main} + 2016-11-16 15:53:19.233 GCDTestDemo[19969:684717] 线程6-3------{number = 1, name = main} + 2016-11-16 15:53:19.235 GCDTestDemo[19969:684717] 线程6-3------{number = 1, name = main} + 2016-11-16 15:53:19.236 GCDTestDemo[19969:684717] 线程6-3------{number = 1, name = main} + */ +} + + +#pragma mark - **** 7. GCD线程之间的通讯 在iOS开发过程中,我们一般在主线程里边进行UI刷新,例如:点击、滚动、拖拽等事件。我们通常把一些耗时的操作放在其他线程,比如说图片下载、文件上传等耗时操作。而当我们有时候在其他线程完成了耗时操作时,需要回到主线程,那么就用到了线程之间的通讯。 +- (void)ba_asyncMain2 +{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + /*! 在此执行耗时操作 */ + for (int i = 0; i < 3; i ++) + { + NSLog(@"线程7-1------%@",[NSThread currentThread]); + } + + /*! 回到主线程更新 UI */ + dispatch_async(dispatch_get_main_queue(), ^{ + NSLog(@"线程7-2------%@",[NSThread currentThread]); + }); + + }); + + /*! + 可以看到在其他线程中先执行操作,执行完了之后回到主线程执行主线程的相应操作。 + */ + + /*! + 输出结果: + 2016-11-16 16:07:50.654 GCDTestDemo[20232:707780] 线程7-1------{number = 2, name = (null)} + 2016-11-16 16:07:50.655 GCDTestDemo[20232:707780] 线程7-1------{number = 2, name = (null)} + 2016-11-16 16:07:50.655 GCDTestDemo[20232:707780] 线程7-1------{number = 2, name = (null)} + 2016-11-16 16:07:50.659 GCDTestDemo[20232:707642] 线程7-2------{number = 1, name = main} + */ +} + +#pragma mark - **** 8. GCD的栅栏方法 dispatch_barrier_async 我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作。这样我们就需要一个相当于栅栏一样的一个方法将两组异步执行的操作组给分割起来,当然这里的操作组里可以包含一个或多个任务。这就需要用到dispatch_barrier_async方法在两个操作组间形成栅栏。 +- (void)ba_barrier +{ + dispatch_queue_t queue = dispatch_queue_create("boa.barrier", DISPATCH_QUEUE_CONCURRENT); + + dispatch_async(queue, ^{ + NSLog(@"线程8-1-----%@", [NSThread currentThread]); + }); + + dispatch_async(queue, ^{ + NSLog(@"线程8-2-----%@", [NSThread currentThread]); + }); + + dispatch_barrier_async(queue, ^{ + NSLog(@"---- 这里是栅栏,执行完前面的所有任务,才能继续栅栏后面的任务!-----%@", [NSThread currentThread]); + }); + + dispatch_async(queue, ^{ + NSLog(@"线程8-3-----%@", [NSThread currentThread]); + }); + + dispatch_async(queue, ^{ + NSLog(@"线程8-4-----%@", [NSThread currentThread]); + }); + + /*! + 可以看出在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。 + */ + + /*! + 输出结果: + 2016-11-16 16:24:10.802 GCDTestDemo[20568:736069] 线程8-1-----{number = 2, name = (null)} + 2016-11-16 16:24:10.802 GCDTestDemo[20568:736070] 线程8-2-----{number = 3, name = (null)} + 2016-11-16 16:24:10.803 GCDTestDemo[20568:736070] ---- 这里是栅栏,执行完前面的所有任务,才能继续栅栏后面的任务!-----{number = 3, name = (null)} + 2016-11-16 16:24:10.803 GCDTestDemo[20568:736070] 线程8-3-----{number = 3, name = (null)} + 2016-11-16 16:24:10.803 GCDTestDemo[20568:736069] 线程8-4-----{number = 2, name = (null)} + */ +} + +#pragma mark - **** 9.GCD的延时执行方法 dispatch_after 当我们需要延迟执行一段代码时,就需要用到GCD的dispatch_after方法。 +- (void)ba_dispatch_after +{ + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + /*! 2秒后异步执行这里的代码... */ + NSLog(@"--- 2秒后异步执行这里的代码... ---"); + }); +} + +#pragma mark - **** 10.GCD的一次性代码(只执行一次) dispatch_once 我们在创建单例、或者有整个程序运行过程中只执行一次的代码时,我们就用到了GCD的dispatch_once方法。使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次。 +- (void)ba_dispatch_once +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + /*! 只执行1次的代码(这里面默认是线程安全的) */ + NSLog(@"--- 只执行1次的代码(这里面默认是线程安全的) ---"); + }); +} + +#pragma mark - **** 11.GCD的快速迭代方法 dispatch_apply 通常我们会用for循环遍历,但是GCD给我们提供了快速迭代的方法dispatch_apply,使我们可以同时遍历。比如说遍历0~5这6个数字,for循环的做法是每次取出一个元素,逐个遍历。dispatch_apply可以同时遍历多个数字。 +- (void)ba_dispatch_apply +{ + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + + dispatch_apply(8, queue, ^(size_t index) { + NSLog(@"dispatch_apply 快速循环 %zd------%@",index, [NSThread currentThread]); + }); + + /*! + 从输出结果中前边的时间中可以看出,几乎是同时遍历的。 + */ + + /*! + 输出结果: + 2016-11-16 16:40:35.227 GCDTestDemo[20924:763423] dispatch_apply 快速循环 1------{number = 3, name = (null)} + 2016-11-16 16:40:35.227 GCDTestDemo[20924:763422] dispatch_apply 快速循环 0------{number = 2, name = (null)} + 2016-11-16 16:40:35.227 GCDTestDemo[20924:763290] dispatch_apply 快速循环 2------{number = 1, name = main} + 2016-11-16 16:40:35.227 GCDTestDemo[20924:763427] dispatch_apply 快速循环 3------{number = 4, name = (null)} + 2016-11-16 16:40:35.228 GCDTestDemo[20924:763423] dispatch_apply 快速循环 4------{number = 3, name = (null)} + 2016-11-16 16:40:35.228 GCDTestDemo[20924:763422] dispatch_apply 快速循环 5------{number = 2, name = (null)} + 2016-11-16 16:40:35.228 GCDTestDemo[20924:763290] dispatch_apply 快速循环 6------{number = 1, name = main} + 2016-11-16 16:40:35.228 GCDTestDemo[20924:763427] dispatch_apply 快速循环 7------{number = 4, name = (null)} + */ +} + +#pragma mark - **** 12.GCD的队列组 dispatch_group 有时候我们会有这样的需求:分别异步执行2个耗时操作,然后当2个耗时操作都执行完毕后再回到主线程执行操作。这时候我们可以用到GCD的队列组。 我们可以先把任务放到队列中,然后将队列放入队列组中。 调用队列组的dispatch_group_notify回到主线程执行操作。 +- (void)ba_dispatch_group_async +{ + dispatch_group_t group = dispatch_group_create(); + + dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + /*! 执行1个耗时的异步操作 */ + NSLog(@"--- 执行第 1 个耗时的异步操作 ---"); + }); + + dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + /*! 执行1个耗时的异步操作 */ + NSLog(@"--- 执行第 2 个耗时的异步操作 ---"); + }); + + dispatch_group_notify(group, dispatch_get_main_queue(), ^{ + /*! 等前面的异步操作都执行完毕后,回到主线程... */ + NSLog(@"--- 等前面的异步操作都执行完毕后,回到主线程... ---"); + }); + + /*! + 输出结果: + 2016-11-16 16:54:30.375 GCDTestDemo[21212:787439] --- 执行第 2 个耗时的异步操作 --- + 2016-11-16 16:54:30.375 GCDTestDemo[21212:787438] --- 执行第 1 个耗时的异步操作 --- + 2016-11-16 16:54:30.379 GCDTestDemo[21212:787353] --- 等前面的异步操作都执行完毕后,回到主线程... --- + */ +} @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.h" new file mode 100644 index 0000000..215bd4c --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.h" @@ -0,0 +1,13 @@ +// +// DemoVC14.h +// BABaseProject +// +// Created by 博爱 on 2016/11/17. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC14 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.m" new file mode 100644 index 0000000..3263d7c --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/DemoVC14.m" @@ -0,0 +1,54 @@ +// +// DemoVC14.m +// BABaseProject +// +// Created by 博爱 on 2016/11/17. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC14.h" +#import "Dog.h" + +@interface DemoVC14 () + +@end + +@implementation DemoVC14 + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self test]; +} + +- (void)test +{ + Dog *dog = [Dog new]; + dog.age = 10; + + /*! + 使用 @property 声明了成员变量 age ,没有自己去写它的set方法和get方法,系统会自动给你生成。同时生成一个下划线成员变量 _age + */ + /*! 直接调用点语法,没有set方法:你调用的时候,赋值的值是多少就是多少 */ + NSLog(@"dog 的 age : %ld", (long)dog.age); + + /*! + 如果你自己写了 _age2 的 set 方法,却没有在里面做任何操作,会默认调用 _age2。所有的成员变量初始值都是0, 所以即便你在调用 set 方法的时候赋值,打印出来也是0 + */ + NSLog(@"dog 的 age2 : %ld", (long)dog.age2); + + /*! + 如果你自己写了 age3 的 get 方法,在里面 return 3。你在调用 get 方法的时候赋值,打印出来也是就是你get方法里面返回的值 3 + */ + NSLog(@"dog 的 age3 : %ld", (long)dog.age3); + + /*! + 如果你自己同时生成了set和get方法,那系统就不会生成下划线成员变量 + 注意看断点处 生成的 _age, _age2, _age3 并没有 _age4 + */ + NSLog(@"dog 的 age4 : %ld", (long)dog.age4); + + /*! 看完这些,你的 set / get 语法有没有一点理解了? */ +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.h" new file mode 100644 index 0000000..6a83296 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.h" @@ -0,0 +1,21 @@ +// +// Dog.h +// get_Demo +// +// Created by 博爱 on 2016/11/17. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface Dog : NSObject + +@property (nonatomic, assign) NSInteger age; + +@property (nonatomic, assign) NSInteger age2; + +@property (nonatomic, assign) NSInteger age3; + +@property (nonatomic, assign) NSInteger age4; + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.m" new file mode 100644 index 0000000..fd918e1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC14/Dog.m" @@ -0,0 +1,33 @@ +// +// Dog.m +// get_Demo +// +// Created by 博爱 on 2016/11/17. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "Dog.h" + +@implementation Dog + +- (void)setAge2:(NSInteger)age2 +{ + +} + +- (NSInteger)age3 +{ + return 3; +} + +- (void)setAge4:(NSInteger)age4 +{ + +} + +- (NSInteger)age4 +{ + return 4; +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC2/DemoVC2.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC2/DemoVC2.m" index e33bc08..a17102c 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC2/DemoVC2.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC2/DemoVC2.m" @@ -7,6 +7,7 @@ // #import "DemoVC2.h" +#import "UIAlertController+BAKit.h" @interface DemoVC2 () @@ -31,33 +32,32 @@ - (void)viewWillDisappear:(BOOL)animated - (void)viewDidLoad { [super viewDidLoad]; - self.vcBgColor = BA_Green_Color; + self.vcBgColor = BAKit_Color_Green; [self clearCache]; } - (void)clearCache { - BAClearCacheManager *clearCacheManager = [BAClearCacheManager ba_sharedCache]; + BAKit_ClearCacheManager *clearCacheManager = [BAKit_ClearCacheManager ba_sharedCache]; CGFloat cacheSize = [clearCacheManager ba_loadCacheSize]; - - NSString *clearMessage = [NSString stringWithFormat:@"缓存大小为%.2fM确定要清理吗?", cacheSize]; - - BA_Weak; - [self BAAlertWithTitle:@"温馨提示:" message:clearMessage andOthers:@[@"取 消", @"确 定"] animated:YES action:^(NSInteger index) { - - if (index == 0) - { - return ; - } - if (index == 1) - { - [clearCacheManager ba_myClearCacheAction]; - NSString *msg = [NSString stringWithFormat:@"成功清除缓存:%.2fM", cacheSize]; - [weakSelf.view ba_showAlertView:@"温馨提示:" message:msg]; - } - - }]; + NSString *clearMessage = [NSString stringWithFormat:@"缓存大小为:%.2fM,确定要清理吗?", cacheSize]; + + NSArray *buttonTitleArray = @[@"取消", @"确定"]; + NSArray *buttonTitleColorArray = @[BAKit_Color_Green, BAKit_Color_Red]; + [UIAlertController ba_alertShowInViewController:self title:@"温馨提示" message:clearMessage buttonTitleArray:buttonTitleArray buttonTitleColorArray:buttonTitleColorArray block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + if (buttonIndex == 0) + { + return ; + } + if (buttonIndex == 1) + { + [clearCacheManager ba_myClearCacheAction]; + NSString *msg = [NSString stringWithFormat:@"成功清除缓存:%.2fM", cacheSize]; + [self.view ba_showAlertView:@"温馨提示:" message:msg]; + } + }]; + } @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC3/DemoVC3.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC3/DemoVC3.m" index 6d0cef9..13bfb91 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC3/DemoVC3.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC3/DemoVC3.m" @@ -14,7 +14,6 @@ @interface DemoVC3 () { NSInteger _time; - BAModal *_modal1; UILabel *_label1; } @property (nonatomic, strong) UIButton *timeButton2; @@ -23,6 +22,8 @@ @interface DemoVC3 () @property (nonatomic, strong) SXHeadLine *headerLine; @property (nonatomic, strong) SXMarquee *headerLine2; +//@property (strong, nonatomic) dispatch_source_t timer2; + @end @implementation DemoVC3 @@ -38,9 +39,10 @@ - (void)viewWillDisappear:(BOOL)animated [_headerLine stop]; -// _timeButton2 = nil; -// _timeButton3 = nil; - +// if (self.timer2) +// { +// dispatch_source_cancel(self.timer2); +// } } - (void)viewDidLoad @@ -52,6 +54,107 @@ - (void)viewDidLoad self.timeButton2.hidden = NO; self.timeButton3.hidden = NO; + [self test]; +} + +- (void)test +{ + CGFloat min_x = 20; + CGFloat min_y = self.timeButton2.bottom + 20; + CGFloat min_w = CGRectGetWidth(self.view.frame) - min_x * 2; + // CGFloat min_w = 200; + + CGFloat min_h = 0; + CGFloat min_space = 5; + + for (NSInteger i = 0; i < 8; i ++) + { + min_h = 30; + if (i == 2 || i == 3) + { + min_h = 80; + } + + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + button.frame = CGRectMake(min_x, min_y, min_w, min_h); + button.backgroundColor = BAKit_ColorRandom(); + button.titleLabel.font = [UIFont systemFontOfSize:13]; + [button setImage:[UIImage imageNamed:@"tabbar_mainframeHL"] forState:UIControlStateNormal]; + min_y = CGRectGetMaxY(button.frame) + min_space; + + CGFloat padding = 10; + CGFloat viewCornerRadius = 15; + BAButtonLayoutType type; + + switch (i) { + case 0: + { + [button setTitle:@"默认样式:内容居中-图左文右" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeNormal; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomLeft viewCornerRadius:viewCornerRadius]; + } + break; + case 1: + { + [button setTitle:@"内容居中-图右文左" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeCenterImageRight; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomRight viewCornerRadius:viewCornerRadius]; + } + break; + case 2: + { + [button setTitle:@"内容居中-图上文下" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeCenterImageTop; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeTopLeftAndTopRight viewCornerRadius:viewCornerRadius * 2]; + } + break; + case 3: + { + [button setTitle:@"内容居中-图下文上" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeCenterImageBottom; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft viewCornerRadius:viewCornerRadius * 2]; + } + break; + case 4: + { + [button setTitle:@"内容居左-图左文右" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeLeftImageLeft; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomRight viewCornerRadius:viewCornerRadius]; + button.padding_inset = 20; + } + break; + case 5: + { + [button setTitle:@"内容居左-图右文左" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeLeftImageRight; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomLeftAndTopLeft viewCornerRadius:viewCornerRadius]; + } + break; + case 6: + { + [button setTitle:@"内容居右-图左文右" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeRightImageLeft; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft viewCornerRadius:viewCornerRadius]; + } + break; + case 7: + { + [button setTitle:@"内容居右-图右文左" forState:UIControlStateNormal]; + type = BAButtonLayoutTypeRightImageRight; + [button ba_button_setBAViewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:viewCornerRadius]; + } + break; + + default: + type = BAButtonLayoutTypeNormal; + break; + } + + // 注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + [button ba_button_setBAButtonLayoutType:type padding:padding]; + + [self.view addSubview:button]; + } } #pragma mark - ***** 一个滚动的广告条:跑马灯label @@ -67,7 +170,7 @@ - (SXHeadLine *)headerLine [_headerLine setScrollDuration:0.5 stayDuration:2]; _headerLine.hasGradient = YES; [_headerLine start]; - BA_Weak; + BA_WEAKSELF; /*! 此处已做奇偶数的点击事件处理,请大家放心使用! */ [_headerLine changeTapMarqueeAction:^(NSInteger index) { @@ -76,7 +179,7 @@ - (SXHeadLine *)headerLine }]; - _headerLine.bgColor = BA_Green_Color; + _headerLine.bgColor = BAKit_Color_Green; [self.view addSubview:_headerLine]; } @@ -87,7 +190,7 @@ - (SXMarquee *)headerLine2 { if (!_headerLine2) { - BA_Weak; + BA_WEAKSELF; _headerLine2 = [[SXMarquee alloc]initWithFrame:CGRectMake(0, _headerLine.bottom + 20, BA_SCREEN_WIDTH, 40) speed:4 Msg:@"重大活动,天猫的双十一,然而并没卵用" bgColor:[UIColor salmonColor] txtColor:[UIColor whiteColor]]; [_headerLine2 changeMarqueeLabelFont:[UIFont systemFontOfSize:26]]; [_headerLine2 changeTapMarqueeAction:^{ @@ -112,123 +215,104 @@ - (UIButton *)timeButton2 [_timeButton2 setTitle:@"获取验证码" forState:UIControlStateNormal]; _timeButton2.titleLabel.font = BA_FontSize(15); [_timeButton2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_timeButton2 addTarget:self action:@selector(btnAction2:) forControlEvents:UIControlEventTouchUpInside]; - [_timeButton2 jm_setCornerRadius:5 withBackgroundColor:BA_Orange_Color]; + [_timeButton2 addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + [_timeButton2 jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Orange]; + _timeButton2.tag = 100; [self.view addSubview:_timeButton2]; } return _timeButton2; } -- (void)btnAction2:(UIButton *)btn +- (IBAction)handleButtonAction:(UIButton *)sender { - __block int timeout = 29; - - /*! 倒计时时间 */ - dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_source_t _timer2 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); - dispatch_source_set_timer(_timer2,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); + sender.userInteractionEnabled = NO; + __block UIButton *btn = sender; - /*! 每秒执行 */ - dispatch_source_set_event_handler(_timer2, ^{ - - if(timeout <= 0) - { - /*! 倒计时结束,关闭 */ - dispatch_source_cancel(_timer2); dispatch_async(dispatch_get_main_queue(), ^{ - - /*! 设置界面的按钮显示 根据自己需求设置 */ - [btn setTitle:@"发送验证码" forState:UIControlStateNormal]; - btn.userInteractionEnabled = YES; - - }); - } - else - { - int seconds = timeout % 60; - NSString *strTime = [NSString stringWithFormat:@"%d", seconds]; - if ([strTime isEqualToString:@"0"]) - { - strTime = [NSString stringWithFormat:@"%d", 60]; - } - dispatch_async(dispatch_get_main_queue(), ^{ - - /*! 设置界面的按钮显示 根据自己需求设置 */ - // BALog(@"____%@",strTime); - [UIView beginAnimations:nil context:nil]; - [UIView setAnimationDuration:1]; - [btn setTitle:[NSString stringWithFormat:@"%@秒后重新发送",strTime] forState:UIControlStateNormal]; - [UIView commitAnimations]; - btn.userInteractionEnabled = NO; - - }); - timeout--; - } - }); - dispatch_resume(_timer2); + if (sender.tag == 100) + { + [sender ba_countDownWithTimeInterval:60 countDownFormat:@"剩余 %zd s"]; + [sender setTimeStoppedCallback:^{ + [btn setTitle:@"获取验证码" forState:UIControlStateNormal]; + }]; + } + if (sender.tag == 101) + { + [sender ba_countDownWithTimeInterval:5 countDownFormat:@"跳过 %zd s"]; + [sender setTimeStoppedCallback:^{ + [btn setTitle:@"跳过" forState:UIControlStateNormal]; + }]; + } } -#pragma mark - ***** 第3种button +//- (void)btnAction2:(UIButton *)btn +//{ +// __block int timeout = 29; +// +// /*! 倒计时时间 */ +// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); +// self.timer2 = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); +// dispatch_source_set_timer(self.timer2,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); +// +// /*! 每秒执行 */ +// dispatch_source_set_event_handler(self.timer2, ^{ +// +// if(timeout <= 0) +// { +// /*! 倒计时结束,关闭 */ +// dispatch_source_cancel(self.timer2); dispatch_async(dispatch_get_main_queue(), ^{ +// +// /*! 设置界面的按钮显示 根据自己需求设置 */ +// [btn setTitle:@"发送验证码" forState:UIControlStateNormal]; +// btn.userInteractionEnabled = YES; +// +// }); +// } +// else +// { +// int seconds = timeout % 60; +// NSString *strTime = [NSString stringWithFormat:@"%d", seconds]; +// if ([strTime isEqualToString:@"0"]) +// { +// strTime = [NSString stringWithFormat:@"%d", 60]; +// } +// dispatch_async(dispatch_get_main_queue(), ^{ +// +// /*! 设置界面的按钮显示 根据自己需求设置 */ +// // BALog(@"____%@",strTime); +// [UIView beginAnimations:nil context:nil]; +// [UIView setAnimationDuration:1]; +// [btn setTitle:[NSString stringWithFormat:@"%@秒后重新发送",strTime] forState:UIControlStateNormal]; +// [UIView commitAnimations]; +// btn.userInteractionEnabled = NO; +// +// }); +// timeout--; +// } +// }); +// dispatch_resume(self.timer2); +//} +// +#pragma mark - ***** 第3种 倒计时 - (UIButton *)timeButton3 { if (!_timeButton3) { _timeButton3 = [UIButton buttonWithType:UIButtonTypeCustom]; - _timeButton3.frame = CGRectMake(_timeButton2.x, _timeButton2.bottom + 10, 120, 40); - [_timeButton3 setTitle:@"点击有惊喜!" forState:UIControlStateNormal]; + _timeButton3.frame = CGRectMake(_timeButton2.right + 20, _timeButton2.y, _timeButton2.width, _timeButton2.height); + [_timeButton3 setTitle:@"跳过" forState:UIControlStateNormal]; _timeButton3.titleLabel.font = BA_FontSize(15); [_timeButton3 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_timeButton3 addTarget:self action:@selector(btnAction3:) forControlEvents:UIControlEventTouchUpInside]; - [_timeButton3 jm_setCornerRadius:5 withBackgroundColor:BA_Orange_Color]; + [_timeButton3 addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + [_timeButton3 jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Orange]; + _timeButton3.tag = 101; [self.view addSubview:_timeButton3]; } return _timeButton3; } -- (BOOL)willDealloc -{ - return NO; -} -- (IBAction)btnAction3:(UIButton *)sender -{ - if (!_modal1) - { - _modal1 = [self creatModal:nil]; - } - - if (!_label1) - { - _label1 = [self creatLabel]; - _label1.userInteractionEnabled = YES; - _label1.text = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。"; - - _label1.font = [UIFont systemFontOfSize:16]; - - CGSize size2 = [BAAutoSizeWithWH BA_AutoSizeOfHeghtWithText:_label1.text font:_label1.font width:BA_SCREEN_WIDTH - 60]; - _label1.frame = CGRectMake(10, CGRectGetMidX(self.view.frame), size2.width, size2.height); - _label1.backgroundColor = BA_Green_Color; - [_label1 jm_setCornerRadius:10 withBorderColor:BA_Red_Color borderWidth:2]; - } - [_modal1 showContentView:_label1 animated:YES]; -} - -- (BAModal *)creatModal:(UIView *)contentView -{ - BAModal *modal = [BAModal ba_modalWithContentView:contentView]; - modal.hideWhenTouchOutside = YES; - return modal; -} - -- (UILabel *)creatLabel -{ - UILabel *label = [UILabel new]; - label.numberOfLines = 0; - label.textAlignment = NSTextAlignmentLeft; - label.textColor = [UIColor colorWithWhite:1 alpha:0.85]; - return label; -} @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/BAUmengFile.txt" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/BAUmengFile.txt" new file mode 100644 index 0000000..2b65c17 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/BAUmengFile.txt" @@ -0,0 +1,6 @@ +【欢迎使用博爱分享 2.1 版本】 + +在工艺的创新和精准程度上,iPhone 7 达到了我们前所未及的新高度。亮黑色的外观与我们以往的设计截然不同,外壳具备了防溅抗水的特性1,主屏幕按钮经过焕然一新的打造。再加上触感圆润无缝的新款一体成型机身设计,无论是拿在手里还是看在眼里,iPhone 7 都一样令人赞叹。 + +两款尺寸,五色外观。 +与 iPhone 7 和 iPhone 7 Plus 携同而来的,是两款新的外观颜色:精美磨砂质感的黑色,和深邃闪耀的亮黑色。无论是 4.7 英寸还是 5.5 英寸,这两种机型均采用坚固的 7000 系列铝金属打造而成,并另有经典的银色、金色和玫瑰金色外观可供选择。 \ No newline at end of file diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.h" index 704f7ac..d40c597 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.h" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.h" @@ -10,5 +10,8 @@ @interface DemoVC4 : BABaseViewController - +/*! + com.boai.BABaseProject + com.youren.appb + */ @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.m" index 1a17e56..c97417f 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC4/DemoVC4.m" @@ -9,27 +9,29 @@ #import "DemoVC4.h" /*! 友盟分享 */ -#import "UMSocial.h" +//#import "UMSocial.h" -@interface DemoVC4 () +@interface DemoVC4 () -@property (nonatomic, strong) BACustomButton *shareBtn; -@property (nonatomic, strong) BACustomButton *QQLoginBtn; +@property (nonatomic, strong) UIButton *shareBtn; +@property (nonatomic, strong) UIButton *QQLoginBtn; + +@property (nonatomic, strong) UMSocialUserInfoResponse *dict; @end @implementation DemoVC4 -- (BACustomButton *)shareBtn +- (UIButton *)shareBtn { if (!_shareBtn) { - _shareBtn = [BACustomButton BA_ShareButton]; + _shareBtn = [UIButton new]; _shareBtn.frame = CGRectMake(50, 100, 100, 40); - [_shareBtn setTitle:@"分享" forState:UIControlStateNormal]; - [_shareBtn setTitleColor:BA_White_Color forState:UIControlStateNormal]; + [_shareBtn setTitle:@"博爱分享" forState:UIControlStateNormal]; + [_shareBtn setTitleColor:BAKit_Color_White forState:UIControlStateNormal]; _shareBtn.titleLabel.font = BA_FontSize(16); - [_shareBtn jm_setCornerRadius:5 withBackgroundColor:BA_Green_Color]; + [_shareBtn jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Green]; _shareBtn.tag = 1001; [_shareBtn addTarget:self action:@selector(clickShareBtn:) forControlEvents:UIControlEventTouchUpInside]; _shareBtn.titleLabel.textAlignment = NSTextAlignmentRight; @@ -41,16 +43,16 @@ - (BACustomButton *)shareBtn return _shareBtn; } -- (BACustomButton *)QQLoginBtn +- (UIButton *)QQLoginBtn { if (!_QQLoginBtn) { - _QQLoginBtn = [BACustomButton BA_ShareButton]; + _QQLoginBtn = [UIButton new]; _QQLoginBtn.frame = CGRectMake(50, _shareBtn.bottom + 50, 100, 40); - [_QQLoginBtn setTitle:@"QQ登陆" forState:UIControlStateNormal]; - [_QQLoginBtn setTitleColor:BA_White_Color forState:UIControlStateNormal]; + [_QQLoginBtn setTitle:@"博爱登录" forState:UIControlStateNormal]; + [_QQLoginBtn setTitleColor:BAKit_Color_White forState:UIControlStateNormal]; _QQLoginBtn.titleLabel.font = BA_FontSize(16); - [_QQLoginBtn jm_setCornerRadius:5 withBackgroundColor:BA_Green_Color]; + [_QQLoginBtn jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Green]; _QQLoginBtn.tag = 1002; [_QQLoginBtn addTarget:self action:@selector(clickShareBtn:) forControlEvents:UIControlEventTouchUpInside]; _QQLoginBtn.titleLabel.textAlignment = NSTextAlignmentRight; @@ -66,7 +68,7 @@ - (void)viewDidLoad { [super viewDidLoad]; - self.vcBgColor = BA_White_Color; + self.vcBgColor = BAKit_Color_White; // [self.view ba_createGradientWithColors:@[[]] direction:UIViewLinearGradientDirectionVertical]; self.shareBtn.hidden = NO; self.QQLoginBtn.hidden = NO; @@ -75,30 +77,113 @@ - (void)viewDidLoad #pragma mark 友盟分享和登陆 - (IBAction)clickShareBtn:(UIButton *)sender { + BAKit_WeakSelf; /*! 友盟分享 */ if (sender.tag == 1001) { - NSString *shareUrlSrt = @"http://boai.github.io"; - NSString *shareText = [NSString stringWithFormat:@"测试(博爱BABaseProject)分享【博爱之家】!详情点击:%@", shareUrlSrt]; - /*! 注意:图片不能为空 */ - UIImage *shareImage = [UIImage imageNamed:@"icon1.jpg"]; + /*! 分享标题 */ + BASHAREMANAGER.shareTitle = @"博爱分享 2.1 版"; + /*! 分享摘要 */ + BASHAREMANAGER.shareText = @"博爱分享 2.1 版:好帅啊!基于友盟最新版本:6.1.0版本封装!赶紧来用!"; + /*! 分享大图【URL】 */ + // BASHAREMANAGER.shareBigImage = @"icon2.jpg"; + /*! 分享缩略图或者大图【URL】 */ + BASHAREMANAGER.shareImageUrl = @"http://e.hiphotos.baidu.com/image/pic/item/7af40ad162d9f2d303f4c1e5abec8a136227ccd7.jpg"; + + /*! 分享网页 */ + // BASHAREMANAGER.shareWebpageUrl = @"http://boai.github.io"; + BASHAREMANAGER.shareWebpageUrl = @"http://www.cnblogs.com/boai/"; + /*! 分享音乐 URL【音乐网页播放地址】 */ + BASHAREMANAGER.shareMusicUrl = @"http://c.y.qq.com/v8/playsong.html?songid=108782194&source=yqq#wechat_redirect"; + /*! 分享音乐 DataUrl */ + BASHAREMANAGER.shareMusicDataUrl = @"http://music.huoxing.com/upload/20130330/1364651263157_1085.mp3"; + /*! 分享视频 URL【视频网页播放地址】 */ + BASHAREMANAGER.shareVideoUrl = @"http://video.sina.com.cn/p/sports/cba/v/2013-10-22/144463050817.html"; + /*! 分享 gif 动图路径 */ + BASHAREMANAGER.shareGifFilePath = [[NSBundle mainBundle] pathForResource:@"gif2" ofType:@"gif"]; + /*! 分享文件路径 */ + BASHAREMANAGER.shareFileFilePath = [[NSBundle mainBundle] pathForResource:@"BAUmengFile.txt" ofType:nil]; + /*! 分享文件后缀类型 */ + BASHAREMANAGER.shareFileFileExtension = @"txt"; - [[BAShareManage shareManage] BA_UMshareListWithViewControll:self withShareText:shareText image:shareImage url:shareUrlSrt]; + /*! 分享类型必传的参数详见类型封装【最常用的就是:BAUM_SHARE_TYPE_WEB_LINK】 */ + [BASHAREMANAGER ba_shareListWithShareType:BAUM_SHARE_TYPE_WEB_LINK viewController:self]; } /*! 友盟登陆 */ if (sender.tag == 1002) { - BAShareManage *manger = [BAShareManage shareManage]; - manger.delegate = self; - [manger BA_UMLoginListWithViewControll:self]; - } -} + + [BASHAREMANAGER ba_loginListWithViewController:self isGetAuthWithUserInfo:YES loginCallback:^(UMSocialUserInfoResponse *response) { + + BAKit_StrongSelf + // 授权信息【具体返回参数要看平台,每个平台返回的数据不一样!如:新浪微博没有返回 openid 】 + NSString *msg = [NSString stringWithFormat:@"登陆成功,获取用户名:%@", response.name]; + [self BAAlertWithTitle:@"温馨提示:" message:msg andOthers:@[@"确 定"] animated:YES action:^(NSInteger index) { + if (index) + { + return ; + } + }]; + self.dict = response; + NSLog(@"登陆返回信息 uid: %@", response.uid); + NSLog(@"登陆返回信息 openid: %@", response.openid); + NSLog(@"登陆返回信息 accessToken: %@", response.accessToken); + NSLog(@"登陆返回信息 refreshToken: %@", response.refreshToken); + NSLog(@"登陆返回信息 expiration: %@", response.expiration); + + // 用户信息 + NSLog(@"登陆返回信息 name: %@", response.name); + NSLog(@"登陆返回信息 iconurl: %@", response.iconurl); + NSLog(@"登陆返回信息 gender: %@", response.gender); + + // 第三方平台SDK源数据 + NSLog(@"登陆返回信息 originalResponse: %@", response.originalResponse); + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + if (self.dict) + { + [BASHAREMANAGER ba_cancelAuthWithPlatformType:UMSocialPlatformType_QQ]; + BASHAREMANAGER.authOpFinish = ^{ + NSString *msg = [NSString stringWithFormat:@"清除授权成功!"]; + [self BA_showAlertWithTitle:msg]; + }; + } -#pragma mark 友盟登陆BAShareManageDelegate -- (void)getUserData:(NSDictionary *)backUserData -{ - [self.view ba_showAlertView:@"温馨提示:" message:[NSString stringWithFormat:@"友盟登陆成功,返回信息: %@", backUserData]]; - BALog(@"友盟登陆成功,返回信息: %@", backUserData); + }); + + }]; + +/*! + 登陆返回信息: + 登陆返回信息 uid: 2D05134F80401D12A763CDF3***6 + 登陆返回信息 openid: 2D05134F80401D12A763CDF***331B6 + 登陆返回信息 accessToken: 0B818C0CA00BE5149***FECDE397 + 登陆返回信息 refreshToken: (null) + 登陆返回信息 expiration: 2017-03-09 05:42:08 +0000 + 登陆返回信息 name: 博爱1616 + 登陆返回信息 iconurl: http://q.qlogo.cn/qqapp/1105285308/2D05134F80401D12A763CDF3287331B6/100 + 登陆返回信息 gender: 男 + 登陆返回信息 originalResponse: { + city = ""; + figureurl = "http://qzapp.qlogo.cn/qzapp/1105285308/2D05134F80401D12A763CDF328***"; + "figureurl_1" = "http://qzapp.qlogo.cn/qzapp/1105285308/2D05134F80401D12A763CDF3***"; + "figureurl_2" = "http://qzapp.qlogo.cn/qzapp/1105285308/2D05134F80401D12A763CDF328***"; + "figureurl_qq_1" = "http://q.qlogo.cn/qqapp/1105285308/2D05134F80401D12A763CDF32873***"; + "figureurl_qq_2" = "http://q.qlogo.cn/qqapp/1105285308/2D05134F80401D12A763CDF3287***"; + gender = "男"; + "is_lost" = 0; + "is_yellow_vip" = 0; + "is_yellow_year_vip" = 0; + level = 0; + msg = ""; + nickname = "博爱1616"; + province = ""; + ret = 0; + vip = 0; + "yellow_vip_level" = 0; + } + */ + } } - (void)viewDidDisappear:(BOOL)animated @@ -112,4 +197,100 @@ - (BOOL)willDealloc { return NO; } + +//获取屏幕截屏方法 +- (UIImage *)capture +{ +// UIWindow *window = [UIApplication sharedApplication].keyWindow; +// +// UIGraphicsBeginImageContextWithOptions(window.bounds.size, false, [UIScreen mainScreen].scale); +// [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:false]; +// UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); +// UIGraphicsEndImageContext(); +// +// return image; + + UIGraphicsBeginImageContextWithOptions(self.navigationController.view.bounds.size, self.navigationController.view.opaque, 0.0); + + [self.navigationController.view.layer renderInContext:UIGraphicsGetCurrentContext()]; + + UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); + + UIGraphicsEndImageContext(); + + return image; +} + ++ (UIImage*)mcScreenShotWithObject:(id)target + shotSize:(CGSize)size + isOpaque:(BOOL)opaque + isSave:(BOOL)isSave + saveName:(NSString*)name{ + UIGraphicsBeginImageContextWithOptions(size, opaque, [UIScreen mainScreen].scale); + if ([target isKindOfClass:[UIView class]]) { + UIView *view = (UIView*)target; + [view.layer renderInContext:UIGraphicsGetCurrentContext()]; + }else if ([target isKindOfClass:[UIViewController class]]){ + UIViewController *viewController = (UIViewController*)target; + [viewController.view.layer renderInContext:UIGraphicsGetCurrentContext()]; + }else{ + NSAssert([target isKindOfClass:[UIView class]] || [target isKindOfClass:[UIViewController class]], @"数据源有问题,请检查并更新!"); + } + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + if (isSave) { + NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"DocumentPath"]; + NSFileManager *fileManager = [NSFileManager defaultManager]; + [fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]; + [fileManager createFileAtPath:[filePath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png",(name && ![name isEqualToString:@""])?name:@"image"]] contents:UIImagePNGRepresentation(image) attributes:nil]; + NSLog(@"====>>%@ Path:%@%@",(name && ![name isEqualToString:@""])?name:@"image", filePath,[NSString stringWithFormat:@"/%@.png",(name && ![name isEqualToString:@""])?name:@"image"]); + } + + return image; +} + +- (NSData *)dataWithScreenshotInPNGFormat +{ + CGSize imageSize = CGSizeZero; + UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; + if (UIInterfaceOrientationIsPortrait(orientation)) imageSize = [UIScreen mainScreen].bounds.size; + else imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width); + + UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); + CGContextRef context = UIGraphicsGetCurrentContext(); + for (UIWindow *window in [[UIApplication sharedApplication] windows]) { + CGContextSaveGState(context); + CGContextTranslateCTM(context, window.center.x, window.center.y); + CGContextConcatCTM(context, window.transform); + CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y); + if (orientation == UIInterfaceOrientationLandscapeLeft) { + CGContextRotateCTM(context, M_PI_2); + CGContextTranslateCTM(context, 0, -imageSize.width); + } else if (orientation == UIInterfaceOrientationLandscapeRight) { + CGContextRotateCTM(context, -M_PI_2); + CGContextTranslateCTM(context, -imageSize.height, 0); + } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { + CGContextRotateCTM(context, M_PI); + CGContextTranslateCTM(context, -imageSize.width, -imageSize.height); + } + if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) { + [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES]; + } else { + [window.layer renderInContext:context]; + } + CGContextRestoreGState(context); + } + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return UIImagePNGRepresentation(image); +} + +- (UIImage *)imageWithScreenshot +{ + NSData *imageData = [self dataWithScreenshotInPNGFormat]; + return [UIImage imageWithData:imageData]; +} + @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.h" index 001f47a..25b8b06 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.h" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.h" @@ -60,7 +60,8 @@ #import "BABaseViewController.h" -typedef enum { + +typedef NS_ENUM(NSUInteger, BARegularExpressionType) { /*! 验证输入的是否是手机号码 */ BARegularExpressionTypePhone, /*! 验证输入的是否是邮箱 */ @@ -79,7 +80,7 @@ typedef enum { BARegularExpressionTypeIPAddress, /*! 验证输入的是否是中文 */ BARegularExpressionTypeChinese, -}BARegularExpressionType; +}; @interface DemoVC5 : BABaseViewController diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.m" index 8d1acc0..1a2722d 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5.m" @@ -146,7 +146,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N // cell.textField.tag = 1001 + indexPath.row; _cell2.normalTextView.delegate = self; _cell2.hightlightTextField.delegate = self; - _cell2.backgroundColor = BA_Orange_Color; + _cell2.backgroundColor = BAKit_Color_Orange; return _cell2; } @@ -179,7 +179,7 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)ce static CGFloat initialDelay = 0.2f; static CGFloat stutter = 0.06f; - cell.contentView.transform = CGAffineTransformMakeTranslation(SCREEN_WIDTH, 0); + cell.contentView.transform = CGAffineTransformMakeTranslation(BA_SCREEN_WIDTH, 0); [UIView animateWithDuration:1.0f delay:initialDelay + ((indexPath.row) * stutter) usingSpringWithDamping:0.6 initialSpringVelocity:0 options:0 animations:^{ cell.contentView.transform = CGAffineTransformIdentity; @@ -213,9 +213,9 @@ - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger { UILabel *headerLabel = [UILabel new]; headerLabel.frame = CGRectMake(0, 0, BA_SCREEN_WIDTH, 20); - headerLabel.textColor = BA_TEXTGrayColor; + headerLabel.textColor = BAKit_Color_Gray_1; headerLabel.font = BA_FontSize(13); - headerLabel.backgroundColor = BA_Yellow_Color; + headerLabel.backgroundColor = BAKit_Color_Yellow; [self.view addSubview:headerLabel]; @@ -245,7 +245,7 @@ - (BOOL)textFieldShouldReturn:(UITextField *)textField [self judgeTextFieldResultType:BARegularExpressionTypePhone inputString:textField.text]; break; case 1002: - [self.view ba_showAlertView:@"温馨提示:" message:[BARegularExpression ba_getPhoneNumType:textField.text]]; + [self.view ba_showAlertView:@"温馨提示:" message:[BAKit_RegularExpression ba_getPhoneNumType:textField.text]]; break; case 1003: [self judgeTextFieldResultType:BARegularExpressionTypeEmail inputString:textField.text]; @@ -292,17 +292,17 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt switch (type) { case BARegularExpressionTypePhone: - if ([BARegularExpression ba_isPhoneNumber:inputText]) + if ([BAKit_RegularExpression ba_regularIsPhoneNumber:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是电话号码!"]; } else { - [self.view ba_showAlertView:@"温馨提示:" message:@"输入的电话号码格式错误!"]; + [self.view ba_showAlertView:@"错误提示:" message:@"输入的电话号码格式错误!"]; } break; case BARegularExpressionTypeEmail: - if ([BARegularExpression ba_isEmailQualified:inputText]) + if ([BAKit_RegularExpression ba_regularIsEmailQualified:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是邮箱!"]; } @@ -312,7 +312,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeUrl: - if ([BARegularExpression ba_isUrl:inputText]) + if ([BAKit_RegularExpression ba_regularIsUrl:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是Url!"]; } @@ -322,7 +322,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeAllNumber: - if ([BARegularExpression ba_isAllNumber:inputText]) + if ([BAKit_RegularExpression ba_regularIsAllNumber:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是纯数字!"]; } @@ -332,7 +332,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeIDCard: - if ([BARegularExpression ba_isIdCardNumberQualified:inputText]) + if ([BAKit_RegularExpression ba_regularIsIdCardNumberQualified:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是身份证号码!"]; } @@ -342,7 +342,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeEnglishAlphabet: - if ([BARegularExpression ba_isEnglishAlphabet:inputText]) + if ([BAKit_RegularExpression ba_regularIsEnglishAlphabet:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是26个英文字母组成的字符串!"]; } @@ -352,7 +352,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypePasswordQualified: - if ([BARegularExpression ba_isPasswordQualified:inputText]) + if ([BAKit_RegularExpression ba_regularIsPasswordQualified:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的密码是以字母开头,长度在6-18之间,只能包含字符、数字和下划线。!"]; } @@ -362,7 +362,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeIPAddress: - if ([BARegularExpression ba_isIPAddress:inputText]) + if ([BAKit_RegularExpression ba_regularIsIPAddress:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是IP地址!"]; } @@ -372,7 +372,7 @@ - (void)judgeTextFieldResultType:(BARegularExpressionType)type inputString:(NSSt } break; case BARegularExpressionTypeChinese: - if ([BARegularExpression ba_isChinese:inputText]) + if ([BAKit_RegularExpression ba_regularIsChinese:inputText]) { [self.view ba_showAlertView:@"温馨提示:" message:@"输入的是中文!"]; } @@ -452,7 +452,7 @@ - (NSAttributedString *)attributedTextWithText:(NSString *)text withPattern:(NSS if (part.specical) { // 非表情的特殊文字 - substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{NSForegroundColorAttributeName:BA_Red_Color}]; + substr = [[NSAttributedString alloc] initWithString:part.text attributes:@{NSForegroundColorAttributeName:BAKit_Color_Red}]; } else { diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5Cell.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5Cell.m" index 6913f12..8a86651 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5Cell.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC5/DemoVC5Cell.m" @@ -95,7 +95,7 @@ - (void)setUpAllChildView _normalTextView = [[UITextView alloc]initWithFrame:CGRectMake(20, 20, BA_SCREEN_WIDTH - 40, 80)]; _normalTextView.layer.cornerRadius = 5; _normalTextView.font = BA_FontSize(14); - _normalTextView.textColor = BA_Black_Color; + _normalTextView.textColor = BAKit_Color_Black; _normalTextView.returnKeyType = UIReturnKeyDone; _normalTextView.keyboardType = UIKeyboardTypeDefault; _normalTextView.autocorrectionType = UITextAutocorrectionTypeYes; //开启自动纠错 @@ -106,11 +106,11 @@ - (void)setUpAllChildView _hightlightTextField = [[UITextField alloc]initWithFrame:CGRectMake(CGRectGetMinX(self.normalTextView.frame)+10, CGRectGetMaxY(self.normalTextView.frame)+10,CGRectGetWidth(self.normalTextView.frame)-20, 32)]; _hightlightTextField.borderStyle = UITextBorderStyleRoundedRect; - _hightlightTextField.backgroundColor = BA_White_Color; + _hightlightTextField.backgroundColor = BAKit_Color_White; _hightlightTextField.textAlignment = NSTextAlignmentLeft; _hightlightTextField.placeholder = @"请输入高亮显示的字符串"; _hightlightTextField.font = BA_FontSize(14); - _hightlightTextField.textColor = BA_Black_Color; + _hightlightTextField.textColor = BAKit_Color_Black; _hightlightTextField.keyboardType = UIKeyboardTypeNumbersAndPunctuation; _hightlightTextField.returnKeyType = UIReturnKeyNext; _hightlightTextField.clearsOnBeginEditing = YES; @@ -124,7 +124,7 @@ - (void)setUpAllChildView _resultLabel = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMinX(label.frame), CGRectGetMaxY(label.frame)+5, CGRectGetWidth(_normalTextView.frame), 80)]; _resultLabel.layer.borderWidth = 1; - _resultLabel.layer.borderColor = BA_Black_Color.CGColor; + _resultLabel.layer.borderColor = BAKit_Color_Black.CGColor; _resultLabel.layer.cornerRadius = 5; _resultLabel.layer.masksToBounds = YES; _resultLabel.adjustsFontSizeToFitWidth = YES; diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC6/DemoVC6.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC6/DemoVC6.m" index 572dffd..ff3dd7f 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC6/DemoVC6.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC6/DemoVC6.m" @@ -40,7 +40,7 @@ - (void)setupUI - (void)notBtnClick:(UIButton *)sender { // 此处使用两个时间戳的差来计算,10秒后开启通知 - NSInteger time = [[NSString BA_time_getTimeStamp] integerValue] + 10 - [[NSString BA_time_getTimeStamp] integerValue]; + NSInteger time = [[NSString ba_time_getCurrentDateTransformTimeStampYMDHMS] integerValue] + 10 - [[NSString ba_time_getCurrentDateTransformTimeStampYMDHMS] integerValue]; // NSDate *fireDate = [NSDate ba_NSDateTransformWithNSDateTimeSp:@"1464586860"]; NSLog(@"***** 通知时间:%ld", (long)time); diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC7/DemoVC7.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC7/DemoVC7.m" index 91e749d..1084d9d 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC7/DemoVC7.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC7/DemoVC7.m" @@ -57,7 +57,7 @@ - (UIButton *)submitBtn // btn.backgroundColor = [UIColor colorWithRed:0.226 green:0.780 blue:1.000 alpha:1.000]; [btn setTitle:@"确 定" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside]; - [btn jm_setCornerRadius:5 withBackgroundColor:BA_Orange_Color]; + [btn jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Orange]; btn; }); [self.view addSubview:_submitBtn]; @@ -74,7 +74,7 @@ - (IBAction)btnAction:(UIButton *)btn { url = [NSString stringWithFormat:@"http://%@",url]; } - else if ([BARegularExpression ba_isUrl:url]) + else if ([BAKit_RegularExpression ba_regularIsUrl:url]) { url = url; } diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC8/DemoVC8.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC8/DemoVC8.m" index e5f349b..1a92647 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC8/DemoVC8.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC8/DemoVC8.m" @@ -121,7 +121,8 @@ - (UIDatePicker *)datePicker { _datePicker = [[UIDatePicker alloc] init]; _datePicker.frame = CGRectMake(0, _btn2.bottom + 20, BA_SCREEN_WIDTH, 200); - + _datePicker.backgroundColor = [UIColor blackColor]; + /*! 跟踪所有可用的地区,取出想要的地区 */ BALog(@"%@", [NSLocale availableLocaleIdentifiers]); @@ -167,11 +168,62 @@ - (UIDatePicker *)datePicker /*! 8、当值发生改变的时候调用的方法 */ [_datePicker addTarget:self action:@selector(datePickValueChanged:) forControlEvents:UIControlEventValueChanged]; + /*! 9、用 runtime 和 KVC 改变字体颜色 */ + [self setTextColor]; + [self.view addSubview:_datePicker]; } return _datePicker; } +- (void)setTextColor +{ + // 获取所有的属性,去查看有没有对应的属性 + unsigned int count = 0; + objc_property_t *propertys = class_copyPropertyList([UIDatePicker class], &count); + for(int i = 0;i < count;i ++){ + + // 获得每一个属性 + objc_property_t property = propertys[i]; + // 获得属性对应的nsstring + NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; + // 输出打印看对应的属性 + NSLog(@"propertyname = %@",propertyName); + if ([propertyName isEqualToString:@"textColor"]) + { + [_datePicker setValue:[UIColor redColor] forKey:propertyName]; + } + } + + /*! + UIDatePicker 所有的属性,所以不能改变字体大小,需要改字体的只能使用 pickview 自定义了! + + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = usesBlackChrome + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = drawsBackground + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = allowsZeroCountDownDuration + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = allowsZeroTimeInterval + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = dateUnderSelectionBar + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = contentWidth + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = isTimeIntervalMode + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = useCurrentDateDuringDecoding + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = _usesModernStyle + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = highlightColor + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = textColor + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = textShadowColor + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = timeInterval + 2016-10-09 15:47:52.058 BABaseProject[1198:300932] propertyname = shouldAnimateSetDateCall + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = datePickerMode + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = locale + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = calendar + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = timeZone + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = date + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = minimumDate + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = maximumDate + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = countDownDuration + 2016-10-09 15:47:52.059 BABaseProject[1198:300932] propertyname = minuteInterval + */ +} + - (void)datePickValueChanged:(UIDatePicker *)sender { self.selectedDate = sender.date; diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC9/DemoVC9.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC9/DemoVC9.m" index 81aa746..2dee5e3 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC9/DemoVC9.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/DemoVC/DemoVC9/DemoVC9.m" @@ -24,7 +24,7 @@ - (void)viewDidLoad { // Do any additional setup after loading the view. self.title = @"浮动布局2"; - self.view.backgroundColor = BA_White_Color; + self.view.backgroundColor = BAKit_Color_White; [self setupUI]; } @@ -33,11 +33,11 @@ - (void)setupUI { UIScrollView *scrollView = [UIScrollView new]; self.view = scrollView; - scrollView.backgroundColor = BA_Yellow_Color; + scrollView.backgroundColor = BAKit_Color_Yellow; MyLinearLayout *rootLayout = [MyLinearLayout linearLayoutWithOrientation:MyLayoutViewOrientation_Vert]; rootLayout.myLeftMargin = rootLayout.myRightMargin = 0; - rootLayout.backgroundColor = BA_White_Color; + rootLayout.backgroundColor = BAKit_Color_White; [scrollView addSubview:rootLayout]; /*! 里面的子视图的宽度都和布局视图相等,这样子视图就不需要设置宽度了。 */ diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Model/BAHomeVCModel.h" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Model/BAHomeVCModel.h" index 7abdd57..e2372d1 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Model/BAHomeVCModel.h" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/Model/BAHomeVCModel.h" @@ -11,10 +11,10 @@ @interface BAHomeVCModel : BABaseModel /*! 标题 */ -@property (nonatomic, strong) NSString *titleLabel; +@property (nonatomic, copy) NSString *titleLabel; /*! 内容 */ -@property (nonatomic, strong) NSString *contentLabel; +@property (nonatomic, copy) NSString *contentLabel; @end diff --git "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/View/view1.m" "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/View/view1.m" index 64ad216..2c6eba4 100755 --- "a/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/View/view1.m" +++ "b/BABaseProject/BAMainCode/BACode/Home(\351\246\226\351\241\265)/View/view1.m" @@ -81,7 +81,7 @@ - (void)creatData { [self addCell:@"1、AFNetWorking的完美封装" content:@"封装AFN,实现简单的get和post请求,可以自定义请求头,可以解析json数据、xml数据、data数据,可以获取缓存数据。" class:@"DemoVC1"]; [self addCell:@"2、清理缓存" content:@"清理网络请求缓存和图片缓存,可清理系统缓存!" class:@"DemoVC2"]; - [self addCell:@"3、点击button倒计时" content:@"两种比较常用的获取倒计时验证码的样式!新增一种自定义警告框,可以点击屏幕消失!新增了一种跑马灯广告效果,希望能帮助部分用户!" class:@"DemoVC3"]; + [self addCell:@"3、BAButton" content:@"两种比较常用的获取倒计时验证码的样式!新增一种自定义警告框,可以点击屏幕消失!新增了一种跑马灯广告效果,希望能帮助部分用户!" class:@"DemoVC3"]; [self addCell:@"4、友盟分享和友盟登陆的完美封装" content:@"包含:微博、微信、朋友圈、QQ、空间、短信的分享和登陆,可以使用默认列表,也可以自定义单个分享和登陆!" class:@"DemoVC4"]; [self addCell:@"5、正则表达式最新封装" content:@"包含:手机号码、运营商类型(判断移动、联通、电信)、邮箱、数字、中英文、URL、身份证号码等!还可以文字筛选高亮显示!" class:@"DemoVC5"]; [self addCell:@"6、本地通知最新完美封装" content:@"最近整理了下本地通知和极光推送,有很多坑都踩过了,刚刚整理出来的完美封装,肯定适合大部分场合,也可以用此封装写闹钟,也提醒事件,都可以!【刚添加了本地通知的跳转事件处理!】如果喜欢,请在git上点个星吧!" class:@"DemoVC6"]; @@ -90,9 +90,9 @@ - (void)creatData [self addCell:@"9、流式布局和线性布局库的使用" content:@"用流式布局和线性布局库MyLayout,写了一个collectionView,如果喜欢,请在git上点个星吧!" class:@"DemoVC9"]; [self addCell:@"10、collectionView的简单使用" content:@"用View写的写了一个简单的collectionView,可随意添加到任何地方,如果喜欢,请在git上点个星吧!" class:@"DemoVC10"]; [self addCell:@"11、collectionView的浮动布局" content:@"自适应宽高的collectionView,自定义layout,如果喜欢,请在git上点个星吧!" class:@"DemoVC11"]; - [self addCell:@"12、各种自定义弹框" content:@"各种自定义弹框,系统的、自定义的弹框,如果喜欢,请在git上点个星吧!" class:@"DemoVC12"]; + [self addCell:@"12、BAAlert 各种自定义弹框" content:@"各种自定义弹框,系统的、自定义的弹框,如果喜欢,请在git上点个星吧!" class:@"DemoVC12"]; [self addCell:@"13、GCD入门" content:@"GCD入门学习,小白可以看,大神自行绕过!如果喜欢,请在git上点个星吧!" class:@"DemoVC13"]; - + [self addCell:@"14、OC的set/get 方法的区别!" content:@"OC的set/get 方法的区别!,小白可以看,大神自行绕过!如果喜欢,请在git上点个星吧!" class:@"DemoVC14"]; } - (void)addCell:(NSString *)title content:(NSString *)content class:(NSString *)className @@ -246,7 +246,7 @@ - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)ce static CGFloat initialDelay = 0.2f; static CGFloat stutter = 0.06f; - cell.contentView.transform = CGAffineTransformMakeTranslation(SCREEN_WIDTH, 0); + cell.contentView.transform = CGAffineTransformMakeTranslation(BA_SCREEN_WIDTH, 0); [UIView animateWithDuration:1.0f delay:initialDelay + ((indexPath.row) * stutter) usingSpringWithDamping:0.6 initialSpringVelocity:0 options:0 animations:^{ cell.contentView.transform = CGAffineTransformIdentity; diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.h" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.h" new file mode 100644 index 0000000..9e050e1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.h" @@ -0,0 +1,33 @@ +// +// BAUserModel.h +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BABaseModel.h" + +#define BAUSERSHARE [BAUserModel sharedBAUserModel] + +@interface BAUserModel : BABaseModel + +/*!电话号码 */ +@property (nonatomic, copy ) NSString *phone; + +/*!昵称 */ +@property (nonatomic, copy ) NSString *nickName; + +/*!密码 */ +@property (nonatomic, copy ) NSString *pwd; + +/*!用户识别码:唯一【登录后才有】 */ +@property (nonatomic, copy ) NSString *userCode; + +@property (nonatomic, assign) BOOL isLogin; + + ++ (BAUserModel *)sharedBAUserModel; + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.m" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.m" new file mode 100644 index 0000000..2dc96a9 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/Model/BAUserModel.m" @@ -0,0 +1,52 @@ +// +// BAUserModel.m +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BAUserModel.h" + +@implementation BAUserModel + + +/*! + * 单例对象对外的唯一接口,用到dispatch_once在初始化时执行一次任务,且dispatch_once保证线程安全 + * + */ ++ (BAUserModel *)sharedBAUserModel +{ + /*! 为单例对象创建的静态实例,置为nil,因为对象的唯一性,必须是static类型 */ + static id sharedBAUserModel = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedBAUserModel = [[super allocWithZone:NULL] init]; + }); + return sharedBAUserModel; +} + +/*! + * 重写allocWithZone方法,保证alloc或者init创建的实例不会产生新实例,因为该类覆盖了allocWithZone方法,所以只能通过其父类分配内存,即[super allocWithZone] + * + */ ++ (instancetype)allocWithZone:(struct _NSZone *)zone +{ + return [self sharedBAUserModel]; +} + +- (id)copy +{ + NSLog(@"这是一个单例对象,copy将不起任何作用"); + return self; +} + ++ (id)copyWithZone:(struct _NSZone *)zone +{ + return [self sharedBAUserModel]; +} + + + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.h" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.h" new file mode 100644 index 0000000..8f68974 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.h" @@ -0,0 +1,14 @@ +// +// LoginViewController.h +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface BALoginViewController : BABaseViewController + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.m" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.m" new file mode 100644 index 0000000..858b3df --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.m" @@ -0,0 +1,165 @@ +// +// BALoginViewController.m +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BALoginViewController.h" +#import "BAUserSqlite.h" +#import "BARegistViewController.h" +#import "BAProfileViewController.h" + +#import "BAUserModel.h" +#import "BALoginViewModel.h" + + +@interface BALoginViewController () +@property (weak, nonatomic) IBOutlet BATextField *phoneNumTextField; +@property (weak, nonatomic) IBOutlet BATextField *pwdTextField; +@property (weak, nonatomic) IBOutlet UIButton *loginButton; + +@property (nonatomic, strong) BALoginViewModel *loginViewModel; + +- (IBAction)loginButtonAction:(UIButton *)sender; +- (IBAction)registButtonAction:(UIButton *)sender; + +@end + +@implementation BALoginViewController + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self setupUI]; +} + +- (void)setupUI +{ + self.title = @"登 录"; + + NSString *dbPath = [JKDBHelper dbPath]; + NSLog(@"数据库路径:%@", dbPath); + [self setupViewModel]; + [[self.loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) { + [self.loginViewModel login]; + }]; +} + +- (void)setupViewModel +{ + self.loginViewModel = [BALoginViewModel new]; + + RAC(self.loginViewModel, user_name) = self.phoneNumTextField.rac_textSignal; + RAC(self.loginViewModel, user_pwd) = self.pwdTextField.rac_textSignal; + RAC(self.loginButton, enabled) = [self.loginViewModel loginButtonIsValid]; + + NSString *db_phone = [NSString stringWithFormat:@" WHERE phone = %@ ", _phoneNumTextField.text]; + + BAUserSqlite *userSqlite = [BAUserSqlite findFirstByCriteria:db_phone]; + @weakify(self); + + + [self.loginViewModel.successObject subscribeNext:^(id _Nullable x) { + @strongify(self); + + /*! 登录成功后,将数据库获取信息赋值给 BAUserModel,并发送通知 */ + BAUserModel *model = [BAUserModel new]; + model.phone = userSqlite.phone; + model.nickName = userSqlite.nickName; + model.pwd = userSqlite.pwd; + model.isLogin = YES; + + [self.view BA_showAlertWithTitle:@"登录成功!"]; + NSDictionary *dict =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"isLogin", nil]; + + NSNotification *notification = [NSNotification notificationWithName:BANotioKey_LoginFinish object:nil userInfo:dict]; + + [BA_NotiCenter postNotification:notification]; + [self.navigationController popViewControllerAnimated:YES]; + }]; + + [self.loginViewModel.failureObject subscribeNext:^(id _Nullable x) { + @strongify(self); + [self.view BA_showAlertWithTitle:@"密码错误!,请重新登录!"]; + }]; + + [self.loginViewModel.errorObject subscribeNext:^(id _Nullable x) { + @strongify(self); + [self.view BA_showAlertWithTitle:@"账号不存在,请注册!"]; + [self.navigationController pushViewController:[BARegistViewController new] animated:YES]; + }]; +} + +- (IBAction)loginButtonAction:(UIButton *)sender +{ +// if ([BACommon ba_isNSStringNULL:_phoneNumTextField.text] || [BACommon ba_isNSStringNULL:_pwdTextField.text]) +// { +// [self.view BA_showAlertWithTitle:@"手机号码或密码不能为空!"]; +// return; +// } +// +// NSString *db_phone = [NSString stringWithFormat:@" WHERE phone = %@ ", _phoneNumTextField.text]; +// +// BAUserSqlite *userSqlite = [BAUserSqlite findFirstByCriteria:db_phone]; +// +// if (userSqlite.phone) +// { +// if ([_pwdTextField.text isEqualToString:userSqlite.pwd]) +// { +// /*! 登录成功后,将数据库获取信息赋值给 BAUserModel,并发送通知 */ +// BAUserModel *model = [BAUserModel new]; +// model.phone = userSqlite.phone; +// model.nickName = userSqlite.nickName; +// model.pwd = userSqlite.pwd; +// model.isLogin = YES; +// +// [self.view BA_showAlertWithTitle:@"登录成功!"]; +// NSDictionary *dict =[[NSDictionary alloc] initWithObjectsAndKeys:@"1",@"isLogin", nil]; +// +// NSNotification *notification = [NSNotification notificationWithName:BANotioKey_LoginFinish object:nil userInfo:dict]; +// +// [BA_NotiCenter postNotification:notification]; +// [self.navigationController popViewControllerAnimated:YES]; +// } +// else +// { +// [self.view BA_showAlertWithTitle:@"密码错误!,请重新登录!"]; +// } +// } +// else +// { +// _phoneNumTextField.text = nil; +// _pwdTextField.text = nil; +// +// [self.view BA_showAlertWithTitle:@"账号不存在,请注册!"]; +// [self.navigationController pushViewController:[BARegistViewController new] animated:YES]; +// } +} + +- (IBAction)registButtonAction:(UIButton *)sender +{ + [self.navigationController pushViewController:[BARegistViewController new] animated:YES]; +} + +- (void)dealloc +{ + /*! 移除监听 */ +// [self.phoneNumTextField removeObserver:self forKeyPath:@"text"]; + +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.xib" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.xib" new file mode 100644 index 0000000..7a29e80 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BALoginViewController.xib" @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.h" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.h" new file mode 100644 index 0000000..0f97707 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.h" @@ -0,0 +1,13 @@ +// +// RegistViewController.h +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface BARegistViewController : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.m" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.m" new file mode 100644 index 0000000..a051336 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.m" @@ -0,0 +1,82 @@ +// +// BARegistViewController.m +// test +// +// Created by 博爱 on 2016/11/25. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "BARegistViewController.h" +#import "BAUserSqlite.h" + +@interface BARegistViewController () + +@property (weak, nonatomic) IBOutlet BATextField *phoneNumTextField; +@property (weak, nonatomic) IBOutlet BATextField *nickNameTextField; +@property (weak, nonatomic) IBOutlet BATextField *pwd1TextField; +@property (weak, nonatomic) IBOutlet BATextField *pwd2TextField; +@property (weak, nonatomic) IBOutlet UIButton *registButton; + +- (IBAction)registButtonAction:(UIButton *)sender; + +@end + +@implementation BARegistViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + [self setupUI]; +} + +- (void)setupUI +{ + self.title = @"注 册"; + +// _phoneNumTextField.phoneRestrict = YES; +// _phoneNumTextField.textfieldStyle = BATextfieldStylePhone; + // 0337 6711 76 +} + +- (IBAction)registButtonAction:(UIButton *)sender +{ + if (![BAKit_RegularExpression ba_regularIsMobileNumber:_phoneNumTextField.text]) + { + [self.view BA_showAlertWithTitle:@"请输入合法的手机号码!"]; + return; + } + if ([BACommon ba_isNSStringNULL:_nickNameTextField.text]) + { + [self.view BA_showAlertWithTitle:@"昵称不能为空!"]; + return; + } + if (![BAKit_RegularExpression ba_regularIsPasswordQualified:_pwd1TextField.text]) + { + [self.view BA_showAlertWithTitle:@"密码必须为6-8位的字母数字混合!"]; + return; + } + if (![_pwd1TextField.text isEqualToString:_pwd2TextField.text]) + { + [self.view BA_showAlertWithTitle:@"两次密码输入不一致!"]; + return; + } + + BAUserSqlite *userSqlite = [BAUserSqlite new]; + userSqlite.phone = _phoneNumTextField.text; + userSqlite.nickName = _nickNameTextField.text; + userSqlite.pwd = _pwd1TextField.text; + + BAKit_WeakSelf; + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + BAKit_StrongSelf + [userSqlite save]; + [self.view BA_showAlertWithTitle:@"注册成功!"]; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + dispatch_async(dispatch_get_main_queue(), ^{ + [self.navigationController popViewControllerAnimated:YES]; + }); + }); + }); +} +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.xib" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.xib" new file mode 100644 index 0000000..b480156 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewController/BARegistViewController.xib" @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.h" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.h" new file mode 100644 index 0000000..c837078 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.h" @@ -0,0 +1,23 @@ +// +// BALoginViewModel.h +// BABaseProject +// +// Created by boai on 2017/3/15. +// Copyright © 2017年 博爱之家. All rights reserved. +// + +#import + +@interface BALoginViewModel : NSObject + +@property (nonatomic, strong) NSString *user_name; +@property (nonatomic, strong) NSString *user_pwd; + +@property (nonatomic, strong) RACSubject *successObject; +@property (nonatomic, strong) RACSubject *failureObject; +@property (nonatomic, strong) RACSubject *errorObject; + +- (id)loginButtonIsValid; +- (void)login; + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.m" "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.m" new file mode 100644 index 0000000..db01cab --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Login(\347\231\273\351\231\206)/ViewModel/BALoginViewModel.m" @@ -0,0 +1,85 @@ +// +// BALoginViewModel.m +// BABaseProject +// +// Created by boai on 2017/3/15. +// Copyright © 2017年 博爱之家. All rights reserved. +// + +#import "BALoginViewModel.h" +#import "BAUserSqlite.h" + +@interface BALoginViewModel () + +@property (nonatomic, strong) RACSignal *user_name_signal; +@property (nonatomic, strong) RACSignal *user_pwd_signal; +@property (nonatomic, strong) NSArray *dataArray; + +@end + +@implementation BALoginViewModel + +- (instancetype)init +{ + if (self = [super init]) + { + [self setupUI]; + } + return self; +} + +- (void)setupUI +{ + _user_name_signal = RACObserve(self, user_name); + _user_pwd_signal = RACObserve(self, user_pwd); + _successObject = [RACSubject subject]; + _failureObject = [RACSubject subject]; + _errorObject = [RACSubject subject]; + +} + +- (id)loginButtonIsValid +{ + RACSignal *isValid = [RACSignal combineLatest:@[_user_name_signal, _user_pwd_signal] reduce:^id(NSString *user_name, NSString *user_pwd){ + return @(user_name.length >= 6 && user_pwd.length >= 6); + }]; + return isValid; +} + +- (void)login +{ + /*! 网络请求进行登录 */ + _dataArray = @[_user_name, _user_pwd]; + + /*! 业务逻辑失败和网络请求失败发送fail或者error信号并传参 */ + + + if ([BACommon ba_isNSStringNULL:_user_name] || [BACommon ba_isNSStringNULL:_user_pwd]) + { + [self BA_showAlertWithTitle:@"手机号码或密码不能为空!"]; + return; + } + + NSString *db_phone = [NSString stringWithFormat:@" WHERE phone = %@ ", _user_name]; + + BAUserSqlite *userSqlite = [BAUserSqlite findFirstByCriteria:db_phone]; + + if (userSqlite.phone) + { + if ([_user_pwd isEqualToString:userSqlite.pwd]) + { + /*! 成功发送成功的信号 */ + [_successObject sendNext:_dataArray]; + } + else + { + [_failureObject sendNext:_dataArray]; + } + } + else + { + [_errorObject sendNext:_dataArray]; + } +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.h" index 779758a..17651fb 100755 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.h" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.h" @@ -58,8 +58,8 @@ */ -#import "BABaseViewController.h" +#import "BAMessageViewController.h" -@interface BAMessageViewController : BABaseViewController +@interface BAMessageViewController : UIViewController @end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.m" index 7cdff2e..5d41849 100755 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/Controller/BAMessageViewController.m" @@ -84,25 +84,29 @@ - (void)viewWillAppear:(BOOL)animated [self.navigationController.navigationBar setShadowImage:[UIImage new]]; [self.navigationController.navigationBar ba_setBackgroundColor:[UIColor clearColor]]; - [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:BA_Black_Color, NSForegroundColorAttributeName, nil]]; + [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:BAKit_Color_Black, NSForegroundColorAttributeName, nil]]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:BA_Black_Color, NSForegroundColorAttributeName, nil]]; + [self.navigationController.navigationBar setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:BAKit_Color_Black, NSForegroundColorAttributeName, nil]]; [self.navigationController.navigationBar setShadowImage:[UIImage new]]; - [self.navigationController.navigationBar ba_setBackgroundColor:BA_White_Color]; + [self.navigationController.navigationBar ba_setBackgroundColor:BAKit_Color_White]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - self.vcBgColor = BA_Yellow_Color; + self.view.backgroundColor = BAKit_Color_Yellow; self.title = @"消 息"; + + [self ba_setupNavi]; + [self ba_setupUI]; + } - (void)ba_setupNavi @@ -122,11 +126,12 @@ - (void)creatData [self addCell:@"tableView的高级用法1" content:@"1、封装baseCell" class:@"DemoVC2_01"]; [self addCell:@"cell的分组展开收回" content:@"2、cell的分组展开收回" class:@"DemoVC2_02"]; [self addCell:@"系统各种设置的跳转" content:@"3、系统各种设置的跳转" class:@"DemoVC2_03"]; - [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; - [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; - [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; - [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; - [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; + [self addCell:@"博爱百度地图" content:@"4、博爱百度地图" class:@"DemoVC2_04"]; + [self addCell:@"runtime 的常用方法" content:@"5、runtime 的常用方法" class:@"DemoVC2_05"]; + [self addCell:@"NSMutableAttributedString 的完美封装" content:@"6、NSMutableAttributedString 的完美封装" class:@"DemoVC2_06"]; + [self addCell:@"iOS 各种基本算法" content:@"7、iOS 各种基本算法:选择排序、冒泡排序、快速排序..." class:@"DemoVC2_07"]; + [self addCell:@"OC 与 JS 交互" content:@"8、OC 与 JS 交互" class:@"DemoVC2_08"]; + [self addCell:@"OC 基础动画" content:@"9、OC 基础动画" class:@"DemoVC2_09"]; [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; [self addCell:@"系统各种设置的跳转" content:@"3、上滑测试渐变navi" class:@"DemoVC2_03"]; @@ -238,8 +243,8 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat alpha = (self.tableView.contentOffset.y - 30) / 75; - _statusBarView.backgroundColor = [BA_Red_Color colorWithAlphaComponent:alpha]; - self.navigationController.navigationBar.backgroundColor = [BA_Red_Color colorWithAlphaComponent:alpha]; + _statusBarView.backgroundColor = [BAKit_Color_Red colorWithAlphaComponent:alpha]; + self.navigationController.navigationBar.backgroundColor = [BAKit_Color_Red colorWithAlphaComponent:alpha]; } } diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01.m" index 79cf10f..a4428a8 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01.m" @@ -77,7 +77,7 @@ - (void)createDataSource @"Star \"https://github.com/boai\" :)" ]; - BA_Weak; + BA_WEAKSELF; [GCDQueue executeInMainQueue:^{ NSMutableArray *indexPaths = [NSMutableArray array]; diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_Model.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_Model.m" index e279545..be58a08 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_Model.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_Model.m" @@ -25,7 +25,7 @@ @implementation DemoVC2_01_Model */ - (void)calculateTheExpendStringHeightWithStringAttribute:(NSDictionary *)attribute fixedWidth:(CGFloat)width { - self.expendStringHeight = 10 + [self.contentString ba_heightWithStringAttribute:attribute fixedWidth:width] + 10; + self.expendStringHeight = 10 + [self.contentString ba_stringGetHeightWithStringAttributeDictionary:attribute width:width] + 10; } /*! @@ -36,12 +36,13 @@ - (void)calculateTheExpendStringHeightWithStringAttribute:(NSDictionary *)attribute fixedWidth:(CGFloat)width { - CGFloat oneLineHeight = [NSString ba_oneLineOfTextHeightWithStringAttribute:attribute]; - CGFloat textHeight = [self.contentString ba_heightWithStringAttribute:attribute fixedWidth:width]; + CGFloat oneLineHeight = [NSString ba_stringGetOneLineOfTextHeightWithStringAttribute:attribute]; + CGFloat textHeight = [self.contentString ba_stringGetHeightWithStringAttributeDictionary:attribute width:width]; CGFloat normalTextHeight = textHeight >= 3 * oneLineHeight ? 3 * oneLineHeight : textHeight; self.normalStringHeight = 10 + normalTextHeight + 10; } + @end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_cell.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_cell.m" index 7c12b1f..b516d3f 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_cell.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-1/DemoVC2_01_cell.m" @@ -45,7 +45,7 @@ - (void)ba_buildSubview self.expendLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, BA_SCREEN_WIDTH - 20, 0)]; self.expendLabel.bakit_manager .label_numberOfLines(.0f) - .label_textColor(BA_Black_Color) + .label_textColor(BAKit_Color_Black) .label_font([UIFont HeitiSCWithFontSize:14.0f]); [self.contentView ba_AddSubViewsWithArray:@[_line, _stateView, _normalLabel, _expendLabel]]; @@ -96,7 +96,7 @@ - (void)normalState [UIView animateWithDuration:0.35f animations:^{ self.normalLabel.alpha = 1.0f; self.expendLabel.alpha = 0.f; - self.stateView.backgroundColor = BA_TEXTGrayColor; + self.stateView.backgroundColor = BAKit_Color_Gray_1; }]; } @@ -105,7 +105,7 @@ - (void)expandState [UIView animateWithDuration:0.35f animations:^{ self.normalLabel.alpha = 0.f; self.expendLabel.alpha = 1.f; - self.stateView.backgroundColor = BA_Red_Color; + self.stateView.backgroundColor = BAKit_Color_Red; }]; } diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02.m" index b74d801..881427c 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02.m" @@ -130,7 +130,7 @@ - (void)createDatas ] } ]; - BA_Weak; + BA_WEAKSELF; [datas enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { DemoVC2_02_classModel *model = [[DemoVC2_02_classModel alloc] initWithDictionary:obj]; @@ -287,7 +287,7 @@ - (void)ba_customHeaderFooterView:(BABaseHeaderFooterView *)customHeaderFooterVi - (void)firstLoadDataAnimation { - BA_Weak; + BA_WEAKSELF; [GCDQueue executeInMainQueue:^{ /*! Extend sections */ diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02_HeaderView.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02_HeaderView.m" index f2d0971..5c891ba 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02_HeaderView.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-2/DemoVC2_02_HeaderView.m" @@ -25,7 +25,7 @@ - (void)ba_buildSubview { // 白色背景 UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, BA_SCREEN_WIDTH, 30)]; - backgroundView.backgroundColor = BA_White_Color; + backgroundView.backgroundColor = BAKit_Color_White; // 灰色背景 UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 2, BA_SCREEN_WIDTH, 26)]; @@ -55,7 +55,7 @@ - (void)ba_buildSubview _highClassNameLabel = [[UILabel alloc] initWithFrame:_normalClassNameLabel.frame]; _highClassNameLabel.font = _normalClassNameLabel.font; - _highClassNameLabel.textColor = BA_Red_Color; + _highClassNameLabel.textColor = BAKit_Color_Red; [self addSubview:backgroundView]; diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-3/DemoVC2_03.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-3/DemoVC2_03.m" index 2213b69..f05d8c4 100644 --- "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-3/DemoVC2_03.m" +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-3/DemoVC2_03.m" @@ -20,11 +20,20 @@ @interface DemoVC2_03 () @implementation DemoVC2_03 +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + +#ifdef BA_SIMULATOR_TEST + [self.view ba_showAlertView:@"温馨提示:" message:@"请在真机中运行!"]; +#endif +} + - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - self.vcBgColor = BA_Yellow_Color; + self.vcBgColor = BAKit_Color_Yellow; self.title = @"各种系统设置的跳转"; self.tableView.hidden = NO; @@ -41,8 +50,8 @@ - (NSArray *)titlesArray if (!_titlesArray) { _titlesArray = @[@"1、本APP设置的跳转", - @"2、跳到WIFI界面" , - @"3、跳到General界面", + @"2、跳到WIFI界面", + @"3、拨打电话的几种方式", @"4、跳到About关于本机界面", @"5、跳到Accessibility辅助功能界面", @"6、跳到AirplaneModeOn飞行模式界面", @@ -54,7 +63,8 @@ - (NSArray *)titlesArray @"12、跳到DATE_AND_TIME日期和时间界面", @"13、跳到FaceTime界面", @"14、跳到Keyboard界面", - @"15、跳到iCloud界面" + @"15、跳到iCloud界面", + @"16、跳到General界面" ]; } @@ -184,55 +194,61 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath /*! 点击立刻取消该cell的选中状态 */ [tableView deselectRowAtIndexPath:indexPath animated:YES]; +// if (isiOS10) +// { +// [self.view ba_showAlertView:@"博爱温馨提示:" message:@"iOS 10 干掉了所有系统设置的 URL Scheme,这意味着你再也不可能直接跳转到系统设置页面(比如 WiFi、蜂窝数据、定位等!"]; +// } + BASystermSetting *settingManager = [BASystermSetting ba_systermSettingManage]; switch (indexPath.row) { case 0: - [self ba_gotoSystermSettings]; + [settingManager ba_gotoSystermSettings]; break; case 1: - [self ba_gotoSystermWIFISettings]; + [settingManager ba_gotoSystermWIFISettings]; break; case 2: - [self ba_gotoSystermGeneralSettings]; + [BACommon ba_telWithPhoneNumber:@"10010"]; break; case 3: - [self ba_gotoSystermAboutSettings]; + [settingManager ba_gotoSystermAboutSettings]; break; case 4: - [self ba_gotoSystermAccessibilitySettings]; + [settingManager ba_gotoSystermAccessibilitySettings]; break; case 5: - [self ba_gotoSystermAirplaneModeOnSettings]; + [settingManager ba_gotoSystermAirplaneModeOnSettings]; break; case 6: - [self ba_gotoSystermAutoLockSettings]; + [settingManager ba_gotoSystermAutoLockSettings]; break; case 7: - [self ba_gotoSystermBrightnessSettings]; + [settingManager ba_gotoSystermBrightnessSettings]; break; case 8: - [self ba_gotoSystermMICROPHONESettings]; + [settingManager ba_gotoSystermMICROPHONESettings]; break; case 9: - [self ba_gotoSystermCONTACTSSettings]; + [settingManager ba_gotoSystermCONTACTSSettings]; break; case 10: - [self ba_gotoSystermBluetoothSettings]; + [settingManager ba_gotoSystermBluetoothSettings]; break; case 11: - [self ba_gotoSystermDATE_AND_TIMESettings]; + [settingManager ba_gotoSystermDATE_AND_TIMESettings]; break; case 12: - [self ba_gotoSystermFaceTimeSettings]; + [settingManager ba_gotoSystermFaceTimeSettings]; break; case 13: - [self ba_gotoSystermKeyboardSettings]; + [settingManager ba_gotoSystermKeyboardSettings]; break; case 14: - [self ba_gotoSystermiCloudSettings]; + [settingManager ba_gotoSystermiCloudSettings]; + break; + case 15: + [settingManager ba_gotoSystermGeneralSettings]; break; - - default: break; } diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.h" new file mode 100644 index 0000000..bc78778 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_04.h +// BABaseProject +// +// Created by boai on 2016/9/21. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_04 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.m" new file mode 100644 index 0000000..8e8f180 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/DemoVC2_04.m" @@ -0,0 +1,797 @@ +// +// DemoVC2_04.m +// BABaseProject +// +// Created by boai on 2016/9/21. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_04.h" +#import //引入base相关所有的头文件 + +#import //引入地图功能所有的头文件 + +#import //引入检索功能所有的头文件 + +#import //引入云检索功能所有的头文件 + +#import //引入定位功能所有的头文件 + +#import //引入计算工具所有的头文件 + +#import //引入周边雷达功能所有的头文件 + +#import //只引入所需的单个头文件 + +#import +#import + +#import +#import + + +#define MYBUNDLE_NAME @ "mapapi.bundle" +#define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME] +#define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH] + + +@interface DemoVC2_04 () +< + BMKMapViewDelegate, + BMKLocationServiceDelegate, + BMKGeoCodeSearchDelegate, + BMKPoiSearchDelegate, + UIGestureRecognizerDelegate, + UITextFieldDelegate +> +{ + BMKLocationService *_locService; + BMKGeoCodeSearch * _geocodesearch; + + BOOL enableCustomMap; + BOOL isGeoSearch; + + BMKPointAnnotation *pointAnnotation; + BMKPoiSearch *_poisearch; + int curPage; + +} + +@property(nonatomic, strong) BMKMapView *mapView; +@property (nonatomic, strong) NSString *searchKeyWord; + +@property(nonatomic, strong) UIButton *locationButton; +@property(nonatomic, strong) UIView *searchView; +@property(nonatomic, strong) UILabel *searchLabel; +@property(nonatomic, strong) UITextField *searchTextField; +@property(nonatomic, strong) UIButton *voiceButton; + +@property (nonatomic, strong) BMKAddressComponent *myCurrent_addressDetail; +// 当前所处位置的纬度 经度 +@property(nonatomic, assign) CLLocationCoordinate2D myCurrent_locationCoordinate2D; + +@end + +@implementation DemoVC2_04 + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + [self base_viewWillAppear]; +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [self base_viewWillDisappear]; + +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. + + [self setupUI]; +} + +- (void)base_viewWillAppear +{ + [_mapView viewWillAppear]; + _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 + _locService.delegate = self; + _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 + _poisearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 + + [self startLocation]; +} + +- (void)base_viewWillDisappear +{ + [_mapView viewWillDisappear]; + // _mapView.delegate = nil; // 不用时,置nil + // _locService.delegate = nil; + // _geocodesearch.delegate = nil; // 不用时,置nil + // _poisearch.delegate = nil; // 不用时,置nil + + // [self stopLocation]; +} + +- (void)setupUI +{ + + // [self startLocation]; + + self.mapView.hidden = NO; + self.locationButton.hidden = NO; + self.searchView.hidden = NO; + self.searchTextField.hidden = NO; + self.voiceButton.hidden = NO; +} + +- (void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + + min_x = 0; + min_y = 0; + min_w = SCREENWIDTH; + min_h = SCREENHEIGHT - min_y - 49; + + self.mapView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = 20; + min_y = SCREENHEIGHT - 100; + min_w = 30; + min_h = min_w; + + self.locationButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = 10; + min_y = 20; + min_w = SCREENWIDTH - 2 * min_x; + min_h = 50; + + self.searchView.frame = CGRectMake(min_x, min_y, min_w, min_h); + [self.searchView ba_setBordersWithColor:nil andCornerRadius:5 andWidth:0]; + + min_y = 0; + CGSize size = BAKit_LabelSizeWithTextAndFont(self.searchLabel.text, BAKit_Font_systemFontOfSize_15); + min_w = size.width; + + self.searchLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_w = 30; + min_x = self.searchView.width - min_w - 10; + min_h = min_w; + self.voiceButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.voiceButton.centerY = self.searchLabel.centerY; + + min_x = self.searchLabel.right + 0; + min_w = self.voiceButton.x - min_x; + min_h = 50; + self.searchTextField.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.searchTextField.centerY = self.searchLabel.centerY; + +} + +#pragma mark - 搜索附近信息 +- (void)ba_mapBasePointSearchKeyWord:(NSString *)searchKeyWord +{ + _mapView.isSelectedAnnotationViewFront = YES; + + curPage = 0; + BMKBasePoiSearchOption *basePoiSearchOption = [[BMKBasePoiSearchOption alloc]init]; + basePoiSearchOption.pageIndex = curPage; + basePoiSearchOption.pageCapacity = 10; + basePoiSearchOption.keyword = searchKeyWord; + // basePoiSearchOption.location = locationCoordinate2D; + + // BOOL flag = [_poisearch poiSearchNearBy:basePoiSearchOption]; + // if(flag) + // { + //// _nextPageButton.enabled = true; + // NSLog(@"城市内检索发送成功"); + // } + // else + // { + //// _nextPageButton.enabled = false; + // NSLog(@"城市内检索发送失败"); + // } + +} + +- (void)ba_mapPointNearbySearchLocationCoordinate2D:(CLLocationCoordinate2D)locationCoordinate2D + searchKeyWord:(NSString *)searchKeyWord +{ + _mapView.isSelectedAnnotationViewFront = YES; + + curPage = 0; + BMKNearbySearchOption *nearbyPoiSearchOption = [[BMKNearbySearchOption alloc]init]; + nearbyPoiSearchOption.pageIndex = curPage; + nearbyPoiSearchOption.pageCapacity = 50; + // nearbyPoiSearchOption.radius = 1000; + nearbyPoiSearchOption.keyword = searchKeyWord; + nearbyPoiSearchOption.location = locationCoordinate2D; + nearbyPoiSearchOption.sortType = BMK_POI_SORT_BY_DISTANCE; + + BOOL flag = [_poisearch poiSearchNearBy:nearbyPoiSearchOption]; + if(flag) + { + // _nextPageButton.enabled = true; + NSLog(@"周边检索发送成功"); + } + else + { + // _nextPageButton.enabled = false; + NSLog(@"周边检索发送失败"); + BAKit_ShowAlertWithMsg_ios8(@"没有搜到相关信息!"); + } + +} + + +- (void)ba_configerBaiDuMap +{ + NSLog(@"base component version: %@", BMKGetMapApiBaseComponentVersion()); + NSLog(@"map component version: %@", BMKGetMapApiMapComponentVersion()); + NSLog(@"location component version: %@", BMKGetMapApiLocationComponentVersion()); + NSLog(@"search component version: %@", BMKGetMapApiSearchComponentVersion()); + NSLog(@"utils component version: %@", BMKGetMapApiUtilsComponentVersion()); +} + +#pragma mark - ***** 正向地理编码 +//- (void)ba_GeoCode +//{ +// _geocodesearch = [[BMKGeoCodeSearch alloc]init]; +// // _coordinateXText = @"116.403981"; +// // _coordinateYText = @"39.915101"; +// _cityText = @"北京"; +// _addrText = @"海淀区上地十街10号"; +// [_mapView setZoomLevel:14]; +// +// /*! 正向地理编码 */ +// [self onClickGeocodeWithCity:_cityText address:_addrText]; +//} + +- (void)onClickGeocodeWithCity:(NSString *)city address:(NSString *)adress +{ + isGeoSearch = YES; + BMKGeoCodeSearchOption *geocodeSearchOption = [[BMKGeoCodeSearchOption alloc]init]; + geocodeSearchOption.city= city; + geocodeSearchOption.address = adress; + BOOL flag = [_geocodesearch geoCode:geocodeSearchOption]; + if(flag) + { + NSLog(@"geo检索发送成功"); + } + else + { + NSLog(@"geo检索发送失败"); + } + +} + +- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error +{ + NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; + [_mapView removeAnnotations:array]; + + if (error == 0) { + BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init]; + item.coordinate = result.location; + item.title = result.address; + [_mapView addAnnotation:item]; + _mapView.centerCoordinate = result.location; + NSString* titleStr; + NSString* showmeg; + + titleStr = @"正向地理编码成功!"; + // showmeg = [NSString stringWithFormat:@"纬度:%f,经度:%f",item.coordinate.latitude,item.coordinate.longitude]; + // + // BAKit_ShowAlertWithMsg_ios8(showmeg); + } +} + +#pragma mark - ***** 反向地理编码 +- (void)ba_ReverseGeocodeWithCLLocationCoordinate2D:(CLLocationCoordinate2D )locationCoordinate2D +{ + isGeoSearch = false; + CLLocationCoordinate2D pt = (CLLocationCoordinate2D){0, 0}; + + CGFloat latStr = locationCoordinate2D.latitude; + CGFloat longStr = locationCoordinate2D.longitude; + + if (latStr != 0 && longStr != 0) + { + pt = (CLLocationCoordinate2D){latStr, longStr}; + } + + BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init]; + reverseGeocodeSearchOption.reverseGeoPoint = pt; + BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption]; + if(flag) + { + NSLog(@"反geo检索发送成功"); + [self stopLocation]; + } + else + { + NSLog(@"反geo检索发送失败"); + } +} + +- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error +{ + NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; + [_mapView removeAnnotations:array]; + + if (error == 0) { + // BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init]; + // item.coordinate = result.location; + // item.title = result.address; + // [_mapView addAnnotation:item]; + + _mapView.centerCoordinate = result.location; + + NSString *titleStr; + NSString *showmeg; + titleStr = @"反向地理编码!"; + + for (NSInteger i = 0; i < result.poiList.count; i ++) + { + BMKPoiInfo *pointInfo = result.poiList[i]; + showmeg = [NSString stringWithFormat:@"您目前所在位置附近建筑物:name:%@\n address:%@", pointInfo.name, pointInfo.address]; + + BAKit_WeakSelf + [GCDQueue executeInMainQueue:^{ + BAKit_StrongSelf + self.searchTextField.text = ((BMKPoiInfo *)result.poiList[0]).name; + } afterDelaySecs:0.2f]; + + NSLog(showmeg); + } + + self.myCurrent_addressDetail = result.addressDetail; + } +} + +#pragma mark - BMKMapViewDelegate +- (void)mapViewDidFinishLoading:(BMKMapView *)mapView +{ + // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"BMKMapView控件初始化完成" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles: nil]; + // [alert show]; + // alert = nil; +} + +- (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate +{ + [self.view endEditing:YES]; + NSLog(@"map view: click blank"); +} + +- (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate +{ + NSLog(@"map view: double click"); +} + +#pragma mark 根据anntation生成对应的View +- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id )annotation +{ + // 生成重用标示identifier + NSString *AnnotationViewID = @"yunlianWifi"; + + // 检查是否有重用的缓存 + BMKAnnotationView* annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID]; + + // 缓存没有命中,自己构造一个,一般首次添加annotation代码会运行到此处 + if (annotationView == nil) { + annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID]; + ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorRed; + // 设置重天上掉下的效果(annotation) + ((BMKPinAnnotationView*)annotationView).animatesDrop = YES; + } + + // 设置位置 + annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5)); + annotationView.annotation = annotation; + // 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性 + annotationView.canShowCallout = YES; + // 设置是否可以拖拽 + annotationView.draggable = NO; + annotationView.image = BAKit_ImageName(@"client"); + + return annotationView; +} + +// 当点击annotation view弹出的泡泡时,调用此接口 +- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view; +{ + NSLog(@"paopaoclick"); + + // NSString *msg = [NSString stringWithFormat:@"你点击了:%@", view]; + // + // BAKit_ShowAlertWithMsg_ios8(msg); +} + +- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view +{ + [mapView bringSubviewToFront:view]; + [mapView setNeedsDisplay]; + + NSString *msg = [NSString stringWithFormat:@"点击了: %@", view.annotation.title]; + BAKit_ShowAlertWithMsg_ios8(msg); +} + +- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views +{ + NSLog(@"didAddAnnotationViews"); +} + +#pragma mark implement BMKSearchDelegate +- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult*)result errorCode:(BMKSearchErrorCode)error +{ + // 清楚屏幕中所有的annotation + NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; + [_mapView removeAnnotations:array]; + + if (error == BMK_SEARCH_NO_ERROR) { + NSMutableArray *annotations = [NSMutableArray array]; + for (int i = 0; i < result.poiInfoList.count; i++) { + BMKPoiInfo* poi = [result.poiInfoList objectAtIndex:i]; + BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init]; + item.coordinate = poi.pt; + item.title = poi.name; + [annotations addObject:item]; + } + [_mapView addAnnotations:annotations]; + [_mapView showAnnotations:annotations animated:YES]; + } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){ + NSLog(@"起始点有歧义"); + } else { + // 各种情况的判断。。。 + } +} + +/** + *在地图View将要启动定位时,会调用此函数 + */ +- (void)willStartLocatingUser +{ +// [BAKit_HudManager ba_hudShowWithText:@"定位中..."]; + NSLog(@"start locate"); +} + +/** + *用户方向更新后,会调用此函数 + *@param userLocation 新的用户位置 + */ +- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation +{ + [_mapView updateLocationData:userLocation]; + // NSLog(@"heading is %@",userLocation.heading); +} + +/** + *用户位置更新后,会调用此函数 + *@param userLocation 新的用户位置 + */ +- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation +{ + NSLog(@"定位成功!!!"); +// [BAKit_HudManager ba_hudHidden]; + // YLTips_Text(@"定位成功!"); + NSLog(@"新的用户位置 didUpdateUserLocation lat %f,long %f", userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude); + + [_mapView updateLocationData:userLocation]; + + [self moveToCoordinate:userLocation.location.coordinate]; + + self.myCurrent_locationCoordinate2D = userLocation.location.coordinate; + + [self ba_ReverseGeocodeWithCLLocationCoordinate2D:self.myCurrent_locationCoordinate2D]; + + /*! 添加标注 */ + // [_mapView removeOverlays:_mapView.overlays]; + // [self addPointAnnotation]; + + /*! 在地图View停止定位后,会调用此函数 */ + // [self stopLocation]; +} + +/** + *在地图View停止定位后,会调用此函数 + */ +- (void)didStopLocatingUser +{ + NSLog(@"stop locate"); +} + +/** + *定位失败后,会调用此函数 + *@param error 错误号,参考CLError.h中定义的错误号 + */ +- (void)didFailToLocateUserWithError:(NSError *)error +{ + NSLog(@"location error"); + BAKit_ShowAlertWithMsg_ios8(@"定位失败!"); +} + +/** + *地图区域即将改变时会调用此接口 + *@param mapView 地图View + *@param animated 是否动画 + */ +- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)animated +{ + [self.view endEditing:YES]; +} + +#pragma mark - 添加自定义的手势(若不自定义手势,不需要下面的代码) + +//- (void)addCustomGestures +//{ +// /* +// *注意: +// *添加自定义手势时,必须设置UIGestureRecognizer的属性cancelsTouchesInView 和 delaysTouchesEnded 为NO, +// *否则影响地图内部的手势处理 +// */ +// UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; +// doubleTap.delegate = self; +// doubleTap.numberOfTapsRequired = 2; +// doubleTap.cancelsTouchesInView = NO; +// doubleTap.delaysTouchesEnded = NO; +// +// [self.view addGestureRecognizer:doubleTap]; +// +// /* +// *注意: +// *添加自定义手势时,必须设置UIGestureRecognizer的属性cancelsTouchesInView 和 delaysTouchesEnded 为NO, +// *否则影响地图内部的手势处理 +// */ +// UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; +// singleTap.delegate = self; +// singleTap.cancelsTouchesInView = NO; +// singleTap.delaysTouchesEnded = NO; +// [singleTap requireGestureRecognizerToFail:doubleTap]; +// [self.view addGestureRecognizer:singleTap]; +//} +// +//- (void)handleSingleTap:(UITapGestureRecognizer *)theSingleTap +//{ +// /* +// *do something +// */ +// NSLog(@"my handleSingleTap"); +//} +// +//- (void)handleDoubleTap:(UITapGestureRecognizer *)theDoubleTap +//{ +// /* +// *do something +// */ +// NSLog(@"my handleDoubleTap"); +//} + +#pragma mark - UITextFieldDelegate + +- (BOOL)textFieldShouldReturn:(UITextField *)textField +{ + if (textField == self.searchTextField) + { + self.searchKeyWord = textField.text; + + [self.view endEditing:YES]; + [self ba_mapPointNearbySearchLocationCoordinate2D:self.myCurrent_locationCoordinate2D searchKeyWord:self.searchKeyWord]; + return YES; + } + return NO; +} + +#pragma mark - custom method +#pragma mark 开始定位 +- (void)startLocation +{ + NSLog(@"进入普通定位态"); + + [_locService startUserLocationService]; + // _mapView.showsUserLocation = NO;//先关闭显示的定位图层 + // _mapView.userTrackingMode = BMKUserTrackingModeFollow; + // _mapView.showsUserLocation = YES; +} + +#pragma mark 停止定位 +- (void)stopLocation +{ + // [BAKit_HudManager ba_hudHidden]; + + [_locService stopUserLocationService]; + // _mapView.showsUserLocation = YES; +} + +- (void)handleButtonAction:(UIButton *)sender +{ + if (sender.tag == 1) + { + if (self.myCurrent_locationCoordinate2D.latitude && self.myCurrent_locationCoordinate2D.longitude) + { + [self moveToCoordinate:self.myCurrent_locationCoordinate2D]; + } + else + { + [self startLocation]; + } + } + else if (sender.tag == 2) + { + sender.selected = !sender.selected; + NSString *isOpen = sender.selected ? @"打开" : @"关闭"; + NSString *msg = [NSString stringWithFormat:@"你 %@ 了语音识别", isOpen]; + BAKit_ShowAlertWithMsg_ios8(msg); + } +} + +#pragma mark 添加标注 +//- (void)addPointAnnotation +//{ +// if (pointAnnotation == nil) +// { +// pointAnnotation = [[BMKPointAnnotation alloc]init]; +// CLLocationCoordinate2D coor; +// // if (_userModel.m_local2D.latitude) +// // { +// coor.latitude = 23.109845; +// coor.longitude = 113.388490; +// // } +// +// pointAnnotation.coordinate = coor; +// pointAnnotation.title = @"test大头针"; +// pointAnnotation.subtitle = @"欢迎来到云联惠!"; +// +// /*! 注意:如果要批量添加大头针的话,要单独写一个继承自 BMKPointAnnotation 类的model 类,然后用 for 循环添加 model 给 pointAnnotation */ +// // pointAnnotation.poiModel = model; +// pointAnnotation.coordinate = coor; +// } +// +// [_mapView addAnnotation:pointAnnotation]; +//} + +- (void)moveToCoordinate:(CLLocationCoordinate2D)coordinate +{ + // 添加一个标记位 + BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.001, 0.001)); + BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion]; + [_mapView setRegion:adjustedRegion animated:YES]; + [_mapView setCenterCoordinate:coordinate animated:YES]; +} + +#pragma mark - setter / getter + +- (BMKMapView *)mapView +{ + if (!_mapView) + { + _mapView = [[BMKMapView alloc] init]; + /*! 适配ios7 */ + if( ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 7.0)) + { + self.navigationController.navigationBar.translucent = NO; + } + + _locService = [[BMKLocationService alloc]init]; + _geocodesearch = [[BMKGeoCodeSearch alloc]init]; + _poisearch = [[BMKPoiSearch alloc]init]; + + //设置定位精确度,默认:kCLLocationAccuracyBest + _locService.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; + //指定最小距离更新(米),默认:kCLDistanceFilterNone + // _locService.distanceFilter = 10.0f; + + + _mapView.showsUserLocation = YES;//显示定位图层 + _mapView.userTrackingMode = BMKUserTrackingModeFollow; + /*! 设置地图缩放级别 */ + _mapView.zoomLevel = 18; + _mapView.isSelectedAnnotationViewFront = YES; + + [self.view addSubview:self.mapView]; + } + return _mapView; +} + +- (UIButton *)locationButton +{ + if (!_locationButton) + { + _locationButton = [UIButton ba_creatButtonWithFrame:CGRectZero title:@"ceshi" selTitle:nil titleColor:nil titleFont:nil image:BAKit_ImageName(@"定位") selImage:nil padding:0 buttonPositionStyle:BAButtonLayoutTypeNormal viewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:0 target:self selector:@selector(handleButtonAction:)]; + self.locationButton.tag = 1; + + [self.view addSubview:self.locationButton]; + } + return _locationButton; +} + +- (UIView *)searchView +{ + if (!_searchView) + { + _searchView = [[UIView alloc] init]; + self.searchView.backgroundColor = BAKit_Color_White; + + [self.view addSubview:self.searchView]; + } + return _searchView; +} + +- (UILabel *)searchLabel +{ + if (!_searchLabel) + { + _searchLabel = [UILabel new]; + self.searchLabel.text = @"当前位置:"; + self.searchLabel.font = BAKit_Font_systemFontOfSize_15; + // self.searchLabel.backgroundColor = BAKit_Color_Yellow; + + [self.searchView addSubview:self.searchLabel]; + } + return _searchLabel; +} + +- (UITextField *)searchTextField +{ + if (!_searchTextField) + { + _searchTextField = [UITextField new]; + self.searchTextField.font = BAKit_Font_systemFontOfSize_15; + self.searchTextField.delegate = self; + self.searchTextField.returnKeyType = UIReturnKeySearch; + self.searchTextField.clearButtonMode = UITextFieldViewModeWhileEditing; + + // self.searchTextField.backgroundColor = BAKit_Color_Green; + + [self.searchView addSubview:self.searchTextField]; + } + return _searchTextField; +} + +- (UIButton *)voiceButton +{ + if (!_voiceButton) + { + _voiceButton = [UIButton ba_creatButtonWithFrame:CGRectZero title:@"ceshi" selTitle:nil titleColor:nil titleFont:nil image:BAKit_ImageName(@"map_voice") selImage:BAKit_ImageName(@"map_voice") padding:1 buttonPositionStyle:BAButtonLayoutTypeNormal viewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:1 target:self selector:@selector(handleButtonAction:)]; + + self.voiceButton.tag = 2; + self.voiceButton.backgroundColor = BAKit_Color_Red; + + [self.searchView addSubview:self.voiceButton]; + } + return _voiceButton; +} + + +- (void)base_viewDidDisappear +{ + // if (_mapView) + // { + // _mapView = nil; + // } + // if (_geocodesearch != nil) + // { + // _geocodesearch = nil; + // } + // if (_poisearch != nil) + // { + // _poisearch = nil; + // } +} + +- (void)dealloc +{ + [self base_viewDidDisappear]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.h" new file mode 100644 index 0000000..fd74b85 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.h" @@ -0,0 +1,16 @@ +// +// MyAnimatedAnnotationView.h +// IphoneMapSdkDemo +// +// Created by wzy on 14-11-27. +// Copyright (c) 2014年 Baidu. All rights reserved. +// + +#import + +@interface MyAnimatedAnnotationView : BMKAnnotationView + +@property (nonatomic, strong) NSMutableArray *annotationImages; +@property (nonatomic, strong) UIImageView *annotationImageView; + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.m" new file mode 100644 index 0000000..34e8e50 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/MyAnimatedAnnotationView.m" @@ -0,0 +1,47 @@ +// +// MyAnimatedAnnotationView.m +// IphoneMapSdkDemo +// +// Created by wzy on 14-11-27. +// Copyright (c) 2014年 Baidu. All rights reserved. +// + +#import "MyAnimatedAnnotationView.h" + +@implementation MyAnimatedAnnotationView + +@synthesize annotationImageView = _annotationImageView; +@synthesize annotationImages = _annotationImages; + +- (id)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier { + self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; + if (self) { +// [self setBounds:CGRectMake(0.f, 0.f, 30.f, 30.f)]; + [self setBounds:CGRectMake(0.f, 0.f, 32.f, 32.f)]; + + [self setBackgroundColor:[UIColor clearColor]]; + + _annotationImageView = [[UIImageView alloc] initWithFrame:self.bounds]; + _annotationImageView.contentMode = UIViewContentModeCenter; + [self addSubview:_annotationImageView]; + } + return self; +} + +- (void)setAnnotationImages:(NSMutableArray *)images { + _annotationImages = images; + [self updateImageView]; +} + +- (void)updateImageView { + if ([_annotationImageView isAnimating]) { + [_annotationImageView stopAnimating]; + } + + _annotationImageView.animationImages = _annotationImages; + _annotationImageView.animationDuration = 0.5 * [_annotationImages count]; + _annotationImageView.animationRepeatCount = 0; + [_annotationImageView startAnimating]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_1.png" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_1.png" new file mode 100755 index 0000000..9c68222 Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_1.png" differ diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_2.png" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_2.png" new file mode 100755 index 0000000..b1b8874 Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_2.png" differ diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_3.png" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_3.png" new file mode 100755 index 0000000..2dcd37f Binary files /dev/null and "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-4/\347\231\276\345\272\246\345\234\260\345\233\276Image/poi_3.png" differ diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.h" new file mode 100644 index 0000000..7f3c7b8 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_05.h +// BABaseProject +// +// Created by boai on 2016/10/11. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_05 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.m" new file mode 100644 index 0000000..9a81f19 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.m" @@ -0,0 +1,145 @@ +// +// DemoVC2_05.m +// BABaseProject +// +// Created by boai on 2016/10/11. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_05.h" +#import "DemoVC2_05_test.h" +#import "DemoVC2_05_test2.h" +#import "DemoVC2_05_test3.h" + +@interface DemoVC2_05 () +{ + UIAlertAction *alertOk; + UIAlertAction *alertCancel; + UIAlertController *alert; +} +@property (weak, nonatomic ) IBOutlet UITableView *m_tableView; +@property (nonatomic, strong) NSArray *dataArray; + +@end + +@implementation DemoVC2_05 + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + + if (alert) + { + alert = nil; + } + if (alertCancel) + { + alertCancel = nil; + } + if (alertOk) + { + alertOk = nil; + } + +} + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)ba_setupUI +{ + self.m_tableView.tableFooterView = [UIView new]; + +} + +- (NSArray *)dataArray +{ + if (!_dataArray) + { + _dataArray = @[@"1、修改 系统 alert 的字体颜色", + @"2、修改 系统 actionSheet 的字体颜色", + @"3、修改 textField 属性", + @"4、面向切面编程(Aspect-Oriented Programming):Method Swizzling、Hook与代码注入" + ]; + } + return _dataArray; +} + +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 1; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return self.dataArray.count; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; + + if (!cell) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; + } + + cell.textLabel.text = self.dataArray[indexPath.row]; + + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + if (0 == indexPath.row) + { + [self performSelector:@selector(test1)]; + } + else if (1 == indexPath.row) + { + [self performSelector:@selector(test2)]; + } + else if (2 == indexPath.row) + { + [self performSelector:@selector(test3)]; + } + else if (3 == indexPath.row) + { + [self performSelector:@selector(test4)]; + } +} + +- (void)test1 +{ + [self.navigationController pushViewController:[DemoVC2_05_test3 new] animated:YES]; +} + +- (void)test2 +{ + [self.navigationController pushViewController:[DemoVC2_05_test3 new] animated:YES]; +} + +- (void)test3 +{ + DemoVC2_05_test *vc = [DemoVC2_05_test new]; + [self.navigationController pushViewController:vc animated:YES]; +} + +- (void)test4 +{ + DemoVC2_05_test2 *vc = [DemoVC2_05_test2 new]; + [self.navigationController pushViewController:vc animated:YES]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.xib" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.xib" new file mode 100644 index 0000000..f9a72da --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05.xib" @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.h" new file mode 100644 index 0000000..f575ceb --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_05_test.h +// BABaseProject +// +// Created by 博爱 on 2016/10/31. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_05_test : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.m" new file mode 100644 index 0000000..08cffc9 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test.m" @@ -0,0 +1,73 @@ +// +// DemoVC2_05_test.m +// BABaseProject +// +// Created by 博爱 on 2016/10/31. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_05_test.h" +#import "BATextField.h" + + + +/** + * 获取屏幕宽度和高度 + */ +#define BA_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) +#define BA_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +@interface DemoVC2_05_test () + +@end + +@implementation DemoVC2_05_test + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + + self.view.backgroundColor = [UIColor whiteColor]; + [self test]; +} + +- (void)test +{ + NSArray *placeHolderArray = @[@"手机号码验证(不超过11位):", + @"纯数字验证:", + @"限制输入5位数验证:", + @"带小数点的数字限制(默认只能输入小数位后2位):" + ]; + + [placeHolderArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + + BATextField *textField = [[BATextField alloc] init]; + textField.frame = CGRectMake(20, 80 + idx * 70, BA_SCREEN_WIDTH - 80, 50); + textField.placeholder = placeHolderArray[idx]; + textField.borderStyle = UITextBorderStyleRoundedRect; + [self.view addSubview:textField]; + + if (idx == 0) + { + textField.phoneRestrict = YES; + textField.textfieldStyle = BATextfieldStylePhone; + } + else if (idx == 1) + { + textField.numberRestrict = YES; + textField.textfieldStyle = BATextfieldStyleBank; + } + else if (idx == 2) + { + textField.lengthRestrict = 5; + } + else if (idx == 3) + { + textField.decimalsRestrict = YES; + } + }]; + +} + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.h" new file mode 100644 index 0000000..2f5a7fd --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_05_test2.h +// BABaseProject +// +// Created by 博爱 on 2016/11/3. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_05_test2 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.m" new file mode 100644 index 0000000..2d4fa62 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test2.m" @@ -0,0 +1,51 @@ +// +// DemoVC2_05_test2.m +// BABaseProject +// +// Created by 博爱 on 2016/11/3. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_05_test2.h" + +@interface DemoVC2_05_test2 () + +@property (nonatomic, strong) UIButton *shareButton; + +@end + +@implementation DemoVC2_05_test2 + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = [UIColor greenColor]; + self.title = @"测试按钮点击次数!"; + self.shareButton.hidden = NO; + +} + +- (UIButton *)shareButton +{ + if (!_shareButton) + { + _shareButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _shareButton.frame = CGRectMake(20, 80 + 50 + 20, 100, 50); + [_shareButton setTitle:@"分 享" forState:UIControlStateNormal]; + [_shareButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; + _shareButton.backgroundColor = [UIColor redColor]; + + /*! 注意:这里的方法名一定要和 plist 的方法名一致 */ + [_shareButton addTarget:self action:@selector(onShareBtnPressed:) forControlEvents:UIControlEventTouchUpInside]; + + [self.view addSubview:_shareButton]; + } + return _shareButton; +} + +- (IBAction)onShareBtnPressed:(UIButton *)sender +{ + NSLog(@"你点击了分享按钮!"); +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.h" new file mode 100644 index 0000000..ae2733a --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.h" @@ -0,0 +1,15 @@ +// +// ViewController.h +// BAAlertController +// +// Created by boai on 2017/6/5. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_05_test3 : BABaseViewController + + +@end + diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.m" new file mode 100644 index 0000000..d6a630f --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-5/DemoVC2_05_test3.m" @@ -0,0 +1,355 @@ +// +// ViewController.m +// BAAlertController +// +// Created by boai on 2017/6/5. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "DemoVC2_05_test3.h" + +#import "UIAlertController+BAKit.h" + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +static NSString * const title0 = @"博爱温馨提示"; +static NSString * const msg0 = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。"; +static NSString * const msg1 = @"欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。\n对于 MacBook,我们给自己设定了一个几乎不可能实现的目标:在有史以来最为轻盈纤薄的 Mac 笔记本电脑上,打造全尺寸的使用体验。这就要求每个元素都必须重新构想,不仅令其更为纤薄轻巧,还要更加出色。最终我们带来的,不仅是一部新款的笔记本电脑,更是一种对笔记本电脑的前瞻性思考。现在,有了第六代 Intel 处理器、提升的图形处理性能、高速闪存和最长可达 10 小时的电池使用时间*,MacBook 的强大更进一步。\n欢迎使用 iPhone SE,迄今最高性能的 4 英寸 iPhone。在打造这款手机时,我们在深得人心的 4 英寸设计基础上,从里到外重新构想。它所采用的 A9 芯片,正是在 iPhone 6s 上使用的先进芯片。1200 万像素的摄像头能拍出令人叹为观止的精彩照片和 4K 视频,而 Live Photos 则会让你的照片栩栩如生。这一切,成就了一款外形小巧却异常强大的 iPhone。\n对于 MacBook,我们给自己设定了一个几乎不可能实现的目标:在有史以来最为轻盈纤薄的 Mac 笔记本电脑上,打造全尺寸的使用体验。这就要求每个元素都必须重新构想,不仅令其更为纤薄轻巧,还要更加出色。最终我们带来的,不仅是一部新款的笔记本电脑,更是一种对笔记本电脑的前瞻性思考。现在,有了第六代 Intel 处理器、提升的图形处理性能、高速闪存和最长可达 10 小时的电池使用时间*,MacBook 的强大更进一步。"; +static NSString * const msg2 = @"请输入账号密码"; + + +@interface DemoVC2_05_test3 () +< + UITableViewDelegate, + UITableViewDataSource +> + +@property(nonatomic, strong) UITableView *tableView; +@property(strong, nonatomic) NSArray *dataArray; + +@property(nonatomic, strong) NSIndexPath *indexPath; + +@end + +@implementation DemoVC2_05_test3 + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. + [self setupUI]; +} + +- (void)setupUI +{ + self.title = @"BAAlertController"; + self.tableView.hidden = NO; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + self.tableView.frame = self.view.bounds; +} + +#pragma mark - UITableViewDataSource / UITableViewDelegate +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return self.dataArray.count; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return [self.dataArray[section] count]; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + static NSString *identifier = @"cell"; + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; + + if ( !cell ) + { + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; + cell.textLabel.numberOfLines = 0; + cell.accessoryType = (indexPath.section == 0) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; + } + NSArray *tempArray = self.dataArray[indexPath.section]; + cell.textLabel.text = tempArray[indexPath.row]; + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + self.indexPath = indexPath; + if ( 0 == indexPath.section ) + { + switch ( indexPath.row ) { + case 0: + { + [self alertController1]; + } + break; + case 1: + { + [self alertController2]; + } + break; + case 2: + { + [self alertController3]; + } + break; + case 3: + { + [self alertController4]; + } + break; + case 4: + { + [self alertController5]; + } + break; + case 5: + { + [self alertController6]; + } + break; + + default: + break; + } + } +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section +{ + UIView *headerView = [UIView new]; + + UILabel *headerTitle = [UILabel new]; + headerTitle.font = [UIFont systemFontOfSize:14]; + headerTitle.textColor = [UIColor redColor]; + headerTitle.numberOfLines = 0; + [headerView addSubview:headerTitle]; + + headerTitle.frame = CGRectMake(20, 0, BAKit_SCREEN_WIDTH - 40, 40); + headerTitle.text = (0 == section) ? @"UIAlertController 的几种日常用法!" : @"BAAlertController 的特点!"; + + return headerView; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section +{ + return 40; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section +{ + return FLT_MIN; +} + +#pragma mark - custom method + +- (void)alertController1 +{ + [UIAlertController ba_alertShowInViewController:self + title:title0 + message:msg0 + buttonTitleArray:@[@"取 消", @"确 定"] + buttonTitleColorArray:@[BAKit_Color_Green, BAKit_Color_Red] + block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!", (long)buttonIndex]; + BAKit_ShowAlertWithMsg_ios8(msg); + }]; +} + +- (void)alertController2 +{ + [UIAlertController ba_alertShowInViewController:self + title:title0 + message:msg0 + buttonTitleArray:@[@"取 消", @"确 定", @"确 定1", @"确 定2"] + buttonTitleColorArray:@[BAKit_Color_Green, BAKit_Color_Red] + block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!", (long)buttonIndex]; + BAKit_ShowAlertWithMsg_ios8(msg); + + }]; +} + +- (void)alertController3 +{ + // AlertController 的 textField placeholder 数组,根据这个添加 textField + NSArray *textFieldPlaceholderArray = @[@"用户名/手机号/邮箱", @"密码"]; + [UIAlertController ba_alert2ShowInViewController:self title:msg2 message:nil buttonTitleArray:@[@"取 消", @"确 定"] buttonTitleColorArray:@[BAKit_Color_Green, BAKit_Color_Red] buttonEnabledNoWithTitleArray:@[@"确 定"] textFieldPlaceholderArray:textFieldPlaceholderArray textFieldConfigurationActionBlock:^(UITextField * _Nullable textField, NSInteger index) { + // 添加通知,监听 textField 输入的文字变化 + [BAKit_NotiCenter addObserver:self selector:@selector(handleAlertTextFieldDidChangeAction:) name:UITextFieldTextDidChangeNotification object:textField]; + + if (index == 0) + { + textField.keyboardType = UIKeyboardTypeNumberPad; + } + if (index == 1) + { + textField.secureTextEntry = YES; + } + + } block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + UITextField *loginTextField = alertController.textFields[0]; + UITextField *passwordTextField = alertController.textFields[1]; + + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!\n账号:%@\n密码:%@", (long)buttonIndex, loginTextField.text, passwordTextField.text]; + BAKit_ShowAlertWithMsg_ios8(msg); + [BAKit_NotiCenter removeObserver:self name:UITextFieldTextDidChangeNotification object:nil]; + + }]; +} + +- (void)handleAlertTextFieldDidChangeAction:(NSNotification *)notification +{ + // 通知处理,判断文字输入的长度 大于 3 的时候,确定按钮可点击,否则,不可点击 + UIAlertController *alertController = (UIAlertController *)self.presentedViewController; + if (alertController) + { + UITextField *login = alertController.textFields[0]; + UIAlertAction *sureAction = alertController.actions[1]; + sureAction.enabled = login.text.length > 3; + } +} + +- (void)alertController4 +{ + NSMutableAttributedString *attributedTitle = [[NSMutableAttributedString alloc] initWithString:title0 attributes:@{NSForegroundColorAttributeName:[UIColor orangeColor]}]; + + NSString *result = @"当前用户未 登录 ,是否 登录 ?"; + NSString *keyWord = @"登录"; + + /*! 关键字添加效果 */ + NSMutableAttributedString *attributedMessage = [[NSMutableAttributedString alloc]initWithString:result]; + + /*! 获取关键字位置 */ + NSRange range = [result rangeOfString:keyWord]; + + NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor],NSKernAttributeName:@2.0,NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrokeColorAttributeName:[UIColor blueColor],NSStrokeWidthAttributeName:@2.0,NSVerticalGlyphFormAttributeName:@(0)}; + + /*! 设置关键字属性 */ + [attributedMessage ba_changeAttributeDict:dic range:range]; + + [UIAlertController ba_alertAttributedShowInViewController:self + attributedTitle:attributedTitle + attributedMessage:attributedMessage + buttonTitleArray:@[@"取 消", @"确 定"] + buttonTitleColorArray:@[BAKit_Color_Green, BAKit_Color_Red] + block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!", (long)buttonIndex]; + BAKit_ShowAlertWithMsg_ios8(msg); + }]; +} + +- (void)alertController5 +{ + [UIAlertController ba_actionSheetShowInViewController:self title:title0 message:nil buttonTitleArray:@[@"safari打开", @"复制链接", @"分享", @"刷新"] buttonTitleColorArray:@[BAKit_Color_Red, BAKit_Color_Green, BAKit_Color_Yellow, BAKit_Color_Orange] popoverPresentationControllerBlock:^(UIPopoverPresentationController * _Nonnull popover) { + + if (popover) + { + // 在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的. 经过测试发现,任何一个cell拖拽或则滑动到UITableView的任意相对位置,cell的frame属性都没有改变. 那怎样获取UITableViewCell相对于UITableView的坐标? + CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.indexPath]; + CGRect frame = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]]; + popover.sourceView = self.view; + popover.sourceRect = frame; + // 如果用的是按钮点击需要做 iPad 版本适配的话,就需要在次设置 +// popover.sourceView = sender; +// popover.sourceRect = sender.bounds; + + popover.permittedArrowDirections = UIPopoverArrowDirectionAny; + } + } block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!", (long)buttonIndex]; + BAKit_ShowAlertWithMsg_ios8(msg); + + }]; +} + +- (void)alertController6 +{ + NSMutableAttributedString *attributedTitle = [[NSMutableAttributedString alloc] initWithString:title0 attributes:@{NSForegroundColorAttributeName:[UIColor orangeColor]}]; + + NSString *result = @"当前用户未 登录 ,是否 登录 ?"; + NSString *keyWord = @"登录"; + + /*! 关键字添加效果 */ + NSMutableAttributedString *attributedMessage = [[NSMutableAttributedString alloc]initWithString:result]; + + /*! 获取关键字位置 */ + NSRange range = [result rangeOfString:keyWord]; + + NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor],NSKernAttributeName:@2.0,NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrokeColorAttributeName:[UIColor blueColor],NSStrokeWidthAttributeName:@2.0,NSVerticalGlyphFormAttributeName:@(0)}; + + /*! 设置关键字属性 */ + [attributedMessage ba_changeAttributeDict:dic range:range]; + + [UIAlertController ba_actionSheetAttributedShowInViewController:self attributedTitle:attributedTitle attributedMessage:attributedMessage buttonTitleArray:@[@"safari打开", @"复制链接", @"分享", @"刷新"] buttonTitleColorArray:@[BAKit_Color_Red, BAKit_Color_Green, BAKit_Color_Yellow, BAKit_Color_Orange] popoverPresentationControllerBlock:^(UIPopoverPresentationController * _Nonnull popover) { + if (popover) + { + // 在使用 UITableViewCell 的frame属性获取origin得到的坐标是不变的. 也就是说如果UITableView初始化完毕后,每个cell的坐标是固定的,x不变,y 随index递增的. 经过测试发现,任何一个cell拖拽或则滑动到UITableView的任意相对位置,cell的frame属性都没有改变. 那怎样获取UITableViewCell相对于UITableView的坐标? + CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:self.indexPath]; + CGRect frame = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]]; + popover.sourceView = self.view; + popover.sourceRect = frame; + // 如果用的是按钮点击需要做 iPad 版本适配的话,就需要在次设置 + // popover.sourceView = sender; + // popover.sourceRect = sender.bounds; + + popover.permittedArrowDirections = UIPopoverArrowDirectionAny; + } + } block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + NSString *msg = [NSString stringWithFormat:@"你点击了第 %ld 个按钮!", (long)buttonIndex]; + BAKit_ShowAlertWithMsg_ios8(msg); + + }]; +} + +#pragma mark - setter / getter + +- (UITableView *)tableView +{ + if (!_tableView) + { + _tableView = [UITableView new]; + self.tableView.delegate = self; + self.tableView.dataSource = self; + self.tableView.estimatedRowHeight = 44; + self.tableView.rowHeight = UITableViewAutomaticDimension; + self.tableView.backgroundColor = BAKit_Color_Gray_11; + + [self.view addSubview:self.tableView]; + } + return _tableView; +} + +- (NSArray *)dataArray +{ + if ( !_dataArray ) + { + _dataArray = [NSArray arrayWithObjects:@[@"1、普通的 UIAlertController-alert,可以自由设置按钮数量、按钮颜色", + @"2、普通的 UIAlertController-alert,可以自由设置按钮数量、按钮颜色【多按钮样式,颜色数组和title数组个数不等】", + @"3、普通的 带 textField 的 UIAlertController-alert,可添加一个或者多个 textField", + @"4、NSMutableAttributedString 的UIAlertController-alert,可以自由设置 NSMutableAttributedString(title、message)按钮数量、按钮颜色", + @"5、普通的 UIAlertController-actionSheet,可以自由设置按钮数量、按钮颜色", + @"6、NSMutableAttributedString 的UIAlertController-actionSheet,可以自由设置 NSMutableAttributedString(title、message)按钮数量、按钮颜色", + ], + @[@"1、用分类封装系统的 UIAlertController,代码无侵入,简洁高效,一个block 搞定系统alert 和 actionSheet,\n2、可以自定义按钮数量、按钮颜色【多按钮样式,颜色数组和title数组个数不等情况下,默认蓝色】\n3、可以自定义 NSMutableAttributedString 的 alert 和 actionSheet,让你的 alert 更加炫酷\n4、理论完全兼容现有 iOS 8 以上系统版本" + ], nil]; + } + return _dataArray; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.h" new file mode 100644 index 0000000..9b2e0da --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_06.h +// BABaseProject +// +// Created by boai on 2016/10/12. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_06 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.m" new file mode 100644 index 0000000..887ae3b --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-6/DemoVC2_06.m" @@ -0,0 +1,167 @@ +// +// DemoVC2_06.m +// BABaseProject +// +// Created by boai on 2016/10/12. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_06.h" + +@interface DemoVC2_06 () + +@property (nonatomic, strong) UILabel *label; +@property (nonatomic, strong) UILabel *label2; + +@end + +@implementation DemoVC2_06 + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + + self.label.hidden = NO; +} + +- (UILabel *)label +{ + if (!_label) + { + /*! 需要点击的字符不同 */ + NSString *label_text2 = @"您好!您是陆晓峰吗?你中奖了,领取地址“www.baidu.com”,领奖码“8888”"; + NSMutableAttributedString *attributedString2 = [[NSMutableAttributedString alloc]initWithString:label_text2]; + [attributedString2 addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:15] range:NSMakeRange(0, label_text2.length)]; + /*! 要在这里改位置哈! */ + [attributedString2 addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(20, 13)]; + [attributedString2 addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(20, 13)]; + /*! 要在这里改位置哈! */ + [attributedString2 addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(39, 4)]; + + _label = [UILabel new]; + _label.frame = CGRectMake(20, CGRectGetMaxY(_label2.frame) + 20, BA_SCREEN_WIDTH - 40,50); + _label.backgroundColor = [UIColor lightGrayColor]; + _label.numberOfLines = 0; + _label.attributedText = attributedString2; + + [self.view addSubview:_label]; + + BA_WEAKSELF; + [_label ba_addAttributeTapActionWithStrings:@[@"www.baidu.com",@"8888"] tapClicked:^(NSString *string, NSRange range, NSInteger index) { + NSString *message = [NSString stringWithFormat:@"点击了“%@”字符\nrange: %@\nindex: %ld",string,NSStringFromRange(range),index]; + [weakSelf.view ba_showAlertView:@"温馨提示:" message:message]; + }]; + + /*! 设置是否有点击效果,默认是 YES */ + _label.enabledTapEffect = NO; + } + return _label; +} + +- (void)ba_setupUI +{ + _label2 = [[UILabel alloc]initWithFrame:CGRectMake(10, 80, BA_SCREEN_WIDTH - 20, BA_SCREEN_HEIGHT*0.6)]; + _label2.textAlignment = NSTextAlignmentCenter; + _label2.numberOfLines = 0; + _label2.backgroundColor = [UIColor yellowColor]; + [self.view addSubview:_label2]; + + NSString *strings = @"在工艺的创新和精准程度上,iPhone 7 达到了我们前所未及的新高度。亮黑色的外观与我们以往的设计截然不同,外壳具备了防溅抗水的特性1,主屏幕按钮经过焕然一新的打造。再加上触感圆润无缝的新款一体成型机身设计,无论是拿在手里还是看在眼里,iPhone 7 都一样令人赞叹。\n两款尺寸,五色外观。\n与 iPhone 7 和 iPhone 7 Plus 携同而来的,\n是两款新的外观颜色:精美磨砂质感的黑色,和深邃闪耀的亮黑色。无论是 4.7 英寸还是 5.5 英寸,这两种机型均采用坚固的 7000 系列铝金属打造而成,并另有经典的银色、金色和玫瑰金色外观可供选择。"; + + NSString *heightLightStr = @"亮黑色"; + NSRange heightLightRange = [strings rangeOfString:heightLightStr]; + + /*! 第2种:综合创建富文本的方法 */ + NSMutableAttributedString *attributedString2 = [[NSMutableAttributedString alloc] initWithStrings:@[@"1我们是富文本", @"2我们是富文本", @"3我们是富文本"] attributesArray:@[@{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor], NSKernAttributeName:@2.0, NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle), NSStrokeColorAttributeName:[UIColor blueColor], NSStrokeWidthAttributeName:@2.0, NSVerticalGlyphFormAttributeName:@(0)}, @{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor], NSKernAttributeName:@2.0, NSStrikethroughStyleAttributeName:@(NSUnderlineStyleDouble), NSStrokeColorAttributeName:[UIColor redColor], NSStrokeWidthAttributeName:@2.0, NSVerticalGlyphFormAttributeName:@(0)}] space:@[@(1),@(5),@(10)]]; + + /*! 第1种:创建 NSMutableAttributedString */ + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strings]; + + /*! 改变某位置的颜色 */ + [attributedString ba_changeColor:[UIColor cyanColor] range:heightLightRange]; + + /*! 改变某位置的颜色 */ + [attributedString ba_changeColor:[UIColor redColor] range:NSMakeRange(3, 5)]; + + /*! 改变某位置的普通字号 */ + [attributedString ba_changeSystemFont:[UIFont systemFontOfSize:30] range:NSMakeRange(10, 2)]; + + /*! 设置字形倾斜度,取值为 NSNumber(float),正值右倾,负值左倾 */ + [attributedString ba_changeObliquenessValue:@(1) range:NSMakeRange(3, 5)]; + + /*! 改变某位置的行距 */ + // [attributedString ba_changeLineSpacing:20 from:60 length:50]; + + /*! 改变某位置的段落距离 */ + // [attributedString ba_changeParagraphSpacing:20 from:200 length:10]; + + /*! 改变段的顶部和文本内容的开头之间的距离 */ + // [attributedString ba_changeBeforeLparagraphSpacing:50 from:200 length:10]; + + /*! 根据位置、长度 设置下划线样式:根据枚举选择 */ + [attributedString ba_changeUnderlineStyle:NSUnderlineStyleDouble color:[UIColor greenColor] Range:NSMakeRange(100, 10)]; + + /*! 全部加下划线 */ + // [attributedString ba_changeUnderlineAtAll]; + + /*! 根据位置加删除线 */ + [attributedString ba_changeStrikethroughStyle:NSUnderlineStyleDouble color:[UIColor redColor] Range:NSMakeRange(200, 10)]; + + /*! 全部加删除线 */ + // [attributedString ba_changeStrikethroughAtAll]; + + /*! 根据位置修改默认字距 0表示禁用字距调整 */ + [attributedString ba_changeKernWithValue:@(10) Range:NSMakeRange(1, 5)]; + + /*! 根据位置修改描边颜色 */ + [attributedString ba_changeStrokeColorWithColor:[UIColor greenColor] strokeWidth:@(2.0) Range:NSMakeRange(1, 5)]; + + /*! 阴影 */ + NSShadow *shadow = [[NSShadow alloc] init]; + [shadow ba_shadowWithColor:[UIColor grayColor] + shadowOffset:CGSizeMake(1, 3) + shadowBlurRadius:1]; + [attributedString ba_changeShadowWithShadow:shadow Range:NSMakeRange(1, 3)]; + + /*! 根据位置修改宽度 */ + [attributedString ba_changeExpansionWithValue:@(0.6) Range:NSMakeRange(1, 3)]; + + NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:20], + NSForegroundColorAttributeName:[UIColor blackColor], + NSKernAttributeName:@2.0, + NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle), + NSStrokeColorAttributeName:[UIColor blueColor], + NSStrokeWidthAttributeName:@2.0, + NSShadowAttributeName:shadow, + NSVerticalGlyphFormAttributeName:@(0)}; + + [attributedString ba_changeAttributeDict:dic range:NSMakeRange(65, 5)]; + + [attributedString ba_changeStrikethroughStyle:NSUnderlineStyleDouble color:[UIColor redColor] Range:NSMakeRange(1, 3)]; + + /*! 设置连体属性,取值为NSNumber 对象(整数),0 表示没有连体字符,1 表示使用默认的连体字符, // 2 表示使用所有连体符号,默认值为 1(iOS 不支持 2) */ + // - (NSRange)ba_changeLigatureWithValue:(int)value range:(NSRange)range + // + // NSString *ligatureStr = @"flush"; + // + // NSDictionary *attrDict1 = @{ NSLigatureAttributeName: [NSNumber numberWithInt: 0], + // NSFontAttributeName: [UIFont fontWithName: @"futura" size: 30] }; + + // label.attributedText = [[NSAttributedString alloc] initWithString: ligatureStr attributes: attrDict1]; + // + // NSDictionary *attrDict2 = @{ NSLigatureAttributeName: @(1), NSFontAttributeName: [UIFont fontWithName: @"futura" size: 30]}; + // + // label2.attributedText = [[NSAttributedString alloc] initWithString: ligatureStr attributes: attrDict2]; + + _label2.attributedText = attributedString; + // label.attributedText = attributedString2; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + + + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.h" new file mode 100644 index 0000000..733ae21 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.h" @@ -0,0 +1,13 @@ +// +// ViewController2.h +// testDemo +// +// Created by 博爱 on 2016/11/22. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_07 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.m" new file mode 100644 index 0000000..1e32876 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.m" @@ -0,0 +1,282 @@ +// +// DemoVC2_07.m +// testDemo +// +// Created by 博爱 on 2016/11/22. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "DemoVC2_07.h" +#import "NSMutableArray+BASort.h" + + +static const NSInteger kTempCount = 100; + +@interface DemoVC2_07 () + +@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentControl; + +@property (nonatomic, strong) NSMutableArray *tempViewArray; + +@property (nonatomic, strong) UILabel *timeLabel; + +@property (nonatomic ) CADisplayLink *displayLink; +@property (nonatomic, strong) dispatch_semaphore_t sema; +@property (nonatomic, assign) NSTimeInterval nowTime; + +@end + +@implementation DemoVC2_07 + + +#pragma mark - life cycle +- (void)viewDidLoad { + [super viewDidLoad]; + + [self ba_setupUI]; +} + +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + +} + +#pragma mark - custom method +- (void)ba_setupUI +{ + self.title = @"排序算法"; + [self ba_viewLayout]; + +} + +- (void)ba_viewLayout +{ + UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithTitle:@"重置" style:UIBarButtonItemStylePlain target:self action:@selector(onResetAction:)]; + UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"排序" style:UIBarButtonItemStylePlain target:self action:@selector(onSortAction:)]; + self.navigationItem.rightBarButtonItems = @[item1, item2]; + + self.timeLabel.frame = CGRectMake(CGRectGetWidth(self.view.bounds) * 0.5 - 50, CGRectGetHeight(self.view.bounds) * 0.8 + 30, 120, 40); + + [_segmentControl addTarget:self action:@selector(onSegmentControlChanged:) forControlEvents:UIControlEventValueChanged]; + + [self onResetAction:nil]; +} + +- (void)invalidateTimer +{ + if (self.displayLink) + { + [self.displayLink invalidate]; + self.displayLink = nil; + } + self.sema = nil; +} + +- (void)printBarDataArray +{ +#if 1 + NSMutableString *string = [NSMutableString string]; + [self.tempViewArray enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [string appendFormat:@"%@ ", @(CGRectGetHeight(obj.frame))]; + }]; + NSLog(@"数组内容:%@", string); +#endif +} + +- (NSComparisonResult)ba_compareWithDataOne:(UIView *)dataOne dataTwo:(UIView *)dataTwo +{ + /*! 模拟进行比较所需的耗时 */ + dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER); + + CGFloat height1 = CGRectGetHeight(dataOne.frame); + CGFloat height2 = CGRectGetHeight(dataTwo.frame); + if (height1 == height2) + { + return NSOrderedSame; + } + return height1 < height2 ? NSOrderedAscending:NSOrderedDescending; +} + +- (void)ba_exchangePositionWithBarOne:(UIView *)barOne barTwo:(UIView *)barTwo +{ + dispatch_async(dispatch_get_main_queue(), ^{ + CGRect frameOne = barOne.frame; + CGRect frameTwo = barTwo.frame; + frameOne.origin.x = barTwo.frame.origin.x; + frameTwo.origin.x = barOne.frame.origin.x; + barOne.frame = frameOne; + barTwo.frame = frameTwo; + }); +} + +#pragma mark - event response +- (void)onResetAction:(UIBarButtonItem *)sender +{ + [self invalidateTimer]; + self.timeLabel.text = @""; + + CGFloat width = CGRectGetWidth(self.view.bounds); + CGFloat barMargin = 1; + CGFloat barWith = floorf((width - barMargin * (kTempCount + 1))/ kTempCount); + CGFloat barX = roundf((width - (barMargin + barWith) * kTempCount + barMargin) / 2.0); + CGFloat barY = CGRectGetMaxY(_segmentControl.frame) + 10; + CGFloat barBottom = CGRectGetHeight(self.view.bounds) * 0.8; + CGFloat barHeight = barBottom - barY; + + [self.tempViewArray enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + CGFloat barHeight2 = 20 + arc4random_uniform(barHeight - 20); + /*! 若需要制造高概率重复数据请打开此行,令数值为10的整数倍(或修改为其它倍数) */ +// barHeight2 = roundf(barHeight / 10) * 10; + obj.frame = CGRectMake(barX + idx * (barMargin + barWith), barBottom - barHeight2, barWith, barHeight2); + }]; + NSLog(@"重置成功!"); + [self printBarDataArray]; +} + +- (void)onSortAction:(UIBarButtonItem *)sender +{ + [self invalidateTimer]; + self.sema = dispatch_semaphore_create(0); + + _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLinkAction:)]; + _displayLink.frameInterval = 0.0001; + [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; + + _nowTime = [[NSDate date] timeIntervalSince1970]; + + __weak typeof(self) weakSelf = self; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + switch (weakSelf.segmentControl.selectedSegmentIndex) { + case 0: + [weakSelf selectSort]; + break; + case 1: + [weakSelf bubbleSort]; + break; + case 2: + [weakSelf quickSort]; + break; + case 3: + [weakSelf heapSort]; + break; + case 4: + [weakSelf insertSort]; + break; + + default: + break; + } + NSLog(@"%@", weakSelf.timeLabel.text); + [weakSelf invalidateTimer]; + [weakSelf printBarDataArray]; + }); +} + +- (void)onSegmentControlChanged:(UISegmentedControl *)sender +{ + [self onResetAction:nil]; +} + +/*! 耗时(秒):82.512 */ +- (void)selectSort +{ + [self.tempViewArray ba_selectSortWithComparator:^NSComparisonResult(UIView *obj1, UIView *obj2) { + return [self ba_compareWithDataOne:obj1 dataTwo:obj2]; + } didExchange:^(UIView *obj1, UIView *obj2) { + [self ba_exchangePositionWithBarOne:obj1 barTwo:obj2]; + }]; +} + +/*! 耗时(秒):82.495 */ +- (void)bubbleSort +{ + [self.tempViewArray ba_bubbleSortWithComparator:^NSComparisonResult(id obj1, id obj2) { + return [self ba_compareWithDataOne:obj1 dataTwo:obj2]; + } didExchange:^(id obj1, id obj2) { + [self ba_exchangePositionWithBarOne:obj1 barTwo:obj2]; + }]; +} + +/*! 耗时(秒):13.500 */ +- (void)quickSort +{ + [self.tempViewArray ba_quickSortWithComparator:^NSComparisonResult(id obj1, id obj2) { + return [self ba_compareWithDataOne:obj1 dataTwo:obj2]; + } didExchange:^(id obj1, id obj2) { + [self ba_exchangePositionWithBarOne:obj1 barTwo:obj2]; + }]; +} + +/*! 耗时(秒):17.058 */ +- (void)heapSort +{ + [self.tempViewArray ba_heapSortWithComparator:^NSComparisonResult(id obj1, id obj2) { + return [self ba_compareWithDataOne:obj1 dataTwo:obj2]; + } didExchange:^(id obj1, id obj2) { + [self ba_exchangePositionWithBarOne:obj1 barTwo:obj2]; + }]; +} + +/*! 耗时(秒):47.238 */ +- (void)insertSort +{ + [self.tempViewArray ba_insertSortWithComparator:^NSComparisonResult(id obj1, id obj2) { + return [self ba_compareWithDataOne:obj1 dataTwo:obj2]; + } didExchange:^(id obj1, id obj2) { + [self ba_exchangePositionWithBarOne:obj1 barTwo:obj2]; + }]; +} + +- (void)handleDisplayLinkAction:(CADisplayLink *)displayLink +{ + /*! 定时器信号 */ + __weak typeof(self) weakSelf = self; + // 发出信号量,唤醒排序线程 + dispatch_semaphore_signal(weakSelf.sema); + // 更新计时 + NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] - _nowTime; + dispatch_async(dispatch_get_main_queue(), ^{ + weakSelf.timeLabel.text = [NSString stringWithFormat:@"耗时(秒):%2.3f", interval]; + }); +} + +#pragma mark - setter / getter +- (UILabel *)timeLabel +{ + if (!_timeLabel) + { + _timeLabel = [[UILabel alloc] init]; + _timeLabel.font = [UIFont systemFontOfSize:14]; + _timeLabel.textColor = [UIColor darkTextColor]; + [self.view addSubview:_timeLabel]; + } + return _timeLabel; +} + +- (NSMutableArray *)tempViewArray +{ + if (!_tempViewArray) + { + _tempViewArray = [NSMutableArray arrayWithCapacity:kTempCount]; + + for (NSInteger i = 0; i < kTempCount; i++) + { + UIView *barView = [UIView new]; + barView.backgroundColor = BAKit_ColorRandom(); + [self.view addSubview:barView]; + + [_tempViewArray addObject:barView]; + } + } + return _tempViewArray; +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.xib" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.xib" new file mode 100644 index 0000000..4fc8cba --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-7/DemoVC2_07.xib" @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.h" new file mode 100644 index 0000000..3debedb --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_08.h +// BABaseProject +// +// Created by 博爱 on 2016/12/13. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_08 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.html" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.html" new file mode 100755 index 0000000..7a4f69a --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.html" @@ -0,0 +1,51 @@ + + + + + + + + + + +
+ + +
+ + + \ No newline at end of file diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.m" new file mode 100644 index 0000000..0a8f850 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.m" @@ -0,0 +1,269 @@ +// +// DemoVC2_08.m +// BABaseProject +// +// Created by 博爱 on 2016/12/13. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_08.h" +#import + +@interface DemoVC2_08 () +{ + BOOL _authenticated; + NSURLConnection *_urlConnection; + NSMutableURLRequest *_request; +} +@property (weak, nonatomic) IBOutlet UIWebView *webView; +@property (nonatomic, strong) UIButton *shareBtn; + +@end + +@implementation DemoVC2_08 + +- (UIButton *)shareBtn +{ + if (!_shareBtn) + { + _shareBtn = [UIButton new]; + _shareBtn.frame = CGRectMake(50, BA_SCREEN_HEIGHT - 200, 150, 40); + [_shareBtn setTitle:@"OC按钮调用JS方法" forState:UIControlStateNormal]; + [_shareBtn setTitleColor:BAKit_Color_White forState:UIControlStateNormal]; + _shareBtn.titleLabel.font = BA_FontSize(14); + [_shareBtn jm_setCornerRadius:5 withBackgroundColor:BAKit_Color_Green]; + _shareBtn.tag = 1001; + [_shareBtn addTarget:self action:@selector(clickShareBtn:) forControlEvents:UIControlEventTouchUpInside]; + _shareBtn.titleLabel.textAlignment = NSTextAlignmentRight; + + [self.view addSubview:_shareBtn]; + + [_shareBtn ba_shakeView]; + } + return _shareBtn; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = BAKit_Color_Yellow; + self.shareBtn.hidden = NO; +} + +- (void)ba_setupUI +{ +// NSURL *url = [[NSBundle mainBundle] URLForResource:@"DemoVC2_08" withExtension:@"html"]; +// NSString *htmlContent = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; +// NSString *basePath = [[NSBundle mainBundle] bundlePath]; +// NSURL *baseURL = [NSURL fileURLWithPath:basePath]; +// +// [_webView loadHTMLString:htmlContent baseURL:baseURL]; + + [self loadWeb]; + /*! 纯代码 */ +// UIWebView *web = [UIWebView new]; +// web.frame = CGRectMake(0, _cancleButton.bottom, KSCREEN_WIDTH, _detailView.height - _cancleButton.height); +// web.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; +// web.scrollView.bounces = NO; +// [self.view addSubview: web]; +// +// NSURL *url = [[NSBundle mainBundle] URLForResource:@"video_synopsis.html" withExtension:nil]; +// NSString *htmlContent = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; +// NSString *tempContent = [htmlContent stringByReplacingOccurrencesOfString:@"" withString:self.model.desc]; +// NSString *tempContent2 = [tempContent stringByReplacingOccurrencesOfString:@"" withString:self.model.title]; +// NSString *tempContent3 = [tempContent2 stringByReplacingOccurrencesOfString:@"" withString:self.model.viewNum]; +// NSString *tempContent4 = [tempContent3 stringByReplacingOccurrencesOfString:@"" withString:self.model.reviewNum]; +// +// NSString *tempContent5 = [tempContent4 stringByReplacingOccurrencesOfString:@"white-space: nowrap;" withString:@" "]; + + +// NSString *basePath = [[NSBundle mainBundle] bundlePath]; +// NSURL *baseURL = [NSURL fileURLWithPath:basePath]; +// +// [web loadHTMLString:tempContent5 baseURL:baseURL]; +// +// +// [self.view addSubview:_detailView]; + +} + + +- (void)loadWeb{ + + //1..加载H5地址 + + //加载地址 + +// NSString *str = @"H5传过来的地址"; + + NSURL *url = [[NSBundle mainBundle] URLForResource:@"DemoVC2_08" withExtension:@"html"]; + NSURLRequest *reUrl = [NSURLRequest requestWithURL:url]; + + [self.webView loadRequest:reUrl]; + + ///主要 这里是直接传地址给H5 属于get方法传输 但是有参数长度限制  也有post传输 不限制参数长度  这里不另外写 很简单  也是几行代码的事情 + + //2..JS调用OC   其实就是客户端传给H5页面的地址  这里也要约定字段 + +// NSString *string = [NSString stringWithFormat:@"?约定字段={\"参数名\":\"参数内容\"}"]; +// string = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +// NSString *strURL = [NSString stringWithFormat:@"%@%@",str,string]; +// NSURL *cateUrl = [NSURL URLWithString:strURL]; +// NSURLRequest *request = [NSURLRequest requestWithURL:cateUrl]; +// [self.webView loadRequest:request]; + +} +// +// +// +// +#pragma mark - OC 拦截 JS 方法! 方法一:【原生 webView】! +- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType +{ + NSLog(@"URL scheme:%@", [request.URL scheme]); + NSLog(@"URL query: %@", [request.URL query]); + NSString *jsonText = [[request.URL query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + /*! + 注意:1. JS中的 function asdbtn() ,在拦截到的url scheme全都被转化为小写。 + 2.html中需要设置编码,否则中文参数可能会出现编码问题。 + 3.JS用打开一个iFrame的方式替代直接用document.location的方式,以避免多次请求,被替换覆盖的问题。 + */ + NSURL *jsUrl = [request URL]; + NSString *scheme = [jsUrl scheme]; + NSLog(@"scheme = %@",scheme); + /*! 判断是不是https */ +// if (!_authenticated) { +// +// _authenticated = NO; +// _urlConnection = [[NSURLConnection alloc] initWithRequest:_request delegate:self]; +// +// [_urlConnection start]; +// +// return NO; +// } + +// if ([scheme isEqualToString:@"ba_shareClick"]) +// { +// NSArray *h5Params = [jsUrl.query componentsSeparatedByString:@"&"]; +// NSMutableDictionary *h5Dict = [NSMutableDictionary dictionary]; +// for (NSString *paramString in h5Params) +// { +// NSArray *array = [paramString componentsSeparatedByString:@"="]; +// if (array.count > 1) +// { +// NSString *decodeValue = [array[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +// [h5Dict setObject:decodeValue forKey:array[0]]; +// } +// } +// [self.view BA_showAlertWithTitle:@"这是OC原生的弹出窗!"]; +// return NO; +// } + /*! 和 H5 端约定的字段名【ba://】 */ + if([request.URL.absoluteString rangeOfString:@"ba_shareFunction://" options:NSCaseInsensitiveSearch].location != NSNotFound) + { +// NSString *jsonStr = [request.URL.absoluteString componentsSeparatedByString:@"ba_shareFunction://"][1]; + +// NSDictionary *dict = [jsonText mj_JSONObject]; +// NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:[jsonText dataUsingEncoding:NSUTF8StringEncoding] options:0 error:nil]; + + NSArray *params =[request.URL.query componentsSeparatedByString:@"&"]; + + NSMutableDictionary *tempDic = [NSMutableDictionary dictionary]; + for (NSString *paramStr in params) + { + NSArray *dicArray = [paramStr componentsSeparatedByString:@"="]; + if (dicArray.count > 1) + { + NSString *decodeValue = [dicArray[1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + [tempDic setObject:decodeValue forKey:dicArray[0]]; + } + } + + NSLog(@"从H5端获取的参数字典:%@", tempDic); + + /*! + 从H5端获取的参数字典: + { + content = "欢迎使用博爱分享2.1版本"; + imagePath = "图片地址"; + title = "博爱分享2.1版本"; + url = "www.baidu.com"; + } + */ + + /*! + 与后台进行交互  上传服务器  这里是测试demo  假设传回来的字典参数都上传服务器 + */ + NSString *msg = [NSString stringWithFormat:@"分享标题:%@,\n内容:%@,\n图片URL:%@,\nURL:%@", tempDic[@"title"], tempDic[@"content"], tempDic[@"imagePath"], tempDic[@"url"]]; + [[[UIAlertView alloc] initWithTitle:@"这是OC原生的弹出窗!" message:msg delegate:self cancelButtonTitle:@"收到" otherButtonTitles:nil] show]; + return NO; + } + return YES; +} + +#pragma mark - OC 拦截 JS 方法二:【JavaScriptCore 库】! +- (void)webViewDidFinishLoad:(UIWebView *)webView +{ + /*! + 在iOS 7之后,apple添加了一个新的库JavaScriptCore,用来做JS交互,因此JS与原生OC交互也变得简单了许多。 + 首先导入JavaScriptCore库, 然后在OC中获取JS的上下文 + + */ + /*! 获取webView上的js */ + JSContext *contest = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; + + /*! + 再然后定义好JS需要调用的方法,例如JS要调用 asdbtn 方法: + 则可以在UIWebView加载url完成后,在其代理方法中添加要调用的 asdbtn 方法: + */ +// contest[@"asdbtn"] = ^(){ +// +// NSLog(@"+++++++Begin Log+++++++"); +// NSArray *args = [JSContext currentArguments]; +// +// /*! +// 注意: +// 可能最新版本的iOS系统做了改动,现在(iOS10,Xcode 7.2,去年使用Xcode 6 和iOS 8没有线程问题)中测试,block中是在子线程,因此执行UI操作,控制台有警告,需要回到主线程再操作UI。 +// */ +// dispatch_async(dispatch_get_main_queue(), ^{ +// // 这里网页上的按钮被点击了, 客户端可以在这里拦截到,并进行操作 +// [self.view BA_showAlertWithTitle:@"这是OC原生的弹出窗!"]; +// +// }); +// +// for (JSValue *jsVal in args) { +// NSLog(@"%@", jsVal.toString); +// } +// +// NSLog(@"-------End Log-------"); +// }; + +} + +#pragma mark - OC 按钮调用 JS 方法:【JavaScriptCore 库】! +- (IBAction)clickShareBtn:(UIButton *)sender +{ + /*! + 方式一 : + 需要传给 JS 的参数可以拼接在后面即可! + */ +// NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')",@"这里是JS中alert弹出的message"]; +// [_webView stringByEvaluatingJavaScriptFromString:jsStr]; + + /*! + 方式二 + 继续使用JavaScriptCore库来做JS交互。 + */ + JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; + NSString *textJS = [NSString stringWithFormat:@"showAlert('%@')",@"这里是JS中alert弹出的message"]; + [context evaluateScript:textJS]; + + /*! + 重点: + stringByEvaluatingJavaScriptFromString是一个同步的方法,使用它执行JS方法时,如果JS 方法比较耗的时候,会造成界面卡顿。尤其是js 弹出alert 的时候。 + alert 也会阻塞界面,等待用户响应,而stringByEvaluatingJavaScriptFromString又会等待js执行完毕返回。这就造成了死锁。 + 官方推荐使用WKWebView的evaluateJavaScript:completionHandler:代替这个方法。 + 其实我们也有另外一种方式,自定义一个延迟执行alert 的方法来防止阻塞,然后我们调用自定义的alert 方法。同理,耗时较长的js 方法也可以放到setTimeout 中。 + */ +} +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.xib" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.xib" new file mode 100644 index 0000000..d6ae117 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/DemoVC2_08.xib" @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/jquery-1.7.2.min.js" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/jquery-1.7.2.min.js" new file mode 100644 index 0000000..16ad06c --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-8/jquery-1.7.2.min.js" @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
"+""+"
",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
t
",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.h" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.h" new file mode 100644 index 0000000..90ba3e1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.h" @@ -0,0 +1,13 @@ +// +// DemoVC2_09.h +// BABaseProject +// +// Created by 博爱 on 2016/12/16. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BABaseViewController.h" + +@interface DemoVC2_09 : BABaseViewController + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.m" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.m" new file mode 100644 index 0000000..1037835 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.m" @@ -0,0 +1,178 @@ +// +// DemoVC2_09.m +// BABaseProject +// +// Created by 博爱 on 2016/12/16. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "DemoVC2_09.h" + +@interface DemoVC2_09 () + +@property (nonatomic, strong) UIView *demoView; +@property (nonatomic, strong) UIButton *shareLabelButton; +@property (weak, nonatomic) IBOutlet UILabel *contentLabel; + +- (IBAction)supportButtonAction:(UIButton *)sender; + +@end + +@implementation DemoVC2_09 + +- (void)viewDidLoad { + [super viewDidLoad]; + + + self.demoView.hidden = NO; + self.shareLabelButton.hidden = NO; + +} + +- (void)basicAnimation1 +{ + /*! 使用CABasicAnimation创建基础动画 */ + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; + animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, BA_SCREEN_WIDTH/2 - 75)]; + animation.toValue = [NSValue valueWithCGPoint:CGPointMake(BA_SCREEN_WIDTH, BA_SCREEN_HEIGHT/2-75)]; + animation.duration = 2.0f; + /*! + 如果 fillMode = kCAFillModeForwards 和 removedOnComletion = NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。 + */ + + animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; + [_demoView.layer addAnimation:animation forKey:@"positionAnimation"]; + + +} + +- (IBAction)supportButtonAction:(UIButton *)sender +{ + UIButton *button = (UIButton *)[self.view viewWithTag:sender.tag]; + button.selected = !button.selected; + + BAKit_WeakSelf + if (sender.tag == 1) + { + /*! 1、基础的缩放动画【仿qq空间的点赞】 */ + [UIView animateWithDuration:0.5f animations:^{ + BAKit_StrongSelf + /*! 1.5和0,67,两个的缩放的积等于1才能回归原大小 */ + button.transform = CGAffineTransformScale(button.transform, 2, 2); + self.contentLabel.transform = CGAffineTransformScale(self.contentLabel.transform, 1.6, 1.6); + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.5f animations:^{ + button.transform = CGAffineTransformScale(button.transform, 0.5, 0.5); + self.contentLabel.transform = CGAffineTransformScale(self.contentLabel.transform, 0.625, 0.625); + }]; + }]; + } + else if (sender.tag == 2) + { + + [self showNewStatusCount:5]; +// if (button.selected) +// { + + /*! 2、基础的移动动画【仿微博上下拉新数据条数】 */ + BAKit_WeakSelf + [UIView animateWithDuration:1.8f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{ + /*! 负数为向左向上 */ + BAKit_StrongSelf + self.shareLabelButton.transform = CGAffineTransformMakeTranslation(0, -30); + } completion:^(BOOL finished) { + /*! 2、基础的移动动画【仿微博上下拉新数据条数】 */ + [UIView animateWithDuration:1.8f delay:1.f options:UIViewAnimationOptionCurveEaseInOut animations:^{ + /*! 正数为向右向下 */ + self.shareLabelButton.transform = CGAffineTransformIdentity; +// self.shareLabelButton.transform = CGAffineTransformMakeTranslation(0, 30); + } completion:^(BOOL finished) { + }]; + }]; + } + else if (sender.tag == 3) + { + [UIView animateWithDuration:1.0f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{ + self.contentLabel.transform = CGAffineTransformRotate(_contentLabel.transform, M_PI_2); + self.contentLabel.transform = CGAffineTransformScale(self.contentLabel.transform, 1.6, 1.6); + } completion:^(BOOL finished) { + [UIView animateWithDuration:1.0f delay:0.f options:UIViewAnimationOptionCurveEaseOut animations:^{ + self.contentLabel.transform = CGAffineTransformScale(self.contentLabel.transform, 0.625, 0.625); + } completion:^(BOOL finished) { + + }]; + }]; + } + else + { + + } +} + +- (void)showNewStatusCount:(int)count +{ + if (count == 0) return; + /*! 展示最新的微博数 */ + + CGFloat h = 35; + CGFloat x = 0; + CGFloat y = CGRectGetMaxY(self.navigationController.navigationBar.frame) - h; + CGFloat w = self.view.width; + + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x, y, w, h)]; + label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]]; + label.text = [NSString stringWithFormat:@"最新的微博数:%d", count]; + label.textAlignment = NSTextAlignmentCenter; + label.textColor = [UIColor whiteColor]; + // [self.view addSubview:label]; + + /*! 插入到导航控制器下面 */ + [self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar]; + + /*! 动画平移 */ + [UIView animateWithDuration:1.25 animations:^{ + label.transform = CGAffineTransformMakeTranslation(0, h); + + } completion:^(BOOL finished) { + /*! 往上平移 */ + [UIView animateKeyframesWithDuration:1.25 delay:2 options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{ + + /*! 还原 */ + label.transform = CGAffineTransformIdentity; + + } completion:^(BOOL finished) { + [label removeFromSuperview]; + }]; + }]; +} + +- (UIView *)demoView +{ + if (!_demoView) + { + _demoView = [UIView new]; + _demoView.frame = CGRectMake(BA_SCREEN_WIDTH/2-50, BA_SCREEN_HEIGHT/2-100,100 ,100); + _demoView.backgroundColor = [UIColor greenColor]; + [self.view addSubview:_demoView]; + } + return _demoView; +} + +- (UIButton *)shareLabelButton +{ + if (!_shareLabelButton) + { + _shareLabelButton = [UIButton buttonWithType:UIButtonTypeCustom]; + _shareLabelButton.frame = CGRectMake(0, BA_SCREEN_HEIGHT, BA_SCREEN_WIDTH, 30); + [_shareLabelButton setTitle:@"快点使用博爱的分享吧!【上拉新数据20条!】" forState:UIControlStateNormal]; + [_shareLabelButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + _shareLabelButton.backgroundColor = [UIColor redColor]; + + // [_shareLabelButton addTarget:self action:@selector(onShareBtnPressed:) forControlEvents:UIControlEventTouchUpInside]; + + [self.view addSubview:_shareLabelButton]; + } + return _shareLabelButton; +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.xib" "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.xib" new file mode 100644 index 0000000..338da67 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Message(\346\266\210\346\201\257)/DemoVC/DemoVC2-9/DemoVC2_09.xib" @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.h" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.h" index e070d13..6b11ace 100755 --- "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.h" +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.h" @@ -6,8 +6,10 @@ // Copyright © 2016年 博爱之家. All rights reserved. // -#import "BABaseViewController.h" +#import "BAProfileViewController.h" -@interface BAProfileViewController : BABaseViewController +@interface BAProfileViewController : UIViewController + +- (void)openAppWithAlert:(NSString *)msg; @end diff --git "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.m" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.m" index 42c21d3..4c8f75b 100755 --- "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.m" +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.m" @@ -7,35 +7,210 @@ // #import "BAProfileViewController.h" +#import "BAProfileHeadCell.h" +#import "BALoginViewController.h" + +#define BAProfile_Title @"title" +#define BAProfile_Image @"image" + +#define BAProfile_CellID @"BAProfileHeadCell" +#define BAProfile_CellID2 @"BAProfileCell" @interface BAProfileViewController () +< + UITableViewDelegate, + UITableViewDataSource +> + +@property (weak, nonatomic) IBOutlet UITableView *tableView; +@property (nonatomic, strong) BALoginViewController *loginVC; +@property (nonatomic, strong) NSArray *dataArray; @end @implementation BAProfileViewController +#pragma mark - life cycle +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + +} + +- (void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + +} + - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - self.title = @"我 的"; - self.vcBgColor = BA_Red_Color; + [self setupUI]; +} + +#pragma mark - 私有方法 +- (void)setupUI +{ + self.title = @"我 的"; + self.view.backgroundColor = BAKit_Color_Red; + + self.tableView.delegate = self; + self.tableView.dataSource = self; + self.tableView.tableFooterView = [UIView new]; + + [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:BAProfile_CellID2]; + + _loginVC = [BALoginViewController new]; + [self addNoti]; +} + +- (void)openAppWithAlert:(NSString *)msg +{ + [self.view ba_showAlertView:@"网页打开APP,带传参:" message:msg]; +} + +#pragma mark - 通知 +- (void)addNoti +{ + [BA_NotiCenter addObserver:self selector:@selector(loginFinishAction:) name:BANotioKey_LoginFinish object:nil]; +} + +#pragma mark - UITableView Delegate / UITableViewDataSource +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + return 4; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return (1 == section) ? 4:1; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (0 == indexPath.section) + { + // BAProfileHeadCell *headCell = [tableView dequeueReusableCellWithIdentifier:@"BAProfileHeadCell"]; + BAProfileHeadCell *headCell = [BAProfileHeadCell dequeueCellFromNibIndex:indexPath.section identify:BAProfile_CellID tableView:tableView]; + headCell.model = BAUSERSHARE; + return headCell; + } + else + { + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:BAProfile_CellID2]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + + if (1 == indexPath.section) + { + NSDictionary *dict = self.dataArray[indexPath.row]; + cell.textLabel.text = dict[BAProfile_Title]; + cell.imageView.image = BA_ImageName(dict[BAProfile_Image]); + } + else if (2 == indexPath.section) + { + cell.textLabel.text = @"表情"; + cell.imageView.image = BA_ImageName(@"profileVC.bundle/MoreExpressionShops"); + } + else if (3 == indexPath.section) + { + cell.textLabel.text = @"设置"; + cell.imageView.image = BA_ImageName(@"profileVC.bundle/MoreSetting"); + } + + return cell; + } + return [UITableViewCell new]; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return (0 == indexPath.section) ? 82:42; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section +{ + return (0 == section) ? 15:20; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section +{ + return FLT_MIN; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + if (!BAUSERSHARE.isLogin) + { + [BAJumpManager ba_gotoLoginVCWithViewController:self]; + } +} + +- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (1 == indexPath.section) + { + if ([cell respondsToSelector:@selector(setSeparatorInset:)]) + { + [cell setSeparatorInset:UIEdgeInsetsMake(0, 15, 0, 0)]; + } + if ([cell respondsToSelector:@selector(setLayoutMargins:)]) + { + [cell setLayoutMargins:UIEdgeInsetsMake(0, 15, 0, 0)]; + } + } +} + +#pragma mark - Custom Delegate + +#pragma mark - event response +- (void)loginFinishAction:(NSNotification *)noti +{ + NSDictionary *dict = noti.userInfo; + if ([dict[@"isLogin"] isEqualToString:@"1"]) + { + [self.tableView reloadData]; + } } -- (void)didReceiveMemoryWarning { - [super didReceiveMemoryWarning]; - // Dispose of any resources that can be recreated. +#pragma mark - getters and setters +- (NSArray *)dataArray +{ + if (!_dataArray) + { + _dataArray = @[ + @{ + BAProfile_Title : @"相册", + BAProfile_Image : @"profileVC.bundle/MoreMyAlbum" + }, + @{ + BAProfile_Title : @"收藏", + BAProfile_Image : @"profileVC.bundle/MoreMyFavorites" + }, + @{ + BAProfile_Title : @"钱包", + BAProfile_Image : @"profileVC.bundle/MoreMyBankCard" + }, + @{ + BAProfile_Title : @"卡包", + BAProfile_Image : @"profileVC.bundle/MyCardPackageIcon" + } + ]; + + } + return _dataArray; } -/* -#pragma mark - Navigation +#pragma mark - dealloc +- (void)dealloc +{ +// [BA_NotiCenter removeObserver:self]; + [BA_NotiCenter removeObserver:self name:BANotioKey_LoginFinish object:nil]; -// 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/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.xib" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.xib" new file mode 100644 index 0000000..9055e84 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/Controller/BAProfileViewController.xib" @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.h" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.h" new file mode 100644 index 0000000..7073c5d --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.h" @@ -0,0 +1,16 @@ +// +// BAProfileHeadCell.h +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import + +@class BAUserModel; +@interface BAProfileHeadCell : UITableViewCell + +@property (nonatomic, strong) BAUserModel *model; + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.m" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.m" new file mode 100644 index 0000000..9868b60 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.m" @@ -0,0 +1,55 @@ +// +// BAProfileHeadCell.m +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BAProfileHeadCell.h" +#import "BAUserModel.h" + +@interface BAProfileHeadCell () + +@property (weak, nonatomic) IBOutlet UIImageView *userImgView; +@property (weak, nonatomic) IBOutlet UILabel *userNameLabel; +@property (weak, nonatomic) IBOutlet UILabel *accountLabel; +@property (weak, nonatomic) IBOutlet UIImageView *QRCodeImgView; + +@end + +@implementation BAProfileHeadCell + +- (void)setModel:(BAUserModel *)model +{ + _model = model; + + if (model.isLogin) + { + _userImgView.image = BA_ImageName(@"icon1.jpg"); + _userNameLabel.text = model.nickName; + _accountLabel.text = [NSString stringWithFormat:@"微信号:%@",model.phone]; + } + else + { + _userImgView.image = BA_ImageName(@"profileVC.bundle/xhr"); + _userNameLabel.text = @"游客"; + _accountLabel.text = @"18588886666"; + } + _QRCodeImgView.image = BA_ImageName(@"profileVC.bundle/qrcode"); +} + +- (void)awakeFromNib +{ + +} + + + +- (void)setSelected:(BOOL)selected animated:(BOOL)animated { + [super setSelected:selected animated:animated]; + + // Configure the view for the selected state +} + +@end diff --git "a/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.xib" "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.xib" new file mode 100644 index 0000000..daa4084 --- /dev/null +++ "b/BABaseProject/BAMainCode/BACode/Profile(\346\210\221)/View/BAProfileHeadCell.xib" @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.h" "b/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.h" index 83aca6b..a325453 100755 --- "a/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.h" +++ "b/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.h" @@ -6,8 +6,8 @@ // Copyright © 2016年 博爱之家. All rights reserved. // -#import "BABaseViewController.h" +#import "BAPublishViewController.h" -@interface BAPublishViewController : BABaseViewController +@interface BAPublishViewController : UIViewController @end diff --git "a/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.m" "b/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.m" index f18516c..bfb8990 100755 --- "a/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.m" +++ "b/BABaseProject/BAMainCode/BACode/Publish(\345\217\221\345\270\203)/ViewController/BAPublishViewController.m" @@ -20,7 +20,7 @@ - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. - [self.view setBackgroundColor:BA_Green_Color]; + [self.view setBackgroundColor:BAKit_Color_Green]; /*! 设置导航条 */ [self setUpNavgationBar]; diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.h" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.h" new file mode 100644 index 0000000..a33fc9e --- /dev/null +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.h" @@ -0,0 +1,22 @@ +// +// JKDataBase.h +// JKBaseModel +// +// Created by zx_04 on 15/6/24. +// +// github:https://github.com/Joker-King/JKDBModel + +#import +#import "FMDB.h" + +@interface JKDBHelper : NSObject + +@property (nonatomic, retain, readonly) FMDatabaseQueue *dbQueue; + ++ (JKDBHelper *)shareInstance; + ++ (NSString *)dbPath; + +- (BOOL)changeDBWithDirectoryName:(NSString *)directoryName; + +@end diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.m" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.m" new file mode 100644 index 0000000..938ff88 --- /dev/null +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBHelper.m" @@ -0,0 +1,119 @@ +// +// JKDataBase.m +// JKBaseModel +// +// Created by zx_04 on 15/6/24. +// +// github:https://github.com/Joker-King/JKDBModel + +#import + +#import "JKDBHelper.h" +#import "JKDBModel.h" + +@interface JKDBHelper () + +@property (nonatomic, retain) FMDatabaseQueue *dbQueue; + +@end + +@implementation JKDBHelper + +static JKDBHelper *_instance = nil; + ++ (instancetype)shareInstance +{ + static dispatch_once_t onceToken ; + dispatch_once(&onceToken, ^{ + _instance = [[super allocWithZone:NULL] init] ; + }) ; + + return _instance; +} + ++ (NSString *)dbPathWithDirectoryName:(NSString *)directoryName +{ + NSString *docsdir = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; + NSFileManager *filemanage = [NSFileManager defaultManager]; + if (directoryName == nil || directoryName.length == 0) { + docsdir = [docsdir stringByAppendingPathComponent:@"BABaseProject"]; + } else { + docsdir = [docsdir stringByAppendingPathComponent:directoryName]; + } + BOOL isDir; + BOOL exit =[filemanage fileExistsAtPath:docsdir isDirectory:&isDir]; + if (!exit || !isDir) { + [filemanage createDirectoryAtPath:docsdir withIntermediateDirectories:YES attributes:nil error:nil]; + } + NSString *dbpath = [docsdir stringByAppendingPathComponent:@"BABaseProject.sqlite"]; + return dbpath; +} + ++ (NSString *)dbPath +{ + return [self dbPathWithDirectoryName:nil]; +} + +- (FMDatabaseQueue *)dbQueue +{ + if (_dbQueue == nil) { + _dbQueue = [[FMDatabaseQueue alloc] initWithPath:[self.class dbPath]]; + } + return _dbQueue; +} + +- (BOOL)changeDBWithDirectoryName:(NSString *)directoryName +{ + if (_instance.dbQueue) { + _instance.dbQueue = nil; + } + _instance.dbQueue = [[FMDatabaseQueue alloc] initWithPath:[JKDBHelper dbPathWithDirectoryName:directoryName]]; + + int numClasses; + Class *classes = NULL; + numClasses = objc_getClassList(NULL,0); + + if (numClasses >0 ) + { + classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses); + numClasses = objc_getClassList(classes, numClasses); + for (int i = 0; i < numClasses; i++) { + if (class_getSuperclass(classes[i]) == [JKDBModel class]){ + id class = classes[i]; + [class performSelector:@selector(createTable) withObject:nil]; + } + } + free(classes); + } + + return YES; +} + ++ (id)allocWithZone:(struct _NSZone *)zone +{ + return [JKDBHelper shareInstance]; +} + +- (id)copyWithZone:(struct _NSZone *)zone +{ + return [JKDBHelper shareInstance]; +} + +#if ! __has_feature(objc_arc) +- (oneway void)release +{ + +} + +- (id)autorelease +{ + return _instance; +} + +- (NSUInteger)retainCount +{ + return 1; +} +#endif + +@end diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.h" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.h" new file mode 100644 index 0000000..8194059 --- /dev/null +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.h" @@ -0,0 +1,102 @@ +// +// JKBaseModel.h +// JKBaseModel +// +// Created by zx_04 on 15/6/27. +// Copyright (c) 2015年 joker. All rights reserved. +// github:https://github.com/Joker-King/JKDBModel + +#import + +/** SQLite五种数据类型 */ +#define SQLTEXT @"TEXT" +#define SQLINTEGER @"INTEGER" +#define SQLREAL @"REAL" +#define SQLBLOB @"BLOB" +#define SQLNULL @"NULL" +#define PrimaryKey @"primary key" + +#define primaryId @"pk" + +@interface JKDBModel : NSObject + +/** 主键 id */ +@property (nonatomic, assign) int pk; +/** 列名 */ +@property (retain, readonly, nonatomic) NSMutableArray *columeNames; +/** 列类型 */ +@property (retain, readonly, nonatomic) NSMutableArray *columeTypes; + +/** + * 获取该类的所有属性 + */ ++ (NSDictionary *)getPropertys; + +/** 获取所有属性,包括主键 */ ++ (NSDictionary *)getAllProperties; + +/** 数据库中是否存在表 */ ++ (BOOL)isExistInTable; + +/** 表中的字段*/ ++ (NSArray *)getColumns; + +/** 保存或更新 + * 如果不存在主键,保存, + * 有主键,则更新 + */ +- (BOOL)saveOrUpdate; +/** 保存或更新 + * 如果根据特定的列数据可以获取记录,则更新, + * 没有记录,则保存 + */ +- (BOOL)saveOrUpdateByColumnName:(NSString*)columnName AndColumnValue:(NSString*)columnValue; +/** 保存单个数据 */ +- (BOOL)save; +/** 批量保存数据 */ ++ (BOOL)saveObjects:(NSArray *)array; +/** 更新单个数据 */ +- (BOOL)update; +/** 批量更新数据*/ ++ (BOOL)updateObjects:(NSArray *)array; +/** 删除单个数据 */ +- (BOOL)deleteObject; +/** 批量删除数据 */ ++ (BOOL)deleteObjects:(NSArray *)array; +/** 通过条件删除数据 */ ++ (BOOL)deleteObjectsByCriteria:(NSString *)criteria; +/** 通过条件删除 (多参数)--2 */ ++ (BOOL)deleteObjectsWithFormat:(NSString *)format, ...; +/** 清空表 */ ++ (BOOL)clearTable; + +/** 查询全部数据 */ ++ (NSArray *)findAll; + +/** 通过主键查询 */ ++ (instancetype)findByPK:(int)inPk; + ++ (instancetype)findFirstWithFormat:(NSString *)format, ...; + +/** 查找某条数据 */ ++ (instancetype)findFirstByCriteria:(NSString *)criteria; + ++ (NSArray *)findWithFormat:(NSString *)format, ...; + +/** 通过条件查找数据 + * 这样可以进行分页查询 @" WHERE pk > 5 limit 10" + */ ++ (NSArray *)findByCriteria:(NSString *)criteria; +/** + * 创建表 + * 如果已经创建,返回YES + */ ++ (BOOL)createTable; + +#pragma mark - must be override method +/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 + */ ++ (NSArray *)transients; + + +@end diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.m" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.m" new file mode 100644 index 0000000..8c8bc60 --- /dev/null +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/FMDB\345\260\201\350\243\205/JKDBModel.m" @@ -0,0 +1,648 @@ +// +// JKBaseModel.m +// JKBaseModel +// +// Created by zx_04 on 15/6/27. +// Copyright (c) 2015年 joker. All rights reserved. +// github:https://github.com/Joker-King/JKDBModel + +#import "JKDBModel.h" +#import "JKDBHelper.h" + +#import + +@implementation JKDBModel + +#pragma mark - override method ++ (void)initialize +{ + if (self != [JKDBModel self]) { + [self createTable]; + } +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + NSDictionary *dic = [self.class getAllProperties]; + _columeNames = [[NSMutableArray alloc] initWithArray:[dic objectForKey:@"name"]]; + _columeTypes = [[NSMutableArray alloc] initWithArray:[dic objectForKey:@"type"]]; + } + + return self; +} + +#pragma mark - base method +/** + * 获取该类的所有属性 + */ ++ (NSDictionary *)getPropertys +{ + NSMutableArray *proNames = [NSMutableArray array]; + NSMutableArray *proTypes = [NSMutableArray array]; + NSArray *theTransients = [[self class] transients]; + unsigned int outCount, i; + objc_property_t *properties = class_copyPropertyList([self class], &outCount); + for (i = 0; i < outCount; i++) { + objc_property_t property = properties[i]; + //获取属性名 + NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; + if ([theTransients containsObject:propertyName]) { + continue; + } + [proNames addObject:propertyName]; + //获取属性类型等参数 + NSString *propertyType = [NSString stringWithCString: property_getAttributes(property) encoding:NSUTF8StringEncoding]; + /* + 各种符号对应类型,部分类型在新版SDK中有所变化,如long 和long long + c char C unsigned char + i int I unsigned int + l long L unsigned long + s short S unsigned short + d double D unsigned double + f float F unsigned float + q long long Q unsigned long long + B BOOL + @ 对象类型 //指针 对象类型 如NSString 是@“NSString” + + + 64位下long 和long long 都是Tq + SQLite 默认支持五种数据类型TEXT、INTEGER、REAL、BLOB、NULL + 因为在项目中用的类型不多,故只考虑了少数类型 + */ + if ([propertyType hasPrefix:@"T@\"NSString\""]) { + [proTypes addObject:SQLTEXT]; + } else if ([propertyType hasPrefix:@"T@\"NSData\""]) { + [proTypes addObject:SQLBLOB]; + } else if ([propertyType hasPrefix:@"Ti"]||[propertyType hasPrefix:@"TI"]||[propertyType hasPrefix:@"Ts"]||[propertyType hasPrefix:@"TS"]||[propertyType hasPrefix:@"TB"]||[propertyType hasPrefix:@"Tq"]||[propertyType hasPrefix:@"TQ"]) { + [proTypes addObject:SQLINTEGER]; + } else { + [proTypes addObject:SQLREAL]; + } + + } + free(properties); + + return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil]; +} + +/** 获取所有属性,包含主键pk */ ++ (NSDictionary *)getAllProperties +{ + NSDictionary *dict = [self.class getPropertys]; + + NSMutableArray *proNames = [NSMutableArray array]; + NSMutableArray *proTypes = [NSMutableArray array]; + [proNames addObject:primaryId]; + [proTypes addObject:[NSString stringWithFormat:@"%@ %@",SQLINTEGER,PrimaryKey]]; + [proNames addObjectsFromArray:[dict objectForKey:@"name"]]; + [proTypes addObjectsFromArray:[dict objectForKey:@"type"]]; + + return [NSDictionary dictionaryWithObjectsAndKeys:proNames,@"name",proTypes,@"type",nil]; +} + +/** 数据库中是否存在表 */ ++ (BOOL)isExistInTable +{ + __block BOOL res = NO; + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + res = [db tableExists:tableName]; + }]; + return res; +} + +/** 获取列名 */ ++ (NSArray *)getColumns +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + NSMutableArray *columns = [NSMutableArray array]; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + FMResultSet *resultSet = [db getTableSchema:tableName]; + while ([resultSet next]) { + NSString *column = [resultSet stringForColumn:@"name"]; + [columns addObject:column]; + } + }]; + return [columns copy]; +} + +/** + * 创建表 + * 如果已经创建,返回YES + */ ++ (BOOL)createTable +{ + __block BOOL res = YES; + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) { + NSString *tableName = NSStringFromClass(self.class); + NSString *columeAndType = [self.class getColumeAndTypeString]; + NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@);",tableName,columeAndType]; + if (![db executeUpdate:sql]) { + res = NO; + *rollback = YES; + return; + }; + + NSMutableArray *columns = [NSMutableArray array]; + FMResultSet *resultSet = [db getTableSchema:tableName]; + while ([resultSet next]) { + NSString *column = [resultSet stringForColumn:@"name"]; + [columns addObject:column]; + } + NSDictionary *dict = [self.class getAllProperties]; + NSArray *properties = [dict objectForKey:@"name"]; + NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",columns]; + //过滤数组 + NSArray *resultArray = [properties filteredArrayUsingPredicate:filterPredicate]; + for (NSString *column in resultArray) { + NSUInteger index = [properties indexOfObject:column]; + NSString *proType = [[dict objectForKey:@"type"] objectAtIndex:index]; + NSString *fieldSql = [NSString stringWithFormat:@"%@ %@",column,proType]; + NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ ",NSStringFromClass(self.class),fieldSql]; + if (![db executeUpdate:sql]) { + res = NO; + *rollback = YES; + return ; + } + } + }]; + + return res; +} + +/** + * 创建表 + * 如果已经创建,返回YES + */ +//+ (BOOL)createTable +//{ +// FMDatabase *db = [FMDatabase databaseWithPath:[JKDBHelper dbPath]]; +// if (![db open]) { +// NSLog(@"数据库打开失败!"); +// return NO; +// } +// +// NSString *tableName = NSStringFromClass(self.class); +// NSString *columeAndType = [self.class getColumeAndTypeString]; +// NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS %@(%@);",tableName,columeAndType]; +// if (![db executeUpdate:sql]) { +// return NO; +// } +// +// NSMutableArray *columns = [NSMutableArray array]; +// FMResultSet *resultSet = [db getTableSchema:tableName]; +// while ([resultSet next]) { +// NSString *column = [resultSet stringForColumn:@"name"]; +// [columns addObject:column]; +// } +// NSDictionary *dict = [self.class getAllProperties]; +// NSArray *properties = [dict objectForKey:@"name"]; +// NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)",columns]; +// //过滤数组 +// NSArray *resultArray = [properties filteredArrayUsingPredicate:filterPredicate]; +// +// for (NSString *column in resultArray) { +// NSUInteger index = [properties indexOfObject:column]; +// NSString *proType = [[dict objectForKey:@"type"] objectAtIndex:index]; +// NSString *fieldSql = [NSString stringWithFormat:@"%@ %@",column,proType]; +// NSString *sql = [NSString stringWithFormat:@"ALTER TABLE %@ ADD COLUMN %@ ",NSStringFromClass(self.class),fieldSql]; +// if (![db executeUpdate:sql]) { +// return NO; +// } +// } +// [db close]; +// return YES; +//} + +- (BOOL)saveOrUpdate +{ + id primaryValue = [self valueForKey:primaryId]; + if ([primaryValue intValue] <= 0) { + return [self save]; + } + + return [self update]; +} + +- (BOOL)saveOrUpdateByColumnName:(NSString*)columnName AndColumnValue:(NSString*)columnValue +{ + id record = [self.class findFirstByCriteria:[NSString stringWithFormat:@"where %@ = %@",columnName,columnValue]]; + if (record) { + id primaryValue = [record valueForKey:primaryId]; //取到了主键PK + if ([primaryValue intValue] <= 0) { + return [self save]; + }else{ + self.pk = [primaryValue integerValue]; + return [self update]; + } + }else{ + return [self save]; + } +} + +- (BOOL)save +{ + NSString *tableName = NSStringFromClass(self.class); + NSMutableString *keyString = [NSMutableString string]; + NSMutableString *valueString = [NSMutableString string]; + NSMutableArray *insertValues = [NSMutableArray array]; + for (int i = 0; i < self.columeNames.count; i++) { + NSString *proname = [self.columeNames objectAtIndex:i]; + if ([proname isEqualToString:primaryId]) { + continue; + } + [keyString appendFormat:@"%@,", proname]; + [valueString appendString:@"?,"]; + id value = [self valueForKey:proname]; + if (!value) { + value = @""; + } + [insertValues addObject:value]; + } + + [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)]; + [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)]; + + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + __block BOOL res = NO; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString]; + res = [db executeUpdate:sql withArgumentsInArray:insertValues]; + self.pk = res?[NSNumber numberWithLongLong:db.lastInsertRowId].intValue:0; + NSLog(res?@"插入成功":@"插入失败"); + }]; + return res; +} + +/** 批量保存用户对象 */ ++ (BOOL)saveObjects:(NSArray *)array +{ + //判断是否是JKBaseModel的子类 + for (JKDBModel *model in array) { + if (![model isKindOfClass:[JKDBModel class]]) { + return NO; + } + } + + __block BOOL res = YES; + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + // 如果要支持事务 + [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) { + for (JKDBModel *model in array) { + NSString *tableName = NSStringFromClass(model.class); + NSMutableString *keyString = [NSMutableString string]; + NSMutableString *valueString = [NSMutableString string]; + NSMutableArray *insertValues = [NSMutableArray array]; + for (int i = 0; i < model.columeNames.count; i++) { + NSString *proname = [model.columeNames objectAtIndex:i]; + if ([proname isEqualToString:primaryId]) { + continue; + } + [keyString appendFormat:@"%@,", proname]; + [valueString appendString:@"?,"]; + id value = [model valueForKey:proname]; + if (!value) { + value = @""; + } + [insertValues addObject:value]; + } + [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)]; + [valueString deleteCharactersInRange:NSMakeRange(valueString.length - 1, 1)]; + + NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@(%@) VALUES (%@);", tableName, keyString, valueString]; + BOOL flag = [db executeUpdate:sql withArgumentsInArray:insertValues]; + model.pk = flag?[NSNumber numberWithLongLong:db.lastInsertRowId].intValue:0; + NSLog(flag?@"插入成功":@"插入失败"); + if (!flag) { + res = NO; + *rollback = YES; + return; + } + } + }]; + return res; +} + +/** 更新单个对象 */ +- (BOOL)update +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + __block BOOL res = NO; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + id primaryValue = [self valueForKey:primaryId]; + if (!primaryValue || primaryValue <= 0) { + return ; + } + NSMutableString *keyString = [NSMutableString string]; + NSMutableArray *updateValues = [NSMutableArray array]; + for (int i = 0; i < self.columeNames.count; i++) { + NSString *proname = [self.columeNames objectAtIndex:i]; + if ([proname isEqualToString:primaryId]) { + continue; + } + [keyString appendFormat:@" %@=?,", proname]; + id value = [self valueForKey:proname]; + if (!value) { + value = @""; + } + [updateValues addObject:value]; + } + + //删除最后那个逗号 + [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)]; + NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@ = ?;", tableName, keyString, primaryId]; + [updateValues addObject:primaryValue]; + res = [db executeUpdate:sql withArgumentsInArray:updateValues]; + NSLog(res?@"更新成功":@"更新失败"); + }]; + return res; +} + +/** 批量更新用户对象*/ ++ (BOOL)updateObjects:(NSArray *)array +{ + for (JKDBModel *model in array) { + if (![model isKindOfClass:[JKDBModel class]]) { + return NO; + } + } + __block BOOL res = YES; + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + // 如果要支持事务 + [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) { + for (JKDBModel *model in array) { + NSString *tableName = NSStringFromClass(model.class); + id primaryValue = [model valueForKey:primaryId]; + if (!primaryValue || primaryValue <= 0) { + res = NO; + *rollback = YES; + return; + } + + NSMutableString *keyString = [NSMutableString string]; + NSMutableArray *updateValues = [NSMutableArray array]; + for (int i = 0; i < model.columeNames.count; i++) { + NSString *proname = [model.columeNames objectAtIndex:i]; + if ([proname isEqualToString:primaryId]) { + continue; + } + [keyString appendFormat:@" %@=?,", proname]; + id value = [model valueForKey:proname]; + if (!value) { + value = @""; + } + [updateValues addObject:value]; + } + + //删除最后那个逗号 + [keyString deleteCharactersInRange:NSMakeRange(keyString.length - 1, 1)]; + NSString *sql = [NSString stringWithFormat:@"UPDATE %@ SET %@ WHERE %@=?;", tableName, keyString, primaryId]; + [updateValues addObject:primaryValue]; + BOOL flag = [db executeUpdate:sql withArgumentsInArray:updateValues]; + NSLog(flag?@"更新成功":@"更新失败"); + if (!flag) { + res = NO; + *rollback = YES; + return; + } + } + }]; + + return res; +} + +/** 删除单个对象 */ +- (BOOL)deleteObject +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + __block BOOL res = NO; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + id primaryValue = [self valueForKey:primaryId]; + if (!primaryValue || primaryValue <= 0) { + return ; + } + NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,primaryId]; + res = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]]; + NSLog(res?@"删除成功":@"删除失败"); + }]; + return res; +} + +/** 批量删除用户对象 */ ++ (BOOL)deleteObjects:(NSArray *)array +{ + for (JKDBModel *model in array) { + if (![model isKindOfClass:[JKDBModel class]]) { + return NO; + } + } + + __block BOOL res = YES; + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + // 如果要支持事务 + [jkDB.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) { + for (JKDBModel *model in array) { + NSString *tableName = NSStringFromClass(model.class); + id primaryValue = [model valueForKey:primaryId]; + if (!primaryValue || primaryValue <= 0) { + return ; + } + + NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ WHERE %@ = ?",tableName,primaryId]; + BOOL flag = [db executeUpdate:sql withArgumentsInArray:@[primaryValue]]; + NSLog(flag?@"删除成功":@"删除失败"); + if (!flag) { + res = NO; + *rollback = YES; + return; + } + } + }]; + return res; +} + +/** 通过条件删除数据 */ ++ (BOOL)deleteObjectsByCriteria:(NSString *)criteria +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + __block BOOL res = NO; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@ %@ ",tableName,criteria]; + res = [db executeUpdate:sql]; + NSLog(res?@"删除成功":@"删除失败"); + }]; + return res; +} + +/** 通过条件删除 (多参数)--2 */ ++ (BOOL)deleteObjectsWithFormat:(NSString *)format, ... +{ + va_list ap; + va_start(ap, format); + NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap]; + va_end(ap); + + return [self deleteObjectsByCriteria:criteria]; +} + +/** 清空表 */ ++ (BOOL)clearTable +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + __block BOOL res = NO; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + NSString *sql = [NSString stringWithFormat:@"DELETE FROM %@",tableName]; + res = [db executeUpdate:sql]; + NSLog(res?@"清空成功":@"清空失败"); + }]; + return res; +} + +/** 查询全部数据 */ ++ (NSArray *)findAll +{ + NSLog(@"jkdb---%s",__func__); + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + NSMutableArray *users = [NSMutableArray array]; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@",tableName]; + FMResultSet *resultSet = [db executeQuery:sql]; + while ([resultSet next]) { + JKDBModel *model = [[self.class alloc] init]; + for (int i=0; i< model.columeNames.count; i++) { + NSString *columeName = [model.columeNames objectAtIndex:i]; + NSString *columeType = [model.columeTypes objectAtIndex:i]; + if ([columeType isEqualToString:SQLTEXT]) { + [model setValue:[resultSet stringForColumn:columeName] forKey:columeName]; + } else if ([columeType isEqualToString:SQLBLOB]) { + [model setValue:[resultSet dataForColumn:columeName] forKey:columeName]; + } else { + [model setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columeName]] forKey:columeName]; + } + } + [users addObject:model]; + FMDBRelease(model); + } + }]; + + return users; +} + ++ (instancetype)findFirstWithFormat:(NSString *)format, ... +{ + va_list ap; + va_start(ap, format); + NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap]; + va_end(ap); + + return [self findFirstByCriteria:criteria]; +} + +/** 查找某条数据 */ ++ (instancetype)findFirstByCriteria:(NSString *)criteria +{ + NSArray *results = [self.class findByCriteria:criteria]; + if (results.count < 1) { + return nil; + } + + return [results firstObject]; +} + ++ (instancetype)findByPK:(int)inPk +{ + NSString *condition = [NSString stringWithFormat:@"WHERE %@=%d",primaryId,inPk]; + return [self findFirstByCriteria:condition]; +} + ++ (NSArray *)findWithFormat:(NSString *)format, ... +{ + va_list ap; + va_start(ap, format); + NSString *criteria = [[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:ap]; + va_end(ap); + + return [self findByCriteria:criteria]; +} + +/** 通过条件查找数据 */ ++ (NSArray *)findByCriteria:(NSString *)criteria +{ + JKDBHelper *jkDB = [JKDBHelper shareInstance]; + NSMutableArray *users = [NSMutableArray array]; + [jkDB.dbQueue inDatabase:^(FMDatabase *db) { + NSString *tableName = NSStringFromClass(self.class); + NSString *sql = [NSString stringWithFormat:@"SELECT * FROM %@ %@",tableName,criteria]; + FMResultSet *resultSet = [db executeQuery:sql]; + while ([resultSet next]) { + JKDBModel *model = [[self.class alloc] init]; + for (int i=0; i< model.columeNames.count; i++) { + NSString *columeName = [model.columeNames objectAtIndex:i]; + NSString *columeType = [model.columeTypes objectAtIndex:i]; + if ([columeType isEqualToString:SQLTEXT]) { + [model setValue:[resultSet stringForColumn:columeName] forKey:columeName]; + } else if ([columeType isEqualToString:SQLBLOB]) { + [model setValue:[resultSet dataForColumn:columeName] forKey:columeName]; + } else { + [model setValue:[NSNumber numberWithLongLong:[resultSet longLongIntForColumn:columeName]] forKey:columeName]; + } + } + [users addObject:model]; + FMDBRelease(model); + } + }]; + + return users; +} + +#pragma mark - util method ++ (NSString *)getColumeAndTypeString +{ + NSMutableString* pars = [NSMutableString string]; + NSDictionary *dict = [self.class getAllProperties]; + + NSMutableArray *proNames = [dict objectForKey:@"name"]; + NSMutableArray *proTypes = [dict objectForKey:@"type"]; + + for (int i=0; i< proNames.count; i++) { + [pars appendFormat:@"%@ %@",[proNames objectAtIndex:i],[proTypes objectAtIndex:i]]; + if(i+1 != proNames.count) + { + [pars appendString:@","]; + } + } + return pars; +} + +- (NSString *)description +{ + NSString *result = @""; + NSDictionary *dict = [self.class getAllProperties]; + NSMutableArray *proNames = [dict objectForKey:@"name"]; + for (int i = 0; i < proNames.count; i++) { + NSString *proName = [proNames objectAtIndex:i]; + id proValue = [self valueForKey:proName]; + result = [result stringByAppendingFormat:@"%@:%@\n",proName,proValue]; + } + return result; +} + +#pragma mark - must be override method +/** 如果子类中有一些property不需要创建数据库字段,那么这个方法必须在子类中重写 + */ ++ (NSArray *)transients +{ + return [NSArray array]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.h" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.h" index 59f7c36..e1c30d3 100644 --- "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.h" +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.h" @@ -58,6 +58,7 @@ typedef void(^actionBlock)(NSInteger index); * * @param action tapAction block code */ +//- (void)changeTapMarqueeAction:(void(^)(NSInteger index))action; - (void)changeTapMarqueeAction:(actionBlock)action; /** diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.m" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.m" index 21af34e..ae3205c 100644 --- "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.m" +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXHeadLine.m" @@ -41,40 +41,55 @@ - (instancetype)initWithFrame:(CGRect)frame if (self) { self.h = frame.size.height; self.w = frame.size.width; - UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(kSXHeadLineMargin, 0, frame.size.width, _h)]; - UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(kSXHeadLineMargin, _h, frame.size.width, _h)]; self.bgColor = [UIColor whiteColor]; self.textColor = [UIColor blackColor]; self.scrollDuration = 1.0f; self.stayDuration = 4.0f; self.cornerRadius = 2; self.textFont = [UIFont systemFontOfSize:12]; - label1.font = label2.font = _textFont; - label1.textColor = label2.textColor = _textColor; - self.label1 = label1; - self.label2 = label2; - [self addSubview:label1]; - [self addSubview:label2]; + [self addCompoment]; self.layer.cornerRadius = self.cornerRadius; self.layer.masksToBounds = YES; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(restart) name:@"UIApplicationDidBecomeActiveNotification" object:nil]; } return self; } +- (void)addCompoment{ + UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(kSXHeadLineMargin, 0, _w, _h)]; + UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(kSXHeadLineMargin, _h, _w, _h)]; + label1.font = label2.font = _textFont; + label1.textColor = label2.textColor = _textColor; + self.label1 = label1; + self.label2 = label2; + [self addSubview:label1]; + [self addSubview:label2]; + [self addSubview:self.bgBtn]; +} + +- (void)removeCompoment{ + [self.label1 removeFromSuperview]; + [self.label2 removeFromSuperview]; + [self.bgBtn removeFromSuperview]; +} + +- (void)dealloc{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + #pragma mark - **************** animate - (void)scrollAnimate { - BA_Weak; CGRect rect1 = self.label1.frame; CGRect rect2 = self.label2.frame; rect1.origin.y -= _h; rect2.origin.y -= _h; [UIView animateWithDuration:_scrollDuration animations:^{ - weakSelf.label1.frame = rect1; - weakSelf.label2.frame = rect2; + self.label1.frame = rect1; + self.label2.frame = rect2; } completion:^(BOOL finished) { - [weakSelf checkLabelFrameChange:weakSelf.label1]; - [weakSelf checkLabelFrameChange:weakSelf.label2]; + [self checkLabelFrameChange:self.label1]; + [self checkLabelFrameChange:self.label2]; }]; } @@ -111,12 +126,14 @@ - (void)stop{ -(void)setMessageArray:(NSArray *)messageArray { _messageArray = messageArray; + if (self.messageArray.count == 1) { + self.messageArray = @[self.messageArray[0],self.messageArray[0]]; + } + if (self.messageArray.count > 2) { self.label1.text = self.messageArray[0]; self.label2.text = self.messageArray[1]; self.messageIndex = 2; - }else if (self.messageArray.count == 1){ - self.label1.text = self.messageArray[0]; }else if (self.messageArray.count == 2){ self.label1.text = self.messageArray[0]; self.label2.text = self.messageArray[1]; @@ -184,11 +201,18 @@ - (void)setScrollDuration:(NSTimeInterval)scrollDuration stayDuration:(NSTimeInt - (void)changeTapMarqueeAction:(actionBlock)action{ - [self addSubview:self.bgBtn]; self.tapAction = action; self.tapMode = SXMarqueeTapForAction; } +- (void)restart +{ + [self stop]; + [self removeCompoment]; + [self addCompoment]; + [self setMessageArray:_messageArray]; + [self start]; +} - (UIButton *)bgBtn { @@ -197,16 +221,27 @@ - (UIButton *)bgBtn CGFloat h = self.frame.size.height; _bgBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, w, h)]; [_bgBtn addTarget:self action:@selector(bgButtonClick) forControlEvents:UIControlEventTouchUpInside]; + [_bgBtn addTarget:self action:@selector(bgButtonPress) forControlEvents:UIControlEventTouchDown]; } return _bgBtn; } - (void)bgButtonClick { + if (self.messageArray.count == 0) return; if (self.tapAction) { NSLog(@"***** messageIndex : %ld", (self.messageIndex + self.messageArray.count - 2)%self.messageArray.count); self.tapAction((self.messageIndex + self.messageArray.count - 2)%self.messageArray.count); + }else{ + [self start]; + } +} + +- (void)bgButtonPress +{ + if (!self.tapAction) { + [self stop]; } } diff --git "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXMarquee.m" "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXMarquee.m" index f0de472..969d6e0 100644 --- "a/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXMarquee.m" +++ "b/BABaseProject/BAMainCode/BALib(\344\270\211\346\226\271\345\272\223)/Wonderful/SXMarquee.m" @@ -30,6 +30,7 @@ @interface SXMarquee () @property (nonatomic,assign) SXMarqueeTapMode tapMode; @property (nonatomic,assign) SXMarqueeSpeedLevel speedLevel; @property (nonatomic,strong) UIView *middleView; +@property (nonatomic,strong) UIFont *marqueeLabelFont; @end @@ -77,6 +78,10 @@ - (instancetype)initWithFrame:(CGRect)frame speed:(SXMarqueeSpeedLevel)speed Msg return self; } +- (void)dealloc{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + - (void)setFrame:(CGRect)frame { [super setFrame:frame]; @@ -89,6 +94,7 @@ - (void)setFrame:(CGRect)frame - (void)doSometingBeginning{ self.layer.masksToBounds = YES; self.backgroundColor = self.bgColor; + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(backAndRestart) name:@"UIApplicationDidBecomeActiveNotification" object:nil]; UIView *middleView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; self.middleView = middleView; [_middleView addSubview:self.marqueeLbl]; @@ -104,6 +110,7 @@ - (void)changeTapMarqueeAction:(void(^)())action{ - (void)changeMarqueeLabelFont:(UIFont *)font{ self.marqueeLbl.font = font; + self.marqueeLabelFont = font; CGSize msgSize = [_marqueeLbl.text sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName, nil]]; CGRect fr = self.marqueeLbl.frame; fr.size.width = msgSize.width; @@ -130,7 +137,9 @@ - (UILabel *)marqueeLbl{ _marqueeLbl.font = fnt; CGSize msgSize = [_marqueeLbl.text sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName, nil]]; _marqueeLbl.frame = CGRectMake(0, 0, msgSize.width, h); - + if (self.marqueeLabelFont != nil) { + _marqueeLbl.font = self.marqueeLabelFont; + } _marqueeLbl.textColor = self.txtColor; } return _marqueeLbl; @@ -172,6 +181,14 @@ - (void)start{ [self moveAction]; } +- (void)backAndRestart{ + [self.marqueeLbl.layer removeAllAnimations]; + [self.marqueeLbl removeFromSuperview]; + self.marqueeLbl = nil; + [self.middleView addSubview:self.marqueeLbl]; + [self moveAction]; +} + - (void)stop{ [self pauseLayer:self.marqueeLbl.layer]; } diff --git "a/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADLabel.m" "b/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADLabel.m" index 90fa8a5..fa85c24 100644 --- "a/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADLabel.m" +++ "b/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADLabel.m" @@ -17,7 +17,7 @@ - (instancetype)initWithFrame:(CGRect)frame self.bakit_manager .label_font([UIFont fontWithName:@"SFOuterLimitsUpright" size:20.0f]) .label_textAlignment(NSTextAlignmentCenter) - .label_textColor(BA_White_Color); + .label_textColor(BAKit_Color_White); } return self; } diff --git "a/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADScrollView.m" "b/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADScrollView.m" index ed28cf3..9a69ad9 100644 --- "a/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADScrollView.m" +++ "b/BABaseProject/BAMainCode/BANewFeatures(\346\226\260\347\211\271\346\200\247)/View/BAADScrollView.m" @@ -93,7 +93,7 @@ - (void)ba_setBanner if (i == 0) { firstLabel.text = self.titlesArray[i]; } - if (i == self.titles.count - 1) { + if (i == self.titlesArray.count - 1) { lastLabel.text = self.titlesArray[i]; } [self addSubview:advertLabel]; @@ -102,10 +102,10 @@ - (void)ba_setBanner lastLabel.frame = CGRectMake(0, Y, W, H); [self addSubview:lastLabel]; - firstLabel.frame = CGRectMake((self.titles.count + 1) * W, Y, W, H); + firstLabel.frame = CGRectMake((self.titlesArray.count + 1) * W, Y, W, H); [self addSubview:firstLabel]; - CGFloat contentW = (self.titles.count + 2) * W; + CGFloat contentW = (self.titlesArray.count + 2) * W; self.contentSize = CGSizeMake(contentW, 0); self.showsHorizontalScrollIndicator = NO; @@ -116,8 +116,7 @@ - (void)ba_setBanner [self setContentOffset:CGPointMake(W, 0)]; - [self addTimer]; - +// [self addTimer]; } diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.h" new file mode 100644 index 0000000..606c199 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.h" @@ -0,0 +1,19 @@ +// +// AppDelegate+BABaiduMap.h +// BABaseProject +// +// Created by boai on 2016/9/22. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate (BABaiduMap) + +/*! + * 配置百度地图 + */ +- (void)ba_setupBaiduMap; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.m" new file mode 100644 index 0000000..0b68c81 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BABaiduMap.m" @@ -0,0 +1,62 @@ +// +// AppDelegate+BABaiduMap.m +// BABaseProject +// +// Created by boai on 2016/9/22. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "AppDelegate+BABaiduMap.h" + +@implementation AppDelegate (BABaiduMap) + +/*! + * 配置百度地图 + */ +- (void)ba_setupBaiduMap +{ + /*! 要使用百度地图,请先启动BaiduMapManager */ + _mapManager = [[BMKMapManager alloc]init]; + + /** + *百度地图SDK所有接口均支持百度坐标(BD09)和国测局坐标(GCJ02),用此方法设置您使用的坐标类型. + *默认是BD09(BMK_COORDTYPE_BD09LL)坐标. + *如果需要使用GCJ02坐标,需要设置CoordinateType为:BMK_COORDTYPE_COMMON. + */ + if ([BMKMapManager setCoordinateTypeUsedInBaiduMapSDK:BMK_COORDTYPE_BD09LL]) { + NSLog(@"经纬度类型设置成功"); + } else { + NSLog(@"经纬度类型设置失败"); + } + + BOOL ret = [_mapManager start:BA_BaiDuMapAppKey generalDelegate:self]; + if (!ret) + { + NSLog(@"manager start failed!"); + } +} + +- (void)onGetNetworkState:(int)iError +{ + if (0 == iError) { + NSLog(@"联网成功"); + } + else{ + NSLog(@"onGetNetworkState %d",iError); + } +} + +- (void)onGetPermissionState:(int)iError +{ + if (0 == iError) + { + NSLog(@"授权成功"); + } + else + { + NSLog(@"onGetPermissionState %d",iError); + } +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.h" index e9fea1a..c259656 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.h" @@ -10,10 +10,6 @@ @interface AppDelegate (BACategory) - - - - /*! * 是否使用自定义TabVC * @@ -46,5 +42,11 @@ /*! 键盘处理 */ - (void)BA_KeyboardSetting; +/*! + * 获取当前屏幕的控制器 + * + * @return 获取当前屏幕的控制器 + */ +- (UIViewController *)getCurrentTabViewController; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.m" index 0571ff0..7875511 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BACategory.m" @@ -7,7 +7,7 @@ // #import "AppDelegate+BACategory.h" -#import +#import "AFNetworkActivityIndicatorManager.h" #import "BANavigationController.h" #import "BATabBarController.h" @@ -27,10 +27,11 @@ /*! 友盟分享 */ #import "BAShareManage.h" -#import "UMSocial.h" +#import /*! 本地通知VC */ #import "DemoVC6.h" +#import "MJExtension.h" @implementation AppDelegate (BACategory) @@ -47,17 +48,24 @@ - (void)isBATabVC:(BOOL)is if (is) { - /*! 此处使用自定义TabBarController */ + /*! 此处使用自定义TabBarController,此处暂时有问题,大家慎用!先使用第三方的tabbar */ self.window.rootViewController = [BATabBarController new]; + [self.window makeKeyAndVisible]; } else { /*! 此处使用RDVTabBarController */ - [self setupViewControllers]; - self.window.rootViewController = self.viewController; +// [self setupViewControllers]; +// self.window.rootViewController = self.viewController; + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window.backgroundColor = [UIColor whiteColor]; + [self setupViewControllers]; + [self.window setRootViewController:self.viewController]; + [self.window makeKeyAndVisible]; + + [self customizeInterface]; } - [self.window makeKeyAndVisible]; } - (void)isBATabVC2:(BOOL)is @@ -94,6 +102,7 @@ - (void)ba_setup3DTouch UIApplicationShortcutItem *itemThree = [[UIApplicationShortcutItem alloc] initWithType:@"contact" localizedTitle:@"博爱3D Touch 测试3" localizedSubtitle:nil icon:iconContact userInfo:nil]; + /*! 将items 添加到app图标 */ [UIApplication sharedApplication].shortcutItems = @[itemOne, itemTwo, itemThree]; } @@ -236,34 +245,118 @@ - (void)BA_initializeWithApplication:(UIApplication *)application - (void)BA_YMShareSetting { // ************* 友盟分享 ************* - [BASHAREMANAGER ba_shareConfig]; + [BASHAREMANAGER ba_setupShareConfig]; +} + +//#define __IPHONE_10_0 100000 +#if __IPHONE_OS_VERSION_MAX_ALLOWED > 100000 +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options +{ + BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url]; + if (!result) { + // 其他如支付等SDK的回调 + } + return result; } -/** +#endif + +/*! 这里处理新浪微博SSO授权之后跳转回来,和微信分享完成之后跳转回来 */ - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - BOOL result = [UMSocialSnsService handleOpenURL:url]; - if (result == FALSE) { + BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url]; + if (!result) { //调用其他SDK,例如支付宝SDK等 + NSLog(@"Calling Application Bundle ID: %@", sourceApplication); + NSLog(@"URL scheme:%@", [url scheme]); + NSLog(@"URL query: %@", [url query]); + NSString *jsonText = [[url query] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + + NSDictionary *dict = [jsonText mj_JSONObject]; + + BAProfileViewController *vc = [BAProfileViewController new]; + [vc openAppWithAlert:dict[@"parmeter"][@"msg"]]; + return YES; } return result; } --(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ - BOOL result = [UMSocialSnsService handleOpenURL:url]; - if (result == FALSE) { + +//- (NSDictionary *)parseQueryString:(NSString *)query +//{ +// NSMutableDictionary *paramDict = [[NSMutableDictionary alloc] initWithDictionary:0]; +// +// NSArray *paramArr = [query componentsSeparatedByString:@"&"]; +// for (NSString *param in paramArr) +// { +// NSArray * elements = [param componentsSeparatedByString:@"="]; +// if ([elements count] <= 1) +// { +// return nil; +// } +// +// NSString *key = [[elements objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +// NSString *value = [[elements objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; +// +// [paramDict setObject:value forKey:key]; +// } +// +// return paramDict; +//} +// +//- (NSDictionary*)dictionaryFromQuery:(NSString *)query usingEncoding:(NSStringEncoding)encoding { +// NSCharacterSet* delimiterSet = [NSCharacterSet characterSetWithCharactersInString:@"&;"]; +// NSMutableDictionary* pairs = [NSMutableDictionary dictionary]; +// NSScanner* scanner = [[NSScanner alloc] initWithString:query]; +// while (![scanner isAtEnd]) { +// NSString* pairString = nil; +// [scanner scanUpToCharactersFromSet:delimiterSet intoString:&pairString]; +// [scanner scanCharactersFromSet:delimiterSet intoString:NULL]; +// NSArray* kvPair = [pairString componentsSeparatedByString:@"="]; +// if (kvPair.count == 2) { +// NSString* key = [[kvPair objectAtIndex:0] +// stringByReplacingPercentEscapesUsingEncoding:encoding]; +// NSString* value = [[kvPair objectAtIndex:1] +// stringByReplacingPercentEscapesUsingEncoding:encoding]; +// [pairs setObject:value forKey:key]; +// } +// } +// +// return [NSDictionary dictionaryWithDictionary:pairs]; +//} + +- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url +{ +// NSString *urlString = [url absoluteString]; +// if ([urlString isEqualToString:@"openBoaiApp://"]) +// { +// BAProfileViewController *vc = [BAProfileViewController new]; +// [vc openAppWithAlert:@"我是博爱!"]; +// return YES; +// } + + BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url]; + if (!result) { //调用其他SDK,例如支付宝SDK等 + NSString *urlString = [url absoluteString]; + if ([urlString isEqualToString:@"openBoaiApp://"]) + { + BAProfileViewController *vc = [BAProfileViewController new]; + [vc openAppWithAlert:@"我是博爱!"]; + return YES; + } } return result; } -/** + +/*! 这里处理新浪微博SSO授权进入新浪微博客户端后进入后台,再返回原来应用 */ - (void)applicationDidBecomeActive:(UIApplication *)application { BALog(@"程序已经进入前台!"); - [UMSocialSnsService applicationDidBecomeActive]; +// [UMSocialSnsService applicationDidBecomeActive]; [application setApplicationIconBadgeNumber:0]; return; } @@ -298,7 +391,7 @@ - (void)setupViewControllers RDVTabBarController *tabBarController = [[RDVTabBarController alloc] init]; [tabBarController setViewControllers:@[firstNavigationController, secondNavigationController, thirdNavigationController, fourNavigationController]]; self.viewController = tabBarController; - + [self customizeTabBarForController:tabBarController]; } @@ -326,8 +419,7 @@ - (void)customizeTabBarForController:(RDVTabBarController *)tabBarController } } -- (void)customizeInterface -{ +- (void)customizeInterface { UINavigationBar *navigationBarAppearance = [UINavigationBar appearance]; UIImage *backgroundImage = nil; @@ -337,9 +429,20 @@ - (void)customizeInterface backgroundImage = [UIImage imageNamed:@"navigationbar_background_tall"]; textAttributes = @{ - NSFontAttributeName: [UIFont boldSystemFontOfSize:12], + NSFontAttributeName: [UIFont boldSystemFontOfSize:18], NSForegroundColorAttributeName: [UIColor blackColor], }; + } else { +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0 + backgroundImage = [UIImage imageNamed:@"navigationbar_background"]; + + textAttributes = @{ + UITextAttributeFont: [UIFont boldSystemFontOfSize:18], + UITextAttributeTextColor: [UIColor blackColor], + UITextAttributeTextShadowColor: [UIColor clearColor], + UITextAttributeTextShadowOffset: [NSValue valueWithUIOffset:UIOffsetZero], + }; +#endif } [navigationBarAppearance setBackgroundImage:backgroundImage @@ -442,9 +545,9 @@ - (void)moveToVC { dispatch_async(dispatch_get_main_queue(), ^{ - BATabBarController *tabBarController = ( BATabBarController*)self.window.rootViewController; - BANavigationController * nav = (BANavigationController *)tabBarController.selectedViewController; - UIViewController * baseVC = (UIViewController *)nav.visibleViewController; + BATabBarController *tabBarController = (BATabBarController*)self.window.rootViewController; + BANavigationController *nav = (BANavigationController *)tabBarController.selectedViewController; + UIViewController *baseVC = (UIViewController *)nav.visibleViewController; //如果是当前控制器是我的消息控制器的话,刷新数据即可 if([baseVC isKindOfClass:[DemoVC6 class]]) { @@ -463,6 +566,11 @@ - (void)moveToVC } #pragma mark - ***** +#pragma mark - 获取当前屏幕的控制器 +- (UIViewController *)getCurrentTabViewController +{ + return self.window.rootViewController; +} @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.h" new file mode 100644 index 0000000..0e1beb0 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.h" @@ -0,0 +1,18 @@ +// +// AppDelegate+BAUMengAnalytics.h +// BABaseProject +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "AppDelegate.h" + +@interface AppDelegate (BAUMengAnalytics) + +/*! + * 配置友盟统计 + */ +- (void)ba_setuUMengAnalytics; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.m" new file mode 100644 index 0000000..dfdfbe6 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/AppDelegate+BAUMengAnalytics.m" @@ -0,0 +1,30 @@ +// +// AppDelegate+BAUMengAnalytics.m +// BABaseProject +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "AppDelegate+BAUMengAnalytics.h" +#import "UMMobClick/MobClick.h" + +@implementation AppDelegate (BAUMengAnalytics) + +- (void)ba_setuUMengAnalytics +{ + UMConfigInstance.appKey = BA_UMengAnalyticskey; + UMConfigInstance.channelId = @"App Store"; + /*! 仅适用于游戏场景,应用统计不用设置 */ +// UMConfigInstance.eSType = E_UM_GAME; + + /*! 配置以上参数后调用此方法初始化SDK! */ + [MobClick startWithConfigure:UMConfigInstance]; + + /*! 以App打包时的Build号作为应用程序的版本标识,不能通过友盟SDK或友盟后台配置。 */ + NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; + [MobClick setAppVersion:version]; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAMJParse.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAMJParse.h" index 77f98c6..42d27c8 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAMJParse.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAMJParse.h" @@ -7,7 +7,7 @@ // #import -#import +#import "MJExtension.h" @interface NSObject (BAMJParse) diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.h" index f17d459..c48ded2 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.h" @@ -7,7 +7,7 @@ // #import -#import +#import "MBProgressHUD.h" @interface NSObject (BAProgressHUD) diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.m" index 2561c46..b639a47 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BACategory(\345\210\206\347\261\273)/NSObject+BAProgressHUD.m" @@ -27,10 +27,12 @@ - (UIView *)getCurrentView return vc.view; } + + /** 弹出文字提示 */ - (void)BA_showAlert:(NSString *)text { - BA_Weak; + BA_WEAKSELF; // 防止在非主线程中调用此方法,会报错 dispatch_async(dispatch_get_main_queue(), ^{ @@ -41,7 +43,7 @@ - (void)BA_showAlert:(NSString *)text progressHUD.mode = MBProgressHUDModeIndeterminate; progressHUD.labelText = text; - progressHUD.color = BA_Orange_Color; + progressHUD.color = BAKit_Color_Orange; // [progressHUD hide:YES afterDelay:1.5]; }); @@ -50,7 +52,7 @@ - (void)BA_showAlert:(NSString *)text /** 弹出文字提示,自定义显示时间 */ - (void)BA_showAlertWithTitle:(NSString *)text { - BA_Weak; + BA_WEAKSELF; // 防止在非主线程中调用此方法,会报错 dispatch_async(dispatch_get_main_queue(), ^{ @@ -61,7 +63,7 @@ - (void)BA_showAlertWithTitle:(NSString *)text progressHUD.mode = MBProgressHUDModeText; progressHUD.labelText = text; - progressHUD.color = BA_Orange_Color; +// progressHUD.color = BA_Orange_Color; // if (!time || time == 0) // { // [progressHUD hide:YES afterDelay:1.5]; @@ -74,11 +76,11 @@ - (void)BA_showAlertWithTitle:(NSString *)text /** 显示忙 */ - (void)BA_showBusy { - BA_Weak; + BA_WEAKSELF; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [MBProgressHUD hideAllHUDsForView:[self getCurrentView] animated:YES]; MBProgressHUD *progressHUD = [MBProgressHUD showHUDAddedTo:[weakSelf getCurrentView] animated:YES]; - progressHUD.color = BA_Orange_Color; + progressHUD.color = BAKit_Color_Orange; // 最长显示30秒 [progressHUD hide:YES afterDelay:30]; }]; @@ -87,7 +89,7 @@ - (void)BA_showBusy /** 隐藏提示 */ - (void)BA_hideProgress { - BA_Weak; + BA_WEAKSELF; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [MBProgressHUD hideAllHUDsForView:[weakSelf getCurrentView] animated:YES]; }]; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.h" deleted file mode 100644 index 7687fd4..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.h" +++ /dev/null @@ -1,67 +0,0 @@ -// -// BAAlertView.h -// BABaseProject -// -// Created by 博爱 on 16/6/21. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import - -@interface BAAlertView : UIView - -/** - * 初始化一个视图 - */ -- (instancetype)initWithTitle:(NSString *)title - image:(UIImage *)image - message:(NSString *)message - buttonTitles:(NSArray *)buttonTitles; - -/** - * 显示/隐藏 - */ -- (void)show:(BOOL)animated; -- (void)hide:(BOOL)animated; - -/** - * 事件回调 - */ -@property (strong, nonatomic) void (^actionHandler)(NSInteger index); -/** - * 显示隐藏后回调 - */ -@property (strong, nonatomic) void (^didShowHandler)(); -@property (strong, nonatomic) void (^didHideHandler)(); - -@property (copy, nonatomic, readonly ) NSString *title; -@property (copy, nonatomic, readonly ) NSString *message; -@property (copy, nonatomic, readonly ) UIImage *image; -@property (copy, nonatomic, readonly ) NSArray *buttonTitles; - -@property (assign, nonatomic, readonly) BOOL onShow; - -/*! 背景颜色 */ -@property (nonatomic, strong) UIColor *bgroundColor; -/*! 字体颜色 */ -@property (nonatomic, strong) UIColor *titleColor; - - -/*! 点击外部,是否隐藏,默认NO */ -@property (nonatomic, assign) BOOL hideWhenTapOutside; - -@end - -@interface BAAlertView (Show) - -+ (instancetype)showTitle:(NSString *)title - image:(UIImage *)image - message:(NSString *)message - buttonTitles:(NSArray *)buttonTitles - handler:(void(^)(NSInteger index))handler; - -+ (instancetype)showTitle:(NSString *)title message:(NSString *)message hideDelay:(CGFloat)delay; -+ (instancetype)showTitle:(NSString *)title message:(NSString *)message; - -@end - diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.m" deleted file mode 100644 index 23ddaf1..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAAlertView.m" +++ /dev/null @@ -1,373 +0,0 @@ -// -// BAAlertView.m -// BABaseProject -// -// Created by 博爱 on 16/6/21. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import "BAAlertView.h" -#import "BAModal.h" - -#define kBAAlertWidth BA_SCREEN_WIDTH - 50 -#define kBAAlertPaddingV 11 -#define kBAAlertPaddingH 18 -#define kBAAlertRadius 13 -#define kBAAlertButtonHeight 40 - -@interface BAAlertView () - -@property (strong, nonatomic) UIView *backgroundView; -@property (strong, nonatomic) UIView *containerView; -@property (strong, nonatomic) UIScrollView *scrollView; -@property (strong, nonatomic) UILabel *titleLabel; -@property (strong, nonatomic) UIImageView *imageView; -@property (strong, nonatomic) UILabel *messageLabel; -@property (strong, nonatomic) NSMutableArray *buttons; -@property (strong, nonatomic) NSMutableArray *lines; - -@end - -@implementation BAAlertView{ - BAModal *_modal; - BOOL _didLayouted; - - CGFloat _scrollBottom; - CGFloat _buttonsHeight; - CGFloat _maxContentWidth; - CGFloat _maxAlertViewHeight; -} - -- (instancetype)initWithTitle:(NSString *)title image:(UIImage *)image message:(NSString *)message buttonTitles:(NSArray *)buttonTitles -{ - if (self = [self initWithFrame:CGRectZero]){ - _title = [title copy]; - _image = image; - _message = [message copy]; - _buttonTitles = [NSArray arrayWithArray:buttonTitles]; - } - return self; -} - -- (instancetype)initWithFrame:(CGRect)frame -{ - if (self = [super initWithFrame:CGRectMake(0, 0, kBAAlertWidth, 0)]){ - [self loadData]; - [self loadUI]; - } - return self; -} - -- (void)loadData{ - _didLayouted = NO; - _hideWhenTapOutside = NO; - _buttons = [NSMutableArray new]; - _lines = [NSMutableArray new]; - - _modal = [BAModal ba_modalWithContentView:self]; - _modal.hideWhenTouchOutside = NO; - _modal.dimBackgroundWhenShow = NO; - _modal.showAnimation = [self showAnimation]; - _modal.hideAnimation = [self hideAnimation]; -} - -- (void)loadUI{ - _backgroundView = [UIView new]; - _backgroundView.backgroundColor = BA_White_Color; - - _backgroundView.layer.cornerRadius = kBAAlertRadius; - _backgroundView.layer.shadowColor = [UIColor colorWithWhite:0 alpha:0.5].CGColor; - _backgroundView.layer.shadowOffset = CGSizeZero; - _backgroundView.layer.shadowOpacity = 1; - _backgroundView.layer.shadowRadius = kBAAlertRadius; - _backgroundView.layer.borderWidth = 0.5; - _backgroundView.layer.borderColor = BA_COLOR(110, 115, 120, 1).CGColor; - - _containerView = [UIView new]; - _containerView.layer.cornerRadius = kBAAlertRadius; - _containerView.layer.masksToBounds = YES; - - _scrollView = [[UIScrollView alloc] initWithFrame:self.bounds]; - [_containerView addSubview:_scrollView]; - - [self addSubview:_backgroundView]; - [self addSubview:_containerView]; -} - -#pragma mark - ***** setter / getter -//- (void)setBgroundColor:(UIColor *)bgroundColor -//{ -// _bgroundColor = bgroundColor; -// _backgroundView.backgroundColor = bgroundColor; -//} -// -//- (void)setTitleColor:(UIColor *)titleColor -//{ -// _titleColor = titleColor; -// _titleLabel.textColor = [UIColor colorWithWhite:1 alpha:0.85]; -//} - -#pragma mark - ***** 动画 -- (ba_modal_animation)showAnimation{ - return ^CGFloat(){ - self.alpha = 0; - CGFloat d1 = 0.2, d2 = 0.15; - self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4); - [UIView animateWithDuration:d1 animations:^{ - self.alpha = 1; - self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); - } completion:^(BOOL finished) { - [UIView animateWithDuration:d2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ - self.alpha = 1; - self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1); - } completion:^(BOOL finished2) { - }]; - }]; - return (d1+d2); - }; -} - -- (ba_modal_animation)hideAnimation{ - return ^CGFloat(){ - CGFloat d1 = 0.2, d2 = 0.1; - [UIView animateWithDuration:d2 animations:^{ - self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1); - } completion:^(BOOL finished){ - [UIView animateWithDuration:d1 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ - self.alpha = 0; - self.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.4, 0.4); - } completion:^(BOOL finished2){ - }]; - }]; - return (d1+d2); - }; -} - -#pragma mark - prepare for show - -- (void)prepareForShow{ - if (_didLayouted){ - return; - } - [self resetViews]; - _scrollBottom = 0; - CGFloat insetY = kBAAlertPaddingV; - _maxContentWidth = kBAAlertWidth-2*kBAAlertPaddingH; - _maxAlertViewHeight = [UIScreen mainScreen].bounds.size.height-50; - [self loadTitle]; - [self loadImage]; - [self loadMessage]; - _buttonsHeight = kBAAlertButtonHeight*((_buttonTitles.count>2||_buttonTitles.count==0)?_buttonTitles.count:1); - self.frame = CGRectMake(0, 0, kBAAlertWidth, MIN(MAX(_scrollBottom+2*insetY+_buttonsHeight, 2*kBAAlertRadius+kBAAlertPaddingV), _maxAlertViewHeight)); - _backgroundView.frame = self.bounds; - _backgroundView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath; - _containerView.frame = self.bounds; - _scrollView.frame = CGRectMake(0, insetY, CGRectGetWidth(_containerView.frame),MIN(_scrollBottom, CGRectGetHeight(_containerView.frame)-2*insetY-_buttonsHeight)); - _scrollView.contentSize = CGSizeMake(_maxContentWidth, _scrollBottom); - _didLayouted = YES; - - [self loadButtons]; -} - -- (void)resetViews{ - if (_titleLabel){ - [_titleLabel removeFromSuperview]; - _titleLabel.text = @""; - } - if (_imageView){ - [_imageView removeFromSuperview]; - _imageView.image = nil; - } - if (_messageLabel){ - [_messageLabel removeFromSuperview]; - _messageLabel.text = @""; - } - if (_buttons.count > 0){ - [_buttons makeObjectsPerformSelector:@selector(removeFromSuperview)]; - [_buttons removeAllObjects]; - } - if (_lines.count > 0){ - [_lines makeObjectsPerformSelector:@selector(removeFromSuperview)]; - [_lines removeAllObjects]; - } -} - -- (void)addLabel:(UILabel *)label maxHeight:(CGFloat)maxHeight{ - CGSize size = [label sizeThatFits:CGSizeMake(_maxContentWidth, maxHeight)]; - label.frame = CGRectMake(kBAAlertPaddingH, _scrollBottom, _maxContentWidth, size.height); - [_scrollView addSubview:label]; - - _scrollBottom = CGRectGetMaxY(label.frame)+kBAAlertPaddingV; -} - -- (void)addLine:(CGRect)frame toView:(UIView *)view{ - UIView *line = [[UIView alloc] initWithFrame:frame]; - line.backgroundColor = BA_COLOR(160, 170, 160, 0.5); - [view addSubview:line]; - [_lines addObject:line]; -} - -- (void)loadTitle{ - if (!_title){ - return; - } - if (!_titleLabel){ - _titleLabel = [UILabel new]; - _titleLabel.textColor = BA_Black_Color; - _titleLabel.font = [UIFont systemFontOfSize:15]; - _titleLabel.textAlignment = NSTextAlignmentCenter; - _titleLabel.numberOfLines = 0; - } - _titleLabel.text = _title; - [self addLabel:_titleLabel maxHeight:100]; - [self addLine:CGRectMake(kBAAlertPaddingH, _scrollBottom, _maxContentWidth, 0.5) toView:_scrollView]; - _scrollBottom += kBAAlertPaddingV; -} - -- (void)loadImage{ - if (!_image){ - return; - } - if (!_imageView){ - _imageView = [UIImageView new]; - } - _imageView.image = _image; - CGSize size = _image.size; - if (size.width > _maxContentWidth){ - size = CGSizeMake(_maxContentWidth, size.height/size.width*_maxContentWidth); - } - _imageView.frame = CGRectMake(kBAAlertPaddingH+_maxContentWidth/2-size.width/2, _scrollBottom, size.width, size.height); - [_scrollView addSubview:_imageView]; - - _scrollBottom = CGRectGetMaxY(_imageView.frame)+kBAAlertPaddingV; -} - -- (void)loadMessage{ - if (!_message){ - return; - } - if (!_messageLabel){ - _messageLabel = [UILabel new]; - _messageLabel.textColor = BA_Black_Color; - _messageLabel.font = [UIFont systemFontOfSize:17]; - _messageLabel.textAlignment = NSTextAlignmentCenter; - _messageLabel.numberOfLines = 0; - } - _messageLabel.text = _message; - [self addLabel:_messageLabel maxHeight:100000]; -} - -- (void)loadButtons{ - if (!_buttonTitles || _buttonTitles.count==0){ - return; - } - CGFloat buttonHeight = kBAAlertButtonHeight; - CGFloat buttonWidth = kBAAlertWidth; - CGFloat top = CGRectGetHeight(_containerView.frame)-_buttonsHeight; - [self addLine:CGRectMake(0, top-0.5, buttonWidth, 0.5) toView:_containerView]; - if (1 == _buttonTitles.count){ - [self addButton:CGRectMake(0, top, buttonWidth, buttonHeight) title:[_buttonTitles firstObject] tag:0]; - } - else if (2 == _buttonTitles.count){ - [self addButton:CGRectMake(0, top, buttonWidth/2, buttonHeight) title:[_buttonTitles firstObject] tag:0]; - [self addButton:CGRectMake(0+buttonWidth/2, top, buttonWidth/2, buttonHeight) title:[_buttonTitles lastObject] tag:1]; - [self addLine:CGRectMake(0+buttonWidth/2-.5, top, 0.5, buttonHeight) toView:_containerView]; - } - else{ - - for (NSInteger i=0; i<_buttonTitles.count; i++){ - [self addButton:CGRectMake(0, top, buttonWidth, buttonHeight) title:_buttonTitles[i] tag:i]; - top += buttonHeight; - if (_buttonTitles.count-1!=i){ - [self addLine:CGRectMake(0, top, buttonWidth, 0.5) toView:_containerView]; - } - } - [_lines enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [_containerView bringSubviewToFront:obj]; - }]; - - } -} - -- (UIButton *)addButton:(CGRect)frame title:(NSString *)title tag:(NSInteger)tag{ - UIButton *button = [[UIButton alloc] initWithFrame:frame]; - [button setTitle:title forState:UIControlStateNormal]; - button.titleLabel.font = [UIFont boldSystemFontOfSize:17]; - button.tag = tag; - [button setTitleColor:BA_COLOR(220, 210, 200, 1) forState:UIControlStateNormal]; - [button setBackgroundImage:[UIImage imageWithColor:BA_COLOR(135, 140, 145, 0.65)] forState:UIControlStateNormal]; - [button setBackgroundImage:[UIImage imageWithColor:BA_COLOR(135, 140, 145, 0.45)] forState:UIControlStateHighlighted]; - [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; - [_containerView addSubview:button]; - [_buttons addObject:button]; - return button; -} - -- (void)buttonClicked:(UIButton *)button{ - [self hide:YES]; - if (self.actionHandler){ - self.actionHandler(button.tag); - } -} - -#pragma mark - show / hide - -- (void)show:(BOOL)animated{ - [self prepareForShow]; - _modal.hideWhenTouchOutside = self.hideWhenTapOutside; - _modal.didShowHandler = self.didShowHandler; - _modal.didHideHandler = self.didHideHandler; - [_modal show:animated]; -} - -- (void)hide:(BOOL)animated{ - [_modal hide:animated]; -} - -- (BOOL)onShow{ - return _modal.onShow; -} - -@end - -@implementation BAAlertView (Show) - -+ (instancetype)showTitle:(NSString *)title - image:(UIImage *)image - message:(NSString *)message - buttonTitles:(NSArray *)buttonTitles - handler:(void (^)(NSInteger))handler{ - BAAlertView *alert = [[BAAlertView alloc] initWithTitle:title - image:image - message:message - buttonTitles:buttonTitles]; - [alert setActionHandler:handler]; - [alert show:YES]; - return alert; -} - -+ (instancetype)showTitle:(NSString *)title - message:(NSString *)message{ - BAAlertView *alert = [[BAAlertView alloc] initWithTitle:title - image:nil - message:message - buttonTitles:nil]; - alert.hideWhenTapOutside = YES; - [alert show:YES]; - return alert; -} - -+ (instancetype)showTitle:(NSString *)title - message:(NSString *)message - hideDelay:(CGFloat)delay{ - if (delay>0){ - BAAlertView *alert = [self showTitle:title message:message]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [alert hide:YES]; - }); - return alert; - } - return nil; -} - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.h" deleted file mode 100755 index 472b8e8..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.h" +++ /dev/null @@ -1,158 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import -#import - -/*! 主视图显示位置 */ -typedef NS_ENUM(NSUInteger, BAModelPositionMode) { - BAModelPositionCenter, - BAModelPositionCenterTop, - BAModelPositionCenterBottom, - BAModelPositionCustom -}; - -/*! 动画所需时间 */ -typedef CGFloat (^ba_modal_animation)(); - -/*! 回调 */ -typedef void(^ba_modal_block)(); - -@interface BAModal : NSObject - -/** - * @discussion 所显示的主视图 - */ -@property (strong, nonatomic, readonly) UIView *contentView; - -/** - * @discussion contentView位置,默认STModelPositionCenter - */ -@property (assign, nonatomic) BAModelPositionMode positionMode; - -/** - * @discussion 自定义位置,只有当position为STModelPositionCustom时生效 - */ -@property (assign, nonatomic) CGPoint position; - -/** - * @discussion 点击contentView外的区域是否执行hide,默认为NO - */ -@property (assign, nonatomic) BOOL hideWhenTouchOutside; - -/** - * @discussion 当touchOutDismiss为YES时,是否发生动画,默认是YES - */ -@property (assign, nonatomic) BOOL animatedHideWhenTouchOutside; - -/** - * @discussion 背景是否加蒙版,默认为YES - */ -@property (assign, nonatomic) BOOL dimBackgroundWhenShow; - -/** - * @discussion 自定义背景蒙版颜色,默认为nil - */ -@property (strong, nonatomic) UIColor *dimBackgroundColor; - - -// 当不设置执行动画时,且animated为YES,会默认执行一个过渡动画 -/** - * @discussion 显示时的动画 - */ -@property (strong, nonatomic) ba_modal_animation showAnimation; - -/** - * @discussion 隐藏时的动画 - */ -@property (strong, nonatomic) ba_modal_animation hideAnimation; - -/** - * @discussion 显示后/隐藏后回调 - */ -@property (strong, nonatomic) ba_modal_block didShowHandler; -@property (strong, nonatomic) ba_modal_block didHideHandler; - -/** - * @discussion 显示 - */ -- (void)show:(BOOL)animated; - -/** - * @discussion 显示指定的contentView,若之前已设置,则替换掉。 - */ -- (void)showContentView:(UIView *)contentView animated:(BOOL)animated; - -/** - * @discussion 是否已经显示 - */ -@property (assign, readonly, nonatomic) BOOL onShow; - -/** - * @discussion 隐藏 - */ -- (void)hide:(BOOL)animated; - - -+ (instancetype)ba_modal; - -+ (instancetype)ba_modalWithContentView:(UIView *)contentView; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.m" deleted file mode 100755 index 245e360..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAlert/BAModal.m" +++ /dev/null @@ -1,449 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import "BAModal.h" - -@interface BAModalWindow : NSObject - -+ (instancetype)ba_sharedModalWindow; - -- (void)ba_showModal:(BAModal *)modal animated:(BOOL)animated duration:(CGFloat)duration completion:(void(^)())comletion; - -- (void)ba_hideModal:(BAModal *)modal animated:(BOOL)animated duration:(CGFloat)duration completion:(void(^)())comletion; - -@end - - -static BAModal *_ba_modal = nil; -@interface BAModal () - -@property (strong, nonatomic) UIView *containerView; - -@property (strong, nonatomic) UIView *backgroundTapView; - -@property (strong, nonatomic) UITapGestureRecognizer *tap; - -@property (assign, nonatomic) BOOL onShowing; - -@property (assign, nonatomic) BOOL onTop; - -@end - -@implementation BAModal - -+ (instancetype)ba_modal -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - - _ba_modal = [[self alloc] init]; - - }); - return _ba_modal; -} - -+ (instancetype)ba_modalWithContentView:(UIView *)contentView{ - BAModal *modal = [self ba_modal]; - [modal addModalContentView:contentView]; - return modal;; -} - -- (instancetype)init{ - if (self = [super init]){ - _positionMode = BAModelPositionCenter; - _position = CGPointMake(CGRectGetWidth([UIScreen mainScreen].bounds)/2.0, CGRectGetHeight([UIScreen mainScreen].bounds)/2.0); - _onShowing = NO; - _onTop = NO; - _hideWhenTouchOutside = NO; - _animatedHideWhenTouchOutside = YES; - _dimBackgroundWhenShow = YES; - } - return self; -} - -- (void)addModalContentView:(UIView *)contentView{ - _contentView = contentView; -} - -#pragma mark - setter / getter - -- (void)setPositionMode:(BAModelPositionMode)positionMode{ - if (_positionMode != positionMode){ - _positionMode = positionMode; - [self updateContentViewPosition]; - } -} - -- (UIView *)containerView{ - if (!_containerView){ - CGSize size = [UIScreen mainScreen].bounds.size; - _containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)]; - _containerView.backgroundColor = [UIColor clearColor]; - - _backgroundTapView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)]; - _backgroundTapView.backgroundColor = [UIColor clearColor]; - [_containerView addSubview:_backgroundTapView]; - - _tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)]; - _tap.enabled = _hideWhenTouchOutside; - [_backgroundTapView addGestureRecognizer:_tap]; - } - return _containerView; -} - -- (ba_modal_animation)showAnimation{ - if (!_showAnimation){ - return ^CGFloat(){ - CGFloat d = 0.3; - _containerView.alpha = 0; - [UIView animateWithDuration:d - animations:^{ - _containerView.alpha = 1; - }]; - return d; - }; - } - return _showAnimation; -} - -- (ba_modal_animation)hideAnimation{ - if (!_hideAnimation){ - return ^CGFloat(){ - CGFloat d = 0.3; - [UIView animateWithDuration:d - animations:^{ - _containerView.alpha = 0; - }]; - return d; - }; - } - return _hideAnimation; -} - -- (BOOL)onShow{ - return _onShowing; -} - -- (BAModalWindow *)window{ - return [BAModalWindow ba_sharedModalWindow]; -} - -#pragma mark - action - -- (void)setHideWhenTouchOutside:(BOOL)hideWhenTouchOutside{ - _hideWhenTouchOutside = hideWhenTouchOutside; - _tap.enabled = _hideWhenTouchOutside; -} - -- (void)tapped{ - if (_hideWhenTouchOutside && !CGRectContainsPoint(_contentView.frame, [_tap locationInView:_containerView])){ - [self hide:_animatedHideWhenTouchOutside]; - } -} - -#pragma mark - for show / hide - -- (void)updateContentViewPosition{ - switch (_positionMode) { - case BAModelPositionCenter:{ - _contentView.center = CGPointMake(CGRectGetMidX(_containerView.bounds), CGRectGetMidY(_containerView.bounds)); - break; - } - case BAModelPositionCenterTop:{ - _contentView.center = CGPointMake(CGRectGetMidX(_containerView.bounds), CGRectGetHeight(_contentView.bounds)/2.0); - break; - } - case BAModelPositionCenterBottom:{ - _contentView.center = CGPointMake(CGRectGetMidX(_containerView.bounds), CGRectGetHeight(_containerView.bounds)-CGRectGetHeight(_contentView.bounds)/2.0); - break; - } - case BAModelPositionCustom:{ - _contentView.center = self.position; - } - default: - break; - } -} - -- (void)prepareUIForShow{ - [self.containerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; - [_containerView addSubview:_backgroundTapView]; - [self.containerView addSubview:_contentView]; - [self updateContentViewPosition]; -} - -- (void)showContentView:(UIView *)contentView animated:(BOOL)animated{ - NSAssert(contentView!=nil, @"没有可显示的视图"); - [self addModalContentView:contentView]; - [self show:animated]; -} - -- (void)show:(BOOL)animated{ - NSAssert(_contentView!=nil, @"没有可显示的视图"); - [self prepareUIForShow]; - [self.window ba_showModal:self animated:animated duration:animated?self.showAnimation():0 completion:self.didShowHandler]; -} - -- (void)hide:(BOOL)animated{ - [self.window ba_hideModal:self animated:animated duration:animated?self.hideAnimation():0 completion:self.didHideHandler]; -} - -@end - -#define BAModalWindowDefaultBackgroundColor [UIColor colorWithWhite:0 alpha:0.55] - -@interface BAModalWindow () - -@property (strong, nonatomic) NSMutableArray *modalsStack; - -@property (strong, nonatomic) UIWindow *window; - -@property (strong, nonatomic) UIView *dimBackgroundView; - -@property (assign, nonatomic) BOOL shouldDimBackground; - -@end - -@implementation BAModalWindow{ - BOOL _onShowing; -} - -+ (instancetype)ba_sharedModalWindow -{ - static dispatch_once_t onceToken; - static BAModalWindow *_sharedModalWindow = nil; - dispatch_once(&onceToken, ^{ - _sharedModalWindow = [[self alloc] init]; - }); - return _sharedModalWindow; -} - -- (instancetype)init -{ - if (self = [super init]) - { - _modalsStack = [[NSMutableArray alloc] init]; - _window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - _window.windowLevel = UIWindowLevelAlert; - _window.backgroundColor = [UIColor clearColor]; - _window.opaque = NO; - _dimBackgroundView = [[UIView alloc] initWithFrame:_window.bounds]; - [_window addSubview:_dimBackgroundView]; - } - return self; -} - -#pragma mark - public modal operation - -- (void)ba_showModal:(BAModal *)modal animated:(BOOL)animated duration:(CGFloat)duration completion:(void(^)())comletion{ - BAModal *topModal = [self topModal]; - [self pushModal:modal]; - [self reloadData]; - _window.hidden = NO; - [self transitionFromModal:topModal - toModal:modal - animated:animated - duration:duration - completion:comletion]; -} - -- (void)ba_hideModal:(BAModal *)modal animated:(BOOL)animated duration:(CGFloat)duration completion:(void(^)())comletion{ - if ([self hasModal:modal]){ - if ([[self topModal] isEqual:modal]){ - BAModal *toModal = (_modalsStack.count>1)?_modalsStack[_modalsStack.count-2]:nil; - [self transitionFromModal:modal - toModal:toModal - animated:animated - duration:duration - completion:^{ - [self popModal:modal]; - [modal.containerView removeFromSuperview]; - - BOOL isNoModal = nil == [self topModal]; - if (isNoModal){ - _window.hidden = YES; - } - else{ - [self reloadData]; - } - if (comletion){ - comletion(); - } - }]; - } - else{ - [self popModal:modal]; - [modal.containerView removeFromSuperview]; - } - } -} - -#pragma mark - show or hide - -- (void)transitionFromModal:(BAModal *)fromModal - toModal:(BAModal *)toModal - animated:(BOOL)animated - duration:(CGFloat)duration - completion:(void(^)())completion{ - - CGFloat fromA = 0, toA = 0; - UIColor *fromColor = nil, *toColor = nil; - - BOOL(^colosIsEqual)(UIColor *, UIColor *) = ^BOOL(UIColor *color1, UIColor *color2){ - if (color1 && color2){ - CGFloat r1, r2, g1, g2, b1, b2, a1, a2; - [color1 getRed:&r1 green:&g1 blue:&b1 alpha:&a1]; - [color2 getRed:&r2 green:&g2 blue:&b2 alpha:&a2]; - return (r1==r2)&&(g1==g2)&&(b1==b2)&&(a1==a2); - } - else if (!color1 && !color2){ - return YES; - } - return NO; - }; - - if (nil != fromModal){ - fromA = fromModal.dimBackgroundWhenShow?1:0; - fromColor = fromModal.dimBackgroundColor?:BAModalWindowDefaultBackgroundColor; - } - - if (nil != toModal){ - toA = toModal.dimBackgroundWhenShow?1:0; - toColor = toModal.dimBackgroundColor?:BAModalWindowDefaultBackgroundColor; - } - - _dimBackgroundView.alpha = fromA; - _dimBackgroundView.backgroundColor = fromColor; - if (fromA == toA && colosIsEqual(fromColor, toColor)){ - // 如果没有任何变化UIView动画会立即结束,采用以下方法进行回调 - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - if (completion){ - completion(); - } - }); - } - else{ - [UIView animateWithDuration:animated?duration:0 - animations:^{ - _dimBackgroundView.alpha = toA; - _dimBackgroundView.backgroundColor = toColor; - } - completion:^(BOOL finished) { - if (completion){ - completion(); - } - }]; - } -} - -- (void)reloadData{ - BAModal *topModal = [self topModal]; - if (topModal){ - self.shouldDimBackground = topModal.dimBackgroundWhenShow; - _dimBackgroundView.backgroundColor = topModal.dimBackgroundColor?:BAModalWindowDefaultBackgroundColor; - - [topModal.containerView removeFromSuperview]; - [_window addSubview:topModal.containerView]; - - [[_modalsStack valueForKey:@"containerView"] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - [(UIView *)obj setHidden:(obj!=topModal.containerView)]; - }]; - } -} - -- (void)setShouldDimBackground:(BOOL)shouldDimBackground{ - _shouldDimBackground = shouldDimBackground; - _dimBackgroundView.alpha = _shouldDimBackground?1:0; -} - -#pragma mark - stack operation - -- (void)pushModal:(BAModal *)modal{ - if ([self hasModal:modal]){ - [self popModal:modal]; - } - [_modalsStack addObject:modal]; -} - -- (BAModal *)popModal:(BAModal *)modal{ - if ([self hasModal:modal]){ - [_modalsStack removeObject:modal]; - } - return [self topModal]; -} - -- (BAModal *)topModal{ - if (_modalsStack.count > 0){ - return [_modalsStack lastObject]; - } - return nil; -} - -- (BOOL)hasModal:(BAModal *)modal{ - return (nil!=modal)&&([_modalsStack indexOfObject:modal] != NSNotFound); -} - - - - - - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH/BAAutoSizeWithWH.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH/BAAutoSizeWithWH.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH/BAAutoSizeWithWH.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAutoSizeWithWH/BAAutoSizeWithWH.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.h" new file mode 100644 index 0000000..153209b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.h" @@ -0,0 +1,104 @@ +// +// BACommon.h +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import + +#import +#import +#import +#import + + +@interface BACommon : NSObject + +/*! + * 将图片保存到应用程序沙盒中去,imageNameString的格式为 @"upLoad.png" + * + * @param image image description + * @param imageNameString imageNameString description + */ ++ (void)ba_saveImagetoLocal:(UIImage*)image imageName:(NSString *)imageNameString; + +/*! + * 与服务端连接已断开,请检查您的网络连接是否正常. + */ ++ (void)ba_showNoReachabileTips; + +/*! + * 添加系统的加载菊花 Only ActivityView + * + * @param viewToLoadData viewToLoadData description + * @param aStyle aStyle description + * @param color color description + */ ++ (void)ba_addLoadingViewInView:(UIView *)viewToLoadData + activityIndicatorViewStyle:(UIActivityIndicatorViewStyle)aStyle + usingColor:(UIColor *)color; + +/*! + * 移除已添加的系统菊花 + * + * @param viewToLoadData viewToLoadData description + */ ++ (void)ba_removeLoadingViewInView:(UIView *)viewToLoadData; + +/*! + * 从 Bundle 读取 plist 文件 + * + * @param fileName 文件名(如:city.plist) + * @param typeName 类型(前面写了后面可不写) + * + * @return return value description + */ ++ (NSDictionary *)ba_dictFromBundleWithName:(NSString*)fileName withType:(NSString*)typeName; + +/*! + * 判断是否打开定位 + * + * @return YES / NO + */ ++ (BOOL)ba_isLocationOpen; + +/*! + * 判断字典是否为空 + * + * @param obj 传进来的字典 + * + * @return YES:为空,NO:不为空 + */ ++ (BOOL)ba_isNSDictionaryNULL:(id)obj; + +/*! + * 判断字符串判断是否为空 + * + * @param stirng 传进来的字符 + * + * @return YES:为空,NO:不为空 + */ ++ (BOOL)ba_isNSStringNULL:(NSString *)stirng; + +/*! + * 判断字符串为空和只为空格 + * + * @param string 传进来的字符 + * + * @return YES:为空,NO:不为空 + */ ++ (BOOL)ba_isBlankString:(NSString *)string; + +/*! + * 拨打电话 + * + * @param phoneNumber 电话号码 + */ ++ (void)ba_telWithPhoneNumber:(NSString *)phoneNumber; + + + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.m" new file mode 100644 index 0000000..ac53895 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BACommon/BACommon.m" @@ -0,0 +1,273 @@ +// +// BACommon.m +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BACommon.h" +#import "AppDelegate.h" + +@implementation BACommon + +/*! + * 将图片保存到应用程序沙盒中去,imageNameString的格式为 @"upLoad.png" + * + * @param image image description + * @param imageNameString imageNameString description + */ ++ (void)ba_saveImagetoLocal:(UIImage*)image imageName:(NSString *)imageNameString +{ + if (image == nil || imageNameString.length == 0) { + return; + } + NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); + NSString *documentsDirectory=[paths objectAtIndex:0]; + NSString *saveImagePath=[documentsDirectory stringByAppendingPathComponent:imageNameString]; + NSData *imageDataJPG=UIImageJPEGRepresentation(image, 0);//将图片大小进行压缩 + // NSData *imageData=UIImagePNGRepresentation(image); + [imageDataJPG writeToFile:saveImagePath atomically:YES]; +} + +/*! + * 与服务端连接已断开,请检查您的网络连接是否正常. + */ ++ (void)ba_showNoReachabileTips +{ + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil + message:@"与服务端连接已断开,请检查您的网络连接是否正常." + delegate:self + cancelButtonTitle:nil + otherButtonTitles:@"确定", nil]; + [alertView show]; +} + +#pragma mark - 系统的加载菊花 Only ActivityView +/*! + * 添加系统的加载菊花 Only ActivityView + * + * @param viewToLoadData viewToLoadData description + * @param aStyle aStyle description + * @param color color description + */ ++ (void)ba_addLoadingViewInView:(UIView *)viewToLoadData + activityIndicatorViewStyle:(UIActivityIndicatorViewStyle)aStyle + usingColor:(UIColor *)color +{ + UIActivityIndicatorView *breakingLoadingView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:aStyle]; + breakingLoadingView.tag = 99; + breakingLoadingView.center = CGPointMake((viewToLoadData.frame.size.width-40)/2+20, (viewToLoadData.frame.size.height-40)/2+20); + breakingLoadingView.color = color; + [breakingLoadingView startAnimating]; + [viewToLoadData addSubview:breakingLoadingView]; +} + +/*! + * 移除已添加的系统菊花 + * + * @param viewToLoadData viewToLoadData description + */ ++ (void)ba_removeLoadingViewInView:(UIView *)viewToLoadData +{ + UIActivityIndicatorView *breakingLoadingView = (UIActivityIndicatorView* )[viewToLoadData viewWithTag:99]; + [breakingLoadingView stopAnimating]; + [breakingLoadingView removeFromSuperview]; +} + +/*! + * 从 Bundle 读取 plist 文件 + * + * @param fileName 文件名(如:city.plist) + * @param typeName 类型(前面写了后面可不写) + * + * @return return value description + */ ++ (NSDictionary *)ba_dictFromBundleWithName:(NSString*)fileName withType:(NSString*)typeName +{ + NSDictionary *dict = nil; + NSString *infoPlist = [[NSBundle mainBundle] pathForResource:fileName ofType:typeName]; + + if ([[NSFileManager defaultManager] isReadableFileAtPath:infoPlist]) { + NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:infoPlist]; + return dict; + } + return dict; +} + +/*! 判断是否打开定位 */ ++ (BOOL)ba_isLocationOpen +{ + CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; + if (kCLAuthorizationStatusDenied == status || kCLAuthorizationStatusRestricted == status) + { + return NO; + } + else + { + return YES; + } +} + +#pragma mark - ***** 判断字典是否为空 ++ (BOOL)ba_isNSDictionaryNULL:(id)obj +{ + if(obj == nil) return YES; + + if(![obj isKindOfClass:[NSDictionary class]]) + return YES; + + //if([obj count] <= 0) return YES; + return NO; +} + +#pragma mark - ***** 判断字符串是否为空 ++ (BOOL)ba_isNSStringNULL:(NSString *)stirng +{ + if([stirng isKindOfClass:[NSNull class]]) return YES; + if(![stirng isKindOfClass:[NSString class]]) return YES; + + if(stirng == nil) return YES; + + NSString * string1 = [stirng stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + NSUInteger len=[string1 length]; + if (len <= 0) return YES; + return NO; +} + +#pragma mark - ***** 判断字符串为空和只为空格 ++ (BOOL)ba_isBlankString:(NSString *)string +{ + if (string == nil) + { + return YES; + } + + if (string == NULL) + { + return YES; + } + + if ([string isKindOfClass:[NSNull class]]) + { + return YES; + } + + if (string.length==0) + { + return YES; + } + + if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]==0) + { + return YES; + } + + return NO; +} + +/*! + * 拨打电话 + * + * @param phoneNumber 电话号码 + */ ++ (void)ba_telWithPhoneNumber:(NSString *)phoneNumber +{ +// [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[@"tel:" stringByAppendingString: phoneNumber]]]; + //打电话 + UIWebView *webView=[[UIWebView alloc] init]; + [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",phoneNumber]]]]; + AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; + [app.window.rootViewController.view addSubview:webView]; + + /*! + + 拨打电话 的几种常用方法 + + 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 + NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",@"186xxxx6979"]; + // NSLog(@"str======%@",str); + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]]; + + 2,这种方法,打完电话后还会回到原来的程序,也会弹出提示,推荐这种 + NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@",@"186xxxx6979"]; + UIWebView * callWebview = [[UIWebView alloc] init]; + [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]]; + [self.view addSubview:callWebview]; + [callWebview release]; + [str release]; + + 3,这种方法也会回去到原来的程序里(注意这里的telprompt),也会弹出提示 + NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"telprompt://%@",@"186xxxx6979"]; + // NSLog(@"str======%@",str); + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]] + + */ +} + + + + + + + + + +//+ (void)showTipsWithHUD:(NSString *)labelText showTime:(CGFloat)time +//{ +// MBProgressHUD *hud = [[MBProgressHUD alloc] initWithWindow:[[[UIApplication sharedApplication] delegate] window]] ; +// hud.mode = MBProgressHUDModeText; +// hud.labelText = labelText; +// hud.labelFont = [UIFont systemFontOfSize:15.0]; +// hud.removeFromSuperViewOnHide = YES; +// [hud show:YES]; +// [[[[UIApplication sharedApplication] delegate] window] addSubview:hud]; +// +// [hud hide:YES afterDelay:time]; +//} + +//+ (void)showTipsWithView:(UIView *)uiview labelText:(NSString *)labelText showTime:(CGFloat)time +//{ +// MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:uiview] ; +// hud.mode = MBProgressHUDModeText; +// hud.detailsLabelText = labelText; +// hud.detailsLabelFont = [UIFont systemFontOfSize:15.0]; +// hud.removeFromSuperViewOnHide = YES; +// [hud show:YES]; +// [uiview addSubview:hud]; +// +// [hud hide:YES afterDelay:time]; +//} +//+ (void)showProgessInView:(UIView *)view withExtBlock:(void (^)())exBlock withComBlock:(void (^)())comBlock +//{ +// MBProgressHUD *hud = [[MBProgressHUD alloc]initWithView:view]; +// hud.color = [UIColor colorWithWhite:0.8 alpha:0.6]; +// // hud.dimBackground = NO; +// [view addSubview:hud]; +// hud.labelText = @"正在加载..."; +// if (exBlock) { +// [hud showAnimated:YES whileExecutingBlock:exBlock completionBlock:^{ +// if (comBlock) { +// comBlock(); +// } +// [hud removeFromSuperview]; +// }]; +// +// }else +// [hud showAnimated:YES whileExecutingBlock:exBlock completionBlock:^{ +// [hud removeFromSuperview]; +// }]; +//} +// +//+ (void) showHudMessage:(NSString*) msg hideAfterDelay:(NSInteger) sec uiview:(UIView *)uiview +//{ +// MBProgressHUD* hud2 = [MBProgressHUD showHUDAddedTo:uiview animated:YES]; +// hud2.mode = MBProgressHUDModeText; +// hud2.labelText = msg; +// hud2.margin = 12.0f; +// hud2.yOffset = 20.0f; +// hud2.removeFromSuperViewOnHide = YES; +// [hud2 hide:YES afterDelay:sec]; +//} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BADemoUserStatisticsConfig.plist" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BADemoUserStatisticsConfig.plist" new file mode 100644 index 0000000..1e34a7d --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BADemoUserStatisticsConfig.plist" @@ -0,0 +1,51 @@ + + + + + BAMessageViewController + + ControlEventIDs + + onShareBtnPressed: + CTRL_EVENT_DETAILVC_SHARE + + PageEventIDs + + Leave + PAGE_EVENT_BAMessageViewController_LEAVE + Enter + PAGE_EVENT_BAMessageViewController_ENTER + + + BAHomeViewController + + ControlEventIDs + + onShareBtnPressed: + CTRL_EVENT_HOMEVC_SHARE + + PageEventIDs + + Leave + PAGE_EVENT_BAHomeViewController_LEAVE + Enter + PAGE_EVENT_BAHomeViewController_ENTER + + + DemoVC2_05_test2 + + ControlEventIDs + + onShareBtnPressed: + CTRL_EVENT_DemoVC2_05_test2_SHARE + + PageEventIDs + + Leave + PAGE_EVENT_DemoVC2_05_test2_LEAVE + Enter + PAGE_EVENT_DemoVC2_05_test2_ENTER + + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAEventIDConstant.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAEventIDConstant.h" new file mode 100644 index 0000000..179f8f6 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAEventIDConstant.h" @@ -0,0 +1,23 @@ +// +// BAEventIDConstant.h +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#ifndef BAEventIDConstant_h +#define BAEventIDConstant_h + +#define EVENT_HOME_ENTER_PAGE @"EVENT_HOME_ENTER_PAGE" +#define EVENT_HOME_LEAVE_PAGE @"EVENT_HOME_LEAVE_PAGE" +#define EVENT_HOME_FAV @"EVENT_HOME_FAV" +#define EVENT_HOME_SHARE @"EVENT_HOME_SHARE" + +#define EVENT_DETAIL_ENTER_PAGE @"EVENT_DETAIL_ENTER_PAGE" +#define EVENT_DETAIL_LEAVE_PAGE @"EVENT_DETAIL_LEAVE_PAGE" +#define EVENT_DETAIL_SHARE @"EVENT_DETAIL_SHARE" + + + +#endif /* BAEventIDConstant_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.h" new file mode 100644 index 0000000..e6827cc --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.h" @@ -0,0 +1,25 @@ +// +// BAUserStatistics.h +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface BAUserStatistics : NSObject + +/** + * 初始化配置,一般在launchWithOption中调用 + */ ++ (void)configure; + ++ (void)enterPageViewWithPageID:(NSString *)pageID; + ++ (void)leavePageViewWithPageID:(NSString *)pageID; + ++ (void)sendEventToServer:(NSString *)eventId; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.m" new file mode 100644 index 0000000..bbd903a --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/BAUserStatistics.m" @@ -0,0 +1,42 @@ +// +// BAUserStatistics.m +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "BAUserStatistics.h" + +@implementation BAUserStatistics + +/** + * 初始化配置,一般在launchWithOption中调用 + */ ++ (void)configure +{ + +} + +#pragma mark - ***** 页面统计部分 +/*! 进入页面 */ ++ (void)enterPageViewWithPageID:(NSString *)pageID +{ + NSLog(@"***模拟发送[进入页面]事件给服务端,页面ID:%@", pageID); +} + +/*! 离开页面 */ ++ (void)leavePageViewWithPageID:(NSString *)pageID +{ + NSLog(@"***模拟发送[离开页面]事件给服务端,页面ID:%@", pageID); +} + +#pragma mark - ***** 自定义事件统计部分 +/*! 在这里发送event统计信息给服务端 */ ++ (void)sendEventToServer:(NSString *)eventId +{ + NSLog(@"***模拟发送统计事件给服务端,事件ID: %@", eventId); +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.h" new file mode 100644 index 0000000..73532c2 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.h" @@ -0,0 +1,22 @@ +// +// NSObject+BAHook.h +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface NSObject (BAHook) + +/*! + * 替换两个方法 + * + * @param originalSelector 原始方法 + * @param swizzledSelector 替换的方法 + */ ++ (void)ba_swizzlingOriginalSelector:(SEL)originalSelector + swizzledSelector:(SEL)swizzledSelector; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.m" new file mode 100644 index 0000000..8ebd3dc --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/NSObject+BAHook.m" @@ -0,0 +1,47 @@ +// +// NSObject+BAHook.m +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "NSObject+BAHook.h" +#import + +@implementation NSObject (BAHook) + +/*! + * 替换两个方法 + * + * @param originalSelector 原始方法 + * @param swizzledSelector 替换的方法 + */ ++ (void)ba_swizzlingOriginalSelector:(SEL)originalSelector + swizzledSelector:(SEL)swizzledSelector +{ + Class class = [self class]; + + Method originalMethod = class_getInstanceMethod(class, originalSelector); + Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); + + BOOL didAddMethod = + class_addMethod(class, + originalSelector, + method_getImplementation(swizzledMethod), + method_getTypeEncoding(swizzledMethod)); + + if (didAddMethod) + { + class_replaceMethod(class, + swizzledSelector, + method_getImplementation(originalMethod), + method_getTypeEncoding(originalMethod)); + } + else + { + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.h" new file mode 100644 index 0000000..3932a5d --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.h" @@ -0,0 +1,16 @@ +//// +//// UIButton+BAHook.h +//// BABaseProject +//// +//// Created by 博爱 on 2016/11/3. +//// Copyright © 2016年 博爱之家. All rights reserved. +//// +// +//#import +// +//@interface UIButton (BAHook) +// +//@property (nonatomic, assign) NSInteger buttonClickedCount; +//@property (nonatomic, copy) void (^ButtonCurrentActionBlock)() ; +// +//@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.m" new file mode 100644 index 0000000..a4d9468 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIButton+BAHook.m" @@ -0,0 +1,89 @@ +//// +//// UIButton+BAHook.m +//// BABaseProject +//// +//// Created by 博爱 on 2016/11/3. +//// Copyright © 2016年 博爱之家. All rights reserved. +//// +// +//#import "UIButton+BAHook.h" +//#import "NSObject+BAHook.h" +//#import "BAUserStatistics.h" +// +//static const void *buttonClickedCountKey = &buttonClickedCountKey; +//static const void *ButtonCurrentActionBlockKey = &ButtonCurrentActionBlockKey; +// +//@implementation UIButton (BAHook) +// +//+ (void)load +//{ +// static dispatch_once_t onceToken; +// dispatch_once(&onceToken, ^{ +// +// SEL originalSelector = @selector(addTarget:action:forControlEvents:); +// SEL swizzledSelector = @selector(swiz_addTarget:action:forControlEvents:); +// [[self class] ba_swizzlingOriginalSelector:originalSelector +// swizzledSelector:swizzledSelector]; +// +// }); +//} +// +//- (void)swiz_addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents +//{ +// __weak typeof(target) weakTarget = target; +// +// __weak typeof(self) weakSelf = self; +// +// /*! 利用 关联对象 给UIButton 增加了一个 block */ +// if (action) { +// +// [self setButtonCurrentActionBlock:^{ +// @try { +// ((void (*)(void *, SEL, typeof(weakSelf) ))objc_msgSend)((__bridge void *)(weakTarget), action , weakSelf); +// } @catch (NSException *exception) { +// } @finally { +// } +// +// }]; +// } +// +// /*! 发送消息 其实是本身 要执行的action 先执行,写下来的 xw_clicked:方法 */ +// [self swiz_addTarget:self action:@selector(ba_clicked:) forControlEvents:controlEvents]; +//} +// +//- (void)ba_clicked:(UIButton *)sender +//{ +// self.buttonClickedCount ++; +// +// NSLog(@"%@ 点击 %ld次 ",[sender titleForState:UIControlStateNormal], self.buttonClickedCount); +// +// [BAUserStatistics sendEventToServer:@(self.buttonClickedCount).stringValue]; +// +// /*! 执行原来要执行的方法 */ +// sender.ButtonCurrentActionBlock(); +//} +// +//#pragma mark - ***** 统计按钮点击次数 +//- (void)setButtonClickedCount:(NSInteger)buttonClickedCount +//{ +// objc_setAssociatedObject(self, buttonClickedCountKey, @(buttonClickedCount), OBJC_ASSOCIATION_ASSIGN); +//} +// +//- (NSInteger)buttonClickedCount +//{ +// return [objc_getAssociatedObject(self, buttonClickedCountKey) integerValue]; +//} +// +//- (void)setButtonCurrentActionBlock:(void (^)())ButtonCurrentActionBlock +//{ +// objc_setAssociatedObject(self, ButtonCurrentActionBlockKey, ButtonCurrentActionBlock, OBJC_ASSOCIATION_COPY); +//} +// +//- (void (^)())ButtonCurrentActionBlock +//{ +// return objc_getAssociatedObject(self, ButtonCurrentActionBlockKey); +//} +// +// +// +//@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.h" new file mode 100644 index 0000000..ddb7a7b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.h" @@ -0,0 +1,13 @@ +// +// UIControl+BAUserStastistics.h +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface UIControl (BAUserStastistics) + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.m" new file mode 100644 index 0000000..c77da81 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIControl+BAUserStastistics.m" @@ -0,0 +1,61 @@ +// +// UIControl+BAUserStastistics.m +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "UIControl+BAUserStastistics.h" +#import "NSObject+BAHook.h" +#import "BAEventIDConstant.h" +#import "BAUserStatistics.h" + +@implementation UIControl (BAUserStastistics) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + SEL originalSelector = @selector(sendAction:to:forEvent:); + SEL swizzledSelector = @selector(swiz_sendAction:to:forEvent:); + [[self class] ba_swizzlingOriginalSelector:originalSelector + swizzledSelector:swizzledSelector]; + }); +} + + +#pragma mark - Method Swizzling + +- (void)swiz_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event; +{ + //插入埋点代码 + [self performUserStastisticsAction:action to:target forEvent:event]; + [self swiz_sendAction:action to:target forEvent:event]; +} + +- (void)performUserStastisticsAction:(SEL)action to:(id)target forEvent:(UIEvent *)event; +{ + //NSLog(@"\n***hook success.\n[1]action:%@\n[2]target:%@ \n[3]event:%@", NSStringFromSelector(action), target, event); + NSString *eventID = nil; + //只统计触摸结束时 + if ([[[event allTouches] anyObject] phase] == UITouchPhaseEnded) + { + NSString *actionString = NSStringFromSelector(action); + NSString *targetName = NSStringFromClass([target class]); + NSDictionary *configDict = [self dictionaryFromUserStatisticsConfigPlist]; + eventID = configDict[targetName][@"ControlEventIDs"][actionString]; + } + if (eventID != nil) + { + [BAUserStatistics sendEventToServer:eventID]; + } +} + +- (NSDictionary *)dictionaryFromUserStatisticsConfigPlist +{ + NSString *filePath = [[NSBundle mainBundle] pathForResource:@"BADemoUserStatisticsConfig" ofType:@"plist"]; + NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath]; + return dic; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.h" new file mode 100644 index 0000000..525b2ea --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.h" @@ -0,0 +1,13 @@ +// +// UIViewController+BAHook.h +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +@interface UIViewController (BAHook) + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.m" new file mode 100644 index 0000000..47e02be --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAHook/UIViewController+BAHook.m" @@ -0,0 +1,99 @@ +// +// UIViewController+BAHook.m +// testDemo +// +// Created by 博爱 on 2016/11/2. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "UIViewController+BAHook.h" +#import "NSObject+BAHook.h" + +#import "BAUserStatistics.h" + +@implementation UIViewController (BAHook) + ++ (void)load +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + + SEL originalViewWillAppearSelector = @selector(viewWillAppear:); + SEL swizzledViewWillAppearSelector = @selector(swiz_viewWillAppear:); + [[self class] ba_swizzlingOriginalSelector:originalViewWillAppearSelector + swizzledSelector:swizzledViewWillAppearSelector]; + + SEL originalViewWillDisappearSelector = @selector(viewWillDisappear:); + SEL swizzledViewWillDisappearSelector = @selector(swiz_viewWillDisappear:); + [[self class] ba_swizzlingOriginalSelector:originalViewWillDisappearSelector + swizzledSelector:swizzledViewWillDisappearSelector]; + + }); +} + +- (void)swiz_viewWillAppear:(BOOL)animated +{ + /*! 插入需要执行的代码 */ + [self inject_viewWillAppear]; + /*! 不能干扰原来的代码流程,插入代码结束后要让本来该执行的代码继续执行 */ + [self swiz_viewWillAppear:animated]; +} + +- (void)swiz_viewWillDisappear:(BOOL)animated +{ + /*! 插入需要执行的代码 */ + [self inject_viewWillDisappear]; + /*! 不能干扰原来的代码流程,插入代码结束后要让本来该执行的代码继续执行 */ + [self swiz_viewWillDisappear:animated]; +} + +/*! 利用hook 统计所有页面的停留时长 */ +- (void)inject_viewWillAppear +{ + NSString *pageID = [self pageEventID:YES]; + if (pageID) + { + /*! 这里是给后台发送请求 */ + [BAUserStatistics sendEventToServer:pageID]; + } +} + +- (void)inject_viewWillDisappear +{ + NSString *pageID = [self pageEventID:NO]; + if (pageID) + { + /*! 这里是给后台发送请求 */ + [BAUserStatistics sendEventToServer:pageID]; + } +} + +//- (NSString *)pageEventID:(BOOL)bEnterPage +//{ +// NSString *selfClassName = NSStringFromClass([self class]); +// NSString *pageEventID = nil; +// if ([selfClassName isEqualToString:@"HomeViewController"]) { +// pageEventID = bEnterPage ? @"EVENT_HOME_ENTER_PAGE" : @"EVENT_HOME_LEAVE_PAGE"; +// } else if ([selfClassName isEqualToString:@"DetailViewController"]) { +// pageEventID = bEnterPage ? @"EVENT_DETAIL_ENTER_PAGE" : @"EVENT_DETAIL_LEAVE_PAGE"; +// } +// //else if (<#expression#>)... +// +// return pageEventID; +//} + +- (NSString *)pageEventID:(BOOL)bEnterPage +{ + NSDictionary *configDict = [self dictionaryFromUserStatisticsConfigPlist]; + NSString *selfClassName = NSStringFromClass([self class]); + return configDict[selfClassName][@"PageEventIDs"][bEnterPage ? @"Enter" : @"Leave"]; +} + +- (NSDictionary *)dictionaryFromUserStatisticsConfigPlist +{ + NSString *filePath = [[NSBundle mainBundle] pathForResource:@"BADemoUserStatisticsConfig" ofType:@"plist"]; + NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath]; + return dic; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.h" new file mode 100644 index 0000000..0e4a1f5 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.h" @@ -0,0 +1,53 @@ +// +// BABAJumpManager.h +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import + +//typedef void(^BAAlertActionBlock)(NSInteger index); + +#define BAJUMPMANAGERShare [BAJumpManager sharedBAJumpManager] + +@interface BAJumpManager : NSObject + +//@property (nonatomic, copy) BAAlertActionBlock alertBlock; + +//@property (nonatomic, weak) id vc; + ++ (BAJumpManager *)sharedBAJumpManager; +/*! + 注意:跳转的格式,需要与后台一起定义 + { + "className" : "MessageViewController", + "method" : "refresh", + "properties" : { + "msgId": 1223030330, + "msgType": 3 + } + }; + + className:跳转目标界面的类名, + method:类的实例方法, + properties:实例方法调用所需的参数。 + */ ++ (void)ba_jumpVCWtihDict:(NSDictionary *)dict navi:(UINavigationController *)navi; + +/*! + * 全局中转类 + * + * @param dict 跳转需要的参数 + */ ++ (void)ba_jumpToVCWtihDict:(NSDictionary *)dict; + +/*! + * 跳转到登陆界面 + * + * @param viewController 当前VC + */ ++ (void)ba_gotoLoginVCWithViewController:(UIViewController *)viewController; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.m" new file mode 100644 index 0000000..6ff080d --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAJumpManager/BAJumpManager.m" @@ -0,0 +1,176 @@ +// +// BAJumpManager.m +// 博爱微信 +// +// Created by 博爱 on 2016/10/24. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BAJumpManager.h" +#import "AppDelegate.h" +#import "BALoginViewController.h" +#import "UIAlertController+BAKit.h" + +//@interface UIViewController (TopViewController) +// +//- (UIViewController *)ba_getTopViewController; +// +//@end +// +//@implementation UIViewController (TopViewController) +// +//- (UIViewController *)ba_getTopViewController +//{ +// UIViewController *topViewController = self; +// +// UIViewController *above; +// while ((above = topViewController.presentedViewController)) { +// topViewController = above; +// } +// +// return topViewController; +//} +// +//@end + +@implementation BAJumpManager + ++ (BAJumpManager *)sharedBAJumpManager +{ +// NSAssert(0, @"这是一个单例对象,请使用+(NetAPIManager *)sharedInstance方法"); + /*! 为单例对象创建的静态实例,置为nil,因为对象的唯一性,必须是static类型 */ + static id sharedBAJumpManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedBAJumpManager = [[super allocWithZone:NULL] init]; + }); + return sharedBAJumpManager; +} + +/*! + * 重写allocWithZone方法,保证alloc或者init创建的实例不会产生新实例,因为该类覆盖了allocWithZone方法,所以只能通过其父类分配内存,即[super allocWithZone] + * + */ ++ (instancetype)allocWithZone:(struct _NSZone *)zone +{ + return [self sharedBAJumpManager]; +} + +- (id)copy +{ + return self; +} + ++ (id)copyWithZone:(struct _NSZone *)zone +{ + return [self sharedBAJumpManager]; +} + + +/*! + 注意:跳转的格式,需要与后台一起定义 + { + "className" : "MessageViewController", + "method" : "refresh", + "properties" : { + "msgId": 1223030330, + "msgType": 3 + } + }; + + className:跳转目标界面的类名, + method:类的实例方法, + properties:实例方法调用所需的参数。 + */ ++ (void)ba_jumpVCWtihDict:(NSDictionary *)dict navi:(UINavigationController *)navi +{ + Class class = NSClassFromString(dict[@"className"]); + + UIViewController *vc = [[class alloc] init]; + + NSDictionary *properties = dict[@"properties"]; + [properties enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { + /*! 如果没有这个字段或obj为nil,让它报错好了,这样就知道问题出在哪了 */ + [vc setValue:obj forKey:key]; + }]; + +// SEL selector = NSSelectorFromString(dict[@"method"]); +// [vc performSelector:selector]; + [navi pushViewController:vc animated:YES]; +} + +/*! + * 全局中转类 + * + * @param dict 跳转需要的参数 + */ ++ (void)ba_jumpToVCWtihDict:(NSDictionary *)dict +{ + if ([BACommon ba_isNSDictionaryNULL:dict]) + { + return; + } + + AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; + UIViewController *viewController = app.window.rootViewController; + + /*! 跳转 VC 的标识 */ + NSString *actionType = [dict objectForKey:@"actionType"]; + NSString *actionParam = [dict objectForKey:@"actionParam"]; + + +} + ++ (void)ba_gotoLoginVCWithViewController:(UIViewController *)viewController +{ + if (!viewController) + { + AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate; + viewController = app.window.rootViewController; + } + if (BAUSERSHARE.isLogin) + { + [viewController.view ba_showAlertView:@"温馨提示:" message:@"当前用户已登录,请勿重复登录!"]; + return ; + } +// [viewController BAAlertWithTitle:@"温馨提示:" message:@"当前用户未 登录 ,是否 登录 ?" andOthers:@[@"取 消", @"登 录"] animated:YES action:^(NSInteger index) { +// if (index == 1) +// { +// [viewController.navigationController pushViewController:[BALoginViewController new] animated:YES]; +// } +// +// }]; + + [BAJUMPMANAGERShare ba_loginAlertWithViewController:viewController]; +} + +- (void)ba_loginAlertWithViewController:(UIViewController *)viewController +{ + NSMutableAttributedString *title = [[NSMutableAttributedString alloc] initWithString:@"博爱温馨提示:" attributes:@{NSForegroundColorAttributeName:[UIColor orangeColor]}]; + + NSString *result = @"当前用户未 登录 ,是否 登录 ?"; + NSString *keyWord = @"登录"; + + /*! 关键字添加效果 */ + NSMutableAttributedString *attributedMessage = [[NSMutableAttributedString alloc]initWithString:result]; + + /*! 获取关键字位置 */ + NSRange range = [result rangeOfString:keyWord]; + + NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:20],NSForegroundColorAttributeName:[UIColor blackColor],NSKernAttributeName:@2.0,NSStrikethroughStyleAttributeName:@(NSUnderlineStyleSingle),NSStrokeColorAttributeName:[UIColor blueColor],NSStrokeWidthAttributeName:@2.0,NSVerticalGlyphFormAttributeName:@(0)}; + + /*! 设置关键字属性 */ + [attributedMessage ba_changeAttributeDict:dic range:range]; + + BAKit_WeakSelf; + /*! 系统 alert */ + NSArray *buttonTitleArray = @[@"取 消", @"登 录"]; + NSArray *buttonTitleColorArray = @[BAKit_Color_Green, BAKit_Color_Red]; + [UIAlertController ba_alertAttributedShowInViewController:viewController attributedTitle:title attributedMessage:attributedMessage buttonTitleArray:buttonTitleArray buttonTitleColorArray:buttonTitleColorArray block:^(UIAlertController * _Nonnull alertController, UIAlertAction * _Nonnull action, NSInteger buttonIndex) { + BALoginViewController *loginVC = [[BALoginViewController alloc] init]; + [viewController.navigationController pushViewController:loginVC animated:YES]; + }]; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.h" new file mode 100755 index 0000000..e502541 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.h" @@ -0,0 +1,82 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import + +/*! 基于源码 https://github.com/iKingsly/iKYLoadingHUb 修改! */ + +/*! + Version:【Version:2.0】 + 最新更新时间:2016-11-17 + */ +@interface BALoadingHubView : UIView + +/** 球的颜色 */ +@property (nonatomic,strong) UIColor *ballColor; + +/** 展示加载动画*/ +- (void)showHub; + +/** + * 关闭加载动画 + */ +- (void)dismissHub; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.m" new file mode 100755 index 0000000..1e94e48 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALoadingHubView/BALoadingHubView.m" @@ -0,0 +1,236 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import "BALoadingHubView.h" + +#define ORIGIN_X self.frame.origin.x +#define ORIGIN_Y self.frame.origin.y +#define WIDTH self.frame.size.width +#define HEIGHT self.frame.size.height +#define BALL_RADIUS 20 + +@interface BALoadingHubView () + +/**第1个球 */ +@property (nonatomic, strong) UIView *ball_1; +/**第2个球 */ +@property (nonatomic, strong) UIView *ball_2; +/**第3个球 */ +@property (nonatomic, strong) UIView *ball_3; + +/*! 遮罩背景 */ +@property (nonatomic, strong) UIVisualEffectView *bgView; + +@end + +@implementation BALoadingHubView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + self.backgroundColor = [UIColor clearColor]; + _bgView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]]; + _bgView.alpha = 0.9f; + _bgView.frame = CGRectMake(0, 0, WIDTH, HEIGHT); + _bgView.layer.cornerRadius = BALL_RADIUS / 2; + _bgView.clipsToBounds = YES; + [self addSubview:_bgView]; + } + return self; +} + +- (UIColor *)ballColor{ + if (_ballColor) { + return _ballColor; + } + return [UIColor redColor]; +} + +- (void)showHub{ + CGFloat ballH = HEIGHT / 2 - BALL_RADIUS * 0.5; + UIView *ball_1 = [[UIView alloc] initWithFrame:CGRectMake(WIDTH/2 - BALL_RADIUS * 1.5, ballH, BALL_RADIUS, BALL_RADIUS)]; + ball_1.layer.cornerRadius = BALL_RADIUS / 2; // 成为圆形 + ball_1.backgroundColor = self.ballColor; + [self addSubview:ball_1]; + self.ball_1 = ball_1; + + UIView *ball_2 = [[UIView alloc] initWithFrame:CGRectMake(WIDTH/2 - BALL_RADIUS * 0.5, ballH, BALL_RADIUS, BALL_RADIUS)]; + ball_2.layer.cornerRadius = BALL_RADIUS / 2; // 成为圆形 + ball_2.backgroundColor = self.ballColor; + [self addSubview:ball_2]; + self.ball_2 = ball_2; + + UIView *ball_3 = [[UIView alloc] initWithFrame:CGRectMake(WIDTH/2 + BALL_RADIUS * 0.5, ballH, BALL_RADIUS, BALL_RADIUS)]; + ball_3.layer.cornerRadius = BALL_RADIUS / 2; // 成为圆形 + ball_3.backgroundColor = self.ballColor; + [self addSubview:ball_3]; + self.ball_3 = ball_3; + + [self rotationAnimation]; +} + +- (void)rotationAnimation{ + // 1.1 取得围绕中心轴的点 + CGPoint centerPoint = CGPointMake(WIDTH / 2 , HEIGHT / 2); + // 1.2 获得第一个圆的中点 + CGPoint centerBall_1 = CGPointMake(WIDTH/2-BALL_RADIUS, HEIGHT/2); + // 1.3 获得第三个圆的中点 + CGPoint centerBall_2 = CGPointMake(WIDTH / 2 + BALL_RADIUS, HEIGHT / 2); + + // 2.1 第一个圆的曲线 + UIBezierPath *path_ball_1 = [UIBezierPath bezierPath]; + [path_ball_1 moveToPoint:centerBall_1]; + + [path_ball_1 addArcWithCenter:centerPoint radius:BALL_RADIUS startAngle:M_PI endAngle:2*M_PI clockwise:NO]; + UIBezierPath *path_ball_1_1 = [UIBezierPath bezierPath]; + [path_ball_1_1 addArcWithCenter:centerPoint radius:BALL_RADIUS startAngle:0 endAngle:M_PI clockwise:NO]; + [path_ball_1 appendPath:path_ball_1_1]; + + // 2.2 第一个圆的动画 + CAKeyframeAnimation *animation_ball_1=[CAKeyframeAnimation animationWithKeyPath:@"position"]; + animation_ball_1.path = path_ball_1.CGPath; + animation_ball_1.removedOnCompletion = NO; + animation_ball_1.fillMode = kCAFillModeForwards; + animation_ball_1.calculationMode = kCAAnimationCubic; + animation_ball_1.repeatCount = 1; + animation_ball_1.duration = 1.4; + animation_ball_1.delegate = self; + animation_ball_1.autoreverses = NO; + animation_ball_1.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + + [self.ball_1.layer addAnimation:animation_ball_1 forKey:@"animation"]; + + // 2.1 第一个圆的曲线 + UIBezierPath *path_ball_3 = [UIBezierPath bezierPath]; + [path_ball_3 moveToPoint:centerBall_2]; + + [path_ball_3 addArcWithCenter:centerPoint radius:BALL_RADIUS startAngle:0 endAngle:M_PI clockwise:NO]; + UIBezierPath *path_ball_3_1 = [UIBezierPath bezierPath]; + [path_ball_3_1 addArcWithCenter:centerPoint radius:BALL_RADIUS startAngle:M_PI endAngle:M_PI*2 clockwise:NO]; + [path_ball_3 appendPath:path_ball_3_1]; + + // 2.2 第2个圆的动画 + CAKeyframeAnimation *animation_ball_3 = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + animation_ball_3.path = path_ball_3.CGPath; + animation_ball_3.removedOnCompletion = NO; + animation_ball_3.fillMode = kCAFillModeForwards; + animation_ball_3.calculationMode = kCAAnimationCubic; + animation_ball_3.repeatCount = 1; + animation_ball_3.duration = 1.4; +// animation_ball_3.delegate = self; + animation_ball_3.autoreverses = NO; + animation_ball_3.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + + [self.ball_3.layer addAnimation:animation_ball_3 forKey:@"rotation"]; + +} + + +- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ + [self rotationAnimation]; +} + +- (void)animationDidStart:(CAAnimation *)anim{ + [UIView animateWithDuration:0.3 delay:0.1 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState animations:^{ + + self.ball_1.transform = CGAffineTransformMakeTranslation(-BALL_RADIUS, 0); + self.ball_1.transform = CGAffineTransformScale(self.ball_1.transform, 0.7, 0.7); + + self.ball_3.transform = CGAffineTransformMakeTranslation(BALL_RADIUS, 0); + self.ball_3.transform = CGAffineTransformScale(self.ball_3.transform, 0.7, 0.7); + + + self.ball_2.transform = CGAffineTransformScale(self.ball_2.transform, 0.7, 0.7); + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.3 delay:0.1 options:UIViewAnimationOptionCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState animations:^{ + self.ball_1.transform = CGAffineTransformIdentity; + self.ball_3.transform = CGAffineTransformIdentity; + self.ball_2.transform = CGAffineTransformIdentity; + } completion:NULL]; + + }]; +} + +- (void)dismissHub +{ + if (_ball_1) + { + [_ball_1 removeFromSuperview]; + _ball_1 = nil; + } + if (_ball_2) + { + [_ball_2 removeFromSuperview]; + _ball_2 = nil; + } + if (_ball_3) + { + [_ball_3 removeFromSuperview]; + _ball_3 = nil; + } + if (_bgView) + { + [_bgView removeFromSuperview]; + _bgView = nil; + } + NSLog(@"动画执行完毕!"); +} +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALocalNotification/BALocalNotification.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALocalNotification/BALocalNotification.h" index b8e20ec..f8feaf5 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALocalNotification/BALocalNotification.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALocalNotification/BALocalNotification.h" @@ -61,6 +61,10 @@ #import #import +/*! + Version:【Version:2.0】 + 最新更新时间:2016-11-17 + */ @interface BALocalNotification : NSObject // 设置本地通知 diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.h" deleted file mode 100755 index 35d9018..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.h" +++ /dev/null @@ -1,234 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import - -@interface BARegularExpression : NSObject - -/*! - * 是否为电话号码【简单写法】 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isPhoneNumber:(NSString *)phoneNum; - -/*! - * 是否为电话号码【复杂写法】 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isMobileNumber:(NSString *)mobileNum; - -/*! - * 判断是否是:移动手机号 - * - * @param phoneNum 手机号码 - * - * @return 移动手机号 - */ -+ (BOOL)ba_isChinaMobile:(NSString *)phoneNum; - -/*! - * 判断是否是:联通手机号 - * - * @param phoneNum 手机号码 - * - * @return 联通手机号 - */ -+ (BOOL)ba_isChinaUnicom:(NSString *)phoneNum; - -/*! - * 判断是否是:电信手机号 - * - * @param phoneNum 手机号码 - * - * @return 电信手机号 - */ -+ (BOOL)ba_isChinaTelecom:(NSString *)phoneNum; - -/*! - * 判断具体是哪个运营商的手机号 - * - * @param phoneNum 传入需要检测的字符串 - * - * @return 返回:中国移动、中国联通、中国电信、未知 - */ -+ (NSString *)ba_getPhoneNumType:(NSString *)phoneNum; - -/*! - * 检测是否为邮箱 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isEmailQualified:(NSString *)emailStr; - -/*! - * 检测用户输入密码是否以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isPasswordQualified:(NSString *)passwordStr; - -/*! - * 验证身份证号(15位或18位数字)【最全的身份证校验,带校验位】 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isIdCardNumberQualified:(NSString *)idCardNumberStr; - -/*! - * 验证IP地址(15位或18位数字) - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isIPAddress:(NSString *)iPAddressStr; - -/*! - * 验证输入的是否全为数字 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isAllNumber:(NSString *)allNumberStr; - -/*! - * 验证由26个英文字母组成的字符串 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isEnglishAlphabet:(NSString *)englishAlphabetStr; - -/*! - * 验证输入的是否是URL地址 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isUrl:(NSString *)urlStr; - -/*! - * 验证输入的是否是中文 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isChinese:(NSString *)chineseStr; - -/*! - * 验证输入的是否是高亮显示 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isNormalText:(NSString *)normalStr WithHighLightText:(NSString *)HighLightStr; - -/*! - * 是否为常用用户名(根据自己需求改) - * - * @param userNameStr userNameStr - * - * @return 返回检测结果 是或者不是(6-20位数字+字母组合) - */ -+ (BOOL)ba_isUserNameInGeneral:(NSString *)userNameStr; - -/*! - * 车牌号验证 - * - * @param carNumber carNumber - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateCarNumber:(NSString *)carNumber; - -/*! - * 车型验证 - * - * @param CarType CarType - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateCarType:(NSString *)CarType; - -/*! - * 昵称验证 - * - * @param nickname nickname - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateNickname:(NSString *)nickname; - - - - - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.m" deleted file mode 100755 index de2b557..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression.m" +++ /dev/null @@ -1,519 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import "BARegularExpression.h" - -@implementation BARegularExpression - -/*! - * 是否为电话号码【简单写法】 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+(BOOL)ba_isPhoneNumber:(NSString *)phoneNum -{ - NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|70)\\d{8}$"; - NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; - return [regextestmobile evaluateWithObject:phoneNum]; -} - -/*! - * 是否为电话号码【复杂写法】 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isMobileNumber:(NSString *)mobileNum -{ - if (mobileNum.length != 11) - { - return NO; - } - /** - * 手机号码: - * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[6, 7, 8], 18[0-9], 170[0-9] - * 移动号段: 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 - * 联通号段: 130,131,132,155,156,185,186,145,176,1709 - * 电信号段: 133,153,180,181,189,177,1700 - */ - NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|70)\\d{8}$"; - /** - * 中国移动:China Mobile - * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 - */ - NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)"; - /** - * 中国联通:China Unicom - * 130,131,132,155,156,185,186,145,176,1709 - */ - NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^1709\\d{7}$)"; - /** - * 中国电信:China Telecom - * 133,153,180,181,189,177,1700 - */ - NSString *CT = @"(^1(33|53|77|8[019])\\d{8}$)|(^1700\\d{7}$)"; - - - NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; - NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; - NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; - NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; - - if (([regextestmobile evaluateWithObject:mobileNum] == YES) - || ([regextestcm evaluateWithObject:mobileNum] == YES) - || ([regextestct evaluateWithObject:mobileNum] == YES) - || ([regextestcu evaluateWithObject:mobileNum] == YES)) - { - return YES; - } - else - { - return NO; - } -} - -/*! - * 判断是否是:移动手机号 - * - * @param phoneNum 手机号码 - * - * @return 移动手机号 - */ -+ (BOOL)ba_isChinaMobile:(NSString *)phoneNum -{ - /*! - * 中国移动:China Mobile - * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 - */ - NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)"; - NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; - return [regextestcm evaluateWithObject:phoneNum]; -} - -/*! - * 判断是否是:联通手机号 - * - * @param phoneNum 手机号码 - * - * @return 联通手机号 - */ -+ (BOOL)ba_isChinaUnicom:(NSString *)phoneNum -{ - /*! - * 中国联通:China Unicom - * 130,131,132,155,156,185,186,145,176,1709 - */ - NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^1709\\d{7}$)"; - NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; - return [regextestcm evaluateWithObject:phoneNum]; -} - -/*! - * 判断是否是:电信手机号 - * - * @param phoneNum 手机号码 - * - * @return 电信手机号 - */ -+ (BOOL)ba_isChinaTelecom:(NSString *)phoneNum -{ - /*! - * 中国电信:China Telecom - * 133,153,180,181,189,177,1700 - */ - NSString *CT = @"^1((33|53|8[019])[0-9]|349)\\d{7}$"; - NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; - return [regextestcm evaluateWithObject:phoneNum]; -} - -/*! - * 判断具体是哪个运营商的手机号 - * - * @param phoneNum 传入需要检测的字符串 - * - * @return 返回:中国移动、中国联通、中国电信、未知 - */ -+ (NSString *)ba_getPhoneNumType:(NSString *)phoneNum -{ - return [BARegularExpression ba_isChinaMobile:phoneNum]? @"中国移动": ([BARegularExpression ba_isChinaUnicom:phoneNum]? @"中国联通":([BARegularExpression ba_isChinaTelecom:phoneNum]? @"中国电信": @"未知号码")); -} - -/*! - * 检测是否为邮箱 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isEmailQualified:(NSString *)emailStr -{ - NSString *pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:emailStr options:0 range:NSMakeRange(0, emailStr.length)]; - return results.count > 0; -} - -/*! - * 检测用户输入密码是否以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 - * - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isPasswordQualified:(NSString *)passwordStr -{ -// NSString *pattern = @"^[a-zA-Z]\\w.{5,17}$"; -// NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; -// NSArray *results = [regex matchesInString:passwordStr options:0 range:NSMakeRange(0, passwordStr.length)]; -// return results.count > 0; - - NSString *passWordRegex = @"^[a-zA-Z]\\w.{5,17}$"; - NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; - return [passWordPredicate evaluateWithObject:passwordStr]; -} - -/*! - * 验证身份证号(15位或18位数字)【最全的身份证校验,带校验位】 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isIdCardNumberQualified:(NSString *)idCardNumberStr -{ -// NSString *pattern = @"^\\d{15}|\\d{18}$"; -// NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; -// NSArray *results = [regex matchesInString:idCardNumberStr options:0 range:NSMakeRange(0, idCardNumberStr.length)]; -// return results.count > 0; - - idCardNumberStr = [idCardNumberStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - NSInteger length = 0; - if (!idCardNumberStr) - { - return NO; - } - else - { - length = idCardNumberStr.length; - if (length != 15 && length !=18) - { - return NO; - } - } - /*! 省份代码 */ - NSArray *areasArray =@[@"11", @"12", @"13", @"14", @"15", @"21", @"22", @"23", @"31", @"32", @"33", @"34", @"35", @"36", @"37", @"41", @"42", @"43", @"44", @"45", @"46", @"50", @"51", @"52", @"53", @"54", @"61", @"62", @"63", @"64", @"65", @"71", @"81", @"82", @"91"]; - - NSString *valueStart2 = [idCardNumberStr substringToIndex:2]; - BOOL areaFlag = NO; - for (NSString *areaCode in areasArray) - { - if ([areaCode isEqualToString:valueStart2]) - { - areaFlag =YES; - break; - } - } - if (!areaFlag) - { - return NO; - } - - NSRegularExpression *regularExpression; - NSUInteger numberofMatch; - - NSInteger year = 0; - switch (length) - { - case 15: - year = [idCardNumberStr substringWithRange:NSMakeRange(6,2)].intValue +1900; - - if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) - { - /*! 测试出生日期的合法性 */ - regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$" - options:NSRegularExpressionCaseInsensitive - error:nil]; - } - else - { - /*! 测试出生日期的合法性 */ - regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$" - options:NSRegularExpressionCaseInsensitive - error:nil]; - } - numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr - options:NSMatchingReportProgress - range:NSMakeRange(0, idCardNumberStr.length)]; - - if(numberofMatch > 0) - { - return YES; - } - else - { - return NO; - } - break; - case 18: - - year = [idCardNumberStr substringWithRange:NSMakeRange(6,4)].intValue; - if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) - { - /*! 测试出生日期的合法性 */ - regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$" - options:NSRegularExpressionCaseInsensitive - error:nil]; - } - else - { - /*! 测试出生日期的合法性 */ - regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$" - options:NSRegularExpressionCaseInsensitive - error:nil]; - } - numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr - options:NSMatchingReportProgress - range:NSMakeRange(0, idCardNumberStr.length)]; - - if(numberofMatch > 0) - { - NSInteger S = ([idCardNumberStr substringWithRange:NSMakeRange(0,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([idCardNumberStr substringWithRange:NSMakeRange(1,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([idCardNumberStr substringWithRange:NSMakeRange(2,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([idCardNumberStr substringWithRange:NSMakeRange(3,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([idCardNumberStr substringWithRange:NSMakeRange(4,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([idCardNumberStr substringWithRange:NSMakeRange(5,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([idCardNumberStr substringWithRange:NSMakeRange(6,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(16,1)].intValue) *2 + [idCardNumberStr substringWithRange:NSMakeRange(7,1)].intValue *1 + [idCardNumberStr substringWithRange:NSMakeRange(8,1)].intValue *6 + [idCardNumberStr substringWithRange:NSMakeRange(9,1)].intValue *3; - NSInteger Y = S % 11; - NSString *M = @"F"; - NSString *JYM = @"10X98765432"; - /*! 判断校验位 */ - M = [JYM substringWithRange:NSMakeRange(Y,1)]; - if ([M isEqualToString:[idCardNumberStr substringWithRange:NSMakeRange(17,1)]]) - { - /*! 检测ID的校验位 */ - return YES; - } - else - { - return NO; - } - - } - else - { - return NO; - } - break; - default: - return NO; - break; - } -} - -/*! - * 验证IP地址(15位或18位数字) - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isIPAddress:(NSString *)iPAddressStr -{ - - NSString *pattern = @"((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:iPAddressStr options:0 range:NSMakeRange(0, iPAddressStr.length)]; - return results.count > 0; -} - -/*! - * 验证输入的是否全为数字 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isAllNumber:(NSString *)allNumberStr -{ - NSString *pattern = @"^[0-9]*$"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:allNumberStr options:0 range:NSMakeRange(0, allNumberStr.length)]; - return results.count > 0; -} - -/*! - * 验证由26个英文字母组成的字符串 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isEnglishAlphabet:(NSString *)englishAlphabetStr -{ - NSString *pattern = @"^[A-Za-z]+$"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:englishAlphabetStr options:0 range:NSMakeRange(0, englishAlphabetStr.length)]; - return results.count > 0; -} - -/*! - * 验证输入的是否是URL地址 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isUrl:(NSString *)urlStr -{ -// NSString* verifyRules=@"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"; -// NSPredicate *verifyRulesPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",verifyRules]; -// return [verifyRulesPre evaluateWithObject:urlStr]; - - NSString *pattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:urlStr options:0 range:NSMakeRange(0, urlStr.length)]; - return results.count > 0; -} - -/*! - * 验证输入的是否是中文 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isChinese:(NSString *)chineseStr -{ - NSString *pattern = @"[\u4e00-\u9fa5]+"; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:chineseStr options:0 range:NSMakeRange(0, chineseStr.length)]; - return results.count > 0; -} - -/*! - * 验证输入的是否是高亮显示 - * @param pattern 传入需要检测的字符串 - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isNormalText:(NSString *)normalStr WithHighLightText:(NSString *)HighLightStr -{ - NSString *pattern = [NSString stringWithFormat:@"%@",HighLightStr]; - NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; - NSArray *results = [regex matchesInString:normalStr options:0 range:NSMakeRange(0, normalStr.length)]; - for (NSTextCheckingResult *resltText in results) { - NSLog(@"----------------%zd",resltText.range.length); - } - return results.count > 0; -} - -/*! - * 是否为常用用户名(根据自己需求改) - * - * @param userNameStr userNameStr - * - * @return 返回检测结果 是或者不是(6-20位数字+字母组合) - */ -+ (BOOL)ba_isUserNameInGeneral:(NSString *)userNameStr -{ - NSString* verifyRules = @"^[A-Za-z0-9]{6,20}+$"; - NSPredicate *verifyRulesPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",verifyRules]; - return [verifyRulesPre evaluateWithObject:userNameStr]; -} - -/*! - * 车牌号验证 - * - * @param carNumber carNumber - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateCarNumber:(NSString *)carNumber -{ - NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; - NSPredicate *catTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", carRegex]; - return [catTest evaluateWithObject:carNumber]; -} - -/*! - * 车型验证 - * - * @param CarType CarType - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateCarType:(NSString *)CarType -{ - NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$"; - NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex]; - return [carTest evaluateWithObject:CarType]; -} - -/*! - * 昵称验证 - * - * @param nickname nickname - * - * @return 返回检测结果 是或者不是 - */ -+ (BOOL)ba_isValidateNickname:(NSString *)nickname -{ - NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; - NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; - return [passWordPredicate evaluateWithObject:nickname]; -} - - - - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression/BAKit_RegularExpression.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression/BAKit_RegularExpression.h" new file mode 100755 index 0000000..596eef1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BARegularExpression/BAKit_RegularExpression.h" @@ -0,0 +1,336 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +/*! + 最新更新时间:2017-06-13 【倒叙】 + 最新Version:【Version:2.1】 + 更新内容: + 2.1.1、优化方法名命名规范 + */ +#import + +@interface BAKit_RegularExpression : NSObject + +/*! + * 是否为电话号码【简单写法】 + * + * @param phoneNum 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsPhoneNumber:(NSString *)phoneNum; + +/*! + * 是否为电话号码【复杂写法】 + * + * @param mobileNum 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsMobileNumber:(NSString *)mobileNum; + +/*! + * 判断是否是:移动手机号 + * + * @param phoneNum 手机号码 + * + * @return 移动手机号 + */ ++ (BOOL)ba_regularIsChinaMobile:(NSString *)phoneNum; + +/*! + * 判断是否是:联通手机号 + * + * @param phoneNum 手机号码 + * + * @return 联通手机号 + */ ++ (BOOL)ba_regularIsChinaUnicom:(NSString *)phoneNum; + +/*! + * 判断是否是:电信手机号 + * + * @param phoneNum 手机号码 + * + * @return 电信手机号 + */ ++ (BOOL)ba_regularIsChinaTelecom:(NSString *)phoneNum; + +/*! + * 判断具体是哪个运营商的手机号 + * + * @param phoneNum 传入需要检测的字符串 + * + * @return 返回:中国移动、中国联通、中国电信、未知 + */ ++ (NSString *)ba_getPhoneNumType:(NSString *)phoneNum; + +/*! + * 检测是否为邮箱 + * + * @param emailStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsEmailQualified:(NSString *)emailStr; + +/*! + * 检测用户输入密码是否以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 + * + * @param passwordStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsPasswordQualified:(NSString *)passwordStr; + +/*! + * 验证身份证号(15位或18位数字)【最全的身份证校验,带校验位】 + * @param idCardNumberStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsIdCardNumberQualified:(NSString *)idCardNumberStr; + +/*! + * 验证IP地址(15位或18位数字) + * @param iPAddressStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsIPAddress:(NSString *)iPAddressStr; + +/*! + * 验证输入的是否全为数字 + * @param allNumberStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsAllNumber:(NSString *)allNumberStr; + +/*! + * 验证由26个英文字母组成的字符串 + * @param englishAlphabetStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsEnglishAlphabet:(NSString *)englishAlphabetStr; + +/*! + * 验证输入的是否是URL地址 + * @param urlStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsUrl:(NSString *)urlStr; + +/*! + * 验证输入的是否是中文 + * @param chineseStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsChinese:(NSString *)chineseStr; + +/*! + * 验证输入的是否是高亮显示 + * @param normalStr 传入需要检测的字符串 + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsNormalText:(NSString *)normalStr highLightText:(NSString *)highLightStr; + +/*! + * 是否为常用用户名(根据自己需求改) + * + * @param userNameStr userNameStr + * + * @return 返回检测结果 是或者不是(8-20位数字+字母组合) + */ ++ (BOOL)ba_regularIsUserNameInGeneral:(NSString *)userNameStr; + +/*! + * 车牌号验证 + * + * @param carNumber carNumber + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsValidateCarNumber:(NSString *)carNumber; + +/*! + * 车型验证 + * + * @param CarType CarType + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsValidateCarType:(NSString *)CarType; + +/*! + * 昵称验证 + * + * @param nickname nickname + * + * @return 返回检测结果 是或者不是 + */ ++ (BOOL)ba_regularIsValidateNickname:(NSString *)nickname; + +/*! + * 邮政编码验证 + */ ++ (BOOL)ba_regularIsValidPostalcode:(NSString *)postalcode; + +/*! + * 工商税号验证 + */ ++ (BOOL)ba_regularIsValidTaxNo:(NSString *)taxNo; + +/*! + * Mac地址有效性验证 + */ ++ (BOOL)ba_regularIsMacAddress:(NSString *)macAddress; + +/*! + * 银行卡的有效性验证 + */ ++ (BOOL)ba_regularIsBankCardlNumCheck:(NSString *)bankCardlNum; + +/*! 判断字符串是否是字母或数字 */ ++ (BOOL)ba_regularIsLetterOrNumberString:(NSString *)string; + + + + + + + +/*! + * 正则表达式简单说明 + * 语法: + . 匹配除换行符以外的任意字符 + \w 匹配字母或数字或下划线或汉字 + \s 匹配任意的空白符 + \d 匹配数字 + \b 匹配单词的开始或结束 + ^ 匹配字符串的开始 + $ 匹配字符串的结束 + * 重复零次或更多次 + + 重复一次或更多次 + ? 重复零次或一次 + {n} 重复n次 + {n,} 重复n次或更多次 + {n,m} 重复n到m次 + \W 匹配任意不是字母,数字,下划线,汉字的字符 + \S 匹配任意不是空白符的字符 + \D 匹配任意非数字的字符 + \B 匹配不是单词开头或结束的位置 + [^x] 匹配除了x以外的任意字符 + [^aeiou]匹配除了aeiou这几个字母以外的任意字符 + *? 重复任意次,但尽可能少重复 + +? 重复1次或更多次,但尽可能少重复 + ?? 重复0次或1次,但尽可能少重复 + {n,m}? 重复n到m次,但尽可能少重复 + {n,}? 重复n次以上,但尽可能少重复 + \a 报警字符(打印它的效果是电脑嘀一声) + \b 通常是单词分界位置,但如果在字符类里使用代表退格 + \t 制表符,Tab + \r 回车 + \v 竖向制表符 + \f 换页符 + \n 换行符 + \e Escape + \0nn ASCII代码中八进制代码为nn的字符 + \xnn ASCII代码中十六进制代码为nn的字符 + \unnnn Unicode代码中十六进制代码为nnnn的字符 + \cN ASCII控制字符。比如\cC代表Ctrl+C + \A 字符串开头(类似^,但不受处理多行选项的影响) + \Z 字符串结尾或行尾(不受处理多行选项的影响) + \z 字符串结尾(类似$,但不受处理多行选项的影响) + \G 当前搜索的开头 + \p{name} Unicode中命名为name的字符类,例如\p{IsGreek} + (?>exp) 贪婪子表达式 + (?-exp) 平衡组 + (?im-nsx:exp) 在子表达式exp中改变处理选项 + (?im-nsx) 为表达式后面的部分改变处理选项 + (?(exp)yes|no) 把exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no + (?(exp)yes) 同上,只是使用空表达式作为no + (?(name)yes|no) 如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no + (?(name)yes) 同上,只是使用空表达式作为no + + 捕获 + (exp) 匹配exp,并捕获文本到自动命名的组里 + (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) + (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号 + 零宽断言 + (?=exp) 匹配exp前面的位置 + (?<=exp) 匹配exp后面的位置 + (?!exp) 匹配后面跟的不是exp的位置 + (?_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import "BAKit_RegularExpression.h" + +@implementation BAKit_RegularExpression + +#pragma mark - ***** 是否为电话号码【简单写法】 ++ (BOOL)ba_regularIsPhoneNumber:(NSString *)phoneNum +{ + NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[01235678]|8[0-9])\\d{8}$"; + NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; + return [regextestmobile evaluateWithObject:phoneNum]; +} + +#pragma mark - ***** 是否为电话号码【复杂写法】 ++ (BOOL)ba_regularIsMobileNumber:(NSString *)mobileNum +{ + if (mobileNum.length != 11) + { + return NO; + } + /** + * 手机号码: + * 13[0-9], 14[5,7], 15[0, 1, 2, 3, 5, 6, 7, 8, 9], 17[0, 1, 6, 7, 8], 18[0-9] + * 移动号段: 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188 + * 联通号段: 130,131,132,145,155,156,170,171,172,175,176,185,186 + * 电信号段: 133,149,153,170,173,177,180,181,189 + */ + NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$"; + /** + * 中国移动:China Mobile + * 134,135,136,137,138,139,147,150,151,152,157,158,159,170,178,182,183,184,187,188 + */ + NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[08]|8[2-478])\\d{8}$"; + /** + * 中国联通:China Unicom + * 130,131,132,145,155,156,170,171,172,175,176,185,186 + */ + NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|701256||8[56])\\d{8}$"; + /** + * 中国电信:China Telecom + * 133,149,153,170,173,177,180,181,189 + */ + NSString *CT = @"^1(3[3]|4[9]|53|7[037]|8[019])\\d{8}$"; + + + NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE]; + NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; + NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; + NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; + + if (([regextestmobile evaluateWithObject:mobileNum] == YES) + || ([regextestcm evaluateWithObject:mobileNum] == YES) + || ([regextestct evaluateWithObject:mobileNum] == YES) + || ([regextestcu evaluateWithObject:mobileNum] == YES)) + { + return YES; + } + else + { + return NO; + } +} + +#pragma mark - ***** 判断是否是:移动手机号 ++ (BOOL)ba_regularIsChinaMobile:(NSString *)phoneNum +{ + /*! + * 中国移动:China Mobile + * 134,135,136,137,138,139,150,151,152,157,158,159,182,183,184,187,188,147,178,1705 + */ + NSString *CM = @"(^1(3[4-9]|4[7]|5[0-27-9]|7[8]|8[2-478])\\d{8}$)|(^1705\\d{7}$)"; + NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM]; + return [regextestcm evaluateWithObject:phoneNum]; +} + +#pragma mark - ***** 判断是否是:联通手机号 ++ (BOOL)ba_regularIsChinaUnicom:(NSString *)phoneNum +{ + /*! + * 中国联通:China Unicom + * 130,131,132,155,156,185,186,145,176,1709 + */ + NSString *CU = @"(^1(3[0-2]|4[5]|5[56]|7[6]|8[56])\\d{8}$)|(^1709\\d{7}$)"; + NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU]; + return [regextestcm evaluateWithObject:phoneNum]; +} + +#pragma mark - ***** 判断是否是:电信手机号 ++ (BOOL)ba_regularIsChinaTelecom:(NSString *)phoneNum +{ + /*! + * 中国电信:China Telecom + * 133,153,180,181,189,177,1700 + */ + NSString *CT = @"^1((33|53|8[019])[0-9]|349)\\d{7}$"; + NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT]; + return [regextestcm evaluateWithObject:phoneNum]; +} + + #pragma mark - ***** 判断具体是哪个运营商的手机号 ++ (NSString *)ba_getPhoneNumType:(NSString *)phoneNum +{ + return [BAKit_RegularExpression ba_regularIsChinaMobile:phoneNum]? @"中国移动": ([BAKit_RegularExpression ba_regularIsChinaUnicom:phoneNum]? @"中国联通":([BAKit_RegularExpression ba_regularIsChinaTelecom:phoneNum]? @"中国电信": @"未知号码")); +} + +#pragma mark - ***** 检测是否为邮箱 ++ (BOOL)ba_regularIsEmailQualified:(NSString *)emailStr +{ + NSString *pattern = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:emailStr options:0 range:NSMakeRange(0, emailStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 检测用户输入密码是否以字母开头,长度在6-18之间,只能包含字符、数字和下划线。 ++ (BOOL)ba_regularIsPasswordQualified:(NSString *)passwordStr +{ +// NSString *pattern = @"^[a-zA-Z]\\w.{5,17}$"; +// NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; +// NSArray *results = [regex matchesInString:passwordStr options:0 range:NSMakeRange(0, passwordStr.length)]; +// return results.count > 0; + + NSString *passWordRegex = @"^[a-zA-Z]\\w.{5,17}$"; + NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",passWordRegex]; + return [passWordPredicate evaluateWithObject:passwordStr]; + +// BOOL result = false; +// if ([passwordStr length] >= 6 && ([passwordStr length] <= 16)) +// { +// /*! 判断长度大于6位后,再接着判断是否同时包含数字和字符 */ +// NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$"; +// NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; +// result = [pred evaluateWithObject:passwordStr]; +// } +// return result; +} + +#pragma mark - ***** 验证身份证号(15位或18位数字)【最全的身份证校验,带校验位】 ++ (BOOL)ba_regularIsIdCardNumberQualified:(NSString *)idCardNumberStr +{ + idCardNumberStr = [idCardNumberStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + NSInteger length = 0; + if (!idCardNumberStr) + { + return NO; + } + else + { + length = idCardNumberStr.length; + if (length != 15 && length !=18) + { + return NO; + } + } + /*! 省份代码 */ + NSArray *areasArray =@[@"11", @"12", @"13", @"14", @"15", @"21", @"22", @"23", @"31", @"32", @"33", @"34", @"35", @"36", @"37", @"41", @"42", @"43", @"44", @"45", @"46", @"50", @"51", @"52", @"53", @"54", @"61", @"62", @"63", @"64", @"65", @"71", @"81", @"82", @"91"]; + + NSString *valueStart2 = [idCardNumberStr substringToIndex:2]; + BOOL areaFlag = NO; + for (NSString *areaCode in areasArray) + { + if ([areaCode isEqualToString:valueStart2]) + { + areaFlag =YES; + break; + } + } + if (!areaFlag) + { + return NO; + } + + NSRegularExpression *regularExpression; + NSUInteger numberofMatch; + + NSInteger year = 0; + switch (length) + { + case 15: + year = [idCardNumberStr substringWithRange:NSMakeRange(6,2)].intValue +1900; + + if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) + { + /*! 测试出生日期的合法性 */ + regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$" + options:NSRegularExpressionCaseInsensitive + error:nil]; + } + else + { + /*! 测试出生日期的合法性 */ + regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$" + options:NSRegularExpressionCaseInsensitive + error:nil]; + } + numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr + options:NSMatchingReportProgress + range:NSMakeRange(0, idCardNumberStr.length)]; + + if(numberofMatch > 0) + { + return YES; + } + else + { + return NO; + } + break; + case 18: + + year = [idCardNumberStr substringWithRange:NSMakeRange(6,4)].intValue; + if (year % 4 ==0 || (year % 100 ==0 && year % 4 ==0)) + { + /*! 测试出生日期的合法性 */ + regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$" + options:NSRegularExpressionCaseInsensitive + error:nil]; + } + else + { + /*! 测试出生日期的合法性 */ + regularExpression = [[NSRegularExpression alloc] initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$" + options:NSRegularExpressionCaseInsensitive + error:nil]; + } + numberofMatch = [regularExpression numberOfMatchesInString:idCardNumberStr + options:NSMatchingReportProgress + range:NSMakeRange(0, idCardNumberStr.length)]; + + if(numberofMatch > 0) + { + NSInteger S = ([idCardNumberStr substringWithRange:NSMakeRange(0,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([idCardNumberStr substringWithRange:NSMakeRange(1,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([idCardNumberStr substringWithRange:NSMakeRange(2,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([idCardNumberStr substringWithRange:NSMakeRange(3,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([idCardNumberStr substringWithRange:NSMakeRange(4,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([idCardNumberStr substringWithRange:NSMakeRange(5,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([idCardNumberStr substringWithRange:NSMakeRange(6,1)].intValue + [idCardNumberStr substringWithRange:NSMakeRange(16,1)].intValue) *2 + [idCardNumberStr substringWithRange:NSMakeRange(7,1)].intValue *1 + [idCardNumberStr substringWithRange:NSMakeRange(8,1)].intValue *6 + [idCardNumberStr substringWithRange:NSMakeRange(9,1)].intValue *3; + NSInteger Y = S % 11; + NSString *M = @"F"; + NSString *JYM = @"10X98765432"; + /*! 判断校验位 */ + M = [JYM substringWithRange:NSMakeRange(Y,1)]; + if ([M isEqualToString:[idCardNumberStr substringWithRange:NSMakeRange(17,1)]]) + { + /*! 检测ID的校验位 */ + return YES; + } + else + { + return NO; + } + + } + else + { + return NO; + } + break; + default: + return NO; + break; + } +} + +#pragma mark - ***** 验证IP地址(15位或18位数字) ++ (BOOL)ba_regularIsIPAddress:(NSString *)iPAddressStr +{ + NSString *pattern = @"((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:iPAddressStr options:0 range:NSMakeRange(0, iPAddressStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 验证输入的是否全为数字 ++ (BOOL)ba_regularIsAllNumber:(NSString *)allNumberStr +{ + NSString *pattern = @"^[0-9]*$"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:allNumberStr options:0 range:NSMakeRange(0, allNumberStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 验证由26个英文字母组成的字符串 ++ (BOOL)ba_regularIsEnglishAlphabet:(NSString *)englishAlphabetStr +{ + NSString *pattern = @"^[A-Za-z]+$"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:englishAlphabetStr options:0 range:NSMakeRange(0, englishAlphabetStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 验证输入的是否是URL地址 ++ (BOOL)ba_regularIsUrl:(NSString *)urlStr +{ +// NSString* verifyRules=@"^http://([\\w-]+\.)+[\\w-]+(/[\\w-./?%&=]*)?$"; +// NSPredicate *verifyRulesPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",verifyRules]; +// return [verifyRulesPre evaluateWithObject:urlStr]; + + NSString *pattern = @"\\b(([\\w-]+://?|www[.])[^\\s()<>]+(?:\\([\\w\\d]+\\)|([^[:punct:]\\s]|/)))"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:urlStr options:0 range:NSMakeRange(0, urlStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 验证输入的是否是中文 ++ (BOOL)ba_regularIsChinese:(NSString *)chineseStr +{ + NSString *pattern = @"[\u4e00-\u9fa5]+"; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:chineseStr options:0 range:NSMakeRange(0, chineseStr.length)]; + return results.count > 0; +} + +#pragma mark - ***** 验证输入的是否是高亮显示 ++ (BOOL)ba_regularIsNormalText:(NSString *)normalStr highLightText:(NSString *)highLightStr +{ + NSString *pattern = [NSString stringWithFormat:@"%@",highLightStr]; + NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil]; + NSArray *results = [regex matchesInString:normalStr options:0 range:NSMakeRange(0, normalStr.length)]; + for (NSTextCheckingResult *resltText in results) { + NSLog(@"----------------%zd",resltText.range.length); + } + return results.count > 0; +} + +#pragma mark - ***** 是否为常用用户名(根据自己需求改) ++ (BOOL)ba_regularIsUserNameInGeneral:(NSString *)userNameStr +{ + NSString* verifyRules = @"^[A-Za-z0-9]{8,20}+$"; + NSPredicate *verifyRulesPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",verifyRules]; + return [verifyRulesPre evaluateWithObject:userNameStr]; +} + +#pragma mark - ***** 车牌号验证 ++ (BOOL)ba_regularIsValidateCarNumber:(NSString *)carNumber +{ + /*! 车牌号:湘K-DE829 香港车牌号码:粤Z-J499港 */ + NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$"; + /*! 其中\u4e00-\u9fa5表示unicode编码中汉字已编码部分,\u9fa5-\u9fff是保留部分,将来可能会添加 */ + NSPredicate *catTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", carRegex]; + return [catTest evaluateWithObject:carNumber]; +} + +#pragma mark - ***** 车型验证 ++ (BOOL)ba_regularIsValidateCarType:(NSString *)CarType +{ + NSString *CarTypeRegex = @"^[\u4E00-\u9FFF]+$"; + NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",CarTypeRegex]; + return [carTest evaluateWithObject:CarType]; +} + +#pragma mark - ***** 昵称验证 ++ (BOOL)ba_regularIsValidateNickname:(NSString *)nickname +{ + NSString *nicknameRegex = @"^[\u4e00-\u9fa5]{4,8}$"; + NSPredicate *passWordPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",nicknameRegex]; + return [passWordPredicate evaluateWithObject:nickname]; +} + +#pragma mark - ***** 邮政编码验证 ++ (BOOL)ba_regularIsValidPostalcode:(NSString *)postalcode +{ + NSString *postalRegex = @"^[0-8]\\d{5}(?!\\d)$"; + NSPredicate *postalcodePredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",postalRegex]; + + return [postalcodePredicate evaluateWithObject:postalcode]; +} + +#pragma mark - ***** 工商税号验证 ++ (BOOL)ba_regularIsValidTaxNo:(NSString *)taxNo +{ + NSString *taxNoRegex = @"[0-9]\\d{13}([0-9]|X)$"; + NSPredicate *taxNoPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",taxNoRegex]; + + return [taxNoPredicate evaluateWithObject:taxNo]; +} + +#pragma mark - ***** Mac地址有效性验证 ++ (BOOL)ba_regularIsMacAddress:(NSString *)macAddress +{ + NSString *macAddRegex = @"([A-Fa-f\\d]{2}:){5}[A-Fa-f\\d]{2}"; + NSPredicate *macAddressPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",macAddRegex]; + + return [macAddressPredicate evaluateWithObject:macAddress]; +} + +/** 银行卡号有效性问题Luhn算法 + * 现行 16 位银联卡现行卡号开头 6 位是 622126~622925 之间的,7 到 15 位是银行自定义的, + * 可能是发卡分行,发卡网点,发卡序号,第 16 位是校验码。 + * 16 位卡号校验位采用 Luhm 校验方法计算: + * 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2 + * 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字 + * 3,将加法和加上校验位能被 10 整除。 + */ +#pragma mark - ***** 银行卡号有效性问题Luhn算法 ++ (BOOL)ba_regularIsBankCardlNumCheck:(NSString *)bankCardlNum +{ + NSString *lastNum = [[bankCardlNum substringFromIndex:(bankCardlNum.length-1)] copy];//取出最后一位 + NSString *forwardNum = [[bankCardlNum substringToIndex:(bankCardlNum.length -1)] copy];//前15或18位 + + NSMutableArray * forwardArr = [[NSMutableArray alloc] initWithCapacity:0]; + for (int i=0; i -1; i--) + {//前15位或者前18位倒序存进数组 + [forwardDescArr addObject:forwardArr[i]]; + } + + NSMutableArray * arrOddNum = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 < 9 + NSMutableArray * arrOddNum2 = [[NSMutableArray alloc] initWithCapacity:0];//奇数位*2的积 > 9 + NSMutableArray * arrEvenNum = [[NSMutableArray alloc] initWithCapacity:0];//偶数位数组 + + for (int i=0; i< forwardDescArr.count; i++) + { + NSInteger num = [forwardDescArr[i] intValue]; + if (i%2) + {//偶数位 + [arrEvenNum addObject:[NSNumber numberWithInteger:num]]; + } + else + {//奇数位 + if (num * 2 < 9) + { + [arrOddNum addObject:[NSNumber numberWithInteger:num * 2]]; + } + else + { + NSInteger decadeNum = (num * 2) / 10; + NSInteger unitNum = (num * 2) % 10; + [arrOddNum2 addObject:[NSNumber numberWithInteger:unitNum]]; + [arrOddNum2 addObject:[NSNumber numberWithInteger:decadeNum]]; + } + } + } + + __block NSInteger sumOddNumTotal = 0; + [arrOddNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { + sumOddNumTotal += [obj integerValue]; + }]; + + __block NSInteger sumOddNum2Total = 0; + [arrOddNum2 enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { + sumOddNum2Total += [obj integerValue]; + }]; + + __block NSInteger sumEvenNumTotal =0 ; + [arrEvenNum enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) { + sumEvenNumTotal += [obj integerValue]; + }]; + + NSInteger lastNumber = [lastNum integerValue]; + + NSInteger luhmTotal = lastNumber + sumEvenNumTotal + sumOddNum2Total + sumOddNumTotal; + + return (luhmTotal%10 ==0)?YES:NO; +} + +#pragma mark - ***** 判断字符串是否是字母或数字 ++ (BOOL)ba_regularIsLetterOrNumberString:(NSString *)string +{ + NSString *letterOrNumberRegex = @"[A-Z0-9a-z]+"; + NSPredicate *letterOrNumberTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", letterOrNumberRegex]; + return [letterOrNumberTest evaluateWithObject:string]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.h" index add2ed3..cea6000 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.h" @@ -13,23 +13,23 @@ typedef void (^IndexChangeBlock)(NSInteger index); typedef NSAttributedString *(^HMTitleFormatterBlock)(HMSegmentedControl *segmentedControl, NSString *title, NSUInteger index, BOOL selected); -typedef enum { +typedef NS_ENUM(NSInteger, HMSegmentedControlSelectionStyle) { HMSegmentedControlSelectionStyleTextWidthStripe, // Indicator width will only be as big as the text width HMSegmentedControlSelectionStyleFullWidthStripe, // Indicator width will fill the whole segment HMSegmentedControlSelectionStyleBox, // A rectangle that covers the whole segment HMSegmentedControlSelectionStyleArrow // An arrow in the middle of the segment pointing up or down depending on `HMSegmentedControlSelectionIndicatorLocation` -} HMSegmentedControlSelectionStyle; +}; -typedef enum { +typedef NS_ENUM(NSInteger, HMSegmentedControlSelectionIndicatorLocation) { HMSegmentedControlSelectionIndicatorLocationUp, HMSegmentedControlSelectionIndicatorLocationDown, HMSegmentedControlSelectionIndicatorLocationNone // No selection indicator -} HMSegmentedControlSelectionIndicatorLocation; +}; -typedef enum { +typedef NS_ENUM(NSInteger, HMSegmentedControlSegmentWidthStyle) { HMSegmentedControlSegmentWidthStyleFixed, // Segment width is fixed HMSegmentedControlSegmentWidthStyleDynamic, // Segment width will only be as big as the text width (including inset) -} HMSegmentedControlSegmentWidthStyle; +}; typedef NS_OPTIONS(NSInteger, HMSegmentedControlBorderType) { HMSegmentedControlBorderTypeNone = 0, @@ -43,17 +43,25 @@ enum { HMSegmentedControlNoSegment = -1 // Segment index for no selected segment }; -typedef enum { +typedef NS_ENUM(NSInteger, HMSegmentedControlType) { HMSegmentedControlTypeText, HMSegmentedControlTypeImages, HMSegmentedControlTypeTextImages -} HMSegmentedControlType; +}; + +typedef NS_ENUM(NSInteger, HMSegmentedControlImagePosition) { + HMSegmentedControlImagePositionBehindText, + HMSegmentedControlImagePositionLeftOfText, + HMSegmentedControlImagePositionRightOfText, + HMSegmentedControlImagePositionAboveText, + HMSegmentedControlImagePositionBelowText +}; @interface HMSegmentedControl : UIControl -@property (nonatomic, strong) NSArray *sectionTitles; -@property (nonatomic, strong) NSArray *sectionImages; -@property (nonatomic, strong) NSArray *sectionSelectedImages; +@property (nonatomic, strong) NSArray *sectionTitles; +@property (nonatomic, strong) NSArray *sectionImages; +@property (nonatomic, strong) NSArray *sectionSelectedImages; /** Provide a block to be executed when selected index is changed. @@ -89,12 +97,19 @@ typedef enum { @property (nonatomic, strong) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; /** - Color for the selection indicator stripe/box + Color for the selection indicator stripe Default is `R:52, G:181, B:229` */ @property (nonatomic, strong) UIColor *selectionIndicatorColor UI_APPEARANCE_SELECTOR; +/** + Color for the selection indicator box + + Default is selectionIndicatorColor + */ +@property (nonatomic, strong) UIColor *selectionIndicatorBoxColor UI_APPEARANCE_SELECTOR; + /** Color for the vertical divider between segments. @@ -151,6 +166,20 @@ typedef enum { */ @property (nonatomic, assign) HMSegmentedControlBorderType borderType; +/** + Specifies the image position relative to the text. Only applicable for HMSegmentedControlTypeTextImages + + Default is `HMSegmentedControlImagePositionBehindText` + */ +@property (nonatomic) HMSegmentedControlImagePosition imagePosition; + +/** + Specifies the distance between the text and the image. Only applicable for HMSegmentedControlTypeTextImages + + Default is `0,0` + */ +@property (nonatomic) CGFloat textImageSpacing; + /** Specifies the border color. @@ -180,6 +209,8 @@ typedef enum { */ @property(nonatomic, getter = isVerticalDividerEnabled) BOOL verticalDividerEnabled; +@property (nonatomic, getter=shouldStretchSegmentsToScreenSize) BOOL stretchSegmentsToScreenSize; + /** Index of the currently selected segment. */ @@ -214,14 +245,16 @@ typedef enum { */ @property (nonatomic, readwrite) UIEdgeInsets segmentEdgeInset; +@property (nonatomic, readwrite) UIEdgeInsets enlargeEdgeInset; + /** Default is YES. Set to NO to disable animation during user selection. */ @property (nonatomic) BOOL shouldAnimateUserSelection; -- (id)initWithSectionTitles:(NSArray *)sectiontitles; -- (id)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages; -- (instancetype)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages titlesForSections:(NSArray *)sectiontitles; +- (id)initWithSectionTitles:(NSArray *)sectiontitles; +- (id)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages; +- (instancetype)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages titlesForSections:(NSArray *)sectiontitles; - (void)setSelectedSegmentIndex:(NSUInteger)index animated:(BOOL)animated; - (void)setIndexChangeBlock:(IndexChangeBlock)indexChangeBlock; - (void)setTitleFormatter:(HMTitleFormatterBlock)titleFormatter; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.m" index c2895d1..6ea07df 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASegmentControl/HMSegmentedControl.m" @@ -19,14 +19,14 @@ @interface HMSegmentedControl () @property (nonatomic, strong) CALayer *selectionIndicatorBoxLayer; @property (nonatomic, strong) CALayer *selectionIndicatorArrowLayer; @property (nonatomic, readwrite) CGFloat segmentWidth; -@property (nonatomic, readwrite) NSArray *segmentWidthsArray; +@property (nonatomic, readwrite) NSArray *segmentWidthsArray; @property (nonatomic, strong) HMScrollView *scrollView; @end @implementation HMScrollView -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) { [self.nextResponder touchesBegan:touches withEvent:event]; } else { @@ -34,7 +34,7 @@ - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { } } -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if (!self.dragging) { [self.nextResponder touchesMoved:touches withEvent:event]; } else{ @@ -42,7 +42,7 @@ - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ } } -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (!self.dragging) { [self.nextResponder touchesEnded:touches withEvent:event]; } else { @@ -72,8 +72,8 @@ - (id)initWithFrame:(CGRect)frame { return self; } -- (id)initWithSectionTitles:(NSArray *)sectiontitles { - self = [self initWithFrame:CGRectZero]; +- (id)initWithSectionTitles:(NSArray *)sectiontitles { + self = [super initWithFrame:CGRectZero]; if (self) { [self commonInit]; @@ -84,7 +84,7 @@ - (id)initWithSectionTitles:(NSArray *)sectiontitles { return self; } -- (id)initWithSectionImages:(NSArray*)sectionImages sectionSelectedImages:(NSArray*)sectionSelectedImages { +- (id)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages { self = [super initWithFrame:CGRectZero]; if (self) { @@ -97,14 +97,14 @@ - (id)initWithSectionImages:(NSArray*)sectionImages sectionSelectedImages:(NSArr return self; } -- (instancetype)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages titlesForSections:(NSArray *)sectiontitles { +- (instancetype)initWithSectionImages:(NSArray *)sectionImages sectionSelectedImages:(NSArray *)sectionSelectedImages titlesForSections:(NSArray *)sectiontitles { self = [super initWithFrame:CGRectZero]; if (self) { [self commonInit]; if (sectionImages.count != sectiontitles.count) { - [NSException raise:NSRangeException format:@"***%s: Images bounds (%ld) Dont match Title bounds (%ld)", sel_getName(_cmd), (unsigned long)sectionImages.count, (unsigned long)sectiontitles.count]; + [NSException raise:NSRangeException format:@"***%s: Images bounds (%ld) Don't match Title bounds (%ld)", sel_getName(_cmd), (unsigned long)sectionImages.count, (unsigned long)sectiontitles.count]; } self.sectionImages = sectionImages; @@ -120,7 +120,6 @@ - (void)awakeFromNib { [super awakeFromNib]; self.segmentWidth = 0.0f; - [self commonInit]; } - (void)commonInit { @@ -133,7 +132,8 @@ - (void)commonInit { _backgroundColor = [UIColor whiteColor]; self.opaque = NO; _selectionIndicatorColor = [UIColor colorWithRed:52.0f/255.0f green:181.0f/255.0f blue:229.0f/255.0f alpha:1.0f]; - + _selectionIndicatorBoxColor = _selectionIndicatorColor; + self.selectedSegmentIndex = 0; self.segmentEdgeInset = UIEdgeInsetsMake(0, 5, 0, 5); self.selectionIndicatorHeight = 5.0f; @@ -174,16 +174,18 @@ - (void)setFrame:(CGRect)frame { [self updateSegmentsRects]; } -- (void)setSectionTitles:(NSArray *)sectionTitles { +- (void)setSectionTitles:(NSArray *)sectionTitles { _sectionTitles = sectionTitles; [self setNeedsLayout]; + [self setNeedsDisplay]; } -- (void)setSectionImages:(NSArray *)sectionImages { +- (void)setSectionImages:(NSArray *)sectionImages { _sectionImages = sectionImages; [self setNeedsLayout]; + [self setNeedsDisplay]; } - (void)setSelectionIndicatorLocation:(HMSegmentedControlSelectionIndicatorLocation)selectionIndicatorLocation { @@ -217,12 +219,18 @@ - (void)setBorderType:(HMSegmentedControlBorderType)borderType { #pragma mark - Drawing - (CGSize)measureTitleAtIndex:(NSUInteger)index { + if (index >= self.sectionTitles.count) { + return CGSizeZero; + } + id title = self.sectionTitles[index]; CGSize size = CGSizeZero; BOOL selected = (index == self.selectedSegmentIndex) ? YES : NO; if ([title isKindOfClass:[NSString class]] && !self.titleFormatter) { NSDictionary *titleAttrs = selected ? [self resultingSelectedTitleTextAttributes] : [self resultingTitleTextAttributes]; size = [(NSString *)title sizeWithAttributes:titleAttrs]; + UIFont *font = titleAttrs[@"NSFont"]; + size = CGSizeMake(ceil(size.width), ceil(size.height-font.descender)); } else if ([title isKindOfClass:[NSString class]] && self.titleFormatter) { size = [self.titleFormatter(self, title, index, selected) size]; } else if ([title isKindOfClass:[NSAttributedString class]]) { @@ -249,7 +257,7 @@ - (NSAttributedString *)attributedTitleAtIndex:(NSUInteger)index { if (titleColor) { NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:titleAttrs]; - dict[NSForegroundColorAttributeName] = (id)titleColor.CGColor; + dict[NSForegroundColorAttributeName] = titleColor; titleAttrs = [NSDictionary dictionaryWithDictionary:dict]; } @@ -268,8 +276,8 @@ - (void)drawRect:(CGRect)rect { self.selectionIndicatorStripLayer.backgroundColor = self.selectionIndicatorColor.CGColor; - self.selectionIndicatorBoxLayer.backgroundColor = self.selectionIndicatorColor.CGColor; - self.selectionIndicatorBoxLayer.borderColor = self.selectionIndicatorColor.CGColor; + self.selectionIndicatorBoxLayer.backgroundColor = self.selectionIndicatorBoxColor.CGColor; + self.selectionIndicatorBoxLayer.borderColor = self.selectionIndicatorBoxColor.CGColor; // Remove all sublayers to avoid drawing images over existing ones self.scrollView.layer.sublayers = nil; @@ -284,7 +292,8 @@ - (void)drawRect:(CGRect)rect { CGSize size = [self measureTitleAtIndex:idx]; stringWidth = size.width; stringHeight = size.height; - CGRect rectDiv, fullRect; + CGRect rectDiv = CGRectZero; + CGRect fullRect = CGRectZero; // Text inside the CATextLayer will appear blurry unless the rect values are rounded BOOL locationUp = (self.selectionIndicatorLocation == HMSegmentedControlSelectionIndicatorLocationUp); @@ -296,7 +305,7 @@ - (void)drawRect:(CGRect)rect { rect = CGRectMake((self.segmentWidth * idx) + (self.segmentWidth - stringWidth) / 2, y, stringWidth, stringHeight); rectDiv = CGRectMake((self.segmentWidth * idx) - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 5, self.verticalDividerWidth, self.frame.size.height - (self.selectionIndicatorHeight * 10)); fullRect = CGRectMake(self.segmentWidth * idx, 0, self.segmentWidth, oldRect.size.height); - } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { + } else { // When we are drawing dynamic widths, we need to loop the widths array to calculate the xOffset CGFloat xOffset = 0; NSInteger i = 0; @@ -319,7 +328,9 @@ - (void)drawRect:(CGRect)rect { CATextLayer *titleLayer = [CATextLayer layer]; titleLayer.frame = rect; titleLayer.alignmentMode = kCAAlignmentCenter; - titleLayer.truncationMode = kCATruncationEnd; + if ([UIDevice currentDevice].systemVersion.floatValue < 10.0 ) { + titleLayer.truncationMode = kCATruncationEnd; + } titleLayer.string = [self attributedTitleAtIndex:idx]; titleLayer.contentsScale = [[UIScreen mainScreen] scale]; @@ -363,7 +374,7 @@ - (void)drawRect:(CGRect)rect { // Vertical Divider if (self.isVerticalDividerEnabled && idx>0) { CALayer *verticalDividerLayer = [CALayer layer]; - verticalDividerLayer.frame = CGRectMake((self.segmentWidth * idx) - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 5, self.verticalDividerWidth, self.frame.size.height-(self.selectionIndicatorHeight * 10)); + verticalDividerLayer.frame = CGRectMake((self.segmentWidth * idx) - (self.verticalDividerWidth / 2), self.selectionIndicatorHeight * 2, self.verticalDividerWidth, self.frame.size.height-(self.selectionIndicatorHeight * 4)); verticalDividerLayer.backgroundColor = self.verticalDividerColor.CGColor; [self.scrollView.layer addSublayer:verticalDividerLayer]; @@ -377,17 +388,40 @@ - (void)drawRect:(CGRect)rect { CGFloat imageWidth = icon.size.width; CGFloat imageHeight = icon.size.height; - CGFloat stringHeight = [self measureTitleAtIndex:idx].height; - CGFloat yOffset = roundf(((CGRectGetHeight(self.frame) - self.selectionIndicatorHeight) / 2) - (stringHeight / 2)); + CGSize stringSize = [self measureTitleAtIndex:idx]; + CGFloat stringHeight = stringSize.height; + CGFloat stringWidth = stringSize.width; + + CGFloat imageXOffset = self.segmentWidth * idx; // Start with edge inset + CGFloat textXOffset = self.segmentWidth * idx; + CGFloat imageYOffset = ceilf((self.frame.size.height - imageHeight) / 2.0); // Start in center + CGFloat textYOffset = ceilf((self.frame.size.height - stringHeight) / 2.0); - CGFloat imageXOffset = self.segmentEdgeInset.left; // Start with edge inset - CGFloat textXOffset = self.segmentEdgeInset.left; - CGFloat textWidth = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { - imageXOffset = (self.segmentWidth * idx) + (self.segmentWidth / 2.0f) - (imageWidth / 2.0f); - textXOffset = self.segmentWidth * idx; - textWidth = self.segmentWidth; + BOOL isImageInLineWidthText = self.imagePosition == HMSegmentedControlImagePositionLeftOfText || self.imagePosition == HMSegmentedControlImagePositionRightOfText; + if (isImageInLineWidthText) { + CGFloat whitespace = self.segmentWidth - stringSize.width - imageWidth - self.textImageSpacing; + if (self.imagePosition == HMSegmentedControlImagePositionLeftOfText) { + imageXOffset += whitespace / 2.0; + textXOffset = imageXOffset + imageWidth + self.textImageSpacing; + } else { + textXOffset += whitespace / 2.0; + imageXOffset = textXOffset + stringWidth + self.textImageSpacing; + } + } else { + imageXOffset = self.segmentWidth * idx + (self.segmentWidth - imageWidth) / 2.0f; // Start with edge inset + textXOffset = self.segmentWidth * idx + (self.segmentWidth - stringWidth) / 2.0f; + + CGFloat whitespace = CGRectGetHeight(self.frame) - imageHeight - stringHeight - self.textImageSpacing; + if (self.imagePosition == HMSegmentedControlImagePositionAboveText) { + imageYOffset = ceilf(whitespace / 2.0); + textYOffset = imageYOffset + imageHeight + self.textImageSpacing; + } else if (self.imagePosition == HMSegmentedControlImagePositionBelowText) { + textYOffset = ceilf(whitespace / 2.0); + imageYOffset = textYOffset + stringHeight + self.textImageSpacing; + } + } } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { // When we are drawing dynamic widths, we need to loop the widths array to calculate the xOffset CGFloat xOffset = 0; @@ -402,24 +436,40 @@ - (void)drawRect:(CGRect)rect { i++; } - imageXOffset = xOffset + ([self.segmentWidthsArray[idx] floatValue] / 2.0f) - (imageWidth / 2.0f); //(self.segmentWidth / 2.0f) - (imageWidth / 2.0f) - textXOffset = xOffset; - textWidth = [self.segmentWidthsArray[idx] floatValue]; + BOOL isImageInLineWidthText = self.imagePosition == HMSegmentedControlImagePositionLeftOfText || self.imagePosition == HMSegmentedControlImagePositionRightOfText; + if (isImageInLineWidthText) { + if (self.imagePosition == HMSegmentedControlImagePositionLeftOfText) { + imageXOffset = xOffset; + textXOffset = imageXOffset + imageWidth + self.textImageSpacing; + } else { + textXOffset = xOffset; + imageXOffset = textXOffset + stringWidth + self.textImageSpacing; + } + } else { + imageXOffset = xOffset + ([self.segmentWidthsArray[i] floatValue] - imageWidth) / 2.0f; // Start with edge inset + textXOffset = xOffset + ([self.segmentWidthsArray[i] floatValue] - stringWidth) / 2.0f; + + CGFloat whitespace = CGRectGetHeight(self.frame) - imageHeight - stringHeight - self.textImageSpacing; + if (self.imagePosition == HMSegmentedControlImagePositionAboveText) { + imageYOffset = ceilf(whitespace / 2.0); + textYOffset = imageYOffset + imageHeight + self.textImageSpacing; + } else if (self.imagePosition == HMSegmentedControlImagePositionBelowText) { + textYOffset = ceilf(whitespace / 2.0); + imageYOffset = textYOffset + stringHeight + self.textImageSpacing; + } + } } - CGFloat imageYOffset = roundf((CGRectGetHeight(self.frame) - self.selectionIndicatorHeight) / 2.0f); CGRect imageRect = CGRectMake(imageXOffset, imageYOffset, imageWidth, imageHeight); - CGRect textRect = CGRectMake(textXOffset, yOffset, textWidth, stringHeight); - - // Fix rect position/size to avoid blurry labels - textRect = CGRectMake(ceilf(textRect.origin.x), ceilf(textRect.origin.y), ceilf(textRect.size.width), ceilf(textRect.size.height)); + CGRect textRect = CGRectMake(ceilf(textXOffset), ceilf(textYOffset), ceilf(stringWidth), ceilf(stringHeight)); CATextLayer *titleLayer = [CATextLayer layer]; titleLayer.frame = textRect; titleLayer.alignmentMode = kCAAlignmentCenter; titleLayer.string = [self attributedTitleAtIndex:idx]; - titleLayer.truncationMode = kCATruncationEnd; - + if ([UIDevice currentDevice].systemVersion.floatValue < 10.0 ) { + titleLayer.truncationMode = kCATruncationEnd; + } CALayer *imageLayer = [CALayer layer]; imageLayer.frame = imageRect; @@ -467,7 +517,7 @@ - (void)addBackgroundAndBorderLayerWithRect:(CGRect)fullRect { // Background layer CALayer *backgroundLayer = [CALayer layer]; backgroundLayer.frame = fullRect; - [self.scrollView.layer insertSublayer:backgroundLayer atIndex:0]; + [self.layer insertSublayer:backgroundLayer atIndex:0]; // Border layer if (self.borderType & HMSegmentedControlBorderTypeTop) { @@ -625,11 +675,23 @@ - (void)updateSegmentsRects { }]; } else if (self.type == HMSegmentedControlTypeText && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { NSMutableArray *mutableSegmentWidths = [NSMutableArray array]; - + __block CGFloat totalWidth = 0.0; + [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; + totalWidth += stringWidth; [mutableSegmentWidths addObject:[NSNumber numberWithFloat:stringWidth]]; }]; + + if (self.shouldStretchSegmentsToScreenSize && totalWidth < self.bounds.size.width) { + CGFloat whitespace = self.bounds.size.width - totalWidth; + CGFloat whitespaceForSegment = whitespace / [mutableSegmentWidths count]; + [mutableSegmentWidths enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + CGFloat extendedWidth = whitespaceForSegment + [obj floatValue]; + [mutableSegmentWidths replaceObjectAtIndex:idx withObject:[NSNumber numberWithFloat:extendedWidth]]; + }]; + } + self.segmentWidthsArray = [mutableSegmentWidths copy]; } else if (self.type == HMSegmentedControlTypeImages) { for (UIImage *sectionImage in self.sectionImages) { @@ -642,8 +704,9 @@ - (void)updateSegmentsRects { CGFloat stringWidth = [self measureTitleAtIndex:idx].width + self.segmentEdgeInset.left + self.segmentEdgeInset.right; self.segmentWidth = MAX(stringWidth, self.segmentWidth); }]; - } else if (self.type == HMSegmentedControlTypeTextImages && HMSegmentedControlSegmentWidthStyleDynamic) { + } else if (self.type == HMSegmentedControlTypeTextImages && self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { NSMutableArray *mutableSegmentWidths = [NSMutableArray array]; + __block CGFloat totalWidth = 0.0; int i = 0; [self.sectionTitles enumerateObjectsUsingBlock:^(id titleString, NSUInteger idx, BOOL *stop) { @@ -651,10 +714,27 @@ - (void)updateSegmentsRects { UIImage *sectionImage = [self.sectionImages objectAtIndex:i]; CGFloat imageWidth = sectionImage.size.width + self.segmentEdgeInset.left; - CGFloat combinedWidth = MAX(imageWidth, stringWidth); + CGFloat combinedWidth = 0.0; + if (self.imagePosition == HMSegmentedControlImagePositionLeftOfText || self.imagePosition == HMSegmentedControlImagePositionRightOfText) { + combinedWidth = imageWidth + stringWidth + self.textImageSpacing; + } else { + combinedWidth = MAX(imageWidth, stringWidth); + } + + totalWidth += combinedWidth; [mutableSegmentWidths addObject:[NSNumber numberWithFloat:combinedWidth]]; }]; + + if (self.shouldStretchSegmentsToScreenSize && totalWidth < self.bounds.size.width) { + CGFloat whitespace = self.bounds.size.width - totalWidth; + CGFloat whitespaceForSegment = whitespace / [mutableSegmentWidths count]; + [mutableSegmentWidths enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + CGFloat extendedWidth = whitespaceForSegment + [obj floatValue]; + [mutableSegmentWidths replaceObjectAtIndex:idx withObject:[NSNumber numberWithFloat:extendedWidth]]; + }]; + } + self.segmentWidthsArray = [mutableSegmentWidths copy]; } @@ -685,11 +765,16 @@ - (void)willMoveToSuperview:(UIView *)newSuperview { #pragma mark - Touch -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [touches anyObject]; CGPoint touchLocation = [touch locationInView:self]; - if (CGRectContainsPoint(self.bounds, touchLocation)) { + CGRect enlargeRect = CGRectMake(self.bounds.origin.x - self.enlargeEdgeInset.left, + self.bounds.origin.y - self.enlargeEdgeInset.top, + self.bounds.size.width + self.enlargeEdgeInset.left + self.enlargeEdgeInset.right, + self.bounds.size.height + self.enlargeEdgeInset.top + self.enlargeEdgeInset.bottom); + + if (CGRectContainsPoint(enlargeRect, touchLocation)) { NSInteger segment = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { segment = (touchLocation.x + self.scrollView.contentOffset.x) / self.segmentWidth; @@ -736,7 +821,7 @@ - (CGFloat)totalSegmentedControlWidth { } - (void)scrollToSelectedSegmentIndex:(BOOL)animated { - CGRect rectForSelectedIndex; + CGRect rectForSelectedIndex = CGRectZero; CGFloat selectedSegmentOffset = 0; if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleFixed) { rectForSelectedIndex = CGRectMake(self.segmentWidth * self.selectedSegmentIndex, @@ -745,7 +830,7 @@ - (void)scrollToSelectedSegmentIndex:(BOOL)animated { self.frame.size.height); selectedSegmentOffset = (CGRectGetWidth(self.frame) / 2) - (self.segmentWidth / 2); - } else if (self.segmentWidthStyle == HMSegmentedControlSegmentWidthStyleDynamic) { + } else { NSInteger i = 0; CGFloat offsetter = 0; for (NSNumber *width in self.segmentWidthsArray) { diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.h" deleted file mode 100755 index e3d971b..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.h" +++ /dev/null @@ -1,47 +0,0 @@ -// -// BAShareAnimationView.h -// yrapp -// -// Created by 博爱 on 16/2/3. -// Copyright © 2016年 有人科技. All rights reserved. -// - -#import - -// 选择位置 -typedef void (^CLBlock)(NSInteger index,id shareType); - -// 选择按钮 -typedef void(^CLBtnBlock)(UIButton *btn); - -@interface BAShareAnimationView : UIView - -@property (nonatomic,copy) CLBlock block; -@property (nonatomic,copy) CLBtnBlock btnBlock; - -/*! - * 初始化动画视图 - * - * @param titlearray title数组 - * @param picarray 图标数组 - * - * @return id - */ -- (id)initWithTitleArray:(NSArray *)titlearray picarray:(NSArray *)picarray title:(NSString *)title; - -/*! - * 视图展示 - */ -- (void)show; - -/*! - * 选中的index - */ -- (void)selectedWithIndex:(CLBlock)block; - -/*! - * 按钮block - */ -- (void)CLBtnBlock:(CLBtnBlock)block; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.m" deleted file mode 100755 index e25b7b3..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareAnimationView.m" +++ /dev/null @@ -1,161 +0,0 @@ -// -// BAShareAnimationView.m -// yrapp -// -// Created by 博爱 on 16/2/3. -// Copyright © 2016年 有人科技. All rights reserved. -// - -#import "BAShareAnimationView.h" -#import "BAShareManageView.h" -#import "UMSocial.h" - - -#define HH 155 -#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width -#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height - - -@interface BAShareAnimationView () -{ - UIPageControl *pageShow ; -} -@property (nonatomic,strong) UIView *largeView; -@property (nonatomic) CGFloat count; -@property (nonatomic,strong) UIButton *chooseBtn; -@property (nonatomic,strong) UILabel *titleLabel; - -@end - -@implementation BAShareAnimationView - - -- (id)initWithTitleArray:(NSArray *)titlearray picarray:(NSArray *)picarray title:(NSString *)title -{ - BA_Weak; - self = [super init]; - if (self) { - self.frame = [UIScreen mainScreen].bounds; - self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.1]; - self.largeView = [[UIView alloc]init]; - [_largeView setFrame:CGRectMake(0, SCREENHEIGHT ,SCREENWIDTH,HH)]; - [_largeView setBackgroundColor:[UIColor colorWithRed:240.0/255.0 green:240.0/255.0 blue:240.0/255.0 alpha:1.0]]; - [self addSubview:_largeView]; - - __weak typeof (self) selfBlock = self; - - _titleLabel = [UILabel new]; - _titleLabel.frame = CGRectMake(0, 0, SCREENWIDTH, 20); - _titleLabel.text = title; - _titleLabel.textAlignment = NSTextAlignmentCenter; - _titleLabel.font = [UIFont systemFontOfSize:18]; - [_largeView addSubview:_titleLabel]; - - _chooseBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, HH - 40, SCREENWIDTH, 40)]; - [_chooseBtn setTitle:@"取消" forState:UIControlStateNormal]; - [_chooseBtn setBackgroundColor:[UIColor whiteColor]]; - [_chooseBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_chooseBtn addTarget:self action:@selector(chooseBtnClick:) forControlEvents:UIControlEventTouchUpInside]; - [self.largeView addSubview:_chooseBtn]; - - UIScrollView *scroll = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 25, SCREENWIDTH, 90)]; - scroll.contentSize = CGSizeMake((titlearray.count +3)/4*SCREENWIDTH, 0); - scroll.bounces = NO; - scroll.pagingEnabled = YES; - scroll.delegate = self; - scroll.showsHorizontalScrollIndicator = NO; - scroll.showsVerticalScrollIndicator = NO; - [_largeView addSubview:scroll]; - - - pageShow = [[UIPageControl alloc]initWithFrame:CGRectMake(0, 25, 60, 20)]; - pageShow.currentPageIndicatorTintColor = [UIColor grayColor]; - pageShow.pageIndicatorTintColor = [UIColor lightGrayColor]; - pageShow.numberOfPages = (titlearray.count +3)/4; - pageShow.center = CGPointMake(SCREENWIDTH/2, 100); - [_largeView addSubview:pageShow]; - - for (int i = 0; i < titlearray.count; i ++) { - BAShareManageView *rr = [[BAShareManageView alloc]initWithFrame:CGRectMake(i *(SCREENWIDTH / 4), 40, SCREENWIDTH/4, 90)]; - rr.tag = 10 + i; - rr.sheetBtn.tag = i + 1; - [rr.sheetBtn setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@",picarray[i]]] forState:UIControlStateNormal]; - [rr.sheetLab setText:[NSString stringWithFormat:@"%@",titlearray[i]]]; - - [rr selectedIndex:^(NSInteger index, UILabel *sheetLab,id shareType) { - [weakSelf dismiss]; - weakSelf.block(index,shareType); - - }]; - - [scroll addSubview:rr]; - } - - UITapGestureRecognizer *dismissTap = [[UITapGestureRecognizer alloc]initWithTarget:selfBlock action:@selector(dismiss)]; - [selfBlock addGestureRecognizer:dismissTap]; - } - return self; -} - -- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView -{ - pageShow.currentPage = scrollView.contentOffset.x/SCREENWIDTH; -} - -- (void)selectedWithIndex:(CLBlock)block -{ - self.block = block; -} - -- (void)CLBtnBlock:(CLBtnBlock)block -{ - self.btnBlock = block; -} - -- (void)chooseBtnClick:(UIButton *)sender -{ - self.btnBlock(sender); - [self dismiss]; -} - --(void)show -{ - UIWindow *window = [[UIApplication sharedApplication].windows firstObject]; - [window addSubview:self]; - - BA_Weak; - [UIView animateWithDuration:0.2 animations:^{ - [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; - _largeView.transform = CGAffineTransformMakeTranslation(0, - HH); - for (int i = 0; i < 6; i ++) { - - CGPoint CLCenterPoint = CGPointMake(SCREENWIDTH/4* i + (SCREENWIDTH/8), 45); - - BAShareManageView *rr = (BAShareManageView *)[weakSelf viewWithTag:10 + i]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(i*0.03 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [UIView animateWithDuration:1.0 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0.8 options:UIViewAnimationOptionCurveEaseOut animations:^{ - rr.center = CLCenterPoint; - } completion:nil]; - }); - } - - } completion:^(BOOL finished) { - - BALog(@"所有动画之行完毕"); - }]; -} - -- (void)tap:(UITapGestureRecognizer *)tapG { - [self dismiss]; -} - -- (void)dismiss { - BA_Weak; - [UIView animateWithDuration:0 animations:^{ - [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; - _largeView.transform = CGAffineTransformIdentity; - } completion:^(BOOL finished) { - [weakSelf removeFromSuperview]; - }]; -} -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.h" index cd77cf3..79d90e8 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.h" @@ -1,90 +1,256 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' // -// ShareManage.h -// yrapp -// -// Created by 博爱 on 16/2/3. -// Copyright © 2016年 有人科技. All rights reserved. -// 友盟分享工具类 +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + + +/*! + + 最新更新时间:2016-12-06 【倒叙】 + 最新Version:【Version:2.1 基于友盟 6.1.0 版本封装】 + 更新内容: + 2.1.1、优化方法名命名规范 + 2.1.2、优化 分享类型选择枚举,可以随意配置分享类型 + 2.1.3、优化 全部软件安装判断方法 + 2.1.4、新增友盟自带 UI 界面更清新! + + 最新更新时间:2016-11-17 【倒叙】 + 最新Version:【Version:2.0】 + 更新内容: + 2.0.1、优化方法名命名规范 + 2.0.2、新增 分享类型选择,可以单独选择分享类型 + 2.0.3、新增 软件安装判断,如果没有安装就不显示 + 2.0.4、新增 友盟登录封装,返回用户信息代理更详细 + */ #import -#import +#import +#import -#define BASHAREMANAGER [BAShareManage shareManage] +#define BASHAREMANAGER [BAShareManage ba_shareManage] -@protocol BAShareManageDelegate +/*! 友盟分享 SDK:接入自己项目时需要更改各个属性值 */ +#define BA_Umeng_Appkey @"56f217d467e58e513a000434" +#define BA_Sina_AppKey @"2447331824" +#define BA_SinaAppSecret @"4ee72cf1958fa92b88570d1b99328718" +#define BA_WX_APPKEY @"wx19d8c52e02fa7556" +#define BA_WX_APPSECRET @"90eeb0c9ef2a1c99fb473890809f7f19" +#define BA_QQKey @"wrGGgg89e0lqqoXT" +#define BA_QQAppID @"1105285308" -/*! 返回用户信息 */ -- (void)getUserData:(NSDictionary *)backUserData; +typedef NS_ENUM(NSUInteger, BAUM_SHARE_TYPE) +{ + /*! 纯文本 */ + BAUM_SHARE_TYPE_TEXT = 1, + + /*! 纯图片:本地图片 */ + BAUM_SHARE_TYPE_IMAGE, + + /*! 纯图片:网络图片 URL */ + BAUM_SHARE_TYPE_IMAGE_URL, + + /*! 网页:一般的分享是这种,title、content、缩略图、URL */ + BAUM_SHARE_TYPE_WEB_LINK, -@end + /*! 文本 + 图片 【暂时只对新浪分享有效】 */ + BAUM_SHARE_TYPE_TEXT_IMAGE, + + /*! 音乐 */ + BAUM_SHARE_TYPE_MUSIC_LINK, + + /*! 视频 */ + BAUM_SHARE_TYPE_VIDEO_LINK, -@interface BAShareManage : NSObject + /*! gif 动图【注:目前只有微信支持动图分享,其他平台均不支持】*/ + BAUM_SHARE_TYPE_GIF, -/** 登录后返回的数据 **/ -@property (nonatomic, weak) id delegate; + /*! 文件【注:目前只有微信支持动图分享,其他平台均不支持】 */ + BAUM_SHARE_TYPE_FILE +}; + +/*! 登录后返回的数据回调 */ +typedef void (^BAUMLoginCallback)(UMSocialUserInfoResponse *response); + +@interface BAShareManage : NSObject + +/*! 登录后返回的数据回调 */ +@property (nonatomic, copy) BAUMLoginCallback loginCallback; + +/*! 分享类型 */ +@property (nonatomic, assign) BAUM_SHARE_TYPE shareType; + +/*! 分享标题 */ +@property (nonatomic, strong) NSString *shareTitle; +/*! 分享摘要 */ +@property (nonatomic, strong) NSString *shareText; +/*! 分享缩略图【如果有缩略图,则设置缩略图 可为本地 imageName 或者 URL】 */ +//@property (nonatomic, strong) NSString *shareThumbImage; +/*! 分享大图【本地 imageName】】 */ +@property (nonatomic, strong) NSString *shareBigImage; +/*! 分享 URL 图片 */ +@property (nonatomic, strong) NSString *shareImageUrl; +/*! 分享网页 */ +@property (nonatomic, strong) NSString *shareWebpageUrl; +/*! 分享音乐 URL【必传】 */ +@property (nonatomic, strong) NSString *shareMusicUrl; +/*! 分享音乐 DataUrl */ +@property (nonatomic, strong) NSString *shareMusicDataUrl; +/*! 分享视频 URL */ +@property (nonatomic, strong) NSString *shareVideoUrl; +/*! 分享 gif 动图路径 */ +@property (nonatomic, strong) NSString *shareGifFilePath; +/*! 分享文件路径 */ +@property (nonatomic, strong) NSString *shareFileFilePath; +/*! 分享文件后缀类型 */ +@property (nonatomic, strong) NSString *shareFileFileExtension; + +/*! 授权回调 */ +@property (nonatomic, strong) void (^authOpFinish)(); /*! * 友盟分享工具类封装 * * @return 返回:友盟分享工具类封装的实例 */ -+ (BAShareManage *)shareManage; ++ (BAShareManage *)ba_shareManage; /*! * 友盟分享设置 */ -- (void)ba_shareConfig; +- (void)ba_setupShareConfig; -#pragma mark - ***** 友盟分享 -/*! 微信分享 */ -- (void)BA_wxShareWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage url:(NSString *)shareURLString; +/*! + * 判断平台是否安装 + * + * @param platformType 平台类型 @see UMSocialPlatformType + * + * @return YES 代表安装,NO 代表未安装 + * @note 在判断QQ空间的App的时候,QQApi判断会出问题 + */ +- (BOOL)ba_UMSocialIsInstall:(UMSocialPlatformType)platformType; -/*! 微信朋友圈分享 */ -- (void)BA_wxpyqShareWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage url:shareURLString; +#pragma mark - 友盟分享 version 2.1 +/*! 微信分享 */ +#pragma mark 微信分享 version 2.1 +- (void)ba_wechatShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; -/*! 新浪微博分享 */ -- (void)BA_wbShareWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage; +#pragma mark 微信朋友圈分享 version 2.1 +- (void)ba_wechatTimeLineShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; -/*! qq分享 */ -- (void)BA_qqShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString; +#pragma mark 新浪微博分享 version 2.1 +- (void)ba_sinaShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; -/*! qqzone分享 */ -- (void)BA_qqzoneShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString; +#pragma mark qq分享 version 2.1 +- (void)ba_qqShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; -/*! 短信分享 */ -- (void)BA_smsShareWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage; +#pragma mark Qzone分享 version 2.1 +- (void)ba_qZoneShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; +#pragma mark - 博爱友盟分享列表 version 2.1 /*! - * 友盟分享列表 + * 博爱友盟分享列表 version 2.1 * - * @param viewC viewC - * @param shareText shareText - * @param shareImage shareImage - * @param shareURLString shareURLString + * @param shareType 分享类型,具体看枚举 + * @param viewController viewController */ -- (void)BA_UMshareListWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage url:(NSString *)shareURLString; - +- (void)ba_shareListWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController; -#pragma mark - ***** 友盟登录 -/*!友盟 QQ 登录 */ -- (void)BA_QQLogin:(UIViewController *)viewController; +#pragma mark - 友盟登录 +#pragma mark 微信登录 version 2.1 +- (void)ba_wechatLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback; -/*!友盟 Qzone 登录 */ -- (void)BA_QzoneLogin:(UIViewController *)viewController; +#pragma mark QQ登录 version 2.1 +- (void)ba_qqLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback; -/*!友盟 新浪微博登录 */ -- (void)BA_SinaLogin:(UIViewController *)viewController; -/*!删除新浪微博登陆授权调用下面的方法 */ -- (void)deleteSinaLogin; +#pragma mark QQZone登录 version 2.1 +- (void)ba_qZoneLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback; -/*!友盟 微信 登录 */ -- (void)BA_WechatSessionLogin:(UIViewController *)viewController; +#pragma mark 微博登录 version 2.1 +- (void)ba_sinaLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback; +#pragma mark - 友盟登录列表 version 2.1 /*! - * 友盟登录列表 + * 友盟登录列表 version 2.1 * - * @param viewController viewController + * @param viewController viewController description + * @param isGetAuthWithUserInfo + YES:授权并获取用户信息(获取uid、access token及用户名等) + NO:只需获取第三方平台token和uid,不获取用户名等用户信息,可以调用以下接口 + * @param loginCallback 登录后返回的数据回调 */ -- (void)BA_UMLoginListWithViewControll:(UIViewController *)viewController; +- (void)ba_loginListWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback; + +#pragma mark - 清除授权 +- (void)ba_cancelAuthWithPlatformType:(UMSocialPlatformType)platformType; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.m" index 6fed667..654ff15 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManage.m" @@ -8,524 +8,1401 @@ #import "BAShareManage.h" -#import "UMSocial.h" -#import "UMSocialWechatHandler.h" -#import "WXApi.h" -#import "BAShareAnimationView.h" -#import "UMSocialQQHandler.h" -#import "UMSocialSinaSSOHandler.h" - -@implementation BAShareManage { - UIViewController *_viewC; -} +//#import "BAShareAnimationView.h" + + +#define BAUMSocialManager [UMSocialManager defaultManager] +#define BAUMSocialShareUIConfig [UMSocialShareUIConfig shareInstance] + +@interface BAShareManage() + +@property (nonatomic, strong) UMSocialUserInfoResponse *responseDic; + +@end -static BAShareManage *shareManage; +@implementation BAShareManage -+ (BAShareManage *)shareManage ++ (BAShareManage *)ba_shareManage { + static BAShareManage *ba_shareManage; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - shareManage = [[BAShareManage alloc] init]; + ba_shareManage = [[BAShareManage alloc] init]; }); - return shareManage; + return ba_shareManage; } -#pragma mark - 友盟分享 -#pragma mark 注册友盟分享微信 -- (void)ba_shareConfig +#pragma mark - 判断平台是否安装 +- (BOOL)ba_UMSocialIsInstall:(UMSocialPlatformType)platformType { - //设置友盟社会化组件appkey -// [UMSocialData setAppKey:BA_Umeng_Appkey]; -// [UMSocialData openLog:YES]; -// -// //注册微信 -// [WXApi registerApp:BA_WX_APPKEY]; -// //设置图文分享 -// [UMSocialData defaultData].extConfig.wxMessageType = UMSocialWXMessageTypeWeb; - - - // ************* 友盟分享 ************* - [UMSocialData setAppKey:BA_Umeng_Appkey]; - // 打开调试log的开关 - [UMSocialData openLog:NO]; - - // 如果你要支持不同的屏幕方向,需要这样设置,否则在iPhone只支持一个竖屏方向 - [UMSocialConfig setSupportedInterfaceOrientations:UIInterfaceOrientationMaskPortrait]; - - /*苹果审核要求,隐藏未安装的应用 的分享选项 */ - [UMSocialConfig hiddenNotInstallPlatforms:@[UMShareToSina, UMShareToQQ, UMShareToQzone, UMShareToWechatSession, UMShareToWechatTimeline]]; - - // 打开新浪微博的SSO开关 - // 将在新浪微博注册的应用appkey、redirectURL替换下面参数,并在info.plist的URL Scheme中相应添加wb+appkey,如"wb3112175844",详情请参考官方文档。 - [UMSocialSinaSSOHandler openNewSinaSSOWithAppKey:BA_Sina_AppKey - RedirectURL:@"http://sns.whalecloud.com/sin"]; - // 添加微信分享授权 - // 设置微信AppId、appSecret,分享url - [UMSocialWechatHandler setWXAppId:BA_WX_APPKEY appSecret:BA_WX_APPSECRET url:@"https://www.baidu.com"]; - - // 设置分享到QQ空间的应用Id,和分享url 链接 - [UMSocialQQHandler setQQWithAppId:BA_QQAppID appKey:BA_QQKey url:@"https://www.baidu.com"]; - // 设置支持没有客户端情况下使用SSO授权 - [UMSocialQQHandler setSupportWebView:YES]; - - /*! 这段代码是用友盟自带的自定义分享的时候打开! */ -// UMSocialSnsPlatform *copyPlatform = [[UMSocialSnsPlatform alloc] initWithPlatformName:@"copy"]; -// copyPlatform.displayName = @"复制"; -// copyPlatform.smallImageName = @"icon"; //用于tableView样式的分享列表 -// copyPlatform.bigImageName = @"icon"; //用于actionsheet样式的分享列表 -// copyPlatform.snsClickHandler = ^(UIViewController *presentingController, UMSocialControllerService * socialControllerService, BOOL isPresentInController){ NSLog(@"copy!"); }; [UMSocialConfig addSocialSnsPlatform:@[copyPlatform]]; [UMSocialConfig setSnsPlatformNames:@[UMShareToSina, UMShareToWechatSession, UMShareToWechatTimeline, UMShareToQQ, UMShareToQzone]]; + return [BAUMSocialManager isInstall:platformType]; } -#pragma mark 微信分享 -- (void)BA_wxShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString +#pragma mark - share type +#pragma mark 分享纯文本 +- (void)ba_shareTextToPlatformType:(UMSocialPlatformType)platformType + shareText:(NSString *)shareText + viewController:(UIViewController *)viewController { - _viewC = viewC; - [[UMSocialControllerService defaultControllerService] setShareText:shareText shareImage:shareImage socialUIDelegate:nil]; - [UMSocialData defaultData].extConfig.wechatSessionData.url = shareURLString; - [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToWechatSession].snsClickHandler(viewC,[UMSocialControllerService defaultControllerService],YES); + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + /*! 设置文本 */ + messageObject.text = shareText; + + /*! 调用分享接口 */ + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; } -#pragma mark 新浪微博分享 -- (void)BA_wbShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage +#pragma mark 分享纯图片 +- (void)ba_shareImageToPlatformType:(UMSocialPlatformType)platformType + thumbImage:(NSString *)thumbImage + bigImage:(NSString *)bigImage + viewController:(UIViewController *)viewController { - _viewC = viewC; - [[UMSocialControllerService defaultControllerService] setShareText:shareText shareImage:shareImage socialUIDelegate:nil]; - [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToSina].snsClickHandler(viewC,[UMSocialControllerService defaultControllerService],YES); + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + /*! 创建图片内容对象 */ + UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; + /*! 如果有缩略图,则设置缩略图本地 */ + shareObject.thumbImage = [UIImage imageNamed:thumbImage]; + + [shareObject setShareImage:[UIImage imageNamed:bigImage]]; + + /*! 设置Pinterest参数 */ + if (platformType == UMSocialPlatformType_Pinterest) { + [self setPinterstInfo:messageObject]; + } + + /*! 设置Kakao参数 */ + if (platformType == UMSocialPlatformType_KakaoTalk) { + messageObject.moreInfo = @{@"permission" : @1}; // @1 = KOStoryPermissionPublic + } + + /*! 分享消息对象设置分享内容对象 */ + messageObject.shareObject = shareObject; + + /*! 调用分享接口 */ + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; } -#pragma mark 微信朋友圈分享 -- (void)BA_wxpyqShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString +#pragma mark 分享网络图片 +- (void)ba_shareImageURLToPlatformType:(UMSocialPlatformType)platformType + thumbImage:(NSString *)thumbImage + imageUrl:(NSString *)imageUrl + viewController:(UIViewController *)viewController { - _viewC = viewC; - [[UMSocialControllerService defaultControllerService] setShareText:shareText shareImage:shareImage socialUIDelegate:nil]; - [UMSocialData defaultData].extConfig.wechatTimelineData.url = shareURLString; - [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToWechatTimeline].snsClickHandler(viewC,[UMSocialControllerService defaultControllerService],YES); + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + /*! 创建图片内容对象 */ + UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; + /*! 如果有缩略图,则设置缩略图,此处为 URL */ +// shareObject.thumbImage = thumbImage; + UIImageView *imageView = [UIImageView new]; + [imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + [shareObject setShareImage:image]; + + /*! 设置Pinterest参数 */ + if (platformType == UMSocialPlatformType_Pinterest) { + [self setPinterstInfo:messageObject]; + } + + /*! 设置Kakao参数 */ + if (platformType == UMSocialPlatformType_KakaoTalk) { + messageObject.moreInfo = @{@"permission" : @1}; // @1 = KOStoryPermissionPublic + } + + /*! 分享消息对象设置分享内容对象 */ + messageObject.shareObject = shareObject; + + /*! 调用分享接口 */ + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; + + }]; + } -#pragma mark qq分享 -- (void)BA_qqShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString +#pragma mark 网页分享 +- (void)ba_shareWebPageToPlatformType:(UMSocialPlatformType)platformType + title:(NSString *)title + shareText:(NSString *)shareText + imageUrl:(NSString *)imageUrl + webpageUrl:(NSString *)webpageUrl + viewController:(UIViewController *)viewController { - _viewC = viewC; - [[UMSocialControllerService defaultControllerService] setShareText:shareText shareImage:shareImage socialUIDelegate:nil]; - [UMSocialData defaultData].extConfig.qqData.url = shareURLString; + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + BAKit_WeakSelf; + UIImageView *imageView = [UIImageView new]; + [imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + /*! 创建网页内容对象 */ + UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:shareText thumImage:image]; + /*! 设置网页地址 */ + shareObject.webpageUrl = webpageUrl; + + /*! 分享消息对象设置分享内容对象 */ + messageObject.shareObject = shareObject; + + /*! 调用分享接口 */ + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; - [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToQQ].snsClickHandler(viewC,[UMSocialControllerService defaultControllerService],YES); + }]; } -#pragma mark qqzone分享 -- (void)BA_qqzoneShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage url:shareURLString +#pragma mark 分享图片和文字 +- (void)ba_shareImageAndTextToPlatformType:(UMSocialPlatformType)platformType + shareText:(NSString *)shareText + thumbImage:(NSString *)thumbImage + imageUrl:(NSString *)imageUrl + viewController:(UIViewController *)viewController + +{ + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + /*! 设置文本 */ + messageObject.text = shareText; + + /*! 创建图片内容对象 */ + UMShareImageObject *shareObject = [[UMShareImageObject alloc] init]; + /*! 如果有缩略图,则设置缩略图 */ +// if (platformType == UMSocialPlatformType_Linkedin) { +// /*! linkedin仅支持URL图片 */ +//// shareObject.thumbImage = thumbImage; +// [shareObject setShareImage:imageUrl]; +// } else { + /*! 这里设置默认图片 */ +// shareObject.thumbImage = [UIImage imageNamed:@"icon2.jpg"]; + BAKit_WeakSelf; + UIImageView *imageView = [UIImageView new]; + [imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + shareObject.shareImage = image; + + messageObject.shareObject = shareObject; + + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; + + }]; + + } + +#pragma mark 音乐分享 +- (void)ba_shareMusicToPlatformType:(UMSocialPlatformType)platformType + title:(NSString *)title + shareText:(NSString *)shareText + imageUrl:(NSString *)imageUrl + musicUrl:(NSString *)musicUrl + musicDataUrl:(NSString *)musicDataUrl + viewController:(UIViewController *)viewController { - _viewC = viewC; - [[UMSocialControllerService defaultControllerService] setShareText:shareText shareImage:shareImage socialUIDelegate:nil]; - [UMSocialData defaultData].extConfig.qzoneData.url = shareURLString; - [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToQzone].snsClickHandler(viewC,[UMSocialControllerService defaultControllerService],YES); + /*! 创建分享消息对象 */ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + /*! 创建音乐内容对象 */ + UMShareMusicObject *shareObject = [UMShareMusicObject shareObjectWithTitle:title descr:shareText thumImage:imageUrl]; + /*! 设置音乐网页播放地址 */ + shareObject.musicUrl = musicUrl; + shareObject.musicDataUrl = musicDataUrl; + /*! 分享消息对象设置分享内容对象 */ + messageObject.shareObject = shareObject; + + /*! 调用分享接口 */ + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; + } -#pragma mark 短信分享 -- (void)BA_smsShareWithViewControll:(UIViewController *)viewC withShareText:shareText image:shareImage +#pragma mark 视频分享 +- (void)ba_shareVedioToPlatformType:(UMSocialPlatformType)platformType + title:(NSString *)title + shareText:(NSString *)shareText + imageUrl:(NSString *)imageUrl + videoUrl:(NSString *)videoUrl + viewController:(UIViewController *)viewController { - _viewC = viewC; - Class messageClass = (NSClassFromString(@"MFMessageComposeViewController")); - if (messageClass != nil) { - if ([messageClass canSendText]) { - [self displaySMSComposerSheetWithShareText:(NSString *)shareText]; + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + UMShareVideoObject *shareObject = [UMShareVideoObject shareObjectWithTitle:title descr:shareText thumImage:imageUrl]; + /*! 设置视频网页播放地址 */ + shareObject.videoUrl = videoUrl; + + messageObject.shareObject = shareObject; + + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + UMSocialLogInfo(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + UMSocialLogInfo(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + UMSocialLogInfo(@"response data is %@",data); + } } - else { - //@"设备没有短信功能" + [self alertWithError:error]; + }]; +} + +#pragma mark gif 动图分享 +- (void)ba_shareEmoticonToPlatformType:(UMSocialPlatformType)platformType + title:(NSString *)title + shareText:(NSString *)shareText + imageUrl:(NSString *)imageUrl + gifFilePath:(NSString *)gifFilePath + viewController:(UIViewController *)viewController +{ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + BAKit_WeakSelf; + UIImageView *imageView = [UIImageView new]; + [imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { + UMShareEmotionObject *shareObject = [UMShareEmotionObject shareObjectWithTitle:title descr:shareText thumImage:image]; + +// NSString *filePath = [[NSBundle mainBundle] pathForResource:@"gif3" ofType:@"gif"]; + NSData *emoticonData = [NSData dataWithContentsOfFile:gifFilePath]; + shareObject.emotionData = emoticonData; + + messageObject.shareObject = shareObject; + + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + NSLog(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + NSLog(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + NSLog(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + NSLog(@"response data is %@",data); + } + } + [self alertWithError:error]; + }]; + }]; +} + +#pragma mark 文件分享 +- (void)ba_shareFileToPlatformType:(UMSocialPlatformType)platformType + title:(NSString *)title + shareText:(NSString *)shareText + imageUrl:(NSString *)imageUrl + fileFilePath:(NSString *)fileFilePath + fileFileExtension:(NSString *)fileFileExtension + viewController:(UIViewController *)viewController +{ + UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; + + UMShareFileObject *shareObject = [UMShareFileObject shareObjectWithTitle:title descr:shareText thumImage:imageUrl]; + + NSString *kFileExtension = fileFileExtension; +// NSString* filePath = [[NSBundle mainBundle] pathForResource:@"umengFile" +// ofType:kFileExtension]; + NSData *fileData = [NSData dataWithContentsOfFile:fileFilePath]; + shareObject.fileData = fileData; + shareObject.fileExtension = kFileExtension; + + messageObject.shareObject = shareObject; + + [[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:viewController completion:^(id data, NSError *error) { + if (error) { + NSLog(@"************Share fail with error %@*********",error); + }else{ + if ([data isKindOfClass:[UMSocialShareResponse class]]) { + UMSocialShareResponse *resp = data; + /*! 分享结果消息 */ + NSLog(@"response message is %@",resp.message); + /*! 第三方原始返回的数据 */ + NSLog(@"response originalResponse data is %@",resp.originalResponse); + + }else{ + NSLog(@"response data is %@",data); + } } + [self alertWithError:error]; + }]; + +} + +- (void)alertWithError:(NSError *)error +{ + NSString *result = nil; + if (!error) { + result = [NSString stringWithFormat:@"分享成功!"]; } - else { - //@"iOS版本过低,iOS4.0以上才支持程序内发送短信" + else{ + NSMutableString *str = [NSMutableString string]; + if (error.userInfo) { + for (NSString *key in error.userInfo) { + [str appendFormat:@"%@ = %@\n", key, error.userInfo[key]]; + } + } + if (error) { + result = [NSString stringWithFormat:@"Share fail with error code: %d\n%@",(int)error.code, str]; + } + else{ + result = [NSString stringWithFormat:@"Share fail"]; + } } + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"博爱分享" + message:result + delegate:nil + cancelButtonTitle:NSLocalizedString(@"sure", @"确定") + otherButtonTitles:nil]; + [alert show]; } -#pragma mark 短信的代理方法 -- (void)BA_messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{ - [_viewC dismissViewControllerAnimated:YES completion:nil]; - switch (result) - { - case MessageComposeResultCancelled: - +- (void)setPinterstInfo:(UMSocialMessageObject *)messageObj +{ + messageObj.moreInfo = @{@"source_url": @"http://www.umeng.com", + @"app_name": @"U-Share", + @"suggested_board_name": @"UShareProduce", + @"description": @"U-Share: best social bridge"}; +} + + +- (UIImage *)resizeImage:(UIImage *)image size:(CGSize)size +{ + UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale); + CGRect imageRect = CGRectMake(0.0, 0.0, size.width, size.height); + [image drawInRect:imageRect]; + UIImage *retImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return retImage; +} + +#pragma mark - 友盟分享 +#pragma mark 注册友盟分享微信 +- (void)ba_setupShareConfig +{ + [BAUMSocialManager setUmSocialAppkey:BA_Umeng_Appkey]; + /*! 打开调试log的开关 */ + [BAUMSocialManager openLog:YES]; + + /*! 获取友盟social版本号 */ + NSLog(@"获取友盟social版本号: %@", [UMSocialGlobal umSocialSDKVersion]); + + /*! 如果你要支持不同的屏幕方向,需要这样设置,否则在iPhone只支持一个竖屏方向 */ +// [UMSocialConfig setSupportedInterfaceOrientations:UIInterfaceOrientationMaskPortrait]; + + /*! 苹果审核要求,隐藏未安装的应用 的分享选项 */ +// [UMSocialConfig hiddenNotInstallPlatforms:@[UMShareToSina, UMShareToQQ, UMShareToQzone, UMShareToWechatSession, UMShareToWechatTimeline]]; + + /*! 设置新浪的appKey和appSecret */ + [BAUMSocialManager setPlaform:UMSocialPlatformType_Sina + appKey:BA_Sina_AppKey + appSecret:BA_SinaAppSecret + redirectURL:@"http://sns.whalecloud.com/sin"]; + + /*! 设置微信的appKey和appSecret */ + [BAUMSocialManager setPlaform:UMSocialPlatformType_WechatSession + appKey:BA_WX_APPKEY + appSecret:BA_WX_APPSECRET + redirectURL:@"http://boai.github.io"]; + + /*! 设置分享到QQ互联的 appID */ + [BAUMSocialManager setPlaform:UMSocialPlatformType_QQ + appKey:BA_QQAppID + appSecret:nil + redirectURL:@"http://boai.github.io"]; + + /*! 这段代码是用友盟自带的自定义分享的时候打开! */ + /* + * 添加某一平台会加入平台下所有分享渠道,如微信:好友、朋友圈、收藏,QQ:QQ和QQ空间 + * 以下接口可移除相应平台类型的分享,如微信收藏,对应类型可在枚举中查找 + */ + //[[UMSocialManager defaultManager] removePlatformProviderWithPlatformTypes:@[@(UMSocialPlatformType_WechatFavorite)]]; + +// UMSocialSnsPlatform *copyPlatform = [[UMSocialSnsPlatform alloc] initWithPlatformName:@"copy"]; +// copyPlatform.displayName = @"复制"; +// copyPlatform.smallImageName = @"icon"; //用于tableView样式的分享列表 +// copyPlatform.bigImageName = @"icon"; //用于actionsheet样式的分享列表 +// copyPlatform.snsClickHandler = ^(UIViewController *presentingController, UMSocialControllerService * socialControllerService, BOOL isPresentInController){ NSLog(@"copy!"); }; [UMSocialConfig addSocialSnsPlatform:@[copyPlatform]]; [UMSocialConfig setSnsPlatformNames:@[UMShareToSina, UMShareToWechatSession, UMShareToWechatTimeline, UMShareToQQ, UMShareToQzone]]; +} + +#pragma mark 微信分享 +- (void)ba_wechatShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController +{ + switch (shareType) { + case BAUM_SHARE_TYPE_TEXT: + if ([BACommon ba_isNSStringNULL:_shareText]) + { + NSLog(@"分享失败:纯文本分享中,文本内容不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:纯文本分享中,文本内容不能为空!"]; + return; + } + [self ba_shareTextToPlatformType:UMSocialPlatformType_WechatSession + shareText:_shareText + viewController:viewController]; break; - case MessageComposeResultSent: - //@"感谢您的分享!" + case BAUM_SHARE_TYPE_IMAGE: + if ([BACommon ba_isNSStringNULL:_shareBigImage]) + { + NSLog(@"分享失败:shareBigImage 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareBigImage 不能为空!" ]; + return; + } + [self ba_shareImageToPlatformType:UMSocialPlatformType_WechatSession + thumbImage:nil + bigImage:_shareBigImage + viewController:viewController]; break; - case MessageComposeResultFailed: - + case BAUM_SHARE_TYPE_IMAGE_URL: + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageURLToPlatformType:UMSocialPlatformType_WechatSession + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_WEB_LINK: + if ([BACommon ba_isNSStringNULL:_shareWebpageUrl]) + { + NSLog(@"分享失败:shareWebpageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareWebpageUrl 不能为空!" ]; + return; + } + [self ba_shareWebPageToPlatformType:UMSocialPlatformType_WechatSession + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + webpageUrl:_shareWebpageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_TEXT_IMAGE: + /*! 注:友盟此方法暂时不能用 */ + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageAndTextToPlatformType:UMSocialPlatformType_WechatSession + shareText:_shareText + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_MUSIC_LINK: + if ([BACommon ba_isNSStringNULL:_shareMusicUrl]) + { + NSLog(@"分享失败:shareMusicUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareMusicUrl 不能为空!" ]; + return; + } + [self ba_shareMusicToPlatformType:UMSocialPlatformType_WechatSession + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + musicUrl:_shareMusicUrl + musicDataUrl:_shareMusicDataUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_VIDEO_LINK: + if ([BACommon ba_isNSStringNULL:_shareVideoUrl]) + { + NSLog(@"分享失败:shareVideoUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareVideoUrl 不能为空!" ]; + return; + } + [self ba_shareVedioToPlatformType:UMSocialPlatformType_WechatSession + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + videoUrl:_shareVideoUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_GIF: + [self ba_shareEmoticonToPlatformType:UMSocialPlatformType_WechatSession + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + gifFilePath:_shareGifFilePath + viewController:viewController]; break; + case BAUM_SHARE_TYPE_FILE: + [self ba_shareFileToPlatformType:UMSocialPlatformType_WechatSession + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + fileFilePath:_shareFileFilePath + fileFileExtension:_shareFileFileExtension + viewController:viewController]; + break; + default: break; } } -#pragma mark 分享列表 -- (void)BA_UMshareListWithViewControll:(UIViewController *)viewC withShareText:(NSString *)shareText image:(UIImage *)shareImage url:(NSString *)shareURLString +#pragma mark 微信朋友圈分享 +- (void)ba_wechatTimeLineShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController { - if (shareImage == nil) - { - shareImage = [UIImage imageNamed:@"樱花瓣2"]; + switch (shareType) { + case BAUM_SHARE_TYPE_TEXT: + if ([BACommon ba_isNSStringNULL:_shareText]) + { + NSLog(@"分享失败:纯文本分享中,文本内容不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:纯文本分享中,文本内容不能为空!"]; + return; + } + [self ba_shareTextToPlatformType:UMSocialPlatformType_WechatTimeLine + shareText:_shareText + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE: + if ([BACommon ba_isNSStringNULL:_shareBigImage]) + { + NSLog(@"分享失败:shareBigImage 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareBigImage 不能为空!" ]; + return; + } + [self ba_shareImageToPlatformType:UMSocialPlatformType_WechatTimeLine + thumbImage:nil + bigImage:_shareBigImage + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE_URL: + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageURLToPlatformType:UMSocialPlatformType_WechatTimeLine + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_WEB_LINK: + if ([BACommon ba_isNSStringNULL:_shareWebpageUrl]) + { + NSLog(@"分享失败:shareWebpageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareWebpageUrl 不能为空!" ]; + return; + } + [self ba_shareWebPageToPlatformType:UMSocialPlatformType_WechatTimeLine + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + webpageUrl:_shareWebpageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_TEXT_IMAGE: + /*! 注:友盟此方法暂时不能用 */ + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageAndTextToPlatformType:UMSocialPlatformType_WechatTimeLine + shareText:_shareText + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_MUSIC_LINK: + if ([BACommon ba_isNSStringNULL:_shareMusicUrl]) + { + NSLog(@"分享失败:shareMusicUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareMusicUrl 不能为空!" ]; + return; + } + [self ba_shareMusicToPlatformType:UMSocialPlatformType_WechatTimeLine + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + musicUrl:_shareMusicUrl + musicDataUrl:_shareMusicDataUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_VIDEO_LINK: + if ([BACommon ba_isNSStringNULL:_shareVideoUrl]) + { + NSLog(@"分享失败:shareVideoUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareVideoUrl 不能为空!" ]; + return; + } + [self ba_shareVedioToPlatformType:UMSocialPlatformType_WechatTimeLine + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + videoUrl:_shareVideoUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_GIF: + NSLog(@"分享失败:受 微信朋友圈 平台限制,不能分享 gif 动图到 微信朋友圈!"); + [self BA_showAlertWithTitle:@"分享失败:受 微信朋友圈 平台限制,不能分享 gif 动图到 微信朋友圈!"]; + return; + // [self ba_shareEmoticonToPlatformType:UMSocialPlatformType_WechatTimeLine + // title:_shareTitle + // shareText:_shareText + // imageUrl:_shareImageUrl + // gifFilePath:_shareGifFilePath + // viewController:viewController]; + break; + case BAUM_SHARE_TYPE_FILE: + NSLog(@"分享失败:受 微信朋友圈 平台限制,不能分享文件到 微信朋友圈!"); + [self BA_showAlertWithTitle:@"分享失败:受 微信朋友圈 平台限制,不能分享文件到 微信朋友圈!"]; + return; + // [self ba_shareFileToPlatformType:UMSocialPlatformType_WechatTimeLine + // title:_shareTitle + // shareText:_shareText + // imageUrl:_shareImageUrl + // fileFilePath:_shareFileFilePath + // fileFileExtension:_shareFileFileExtension + // viewController:viewController]; + break; + + default: + break; } - - NSArray *titarray = nil; - NSArray *picarray = nil; - - if ([WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) +} + +#pragma mark 新浪微博分享 +- (void)ba_sinaShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController +{ + shareType = BAUM_SHARE_TYPE_TEXT_IMAGE; + if (_shareText && _shareWebpageUrl) { - titarray = @[@"微信",@"朋友圈",@"微博", @"QQ",@"空间"]; - picarray = @[@"BASharManager.bundle/微信好友",@"BASharManager.bundle/朋友圈",@"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间"]; + _shareText = [NSString stringWithFormat:@"%@,分享自:@博爱1616,详见链接:%@", _shareText, _shareWebpageUrl]; } - else if (![WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) - { - titarray = @[@"微博", @"QQ",@"空间"]; - picarray = @[@"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间"]; + switch (shareType) { + case BAUM_SHARE_TYPE_TEXT: + if ([BACommon ba_isNSStringNULL:_shareText]) + { + NSLog(@"分享失败:纯文本分享中,文本内容不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:纯文本分享中,文本内容不能为空!"]; + return; + } + [self ba_shareTextToPlatformType:UMSocialPlatformType_Sina + shareText:_shareText + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE: + if ([BACommon ba_isNSStringNULL:_shareBigImage]) + { + NSLog(@"分享失败:shareBigImage 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareBigImage 不能为空!" ]; + return; + } + [self ba_shareImageToPlatformType:UMSocialPlatformType_Sina + thumbImage:nil + bigImage:_shareBigImage + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE_URL: + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageURLToPlatformType:UMSocialPlatformType_Sina + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_WEB_LINK: + if ([BACommon ba_isNSStringNULL:_shareWebpageUrl]) + { + NSLog(@"分享失败:shareWebpageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareWebpageUrl 不能为空!" ]; + return; + } + [self ba_shareWebPageToPlatformType:UMSocialPlatformType_Sina + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + webpageUrl:_shareWebpageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_TEXT_IMAGE: + /*! 注:友盟此方法暂时只对新浪分享有用 */ + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageAndTextToPlatformType:UMSocialPlatformType_Sina + shareText:_shareText + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_MUSIC_LINK: + if ([BACommon ba_isNSStringNULL:_shareMusicUrl]) + { + NSLog(@"分享失败:shareMusicUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareMusicUrl 不能为空!" ]; + return; + } + [self ba_shareMusicToPlatformType:UMSocialPlatformType_Sina + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + musicUrl:_shareMusicUrl + musicDataUrl:_shareMusicDataUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_VIDEO_LINK: + if ([BACommon ba_isNSStringNULL:_shareVideoUrl]) + { + NSLog(@"分享失败:shareVideoUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareVideoUrl 不能为空!" ]; + return; + } + [self ba_shareVedioToPlatformType:UMSocialPlatformType_Sina + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + videoUrl:_shareVideoUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_GIF: + NSLog(@"分享失败:受 新浪微博 平台限制,不能分享 gif 动图到 新浪微博!"); + [self BA_showAlertWithTitle:@"分享失败:受 新浪微博 平台限制,不能分享 gif 动图到 新浪微博!"]; + return; +// [self ba_shareEmoticonToPlatformType:UMSocialPlatformType_Sina +// title:_shareTitle +// shareText:_shareText +// imageUrl:_shareImageUrl +// gifFilePath:_shareGifFilePath +// viewController:viewController]; + break; + case BAUM_SHARE_TYPE_FILE: + NSLog(@"分享失败:受 新浪微博 平台限制,不能分享文件到 新浪微博!"); + [self BA_showAlertWithTitle:@"分享失败:受 新浪微博 平台限制,不能分享文件到 新浪微博!"]; + return; + // [self ba_shareFileToPlatformType:UMSocialPlatformType_QQ + // title:_shareTitle + // shareText:_shareText + // imageUrl:_shareImageUrl + // fileFilePath:_shareFileFilePath + // fileFileExtension:_shareFileFileExtension + // viewController:viewController]; + break; + + default: + break; } - else if ([WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - titarray = @[@"微信",@"朋友圈",@"微博",]; - picarray = @[@"BASharManager.bundle/微信好友",@"BASharManager.bundle/朋友圈", @"BASharManager.bundle/新浪微博"]; +} + +#pragma mark qq分享 +- (void)ba_qqShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController +{ + switch (shareType) { + case BAUM_SHARE_TYPE_TEXT: + if ([BACommon ba_isNSStringNULL:_shareText]) + { + NSLog(@"分享失败:纯文本分享中,文本内容不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:纯文本分享中,文本内容不能为空!"]; + return; + } + [self ba_shareTextToPlatformType:UMSocialPlatformType_QQ + shareText:_shareText + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE: + if ([BACommon ba_isNSStringNULL:_shareBigImage]) + { + NSLog(@"分享失败:shareBigImage 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareBigImage 不能为空!" ]; + return; + } + [self ba_shareImageToPlatformType:UMSocialPlatformType_QQ + thumbImage:nil + bigImage:_shareBigImage + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE_URL: + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageURLToPlatformType:UMSocialPlatformType_QQ + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_WEB_LINK: + if ([BACommon ba_isNSStringNULL:_shareWebpageUrl]) + { + NSLog(@"分享失败:shareWebpageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareWebpageUrl 不能为空!" ]; + return; + } + [self ba_shareWebPageToPlatformType:UMSocialPlatformType_QQ + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + webpageUrl:_shareWebpageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_TEXT_IMAGE: + /*! 注:友盟此方法暂时不能用 */ + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageAndTextToPlatformType:UMSocialPlatformType_QQ + shareText:_shareText + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_MUSIC_LINK: + if ([BACommon ba_isNSStringNULL:_shareMusicUrl]) + { + NSLog(@"分享失败:shareMusicUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareMusicUrl 不能为空!" ]; + return; + } + [self ba_shareMusicToPlatformType:UMSocialPlatformType_QQ + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + musicUrl:_shareMusicUrl + musicDataUrl:_shareMusicDataUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_VIDEO_LINK: + if ([BACommon ba_isNSStringNULL:_shareVideoUrl]) + { + NSLog(@"分享失败:shareVideoUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareVideoUrl 不能为空!" ]; + return; + } + [self ba_shareVedioToPlatformType:UMSocialPlatformType_QQ + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + videoUrl:_shareVideoUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_GIF: + NSLog(@"分享失败:受 QQ 平台限制,不能分享 gif 动图到 QQ!"); + [self BA_showAlertWithTitle:@"分享失败:受 QQ 平台限制,不能分享 gif 动图到 QQ!"]; + return; +// [self ba_shareEmoticonToPlatformType:UMSocialPlatformType_QQ +// title:_shareTitle +// shareText:_shareText +// imageUrl:_shareImageUrl +// gifFilePath:_shareGifFilePath +// viewController:viewController]; + break; + case BAUM_SHARE_TYPE_FILE: + NSLog(@"分享失败:受 QQ 平台限制,不能分享文件到 QQ!"); + [self BA_showAlertWithTitle:@"分享失败:受 QQ 平台限制,不能分享文件到 QQ!"]; + return; +// [self ba_shareFileToPlatformType:UMSocialPlatformType_QQ +// title:_shareTitle +// shareText:_shareText +// imageUrl:_shareImageUrl +// fileFilePath:_shareFileFilePath +// fileFileExtension:_shareFileFileExtension +// viewController:viewController]; + break; + + default: + break; } - else if (![WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - titarray = @[@"微博",]; - picarray = @[@"BASharManager.bundle/新浪微博"]; +} + +#pragma mark Qzone分享 +- (void)ba_qZoneShareWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController +{ + switch (shareType) { + case BAUM_SHARE_TYPE_TEXT: + if ([BACommon ba_isNSStringNULL:_shareText]) + { + NSLog(@"分享失败:纯文本分享中,文本内容不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:纯文本分享中,文本内容不能为空!"]; + return; + } + [self ba_shareTextToPlatformType:UMSocialPlatformType_Qzone + shareText:_shareText + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE: + if ([BACommon ba_isNSStringNULL:_shareBigImage]) + { + NSLog(@"分享失败:shareBigImage 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareBigImage 不能为空!" ]; + return; + } + [self ba_shareImageToPlatformType:UMSocialPlatformType_Qzone + thumbImage:nil + bigImage:_shareBigImage + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_IMAGE_URL: + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageURLToPlatformType:UMSocialPlatformType_Qzone + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_WEB_LINK: + if ([BACommon ba_isNSStringNULL:_shareWebpageUrl]) + { + NSLog(@"分享失败:shareWebpageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareWebpageUrl 不能为空!" ]; + return; + } + [self ba_shareWebPageToPlatformType:UMSocialPlatformType_Qzone + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + webpageUrl:_shareWebpageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_TEXT_IMAGE: + /*! 注:友盟此方法暂时不能用 */ + if ([BACommon ba_isNSStringNULL:_shareImageUrl]) + { + NSLog(@"分享失败:shareImageUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareImageUrl 不能为空!" ]; + return; + } + [self ba_shareImageAndTextToPlatformType:UMSocialPlatformType_Qzone + shareText:_shareText + thumbImage:nil + imageUrl:_shareImageUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_MUSIC_LINK: + if ([BACommon ba_isNSStringNULL:_shareMusicUrl]) + { + NSLog(@"分享失败:shareMusicUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareMusicUrl 不能为空!" ]; + return; + } + [self ba_shareMusicToPlatformType:UMSocialPlatformType_Qzone + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + musicUrl:_shareMusicUrl + musicDataUrl:_shareMusicDataUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_VIDEO_LINK: + if ([BACommon ba_isNSStringNULL:_shareVideoUrl]) + { + NSLog(@"分享失败:shareVideoUrl 不能为空!"); + [self BA_showAlertWithTitle:@"分享失败:shareVideoUrl 不能为空!" ]; + return; + } + [self ba_shareVedioToPlatformType:UMSocialPlatformType_Qzone + title:_shareTitle + shareText:_shareText + imageUrl:_shareImageUrl + videoUrl:_shareVideoUrl + viewController:viewController]; + break; + case BAUM_SHARE_TYPE_GIF: + NSLog(@"分享失败:受 QQ空间 平台限制,不能分享 gif 动图到 QQ空间!"); + [self BA_showAlertWithTitle:@"分享失败:受 QQ空间 平台限制,不能分享 gif 动图到 QQ空间!"]; + return; + // [self ba_shareEmoticonToPlatformType:UMSocialPlatformType_QQ + // title:_shareTitle + // shareText:_shareText + // imageUrl:_shareImageUrl + // gifFilePath:_shareGifFilePath + // viewController:viewController]; + break; + case BAUM_SHARE_TYPE_FILE: + NSLog(@"分享失败:受 QQ空间 平台限制,不能分享文件到 QQ空间!"); + [self BA_showAlertWithTitle:@"分享失败:受 QQ空间 平台限制,不能分享文件到 QQ空间!"]; + return; + // [self ba_shareFileToPlatformType:UMSocialPlatformType_QQ + // title:_shareTitle + // shareText:_shareText + // imageUrl:_shareImageUrl + // fileFilePath:_shareFileFilePath + // fileFileExtension:_shareFileFileExtension + // viewController:viewController]; + break; + + default: + break; } - - BAShareAnimationView *animationView = [[BAShareAnimationView alloc]initWithTitleArray:titarray picarray:picarray title:@"第三方分享"]; - BA_Weak; - [animationView selectedWithIndex:^(NSInteger index,id shareType) { - BALog(@"你选择的index == %ld",(long)index); - BALog(@"要分享到的平台"); +} - if ([WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) +#pragma mark - 分享列表 +- (void)ba_shareListWithShareType:(BAUM_SHARE_TYPE)shareType + viewController:(UIViewController *)viewController +{ + BAKit_WeakSelf; + BAUMSocialShareUIConfig.sharePageGroupViewConfig.sharePageGroupViewPostionType = UMSocialSharePageGroupViewPositionType_Bottom; + BAUMSocialShareUIConfig.sharePageScrollViewConfig.shareScrollViewPageItemStyleType = UMSocialPlatformItemViewBackgroudType_IconAndBGRadius; + BAUMSocialShareUIConfig.shareTitleViewConfig.shareTitleViewTitleString = @"博爱分享"; + BAUMSocialShareUIConfig.shareTitleViewConfig.shareTitleViewTitleColor = [UIColor purpleColor]; + BAUMSocialShareUIConfig.shareCancelControlConfig.shareCancelControlText = @"取消分享"; + /*! 在这里预设自己需要分享的平台 */ + [UMSocialUIManager setPreDefinePlatforms:@[ + @(UMSocialPlatformType_WechatSession), + @(UMSocialPlatformType_WechatTimeLine), + @(UMSocialPlatformType_QQ), + @(UMSocialPlatformType_Qzone), + @(UMSocialPlatformType_Sina)]]; + + [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) { + + if (platformType == UMSocialPlatformType_QQ) { - switch (index) - { - case 1: - [weakSelf BA_wxShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 2: - [weakSelf BA_wxpyqShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 3: - [weakSelf BA_wbShareWithViewControll:viewC withShareText:shareText image:shareImage]; - break; - case 4: - [weakSelf BA_qqShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 5: - [weakSelf BA_qqzoneShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - - default: - break; - } + [self ba_qqShareWithShareType:shareType + viewController:viewController]; } - else if (![WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) + else if (platformType == UMSocialPlatformType_Qzone) { - switch (index) - { - case 1: - [weakSelf BA_wbShareWithViewControll:viewC withShareText:shareText image:shareImage]; - break; - case 2: - [weakSelf BA_qqShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 3: - [weakSelf BA_qqzoneShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - - default: - break; - } + [self ba_qZoneShareWithShareType:shareType + viewController:viewController]; } - else if ([WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) + else if (platformType == UMSocialPlatformType_WechatSession) { - switch (index) - { - case 1: - [weakSelf BA_wxShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 2: - [weakSelf BA_wxpyqShareWithViewControll:viewC withShareText:shareText image:shareImage url:shareURLString]; - break; - case 3: - [weakSelf BA_wbShareWithViewControll:viewC withShareText:shareText image:shareImage]; - break; - - default: - break; - } + [self ba_wechatShareWithShareType:shareType + viewController:viewController]; } - else if (![WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) + else if (platformType == UMSocialPlatformType_WechatTimeLine) { - switch (index) - { - case 1: - [weakSelf BA_wbShareWithViewControll:viewC withShareText:shareText image:shareImage]; - break; - - default: - break; - } + [self ba_wechatTimeLineShareWithShareType:shareType + viewController:viewController]; + } + else if (platformType == UMSocialPlatformType_Sina) + { + [self ba_sinaShareWithShareType:shareType + viewController:viewController]; } }]; - [animationView CLBtnBlock:^(UIButton *btn) { - - BALog(@"你点了选择/取消按钮"); - }]; - [animationView show]; } -- (void)displaySMSComposerSheetWithShareText:(NSString *)shareText +#pragma mark - 友盟登录 + +#pragma mark 微信登录 +- (void)ba_wechatLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init]; - picker.messageComposeDelegate = self; - picker.navigationBar.tintColor = [UIColor blackColor]; - // picker.recipients = [NSArray arrayWithObject:@"10086"]; - picker.body = shareText; - [_viewC presentViewController:picker animated:YES completion:nil]; + [self ba_UMLoginWithPlatformType:UMSocialPlatformType_WechatSession + viewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; } -// 实现回调方法(可选): --(void)didFinishGetUMSocialDataInViewController:(UMSocialResponseEntity *)response +#pragma mark QQ登录 +- (void)ba_qqLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - // 根据`responseCode`得到发送结果,如果分享成功 - if(response.responseCode == UMSResponseCodeSuccess) - { - // 得到分享到的微博平台名 - BALog(@"share to sns name is %@",[[response.data allKeys] objectAtIndex:0]); - } + [self ba_UMLoginWithPlatformType:UMSocialPlatformType_QQ + viewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; } -#pragma mark - 友盟登录 -/**友盟 QQ 登录**/ -- (void)BA_QQLogin:(UIViewController *)viewController +#pragma mark QZone登录 +- (void)ba_qZoneLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToQQ]; - - BA_Weak; - snsPlatform.loginClickHandler(viewController,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){ - - // 获取微博用户名、uid、token等 - - if (response.responseCode == UMSResponseCodeSuccess) { - - UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary] valueForKey:UMShareToQQ]; - - NSDictionary *dict = [NSDictionary dictionary]; - dict = @{ - @"userName" : snsAccount.userName, - @"usid" : snsAccount.usid, - @"accessToken" : snsAccount.accessToken, - @"iconURL" : snsAccount.iconURL - }; - // delegate - [weakSelf.delegate getUserData:dict]; - - BALog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL); - }}); + [self ba_UMLoginWithPlatformType:UMSocialPlatformType_Qzone + viewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; } -/**友盟 Qzone 登录**/ -- (void)BA_QzoneLogin:(UIViewController *)viewController +#pragma mark 微博登录 +- (void)ba_sinaLoginWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToQzone]; - BA_Weak; - snsPlatform.loginClickHandler(viewController,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){ - - // 获取微博用户名、uid、token等 - if (response.responseCode == UMSResponseCodeSuccess) { - - UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary] valueForKey:UMShareToQzone]; - - NSDictionary *dict = [NSDictionary dictionary]; - dict = @{ - @"userName" : snsAccount.userName, - @"usid" : snsAccount.usid, - @"accessToken" : snsAccount.accessToken, - @"iconURL" : snsAccount.iconURL - }; - // delegate - [weakSelf.delegate getUserData:dict]; - - BALog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL); - - }}); + [self ba_UMLoginWithPlatformType:UMSocialPlatformType_Sina + viewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; } -/**友盟 新浪微博 登录**/ -- (void)BA_SinaLogin:(UIViewController *)viewController +#pragma mark - 友盟登录列表 +- (void)ba_loginListWithViewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToSina]; - BA_Weak; - snsPlatform.loginClickHandler(viewController,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){ + BAKit_WeakSelf; + BAUMSocialShareUIConfig.sharePageGroupViewConfig.sharePageGroupViewPostionType = UMSocialSharePageGroupViewPositionType_Bottom; + BAUMSocialShareUIConfig.sharePageScrollViewConfig.shareScrollViewPageItemStyleType = UMSocialPlatformItemViewBackgroudType_IconAndBGRadius; + BAUMSocialShareUIConfig.shareTitleViewConfig.shareTitleViewTitleString = @"博爱登录"; + BAUMSocialShareUIConfig.shareTitleViewConfig.shareTitleViewTitleColor = [UIColor redColor]; + BAUMSocialShareUIConfig.shareCancelControlConfig.shareCancelControlText = @"取消登录"; + /*! 在这里预设自己需要登录的平台 */ + [UMSocialUIManager setPreDefinePlatforms:@[ + @(UMSocialPlatformType_WechatSession), + @(UMSocialPlatformType_QQ), + @(UMSocialPlatformType_Qzone), + @(UMSocialPlatformType_Sina)]]; + + [UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType, NSDictionary *userInfo) { - // 获取微博用户名、uid、token等 - if (response.responseCode == UMSResponseCodeSuccess) { - - UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary] valueForKey:UMShareToSina]; - - NSDictionary *dict = [NSDictionary dictionary]; - dict = @{ - @"userName" : snsAccount.userName, - @"usid" : snsAccount.usid, - @"accessToken" : snsAccount.accessToken, - @"iconURL" : snsAccount.iconURL - }; - // delegate - [weakSelf.delegate getUserData:dict]; - - BALog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL); - - }}); + if (platformType == UMSocialPlatformType_QQ) + { + [self ba_qqLoginWithViewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; + } + else if (platformType == UMSocialPlatformType_Qzone) + { + [self ba_qZoneLoginWithViewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; + } + else if (platformType == UMSocialPlatformType_WechatSession) + { + [self ba_wechatLoginWithViewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; + } + else if (platformType == UMSocialPlatformType_Sina) + { + [self ba_sinaLoginWithViewController:viewController + isGetAuthWithUserInfo:isGetAuthWithUserInfo + loginCallback:loginCallback]; + } + }]; } -/**删除新浪微博登陆授权调用下面的方法**/ -- (void)deleteSinaLogin +- (void)ba_UMLoginWithPlatformType:(UMSocialPlatformType)platformType + viewController:(UIViewController *)viewController + isGetAuthWithUserInfo:(BOOL)isGetAuthWithUserInfo + loginCallback:(BAUMLoginCallback)loginCallback { - [[UMSocialDataService defaultDataService] requestUnOauthWithType:UMShareToSina completion:^(UMSocialResponseEntity *response){ - BALog(@"response is %@",response); - }]; + BAKit_WeakSelf; + if (isGetAuthWithUserInfo) + { + [BAUMSocialManager getUserInfoWithPlatform:platformType currentViewController:nil completion:^(id result, NSError *error) { + + [self callbackWithResult:result + error:error + loginCallback:loginCallback]; + }]; + } + else + { + [BAUMSocialManager authWithPlatform:UMSocialPlatformType_WechatSession currentViewController:nil completion:^(id result, NSError *error) { + [self callbackWithResult:result + error:error + loginCallback:loginCallback]; + }]; + } } -/**友盟 微信 登录**/ -- (void)BA_WechatSessionLogin:(UIViewController *)viewController +- (void)callbackWithResult:(id)result + error:(NSError *)error + loginCallback:(BAUMLoginCallback)loginCallback { - UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToWechatSession]; - BA_Weak; - snsPlatform.loginClickHandler(viewController,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){ - - if (response.responseCode == UMSResponseCodeSuccess) { - - UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary]valueForKey:UMShareToWechatSession]; + NSString *message = nil; + + if (error) { + message = @"登录失败,获取用户信息失败!"; + UMSocialLogInfo(@"登录失败,获取用户信息失败!error %@",error); + }else{ + if ([result isKindOfClass:[UMSocialUserInfoResponse class]]) { - NSDictionary *dict = [NSDictionary dictionary]; - dict = @{ - @"userName" : snsAccount.userName, - @"usid" : snsAccount.usid, - @"accessToken" : snsAccount.accessToken, - @"iconURL" : snsAccount.iconURL - }; - - // delegate - [weakSelf.delegate getUserData:dict]; - - BALog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL); + UMSocialUserInfoResponse *resp = result; + self.responseDic = resp; + if (loginCallback) + { + loginCallback(resp); + } + }else{ + message = @"登录失败,获取用户信息失败!"; } - }); + } + + if (message) { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"UserInfo" + message:message + delegate:nil + cancelButtonTitle:NSLocalizedString(@"sure", @"确定") + otherButtonTitles:nil]; + [alert show]; + } } -/**友盟登录列表**/ -- (void)BA_UMLoginListWithViewControll:(UIViewController *)viewController +#pragma mark - 清除授权 +- (void)ba_cancelAuthWithPlatformType:(UMSocialPlatformType)platformType { -// NSMutableArray *titarray = [NSMutableArray arrayWithObjects:@"微信", @"微博", @"QQ", @"空间",nil]; -// NSMutableArray *picarray = [NSMutableArray arrayWithObjects:@"BASharManager.bundle/微信好友", @"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间",nil]; - - NSArray *titarray = nil; - NSArray *picarray = nil; - // NSMutableArray *titarray = [NSMutableArray arrayWithObjects:@"微信",@"朋友圈",@"微博", @"QQ",@"空间",nil]; - // NSMutableArray *picarray = [NSMutableArray arrayWithObjects:@"BASharManager.bundle/微信好友",@"BASharManager.bundle/朋友圈",@"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间",nil]; - - if ([WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) + BAKit_WeakSelf; + if (self.responseDic) { - titarray = @[@"微信",@"微博", @"QQ",@"空间"]; - picarray = @[@"BASharManager.bundle/微信好友",@"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间"]; + [BAUMSocialManager cancelAuthWithPlatform:platformType completion:^(id result, NSError *error) { + self.responseDic = nil; + if (self.authOpFinish) + { + self.authOpFinish(); + } +// NSString *msg = [NSString stringWithFormat:@"清除授权成功!"]; +// [self BA_showAlertWithTitle:msg]; + }]; } - else if (![WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) + else { - titarray = @[@"微博", @"QQ",@"空间"]; - picarray = @[@"BASharManager.bundle/新浪微博", @"BASharManager.bundle/qq好友", @"BASharManager.bundle/qq空间"]; + [self BA_showAlertWithTitle:@"您还没有授权信息,不能清除授权!"]; } - else if ([WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - titarray = @[@"微信",@"微博",]; - picarray = @[@"BASharManager.bundle/微信好友", @"BASharManager.bundle/新浪微博"]; +} + +- (NSString *)authInfoString:(UMSocialUserInfoResponse *)resp +{ + NSMutableString *string = [NSMutableString new]; + if (resp.uid) { + [string appendFormat:@"uid = %@\n", resp.uid]; } - else if (![WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - titarray = @[@"微博",]; - picarray = @[@"BASharManager.bundle/新浪微博"]; + if (resp.openid) { + [string appendFormat:@"openid = %@\n", resp.openid]; } - - BAShareAnimationView *animationView = [[BAShareAnimationView alloc]initWithTitleArray:titarray picarray:picarray title:@"第三方登录"]; - BA_Weak; - [animationView selectedWithIndex:^(NSInteger index,id shareType) { - BALog(@"你选择的index == %ld",(long)index); - BALog(@"要登录的平台"); - - if ([WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) - { - switch (index) - { - case 1: - [weakSelf BA_WechatSessionLogin:viewController]; - break; - case 2: - [weakSelf BA_SinaLogin:viewController]; - break; - case 3: - [weakSelf BA_QQLogin:viewController]; - break; - case 4: - [weakSelf BA_QzoneLogin:viewController]; - break; - - default: - break; - } - } - else if (![WXApi isWXAppInstalled] && [TencentOAuth iphoneQQInstalled]) - { - switch (index) - { - case 1: - [weakSelf BA_SinaLogin:viewController]; - break; - case 2: - [weakSelf BA_QQLogin:viewController]; - break; - case 3: - [weakSelf BA_QzoneLogin:viewController]; - break; - - default: - break; - } - } - else if ([WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - switch (index) - { - case 1: - [weakSelf BA_WechatSessionLogin:viewController]; - break; - case 2: - [weakSelf BA_SinaLogin:viewController]; - break; - - default: - break; - } - } - else if (![WXApi isWXAppInstalled] && ![TencentOAuth iphoneQQInstalled]) - { - switch (index) - { - case 1: - [weakSelf BA_SinaLogin:viewController]; - break; - - default: - break; - } - } - }]; - - [animationView CLBtnBlock:^(UIButton *btn) { - - BALog(@"你点了选择/取消按钮"); - }]; - [animationView show]; + if (resp.accessToken) { + [string appendFormat:@"accessToken = %@\n", resp.accessToken]; + } + if (resp.refreshToken) { + [string appendFormat:@"refreshToken = %@\n", resp.refreshToken]; + } + if (resp.expiration) { + [string appendFormat:@"expiration = %@\n", resp.expiration]; + } + if (resp.name) { + [string appendFormat:@"name = %@\n", resp.name]; + } + if (resp.iconurl) { + [string appendFormat:@"iconurl = %@\n", resp.iconurl]; + } + if (resp.gender) { + [string appendFormat:@"gender = %@\n", resp.gender]; + } + return string; } @end + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.h" deleted file mode 100755 index 8788856..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.h" +++ /dev/null @@ -1,36 +0,0 @@ -// -// BAShareManage.h -// yrapp -// -// Created by 博爱 on 16/2/3. -// Copyright © 2016年 有人科技. All rights reserved. -// - -#import - -typedef void (^RRBlock)(NSInteger index,UILabel *sheetLab,id ShareType); - - -@interface BAShareManageView : UIView - - -/* - * 为actionsheet上小视图 - * 按照 高度120(90(按钮60*60)+30)来设计 - */ - -@property (nonatomic,strong) UIButton *sheetBtn; - -@property (nonatomic,strong) UILabel *sheetLab; - -///要分享到的平台 -@property (nonatomic) id shareType; - - - -@property (nonatomic,copy) RRBlock block; - - -- (void)selectedIndex:(RRBlock)block; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.m" deleted file mode 100755 index 493cf96..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASharManager/BAShareManageView.m" +++ /dev/null @@ -1,67 +0,0 @@ -// -// BAShareManage.m -// yrapp -// -// Created by 博爱 on 16/2/3. -// Copyright © 2016年 有人科技. All rights reserved. -// - -#import "BAShareManageView.h" -#import "UMSocial.h" - -@implementation BAShareManageView - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self) { - self.sheetBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 50, 50)]; - self.sheetBtn.clipsToBounds = YES; - self.sheetBtn.layer.cornerRadius = 25; - [self.sheetBtn setCenter:CGPointMake(self.frame.size.width / 2, 30)]; - - self.sheetLab = [[UILabel alloc]initWithFrame:CGRectMake(0, 60, self.frame.size.width, 20)]; - [self addSubview:self.sheetLab]; - [self.sheetBtn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; - - [self.sheetLab setTextAlignment:NSTextAlignmentCenter]; - self.sheetLab.font = [UIFont systemFontOfSize:14]; - [self addSubview:self.sheetBtn]; - - } - return self; -} - - -- (void)btnClick:(UIButton *)btn -{ - - [self judgeShareType:self.sheetLab.text]; //在响应按钮的点击之前判断一下要分享到的平台 - self.block(self.sheetBtn.tag,self.sheetLab,self.shareType); -} - -- (void)selectedIndex:(RRBlock)block -{ - self.block = block; -} - -//根据sheetLab的标题判断点击这个按钮需要分享到的平台 -- (void)judgeShareType:(NSString *)str -{ - if ([str isEqualToString:@"QQ"] ) { - self.shareType = UMShareToQQ ; - } else if ([str isEqualToString:@"空间"]) { - self.shareType = UMShareToQzone; - } else if ([str isEqualToString:@"微信"]) { - self.shareType = UMShareToWechatSession; - } else if ([str isEqualToString:@"朋友圈"]) { - self.shareType = UMShareToWechatTimeline; - } else { - self.shareType = UMShareToSms; - } -} - - - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.h" new file mode 100644 index 0000000..91e4d97 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.h" @@ -0,0 +1,162 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + +/*! + Version:【Version:2.0】 + 最新更新时间:2016-11-17 + */ +#import + +@interface BASystermSetting : NSObject + +/*! + * 创建单例 ba_systermSettingManage + * + * @return ba_systermSettingManage + */ ++ (BASystermSetting *)ba_systermSettingManage; + +#pragma mark - ***** app跳转到系统的各种基本设置选项 +/*! + * 跳转系统通知 + */ +- (void)ba_gotoSystermSettings; + +/*! + * 跳到WIFI界面 + */ +- (void)ba_gotoSystermWIFISettings; + +/*! + * 跳到About关于本机界面 + */ +- (void)ba_gotoSystermAboutSettings; + +/*! + * 跳到Accessibility辅助功能界面 + */ +- (void)ba_gotoSystermAccessibilitySettings; + +/*! + * 跳到AirplaneModeOn飞行模式界面 + */ +- (void)ba_gotoSystermAirplaneModeOnSettings; + +/*! + * 跳到Auto-Lock自动锁屏时间界面 + */ +- (void)ba_gotoSystermAutoLockSettings; + +/*! + * 跳到Brightness自动锁定界面 + */ +- (void)ba_gotoSystermBrightnessSettings; + +/*! + * 跳到MICROPHONE麦克风界面 + */ +- (void)ba_gotoSystermMICROPHONESettings; + +/*! + * 跳到CONTACTS通讯录界面 + */ +- (void)ba_gotoSystermCONTACTSSettings; + +/*! + * 跳到Bluetooth蓝牙界面 + */ +- (void)ba_gotoSystermBluetoothSettings; + +/*! + * 跳到DATE_AND_TIME日期和时间界面 + */ +- (void)ba_gotoSystermDATE_AND_TIMESettings; + +/*! + * 跳到FaceTime界面 + */ +- (void)ba_gotoSystermFaceTimeSettings; + +/*! + * 跳到General界面 + */ +- (void)ba_gotoSystermGeneralSettings; + +/*! + * 跳到Keyboard界面 + */ +- (void)ba_gotoSystermKeyboardSettings; + +/*! + * 跳到iCloud界面 + */ +- (void)ba_gotoSystermiCloudSettings; + +/*! + * 跳转Safari浏览器 + * + * @param url 需要用Safari打开的url + */ +- (void)ba_gotoSafariBrowserWithURL:(NSString *)url; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.m" new file mode 100644 index 0000000..8c41ea2 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystermSetting/BASystermSetting.m" @@ -0,0 +1,320 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import "BASystermSetting.h" + +@implementation BASystermSetting + +/*! + 注意: + iOS 10 系统下需要请求相关权限,iOS 10 干掉了所有系统设置的 URL Scheme,这意味着你再也不可能直接跳转到系统设置页面(比如 WiFi、蜂窝数据、定位等)。 + + ios 10 系统,其他权限具体设置如下: + + 麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风? + + 相机权限: Privacy - Camera Usage Description 是否允许此App使用你的相机? + + 相册权限: Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库? + + 通讯录权限: Privacy - Contacts Usage Description 是否允许此App访问你的通讯录? + + 蓝牙权限:Privacy - Bluetooth Peripheral Usage Description 是否许允此App使用蓝牙? + + 语音转文字权限:Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别? + + 日历权限:Privacy - Calendars Usage Description 是否允许此App使用日历? + + 定位权限:Privacy - Location When In Use Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据 + + 定位权限: Privacy - Location Always Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据 + */ + ++ (BASystermSetting *)ba_systermSettingManage +{ + static BASystermSetting *ba_systermSettingManage; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + ba_systermSettingManage = [[BASystermSetting alloc] init]; + }); + return ba_systermSettingManage; +} + +#pragma mark - ***** app跳转到系统的各种基本设置选项 +/*! + * 跳转系统通知 + */ +- (void)ba_gotoSystermSettings +{ + NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + [[UIApplication sharedApplication] openURL:url]; + BA_OpenUrl(UIApplicationOpenSettingsURLString); + } +} + +/*! + * 跳到WIFI界面 + */ +- (void)ba_gotoSystermWIFISettings +{ + /*! + (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 + */ + NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=WIFI"); + } +} + +/*! + * 跳到About关于本机界面 + */ +- (void)ba_gotoSystermAboutSettings +{ + /*! + (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 + */ + NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=About"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General&path=About"); + } +} + +/*! + * 跳到Accessibility辅助功能界面 + */ +- (void)ba_gotoSystermAccessibilitySettings +{ + /*! + (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 + */ + NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=ACCESSIBILITY"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General&path=ACCESSIBILITY"); + } +} + +/*! + * 跳到AirplaneModeOn飞行模式界面 + */ +- (void)ba_gotoSystermAirplaneModeOnSettings +{ + /*! + (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 + */ + NSURL *url = [NSURL URLWithString:@"prefs:root=AIRPLANE_MODE"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=AIRPLANE_MODE"); + } +} + +/*! + * 跳到Auto-Lock自动锁屏时间界面 + */ +- (void)ba_gotoSystermAutoLockSettings +{ + /*! + (1.)需要先配置plist文件:在URL types--URL Schemes中添加 prefs的字符串.因为苹果在iOS5.0后把系统自带的URL Schemes删除了 + */ + NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=AUTOLOCK"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General&path=AUTOLOCK"); + } +} + +/*! + * 跳到Brightness自动锁定界面 + */ +- (void)ba_gotoSystermBrightnessSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=Brightness"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=Brightness"); + } +} + +/*! + * 跳到MICROPHONE麦克风界面 + */ +- (void)ba_gotoSystermMICROPHONESettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy&path=MICROPHONE"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=Privacy&path=MICROPHONE"); + } +} + +/*! + * 跳到CONTACTS通讯录界面 + */ +- (void)ba_gotoSystermCONTACTSSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=Privacy&path=CONTACTS"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=Privacy&path=CONTACTS"); + } +} + +/*! + * 跳到Bluetooth蓝牙界面 + */ +- (void)ba_gotoSystermBluetoothSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=Bluetooth"); + } +} + +/*! + * 跳到DATE_AND_TIME日期和时间界面 + */ +- (void)ba_gotoSystermDATE_AND_TIMESettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=DATE_AND_TIME"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General&path=DATE_AND_TIME"); + } +} + +/*! + * 跳到FaceTime界面 + */ +- (void)ba_gotoSystermFaceTimeSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=FACETIME"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=FACETIME"); + } +} + +/*! + * 跳到General界面 + */ +- (void)ba_gotoSystermGeneralSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=General"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General"); + } +} + +/*! + * 跳到Keyboard界面 + */ +- (void)ba_gotoSystermKeyboardSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=General&path=Keyboard"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=General&path=Keyboard"); + } +} + +/*! + * 跳到iCloud界面 + */ +- (void)ba_gotoSystermiCloudSettings +{ + NSURL *url = [NSURL URLWithString:@"prefs:root=CASTLE"]; + if ([[UIApplication sharedApplication] canOpenURL:url]) + { + BA_OpenUrl(@"prefs:root=CASTLE"); + } +} + + +/*! + * 跳转Safari浏览器 + */ +- (void)ba_gotoSafariBrowserWithURL:(NSString *)url +{ + if ([BAKit_RegularExpression ba_regularIsUrl:url]) + { + /*! 跳转系统通知 */ + BA_OpenUrl(url); + } + else + { + BALog(@"url错误,请重新输入!"); + } + +} + + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.h" deleted file mode 100644 index 595e01d..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.h" +++ /dev/null @@ -1,52 +0,0 @@ -// -// BAClearCacheManager.h -// BABaseProject -// -// Created by 博爱 on 16/7/14. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import "BABaseNetManager.h" - -@interface BAClearCacheManager : BABaseNetManager - -@property (nonatomic, assign) CGFloat cacheSize; - -+ (instancetype)ba_sharedCache; - -/*! - * 计算单个文件大小 - * - * @param path path路径 - * - * @return 计算单个文件大小 - */ -- (CGFloat)ba_fileSizeAtPath:(NSString *)path; - -/*! - * 计算目录大小 - * - * @param path path路径 - * - * @return 计算目录大小 - */ -- (CGFloat)ba_folderSizeAtPath:(NSString *)path; - -/*! - * 缓存大小 - * - * @return 缓存大小 - */ -- (CGFloat)ba_loadCacheSize; - -/*! - * 清除缓存 - */ -- (void)ba_myClearCacheAction; - -/*! - * 清除缓存成功回调 - */ -- (void)ba_clearCacheSuccess; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.m" deleted file mode 100644 index 3d01b17..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAClearCacheManager.m" +++ /dev/null @@ -1,117 +0,0 @@ -// -// BAClearCacheManager.m -// BABaseProject -// -// Created by 博爱 on 16/7/14. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import "BAClearCacheManager.h" - -@implementation BAClearCacheManager - -+ (instancetype)ba_sharedCache -{ - static BAClearCacheManager *manager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - manager = [[BAClearCacheManager alloc] init]; - }); - - return manager; -} - -#pragma mark - 计算单个文件大小 -- (CGFloat)ba_fileSizeAtPath:(NSString *)path -{ - NSFileManager *fileManager=[NSFileManager defaultManager]; - if([fileManager fileExistsAtPath:path]) - { - long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize; - return size/1024.0/1024.0; - } - return 0; -} - -- (CGFloat)ba_loadCacheSize -{ - self.cacheSize = 0; - NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath]; - for (NSString *f in files) - { - NSString *path = [cachPath stringByAppendingPathComponent:f]; - self.cacheSize += [self ba_fileSizeAtPath:path]; - } - BALog(@"cacheSize == %f",self.cacheSize); - - return self.cacheSize; - -} - -#pragma mark - 计算目录大小 -- (CGFloat)ba_folderSizeAtPath:(NSString *)path -{ - NSFileManager *fileManager=[NSFileManager defaultManager]; - float folderSize; - if ([fileManager fileExistsAtPath:path]) - { - NSArray *childerFiles=[fileManager subpathsAtPath:path]; - for (NSString *fileName in childerFiles) - { - NSString *absolutePath=[path stringByAppendingPathComponent:fileName]; - folderSize += [self ba_fileSizeAtPath:absolutePath]; - } - //SDWebImage框架自身计算缓存的实现 - // folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0; - BALog(@"d = %f",folderSize); - return folderSize; - } - return 0; -} - -//第一种: -//-(void)clearCache:(NSString *)path{ -// NSFileManager *fileManager=[NSFileManager defaultManager]; -// if ([fileManager fileExistsAtPath:path]) { -// NSArray *childerFiles=[fileManager subpathsAtPath:path]; -// for (NSString *fileName in childerFiles) { -// //如有需要,加入条件,过滤掉不想删除的文件 -// NSString *absolutePath=[path stringByAppendingPathComponent:fileName]; -// [fileManager removeItemAtPath:absolutePath error:nil]; -// } -// } -// [[SDImageCache sharedImageCache] cleanDisk]; -//} - - -#pragma mark - 清除缓存 -//第二种: -- (void)ba_myClearCacheAction{ - dispatch_async( - dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) - , ^{ - NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - BALog(@"cachPath===%@",cachPath); - NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath]; - BALog(@"files :%lu",(unsigned long)[files count]); - BALog(@"file === %@",files); - for (NSString *p in files) - { - NSError *error; - NSString *path = [cachPath stringByAppendingPathComponent:p]; - if ([[NSFileManager defaultManager] fileExistsAtPath:path]) - { - [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; - } - } - [self performSelectorOnMainThread:@selector(ba_clearCacheSuccess) withObject:nil waitUntilDone:YES];}); -} - -- (void)ba_clearCacheSuccess -{ - BALog(@"清理成功"); -} - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.h" new file mode 100644 index 0000000..e9890c2 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.h" @@ -0,0 +1,54 @@ +// +// BAKit_ClearCacheManager.h +// BABaseProject +// +// Created by 博爱 on 16/7/14. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import + + +#define BAKit_ClearCacheManagerShared [BAKit_ClearCacheManager ba_sharedCache] +@interface BAKit_ClearCacheManager : NSObject + +@property (nonatomic, assign) CGFloat cacheSize; + ++ (instancetype)ba_sharedCache; + +/*! + * 计算单个文件大小 + * + * @param path path路径 + * + * @return 计算单个文件大小 + */ +- (CGFloat)ba_fileManagerGetSizeWithFilePath:(NSString *)path; + +/*! + * 计算目录大小 + * + * @param path path路径 + * + * @return 计算目录大小 + */ +- (CGFloat)ba_folderSizeAtPath:(NSString *)path; + +/*! + * 缓存大小,结果返回:1 M + * + * @return 缓存大小 + */ +- (CGFloat)ba_loadCacheSize; + +/*! + * 清除缓存 + */ +- (void)ba_myClearCacheAction; + +/*! + * 清除缓存成功回调 + */ +- (void)ba_clearCacheSuccess; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.m" new file mode 100644 index 0000000..52ce6a1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\346\270\205\347\220\206\347\274\223\345\255\230/BAKit_ClearCacheManager.m" @@ -0,0 +1,116 @@ +// +// BAKit_ClearCacheManager.m +// BABaseProject +// +// Created by 博爱 on 16/7/14. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BAKit_ClearCacheManager.h" + +@implementation BAKit_ClearCacheManager + ++ (instancetype)ba_sharedCache +{ + static BAKit_ClearCacheManager *manager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + manager = [[BAKit_ClearCacheManager alloc] init]; + }); + + return manager; +} + +#pragma mark - 计算单个文件大小 +/*! + * 缓存大小,结果返回:1 M + * + * @return 缓存大小 + */ +- (CGFloat)ba_fileManagerGetSizeWithFilePath:(NSString *)path +{ + return [NSFileManager ba_fileManagerGetSizeWithFilePath:path]/1024.0/1024.0; +} + +- (CGFloat)ba_loadCacheSize +{ + self.cacheSize = 0; + NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; + NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath]; + for (NSString *f in files) + { + NSString *path = [cachPath stringByAppendingPathComponent:f]; + self.cacheSize += [self ba_fileManagerGetSizeWithFilePath:path]; + } + NSLog(@"cacheSize == %f",self.cacheSize); + + return self.cacheSize; + +} + +#pragma mark - 计算目录大小 +- (CGFloat)ba_folderSizeAtPath:(NSString *)path +{ + NSFileManager *fileManager=[NSFileManager defaultManager]; + float folderSize = 0.0; + if ([fileManager fileExistsAtPath:path]) + { + NSArray *childerFiles=[fileManager subpathsAtPath:path]; + for (NSString *fileName in childerFiles) + { + NSString *absolutePath=[path stringByAppendingPathComponent:fileName]; + folderSize += [self ba_fileManagerGetSizeWithFilePath:absolutePath]; + } + //SDWebImage框架自身计算缓存的实现 + // folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0; + NSLog(@"d = %f",folderSize); + return folderSize; + } + return 0; +} + +//第一种: +//-(void)clearCache:(NSString *)path{ +// NSFileManager *fileManager=[NSFileManager defaultManager]; +// if ([fileManager fileExistsAtPath:path]) { +// NSArray *childerFiles=[fileManager subpathsAtPath:path]; +// for (NSString *fileName in childerFiles) { +// //如有需要,加入条件,过滤掉不想删除的文件 +// NSString *absolutePath=[path stringByAppendingPathComponent:fileName]; +// [fileManager removeItemAtPath:absolutePath error:nil]; +// } +// } +// [[SDImageCache sharedImageCache] cleanDisk]; +//} + + +#pragma mark - 清除缓存 +//第二种: +- (void)ba_myClearCacheAction{ + dispatch_async( + dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) + , ^{ + NSString *cachPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]; + NSLog(@"cachPath===%@",cachPath); + NSArray *files = [[NSFileManager defaultManager] subpathsAtPath:cachPath]; + NSLog(@"files :%lu",(unsigned long)[files count]); + NSLog(@"file === %@",files); + for (NSString *p in files) + { + NSError *error; + NSString *path = [cachPath stringByAppendingPathComponent:p]; + if ([[NSFileManager defaultManager] fileExistsAtPath:path]) + { + [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; + } + } + [self performSelectorOnMainThread:@selector(ba_clearCacheSuccess) withObject:nil waitUntilDone:YES];}); +} + +- (void)ba_clearCacheSuccess +{ + NSLog(@"清理成功"); +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJFooter.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJFooter.m" index 3cfce19..1efb9ee 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJFooter.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJFooter.m" @@ -22,7 +22,7 @@ - (void)prepare UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_anim__000%zd", i]]; [idleImages addObject:image]; } - [self setImages:idleImages forState:MJRefreshStateIdle]; +// [self setImages:idleImages forState:MJRefreshStateIdle]; /*! 设置即将刷新状态的动画图片(一松开就会刷新的状态) */ NSMutableArray *refreshingImages = [NSMutableArray array]; @@ -30,10 +30,10 @@ - (void)prepare UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_loading_0%zd", i]]; [refreshingImages addObject:image]; } - [self setImages:refreshingImages forState:MJRefreshStatePulling]; +// [self setImages:refreshingImages forState:MJRefreshStatePulling]; /*! 设置正在刷新状态的动画图片 */ - [self setImages:refreshingImages forState:MJRefreshStateRefreshing]; +// [self setImages:refreshingImages forState:MJRefreshStateRefreshing]; } diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJHeader.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJHeader.m" index 0a2c4f1..98a1c72 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJHeader.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/\350\207\252\345\256\232\344\271\211\344\270\213\346\213\211\345\210\267\346\226\260\345\212\250\347\224\273/BACustomMJHeader.m" @@ -22,7 +22,7 @@ - (void)prepare UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_anim__000%zd", i]]; [idleImages addObject:image]; } - [self setImages:idleImages forState:MJRefreshStateIdle]; +// [self setImages:idleImages forState:MJRefreshStateIdle]; /*! 设置即将刷新状态的动画图片(一松开就会刷新的状态) */ NSMutableArray *refreshingImages = [NSMutableArray array]; @@ -30,10 +30,10 @@ - (void)prepare UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"dropdown_loading_0%zd", i]]; [refreshingImages addObject:image]; } - [self setImages:refreshingImages forState:MJRefreshStatePulling]; +// [self setImages:refreshingImages forState:MJRefreshStatePulling]; /*! 设置正在刷新状态的动画图片 */ - [self setImages:refreshingImages forState:MJRefreshStateRefreshing]; +// [self setImages:refreshingImages forState:MJRefreshStateRefreshing]; } @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit.h" index a105e7e..cf81cfc 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit.h" @@ -72,10 +72,16 @@ #pragma mark - ****** UIKit类 /*! UIKit类 */ // 控件类 -//#import -#import "BAPickerView.h" #import "BATextView.h" -#import "BAAlertView.h" +/*! 自定义 TextField */ +#import "BATextField.h" + +#import "BAKit_Define.h" + +#pragma mark - 信息存储 类 +#import "BAKit_UserDefaults.h" +#import "NSString+BAFileManager.h" +#import "NSFileManager+BAKit.h" // 扩展类 @@ -85,9 +91,12 @@ #import "UILabel+BAKit.h" #import "UIScrollView+BAKit.h" #import "UITableView+BAKit.h" +#import "UITableViewCell+Reuse.h" + #import "UITextField+BAKit.h" #import "UIView+BAKit.h" #import "UIWebView+BAKit.h" +#import "UICollectionView+ARDynamicCacheHeightLayoutCell.h" #import "UIColor+BAKit.h" #import "UIFont+BAKit.h" @@ -99,21 +108,39 @@ #import "UINavigationController+BAKit.h" #import "UINavigationItem+CustomItem.h" +#import "UIApplication+AppInfo.h" +/*! UIAlertController 类 */ + +/*! 带富文本属性的 UILabel 封装 */ +#import "UILabel+BAAttributeTextTapAction.h" + #pragma mark - ****** Foundation类 /*! Foundation类 */ #import "NSArray+BAKit.h" #import "NSMutableArray+BAKit.h" +/*! 排序算法 */ +#import "NSMutableArray+BASort.h" + #import "NSDictionary+BAKit.h" #import "NSMutableDictionary+BAKit.h" -#import "NSString+BAKit.h" +/*! 日常 NSString 类型处理 */ +#import "BAKit_NSString.h" + #import "NSFileManager+BAKit.h" #import "NSNumber+BAKit.h" #import "NSDate+BAKit.h" #import "NSProcessInfo+BAKit.h" #import "NSThread+BAKit.h" +/*! RunTime */ +#import "NSObject+BARunTime.h" +/*! 阴影 */ +#import "NSShadow+BAKit.h" + +/*! app跳转到系统的各种基本设置选项 */ +#import "BASystermSetting.h" #pragma mark - ****** BAKitManager类 @@ -126,15 +153,29 @@ /*! GCD */ #import "GCD/GCD.h" /*! 清理系统缓存 */ -#import "BAClearCacheManager.h" +#import "BAKit_ClearCacheManager.h" +/*! 系统服务权限的封装 */ +#import "BASystemService.h" +/*! 正则表达式 */ +#import "BAKit_RegularExpression.h" /*! 自定义上下拉刷新 */ #import "BACustomMJFooter.h" #import "BACustomMJHeader.h" +/*! 自定义加载动画 */ +#import "BALoadingHubView.h" + +/*! hook */ +//#import "NSObject+BAHook.h" +/*! 公共方法类 */ +#import "BACommon.h" +/*! 公共跳转类 */ +#import "BAJumpManager.h" +#import "BAKit_Define.h" #endif /* BAKit_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager/BAKitManager.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager/BAKitManager.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager/BAKitManager.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKitManager/BAKitManager.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/entries" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/entries" new file mode 100644 index 0000000..195e187 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/entries" @@ -0,0 +1,402 @@ +10 + +dir +538 +svn://sunboyai@10.1.1.10/dev/app/iOS_APP/yunLianWIFI/yunlianWIFI/Class/Lib/BAKit/BAKit_Define +svn://sunboyai@10.1.1.10 + + + +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + +b149048b-2e27-475d-a9a8-a848529274c3 + +BAKit_FontDefine.h +file + + + + +2017-04-18T01:39:57.000000Z +8ea40d949f09728030e9835fa0d22d01 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +1037 + +BAKit_Singleton.h +file + + + + +2017-04-18T01:39:57.000000Z +0798d6164c02f93f2b2da5989b3a73f3 +2017-04-27T08:03:02.223126Z +475 +sunboyai +has-props + + + + + + + + + + + + + + + + + + + + +3845 + +BAKit_CommonDefine.h +file + + + + +2017-04-18T05:44:16.000000Z +8c034000f92598ade1d6ac03f4bc232a +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +10297 + +BAKit_AppKeyDefine.h +file + + + + +2017-04-18T01:39:57.000000Z +114cf1f4f81c4e52c9dd107a199db584 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +656 + +BAKit_Const_Color.h +file + + + + +2017-04-18T01:39:57.000000Z +08f854985df661cc5488787c9780de88 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +2612 + +BAKit_NotiDefine.h +file + + + + +2017-04-18T01:39:57.000000Z +b92db0830d71a03a150178a8e7a98135 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +381 + +BAKit_FrameDefine.h +file + + + + +2017-04-18T09:52:14.000000Z +98fc65ed9e5800aa3971f6721173e610 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +15314 + +BAKit_Const.h +file + + + + +2017-04-18T06:58:47.000000Z +291f7b24beb722e8c1dd336a8700b999 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +756 + +BAKit_Const_Color.m +file + + + + +2017-04-18T01:39:57.000000Z +ad308420dbc0469a11451d7745c8748b +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +4813 + +BAKit_Define.h +file + + + + +2017-04-18T01:39:57.000000Z +61354cde3491fcba85685144a995e973 +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +2527 + +BAKit_Const.m +file + + + + +2017-04-25T09:01:02.000000Z +26a089eaa0e2f27e13d20a3604e33c6d +2017-04-27T08:03:02.223126Z +475 +sunboyai + + + + + + + + + + + + + + + + + + + + + +775 + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/prop-base/BAKit_Singleton.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/prop-base/BAKit_Singleton.h.svn-base" new file mode 100644 index 0000000..869ac71 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/prop-base/BAKit_Singleton.h.svn-base" @@ -0,0 +1,5 @@ +K 14 +svn:executable +V 1 +* +END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_AppKeyDefine.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_AppKeyDefine.h.svn-base" new file mode 100644 index 0000000..6453601 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_AppKeyDefine.h.svn-base" @@ -0,0 +1,24 @@ +// +// BAKit_AppKeyDefine.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/3/1. +// Copyright © 2017年 boaihome. All rights reserved. +// 各种第三方 AppKey 的宏定义 + +#ifndef BAKit_AppKeyDefine_h +#define BAKit_AppKeyDefine_h + + +#pragma mark - 网易云信 + +#ifdef DEBUG + #define BAKit_AppKeyDefine_NIM_AppKey @"f8ca029d8448e4728045990a49d06585" + #define BAKit_AppKeyDefine_NIM_AppSecret @"afd9c6da9cfd" +#else + #define BAKit_AppKeyDefine_NIM_AppKey @"这里是release 版本的AppKey:111" + #define BAKit_AppKeyDefine_NIM_AppSecret @"这里是release 版本的AppSecret:111" +#endif + + +#endif /* BAKit_AppKeyDefine_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_CommonDefine.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_CommonDefine.h.svn-base" new file mode 100644 index 0000000..af6d7e2 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_CommonDefine.h.svn-base" @@ -0,0 +1,263 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +#ifndef BAKit_CommonDefine_h +#define BAKit_CommonDefine_h + +#ifndef __OPTIMIZE__ +#define NSLog(...) NSLog(__VA_ARGS__) +#else +#define NSLog(...){} +#endif + +#pragma mark - weak / strong + #define BAKit_WeakSelf @BAKit_Weakify(self); + #define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify + #if DEBUG + #if __has_feature(objc_arc) + #define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; + #else + #define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; + #endif + #else + #if __has_feature(objc_arc) + #define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; + #else + #define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; + #endif + #endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify + #if DEBUG + #if __has_feature(objc_arc) + #define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; + #else + #define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; + #endif + #else + #if __has_feature(objc_arc) + #define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; + #else + #define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; + #endif + #endif +#endif + +/*! 主线程同步队列 */ +#define dispatch_main_sync_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_sync(dispatch_get_main_queue(), block);\ + } +/*! 主线程异步队列 */ +#define dispatch_main_async_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_async(dispatch_get_main_queue(), block);\ + } + + +/*! 懒加载 */ +#define BAKit_Lazy(object, assignment) (object = object ?: assignment) + + +#pragma mark - NotiCenter + #define BAKit_NotiCenter [NSNotificationCenter defaultCenter] + +#define BAKit_NSUserDefaults [NSUserDefaults standardUserDefaults] + +/*! 获取sharedApplication */ +#define BAKit_SharedApplication [UIApplication sharedApplication] + + + +/*! 用safari打开URL */ +#define BAKit_OpenUrl(urlStr) [BAKit_SharedApplication openURL:[NSURL URLWithString:urlStr]] + +/*! 复制文字内容 */ +#define BAKit_CopyContent(content) [[UIPasteboard generalPasteboard] setString:content] + +#define BAKit_ImageName(imageName) [UIImage imageNamed:imageName] +#define BAKit_ImageBADiscoveryName(imageName) BAKit_ImageName([@"BADiscovery.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBAProfileName(imageName) BAKit_ImageName([@"BAProfile.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBATabBundleName(imageName) BAKit_ImageName([@"BATabBundle.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBAWeXinAppName(imageName) BAKit_ImageName([@"BAWeXinApp.bundle/" stringByAppendingString:imageName]) + +/*! 默认图片 */ +#define BAKit_DefaultImage BAKit_ImageName(@"image_default") +#define BAKit_DefaultUserImage BAKit_ImageName(@"contacts_defult") +#define BAKit_DefaultVideoImage BAKit_ImageName(@"video_defult") + +/*! 默认文字 */ +#define BAKit_DefaultLoading @"加载中..." +#define BAKit_DefaultLoading_location @"定位中,请稍后..." + + + +#pragma mark - 简单警告框 + /*! view 用 BAKit_ShowAlertWithMsg */ + #define BAKit_ShowAlertWithMsg(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示" message:(msg) delegate:nil cancelButtonTitle:@"确 定" otherButtonTitles:nil] show]; + /*! VC 用 BAKit_ShowAlertWithMsg */ + #define BAKit_ShowAlertWithMsg_ios8(msg) UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:msg preferredStyle:UIAlertControllerStyleAlert];\ + UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确 定" style:UIAlertActionStyleDefault handler:nil];\ + [alert addAction:sureAction];\ + [self presentViewController:alert animated:YES completion:nil]; + +#pragma mark - 内联函数 +/*! + 为什么引入内联函数: + 引入内联函数是为了解决函数调用效率的问题 + 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址。函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题 + + 使用内联函数 和 宏定义的区别: + 1.使用inline修饰的函数,在编译的时候,会把代码直接嵌入调用代码中。就相当于用#define 宏定义来定义一个add 函数那样!与#define的区别是: + 1)#define定义的格式要有要求,而使用inline则就行平常写函数那样,只要加上 inline 即可! + 2)使用#define宏定义的代码,编译器不会对其进行参数有效性检查,仅仅只是对符号表进行替换。 + 3)#define宏定义的代码,其返回值不能被强制转换成可转换的适合的转换类型。可参考百度文科 关于inline + + 2.在inline加上`static修饰符,只是为了表明该函数只在该文件中可见!也就是说,在同一个工程中,就算在其他文件中也出现同名、同参数的函数也不会引起函数重复定义的错误! + */ + +#pragma mark 随机数 +/*! + * 获取一个随机整数范围在:[0,i)包括0,不包括i + * + * @param i 最大的数 + * + * @return 获取一个随机整数范围在:[0,i)包括0,不包括i + */ +/*! + rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样。 + arc4random() 是一个真正的伪随机算法,不需要生成随机种子,因为第一次调用的时候就会自动生成。而且范围是rand()的两倍。在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值则是 0x100000000 (4294967296)。 + 精确度比较:arc4random() > random() > rand()。 + */ +CG_INLINE NSInteger +BAKit_RandomNumber(NSInteger i){ + return arc4random() % i; +} + +#pragma mark 从本地文件读取数据 +/*! + 从本地文件读取数据 + + @param fileName 文件名 + @param type type 类型 + @return data + */ +CG_INLINE NSData * +BAKit_GetDataWithContentsOfFile(NSString *fileName, NSString *type){ + return [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]; +} + +#pragma mark json 解析 data 数据 +/*! + json 解析 data 数据 + + @param data 需要解析的 data + @return NSDictionary + */ +CG_INLINE NSDictionary * +BAKit_GetDictionaryWithData(NSData *data){ + return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; +} + +#pragma mark json 解析 ,直接从本地文件读取 json 数据,返回 NSDictionary +/*! + json 解析 data 数据 + + @param fileName 文件名 + @param type type 类型 + @return NSDictionary + */ +CG_INLINE NSDictionary * +BAKit_GetDictionaryWithContentsOfFile(NSString *fileName, NSString *type){ + NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]; + return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; +} + + + +#endif /* BAKit_CommonDefine_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.h.svn-base" new file mode 100644 index 0000000..e046c23 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.h.svn-base" @@ -0,0 +1,36 @@ +// +// BAKit_Const.h +// BAQMUIDemo +// +// Created by boai on 2017/3/18. +// Copyright © 2017年 boaihome. All rights reserved. +// + + +#import +#import + +/********** Project Key ***********/ +// 经度key +FOUNDATION_EXTERN NSString *const Longitudekey; +// 纬度key +FOUNDATION_EXTERN NSString *const Latitudekey; +// 城市名key +FOUNDATION_EXTERN NSString *const CityNamekey; +// 网页标题key +FOUNDATION_EXTERN NSString *const WebTitlekey; +// 网页请求地址key +FOUNDATION_EXTERN NSString *const RequestURLkey; +// 网页请求 htmlString key +FOUNDATION_EXTERN NSString *const RequestHtmlStringkey; + +// model下标key +FOUNDATION_EXTERN NSString *const DataIndex; + + +/********** 网络请求地址 ***********/ + + + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.m.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.m.svn-base" new file mode 100644 index 0000000..13c27e7 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const.m.svn-base" @@ -0,0 +1,36 @@ +// +// BAKit_Const.m +// BAQMUIDemo +// +// Created by boai on 2017/3/18. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import "BAKit_Const.h" + +/********** Project Key ***********/ + + +// 经度key +NSString *const Longitudekey = @"Longitudekey"; +// 纬度key +NSString *const Latitudekey = @"Latitudekey"; +// 城市名key +NSString *const CityNamekey = @"CityNamekey"; +// 网页标题key +NSString *const WebTitlekey = @"WebTitlekey"; +// 网页请求地址key +NSString *const RequestURLkey = @"RequestURLkey"; +// 网页请求 htmlString key +NSString *const RequestHtmlStringkey = @"RequestHtmlStringkey"; +NSString *const RequestKey = @"RequestKey"; + + +// model下标key +NSString *const DataIndex = @"DataIndex"; + + +/********** 网络请求地址 ***********/ + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.h.svn-base" new file mode 100644 index 0000000..ae37ac9 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.h.svn-base" @@ -0,0 +1,92 @@ +// +// BAKit_Const_Color.h +// yunlianWIFI +// +// Created by boai on 2017/4/12. +// Copyright © 2017年 yunlianhui. All rights reserved. +// + +#import +#import + + +typedef unsigned char u_char; + +// 主题黄色 +FOUNDATION_EXTERN UIColor *BAKit_Color_ThemYellow; + +/*! 灰色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_1; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_2; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_3; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_4; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_5; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_6; +/*! cell.detailTextLabel.textColor 颜色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_7; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_8; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_9; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_10; +/*! tableView 背景颜色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_11; + +#pragma mark - 常用颜色 +/*! 半透明遮罩色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Translucent; +FOUNDATION_EXTERN UIColor *BAKit_Color_Translucent_3; + +/*! 白色 1.0 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_White; + +/*! 红色 1.0, 0.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Red; + +/*! 黄色 1.0, 1.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Yellow; + +/*! 绿色 0.0, 1.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Green; + +/*! 蓝色 0.0, 0.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Blue; + +/*! 无色 0.0 white, 0.0 alpha */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Clear; + +/*! 橙色 1.0, 0.5, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Orange; + +/*! 黑色 0.0 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Black; + +/*! 浅灰色 0.667 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_LightGray; + +/*! 青色 0.0, 1.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Cyan; + +/*! 红褐色 1.0, 0.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Magenta; + +/*! 棕色 0.6, 0.4, 0.2 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Brown; + +/*! 紫色 0.5, 0.0, 0.5 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Purple; + + + + + +/** -------------------------- 基础设置颜色函数 -------------------------- */ +//随机rgb颜色 +extern UIColor *BAKit_Color_RandomRGB(); +//随机rgba颜色 +extern UIColor *BAKit_Color_RandomRGBA(); +//颜色 rgbaValue - 0x12345678 +extern UIColor *BAKit_Color_RGBAValue(UInt32 rgbaValue); +//颜色 rgbValue - 0x123456 +extern UIColor *BAKit_Color_RGBValue(UInt32 rgbValue); + +extern UIColor *BAKit_Color_RGB(u_char r, u_char g, u_char b); +extern UIColor *BAKit_Color_RGBA(u_char r, u_char g, u_char b, u_char a); diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.m.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.m.svn-base" new file mode 100644 index 0000000..477eb1b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Const_Color.m.svn-base" @@ -0,0 +1,178 @@ +// +// BAKit_Const_Color.m +// yunlianWIFI +// +// Created by boai on 2017/4/12. +// Copyright © 2017年 yunlianhui. All rights reserved. +// + +#import "BAKit_Const_Color.h" + +// 主题黄色 +UIColor *BAKit_Color_ThemYellow; + +/*! 灰色 */ +UIColor *BAKit_Color_Gray_1; +UIColor *BAKit_Color_Gray_2; +UIColor *BAKit_Color_Gray_3; +UIColor *BAKit_Color_Gray_4; +UIColor *BAKit_Color_Gray_5; +UIColor *BAKit_Color_Gray_6; +UIColor *BAKit_Color_Gray_7; +UIColor *BAKit_Color_Gray_8; +UIColor *BAKit_Color_Gray_9; +UIColor *BAKit_Color_Gray_10; +UIColor *BAKit_Color_Gray_11; + +/*! 半透明遮罩色 */ +UIColor *BAKit_Color_Translucent; +UIColor *BAKit_Color_Translucent_3; + + +/*! 白色 1.0 white */ +UIColor *BAKit_Color_White; + +/*! 红色 1.0, 0.0, 0.0 RGB */ +UIColor *BAKit_Color_Red; + +/*! 黄色 1.0, 1.0, 0.0 RGB */ +UIColor *BAKit_Color_Yellow; + +/*! 绿色 0.0, 1.0, 0.0 RGB */ +UIColor *BAKit_Color_Green; + +/*! 蓝色 0.0, 0.0, 1.0 RGB */ +UIColor *BAKit_Color_Blue; + +/*! 无色 0.0 white, 0.0 alpha */ +UIColor *BAKit_Color_Clear; + +/*! 橙色 1.0, 0.5, 0.0 RGB */ +UIColor *BAKit_Color_Orange; + +/*! 黑色 0.0 white */ +UIColor *BAKit_Color_Black; + +/*! 浅灰色 0.667 white */ +UIColor *BAKit_Color_LightGray; + +/*! 青色 0.0, 1.0, 1.0 RGB */ +UIColor *BAKit_Color_Cyan; + +/*! 红褐色 1.0, 0.0, 1.0 RGB */ +UIColor *BAKit_Color_Magenta; + +/*! 棕色 0.6, 0.4, 0.2 RGB */ +UIColor *BAKit_Color_Brown; + +/*! 紫色 0.5, 0.0, 0.5 RGB */ +UIColor *BAKit_Color_Purple; + + + + +/** -------------------------- 基础设置颜色函数 -------------------------- */ + +UIColor *BAKit_Color_RandomRGB(){ + return BAKit_Color_RGBValue(arc4random_uniform(0xffffff)); +} + +UIColor *BAKit_Color_RandomRGBA(){ + return BAKit_Color_RGBAValue(arc4random_uniform(0xffffffff)); +} + +UIColor *BAKit_Color_RGBValue(UInt32 rgbValue){ + return [UIColor colorWithRed:((rgbValue & 0xff0000) >> 16) / 255.0f + green:((rgbValue & 0xff00) >> 8) / 255.0f + blue:(rgbValue & 0xff) / 255.0f + alpha:1.0f]; +} + +UIColor *BAKit_Color_RGBAValue(UInt32 rgbaValue){ + return [UIColor colorWithRed:((rgbaValue & 0xff000000) >> 24) / 255.0f + green:((rgbaValue & 0xff0000) >> 16) / 255.0f + blue:((rgbaValue & 0xff00) >> 8) / 255.0f + alpha:(rgbaValue & 0xff) / 255.0f]; +} + +UIColor *BAKit_Color_RGB(u_char r,u_char g, u_char b){ + return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]; +} + +UIColor *BAKit_Color_RGBA(u_char r,u_char g, u_char b, u_char a){ + return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a/255.0f]; +} + +/** + 加载颜色 + */ +@interface NSObject(BAKit_Const_Color) + +@end + +@implementation NSObject(BAKit_Const_Color) + ++ (void)load +{ + BAKit_Color_ThemYellow = BAKit_Color_RGB(229, 205, 139); + /*! 灰色 */ + BAKit_Color_Gray_1 = BAKit_Color_RGB(53, 60, 70); + BAKit_Color_Gray_2 = BAKit_Color_RGB(73, 80, 90); + BAKit_Color_Gray_3 = BAKit_Color_RGB(93, 100, 110); + BAKit_Color_Gray_4 = BAKit_Color_RGB(113, 120, 130); + BAKit_Color_Gray_5 = BAKit_Color_RGB(133, 140, 150); + BAKit_Color_Gray_6 = BAKit_Color_RGB(153, 160, 170); + BAKit_Color_Gray_7 = BAKit_Color_RGB(173, 180, 190); + BAKit_Color_Gray_8 = BAKit_Color_RGB(196, 200, 208); + BAKit_Color_Gray_9 = BAKit_Color_RGB(216, 220, 228); + BAKit_Color_Gray_10 = BAKit_Color_RGB(240, 240, 240); + BAKit_Color_Gray_11 = BAKit_Color_RGB(248, 248, 248); + + /*! 半透明遮罩色 */ + BAKit_Color_Translucent = BAKit_Color_RGBA(0, 0, 0, 255/2); + BAKit_Color_Translucent_3 = [[UIColor blackColor] colorWithAlphaComponent:0.3f]; + + /*! 白色 1.0 white */ + BAKit_Color_White = [UIColor whiteColor]; + + /*! 红色 1.0, 0.0, 0.0 RGB */ + BAKit_Color_Red = [UIColor redColor]; + + /*! 黄色 1.0, 1.0, 0.0 RGB */ + BAKit_Color_Yellow = [UIColor yellowColor]; + + /*! 绿色 0.0, 1.0, 0.0 RGB */ + BAKit_Color_Green = [UIColor greenColor]; + + /*! 蓝色 0.0, 0.0, 1.0 RGB */ + BAKit_Color_Blue = [UIColor blueColor]; + + /*! 无色 0.0 white, 0.0 alpha */ + BAKit_Color_Clear = [UIColor clearColor]; + + /*! 橙色 1.0, 0.5, 0.0 RGB */ + BAKit_Color_Orange = [UIColor orangeColor]; + + /*! 黑色 0.0 white */ + BAKit_Color_Black = [UIColor blackColor]; + + /*! 浅灰色 0.667 white */ + BAKit_Color_LightGray = [UIColor lightGrayColor]; + + /*! 青色 0.0, 1.0, 1.0 RGB */ + BAKit_Color_Cyan = [UIColor cyanColor]; + + /*! 红褐色 1.0, 0.0, 1.0 RGB */ + BAKit_Color_Magenta = [UIColor magentaColor]; + + /*! 棕色 0.6, 0.4, 0.2 RGB */ + BAKit_Color_Brown = [UIColor brownColor]; + + /*! 紫色 0.5, 0.0, 0.5 RGB */ + BAKit_Color_Purple = [UIColor purpleColor]; + + + +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Define.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Define.h.svn-base" new file mode 100644 index 0000000..4a0449a --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Define.h.svn-base" @@ -0,0 +1,73 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ // 博爱宏定义封装 + +#ifndef BAKit_Define_h +#define BAKit_Define_h + +#import "BAKit_CommonDefine.h" +#import "BAKit_Singleton.h" +#import "BAKit_FontDefine.h" +#import "BAKit_FrameDefine.h" +#import "BAKit_NotiDefine.h" +#import "BAKit_AppKeyDefine.h" +#import "BAKit_Const.h" +#import "BAKit_Const_Color.h" + + +#endif /* BAKit_Define_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FontDefine.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FontDefine.h.svn-base" new file mode 100644 index 0000000..df1f53c --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FontDefine.h.svn-base" @@ -0,0 +1,33 @@ +// +// BAKit_FontDefine.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/9. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_FontDefine_h +#define BAKit_FontDefine_h + +#pragma mark - TimeLine + +#define BAKit_FontSystem_10 [UIFont systemFontOfSize:10] +#define BAKit_FontSystem_11 [UIFont systemFontOfSize:11] +#define BAKit_FontSystem_12 [UIFont systemFontOfSize:12] +#define BAKit_FontSystem_13 [UIFont systemFontOfSize:13] +#define BAKit_FontSystem_14 [UIFont systemFontOfSize:14] +#define BAKit_FontSystem_15 [UIFont systemFontOfSize:15] +#define BAKit_FontSystem_16 [UIFont systemFontOfSize:16] +#define BAKit_FontSystem_17 [UIFont systemFontOfSize:17] +#define BAKit_FontSystem_18 [UIFont systemFontOfSize:18] +#define BAKit_FontSystem_19 [UIFont systemFontOfSize:19] +#define BAKit_FontSystem_20 [UIFont systemFontOfSize:20] +#define BAKit_FontSystem_25 [UIFont systemFontOfSize:25] +#define BAKit_FontSystem_30 [UIFont systemFontOfSize:30] + + + + + + +#endif /* BAKit_FontDefine_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FrameDefine.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FrameDefine.h.svn-base" new file mode 100644 index 0000000..1e1bee1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_FrameDefine.h.svn-base" @@ -0,0 +1,437 @@ +// +// BAKit_FrameDefine.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/9. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_FrameDefine_h +#define BAKit_FrameDefine_h + +#pragma mark - Margin +#define BAKit_Margin_1 BAKit_Flat(1) +#define BAKit_Margin_2 BAKit_Flat(2) +#define BAKit_Margin_5 BAKit_Flat(5) +#define BAKit_Margin_10 BAKit_Flat(10) +#define BAKit_Margin_15 BAKit_Flat(15) +#define BAKit_Margin_20 BAKit_Flat(20) +#define BAKit_Margin_25 BAKit_Flat(25) +#define BAKit_Margin_30 BAKit_Flat(30) +#define BAKit_Margin_35 BAKit_Flat(35) +#define BAKit_Margin_40 BAKit_Flat(40) +#define BAKit_Margin_44 BAKit_Flat(44) +#define BAKit_Margin_50 BAKit_Flat(50) +#define BAKit_Margin_100 BAKit_Flat(100) +#define BAKit_Margin_150 BAKit_Flat(150) + +#define BAKit_Margin_Content_width (SCREEN_WIDTH - BAKit_Margin_10 * 2) +#define BAKit_Margin_EmotionViewHeight BAKit_Flat(232) + + +#define BAKit_Margin_UserImage_Size BAKit_Margin_40 + + +#define BAKit_Margin_GridCell_w_h_4 (BAKit_SCREEN_WIDTH - (3 * BAKit_Margin_1))/4 +#define BAKit_Margin_GridCell_w_h_2 (BAKit_SCREEN_WIDTH - BAKit_Margin_1)/2 + +#define BAKit_Rect_FullScreenView CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) + + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +#define BAKit_ScreenScale ([[UIScreen mainScreen] scale]) + + + + +#pragma mark - 根据文字内容和大小返回 size +CG_INLINE CGSize +BAKit_LabelSizeWithTextAndFont(NSString *text, UIFont *font){ + CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:font}]; + CGSize newSize = CGSizeMake(size.width, size.height); + return newSize; +} + +#pragma mark - 根据文字内容、宽度和字体返回 size +CG_INLINE CGSize +BAKit_LabelSizeWithTextAndWidthAndFont(NSString *text, CGFloat width, UIFont *font){ + CGSize size = CGSizeMake(width, MAXFLOAT); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineBreakMode:NSLineBreakByCharWrapping]; + +// if (![text isKindOfClass:[NSString class]] || ![text isKindOfClass:[NSAttributedString class]]) +// { +// NSLog(@"text 错误,此功能仅限 NSString / NSAttributedString 类型!"); +// return CGSizeZero; +// } + CGRect frame = [text boundingRectWithSize:size + options: + NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading + attributes:@{NSFontAttributeName : font, NSParagraphStyleAttributeName : style} context:nil]; + CGRect newFrame = CGRectMake(frame.origin.x, frame.origin.y, width, frame.size.height); + return newFrame.size; +} + +CG_INLINE CGSize +BAKit_LabelSizeWithMutableAttributedStringAndWidthAndFont(NSMutableAttributedString *text, CGFloat width, UIFont *font){ + CGSize size = CGSizeMake(width, MAXFLOAT); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineBreakMode:NSLineBreakByCharWrapping]; + + // if (![text isKindOfClass:[NSString class]] || ![text isKindOfClass:[NSAttributedString class]]) + // { + // NSLog(@"text 错误,此功能仅限 NSString / NSAttributedString 类型!"); + // return CGSizeZero; + // } + CGRect frame = [[text copy] boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading context:nil]; + CGRect newFrame = CGRectMake(frame.origin.x, frame.origin.y, width, frame.size.height); + return newFrame.size; +} + +#pragma mark - 根据文字内容、高度和字体返回 宽度 +CG_INLINE CGFloat +BAKit_LabelWidthWithTextAndFont(NSString *text, CGFloat height, UIFont *font){ + CGSize size = CGSizeMake(MAXFLOAT, height); + NSDictionary *attributesDic = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName,nil]; + CGRect frame = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDic context:nil]; + + return frame.size.width; +} + +#pragma mark - UITableView +#pragma mark UITableView 分割线设置 +CG_INLINE void +BAKit_UITableViewSetSeparatorInset(id tableView, UIColor *color, UIEdgeInsets separatorInset) +{ + BOOL isTabelViewClass = [tableView isKindOfClass:[UITableView class]]; + if (!isTabelViewClass) + { + NSLog(@"分割线设置错误,此功能仅限 UITableView 类型!"); + return ; + } + + [tableView setSeparatorColor:color]; + [tableView setSeparatorInset:separatorInset]; +} + + +#pragma mark - 方法-C对象、结构操作 + +/** + * 基于指定的倍数,对传进来的 floatValue 进行像素取整。若指定倍数为0,则表示以当前设备的屏幕倍数为准。 + * + * 例如传进来 “2.1”,在 2x 倍数下会返回 2.5(0.5pt 对应 1px),在 3x 倍数下会返回 2.333(0.333pt 对应 1px)。 + */ +CG_INLINE CGFloat +BAKit_FlatSpecificScale(CGFloat floatValue, CGFloat scale) { + scale = scale == 0 ? BAKit_ScreenScale : scale; + CGFloat flattedValue = ceil(floatValue * scale) / scale; + return flattedValue; +} + +/** + * 基于当前设备的屏幕倍数,对传进来的 floatValue 进行像素取整。 + * + * 注意如果在 Core Graphic 绘图里使用时,要注意当前画布的倍数是否和设备屏幕倍数一致,若不一致,不可使用 flat() 函数,而应该用 flatSpecificScale + */ +CG_INLINE CGFloat +BAKit_Flat(CGFloat floatValue) { + return BAKit_FlatSpecificScale(floatValue, 0); +} + +/** + * 类似flat(),只不过 flat 是向上取整,而 floorInPixel 是向下取整 + */ +CG_INLINE CGFloat +BAKit_FloorInPixel(CGFloat floatValue) { + CGFloat resultValue = floor(floatValue * BAKit_ScreenScale) / BAKit_ScreenScale; + return resultValue; +} + +CG_INLINE BOOL +BAKit_Between(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) { + return minimumValue < value && value < maximumValue; +} + +CG_INLINE BOOL +BAKit_BetweenOrEqual(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) { + return minimumValue <= value && value <= maximumValue; +} + +CG_INLINE void +BAKit_ReplaceMethod(Class _class, SEL _originSelector, SEL _newSelector) { + Method oriMethod = class_getInstanceMethod(_class, _originSelector); + Method newMethod = class_getInstanceMethod(_class, _newSelector); + BOOL isAddedMethod = class_addMethod(_class, _originSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)); + if (isAddedMethod) { + class_replaceMethod(_class, _newSelector, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod)); + } else { + method_exchangeImplementations(oriMethod, newMethod); + } +} + +#pragma mark - CGFloat + +/// 用于居中运算 +CG_INLINE CGFloat +BAKit_CGFloatGetCenter(CGFloat parent, CGFloat child) { + return BAKit_Flat((parent - child) / 2.0); +} + +#pragma mark - CGPoint + +/// 两个point相加 +CG_INLINE CGPoint +BAKit_CGPointUnion(CGPoint point1, CGPoint point2) { + return CGPointMake(BAKit_Flat(point1.x + point2.x), BAKit_Flat(point1.y + point2.y)); +} + +/// 获取rect的center,包括rect本身的x/y偏移 +CG_INLINE CGPoint +BAKit_CGPointGetCenterWithRect(CGRect rect) { + return CGPointMake(BAKit_Flat(CGRectGetMidX(rect)), BAKit_Flat(CGRectGetMidY(rect))); +} + +CG_INLINE CGPoint +BAKit_CGPointGetCenterWithSize(CGSize size) { + return CGPointMake(BAKit_Flat(size.width / 2.0), BAKit_Flat(size.height / 2.0)); +} + +#pragma mark - UIEdgeInsets + +/// 获取UIEdgeInsets在水平方向上的值 +CG_INLINE CGFloat +BAKit_UIEdgeInsetsGetHorizontalValue(UIEdgeInsets insets) { + return insets.left + insets.right; +} + +/// 获取UIEdgeInsets在垂直方向上的值 +CG_INLINE CGFloat +BAKit_UIEdgeInsetsGetVerticalValue(UIEdgeInsets insets) { + return insets.top + insets.bottom; +} + +/// 将两个UIEdgeInsets合并为一个 +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsConcat(UIEdgeInsets insets1, UIEdgeInsets insets2) { + insets1.top += insets2.top; + insets1.left += insets2.left; + insets1.bottom += insets2.bottom; + insets1.right += insets2.right; + return insets1; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetTop(UIEdgeInsets insets, CGFloat top) { + insets.top = BAKit_Flat(top); + return insets; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetLeft(UIEdgeInsets insets, CGFloat left) { + insets.left = BAKit_Flat(left); + return insets; +} +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetBottom(UIEdgeInsets insets, CGFloat bottom) { + insets.bottom = BAKit_Flat(bottom); + return insets; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetRight(UIEdgeInsets insets, CGFloat right) { + insets.right = BAKit_Flat(right); + return insets; +} + +#pragma mark - CGSize + +/// 判断一个size是否为空(宽或高为0) +CG_INLINE BOOL +BAKit_CGSizeIsEmpty(CGSize size) { + return size.width <= 0 || size.height <= 0; +} + +/// 将一个CGSize像素对齐 +CG_INLINE CGSize +BAKit_CGSizeFlatted(CGSize size) { + return CGSizeMake(BAKit_Flat(size.width), BAKit_Flat(size.height)); +} + +/// 将一个 CGSize 以 pt 为单位向上取整 +CG_INLINE CGSize +BAKit_CGSizeCeil(CGSize size) { + return CGSizeMake(ceil(size.width), ceil(size.height)); +} + +/// 将一个 CGSize 以 pt 为单位向下取整 +CG_INLINE CGSize +BAKit_CGSizeFloor(CGSize size) { + return CGSizeMake(floor(size.width), floor(size.height)); +} + +#pragma mark - CGRect + +/// 判断一个CGRect是否存在NaN +CG_INLINE BOOL +BAKit_CGRectIsNaN(CGRect rect) { + return isnan(rect.origin.x) || isnan(rect.origin.y) || isnan(rect.size.width) || isnan(rect.size.height); +} + +/// 创建一个像素对齐的CGRect +CG_INLINE CGRect +BAKit_CGRectFlatMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { + return CGRectMake(BAKit_Flat(x), BAKit_Flat(y), BAKit_Flat(width), BAKit_Flat(height)); +} + +/// 对CGRect的x/y、width/height都调用一次flat,以保证像素对齐 +CG_INLINE CGRect +BAKit_CGRectFlatted(CGRect rect) { + return CGRectMake(BAKit_Flat(rect.origin.x), BAKit_Flat(rect.origin.y), BAKit_Flat(rect.size.width), BAKit_Flat(rect.size.height)); +} + +/// 为一个CGRect叠加scale计算 +CG_INLINE CGRect +BAKit_CGRectApplyScale(CGRect rect, CGFloat scale) { + return BAKit_CGRectFlatted(CGRectMake(CGRectGetMinX(rect) * scale, CGRectGetMinY(rect) * scale, CGRectGetWidth(rect) * scale, CGRectGetHeight(rect) * scale)); +} + +/// 计算view的水平居中,传入父view和子view的frame,返回子view在水平居中时的x值 +CG_INLINE CGFloat +BAKit_CGRectGetMinXHorizontallyCenterInParentRect(CGRect parentRect, CGRect childRect) { + return BAKit_Flat((CGRectGetWidth(parentRect) - CGRectGetWidth(childRect)) / 2.0); +} + +/// 计算view的垂直居中,传入父view和子view的frame,返回子view在垂直居中时的y值 +CG_INLINE CGFloat +BAKit_CGRectGetMinYVerticallyCenterInParentRect(CGRect parentRect, CGRect childRect) { + return BAKit_Flat((CGRectGetHeight(parentRect) - CGRectGetHeight(childRect)) / 2.0); +} + +/// 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持垂直居中时,layoutingRect的originY +CG_INLINE CGFloat +BAKit_CGRectGetMinYVerticallyCenter(CGRect referenceRect, CGRect layoutingRect) { + return CGRectGetMinY(referenceRect) + BAKit_CGRectGetMinYVerticallyCenterInParentRect(referenceRect, layoutingRect); +} + +/// 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持水平居中时,layoutingRect的originX +CG_INLINE CGFloat +BAKit_CGRectGetMinXHorizontallyCenter(CGRect referenceRect, CGRect layoutingRect) { + return CGRectGetMinX(referenceRect) + BAKit_CGRectGetMinXHorizontallyCenterInParentRect(referenceRect, layoutingRect); +} + +/// 为给定的rect往内部缩小insets的大小 +CG_INLINE CGRect +BAKit_CGRectInsetEdges(CGRect rect, UIEdgeInsets insets) { + rect.origin.x += insets.left; + rect.origin.y += insets.top; + rect.size.width -= BAKit_UIEdgeInsetsGetHorizontalValue(insets); + rect.size.height -= BAKit_UIEdgeInsetsGetVerticalValue(insets); + return rect; +} + +/// 传入size,返回一个x/y为0的CGRect +CG_INLINE CGRect +BAKit_CGRectMakeWithSize(CGSize size) { + return CGRectMake(0, 0, size.width, size.height); +} + +CG_INLINE CGRect +BAKit_CGRectFloatTop(CGRect rect, CGFloat top) { + rect.origin.y = top; + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatBottom(CGRect rect, CGFloat bottom) { + rect.origin.y = bottom - CGRectGetHeight(rect); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatRight(CGRect rect, CGFloat right) { + rect.origin.x = right - CGRectGetWidth(rect); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatLeft(CGRect rect, CGFloat left) { + rect.origin.x = left; + return rect; +} + +/// 保持rect的左边缘不变,改变其宽度,使右边缘靠在right上 +CG_INLINE CGRect +BAKit_CGRectLimitRight(CGRect rect, CGFloat rightLimit) { + rect.size.width = rightLimit - rect.origin.x; + return rect; +} + +/// 保持rect右边缘不变,改变其宽度和origin.x,使其左边缘靠在left上。只适合那种右边缘不动的view +/// 先改变origin.x,让其靠在offset上 +/// 再改变size.width,减少同样的宽度,以抵消改变origin.x带来的view移动,从而保证view的右边缘是不动的 +CG_INLINE CGRect +BAKit_CGRectLimitLeft(CGRect rect, CGFloat leftLimit) { + CGFloat subOffset = leftLimit - rect.origin.x; + rect.origin.x = leftLimit; + rect.size.width = rect.size.width - subOffset; + return rect; +} + +/// 限制rect的宽度,超过最大宽度则截断,否则保持rect的宽度不变 +CG_INLINE CGRect +BAKit_CGRectLimitMaxWidth(CGRect rect, CGFloat maxWidth) { + CGFloat width = CGRectGetWidth(rect); + rect.size.width = width > maxWidth ? maxWidth : width; + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetX(CGRect rect, CGFloat x) { + rect.origin.x = BAKit_Flat(x); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetY(CGRect rect, CGFloat y) { + rect.origin.y = BAKit_Flat(y); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetXY(CGRect rect, CGFloat x, CGFloat y) { + rect.origin.x = BAKit_Flat(x); + rect.origin.y = BAKit_Flat(y); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetWidth(CGRect rect, CGFloat width) { + rect.size.width = BAKit_Flat(width); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetHeight(CGRect rect, CGFloat height) { + rect.size.height = BAKit_Flat(height); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetSize(CGRect rect, CGSize size) { + rect.size = BAKit_CGSizeFlatted(size); + return rect; +} + + +#endif /* BAKit_FrameDefine_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_NotiDefine.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_NotiDefine.h.svn-base" new file mode 100644 index 0000000..3a96c85 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_NotiDefine.h.svn-base" @@ -0,0 +1,17 @@ +// +// BAKit_NotiDefine.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/17. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_NotiDefine_h +#define BAKit_NotiDefine_h + + +#define kNotioKey_TimeLineOperationButtonClicked @"kNotioKey_TimeLineOperationButtonClicked" +#define kNotioKey_LoginFinish @"kNotioKey_LoginFinish" + + +#endif /* BAKit_NotiDefine_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Singleton.h.svn-base" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Singleton.h.svn-base" new file mode 100644 index 0000000..210c6b5 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/.svn/text-base/BAKit_Singleton.h.svn-base" @@ -0,0 +1,155 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ +// 帮助实现单例设计模式 + +// .h文件的实现 +#define BAKit_SingletonH(methodName) + (instancetype)shared##methodName; + +// .m文件的实现 +#if __has_feature(objc_arc) // 是ARC +#define BAKit_SingletonM(methodName) \ +static id _instace = nil; \ ++ (id)allocWithZone:(struct _NSZone *)zone \ +{ \ +if (_instace == nil) { \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super allocWithZone:zone]; \ +}); \ +} \ +return _instace; \ +} \ +\ +- (id)init \ +{ \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super init]; \ +}); \ +return _instace; \ +} \ +\ ++ (instancetype)shared##methodName \ +{ \ +return [[self alloc] init]; \ +} \ ++ (id)copyWithZone:(struct _NSZone *)zone \ +{ \ +return _instace; \ +} \ +\ ++ (id)mutableCopyWithZone:(struct _NSZone *)zone \ +{ \ +return _instace; \ +} + +#else // 不是ARC + +#define BAKit_SingletonM(methodName) \ +static id _instace = nil; \ ++ (id)allocWithZone:(struct _NSZone *)zone \ +{ \ +if (_instace == nil) { \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super allocWithZone:zone]; \ +}); \ +} \ +return _instace; \ +} \ +\ +- (id)init \ +{ \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super init]; \ +}); \ +return _instace; \ +} \ +\ ++ (instancetype)shared##methodName \ +{ \ +return [[self alloc] init]; \ +} \ +\ +- (oneway void)release \ +{ \ +\ +} \ +\ +- (id)retain \ +{ \ +return self; \ +} \ +\ +- (NSUInteger)retainCount \ +{ \ +return 1; \ +} \ ++ (id)copyWithZone:(struct _NSZone *)zone \ +{ \ + return _instace; \ +} \ + \ ++ (id)mutableCopyWithZone:(struct _NSZone *)zone \ +{ \ + return _instace; \ +} + +#endif diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.h" new file mode 100644 index 0000000..e046c23 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.h" @@ -0,0 +1,36 @@ +// +// BAKit_Const.h +// BAQMUIDemo +// +// Created by boai on 2017/3/18. +// Copyright © 2017年 boaihome. All rights reserved. +// + + +#import +#import + +/********** Project Key ***********/ +// 经度key +FOUNDATION_EXTERN NSString *const Longitudekey; +// 纬度key +FOUNDATION_EXTERN NSString *const Latitudekey; +// 城市名key +FOUNDATION_EXTERN NSString *const CityNamekey; +// 网页标题key +FOUNDATION_EXTERN NSString *const WebTitlekey; +// 网页请求地址key +FOUNDATION_EXTERN NSString *const RequestURLkey; +// 网页请求 htmlString key +FOUNDATION_EXTERN NSString *const RequestHtmlStringkey; + +// model下标key +FOUNDATION_EXTERN NSString *const DataIndex; + + +/********** 网络请求地址 ***********/ + + + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.m" new file mode 100644 index 0000000..13c27e7 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const.m" @@ -0,0 +1,36 @@ +// +// BAKit_Const.m +// BAQMUIDemo +// +// Created by boai on 2017/3/18. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import "BAKit_Const.h" + +/********** Project Key ***********/ + + +// 经度key +NSString *const Longitudekey = @"Longitudekey"; +// 纬度key +NSString *const Latitudekey = @"Latitudekey"; +// 城市名key +NSString *const CityNamekey = @"CityNamekey"; +// 网页标题key +NSString *const WebTitlekey = @"WebTitlekey"; +// 网页请求地址key +NSString *const RequestURLkey = @"RequestURLkey"; +// 网页请求 htmlString key +NSString *const RequestHtmlStringkey = @"RequestHtmlStringkey"; +NSString *const RequestKey = @"RequestKey"; + + +// model下标key +NSString *const DataIndex = @"DataIndex"; + + +/********** 网络请求地址 ***********/ + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.h" new file mode 100644 index 0000000..aa9429c --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.h" @@ -0,0 +1,107 @@ +// +// BAKit_Const_Color.h +// yunlianWIFI +// +// Created by boai on 2017/4/12. +// Copyright © 2017年 yunlianhui. All rights reserved. +// + +#import +#import + + +typedef unsigned char u_char; + +// 主题黄色 +FOUNDATION_EXTERN UIColor *BAKit_Color_ThemYellow; +FOUNDATION_EXTERN UIColor *BAKit_Color_ThemBlue; + +// 支付宝 蓝色 +FOUNDATION_EXTERN UIColor *BAKit_Color_AliPayBlue; + + +/*! 灰色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_1; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_2; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_3; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_4; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_5; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_6; +/*! cell.detailTextLabel.textColor 颜色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_7; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_8; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_9; +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_10; +/*! tableView 背景颜色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Gray_11; + +#pragma mark - 常用颜色 +/*! 半透明遮罩色 */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Translucent; +FOUNDATION_EXTERN UIColor *BAKit_Color_Translucent_3; + +/*! 白色 1.0 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_White; + +/*! 红色 1.0, 0.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Red; + +/*! 黄色 1.0, 1.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Yellow; + +/*! 绿色 0.0, 1.0, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Green; + +/*! 蓝色 0.0, 0.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Blue; + +/*! 无色 0.0 white, 0.0 alpha */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Clear; + +/*! 橙色 1.0, 0.5, 0.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Orange; + +/*! 黑色 0.0 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Black; + +/*! 浅灰色 0.667 white */ +FOUNDATION_EXTERN UIColor *BAKit_Color_LightGray; + +/*! 青色 0.0, 1.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Cyan; + +/*! 红褐色 1.0, 0.0, 1.0 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Magenta; + +/*! 棕色 0.6, 0.4, 0.2 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Brown; + +/*! 紫色 0.5, 0.0, 0.5 RGB */ +FOUNDATION_EXTERN UIColor *BAKit_Color_Purple; + + + + + +/** -------------------------- 基础设置颜色函数 -------------------------- */ +// 随机rgb颜色 +extern UIColor *BAKit_Color_RandomRGB(); +// 随机rgba颜色 +extern UIColor *BAKit_Color_RandomRGBA(); +// 颜色 rgbaValue - 0x12345678 +extern UIColor *BAKit_Color_RGBAValue(UInt32 rgbaValue); +// 颜色 rgbValue - 0x123456 +extern UIColor *BAKit_Color_RGBValue(UInt32 rgbValue); + +extern UIColor *BAKit_Color_RGB(u_char r, u_char g, u_char b); +extern UIColor *BAKit_Color_RGBA(u_char r, u_char g, u_char b, u_char a); + +extern UIColor *BAKit_Color_Hex(NSString *hexString); + + + + + + + + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.m" new file mode 100644 index 0000000..765467b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Const_Color.m" @@ -0,0 +1,196 @@ +// +// BAKit_Const_Color.m +// yunlianWIFI +// +// Created by boai on 2017/4/12. +// Copyright © 2017年 yunlianhui. All rights reserved. +// + +#import "BAKit_Const_Color.h" + +// 主题黄色 +UIColor *BAKit_Color_ThemYellow; +UIColor *BAKit_Color_ThemBlue; + +// 支付宝 蓝色 +UIColor *BAKit_Color_AliPayBlue; + +/*! 灰色 */ +UIColor *BAKit_Color_Gray_1; +UIColor *BAKit_Color_Gray_2; +UIColor *BAKit_Color_Gray_3; +UIColor *BAKit_Color_Gray_4; +UIColor *BAKit_Color_Gray_5; +UIColor *BAKit_Color_Gray_6; +UIColor *BAKit_Color_Gray_7; +UIColor *BAKit_Color_Gray_8; +UIColor *BAKit_Color_Gray_9; +UIColor *BAKit_Color_Gray_10; +UIColor *BAKit_Color_Gray_11; + +/*! 半透明遮罩色 */ +UIColor *BAKit_Color_Translucent; +UIColor *BAKit_Color_Translucent_3; + + +/*! 白色 1.0 white */ +UIColor *BAKit_Color_White; + +/*! 红色 1.0, 0.0, 0.0 RGB */ +UIColor *BAKit_Color_Red; + +/*! 黄色 1.0, 1.0, 0.0 RGB */ +UIColor *BAKit_Color_Yellow; + +/*! 绿色 0.0, 1.0, 0.0 RGB */ +UIColor *BAKit_Color_Green; + +/*! 蓝色 0.0, 0.0, 1.0 RGB */ +UIColor *BAKit_Color_Blue; + +/*! 无色 0.0 white, 0.0 alpha */ +UIColor *BAKit_Color_Clear; + +/*! 橙色 1.0, 0.5, 0.0 RGB */ +UIColor *BAKit_Color_Orange; + +/*! 黑色 0.0 white */ +UIColor *BAKit_Color_Black; + +/*! 浅灰色 0.667 white */ +UIColor *BAKit_Color_LightGray; + +/*! 青色 0.0, 1.0, 1.0 RGB */ +UIColor *BAKit_Color_Cyan; + +/*! 红褐色 1.0, 0.0, 1.0 RGB */ +UIColor *BAKit_Color_Magenta; + +/*! 棕色 0.6, 0.4, 0.2 RGB */ +UIColor *BAKit_Color_Brown; + +/*! 紫色 0.5, 0.0, 0.5 RGB */ +UIColor *BAKit_Color_Purple; + + + + +/** -------------------------- 基础设置颜色函数 -------------------------- */ + +UIColor *BAKit_Color_RandomRGB(){ + return BAKit_Color_RGBValue(arc4random_uniform(0xffffff)); +} + +UIColor *BAKit_Color_RandomRGBA(){ + return BAKit_Color_RGBAValue(arc4random_uniform(0xffffffff)); +} + +UIColor *BAKit_Color_RGBValue(UInt32 rgbValue){ + return [UIColor colorWithRed:((rgbValue & 0xff0000) >> 16) / 255.0f + green:((rgbValue & 0xff00) >> 8) / 255.0f + blue:(rgbValue & 0xff) / 255.0f + alpha:1.0f]; +} + +UIColor *BAKit_Color_RGBAValue(UInt32 rgbaValue){ + return [UIColor colorWithRed:((rgbaValue & 0xff000000) >> 24) / 255.0f + green:((rgbaValue & 0xff0000) >> 16) / 255.0f + blue:((rgbaValue & 0xff00) >> 8) / 255.0f + alpha:(rgbaValue & 0xff) / 255.0f]; +} + +UIColor *BAKit_Color_RGB(u_char r,u_char g, u_char b){ + return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:1.0f]; +} + +UIColor *BAKit_Color_RGBA(u_char r,u_char g, u_char b, u_char a){ + return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a/255.0f]; +} + +UIColor *BAKit_Color_Hex(NSString *hexString) { + CGFloat r, g, b, a; + if (BAKit_hexStrToRGBA(hexString, &r, &g, &b, &a)) { + return [UIColor colorWithRed:r green:g blue:b alpha:a]; + } + return nil; +} + + +/** + 加载颜色 + */ +@interface NSObject(BAKit_Const_Color) + +@end + +@implementation NSObject(BAKit_Const_Color) + ++ (void)load +{ + BAKit_Color_ThemYellow = BAKit_Color_RGB(229, 205, 139); + BAKit_Color_ThemBlue = BAKit_Color_RGB(92, 140, 193); + + // 支付宝 蓝色 + BAKit_Color_AliPayBlue = BAKit_Color_RGB(0, 152, 229); + + /*! 灰色 */ + BAKit_Color_Gray_1 = BAKit_Color_RGB(53, 60, 70); + BAKit_Color_Gray_2 = BAKit_Color_RGB(73, 80, 90); + BAKit_Color_Gray_3 = BAKit_Color_RGB(93, 100, 110); + BAKit_Color_Gray_4 = BAKit_Color_RGB(113, 120, 130); + BAKit_Color_Gray_5 = BAKit_Color_RGB(133, 140, 150); + BAKit_Color_Gray_6 = BAKit_Color_RGB(153, 160, 170); + BAKit_Color_Gray_7 = BAKit_Color_RGB(173, 180, 190); + BAKit_Color_Gray_8 = BAKit_Color_RGB(196, 200, 208); + BAKit_Color_Gray_9 = BAKit_Color_RGB(216, 220, 228); + BAKit_Color_Gray_10 = BAKit_Color_RGB(240, 240, 240); + BAKit_Color_Gray_11 = BAKit_Color_RGB(248, 248, 248); + + /*! 半透明遮罩色 */ + BAKit_Color_Translucent = BAKit_Color_RGBA(0, 0, 0, 255/2); + BAKit_Color_Translucent_3 = [[UIColor blackColor] colorWithAlphaComponent:0.3f]; + + /*! 白色 1.0 white */ + BAKit_Color_White = [UIColor whiteColor]; + + /*! 红色 1.0, 0.0, 0.0 RGB */ + BAKit_Color_Red = [UIColor redColor]; + + /*! 黄色 1.0, 1.0, 0.0 RGB */ + BAKit_Color_Yellow = [UIColor yellowColor]; + + /*! 绿色 0.0, 1.0, 0.0 RGB */ + BAKit_Color_Green = [UIColor greenColor]; + + /*! 蓝色 0.0, 0.0, 1.0 RGB */ + BAKit_Color_Blue = [UIColor blueColor]; + + /*! 无色 0.0 white, 0.0 alpha */ + BAKit_Color_Clear = [UIColor clearColor]; + + /*! 橙色 1.0, 0.5, 0.0 RGB */ + BAKit_Color_Orange = [UIColor orangeColor]; + + /*! 黑色 0.0 white */ + BAKit_Color_Black = [UIColor blackColor]; + + /*! 浅灰色 0.667 white */ + BAKit_Color_LightGray = [UIColor lightGrayColor]; + + /*! 青色 0.0, 1.0, 1.0 RGB */ + BAKit_Color_Cyan = [UIColor cyanColor]; + + /*! 红褐色 1.0, 0.0, 1.0 RGB */ + BAKit_Color_Magenta = [UIColor magentaColor]; + + /*! 棕色 0.6, 0.4, 0.2 RGB */ + BAKit_Color_Brown = [UIColor brownColor]; + + /*! 紫色 0.5, 0.0, 0.5 RGB */ + BAKit_Color_Purple = [UIColor purpleColor]; + + + +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Define.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Define.h" new file mode 100644 index 0000000..384cc83 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Define.h" @@ -0,0 +1,74 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ // 博爱宏定义封装 + +#ifndef BAKit_Define_h +#define BAKit_Define_h + +#import "BAKit_DefineCommon.h" +#import "BAKit_Singleton.h" +#import "BAKit_DefineFont.h" +#import "BAKit_DefineFrame.h" +#import "BAKit_DefineNoti.h" +#import "BAKit_DefineAppKey.h" +#import "BAKit_Const.h" +#import "BAKit_Const_Color.h" +#import "BAKit_DefineCurrent.h" +#import "BAKit_DefineFormat.h" + +#endif /* BAKit_Define_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineAppKey.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineAppKey.h" new file mode 100644 index 0000000..ebadae0 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineAppKey.h" @@ -0,0 +1,24 @@ +// +// BAKit_DefineAppKey.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/3/1. +// Copyright © 2017年 boaihome. All rights reserved. +// 各种第三方 AppKey 的宏定义 + +#ifndef BAKit_DefineAppKey_h +#define BAKit_DefineAppKey_h + + +#pragma mark - 网易云信 + +#ifdef DEBUG + #define BAKit_DefineAppKey_NIM_AppKey @"f8ca029d8448e4728045990a49d06585" + #define BAKit_DefineAppKey_NIM_AppSecret @"afd9c6da9cfd" +#else + #define BAKit_DefineAppKey_NIM_AppKey @"这里是release 版本的AppKey:111" + #define BAKit_DefineAppKey_NIM_AppSecret @"这里是release 版本的AppSecret:111" +#endif + + +#endif /* BAKit_DefineAppKey_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCommon.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCommon.h" new file mode 100644 index 0000000..9c46a24 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCommon.h" @@ -0,0 +1,349 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +#ifndef BAKit_DefineCommon_h +#define BAKit_DefineCommon_h + +#ifndef __OPTIMIZE__ +#define NSLog(...) NSLog(__VA_ARGS__) +#else +#define NSLog(...){} +#endif + +#pragma mark - weak / strong + #define BAKit_WeakSelf @BAKit_Weakify(self); + #define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify + #if DEBUG + #if __has_feature(objc_arc) + #define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; + #else + #define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; + #endif + #else + #if __has_feature(objc_arc) + #define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; + #else + #define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; + #endif + #endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify + #if DEBUG + #if __has_feature(objc_arc) + #define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; + #else + #define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; + #endif + #else + #if __has_feature(objc_arc) + #define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; + #else + #define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; + #endif + #endif +#endif + +/*! 主线程同步队列 */ +#define dispatch_main_sync_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_sync(dispatch_get_main_queue(), block);\ + } +/*! 主线程异步队列 */ +#define dispatch_main_async_safe(block)\ + if ([NSThread isMainThread]) {\ + block();\ + } else {\ + dispatch_async(dispatch_get_main_queue(), block);\ + } + +#pragma mark - runtime +/*! runtime set */ +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) + +/*! runtime setCopy */ +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) + +/*! runtime get */ +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) + +/*! runtime exchangeMethod */ +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA), class_getInstanceMethod([self class], methodB)); + +/*! 懒加载 */ +#define BAKit_Lazy(object, assignment) (object = object ?: assignment) + + +#pragma mark - NotiCenter + #define BAKit_NotiCenter [NSNotificationCenter defaultCenter] + +#define BAKit_NSUserDefaults [NSUserDefaults standardUserDefaults] + +/*! 获取sharedApplication */ +#define BAKit_SharedApplication [UIApplication sharedApplication] + + + +/*! 用safari打开URL */ +#define BAKit_OpenUrl(urlStr) [BAKit_SharedApplication openURL:[NSURL URLWithString:urlStr]] + +/*! 复制文字内容 */ +#define BAKit_CopyContent(content) [[UIPasteboard generalPasteboard] setString:content] + +#define BAKit_ImageName(imageName) [UIImage imageNamed:imageName] +#define BAKit_ImageBADiscoveryName(imageName) BAKit_ImageName([@"BADiscovery.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBAProfileName(imageName) BAKit_ImageName([@"BAProfile.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBATabBundleName(imageName) BAKit_ImageName([@"BATabBundle.bundle/" stringByAppendingString:imageName]) +#define BAKit_ImageBAWeXinAppName(imageName) BAKit_ImageName([@"BAWeXinApp.bundle/" stringByAppendingString:imageName]) + +/*! 默认图片 */ +#define BAKit_DefaultImage BAKit_ImageName(@"image_default") +#define BAKit_DefaultUserImage BAKit_ImageName(@"contacts_defult") +#define BAKit_DefaultVideoImage BAKit_ImageName(@"video_defult") + +/*! 默认文字 */ +#define BAKit_DefaultLoading @"加载中..." +#define BAKit_DefaultLoading_location @"定位中,请稍后..." + +#pragma mark - 获取时间间隔 +/*! 获取时间间隔 */ +#define BAKit_CFAbsoluteTime_start CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); +#define BAKit_CFAbsoluteTime_end CFAbsoluteTime end = CFAbsoluteTimeGetCurrent(); \ +NSLog(@"获取时间间隔 = %f", end -start); + +#pragma mark - 获取沙盒目录路径 +/*! 获取沙盒 Cache 目录路径 */ +#define BAKit_Path_Cache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] + +/*! 获取沙盒 home 目录路径 */ +#define BAKit_Path_Home NSHomeDirectory() + + +#pragma mark - 简单警告框 + /*! view 用 BAKit_ShowAlertWithMsg */ + #define BAKit_ShowAlertWithMsg(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示" message:(msg) delegate:nil cancelButtonTitle:@"确 定" otherButtonTitles:nil] show]; + /*! VC 用 BAKit_ShowAlertWithMsg */ + #define BAKit_ShowAlertWithMsg_ios8(msg) UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:msg preferredStyle:UIAlertControllerStyleAlert];\ + UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确 定" style:UIAlertActionStyleDefault handler:nil];\ + [alert addAction:sureAction];\ + [self presentViewController:alert animated:YES completion:nil]; + +#pragma mark - 内联函数 +/*! + 为什么引入内联函数: + 引入内联函数是为了解决函数调用效率的问题 + 由于函数之间的调用,会从一个内存地址调到另外一个内存地址,当函数调用完毕之后还会返回原来函数执行的地址。函数调用会有一定的时间开销,引入内联函数就是为了解决这一问题 + + 使用内联函数 和 宏定义的区别: + 1.使用inline修饰的函数,在编译的时候,会把代码直接嵌入调用代码中。就相当于用#define 宏定义来定义一个add 函数那样!与#define的区别是: + 1)#define定义的格式要有要求,而使用inline则就行平常写函数那样,只要加上 inline 即可! + 2)使用#define宏定义的代码,编译器不会对其进行参数有效性检查,仅仅只是对符号表进行替换。 + 3)#define宏定义的代码,其返回值不能被强制转换成可转换的适合的转换类型。可参考百度文科 关于inline + + 2.在inline加上`static修饰符,只是为了表明该函数只在该文件中可见!也就是说,在同一个工程中,就算在其他文件中也出现同名、同参数的函数也不会引起函数重复定义的错误! + */ + +#pragma mark 随机数 +/*! + * 获取一个随机整数范围在:[0,i)包括0,不包括i + * + * @param i 最大的数 + * + * @return 获取一个随机整数范围在:[0,i)包括0,不包括i + */ +/*! + rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样。 + arc4random() 是一个真正的伪随机算法,不需要生成随机种子,因为第一次调用的时候就会自动生成。而且范围是rand()的两倍。在iPhone中,RAND_MAX是0x7fffffff (2147483647),而arc4random()返回的最大值则是 0x100000000 (4294967296)。 + 精确度比较:arc4random() > random() > rand()。 + */ +CG_INLINE NSInteger +BAKit_RandomNumber(NSInteger i){ + return arc4random() % i; +} + +/** + 计算列数【根据 array.count、每行多少个 item,计算列数】 + + @param array array + @param rowCount 每行多少个 item + @return 列数 + */ +CG_INLINE NSInteger +BAKit_getColumnCountWithArrayAndRowCount(NSArray *array, NSInteger rowCount){ + NSUInteger count = array.count; + + NSUInteger i = 0; + if (count % rowCount == 0) + { + i = count / rowCount; + } + else + { + i = count / rowCount + 1; + } + return i; +} + +CG_INLINE NSUInteger BAKit_hexStrToInt(NSString *str) { + uint32_t result = 0; + sscanf([str UTF8String], "%X", &result); + return result; +} + +#import "NSString+BATrims.h" +CG_INLINE BOOL BAKit_hexStrToRGBA(NSString *str, + CGFloat *r, CGFloat *g, CGFloat *b, CGFloat *a) { + str = [[str ba_trimWhitespaceAndNewlines] uppercaseString]; + if ([str hasPrefix:@"#"]) { + str = [str substringFromIndex:1]; + } else if ([str hasPrefix:@"0X"]) { + str = [str substringFromIndex:2]; + } + + NSUInteger length = [str length]; + // RGB RGBA RRGGBB RRGGBBAA + if (length != 3 && length != 4 && length != 6 && length != 8) { + return NO; + } + + //RGB,RGBA,RRGGBB,RRGGBBAA + if (length < 5) { + *r = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(0, 1)]) / 255.0f; + *g = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(1, 1)]) / 255.0f; + *b = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(2, 1)]) / 255.0f; + if (length == 4) *a = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(3, 1)]) / 255.0f; + else *a = 1; + } else { + *r = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(0, 2)]) / 255.0f; + *g = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(2, 2)]) / 255.0f; + *b = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(4, 2)]) / 255.0f; + if (length == 8) *a = BAKit_hexStrToInt([str substringWithRange:NSMakeRange(6, 2)]) / 255.0f; + else *a = 1; + } + return YES; +} + +#pragma mark 从本地文件读取数据 +/*! + 从本地文件读取数据 + + @param fileName 文件名 + @param type type 类型 + @return data + */ +CG_INLINE NSData * +BAKit_GetDataWithContentsOfFile(NSString *fileName, NSString *type){ + return [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]; +} + +#pragma mark json 解析 data 数据 +/*! + json 解析 data 数据 + + @param data 需要解析的 data + @return NSDictionary + */ +CG_INLINE NSDictionary * +BAKit_GetDictionaryWithData(NSData *data){ + return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; +} + +#pragma mark json 解析 ,直接从本地文件读取 json 数据,返回 NSDictionary +/*! + json 解析 data 数据 + + @param fileName 文件名 + @param type type 类型 + @return NSDictionary + */ +CG_INLINE NSDictionary * +BAKit_GetDictionaryWithContentsOfFile(NSString *fileName, NSString *type){ + NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]; + return [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil]; +} + + + +#endif /* BAKit_DefineCommon_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCurrent.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCurrent.h" new file mode 100644 index 0000000..5283ca7 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineCurrent.h" @@ -0,0 +1,118 @@ +// +// BAKit_DefineCurrent.h +// BAKit +// +// Created by boai on 2017/6/9. +// Copyright © 2017年 boai. All rights reserved. +// + +#ifndef BAKit_DefineCurrent_h +#define BAKit_DefineCurrent_h + +#import "NSDate+BAKit.h" +#import "NSDateFormatter+BAKit.h" +#import "NSString+BATime.h" + +/** + 当前日期 + + @return 当前日期 + */ +CG_INLINE NSDate * +BAKit_Current_Date(void){ + return [NSDate date]; +} + +/** + 当前日历 + + @return 当前日历 + */ +CG_INLINE NSCalendar * +BAKit_Current_Calendar(void){ + return [NSCalendar currentCalendar]; +} + +/** + 当前时间【year】 + + @return 当前时间【year】 + */ +CG_INLINE NSInteger +BAKit_Current_Year(void){ + return BAKit_Current_Date().year; +} + +/** + 当前时间【month】 + + @return 当前时间【month】 + */ +CG_INLINE NSInteger +BAKit_Current_Month(void){ + return BAKit_Current_Date().month; +} + +/** + 当前时间【day】 + + @return 当前时间【day】 + */ +CG_INLINE NSInteger +BAKit_Current_Day(void){ + return BAKit_Current_Date().day; +} + +/** + 当前时间【hour】 + + @return 当前时间【hour】 + */ +CG_INLINE NSInteger +BAKit_Current_Hour(void){ + return BAKit_Current_Date().hour; +} + +/** + 当前时间【minute】 + + @return 当前时间【minute】 + */ +CG_INLINE NSInteger +BAKit_Current_Minute(void){ + return BAKit_Current_Date().minute; +} + +/** + 当前时间【weekday】 + + @return 当前时间【weekday】 + */ +CG_INLINE NSString * +BAKit_Current_Weekday(void){ + return [NSString ba_time_getWeekdayWithDate:BAKit_Current_Date()]; +} + +/** + 当前时间【YMDHMS】 + + @return 当前时间【YMDHMS】 + */ +CG_INLINE NSString * +BAKit_Current_DateYMDHMS(void){ + return [NSString ba_time_getSystermCurrentDateYMDHMS]; +} + +/** + 当前时间【YMDHMS】 + + @return 当前时间【YMDHMS】 + */ +CG_INLINE NSString * +BAKit_Current_DateWithFormatString(NSString *formatString){ + return [NSString ba_time_getSystermCurrentDateWithFormatString:formatString]; +} + + + +#endif /* BAKit_DefineCurrent_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFont.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFont.h" new file mode 100644 index 0000000..3c0e2e3 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFont.h" @@ -0,0 +1,77 @@ +// +// BAKit_DefineFont.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/9. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_DefineFont_h +#define BAKit_DefineFont_h + +#pragma mark - 自定义系统字体大小 +CG_INLINE UIFont * +BAKit_Font_systemFontOfSize(CGFloat fontSize){ + return [UIFont systemFontOfSize:fontSize]; +} + +#pragma mark - 粗体 +CG_INLINE UIFont * +BAKit_Font_boldSystemFontOfSize(CGFloat fontSize){ + return [UIFont boldSystemFontOfSize:fontSize]; +} + +#pragma mark - 斜体 +CG_INLINE UIFont * +BAKit_Font_italicSystemFontOfSize(CGFloat fontSize){ + return [UIFont italicSystemFontOfSize:fontSize]; +} + +#pragma mark - 自定义系统字体大小和粗细 +CG_INLINE UIFont * +BAKit_Font_systemFontOfSizeAndWeight(CGFloat fontSize, CGFloat weight){ + return [UIFont systemFontOfSize:fontSize weight:weight]; +} + +#pragma mark - 自定义等宽字体大小和粗细 +CG_INLINE UIFont * +BAKit_Font_monospacedDigitSystemFontOfSizeAndWeight(CGFloat fontSize, CGFloat weight){ + return [UIFont monospacedDigitSystemFontOfSize:fontSize weight:weight]; +} + + +#pragma mark - 常用系统字体大小 +#define BAKit_Font_systemFontOfSize_10 BAKit_Font_systemFontOfSize(10) +#define BAKit_Font_systemFontOfSize_11 BAKit_Font_systemFontOfSize(11) +#define BAKit_Font_systemFontOfSize_12 BAKit_Font_systemFontOfSize(12) +#define BAKit_Font_systemFontOfSize_13 BAKit_Font_systemFontOfSize(13) +#define BAKit_Font_systemFontOfSize_14 BAKit_Font_systemFontOfSize(14) +#define BAKit_Font_systemFontOfSize_15 BAKit_Font_systemFontOfSize(15) +#define BAKit_Font_systemFontOfSize_16 BAKit_Font_systemFontOfSize(16) +#define BAKit_Font_systemFontOfSize_17 BAKit_Font_systemFontOfSize(17) +#define BAKit_Font_systemFontOfSize_18 BAKit_Font_systemFontOfSize(18) +#define BAKit_Font_systemFontOfSize_19 BAKit_Font_systemFontOfSize(19) +#define BAKit_Font_systemFontOfSize_20 BAKit_Font_systemFontOfSize(20) +#define BAKit_Font_systemFontOfSize_25 BAKit_Font_systemFontOfSize(25) +#define BAKit_Font_systemFontOfSize_30 BAKit_Font_systemFontOfSize(30) + +#pragma mark - 常用粗体系统字体大小 +#define BAKit_Font_boldSystemFontOfSize_10 BAKit_Font_boldSystemFontOfSize(10) +#define BAKit_Font_boldSystemFontOfSize_11 BAKit_Font_boldSystemFontOfSize(11) +#define BAKit_Font_boldSystemFontOfSize_12 BAKit_Font_boldSystemFontOfSize(12) +#define BAKit_Font_boldSystemFontOfSize_13 BAKit_Font_boldSystemFontOfSize(13) +#define BAKit_Font_boldSystemFontOfSize_14 BAKit_Font_boldSystemFontOfSize(14) +#define BAKit_Font_boldSystemFontOfSize_15 BAKit_Font_boldSystemFontOfSize(15) +#define BAKit_Font_boldSystemFontOfSize_16 BAKit_Font_boldSystemFontOfSize(16) +#define BAKit_Font_boldSystemFontOfSize_17 BAKit_Font_boldSystemFontOfSize(17) +#define BAKit_Font_boldSystemFontOfSize_18 BAKit_Font_boldSystemFontOfSize(18) +#define BAKit_Font_boldSystemFontOfSize_19 BAKit_Font_boldSystemFontOfSize(19) +#define BAKit_Font_boldSystemFontOfSize_20 BAKit_Font_boldSystemFontOfSize(20) +#define BAKit_Font_boldSystemFontOfSize_25 BAKit_Font_boldSystemFontOfSize(25) +#define BAKit_Font_boldSystemFontOfSize_30 BAKit_Font_boldSystemFontOfSize(30) + + + + + +#endif /* BAKit_DefineFont_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFormat.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFormat.h" new file mode 100644 index 0000000..94795e1 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFormat.h" @@ -0,0 +1,38 @@ +// +// BAKit_DefineFormat.h +// BAKit +// +// Created by boai on 2017/6/9. +// Copyright © 2017年 boai. All rights reserved. +// + +#ifndef BAKit_DefineFormat_h +#define BAKit_DefineFormat_h + + +#define BAKit_FormatString_YMD @"yyyy-MM-dd" +#define BAKit_FormatString_YMDHM @"yyyy-MM-dd HH:mm" +#define BAKit_FormatString_YMDHMS @"yyyy-MM-dd HH:mm:ss" +#define BAKit_FormatString_YMDEHMS @"yyyy-MM-dd, EEE, HH:mm:ss" +#define BAKit_FormatString_YM @"yyyy-MM" +#define BAKit_FormatString_MDHM @"MM-dd HH:mm" + +#define BAKit_FormatString_YMD2 @"yyyy/MM/dd" +#define BAKit_FormatString_YMDHM2 @"yyyy/MM/dd HH:mm" +#define BAKit_FormatString_YMDHMS2 @"yyyy/MM/dd HH:mm:ss" +#define BAKit_FormatString_YMDEHMS2 @"yyyy/MM/dd, EEE, HH:mm:ss" +#define BAKit_FormatString_YM2 @"yyyy/MM" + +#define BAKit_FormatString_YMD3 @"yyyy年MM月dd日" + +#define BAKit_FormatString_Y @"yyyy" +#define BAKit_FormatString_M @"MM" +#define BAKit_FormatString_D @"dd" +#define BAKit_FormatString_HM @"HH:mm" +#define BAKit_FormatString_HMS @"HH:mm:ss" + + + + + +#endif /* BAKit_DefineFormat_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFrame.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFrame.h" new file mode 100644 index 0000000..8e9de1c --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineFrame.h" @@ -0,0 +1,439 @@ +// +// BAKit_DefineFrame.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/9. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_DefineFrame_h +#define BAKit_DefineFrame_h + +#import + +#pragma mark - Margin +#define BAKit_Margin_1 BAKit_Flat(1) +#define BAKit_Margin_2 BAKit_Flat(2) +#define BAKit_Margin_5 BAKit_Flat(5) +#define BAKit_Margin_10 BAKit_Flat(10) +#define BAKit_Margin_15 BAKit_Flat(15) +#define BAKit_Margin_20 BAKit_Flat(20) +#define BAKit_Margin_25 BAKit_Flat(25) +#define BAKit_Margin_30 BAKit_Flat(30) +#define BAKit_Margin_35 BAKit_Flat(35) +#define BAKit_Margin_40 BAKit_Flat(40) +#define BAKit_Margin_44 BAKit_Flat(44) +#define BAKit_Margin_50 BAKit_Flat(50) +#define BAKit_Margin_100 BAKit_Flat(100) +#define BAKit_Margin_150 BAKit_Flat(150) + +#define BAKit_Margin_Content_width (SCREEN_WIDTH - BAKit_Margin_10 * 2) +#define BAKit_Margin_EmotionViewHeight BAKit_Flat(232) + + +#define BAKit_Margin_UserImage_Size BAKit_Margin_40 + + +#define BAKit_Margin_GridCell_w_h_4 (BAKit_SCREEN_WIDTH - (3 * BAKit_Margin_1))/4 +#define BAKit_Margin_GridCell_w_h_2 (BAKit_SCREEN_WIDTH - BAKit_Margin_1)/2 + +#define BAKit_Rect_FullScreenView CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) + + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +#define BAKit_ScreenScale ([[UIScreen mainScreen] scale]) + + + + +#pragma mark - 根据文字内容和大小返回 size +CG_INLINE CGSize +BAKit_LabelSizeWithTextAndFont(NSString *text, UIFont *font){ + CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:font}]; + CGSize newSize = CGSizeMake(size.width, size.height); + return newSize; +} + +#pragma mark - 根据文字内容、宽度和字体返回 size +CG_INLINE CGSize +BAKit_LabelSizeWithTextAndWidthAndFont(NSString *text, CGFloat width, UIFont *font){ + CGSize size = CGSizeMake(width, MAXFLOAT); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineBreakMode:NSLineBreakByWordWrapping]; + +// if (![text isKindOfClass:[NSString class]] || ![text isKindOfClass:[NSAttributedString class]]) +// { +// NSLog(@"text 错误,此功能仅限 NSString / NSAttributedString 类型!"); +// return CGSizeZero; +// } + CGRect frame = [text boundingRectWithSize:size + options: + NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading + attributes:@{NSFontAttributeName : font, NSParagraphStyleAttributeName : style} context:nil]; + CGRect newFrame = CGRectMake(frame.origin.x, frame.origin.y, width, frame.size.height); + return newFrame.size; +} + +CG_INLINE CGSize +BAKit_LabelSizeWithMutableAttributedStringAndWidthAndFont(NSMutableAttributedString *text, CGFloat width, UIFont *font){ + CGSize size = CGSizeMake(width, MAXFLOAT); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineBreakMode:NSLineBreakByWordWrapping]; + + // if (![text isKindOfClass:[NSString class]] || ![text isKindOfClass:[NSAttributedString class]]) + // { + // NSLog(@"text 错误,此功能仅限 NSString / NSAttributedString 类型!"); + // return CGSizeZero; + // } + CGRect frame = [[text copy] boundingRectWithSize:size options:NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading context:nil]; + CGRect newFrame = CGRectMake(frame.origin.x, frame.origin.y, width, frame.size.height); + return newFrame.size; +} + +#pragma mark - 根据文字内容、高度和字体返回 宽度 +CG_INLINE CGFloat +BAKit_LabelWidthWithTextAndFont(NSString *text, CGFloat height, UIFont *font){ + CGSize size = CGSizeMake(MAXFLOAT, height); + NSDictionary *attributesDic = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName,nil]; + CGRect frame = [text boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:attributesDic context:nil]; + + return frame.size.width; +} + +#pragma mark - UITableView +#pragma mark UITableView 分割线设置 +CG_INLINE void +BAKit_UITableViewSetSeparatorInset(id tableView, UIColor *color, UIEdgeInsets separatorInset) +{ + BOOL isTabelViewClass = [tableView isKindOfClass:[UITableView class]]; + if (!isTabelViewClass) + { + NSLog(@"分割线设置错误,此功能仅限 UITableView 类型!"); + return ; + } + + [tableView setSeparatorColor:color]; + [tableView setSeparatorInset:separatorInset]; +} + + +#pragma mark - 方法-C对象、结构操作 + +/** + * 基于指定的倍数,对传进来的 floatValue 进行像素取整。若指定倍数为0,则表示以当前设备的屏幕倍数为准。 + * + * 例如传进来 “2.1”,在 2x 倍数下会返回 2.5(0.5pt 对应 1px),在 3x 倍数下会返回 2.333(0.333pt 对应 1px)。 + */ +CG_INLINE CGFloat +BAKit_FlatSpecificScale(CGFloat floatValue, CGFloat scale) { + scale = scale == 0 ? BAKit_ScreenScale : scale; + CGFloat flattedValue = ceil(floatValue * scale) / scale; + return flattedValue; +} + +/** + * 基于当前设备的屏幕倍数,对传进来的 floatValue 进行像素取整。 + * + * 注意如果在 Core Graphic 绘图里使用时,要注意当前画布的倍数是否和设备屏幕倍数一致,若不一致,不可使用 flat() 函数,而应该用 flatSpecificScale + */ +CG_INLINE CGFloat +BAKit_Flat(CGFloat floatValue) { + return BAKit_FlatSpecificScale(floatValue, 0); +} + +/** + * 类似flat(),只不过 flat 是向上取整,而 floorInPixel 是向下取整 + */ +CG_INLINE CGFloat +BAKit_FloorInPixel(CGFloat floatValue) { + CGFloat resultValue = floor(floatValue * BAKit_ScreenScale) / BAKit_ScreenScale; + return resultValue; +} + +CG_INLINE BOOL +BAKit_Between(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) { + return minimumValue < value && value < maximumValue; +} + +CG_INLINE BOOL +BAKit_BetweenOrEqual(CGFloat minimumValue, CGFloat value, CGFloat maximumValue) { + return minimumValue <= value && value <= maximumValue; +} + +CG_INLINE void +BAKit_ReplaceMethod(Class _class, SEL _originSelector, SEL _newSelector) { + Method oriMethod = class_getInstanceMethod(_class, _originSelector); + Method newMethod = class_getInstanceMethod(_class, _newSelector); + BOOL isAddedMethod = class_addMethod(_class, _originSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)); + if (isAddedMethod) { + class_replaceMethod(_class, _newSelector, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod)); + } else { + method_exchangeImplementations(oriMethod, newMethod); + } +} + +#pragma mark - CGFloat + +/// 用于居中运算 +CG_INLINE CGFloat +BAKit_CGFloatGetCenter(CGFloat parent, CGFloat child) { + return BAKit_Flat((parent - child) / 2.0); +} + +#pragma mark - CGPoint + +/// 两个point相加 +CG_INLINE CGPoint +BAKit_CGPointUnion(CGPoint point1, CGPoint point2) { + return CGPointMake(BAKit_Flat(point1.x + point2.x), BAKit_Flat(point1.y + point2.y)); +} + +/// 获取rect的center,包括rect本身的x/y偏移 +CG_INLINE CGPoint +BAKit_CGPointGetCenterWithRect(CGRect rect) { + return CGPointMake(BAKit_Flat(CGRectGetMidX(rect)), BAKit_Flat(CGRectGetMidY(rect))); +} + +CG_INLINE CGPoint +BAKit_CGPointGetCenterWithSize(CGSize size) { + return CGPointMake(BAKit_Flat(size.width / 2.0), BAKit_Flat(size.height / 2.0)); +} + +#pragma mark - UIEdgeInsets + +/// 获取UIEdgeInsets在水平方向上的值 +CG_INLINE CGFloat +BAKit_UIEdgeInsetsGetHorizontalValue(UIEdgeInsets insets) { + return insets.left + insets.right; +} + +/// 获取UIEdgeInsets在垂直方向上的值 +CG_INLINE CGFloat +BAKit_UIEdgeInsetsGetVerticalValue(UIEdgeInsets insets) { + return insets.top + insets.bottom; +} + +/// 将两个UIEdgeInsets合并为一个 +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsConcat(UIEdgeInsets insets1, UIEdgeInsets insets2) { + insets1.top += insets2.top; + insets1.left += insets2.left; + insets1.bottom += insets2.bottom; + insets1.right += insets2.right; + return insets1; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetTop(UIEdgeInsets insets, CGFloat top) { + insets.top = BAKit_Flat(top); + return insets; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetLeft(UIEdgeInsets insets, CGFloat left) { + insets.left = BAKit_Flat(left); + return insets; +} +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetBottom(UIEdgeInsets insets, CGFloat bottom) { + insets.bottom = BAKit_Flat(bottom); + return insets; +} + +CG_INLINE UIEdgeInsets +BAKit_UIEdgeInsetsSetRight(UIEdgeInsets insets, CGFloat right) { + insets.right = BAKit_Flat(right); + return insets; +} + +#pragma mark - CGSize + +/// 判断一个size是否为空(宽或高为0) +CG_INLINE BOOL +BAKit_CGSizeIsEmpty(CGSize size) { + return size.width <= 0 || size.height <= 0; +} + +/// 将一个CGSize像素对齐 +CG_INLINE CGSize +BAKit_CGSizeFlatted(CGSize size) { + return CGSizeMake(BAKit_Flat(size.width), BAKit_Flat(size.height)); +} + +/// 将一个 CGSize 以 pt 为单位向上取整 +CG_INLINE CGSize +BAKit_CGSizeCeil(CGSize size) { + return CGSizeMake(ceil(size.width), ceil(size.height)); +} + +/// 将一个 CGSize 以 pt 为单位向下取整 +CG_INLINE CGSize +BAKit_CGSizeFloor(CGSize size) { + return CGSizeMake(floor(size.width), floor(size.height)); +} + +#pragma mark - CGRect + +/// 判断一个CGRect是否存在NaN +CG_INLINE BOOL +BAKit_CGRectIsNaN(CGRect rect) { + return isnan(rect.origin.x) || isnan(rect.origin.y) || isnan(rect.size.width) || isnan(rect.size.height); +} + +/// 创建一个像素对齐的CGRect +CG_INLINE CGRect +BAKit_CGRectFlatMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) { + return CGRectMake(BAKit_Flat(x), BAKit_Flat(y), BAKit_Flat(width), BAKit_Flat(height)); +} + +/// 对CGRect的x/y、width/height都调用一次flat,以保证像素对齐 +CG_INLINE CGRect +BAKit_CGRectFlatted(CGRect rect) { + return CGRectMake(BAKit_Flat(rect.origin.x), BAKit_Flat(rect.origin.y), BAKit_Flat(rect.size.width), BAKit_Flat(rect.size.height)); +} + +/// 为一个CGRect叠加scale计算 +CG_INLINE CGRect +BAKit_CGRectApplyScale(CGRect rect, CGFloat scale) { + return BAKit_CGRectFlatted(CGRectMake(CGRectGetMinX(rect) * scale, CGRectGetMinY(rect) * scale, CGRectGetWidth(rect) * scale, CGRectGetHeight(rect) * scale)); +} + +/// 计算view的水平居中,传入父view和子view的frame,返回子view在水平居中时的x值 +CG_INLINE CGFloat +BAKit_CGRectGetMinXHorizontallyCenterInParentRect(CGRect parentRect, CGRect childRect) { + return BAKit_Flat((CGRectGetWidth(parentRect) - CGRectGetWidth(childRect)) / 2.0); +} + +/// 计算view的垂直居中,传入父view和子view的frame,返回子view在垂直居中时的y值 +CG_INLINE CGFloat +BAKit_CGRectGetMinYVerticallyCenterInParentRect(CGRect parentRect, CGRect childRect) { + return BAKit_Flat((CGRectGetHeight(parentRect) - CGRectGetHeight(childRect)) / 2.0); +} + +/// 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持垂直居中时,layoutingRect的originY +CG_INLINE CGFloat +BAKit_CGRectGetMinYVerticallyCenter(CGRect referenceRect, CGRect layoutingRect) { + return CGRectGetMinY(referenceRect) + BAKit_CGRectGetMinYVerticallyCenterInParentRect(referenceRect, layoutingRect); +} + +/// 返回值:同一个坐标系内,想要layoutingRect和已布局完成的referenceRect保持水平居中时,layoutingRect的originX +CG_INLINE CGFloat +BAKit_CGRectGetMinXHorizontallyCenter(CGRect referenceRect, CGRect layoutingRect) { + return CGRectGetMinX(referenceRect) + BAKit_CGRectGetMinXHorizontallyCenterInParentRect(referenceRect, layoutingRect); +} + +/// 为给定的rect往内部缩小insets的大小 +CG_INLINE CGRect +BAKit_CGRectInsetEdges(CGRect rect, UIEdgeInsets insets) { + rect.origin.x += insets.left; + rect.origin.y += insets.top; + rect.size.width -= BAKit_UIEdgeInsetsGetHorizontalValue(insets); + rect.size.height -= BAKit_UIEdgeInsetsGetVerticalValue(insets); + return rect; +} + +/// 传入size,返回一个x/y为0的CGRect +CG_INLINE CGRect +BAKit_CGRectMakeWithSize(CGSize size) { + return CGRectMake(0, 0, size.width, size.height); +} + +CG_INLINE CGRect +BAKit_CGRectFloatTop(CGRect rect, CGFloat top) { + rect.origin.y = top; + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatBottom(CGRect rect, CGFloat bottom) { + rect.origin.y = bottom - CGRectGetHeight(rect); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatRight(CGRect rect, CGFloat right) { + rect.origin.x = right - CGRectGetWidth(rect); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectFloatLeft(CGRect rect, CGFloat left) { + rect.origin.x = left; + return rect; +} + +/// 保持rect的左边缘不变,改变其宽度,使右边缘靠在right上 +CG_INLINE CGRect +BAKit_CGRectLimitRight(CGRect rect, CGFloat rightLimit) { + rect.size.width = rightLimit - rect.origin.x; + return rect; +} + +/// 保持rect右边缘不变,改变其宽度和origin.x,使其左边缘靠在left上。只适合那种右边缘不动的view +/// 先改变origin.x,让其靠在offset上 +/// 再改变size.width,减少同样的宽度,以抵消改变origin.x带来的view移动,从而保证view的右边缘是不动的 +CG_INLINE CGRect +BAKit_CGRectLimitLeft(CGRect rect, CGFloat leftLimit) { + CGFloat subOffset = leftLimit - rect.origin.x; + rect.origin.x = leftLimit; + rect.size.width = rect.size.width - subOffset; + return rect; +} + +/// 限制rect的宽度,超过最大宽度则截断,否则保持rect的宽度不变 +CG_INLINE CGRect +BAKit_CGRectLimitMaxWidth(CGRect rect, CGFloat maxWidth) { + CGFloat width = CGRectGetWidth(rect); + rect.size.width = width > maxWidth ? maxWidth : width; + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetX(CGRect rect, CGFloat x) { + rect.origin.x = BAKit_Flat(x); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetY(CGRect rect, CGFloat y) { + rect.origin.y = BAKit_Flat(y); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetXY(CGRect rect, CGFloat x, CGFloat y) { + rect.origin.x = BAKit_Flat(x); + rect.origin.y = BAKit_Flat(y); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetWidth(CGRect rect, CGFloat width) { + rect.size.width = BAKit_Flat(width); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetHeight(CGRect rect, CGFloat height) { + rect.size.height = BAKit_Flat(height); + return rect; +} + +CG_INLINE CGRect +BAKit_CGRectSetSize(CGRect rect, CGSize size) { + rect.size = BAKit_CGSizeFlatted(size); + return rect; +} + + +#endif /* BAKit_DefineFrame_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineNoti.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineNoti.h" new file mode 100644 index 0000000..50289e8 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_DefineNoti.h" @@ -0,0 +1,17 @@ +// +// BAKit_DefineNoti.h +// BAQMUIDemo +// +// Created by 博爱 on 2017/2/17. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#ifndef BAKit_DefineNoti_h +#define BAKit_DefineNoti_h + + +#define kNotioKey_TimeLineOperationButtonClicked @"kNotioKey_TimeLineOperationButtonClicked" +#define kNotioKey_LoginFinish @"kNotioKey_LoginFinish" + + +#endif /* BAKit_DefineNoti_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Singleton.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Singleton.h" new file mode 100755 index 0000000..210c6b5 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BAKit_Define/BAKit_Singleton.h" @@ -0,0 +1,155 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ +// 帮助实现单例设计模式 + +// .h文件的实现 +#define BAKit_SingletonH(methodName) + (instancetype)shared##methodName; + +// .m文件的实现 +#if __has_feature(objc_arc) // 是ARC +#define BAKit_SingletonM(methodName) \ +static id _instace = nil; \ ++ (id)allocWithZone:(struct _NSZone *)zone \ +{ \ +if (_instace == nil) { \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super allocWithZone:zone]; \ +}); \ +} \ +return _instace; \ +} \ +\ +- (id)init \ +{ \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super init]; \ +}); \ +return _instace; \ +} \ +\ ++ (instancetype)shared##methodName \ +{ \ +return [[self alloc] init]; \ +} \ ++ (id)copyWithZone:(struct _NSZone *)zone \ +{ \ +return _instace; \ +} \ +\ ++ (id)mutableCopyWithZone:(struct _NSZone *)zone \ +{ \ +return _instace; \ +} + +#else // 不是ARC + +#define BAKit_SingletonM(methodName) \ +static id _instace = nil; \ ++ (id)allocWithZone:(struct _NSZone *)zone \ +{ \ +if (_instace == nil) { \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super allocWithZone:zone]; \ +}); \ +} \ +return _instace; \ +} \ +\ +- (id)init \ +{ \ +static dispatch_once_t onceToken; \ +dispatch_once(&onceToken, ^{ \ +_instace = [super init]; \ +}); \ +return _instace; \ +} \ +\ ++ (instancetype)shared##methodName \ +{ \ +return [[self alloc] init]; \ +} \ +\ +- (oneway void)release \ +{ \ +\ +} \ +\ +- (id)retain \ +{ \ +return self; \ +} \ +\ +- (NSUInteger)retainCount \ +{ \ +return 1; \ +} \ ++ (id)copyWithZone:(struct _NSZone *)zone \ +{ \ + return _instace; \ +} \ + \ ++ (id)mutableCopyWithZone:(struct _NSZone *)zone \ +{ \ + return _instace; \ +} + +#endif diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.h" index 14156c2..7f71c6f 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.h" @@ -51,372 +51,222 @@ * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io + * 博客 : http://boaihome.com ********************************************************************************* */ + #import -#define D_MINUTE 60 -#define D_HOUR 3600 -#define D_DAY 86400 -#define D_WEEK 604800 -#define D_YEAR 31556926 -/*! - * 给NSDate类添加许多有用的方法 - */ @interface NSDate (BAKit) +@property (nonatomic, readonly) NSInteger year; +@property (nonatomic, readonly) NSInteger month; +@property (nonatomic, readonly) NSInteger day; +@property (nonatomic, readonly) NSInteger nearestHour; +@property (nonatomic, readonly) NSInteger hour; +@property (nonatomic, readonly) NSInteger minute; +@property (nonatomic, readonly) NSInteger second; +@property (nonatomic, readonly) NSInteger nanosecond; +@property (nonatomic, readonly) NSInteger weekday; +//PRC 中国 +@property (nonatomic, readonly) NSInteger weekdayPRC; +@property (nonatomic, readonly) NSInteger weekdayOrdinal; +@property (nonatomic, readonly) NSInteger weekOfMonth; +@property (nonatomic, readonly) NSInteger weekOfYear; +@property (nonatomic, readonly) NSInteger yearForWeekOfYear; +@property (nonatomic, readonly) NSInteger quarter; + /** - * 是否为今天 + 确定每个月是否为闰月 */ -- (BOOL)isToday; +@property (nonatomic, readonly) BOOL isLeapMonth; + /** - * 是否为昨天 + 确定每个月是否为闰年 */ -- (BOOL)isYesterday; +@property (nonatomic, readonly) BOOL isLeapYear; + /** - * 是否为今年 + 是否是今天 */ -- (BOOL)isThisYear; +@property (nonatomic, readonly) BOOL isToday; /** + 是否是昨天 + */ +@property (nonatomic, readonly) BOOL isYesterday; +@property (nonatomic, readonly) BOOL isTomorrow; +@property (nonatomic, readonly) BOOL isThisWeek; +@property (nonatomic, readonly) BOOL isNextWeek; +@property (nonatomic, readonly) BOOL isLastWeek; +@property (nonatomic, readonly) BOOL isThisMonth; +@property (nonatomic, readonly) BOOL isThisYear; +@property (nonatomic, readonly) BOOL isNextYear; +@property (nonatomic, readonly) BOOL isLastYear; +@property (nonatomic, readonly) BOOL isInFuture; +@property (nonatomic, readonly) BOOL isInPast; + +@property (nonatomic, readonly) BOOL isTypicallyWorkday; +@property (nonatomic, readonly) BOOL isTypicallyWeekend; + + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSDate,自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ +- (NSString *)ba_dateFormattedWithDate; + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSString 类型的 date,如:@"2017-04-25 11:18:01",自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ ++ (NSString *)ba_dateCreated_at:(NSString *)date; + +/*! + * 获得一个比当前时间大n年的时间,格式为 yyyy-MM-dd + */ ++ (NSString *)ba_dateAfterYears:(NSInteger)count; + +/*! * 返回一个只有年月日的时间 */ -- (NSDate *)dateWithYMD; +- (NSDate *)ba_dateWithYMD; -/** +- (NSDate *)ba_dateWithYM; + +/*! * 获得与当前时间的差距 */ -- (NSDateComponents *)deltaWithNow; +- (NSDateComponents *)ba_dateDeltaWithNow; /** - * 获取时间与现在的时间差,并返回类似微博发送时间 + 距离当前的时间间隔描述 + + @return 时间间隔描述 */ -+ (NSString *)created_at:(NSString *)date; +- (NSString *)ba_dateTimeIntervalDescription; /** - * 获得一个比当前时间大n年的时间,格式为yyyyMMdd + 精确到分钟的日期描述 + + @return 日期描述 */ -+ (NSString *)dateAfterYears:(NSInteger)count; - -- (NSString *)timeIntervalDescription;//距离当前的时间间隔描述 -- (NSString *)minuteDescription;/*精确到分钟的日期描述*/ -- (NSString *)formattedTime; -- (NSString *)formattedDateDescription;//格式化日期描述 -- (double)timeIntervalSince1970InMilliSecond; -+ (NSDate *)dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond; -+ (NSString *)formattedTimeFromTimeInterval:(long long)time; - -// Relative dates from the current date -+ (NSDate *) dateTomorrow; -+ (NSDate *) dateYesterday; -+ (NSDate *) dateWithDaysFromNow: (NSInteger) days; -+ (NSDate *) dateWithDaysBeforeNow: (NSInteger) days; -+ (NSDate *) dateWithHoursFromNow: (NSInteger) dHours; -+ (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours; -+ (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes; -+ (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes; - -// Comparing dates -- (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate; -- (BOOL) isTomorrow; -- (BOOL) isSameWeekAsDate: (NSDate *) aDate; -- (BOOL) isThisWeek; -- (BOOL) isNextWeek; -- (BOOL) isLastWeek; -- (BOOL) isSameMonthAsDate: (NSDate *) aDate; -- (BOOL) isThisMonth; -- (BOOL) isSameYearAsDate: (NSDate *) aDate; -- (BOOL) isNextYear; -- (BOOL) isLastYear; -- (BOOL) isEarlierThanDate: (NSDate *) aDate; -- (BOOL) isLaterThanDate: (NSDate *) aDate; -- (BOOL) isInFuture; -- (BOOL) isInPast; - -// Date roles -- (BOOL) isTypicallyWorkday; -- (BOOL) isTypicallyWeekend; - -// Adjusting dates -- (NSDate *) dateByAddingDays: (NSInteger) dDays; -- (NSDate *) dateBySubtractingDays: (NSInteger) dDays; -- (NSDate *) dateByAddingHours: (NSInteger) dHours; -- (NSDate *) dateBySubtractingHours: (NSInteger) dHours; -- (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes; -- (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes; -- (NSDate *) dateAtStartOfDay; - -// Retrieving intervals -- (NSInteger) minutesAfterDate: (NSDate *) aDate; -- (NSInteger) minutesBeforeDate: (NSDate *) aDate; -- (NSInteger) hoursAfterDate: (NSDate *) aDate; -- (NSInteger) hoursBeforeDate: (NSDate *) aDate; -- (NSInteger) daysAfterDate: (NSDate *) aDate; -- (NSInteger) daysBeforeDate: (NSDate *) aDate; -- (NSInteger)distanceInDaysToDate:(NSDate *)anotherDate; - -// Decomposing dates -@property (readonly) NSInteger nearestHour; -@property (readonly) NSInteger hour; -@property (readonly) NSInteger minute; -@property (readonly) NSInteger seconds; -@property (readonly) NSInteger day; -@property (readonly) NSInteger month; -@property (readonly) NSInteger week; -@property (readonly) NSInteger weekday; -@property (readonly) NSInteger nthWeekday; // e.g. 2nd Tuesday of the month == 2 -@property (readonly) NSInteger year; - - - - - - - - - - - -///** -// * 简化日期结构 -// */ -//struct BADateInformation { -// NSInteger day; // 日 -// NSInteger month; // 月 -// NSInteger year; // 年 -// -// NSInteger weekday; // 星期 -// -// NSInteger minute; // 分钟 -// NSInteger hour; // 小时 -// NSInteger second; // 秒数 -// -//}; -// -//typedef struct BADateInformation BADateInformation; -// -///** -// * 给NSDate类添加许多有用的方法 -// */ -//@interface NSDate (BAKit) -// -///** -// * Create a NSDate with the yesterday date -// * -// * @return Return a NSDate with the yesterday date -// */ -//+ (NSDate *)yesterday; -// -///** -// * Get the month from today -// * -// * @return Return the month -// */ -//+ (NSDate *)month; -// -///** -// * Get the month from self -// * -// * @return Return the month -// */ -//- (NSDate *)month; -// -///** -// * Get the weekday number from self -// * -// * @return Return weekday number -// * [1 - Sunday] -// * [2 - Monday] -// * [3 - Tuerday] -// * [4 - Wednesday] -// * [5 - Thursday] -// * [6 - Friday] -// * [7 - Saturday] -// */ -//- (NSInteger)weekday; -// -///** -// * Get the weekday as a localized string from self -// * -// * @return Return weekday as a localized string -// * [1 - Sunday] -// * [2 - Monday] -// * [3 - Tuerday] -// * [4 - Wednesday] -// * [5 - Thursday] -// * [6 - Friday] -// * [7 - Saturday] -// */ -//- (NSString *)dayFromWeekday; -// -///** -// * Compare self with another date -// * -// * @param anotherDate The another date to compare as NSDate -// * -// * @return Return YES if is same day, NO if not -// */ -//- (BOOL)isSameDay:(NSDate *)anotherDate; -// -///** -// * Get the months number between self and another date -// * -// * @param toDate The another date -// * -// * @return Return the months between the two dates -// */ -//- (NSInteger)monthsBetweenDate:(NSDate *)toDate; -// -///** -// * Get the days number between self and another date -// * -// * @param toDate The another date -// * -// * @return Return the days between the two dates -// */ -//- (NSInteger)daysBetweenDate:(NSDate *)toDate; -// -///** -// * Return if self is today -// * -// * @return Return if self is today -// */ -//- (BOOL)isToday; -// -///** -// * Add days to self -// * -// * @param days The number of days to add -// * -// * @return Return self by adding the gived days number -// */ -//- (NSDate *)dateByAddingDays:(NSUInteger)days; -// -///** -// * Create an NSDate with other two NSDate objects. -// * Taken from the first date: day, month and year. -// * Taken from the second date: hours and minutes. -// * -// * @param aDate The first date for date -// * @param aTime The second date for time -// * -// * @return Return the created NSDate -// */ -//+ (NSDate *)dateWithDatePart:(NSDate *)aDate -// andTimePart:(NSDate *)aTime; -// -///** -// * Get the month string from self -// * -// * @return Return the month string -// */ -//- (NSString *)monthString; -// -///** -// * Get the year string from self -// * -// * @return Return the year string -// */ -//- (NSString *)yearString; -// -///** -// * Get the month as a localized string from the given month number -// * -// * @param month The month to be converted in string -// * [1 - January] -// * [2 - February] -// * [3 - March] -// * [4 - April] -// * [5 - May] -// * [6 - June] -// * [7 - July] -// * [8 - August] -// * [9 - September] -// * [10 - October] -// * [11 - November] -// * [12 - December] -// * -// * @return Return the given month as a localized string -// */ -//+ (NSString *)monthStringWithMonthNumber:(NSInteger)month; -// -///** -// * Get self as a BADateInformation structure -// * -// * @return Return self as a BADateInformation structure -// */ -//- (BADateInformation)dateInformation; -// -///** -// * Get self as a BADateInformation structure with a given time zone -// * -// * @return Return self as a BADateInformation structure with a given time zone -// */ -//- (BADateInformation)dateInformationWithTimeZone:(NSTimeZone *)timezone; -// -///** -// * Return a date from a given BADateInformation structure -// * -// * @param info The BADateInformation to be converted -// * -// * @return Return a NSDate from a given BADateInformation structure -// */ -//+ (NSDate *)dateFromDateInformation:(BADateInformation)info; -// -///** -// * Return a date from a given BADateInformation structure with a given time zone -// * -// * @param info The BADateInformation to be converted -// * -// * @return Return a NSDate from a given BADateInformation structure with a given time zone -// */ -//+ (NSDate *)dateFromDateInformation:(BADateInformation)info -// timeZone:(NSTimeZone *)timezone; -// -///** -// * Get the given BADateInformation structure as a formatted string -// * -// * @param info The BADateInformation to be formatted -// * -// * @return Return a NSString in the following format: -// * D/M/Y H:M:S -// * Example: 15/10/2013 10:38:43 -// */ -//+ (NSString *)dateInformationDescriptionWithInformation:(BADateInformation)info; -// -///** -// * 是否为今天 -// */ -//- (BOOL)isTodays; -///** -// * 是否为昨天 -// */ -//- (BOOL)isYesterday; -///** -// * 是否为今年 -// */ -//- (BOOL)isThisYear; -// -///** -// * 返回一个只有年月日的时间 -// */ -//- (NSDate *)dateWithYMD; -// -///** -// * 获得与当前时间的差距 -// */ -//- (NSDateComponents *)deltaWithNow; -// -///*! 时间戳转换成日期 */ -//+ (NSDate *)ba_NSDateTransformWithNSDateTimeSp:(NSString *)timeSp; +- (NSString *)ba_dateMinuteDescription; + +/** + 标准时间日期描述 + + @return 标准时间日期描述 + */ +- (NSString *)ba_dateFormattedTime; + +/** + 当前日期 距离 1970 时间间隔毫秒 + + @return 当前日期 距离 1970 时间间隔毫秒 + */ +- (double)ba_dateTimeIntervalSince1970InMilliSecond; + +/** + 距离 时间间隔毫秒 后的日期 + + @param timeIntervalInMilliSecond 时间间隔毫秒 + @return 距离 时间间隔毫秒 后的日期 + */ ++ (NSDate *)ba_dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond; + +/** + 时间间隔格式化 + + @param time 时间间隔 + @return 时间格式化 + */ ++ (NSString *)ba_dateFormattedTimeFromTimeInterval:(long long)time; + +#pragma mark UTC +//UTC世界统一时间 +- (NSNumber *)ba_dateGetUtcTimeIntervalSince1970; +- (NSNumber *)ba_dateGetUtcTimeIntervalIntSince1970; +- (NSString *)ba_dateTimeIntervalStringSince1970; + +#pragma mark - 距离当前日期最近的日期 ++ (NSDate *)ba_dateTomorrow; ++ (NSDate *)ba_dateYesterday; ++ (NSDate *)ba_dateWithDaysFromNow:(NSInteger)days; ++ (NSDate *)ba_dateWithDaysBeforeNow:(NSInteger)days; ++ (NSDate *)ba_dateWithHoursFromNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithHoursBeforeNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithMinutesFromNow:(NSInteger)dMinutes; ++ (NSDate *)ba_dateWithMinutesBeforeNow:(NSInteger)dMinutes; + +#pragma mark - 比较日期 +- (BOOL)ba_dateIsEqualToDateIgnoringTime:(NSDate *)aDate; +- (BOOL)ba_dateIsSameWeekAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameMonthAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameYearAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsEarlierThanDate:(NSDate *)aDate; +- (BOOL)ba_dateIsLaterThanDate:(NSDate *)aDate; + +#pragma mark - 调整日期 +- (NSDate *)ba_dateByAddingDays:(NSInteger)dDays; +- (NSDate *)ba_dateBySubtractingDays:(NSInteger)dDays; +- (NSDate *)ba_dateByAddingHours:(NSInteger)dHours; +- (NSDate *)ba_dateBySubtractingHours:(NSInteger)dHours; +- (NSDate *)ba_dateByAddingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateBySubtractingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateAtStartOfDay; +- (NSDateComponents *)ba_dateComponentsWithOffsetFromDate:(NSDate *)aDate; + +#pragma mark - 时间间隔 +- (NSInteger)ba_dateMinutesAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateMinutesBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDistanceInDaysToDate:(NSDate *)anotherDate; +/** + 多少天之后 + */ +- (NSDate *)ba_dateGetAfterYear:(int)year OrMonth:(int)month OrDay:(int)day; + +#pragma mark - 一年有多少周 ++ (NSString *)ba_dateGetWeekInyearOrMouth:(BOOL)inYear WithDate:(NSDate *)date; +// 2015、2009、004、1998 这四年是 53 周(目前已知),其余均是52周 ++ (NSInteger)ba_dateGetWeekNumbersOfYear:(NSInteger)year; + +@end + +/** + * 中国农历 + */ + +@interface NSDate (LunarCalendar) + +/** + * 例如 : 2016丙申年四月初一 + */ + +- (NSInteger)lunarShortYear; // 农历年份,数字表示 2016 + +- (NSString *)lunarLongYear; // 农历年份,干支表示 丙申年 + +- (NSInteger)lunarShortMonth; // 农历月份,数字表示 4 + +- (NSString *)lunarLongMonth; // 农历月份,汉字表示 四月 +- (NSInteger)lunarShortDay; // 农历日期,数字表示 1 +- (NSString *)lunarLongDay; // 农历日期,汉字表示 初一 +- (NSString *)lunarSolarTerms;// 农历节气 (立春 雨水 惊蛰 春分...) +/** 传入阳历的年月日返回当天的农历节气 */ ++ (NSString *)getLunarSolarTermsWithYear:(int)iYear Month:(int)iMonth Day:(int)iDay; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.m" index 0d0669d..4a567bf 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDate+BAKit.m" @@ -51,90 +51,353 @@ * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io + * 博客 : http://boaihome.com ********************************************************************************* */ + #import "NSDate+BAKit.h" #import "NSDateFormatter+BAKit.h" +#define k_MINUTE 60 +#define k_HOUR 3600 +#define k_DAY 86400 +#define k_WEEK 604800 +#define k_YEAR 31556926 -#define DATE_COMPONENTS (NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal) -#define CURRENT_CALENDAR [NSCalendar currentCalendar] +#define BAKi_DATE_COMPONENTS (NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal) @implementation NSDate (BAKit) -+ (NSString *)created_at:(NSString *)date +- (NSInteger)year +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:self] year]; +} + +- (NSInteger)month +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:self] month]; +} + +- (NSInteger)day +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:self] day]; +} + +- (NSInteger)nearestHour +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + k_MINUTE * 30; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + NSDateComponents *components = [BAKit_Current_Calendar() components:NSCalendarUnitHour fromDate:newDate]; + return components.hour; +} + +- (NSInteger)hour +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitHour fromDate:self] hour]; +} + +- (NSInteger)minute +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitMinute fromDate:self] minute]; +} + +- (NSInteger)second +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitSecond fromDate:self] second]; +} + +- (NSInteger)nanosecond +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitSecond fromDate:self] nanosecond]; +} + +- (NSInteger)weekday +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:self] weekday]; +} + +- (NSInteger)weekdayPRC +{ + return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierRepublicOfChina] + components:NSCalendarUnitWeekday fromDate:self] + weekday]; +} + +- (NSInteger)weekdayOrdinal +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekdayOrdinal fromDate:self] weekdayOrdinal]; +} + +- (NSInteger)weekOfMonth +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekOfMonth fromDate:self] weekOfMonth]; +} + +- (NSInteger)weekOfYear +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekOfYear fromDate:self] weekOfYear]; +} + +- (NSInteger)yearForWeekOfYear +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitYearForWeekOfYear fromDate:self] yearForWeekOfYear]; +} + +- (NSInteger)quarter +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitQuarter fromDate:self] quarter]; +} + +- (BOOL)isLeapMonth +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitQuarter fromDate:self] isLeapMonth]; +} + +- (BOOL)isLeapYear +{ + NSUInteger year = self.year; + return ((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))); +} + +- (BOOL)isToday +{ + if (fabs(self.timeIntervalSinceNow) >= 60 * 60 * 24) return NO; + return [NSDate new].day == self.day; +} + +- (BOOL)isYesterday +{ + NSDate *added = [self dateByAddingDays:1]; + return [added isToday]; +} + +- (BOOL)isTomorrow +{ + return [self ba_dateIsEqualToDateIgnoringTime:BAKit_Current_Date()]; +} + +- (BOOL)isThisWeek +{ + return [self ba_dateIsSameWeekAsDate:BAKit_Current_Date()]; +} + +- (BOOL)isNextWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + k_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self ba_dateIsSameWeekAsDate:newDate]; +} + +- (BOOL)isLastWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - k_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self ba_dateIsSameWeekAsDate:newDate]; +} + +- (BOOL)isThisMonth +{ + return [self ba_dateIsSameMonthAsDate:BAKit_Current_Date()]; +} + +- (BOOL)isThisYear +{ + return [self ba_dateIsSameYearAsDate:BAKit_Current_Date()]; +} + +- (BOOL)isNextYear +{ + NSDateComponents *components1 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year + 1)); +} + +- (BOOL)isLastYear +{ + NSDateComponents *components1 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year - 1)); +} + +- (BOOL)isInFuture +{ + return [self ba_dateIsLaterThanDate:BAKit_Current_Date()]; +} + +- (BOOL)isInPast +{ + return [self ba_dateIsEarlierThanDate:BAKit_Current_Date()]; +} + +- (BOOL)isTypicallyWorkday { - NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; + NSDateComponents *components = [BAKit_Current_Calendar() components:NSCalendarUnitWeekday fromDate:self]; + if ((components.weekday == 1) || + (components.weekday == 7)) + { + return YES; + } + return NO; +} + +- (BOOL)isTypicallyWeekend +{ + return !self.isTypicallyWorkday; +} + +#pragma mark - 格式化日期描述 +- (NSString *)ba_dateFormattedWithDate +{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + + [dateFormatter setDateFormat:BAKit_FormatString_YMD]; + NSString *theDay = [dateFormatter stringFromDate:self];//日期的年月日 + NSString *currentDay = [dateFormatter stringFromDate:BAKit_Current_Date()];//当前年月日 + + // NSLog(@"当前时间3: %@", self); + NSInteger timeInterval = -[self timeIntervalSinceNow]; + // NSLog(@"当前时间4: %ld", (long)timeInterval); + + if (timeInterval < 60) + { + return @"刚刚"; + } + else if + (timeInterval < 3600) + { + // 1小时内 + return [NSString stringWithFormat:@"%zd分钟前", timeInterval / 60]; + } + else if (timeInterval < 21600) + { + // 6小时内 + return [NSString stringWithFormat:@"%zd小时内", timeInterval / 3600]; + } + else if ([theDay isEqualToString:currentDay]) + { + // 当天 + [dateFormatter setDateFormat:BAKit_FormatString_HM]; + return [NSString stringWithFormat:@"%@", [dateFormatter stringFromDate:self]]; + } + else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) + { + // 昨天 + [dateFormatter setDateFormat:BAKit_FormatString_HM]; + return [NSString stringWithFormat:@"昨天 %@", [dateFormatter stringFromDate:self]]; + } + else + { + // 以前 + [dateFormatter setDateFormat:BAKit_FormatString_YMDHM]; + return [dateFormatter stringFromDate:self]; + } +} + ++ (NSString *)ba_dateCreated_at:(NSString *)date +{ + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss"; + formatter.dateFormat = BAKit_FormatString_YMDHMS; - if (date.length == 16 ) { - fmt.dateFormat = @"yyyy-MM-dd HH:mm"; + if (date.length == 16 ) + { + formatter.dateFormat = BAKit_FormatString_YMDHM; } - fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; // 获得发布的具体时间 - NSDate *createDate = [fmt dateFromString:date]; + NSDate *createDate = [formatter dateFromString:date]; // 判断是否为今年 - if (createDate.isThisYear) { - if (createDate.isToday) { // 今天 - NSDateComponents *cmps = [createDate deltaWithNow]; - if (cmps.hour >= 1) { // 至少是1小时前发的 + if (createDate) + { + if (createDate.isThisYear) + { + // 今天 + NSDateComponents *cmps = [createDate ba_dateDeltaWithNow]; + if (cmps.hour >= 1) + { + // 至少是1小时前发的 return [NSString stringWithFormat:@"%ld小时前", cmps.hour]; - } else if (cmps.minute >= 1) { // 1~59分钟之前发的 - + } + else if (cmps.minute >= 1) + { + // 1~59分钟之前发的 return [NSString stringWithFormat:@"%ld分钟前", cmps.minute]; - } else { // 1分钟内发的 + } + else + { + // 1分钟内发的 return @"刚刚"; } - } else if (createDate.isYesterday) { // 昨天 - fmt.dateFormat = @"昨天 HH:mm"; - return [fmt stringFromDate:createDate]; - } else { // 至少是前天 - fmt.dateFormat = @"MM-dd HH:mm"; - return [fmt stringFromDate:createDate]; } - } else { // 非今年 - fmt.dateFormat = @"yyyy-MM-dd"; - return [fmt stringFromDate:createDate]; + else if (createDate.isYesterday) + { + // 昨天 + formatter.dateFormat = @"昨天 HH:mm"; + return [formatter stringFromDate:createDate]; + } + else + { + // 至少是前天 + formatter.dateFormat = @"MM-dd HH:mm"; + return [formatter stringFromDate:createDate]; + } + } + else + { + // 非今年 + formatter.dateFormat = BAKit_FormatString_YMD; + return [formatter stringFromDate:createDate]; } } -- (NSDate *)dateWithYMD ++ (NSString *)ba_dateAfterYears:(NSInteger)count { - NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; - fmt.dateFormat = @"yyyy-MM-dd"; - NSString *selfStr = [fmt stringFromDate:self]; - return [fmt dateFromString:selfStr]; + NSDate *date = BAKit_Current_Date(); + NSTimeInterval time = count * 365 * 24 * 60 * 60; + date = [date dateByAddingTimeInterval:time]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.locale = [NSLocale localeWithLocaleIdentifier:@"China"]; + formatter.dateFormat = BAKit_FormatString_YMD; + NSString *selfStr = [formatter stringFromDate:date]; + return selfStr; } -- (NSDateComponents *)deltaWithNow +- (NSDate *)ba_dateWithYMD { - NSCalendar *calendar = [NSCalendar currentCalendar]; - int unit = NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute; - return [calendar components:unit fromDate:self toDate:[NSDate date] options:0]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = BAKit_FormatString_YMD; + NSString *selfStr = [formatter stringFromDate:self]; + return [formatter dateFromString:selfStr]; } -+ (NSString *)dateAfterYears:(NSInteger)count +- (NSDate *)ba_dateWithYM { - NSDate *date = [NSDate date]; - NSTimeInterval time = count * 365 * 24 * 60 * 60; - date = [date dateByAddingTimeInterval:time]; - NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; - fmt.locale = [NSLocale localeWithLocaleIdentifier:@"China"]; - fmt.dateFormat = @"yyyyMMdd"; - NSString *selfStr = [fmt stringFromDate:date]; - return selfStr; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = BAKit_FormatString_YM; + NSString *selfStr = [formatter stringFromDate:self]; + return [formatter dateFromString:selfStr]; +} + +- (NSDateComponents *)ba_dateDeltaWithNow +{ + NSCalendar *calendar = [NSCalendar currentCalendar]; + int unit = NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute; + return [calendar components:unit fromDate:self toDate:BAKit_Current_Date() options:0]; } -/*距离当前的时间间隔描述*/ -- (NSString *)timeIntervalDescription +/** + 距离当前的时间间隔描述 + + @return 时间间隔描述 + */ +- (NSString *)ba_dateTimeIntervalDescription { NSTimeInterval timeInterval = -[self timeIntervalSinceNow]; if (timeInterval < 60) { @@ -146,20 +409,24 @@ - (NSString *)timeIntervalDescription } else if (timeInterval < 2592000) {//30天内 return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text4", @""), timeInterval / 86400]; } else if (timeInterval < 31536000) {//30天至1年内 - NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text5", @"")]; + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text5", @"")]; return [dateFormatter stringFromDate:self]; } else { return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text6", @""), timeInterval / 31536000]; } } -/*精确到分钟的日期描述*/ -- (NSString *)minuteDescription +/** + 精确到分钟的日期描述 + + @return 日期描述 + */ +- (NSString *)ba_dateMinuteDescription { - NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:@"yyyy-MM-dd"]; + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:BAKit_FormatString_YMD]; NSString *theDay = [dateFormatter stringFromDate:self];//日期的年月日 - NSString *currentDay = [dateFormatter stringFromDate:[NSDate date]];//当前年月日 + NSString *currentDay = [dateFormatter stringFromDate:BAKit_Current_Date()];//当前年月日 if ([theDay isEqualToString:currentDay]) {//当天 [dateFormatter setDateFormat:@"ah:mm"]; return [dateFormatter stringFromDate:self]; @@ -175,11 +442,16 @@ - (NSString *)minuteDescription } } -/*标准时间日期描述*/ --(NSString *)formattedTime{ +/** + 标准时间日期描述 + + @return 标准时间日期描述 + */ +- (NSString *)ba_dateFormattedTime +{ NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; - [formatter setDateFormat:@"YYYY-MM-dd"]; - NSString * dateNow = [formatter stringFromDate:[NSDate date]]; + [formatter setDateFormat:BAKit_FormatString_YMD]; + NSString * dateNow = [formatter stringFromDate:BAKit_Current_Date()]; NSDateComponents *components = [[NSDateComponents alloc] init]; [components setDay:[[dateNow substringWithRange:NSMakeRange(8,2)] intValue]]; [components setMonth:[[dateNow substringWithRange:NSMakeRange(5,2)] intValue]]; @@ -187,7 +459,7 @@ -(NSString *)formattedTime{ NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDate *date = [gregorian dateFromComponents:components]; //今天 0点时间 - NSInteger hour = [self hoursAfterDate:date]; + NSInteger hour = [self ba_dateHoursAfterDate:date]; NSDateFormatter *dateFormatter = nil; NSString *ret = @""; @@ -198,71 +470,58 @@ -(NSString *)formattedTime{ if (!hasAMPM) { //24小时制 if (hour <= 24 && hour >= 0) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:@"HH:mm"]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:@"HH:mm"]; }else if (hour < 0 && hour >= -24) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text8", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text8", @"")]; }else { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:@"yyyy-MM-dd HH:mm"]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:BAKit_FormatString_YMDHM]; } }else { if (hour >= 0 && hour <= 6) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text9", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text9", @"")]; }else if (hour > 6 && hour <=11 ) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text10", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text10", @"")]; }else if (hour > 11 && hour <= 17) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text11", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text11", @"")]; }else if (hour > 17 && hour <= 24) { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text12", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text12", @"")]; }else if (hour < 0 && hour >= -24){ - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:NSLocalizedString(@"NSDateCategory.text13", @"")]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text13", @"")]; }else { - dateFormatter = [NSDateFormatter ba_dateFormatterWithFormat:@"yyyy-MM-dd HH:mm"]; + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:BAKit_FormatString_YMDHM]; } } ret = [dateFormatter stringFromDate:self]; return ret; } -/*格式化日期描述*/ -- (NSString *)formattedDateDescription -{ - NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; - - [dateFormatter setDateFormat:@"yyyy-MM-dd"]; - NSString *theDay = [dateFormatter stringFromDate:self];//日期的年月日 - NSString *currentDay = [dateFormatter stringFromDate:[NSDate date]];//当前年月日 - - NSInteger timeInterval = -[self timeIntervalSinceNow]; - if (timeInterval < 60) { - return NSLocalizedString(@"NSDateCategory.text1", @""); - } else if (timeInterval < 3600) {//1小时内 - return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text2", @""), timeInterval / 60]; - } else if (timeInterval < 21600) {//6小时内 - return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text3", @""), timeInterval / 3600]; - } else if ([theDay isEqualToString:currentDay]) {//当天 - [dateFormatter setDateFormat:@"HH:mm"]; - return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text14", @""), [dateFormatter stringFromDate:self]]; - } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) {//昨天 - [dateFormatter setDateFormat:@"HH:mm"]; - return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text7", @""), [dateFormatter stringFromDate:self]]; - } else {//以前 - [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; - return [dateFormatter stringFromDate:self]; - } -} -- (double)timeIntervalSince1970InMilliSecond { +/** + 当前日期 距离 1970 时间间隔毫秒 + + @return 当前日期 距离 1970 时间间隔毫秒 + */ +- (double)ba_dateTimeIntervalSince1970InMilliSecond +{ double ret; ret = [self timeIntervalSince1970] * 1000; return ret; } -+ (NSDate *)dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond { +/** + 距离 时间间隔毫秒 后的日期 + + @param timeIntervalInMilliSecond 时间间隔毫秒 + @return 距离 时间间隔毫秒 后的日期 + */ ++ (NSDate *)ba_dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond +{ NSDate *ret = nil; double timeInterval = timeIntervalInMilliSecond; // judge if the argument is in secconds(for former data structure). - if(timeIntervalInMilliSecond > 140000000000) { + if(timeIntervalInMilliSecond > 140000000000) + { timeInterval = timeIntervalInMilliSecond / 1000; } ret = [NSDate dateWithTimeIntervalSince1970:timeInterval]; @@ -270,742 +529,529 @@ + (NSDate *)dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMil return ret; } -+ (NSString *)formattedTimeFromTimeInterval:(long long)time{ - return [[NSDate dateWithTimeIntervalInMilliSecondSince1970:time] formattedTime]; +/** + 时间间隔格式化 + + @param time 时间间隔 + @return 时间格式化 + */ ++ (NSString *)ba_dateFormattedTimeFromTimeInterval:(long long)time +{ + return [[NSDate ba_dateWithTimeIntervalInMilliSecondSince1970:time] ba_dateFormattedTime]; +} + +#pragma mark UTC +//UTC世界统一时间 +- (NSNumber *)ba_dateGetUtcTimeIntervalSince1970 { + return [NSNumber numberWithDouble:[self timeIntervalSince1970]]; } -#pragma mark Relative Dates +- (NSNumber *)ba_dateGetUtcTimeIntervalIntSince1970 { + return [NSNumber numberWithInt:(int)[self timeIntervalSince1970]]; +} + +- (NSString *)ba_dateTimeIntervalStringSince1970 { + return [NSString stringWithFormat:@"%f", [self timeIntervalSince1970]]; +} -+ (NSDate *) dateWithDaysFromNow: (NSInteger) days +#pragma mark - 距离当前日期最近的日期 ++ (NSDate *)ba_dateTomorrow { - // Thanks, Jim Morrison - return [[NSDate date] dateByAddingDays:days]; + return [NSDate ba_dateWithDaysFromNow:1]; } -+ (NSDate *) dateWithDaysBeforeNow: (NSInteger) days ++ (NSDate *)ba_dateYesterday { - // Thanks, Jim Morrison - return [[NSDate date] dateBySubtractingDays:days]; + return [NSDate ba_dateWithDaysBeforeNow:1]; } -+ (NSDate *) dateTomorrow ++ (NSDate *)ba_dateWithDaysFromNow:(NSInteger)days { - return [NSDate dateWithDaysFromNow:1]; + // Thanks, Jim Morrison + return [BAKit_Current_Date() dateByAddingDays:days]; } -+ (NSDate *) dateYesterday ++ (NSDate *)ba_dateWithDaysBeforeNow:(NSInteger)days { - return [NSDate dateWithDaysBeforeNow:1]; + // Thanks, Jim Morrison + return [BAKit_Current_Date() ba_dateBySubtractingDays:days]; } -+ (NSDate *) dateWithHoursFromNow: (NSInteger) dHours ++ (NSDate *)ba_dateWithHoursFromNow:(NSInteger)dHours { - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_HOUR * dHours; + NSTimeInterval aTimeInterval = [BAKit_Current_Date() timeIntervalSinceReferenceDate] + k_HOUR * dHours; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -+ (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours ++ (NSDate *)ba_dateWithHoursBeforeNow:(NSInteger)dHours { - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_HOUR * dHours; + NSTimeInterval aTimeInterval = [BAKit_Current_Date() timeIntervalSinceReferenceDate] - k_HOUR * dHours; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -+ (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes ++ (NSDate *)ba_dateWithMinutesFromNow:(NSInteger)dMinutes { - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes; + NSTimeInterval aTimeInterval = [BAKit_Current_Date() timeIntervalSinceReferenceDate] + k_MINUTE * dMinutes; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -+ (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes ++ (NSDate *)ba_dateWithMinutesBeforeNow:(NSInteger)dMinutes; { - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_MINUTE * dMinutes; + NSTimeInterval aTimeInterval = [BAKit_Current_Date() timeIntervalSinceReferenceDate] - k_MINUTE * dMinutes; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -#pragma mark Comparing Dates +- (NSDate *)dateByAddingDays:(NSInteger)days +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + 86400 * days; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} -- (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate +#pragma mark - 比较日期 +- (BOOL)ba_dateIsEqualToDateIgnoringTime:(NSDate *)aDate { - NSDateComponents *components1 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate]; + NSDateComponents *components1 = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:aDate]; return ((components1.year == components2.year) && (components1.month == components2.month) && (components1.day == components2.day)); } -- (BOOL) isToday -{ - return [self isEqualToDateIgnoringTime:[NSDate date]]; -} - -- (BOOL) isTomorrow -{ - return [self isEqualToDateIgnoringTime:[NSDate dateTomorrow]]; -} - -- (BOOL) isYesterday -{ - return [self isEqualToDateIgnoringTime:[NSDate dateYesterday]]; -} - // This hard codes the assumption that a week is 7 days -- (BOOL) isSameWeekAsDate: (NSDate *) aDate +- (BOOL)ba_dateIsSameWeekAsDate:(NSDate *)aDate { - NSDateComponents *components1 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate]; + NSDateComponents *components1 = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:aDate]; // Must be same week. 12/31 and 1/1 will both be week "1" if they are in the same week if (components1.weekOfYear != components2.weekOfYear) return NO; // Must have a time interval under 1 week. Thanks @aclark - return (fabs([self timeIntervalSinceDate:aDate]) < D_WEEK); -} - -- (BOOL) isThisWeek -{ - return [self isSameWeekAsDate:[NSDate date]]; -} - -- (BOOL) isNextWeek -{ - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_WEEK; - NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; - return [self isSameWeekAsDate:newDate]; -} - -- (BOOL) isLastWeek -{ - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_WEEK; - NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; - return [self isSameWeekAsDate:newDate]; + return (fabs([self timeIntervalSinceDate:aDate]) < k_WEEK); } -// Thanks, mspasov -- (BOOL) isSameMonthAsDate: (NSDate *) aDate +- (BOOL)ba_dateIsSameMonthAsDate :(NSDate *)aDate { - NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:aDate]; + NSDateComponents *components1 = [BAKit_Current_Calendar() components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:aDate]; return ((components1.month == components2.month) && (components1.year == components2.year)); } -- (BOOL) isThisMonth -{ - return [self isSameMonthAsDate:[NSDate date]]; -} - -- (BOOL) isSameYearAsDate: (NSDate *) aDate +- (BOOL)ba_dateIsSameYearAsDate:(NSDate *)aDate { - NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:aDate]; + NSDateComponents *components1 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar() components:NSCalendarUnitYear fromDate:aDate]; return (components1.year == components2.year); } -- (BOOL) isThisYear -{ - // Thanks, baspellis - return [self isSameYearAsDate:[NSDate date]]; -} - -- (BOOL) isNextYear -{ - NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]]; - - return (components1.year == (components2.year + 1)); -} - -- (BOOL) isLastYear -{ - NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; - NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]]; - - return (components1.year == (components2.year - 1)); -} - -- (BOOL) isEarlierThanDate: (NSDate *) aDate +- (BOOL)ba_dateIsEarlierThanDate:(NSDate *)aDate { return ([self compare:aDate] == NSOrderedAscending); } -- (BOOL) isLaterThanDate: (NSDate *) aDate +- (BOOL)ba_dateIsLaterThanDate:(NSDate *)aDate { return ([self compare:aDate] == NSOrderedDescending); } -// Thanks, markrickert -- (BOOL) isInFuture -{ - return ([self isLaterThanDate:[NSDate date]]); -} - -// Thanks, markrickert -- (BOOL) isInPast -{ - return ([self isEarlierThanDate:[NSDate date]]); -} - - -#pragma mark Roles -- (BOOL) isTypicallyWeekend -{ - NSDateComponents *components = [CURRENT_CALENDAR components:NSCalendarUnitWeekday fromDate:self]; - if ((components.weekday == 1) || - (components.weekday == 7)) - return YES; - return NO; -} - -- (BOOL) isTypicallyWorkday -{ - return ![self isTypicallyWeekend]; -} - -#pragma mark Adjusting Dates - -- (NSDate *) dateByAddingDays: (NSInteger) dDays +#pragma mark - 调整日期 +- (NSDate *)ba_dateByAddingDays:(NSInteger)dDays { - NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_DAY * dDays; + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_DAY * dDays; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -- (NSDate *) dateBySubtractingDays: (NSInteger) dDays +- (NSDate *)ba_dateBySubtractingDays:(NSInteger)dDays { - return [self dateByAddingDays: (dDays * -1)]; + return [self ba_dateByAddingDays:(dDays * -1)]; } -- (NSDate *) dateByAddingHours: (NSInteger) dHours +- (NSDate *)ba_dateByAddingHours:(NSInteger)dHours { - NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_HOUR * dHours; + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_HOUR * dHours; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -- (NSDate *) dateBySubtractingHours: (NSInteger) dHours +- (NSDate *)ba_dateBySubtractingHours:(NSInteger)dHours { - return [self dateByAddingHours: (dHours * -1)]; + return [self ba_dateByAddingHours:(dHours * -1)]; } -- (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes +- (NSDate *)ba_dateByAddingMinutes:(NSInteger)dMinutes { - NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes; + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_MINUTE * dMinutes; NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; return newDate; } -- (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes +- (NSDate *)ba_dateBySubtractingMinutes:(NSInteger)dMinutes { - return [self dateByAddingMinutes: (dMinutes * -1)]; + return [self ba_dateByAddingMinutes: (dMinutes * -1)]; } -- (NSDate *) dateAtStartOfDay +- (NSDate *)ba_dateAtStartOfDay { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + NSDateComponents *components = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:self]; components.hour = 0; components.minute = 0; components.second = 0; - return [CURRENT_CALENDAR dateFromComponents:components]; + return [BAKit_Current_Calendar() dateFromComponents:components]; } -- (NSDateComponents *) componentsWithOffsetFromDate: (NSDate *) aDate +- (NSDateComponents *)ba_dateComponentsWithOffsetFromDate:(NSDate *)aDate { - NSDateComponents *dTime = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate toDate:self options:0]; + NSDateComponents *dTime = [BAKit_Current_Calendar() components:BAKi_DATE_COMPONENTS fromDate:aDate toDate:self options:0]; return dTime; } -#pragma mark Retrieving Intervals - -- (NSInteger) minutesAfterDate: (NSDate *) aDate +#pragma mark - 时间间隔 +- (NSInteger)ba_dateMinutesAfterDate:(NSDate *)aDate { NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; - return (NSInteger) (ti / D_MINUTE); + return (NSInteger) (ti / k_MINUTE); } -- (NSInteger) minutesBeforeDate: (NSDate *) aDate +- (NSInteger)ba_dateMinutesBeforeDate:(NSDate *)aDate { NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; - return (NSInteger) (ti / D_MINUTE); + return (NSInteger) (ti / k_MINUTE); } -- (NSInteger) hoursAfterDate: (NSDate *) aDate +- (NSInteger)ba_dateHoursAfterDate:(NSDate *)aDate { NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; - return (NSInteger) (ti / D_HOUR); + return (NSInteger) (ti / k_HOUR); } -- (NSInteger) hoursBeforeDate: (NSDate *) aDate +- (NSInteger)ba_dateHoursBeforeDate:(NSDate *)aDate { NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; - return (NSInteger) (ti / D_HOUR); + return (NSInteger) (ti / k_HOUR); } -- (NSInteger) daysAfterDate: (NSDate *) aDate +- (NSInteger)ba_dateDaysAfterDate:(NSDate *)aDate { NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; - return (NSInteger) (ti / D_DAY); + return (NSInteger) (ti / k_DAY); } -- (NSInteger) daysBeforeDate: (NSDate *) aDate +- (NSInteger)ba_dateDaysBeforeDate:(NSDate *)aDate { NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; - return (NSInteger) (ti / D_DAY); + return (NSInteger) (ti / k_DAY); } -// Thanks, dmitrydims -// I have not yet thoroughly tested this -- (NSInteger)distanceInDaysToDate:(NSDate *)anotherDate +- (NSInteger)ba_dateDistanceInDaysToDate:(NSDate *)anotherDate { NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay fromDate:self toDate:anotherDate options:0]; return components.day; } -#pragma mark Decomposing Dates - -- (NSInteger) nearestHour -{ - NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * 30; - NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; - NSDateComponents *components = [CURRENT_CALENDAR components:NSCalendarUnitHour fromDate:newDate]; - return components.hour; +- (NSDate *)ba_dateGetAfterYear:(int)year OrMonth:(int)month OrDay:(int)day{ + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *comps = nil; + comps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]]; + + NSDateComponents *adcomps = [[NSDateComponents alloc] init]; + + [adcomps setYear:year]; + [adcomps setMonth:month]; + [adcomps setDay:day]; + + NSDate *newdate = [calendar dateByAddingComponents:adcomps toDate:self options:0]; + return newdate; } -- (NSInteger) hour + +#pragma mark - 一年有多少周 +//#pragma mark WEEKDAY +//- (int)ba_dateGetWeekdayNumber +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} +// +//- (int)ba_dateGetWeekdayNumberPRC +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierRepublicOfChina] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} +// +//- (int)ba_dateGetWeekdayNumberWithCalendarIdentifier:(NSString *)identifier +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:identifier] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} + ++ (NSString *)ba_dateGetWeekInyearOrMouth:(BOOL)inYear WithDate:(NSDate *)date { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.hour; + NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + // 通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等) + + //设置每年及每月第一周必须包含的最少天数,比如:设定第一周最少包括3天,则value传入3 周四在哪一年 本周算那一年的 + [greCalendar setMinimumDaysInFirstWeek:3]; + + NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth fromDate:date]; + + if (inYear) { + return [NSString stringWithFormat:@"第%li周",(long)dateComponents.weekOfYear]; + }else{ + return [NSString stringWithFormat:@"第%li周",(long)dateComponents.weekOfMonth]; + } } -- (NSInteger) minute ++ (NSInteger)ba_dateGetWeekNumbersOfYear:(NSInteger)year { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.minute; + NSString *dateString = [NSString stringWithFormat:@"%ld-12-31",(long)year]; + NSDateFormatter *format = [NSDateFormatter ba_dateFormatterWithFormatString:BAKit_FormatString_YMD timezoneName:@"Asia/Shanghai"]; + NSDate *lastDay = [format dateFromString:dateString];//本年最后一天 + + NSString *lastDayWeek = [NSDate ba_dateGetWeekInyearOrMouth:YES WithDate:lastDay];//本年最后一天是第几周 + + NSInteger maxNum; + if ([lastDayWeek rangeOfString:@"1"].location != NSNotFound) {//如果是下一年第一周 看上一周是多少周 + NSString *beforeWeek = [NSDate ba_dateGetWeekInyearOrMouth:YES WithDate:[lastDay ba_dateGetAfterYear:0 OrMonth:0 OrDay:-7]]; + NSString *sub = [beforeWeek substringFromIndex:1]; + sub = [sub substringToIndex:sub.length - 1]; + maxNum = [sub floatValue]; + }else{ + NSString *sub = [lastDayWeek substringFromIndex:1]; + sub = [sub substringToIndex:sub.length - 1]; + maxNum = [sub floatValue]; + } + return maxNum; } -- (NSInteger) seconds +@end + +typedef NS_ENUM(NSUInteger, LunarCalendarDateComponent) { + LunarCalendarDateComponentShortYear, + LunarCalendarDateComponentLongYear, + LunarCalendarDateComponentShortMonth, + LunarCalendarDateComponentLongMonth, + LunarCalendarDateComponentShortDay, + LunarCalendarDateComponentLongDay, +}; + +@implementation NSDate (LunarCalendar) + +/** + * 农历年份,数字表示 2016 + */ +- (NSInteger)lunarShortYear { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.second; + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortYear]; } -- (NSInteger) day +/** + * 农历月份,数字表示 4 + */ +- (NSInteger)lunarShortMonth { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.day; + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortMonth]; } -- (NSInteger) month +/** + * 农历日期,数字表示 1 + */ +- (NSInteger)lunarShortDay { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.month; + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortDay]; } -- (NSInteger) week + +/** + * 农历年份,干支表示 丙申年 + */ +- (NSString *)lunarLongYear { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.weekOfYear; + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongYear]; } +/** + * 农历月份,汉字表示 四月 + */ -- (NSInteger) weekday +- (NSString *)lunarLongMonth { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.weekday; + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongMonth]; } - -- (NSInteger) nthWeekday // e.g. 2nd Tuesday of the month is 2 +/** + * 农历日期,汉字表示 初一 + */ +- (NSString *)lunarLongDay { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.weekdayOrdinal; + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongDay]; } -- (NSInteger) year +- (NSInteger)shortLunarCalendarWithComponentType:(LunarCalendarDateComponent)component { - NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; - return components.year; + + + static NSCalendar *lunarCalendar = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lunarCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese]; + + }); + + unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; + + NSDateComponents *localeComp = [lunarCalendar components:unitFlags fromDate:self]; + + switch (component) { + case LunarCalendarDateComponentShortYear: + return localeComp.year; + case LunarCalendarDateComponentShortMonth: + return localeComp.month; + case LunarCalendarDateComponentShortDay: + return localeComp.day; + default: + break; + } + return 0; } +- (NSString *)longLunarCalendarWithComponentType:(LunarCalendarDateComponent)component{ + + NSArray *lunarYears = [NSArray arrayWithObjects: + @"甲子", @"乙丑", @"丙寅", @"丁卯", @"戊辰", @"己巳", @"庚午", @"辛未", @"壬申", @"癸酉", + @"甲戌", @"乙亥", @"丙子", @"丁丑", @"戊寅", @"己卯", @"庚辰", @"辛己", @"壬午", @"癸未", + @"甲申", @"乙酉", @"丙戌", @"丁亥", @"戊子", @"己丑", @"庚寅", @"辛卯", @"壬辰", @"癸巳", + @"甲午", @"乙未", @"丙申", @"丁酉", @"戊戌", @"己亥", @"庚子", @"辛丑", @"壬寅", @"癸丑", + @"甲辰", @"乙巳", @"丙午", @"丁未", @"戊申", @"己酉", @"庚戌", @"辛亥", @"壬子", @"癸丑", + @"甲寅", @"乙卯", @"丙辰", @"丁巳", @"戊午", @"己未", @"庚申", @"辛酉", @"壬戌", @"癸亥", nil]; + + NSArray *lunarMonths=[NSArray arrayWithObjects: + @"正月", @"二月", @"三月", @"四月", @"五月", @"六月", + @"七月", @"八月", @"九月", @"十月", @"冬月", @"腊月", nil]; + + + NSArray *lunarDays=[NSArray arrayWithObjects: + @"初一", @"初二", @"初三", @"初四", @"初五", @"初六", @"初七", @"初八", @"初九", @"初十", + @"十一", @"十二", @"十三", @"十四", @"十五", @"十六", @"十七", @"十八", @"十九", @"二十", + @"廿一", @"廿二", @"廿三", @"廿四", @"廿五", @"廿六", @"廿七", @"廿八", @"廿九", @"三十", nil]; + + switch (component) { + case LunarCalendarDateComponentLongYear: + return [lunarYears objectAtIndex:(self.lunarShortYear-1)%lunarYears.count]; + case LunarCalendarDateComponentLongMonth: + return [lunarMonths objectAtIndex:(self.lunarShortMonth-1)%lunarMonths.count]; + case LunarCalendarDateComponentLongDay: + return [lunarDays objectAtIndex:(self.lunarShortDay-1)%lunarDays.count]; + default: + break; + } + + return nil; +} +/** + * 农历节气 (立春 雨水 惊蛰 春分...) + */ +- (NSString *)lunarSolarTerms { + + unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; + + NSDateComponents *localeComp = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; + + return [NSDate getLunarSolarTermsWithYear:(int)localeComp.year Month:(int)localeComp.month Day:(int)localeComp.day]; +} ++ (NSString *)getLunarSolarTermsWithYear:(int)iYear Month:(int)iMonth Day:(int)iDay { + + NSArray *lunarDays=[NSArray arrayWithObjects: + @"小寒", @"大寒", @"立春", @"雨水", @"惊蛰", @"春分", + @"清明", @"谷雨", @"立夏", @"小满", @"芒种", @"夏至", + @"小暑", @"大暑", @"立秋", @"处暑", @"白露", @"秋分", + @"寒露", @"霜降", @"立冬", @"小雪", @"大雪", @"冬至", nil]; + + int array_index = (iYear - StartYear)*12+iMonth -1 ; + int64_t flag = gLunarHolDay[array_index]; + int64_t day; + if(iDay <15) + day= 15 - ((flag>>4)&0x0f); + else + day = ((flag)&0x0f)+15; + int index = -1; + if(iDay == day){ + index = (iMonth-1) *2 + (iDay>15? 1: 0); + } + if ( index >= 0 && index < [lunarDays count] ) { + return [lunarDays objectAtIndex:index]; + } else { + return @""; + } +} +static int const StartYear = 2001; +//static int const EndYear = 2050; +static int64_t gLunarHolDay[]= +{ + + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2001 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2002 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2003 + 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2004 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2005 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2006 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2007 + 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2008 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2009 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2010 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, //2011 + 0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2012 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2013 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2014 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2015 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2016 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2017 + 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2018 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2019 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2020 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2021 + 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2022 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2023 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2024 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2025 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2026 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2027 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2028 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2029 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2030 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2031 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2032 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, //2033 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87, //2034 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2035 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2036 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2037 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2038 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2039 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2040 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2041 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2042 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2043 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96, //2044 + 0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2045 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2046 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2047 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, //2048 + 0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2049 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87 //2050 +}; -///* 获取年 */ -//+ (NSDate *)yesterday -//{ -// BADateInformation inf = [[NSDate date] dateInformation]; -// inf.day--; -// return [self dateFromDateInformation:inf]; -//} -// -///* 获取月 */ -//+ (NSDate *)month -//{ -// return [[NSDate date] month]; -//} -// -///* 获取月 */ -//- (NSDate *)month -//{ -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth) fromDate:self]; -// [comp setDay:1]; -// NSDate *date = [gregorian dateFromComponents:comp]; -// return date; -//} -// -///* */ -//- (NSInteger)weekday -//{ -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comps = [gregorian components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear | NSCalendarUnitWeekday) fromDate:self]; -// NSInteger weekday = [comps weekday]; -// return weekday; -//} -// -///* */ -//- (NSString *)dayFromWeekday -//{ -//// switch([self weekday]) -//// { -//// case 1: -//// return STLocalizedString(@"SUNDAY", @""); -//// break; -//// case 2: -//// return STLocalizedString(@"MONDAY", @""); -//// break; -//// case 3: -//// return STLocalizedString(@"TUESDAY", @""); -//// break; -//// case 4: -//// return STLocalizedString(@"WEDNESDAY", @""); -//// break; -//// case 5: -//// return STLocalizedString(@"THURSDAY", @""); -//// break; -//// case 6: -//// return STLocalizedString(@"FRIDAY", @""); -//// break; -//// case 7: -//// return STLocalizedString(@"SATURDAY", @""); -//// break; -//// default: -//// break; -//// } -// -// return @""; -//} -// -///* */ -//- (NSDate *)timelessDate -//{ -// NSDate *day = self; -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:day]; -// return [gregorian dateFromComponents:comp]; -//} -// -///* */ -//- (NSDate *)monthlessDate -//{ -// NSDate *day = self; -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth) fromDate:day]; -// return [gregorian dateFromComponents:comp]; -//} -// -///* */ -//- (BOOL)isSameDay:(NSDate *)anotherDate -//{ -// NSCalendar* calendar = [NSCalendar currentCalendar]; -// NSDateComponents* components1 = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:self]; -// NSDateComponents* components2 = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:anotherDate]; -// return ([components1 year] == [components2 year] && [components1 month] == [components2 month] && [components1 day] == [components2 day]); -//} -// -///* */ -//- (NSInteger)monthsBetweenDate:(NSDate *)toDate -//{ -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// -// NSDateComponents *components = [gregorian components:NSCalendarUnitMonth -// fromDate:[self monthlessDate] -// toDate:[toDate monthlessDate] -// options:0]; -// NSInteger months = [components month]; -// return abs((int)months); -//} -// -///* */ -//- (NSInteger)daysBetweenDate:(NSDate *)toDate -//{ -// NSTimeInterval time = [self timeIntervalSinceDate:toDate]; -// return fabs(time / 60 / 60 / 24); -//} -// -///* */ -//- (BOOL)isToday -//{ -// return [self isSameDay:[NSDate date]]; -//} -// -///* */ -//- (NSDate *)dateByAddingDays:(NSUInteger)days -//{ -// NSDateComponents *c = [[NSDateComponents alloc] init]; -// c.day = days; -// return [[NSCalendar currentCalendar] dateByAddingComponents:c toDate:self options:0]; -//} -// -///* */ -//+ (NSDate *)dateWithDatePart:(NSDate *)aDate andTimePart:(NSDate *)aTime -//{ -// NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; -// [dateFormatter setDateFormat:@"dd/MM/yyyy"]; -// NSString *datePortion = [dateFormatter stringFromDate:aDate]; -// -// [dateFormatter setDateFormat:@"HH:mm"]; -// NSString *timePortion = [dateFormatter stringFromDate:aTime]; -// -// [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm"]; -// NSString *dateTime = [NSString stringWithFormat:@"%@ %@",datePortion,timePortion]; -// return [dateFormatter dateFromString:dateTime]; -//} -// -///* */ -//- (NSString *)monthString -//{ -// NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; -// [dateFormatter setDateFormat:@"MMMM"]; -// return [dateFormatter stringFromDate:self]; -//} -// -///* */ -//+ (NSString *)monthStringWithMonthNumber:(NSInteger)month -//{ -//// switch(month) -//// { -//// case 1: -//// return STLocalizedString(@"JANUARY", @""); -//// break; -//// case 2: -//// return STLocalizedString(@"FEBRUARY", @""); -//// break; -//// case 3: -//// return STLocalizedString(@"MARCH", @""); -//// break; -//// case 4: -//// return STLocalizedString(@"APRIL", @""); -//// break; -//// case 5: -//// return STLocalizedString(@"MAY", @""); -//// break; -//// case 6: -//// return STLocalizedString(@"JUNE", @""); -//// break; -//// case 7: -//// return STLocalizedString(@"JULY", @""); -//// break; -//// case 8: -//// return STLocalizedString(@"AUGUST", @""); -//// break; -//// case 9: -//// return STLocalizedString(@"SEPTEMBER", @""); -//// break; -//// case 10: -//// return STLocalizedString(@"OCTOBER", @""); -//// break; -//// case 11: -//// return STLocalizedString(@"NOVEMBER", @""); -//// break; -//// case 12: -//// return STLocalizedString(@"DECEMBER", @""); -//// break; -//// default: -//// return nil; -//// break; -//// } -// return @""; -//} -// -///* */ -//- (NSString *)yearString -//{ -// NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; -// [dateFormatter setDateFormat:@"yyyy"]; -// return [dateFormatter stringFromDate:self]; -//} -// -///* */ -//- (BADateInformation)dateInformationWithTimeZone:(NSTimeZone *)timezone -//{ -// BADateInformation info; -// -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// [gregorian setTimeZone:timezone]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitMonth | NSCalendarUnitMinute | NSCalendarUnitYear | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitSecond) fromDate:self]; -// info.day = [comp day]; -// info.month = [comp month]; -// info.year = [comp year]; -// -// info.hour = [comp hour]; -// info.minute = [comp minute]; -// info.second = [comp second]; -// -// -// info.weekday = [comp weekday]; -// -// return info; -//} -// -///* */ -//- (BADateInformation)dateInformation -//{ -// BADateInformation info; -// -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitMonth | NSCalendarUnitMinute | NSCalendarUnitYear | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitSecond) fromDate:self]; -// info.day = [comp day]; -// info.month = [comp month]; -// info.year = [comp year]; -// -// info.hour = [comp hour]; -// info.minute = [comp minute]; -// info.second = [comp second]; -// -// info.weekday = [comp weekday]; -// -// return info; -//} -// -///* */ -//+ (NSDate *)dateFromDateInformation:(BADateInformation)info timeZone:(NSTimeZone *)timezone -//{ -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// [gregorian setTimeZone:timezone]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth) fromDate:[NSDate date]]; -// -// [comp setDay:info.day]; -// [comp setMonth:info.month]; -// [comp setYear:info.year]; -// [comp setHour:info.hour]; -// [comp setMinute:info.minute]; -// [comp setSecond:info.second]; -// [comp setTimeZone:timezone]; -// -// return [gregorian dateFromComponents:comp]; -//} -// -///* */ -//+ (NSDate *)dateFromDateInformation:(BADateInformation)info -//{ -// NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; -// NSDateComponents *comp = [gregorian components:(NSCalendarUnitYear | NSCalendarUnitMonth) fromDate:[NSDate date]]; -// -// [comp setDay:info.day]; -// [comp setMonth:info.month]; -// [comp setYear:info.year]; -// [comp setHour:info.hour]; -// [comp setMinute:info.minute]; -// [comp setSecond:info.second]; -// //[comp setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; -// -// return [gregorian dateFromComponents:comp]; -//} -// -///* */ -//+ (NSString *)dateInformationDescriptionWithInformation:(BADateInformation)info -//{ -// return [NSString stringWithFormat:@"%02li/%02li/%04li %02li:%02li:%02li", (long)info.month, (long)info.day, (long)info.year, (long)info.hour, (long)info.minute, (long)info.second]; -//} -// -///** -// * 是否为今天 -// */ -//- (BOOL)isTodays -//{ -// NSCalendar *calendar = [NSCalendar currentCalendar]; -// int unit = NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear; -// -// // 1.获得当前时间的年月日 -// NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]]; -// -// // 2.获得self的年月日 -// NSDateComponents *selfCmps = [calendar components:unit fromDate:self]; -// return -// (selfCmps.year == nowCmps.year) && -// (selfCmps.month == nowCmps.month) && -// (selfCmps.day == nowCmps.day); -//} -// -///** -// * 是否为昨天 -// */ -//- (BOOL)isYesterday -//{ -// // 2014-05-01 -// NSDate *nowDate = [[NSDate date] dateWithYMD]; -// -// // 2014-04-30 -// NSDate *selfDate = [self dateWithYMD]; -// -// // 获得nowDate和selfDate的差距 -// NSCalendar *calendar = [NSCalendar currentCalendar]; -// NSDateComponents *cmps = [calendar components:NSCalendarUnitDay fromDate:selfDate toDate:nowDate options:0]; -// return cmps.day == 1; -//} -// -//- (NSDate *)dateWithYMD -//{ -// NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; -// fmt.dateFormat = @"yyyy-MM-dd"; -// NSString *selfStr = [fmt stringFromDate:self]; -// return [fmt dateFromString:selfStr]; -//} -// -///** -// * 是否为今年 -// */ -//- (BOOL)isThisYear -//{ -// NSCalendar *calendar = [NSCalendar currentCalendar]; -// int unit = NSCalendarUnitYear; -// -// // 1.获得当前时间的年月日 -// NSDateComponents *nowCmps = [calendar components:unit fromDate:[NSDate date]]; -// -// // 2.获得self的年月日 -// NSDateComponents *selfCmps = [calendar components:unit fromDate:self]; -// -// return nowCmps.year == selfCmps.year; -//} -// -//- (NSDateComponents *)deltaWithNow -//{ -// NSCalendar *calendar = [NSCalendar currentCalendar]; -// int unit = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; -// return [calendar components:unit fromDate:self toDate:[NSDate date] options:0]; -//} -// -///*! 时间戳转换成日期 */ -//+ (NSDate *)ba_NSDateTransformWithNSDateTimeSp:(NSString *)timeSp -//{ -// NSDate *date = [NSDate dateWithTimeIntervalSince1970:[timeSp doubleValue]]; -// NSTimeZone *zone = [NSTimeZone localTimeZone]; -// // 当地时区 -// NSTimeZone *localTime = [NSTimeZone localTimeZone]; -// NSLog(@"当地时区: %@",localTime); -// // 和格林尼治时间差 -// NSInteger timeOff = [zone secondsFromGMT]; -// // 时差转化 -// NSDate *localeDate = [date dateByAddingTimeInterval:timeOff]; -// NSLog(@"通知时间: %@",localeDate); -// -// return localeDate; -//} @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.h" index 39a94e0..313a141 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.h" @@ -1,10 +1,62 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' // -// NSDateFormatter+BAKit.h -// BABaseProject -// -// Created by 博爱 on 16/7/18. -// Copyright © 2016年 博爱之家. All rights reserved. -// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + #import @@ -12,9 +64,57 @@ + (id)ba_dateFormatter; -+ (id)ba_dateFormatterWithFormat:(NSString *)dateFormat; ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString; + ++ (id)ba_dateFormatterWithFormatString:(NSString *)fmtString timezoneName:(NSString *)timezoneName; ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString dateStyle:(NSDateFormatterStyle)dateStyle; +/** + 格式化:yyyy-MM-dd HH:mm:ss + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMDHMS; + +/** + 格式化:yyyy-MM-dd, EEE, HH:mm:ss + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMDEHMS; + +/** + 格式化:yyyy-MM-dd + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMD; + +/** + 格式化:yyyy-MM + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYM; + +/** + 格式化:yyyy + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYY; -+ (id)ba_defaultDateFormatter;/*yyyy-MM-dd HH:mm:ss*/ +/** + 格式化:HM + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithHM; +/** + 格式化:HMS + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithHMS; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.m" index 2098003..4f21201 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDateFormatter+BAKit.m" @@ -1,10 +1,83 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' // -// NSDateFormatter+BAKit.m -// BABaseProject -// -// Created by 博爱 on 16/7/18. -// Copyright © 2016年 博爱之家. All rights reserved. -// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +//iOS-NSDateFormatter格式说明: +//G: 公元时代,例如AD公元 +//yy: 年的后2位 +//yyyy: 完整年 +//MM: 月,显示为1-12 +//MMM: 月,显示为英文月份简写,如 Jan +//MMMM: 月,显示为英文月份全称,如 Janualy +//dd: 日,2位数表示,如02 +//d: 日,1-2位显示,如 2 +//EEE: 简写星期几,如Sun +//EEEE: 全写星期几,如Sunday +//aa: 上下午,AM/PM +//H: 时,24小时制,0-23 +//K:时,12小时制,0-11 +//m: 分,1-2位 +//mm: 分,2位 +//s: 秒,1-2位 +//ss: 秒,2位 +//S: 毫秒 +//Z:GMT + #import "NSDateFormatter+BAKit.h" @@ -15,16 +88,74 @@ + (id)ba_dateFormatter return [[self alloc] init]; } -+ (id)ba_dateFormatterWithFormat:(NSString *)dateFormat ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString +{ + if (dateFormatString == nil || ![dateFormatString isKindOfClass:[NSString class]] || [dateFormatString isEqualToString:@""]) + { + return nil; + } + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + dateFormatter.dateFormat = dateFormatString; + + return dateFormatter; +} + ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString timezoneName:(NSString *)timezoneName { - NSDateFormatter *dateFormatter = [[self alloc] init]; - dateFormatter.dateFormat = dateFormat; + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:dateFormatString]; + + if (timezoneName != nil && [timezoneName isKindOfClass:[NSString class]] && ![timezoneName isEqualToString:@""]) { + dateFormatter.timeZone = [NSTimeZone timeZoneWithName:timezoneName]; + } return dateFormatter; } -+ (id)ba_defaultDateFormatter ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString dateStyle:(NSDateFormatterStyle)dateStyle { - return [self ba_dateFormatterWithFormat:@"yyyy-MM-dd HH:mm:ss"]; + + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:dateFormatString]; + + dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"]; + dateFormatter.dateStyle = dateStyle; + + return dateFormatter; } ++ (id)ba_setupDateFormatterWithYMDHMS +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_YMDHMS]; +} + ++ (id)ba_setupDateFormatterWithYMDEHMS +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_YMDEHMS]; +} + ++ (id)ba_setupDateFormatterWithYMD +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_YMD]; +} + ++ (id)ba_setupDateFormatterWithYM +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_YM]; +} + ++ (id)ba_setupDateFormatterWithYY +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_Y]; +} + ++ (id)ba_setupDateFormatterWithHM +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_HM]; +} + ++ (id)ba_setupDateFormatterWithHMS +{ + return [self ba_dateFormatterWithFormatString:BAKit_FormatString_YMDHMS]; +} + + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDictionary+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDictionary+BAKit.h" index 39184da..f71444b 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDictionary+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSDictionary+BAKit.h" @@ -1,7 +1,7 @@ /*! - * @header BAKit - * demoTest + * @header BAKit.h + * BABaseProject * * @brief BAKit * @@ -10,31 +10,36 @@ * @version V1.0 */ -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? /* @@ -42,11 +47,13 @@ * * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) + * QQ : 博爱1616【137361770】 * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + ********************************************************************************* */ @@ -66,4 +73,6 @@ * 字典转JSON */ + (NSString *)dictionaryToJson:(NSDictionary *)dictionary; + + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.h" index 0a837bc..8280bd5 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.h" @@ -53,31 +53,41 @@ #import -/** +/*! * 给NSMutableArray类添加许多有用的方法 */ @interface NSMutableArray (BAKit) -/** +/*! * 获取在安全模式下给定索引的对象(如果自身是空的则无) */ - (id)safeObjectAtIndex:(NSUInteger)index; // 设定的索引 -/** +/*! * 移动对象从一个索引到另一个索引 */ - (void)moveObjectFromIndex:(NSUInteger)from // 源索引 toIndex:(NSUInteger)to; // 目标索引 -/** +/*! * 创建反向数组 */ - (NSMutableArray *)reversedArray; -/** +/*! * 获取给定的键值和排序的数组 */ + (NSMutableArray *)sortArrayByKey:(NSString *)key // 键值 array:(NSMutableArray *)array // 指定的集合 ascending:(BOOL)ascending; // YES为升序,NO为降序 + +/*! + * 将字符串中的文字和表情解析出来 + * + * @param string 带表情的字符串 + * + * @return NSMutableArray + */ ++ (NSMutableArray *)ba_decorateString:(NSString *)string; + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.m" index 39edbd0..a61f93b 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BAKit.m" @@ -54,6 +54,9 @@ #import "NSMutableArray+BAKit.h" #import "NSArray+BAKit.h" + +#define PATTERN_STR @"\\[[^\\[\\]]*\\]" + @implementation NSMutableArray (BAKit) /* 获取在安全模式下给定索引的对象(如果自身是空的则无 */ @@ -113,4 +116,87 @@ + (NSMutableArray *)sortArrayByKey:(NSString *)key return array; } +#pragma mark - 将字符串中的文字和表情解析出来 ++ (NSMutableArray *)ba_decorateString:(NSString *)string +{ + NSMutableArray *array = [NSMutableArray array]; + + NSRegularExpression *regex = [[NSRegularExpression alloc] + initWithPattern:PATTERN_STR + options:NSRegularExpressionCaseInsensitive|NSRegularExpressionDotMatchesLineSeparators + error:nil]; + NSArray *chunks = [regex matchesInString:string options:0 + range:NSMakeRange(0, [string length])]; + NSMutableArray *matchRanges = [NSMutableArray array]; + + for (NSTextCheckingResult *result in chunks) { + NSString *resultStr = [string substringWithRange:[result range]]; + + if ([resultStr hasPrefix:@"["] && [resultStr hasSuffix:@"]"]) { + NSString *name = [resultStr substringWithRange:NSMakeRange(1, [resultStr length]-2)]; + name=[NSString stringWithFormat:@"[%@]",name]; + NSLog(@"name:%@",name); + NSDictionary *faceMap = [[NSUserDefaults standardUserDefaults] objectForKey:@"FaceMap"]; + if ([[faceMap allValues] containsObject:name]) { + // [array addObject:name]; + [matchRanges addObject:[NSValue valueWithRange:result.range]]; + } + } + } + + NSRange r = NSMakeRange([string length], 0); + [matchRanges addObject:[NSValue valueWithRange:r]]; + + NSUInteger lastLoc = 0; + for (NSValue *v in matchRanges) + { + NSRange resultRange = [v rangeValue]; + if (resultRange.location==0) { + NSString *faceString = [string substringWithRange:resultRange]; + NSLog(@"aaaaaaaaa:faceString:%@",faceString); + if (faceString.length!=0) + { + [array addObject:faceString]; + } + + NSRange normalStringRange = NSMakeRange(lastLoc, resultRange.location - lastLoc); + NSString *normalString = [string substringWithRange:normalStringRange]; + lastLoc = resultRange.location + resultRange.length; + NSLog(@"aaaaaaa:normalString:%@",normalString); + if (normalString.length!=0) + { + [array addObject:normalString]; + } + } + else + { + NSRange normalStringRange = NSMakeRange(lastLoc, resultRange.location - lastLoc); + NSString *normalString = [string substringWithRange:normalStringRange]; + lastLoc = resultRange.location + resultRange.length; + NSLog(@"bbbbbbb:normalString:%@",normalString); + if (normalString.length!=0) + { + [array addObject:normalString]; + } + + NSString *faceString = [string substringWithRange:resultRange]; + NSLog(@"bbbbbbbb:faceString:%@",faceString); + if (faceString.length!=0) + { + [array addObject:faceString]; + } + } + } + if ([matchRanges count]==0) + { + if (string.length!=0) + { + [array addObject:string]; + } + } + NSLog(@"字符串中的文字和表情解析出来 的 array :%@",array); + + return array; +} + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.h" new file mode 100644 index 0000000..d22a97b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.h" @@ -0,0 +1,74 @@ +// +// NSMutableArray+BASort.h +// testDemo +// +// Created by 博爱 on 2016/11/22. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +typedef NSComparisonResult(^BASortComparator)(id obj1, id obj2); +typedef void(^BASortExchangeCallBack)(id obj1, id obj2); + +@interface NSMutableArray (BASort) + +#pragma mark - 选择排序 +// 40.435 +/*! + * 选择排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_selectSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack; + +// 38.153 +/*! + * 冒泡排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_bubbleSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack; + +// 20.352 +/*! + * 插入排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_insertSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack; + +// 4.752 +/*! + * 快速排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_quickSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack; + +// 8.060 +/*! + * 堆排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_heapSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack; + + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.m" new file mode 100644 index 0000000..281b30f --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSMutableArray+BASort.m" @@ -0,0 +1,266 @@ +// +// NSMutableArray+BASort.m +// testDemo +// +// Created by 博爱 on 2016/11/22. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "NSMutableArray+BASort.h" + +@implementation NSMutableArray (BASort) + +#pragma mark - 选择排序 +// 40.435 +/*! + * 选择排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_selectSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + if (self.count == 0) + { + return; + } + + for (NSInteger i = 0; i < self.count - 1; i++) + { + for (NSInteger j = i + 1; j < self.count; j++) + { + if (comparator(self[i], self[j]) == NSOrderedDescending) + { + [self ba_exchangeWithIndexA:i indexB:j didExchange:sortExchangeCallBack]; + } + } + } +} + +#pragma mark - 冒泡排序 +// 38.153 +/*! + * 冒泡排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_bubbleSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + if (self.count == 0) + { + return; + } + + for (NSInteger i = self.count -1; i > 0; i--) + { + for (NSInteger j = 0; j < i; j++) + { + if (comparator(self[j], self[j + 1]) == NSOrderedDescending) + { + [self ba_exchangeWithIndexA:j indexB:(j + 1) didExchange:sortExchangeCallBack]; + } + } + } +} + +#pragma mark - 插入排序 +// 20.352 +/*! + * 插入排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_insertSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + for (NSInteger i = 1; i < self.count; i++) + { + for (NSInteger j = i; j > 0 && comparator(self[j], self[j - 1]) == NSOrderedAscending; j--) + { + [self ba_exchangeWithIndexA:j indexB:(j - 1) didExchange:sortExchangeCallBack]; + } + } +} + +#pragma mark - 快速排序 +// 4.752 +/*! + * 快速排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_quickSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + if (self.count == 0) + { + return; + } + [self ba_quickSortWithLowIndex:0 + highIndex:(self.count - 1) + comparator:comparator + didExchange:sortExchangeCallBack]; +} + +- (void)ba_quickSortWithLowIndex:(NSInteger)lowIndex + highIndex:(NSInteger)highIndex + comparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + if (lowIndex >= highIndex) + { + return; + } + + NSInteger tempIndex = [self ba_quickPartitionWithLowIndex:lowIndex + highIndex:highIndex + comparator:comparator + didExchange:sortExchangeCallBack]; + [self ba_quickSortWithLowIndex:lowIndex highIndex:(tempIndex - 1) + comparator:comparator + didExchange:sortExchangeCallBack]; + [self ba_quickSortWithLowIndex:(tempIndex + 1) highIndex:highIndex + comparator:comparator + didExchange:sortExchangeCallBack]; +} + +- (NSInteger)ba_quickPartitionWithLowIndex:(NSInteger)lowIndex + highIndex:(NSInteger)highIndex + comparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + id temp = self[lowIndex]; + NSInteger i = lowIndex; + NSInteger j = highIndex; + + while (i < j) + { + /*! 跳过大于等于 temp 的元素 */ + while (i < j && comparator(self[j], temp) != NSOrderedAscending) + { + j--; + } + if (i < j) + { + /*! i、j未相遇,说明找到了小于 temp 的元素。交换。 */ + [self ba_exchangeWithIndexA:i indexB:j didExchange:sortExchangeCallBack]; + i++; + } + + /*! 跳过小于等于 temp 的元素 */ + while (i < j && comparator(self[i], temp) != NSOrderedDescending) + { + i++; + } + if (i < j) + { + /*! i、j未相遇,说明找到了大于 temp 的元素。交换。 */ + [self ba_exchangeWithIndexA:i indexB:j didExchange:sortExchangeCallBack]; + j--; + } + } + return i; +} + +#pragma mark - 堆排序 +// 8.060 +/*! + * 堆排序 + * + * @param comparator 排序的对象 + * @param sortStyle 排序的方式(枚举):升序、相等、降序 + * @param sortExchangeCallBack 回调排序的结果 + */ +- (void)ba_heapSortWithComparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + /*! 排序过程中不使用第0位 */ + [self insertObject:[NSNull null] atIndex:0]; + + /*! + 构造大顶堆 + 遍历所有非终结点,把以它们为根结点的子树调整成大顶堆 + 最后一个非终结点位置在本队列长度的一半处 + */ + for (NSInteger index = self.count / 2; index > 0; index --) + { + /*! 根结点下沉到合适位置 */ + [self ba_sinkIndex:index + bottomIndex:(self.count - 1) + comparator:comparator + didExchange:sortExchangeCallBack]; + } + + /*! + 完全排序 + 从整棵二叉树开始,逐渐剪枝 + */ + for (NSInteger index = self.count - 1; index > 1; index --) + { + /*! 每次把根结点放在列尾,下一次循环时将会剪掉 */ + [self ba_exchangeWithIndexA:1 indexB:index didExchange:sortExchangeCallBack]; + + /*! 下沉根结点,重新调整为大顶堆 */ + [self ba_sinkIndex:1 + bottomIndex:(index - 1) + comparator:comparator + didExchange:sortExchangeCallBack]; + } + + /*! 排序完成后删除占位元素 */ + [self removeObjectAtIndex:0]; +} + +/*! 下沉,传入需要下沉的元素位置,以及允许下沉的最底位置 */ +- (void)ba_sinkIndex:(NSInteger)sinkIndex + bottomIndex:(NSInteger)bottomIndex + comparator:(BASortComparator)comparator + didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + for (NSInteger maxTempIndex = sinkIndex * 2; maxTempIndex <= bottomIndex; maxTempIndex *= 2) + { + /*! 如果存在右子结点,并且左子结点比右子结点小 */ + if (maxTempIndex < bottomIndex && (comparator(self[maxTempIndex], self[maxTempIndex + 1]) == NSOrderedAscending)) + { + /*! 指向右子结点 */ + ++ maxTempIndex; + } + /*! 如果最大的子结点元素小于本元素,则本元素不必下沉了 */ + if (comparator(self[maxTempIndex ], self[sinkIndex]) == NSOrderedAscending) + { + break; + } + /*! + 否则 + 把最大子结点元素上游到本元素位置 + */ + [self ba_exchangeWithIndexA:sinkIndex indexB:maxTempIndex didExchange:sortExchangeCallBack]; + /*! 标记本元素需要下沉的目标位置,为最大子结点原位置 */ + sinkIndex = maxTempIndex; + } +} + +#pragma mark - 交换两个元素 +- (void)ba_exchangeWithIndexA:(NSInteger)indexA indexB:(NSInteger)indexB didExchange:(BASortExchangeCallBack)sortExchangeCallBack +{ + id temp = self[indexA]; + self[indexA] = self[indexB]; + self[indexB] = temp; + + if (sortExchangeCallBack) + { + sortExchangeCallBack(temp, self[indexA]); + } +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSNumber+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSNumber+BAKit.m" index b624a89..52e274b 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSNumber+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSNumber+BAKit.m" @@ -85,7 +85,7 @@ + (CGFloat)randomFloatBetweenMin:(CGFloat)minValue } + (NSNumber *)numberWithString:(NSString *)string { - NSString *str = [[string stringByTrim] lowercaseString]; + NSString *str = [[string ba_trimWhitespaceAndNewlines] lowercaseString]; if (!str || !str.length) { return nil; } diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.h" new file mode 100755 index 0000000..54dc247 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.h" @@ -0,0 +1,111 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + +/** + * - 添加运行时分类方法 + * - 用于运行时动态获取当前类的属性列表、方法列表、成员变量列表、协议列表 + * - 性能优化 + */ +#import + +@interface NSObject (BARunTime) + +/** + * 将 ‘字典数组‘ 转换成当前模型的对象数组 + * + * @param array 字典数组 + * + * @return 返回模型对象的数组 + */ ++ (NSArray *)ba_objectsWithArray:(NSArray *)array; + +/** + * 返回当前类的所有属性列表 + * + * @return 属性名称 + */ ++ (NSArray *)ba_propertysList; + +/** + * 返回当前类的所有成员变量数组 + * + * @return 当前类的所有成员变量! + * + * Tips:用于调试, 可以尝试查看所有不开源的类的ivar + */ ++ (NSArray *)ba_ivarList; + +/** + * 返回当前类的所有方法 + * + * @return 当前类的所有成员变量! + */ ++ (NSArray *)ba_methodList; + +/** + * 返回当前类的所有协议 + * + * @return 当前类的所有协议! + */ ++ (NSArray *)ba_protocolList; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.m" new file mode 100755 index 0000000..b0a8149 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSObject+BARunTime.m" @@ -0,0 +1,268 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import "NSObject+BARunTime.h" +#import + +@implementation NSObject (BARunTime) + +#pragma mark - 根据传递进来的所有字典数组 字典转模型 ++ (NSArray *)ba_objectsWithArray:(NSArray *)array +{ + if (array.count == 0) + { + return nil; + } + + // 判断是否是字典数组 + NSAssert([array[0] isKindOfClass:[NSDictionary class]], @"必须传入字典数组"); + + // 获取属性列表数组 + NSArray *propertyList = [self ba_propertysList]; + + NSMutableArray *arrayM = [NSMutableArray array]; + + for (NSDictionary *dict in array) + { + // 创建模型 + id model = [self new]; + + // 遍历数组 + for (NSString *key in dict) + { + // 判断属性列表数组中是否包含当前key 如果有, 意味着属性存在 + if ([propertyList containsObject:key]) { + // 字典转模型 + [model setValue:dict[key] forKey:key]; + } + } + // 添加到可变数组中 + [arrayM addObject:model]; + } + return arrayM.copy; +} + +#pragma mark - 获取本类所有 ‘属性‘ 的数组 +/** 程序运行的时候动态的获取当前类的属性列表 + * 程序运行的时候,类的属性不会变化 + */ +const void *ba_propertyListKey = @"ba_propertyListKey"; ++ (NSArray *)ba_propertysList +{ + NSArray *result = objc_getAssociatedObject(self, ba_propertyListKey); + + if (result != nil) + { + return result; + } + + NSMutableArray *arrayM = [NSMutableArray array]; + // 获取当前类的属性数组 + // count -> 属性的数量 + unsigned int count = 0; + objc_property_t *list = class_copyPropertyList([self class], &count); + + for (unsigned int i = 0; i < count; i++) { + // 根据下标获取属性 + objc_property_t property = list[i]; + + // 获取属性的名字 + const char *cName = property_getName(property); + + // 转换成OC字符串 + NSString *name = [NSString stringWithUTF8String:cName]; + [arrayM addObject:name]; + } + + /*! ⚠️注意: 一定要释放数组 class_copyPropertyList底层为C语言,所以我们一定要记得释放properties */ + free(list); + + // ---保存属性数组对象--- + objc_setAssociatedObject(self, ba_propertyListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); + + return objc_getAssociatedObject(self, ba_propertyListKey); +} + +#pragma mark - 获取本类所有 ‘方法‘ 的数组 +const void *ba_methodListKey = "ba_methodListKey"; ++ (NSArray *)ba_methodList +{ + // 1. 使用运行时动态添加属性 + NSArray *methodsList = objc_getAssociatedObject(self, ba_methodListKey); + + // 2. 如果数组中直接返回方法数组 + if (methodsList != nil) + { + return methodsList; + } + + // 3. 获取当前类的方法数组 + unsigned int count = 0; + Method *list = class_copyMethodList([self class], &count); + + NSMutableArray *arrayM = [NSMutableArray array]; + for (unsigned int i = 0; i < count; i++) + { + // 根据下标获取方法 + Method method = list[i]; + + SEL methodName = method_getName(method); + + NSString *methodName_OC = NSStringFromSelector(methodName); + + IMP imp = method_getImplementation(method); + const char *name_s =sel_getName(method_getName(method)); + int arguments = method_getNumberOfArguments(method); + const char* encoding =method_getTypeEncoding(method); + NSLog(@"方法名:%@,参数个数:%d,编码方式:%@",[NSString stringWithUTF8String:name_s], + arguments, + [NSString stringWithUTF8String:encoding]); + + [arrayM addObject:methodName_OC]; + } + + // 4. 释放数组 + free(list); + + // 5. 保存方法的数组对象 + objc_setAssociatedObject(self, ba_methodListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); + + return objc_getAssociatedObject(self, ba_methodListKey); +} + + +#pragma mark - 获取本类所有 ‘成员变量‘ 的数组 <用来调试> +/** 获取当前类的所有成员变量 */ +const char *ba_ivarListKey = "ba_ivarListKey"; ++ (NSArray *)ba_ivarList +{ + + // 1. 查询根据key 保存的成员变量数组 + NSArray *ivarList = objc_getAssociatedObject(self, ba_ivarListKey); + + // 2. 判断数组中是否有值, 如果有直接返回 + if (ivarList != nil) + { + return ivarList; + } + + // 3. 如果数组中没有, 则根据当前类,获取当前类的所有 ‘成员变量‘ + unsigned int count = 0; + Ivar *ivars = class_copyIvarList([self class], &count); + + // 4. 遍历 成员变量 数组, 获取成员变量的名 + NSMutableArray *arrayM = [NSMutableArray array]; + for (unsigned int i = 0; i < count; i++) { + Ivar ivar = ivars[i]; + // - C语言的字符串都是 ‘char *‘ 类型的 + const char *ivarName_C = ivar_getName(ivar); + + // - 将 C语言的字符串 转换成 OC字符串 + NSString *ivarName_OC = [NSString stringWithUTF8String:ivarName_C]; + // - 将本类 ‘成员变量名‘ 添加到数组 + [arrayM addObject:ivarName_OC]; + } + + // 5. 释放ivars + free(ivars); + + // 6. 根据key 动态获取保存在关联对象中的数组 + objc_setAssociatedObject(self, ba_ivarListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); + + return objc_getAssociatedObject(self, ba_ivarListKey); +} + +#pragma mark - 获取本类所有 ‘协议‘ 的数组 +/** 用来获取动态保存在关联对象中的协议数组 |运行时的关联对象根据key动态取值| */ +const char *ba_protocolListKey = "ba_protocolListKey"; + ++ (NSArray *)ba_protocolList { + NSArray *protocolList = objc_getAssociatedObject(self, ba_protocolListKey); + if (protocolList != nil) + { + return protocolList; + } + + unsigned int count = 0; + Protocol * __unsafe_unretained *protocolLists = class_copyProtocolList([self class], &count); + + NSMutableArray *arrayM = [NSMutableArray array]; + for (unsigned int i = 0; i < count; i++) { + // 获取 协议名 + Protocol *protocol = protocolLists[i]; + const char *protocolName_C = protocol_getName(protocol); + NSString *protocolName_OC = [NSString stringWithUTF8String:protocolName_C]; + + // 将 协议名 添加到数组 + [arrayM addObject:protocolName_OC]; + } + + // 释放数组 + free(protocolLists); + // 将保存 协议的数组动态添加到 关联对象 + objc_setAssociatedObject(self, ba_protocolListKey, arrayM, OBJC_ASSOCIATION_COPY_NONATOMIC); + + return objc_getAssociatedObject(self, ba_protocolListKey); +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.h" new file mode 100644 index 0000000..a375a52 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.h" @@ -0,0 +1,26 @@ +// +// NSShadow+BAKit.h +// test +// +// Created by boai on 2016/10/12. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import + +@interface NSShadow (BAKit) + +/*! + * 设置阴影 + * + * @param shadowColor 阴影颜色 + * @param shadowSize 阴影范围 + * @param shadowBlurRadius 阴影模糊度 + * + * @return 阴影效果 + */ +- (void)ba_shadowWithColor:(UIColor *)shadowColor + shadowOffset:(CGSize)shadowSize + shadowBlurRadius:(CGFloat)shadowBlurRadius; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.m" new file mode 100644 index 0000000..95265f9 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSShadow+BAKit.m" @@ -0,0 +1,22 @@ +// +// NSShadow+BAKit.m +// test +// +// Created by boai on 2016/10/12. +// Copyright © 2016年 博爱. All rights reserved. +// + +#import "NSShadow+BAKit.h" + +@implementation NSShadow (BAKit) + +- (void)ba_shadowWithColor:(UIColor *)shadowColor + shadowOffset:(CGSize)shadowSize + shadowBlurRadius:(CGFloat)shadowBlurRadius +{ + self.shadowColor = shadowColor; + self.shadowOffset = shadowSize; + self.shadowBlurRadius = shadowBlurRadius; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/BAKit_NSString.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/BAKit_NSString.h" new file mode 100644 index 0000000..1808f29 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/BAKit_NSString.h" @@ -0,0 +1,28 @@ +// +// BAKit_NSString.h +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#ifndef BAKit_NSString_h +#define BAKit_NSString_h + + +#import "NSMutableAttributedString+BAKit.h" +#import "NSString+BAColor.h" +#import "NSString+BAKit.h" +#import "NSString+BANSNumber.h" +#import "NSString+BARegular.h" +#import "NSString+BATime.h" +#import "NSString+BATrims.h" +#import "NSString+BASize.h" +#import "NSString+BARange.h" +#import "NSString+BAUIButton.h" +#import "NSString+BATransform.h" +#import "NSString+BAEncrypt.h" +#import "NSString+BAEmoji.h" + + +#endif /* BAKit_NSString_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.h" new file mode 100644 index 0000000..0350e11 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.h" @@ -0,0 +1,145 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import +#import + +@interface NSMutableAttributedString (BAKit) +#pragma mark - ***** 富文本处理 类 + +/*! 完全自定义样式 */ +- (void)ba_changeAttributeDict:(NSDictionary *)dict range:(NSRange)range; + +/*! 改变某位置的颜色 */ +- (void)ba_changeColor:(UIColor *)color range:(NSRange)range; + +/*! 设置字体所在区域背景颜色,取值为 UIColor对象,默认值为nil, 透明色 */ +- (void)ba_changeBackgroundColor:(UIColor *)color range:(NSRange)range; + +///*! 设置连体属性,取值为NSNumber 对象(整数),0 表示没有连体字符,1 表示使用默认的连体字符, // 2 表示使用所有连体符号,默认值为 1(iOS 不支持 2) */ +//- (void)ba_changeLigatureWithValue:(int)value range:(NSRange)range; + +/*! 改变某位置的普通字号 */ +- (void)ba_changeSystemFont:(UIFont *)font range:(NSRange)range; + +/*! 设置字形倾斜度,取值为 NSNumber(float),正值右倾,负值左倾 */ +- (void)ba_changeObliquenessValue:(NSNumber *)value range:(NSRange)range; + +/*! 设置文字排版方向,取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本 */ +- (void)ba_changeVerticalGlyphFormValue:(NSNumber *)value range:(NSRange)range; + +/*! 设置文字书写方向,从左向右书写或者从右向左书写 */ +- (void)ba_changeWritingDirectionStyle:(NSWritingDirection)style; + +/*! 改变某位置的行距 */ +- (void)ba_changeLineSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length; + +/*! 改变某位置的段落距离 */ +- (void)ba_changeParagraphSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length; + +/*! 改变段的顶部和文本内容的开头之间的距离 */ +- (void)ba_changeBeforeLparagraphSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length; + +/*! 设置下划线样式:根据枚举选择 */ +- (void)ba_changeUnderlineStyle:(NSUnderlineStyle)style color:(UIColor *)color Range:(NSRange)range; +/*! 全部加下划线 设置下划线样式:根据枚举选择 */ +- (void)ba_changeUnderlineAtAllStyle:(NSUnderlineStyle)style color:(UIColor *)color; + +/*! 设置删除线样式:根据枚举选择 */ +- (void)ba_changeStrikethroughStyle:(NSUnderlineStyle)style color:(UIColor *)color Range:(NSRange)range; +/*! 全部添加删除线 设置删除线样式:根据枚举选择 */ +- (void)ba_changeStrikethroughAtAllStyle:(NSUnderlineStyle)style color:(UIColor *)color; + +/*! 设定字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄 */ +- (void)ba_changeKernWithValue:(NSNumber *)value Range:(NSRange)range; + +/*! 根据位置设置文本横向拉伸属性,取值为 NSNumber (float),正值横向拉伸文本,负值横向压缩文本 */ +- (void)ba_changeExpansionWithValue:(NSNumber *)value Range:(NSRange)range; +#pragma mark + +/*! 根据位置添加阴影效果 */ +- (void)ba_changeShadowWithShadow:(NSShadow *)shadow Range:(NSRange)range; + +/*! 根据位置修改描边颜色 */ +- (void)ba_changeStrokeColorWithColor:(UIColor *)strokeColor + strokeWidth:(NSNumber *)strokeWidth + Range:(NSRange)range; + +/*! + * + * 实例化 NSMutableAttributedString 字符串 + * + * @param texts 用于存储所需设置字符串的数组(根据所需自定义类型分组) + * @param attrsArray 富文本属性样式的集合(数组元素是texts的相应文本的属性--字典) + * @param space texts文本之间的间距数组 1 代表一个空格的距离 + * + * @return NSMutableAttributedString实例 + */ +- (instancetype)initWithStrings:(NSArray *)texts + attributesArray:(NSArray *>*)attrsArray + space:(NSArray *)space; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.m" new file mode 100644 index 0000000..9303a54 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSMutableAttributedString+BAKit.m" @@ -0,0 +1,209 @@ +// +// NSMutableAttributedString+BAKit.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "NSMutableAttributedString+BAKit.h" + +@implementation NSMutableAttributedString (BAKit) + +#pragma mark 完全自定义样式 +- (void)ba_changeAttributeDict:(NSDictionary *)dict range:(NSRange)range +{ + [self addAttributes:dict range:range]; +} + +#pragma mark 设置字体颜色,取值为 UIColor,默认为黑色 +- (void)ba_changeColor:(UIColor *)color range:(NSRange)range +{ + [self addAttribute:NSForegroundColorAttributeName value:color range:range]; +} + +#pragma mark 设置字体所在区域背景颜色,取值为 UIColor对象,默认值为nil, 透明色 +#warning NSForegroundColorAttributeName 和 NSBackgroundColorAttributeName 的低位是相等的,跟前面介绍的 textColor 一样,哪个属性最后一次赋值,就会冲掉前面的效果 +- (void)ba_changeBackgroundColor:(UIColor *)color range:(NSRange)range +{ + [self addAttribute:NSBackgroundColorAttributeName value:color range:range]; +} + +//#pragma mark 设置连体属性,取值为NSNumber 对象(整数),0 表示没有连体字符,1 表示使用默认的连体字符, // 2 表示使用所有连体符号,默认值为 1(iOS 不支持 2) +//- (void)ba_changeLigatureWithValue:(int)value range:(NSRange)range +//{ +// [self addAttribute:NSLigatureAttributeName value:[NSNumber numberWithInt: value] range:range]; +// // return range; +//} + +#pragma mark 改变某位置 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12 +- (void)ba_changeSystemFont:(UIFont *)font range:(NSRange)range +{ + [self addAttribute:NSFontAttributeName value:font range:range]; +} + +#pragma mark 设置字形倾斜度,取值为 NSNumber(float),正值右倾,负值左倾 +- (void)ba_changeObliquenessValue:(NSNumber *)value range:(NSRange)range +{ + [self addAttribute:NSObliquenessAttributeName value:value range:range]; +} + +#pragma mark NSVerticalGlyphFormAttributeName 设置文字排版方向,取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本 在 iOS 中,总是使用横排文本,0 以外的值都未定义 +- (void)ba_changeVerticalGlyphFormValue:(NSNumber *)value range:(NSRange)range +{ + [self addAttribute:NSVerticalGlyphFormAttributeName value:value range:range]; +} + +#pragma mark NSWritingDirectionAttributeName 设置文字书写方向,从左向右书写或者从右向左书写 +- (void)ba_changeWritingDirectionStyle:(NSWritingDirection)style +{ + [self addAttribute:NSWritingDirectionAttributeName value:@[@(NSWritingDirectionRightToLeft)] range:NSMakeRange(0, self.length)]; +} + +#pragma mark 改变某位置的行距 +- (void)ba_changeLineSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length +{ + NSRange range = NSMakeRange(loc, length); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + /*! 行距 */ + style.lineSpacing = spacing; + [self addAttribute:NSParagraphStyleAttributeName value:style range:range]; +} + +/*! 改变某位置的段落距离 */ +- (void)ba_changeParagraphSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length +{ + NSRange range = NSMakeRange(loc, length); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + /*! 段落距离 */ + style.paragraphSpacing = spacing; + [self addAttribute:NSParagraphStyleAttributeName value:style range:range]; +} + +#pragma mark 改变段落的顶部和文本内容的开头之间的距离 +- (void)ba_changeBeforeLparagraphSpacing:(CGFloat)spacing + from:(NSInteger)loc + length:(NSInteger)length +{ + NSRange range = NSMakeRange(loc, length); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + /*! 段落的顶部和文本内容的开头之间的距离 */ + style.paragraphSpacingBefore = spacing; + [self addAttribute:NSParagraphStyleAttributeName value:style range:range]; +} + +#pragma mark 设置下划线样式:根据枚举选择 +- (void)ba_changeUnderlineStyle:(NSUnderlineStyle)style color:(UIColor *)color Range:(NSRange)range +{ + [self addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:style] range:range]; + [self addAttribute:NSUnderlineColorAttributeName value:color range:range]; +} + +#pragma mark 全部加下划线 设置下划线样式:根据枚举选择 +- (void)ba_changeUnderlineAtAllStyle:(NSUnderlineStyle)style color:(UIColor *)color +{ + NSRange range = NSMakeRange(0, self.length); + [self ba_changeUnderlineStyle:style color:color Range:range]; +} + +#pragma mark 设置删除线样式:根据枚举选择 +- (void)ba_changeStrikethroughStyle:(NSUnderlineStyle)style color:(UIColor *)color Range:(NSRange)range +{ + [self addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:style] range:range]; + [self addAttribute:NSStrikethroughColorAttributeName value:color range:range]; +} + +#pragma mark 全部添加删除线 设置删除线样式:根据枚举选择 +- (void)ba_changeStrikethroughAtAllStyle:(NSUnderlineStyle)style color:(UIColor *)color +{ + NSRange range = NSMakeRange(0, self.length); + [self ba_changeStrikethroughStyle:style color:color Range:range]; +} + +#pragma mark 设定字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄 +- (void)ba_changeKernWithValue:(NSNumber *)value Range:(NSRange)range +{ + [self addAttribute:NSKernAttributeName value:value range:range]; +} + +#pragma mark 根据位置设置文本横向拉伸属性,取值为 NSNumber (float),正值横向拉伸文本,负值横向压缩文本 +- (void)ba_changeExpansionWithValue:(NSNumber *)value Range:(NSRange)range +{ + [self addAttribute:NSExpansionAttributeName value:value range:range]; +} + +#pragma mark 根据位置添加阴影效果 +- (void)ba_changeShadowWithShadow:(NSShadow *)shadow Range:(NSRange)range +{ + [self addAttribute:NSShadowAttributeName value:shadow range:range]; + /*! 排版 */ + [self addAttribute:NSVerticalGlyphFormAttributeName value:@(0) range:range]; +} + +#pragma mark 根据位置修改描边颜色 垂直标志符号形式 +- (void)ba_changeStrokeColorWithColor:(UIColor *)strokeColor + strokeWidth:(NSNumber *)strokeWidth + Range:(NSRange)range +{ + [self addAttribute:NSStrokeColorAttributeName value:strokeColor range:range]; + [self addAttribute:NSStrokeWidthAttributeName value:strokeWidth range:range]; +} + +- (instancetype)initWithStrings:(NSArray *)texts + attributesArray:(NSArray *>*)attrsArray + space:(NSArray *)space +{ + if (self = [super init]) + { + + } + return [self go:texts andAttributesArray:attrsArray space:space]; +} + +- (instancetype)go:(NSArray *)textArray andAttributesArray:(NSArray *)attrsArray space:(NSArray *)space +{ + __block NSMutableAttributedString *string = [[NSMutableAttributedString alloc]init]; + + __weak typeof(self)weakSelf = self; + [textArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + __strong typeof(weakSelf) strongSelf = weakSelf; + NSUInteger attrsCount = attrsArray.count; + if (idx <= (attrsCount-1) ) + { + [string appendAttributedString:[strongSelf initWithString:obj attributes:attrsArray[idx]]]; + } + else + { + [string appendAttributedString:[strongSelf initWithString:obj attributes:attrsArray[attrsCount-1]]]; + } + + if (idx != textArray.count-1 && idx <= space.count-1) + { + [string appendAttributedString:[self spaceWidthWithNumberBlackSpace:space[idx]]]; + } + else + { + [string appendAttributedString:[self spaceWidthWithNumberBlackSpace:0]]; + } + }]; + + return string; +} + +- (NSMutableAttributedString *)spaceWidthWithNumberBlackSpace:(NSNumber *)number +{ + NSString *string = @""; + NSUInteger count = [number integerValue]; + for (NSUInteger i = 0;i < count ; i++) + { + string = [string stringByAppendingFormat:@" "]; + } + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:string]; + return attributedString; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.h" new file mode 100644 index 0000000..f54ac76 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.h" @@ -0,0 +1,72 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BAColor) + +/*! + * 获取十六进制的随机颜色 + * + * @return 十六进制的随机颜色 + */ ++ (NSString *)ba_stringRandomColor; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.m" new file mode 100644 index 0000000..39f351c --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAColor.m" @@ -0,0 +1,36 @@ +// +// NSString+BAColor.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BAColor.h" + +@implementation NSString (BAColor) + +#pragma mark - 随机颜色(十六进制) +/*! + * 获取十六进制的随机颜色 + * + * @return 十六进制的随机颜色 + */ ++ (NSString *)ba_stringRandomColor +{ + NSString *colorString = @""; + NSArray *colorArray = @[@"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"8", @"9",@"a", @"b", @"c", @"d", @"e", @"f"]; + + for (NSInteger i= 0; i < 6; i++) + { + int r = arc4random()%colorArray.count; + NSString *string = colorArray[r]; + colorString = [NSString stringWithFormat:@"%@%@", colorString, string]; +// NSLog(@"随机颜色为3:%@", colorString); + } +// NSLog(@"随机颜色为:%@", colorString); + return colorString; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.h" new file mode 100644 index 0000000..3ffe4db --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.h" @@ -0,0 +1,27 @@ +// +// NSString+BAEmoji.h +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import + +@interface NSString (BAEmoji) + +/** + 将文字转换成表情字符 + + @return 表情字符 + */ +- (NSString *)ba_stringReplaceEmojiTextWithUnicode; + +/** + 将表情字符转换成文字 + + @return 文字 + */ +- (NSString *)ba_stringReplaceEmojiUnicodeWithText; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.m" new file mode 100644 index 0000000..2dc8fe5 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEmoji.m" @@ -0,0 +1,1723 @@ +// +// NSString+BAEmoji.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "NSString+BAEmoji.h" + +@implementation NSString (BAEmoji) + +/** + 将文字转换成表情字符 + + @return 表情字符 + */ +- (NSString *)ba_stringReplaceEmojiTextWithUnicode +{ + NSDictionary *emojis = @{ + @"[哈哈]": @"😄", + @"[laughing]": @"😆", + @"[blush]": @"😊", + @"[微笑]": @"😃", + @"[relaxed]": @"☺", + @"[假笑]": @"😏", + @"[heart_eyes]": @"😍", + @"[kissing_heart]": @"😘", + @"[亲吻]": @"😚", + @"[脸红]": @"😳", + @"[relieved]": @"😥", + @"[满足]": @"😌", + @"[grin]": @"😁", + @"[wink]": @"😉", + @"[wink2]": @"😜", + @"[stuck_out_tongue_winking_eye]": @"😜", + @"[stuck_out_tongue_closed_eyes]": @"😝", + @"[grinning]": @"😀", + @"[kissing]": @"😗", + @"[kissing_smiling_eyes]": @"😙", + @"[stuck_out_tongue]": @"😛", + @"[sleeping]": @"😴", + @"[worried]": @"😟", + @"[frowning]": @"😦", + @"[anguished]": @"😧", + @"[open_mouth]": @"😮", + @"[grimacing]": @"😬", + @"[confused]": @"😕", + @"[hushed]": @"😯", + @"[expressionless]": @"😑", + @"[鄙视]": @"😒", + @"[sweat_smile]": @"😅", + @"[冷汗]": @"😓", + @"[weary]": @"😩", + @"[pensive]": @"😔", + @"[失望]": @"😞", + @"[confounded]": @"😖", + @"[害怕]": @"😨", + @"[糟糕]": @"😰", + @"[persevere]": @"😣", + @"[悲伤]": @"😢", + @"[大哭]": @"😭", + @"[joy]": @"😂", + @"[astonished]": @"😲", + @"[恐怖]": @"😱", + @"[tired_face]": @"😫", + @"[angry]": @"😠", + @"[愤怒]": @"😡", + @"[triumph]": @"😤", + @"[sleepy]": @"😪", + @"[yum]": @"😋", + @"[mask]": @"😷", + @"[sunglasses]": @"😎", + @"[dizzy_face]": @"😵", + @"[imp]": @"👿", + @"[smiling_imp]": @"😈", + @"[neutral_face]": @"😐", + @"[no_mouth]": @"😶", + @"[innocent]": @"😇", + @"[alien]": @"👽", + @"[黄心]": @"💛", + @"[blue_heart]": @"💙", + @"[purple_heart]": @"💜", + @"[心]": @"❤", + @"[green_heart]": @"💚", + @"[心碎]": @"💔", + @"[heartbeat]": @"💓", + @"[heartpulse]": @"💗", + @"[two_hearts]": @"💕", + @"[revolving_hearts]": @"💞", + @"[cupid]": @"💘", + @"[sparkling_heart]": @"💖", + @"[星星]": @"✨", + @"[star]": @"⭐", + @"[star2]": @"🌟", + @"[dizzy]": @"💫", + @"[boom]": @"💥", + @"[collision]": @"💥", + @"[anger]": @"💢", + @"[exclamation]": @"❗", + @"[question]": @"❓", + @"[grey_exclamation]": @"❕", + @"[grey_question]": @"❔", + @"[zzz]": @"💤", + @"[dash]": @"💨", + @"[sweat_drops]": @"💦", + @"[notes]": @"🎶", + @"[musical_note]": @"🎵", + @"[火焰]": @"🔥", + @"[hankey]": @"💩", + @"[poop]": @"💩", + @"[shit]": @"💩", + @"[点赞]": @"👍", + @"[+1]": @"👍", + @"[thumbsdown]": @"👎", + @"[-1]": @"👎", + @"[ok_hand]": @"👌", + @"[punch]": @"👊", + @"[facepunch]": @"👊", + @"[fist]": @"✊", + @"[v]": @"✌", + @"[挥手]": @"👋", + @"[hand]": @"✋", + @"[open_hands]": @"👐", + @"[point_up]": @"☝", + @"[下面]": @"👇", + @"[左边]": @"👈", + @"[右边]": @"👉", + @"[raised_hands]": @"🙌", + @"[pray]": @"🙏", + @"[上面]": @"👆", + @"[clap]": @"👏", + @"[强壮]": @"💪", + @"[walking]": @"🚶", + @"[runner]": @"🏃", + @"[running]": @"🏃", + @"[couple]": @"👫", + @"[family]": @"👪", + @"[two_men_holding_hands]": @"👬", + @"[two_women_holding_hands]": @"👭", + @"[dancer]": @"💃", + @"[dancers]": @"👯", + @"[ok_woman]": @"🙆", + @"[no_good]": @"🙅", + @"[information_desk_person]": @"💁", + @"[raised_hand]": @"🙋", + @"[bride_with_veil]": @"👰", + @"[person_with_pouting_face]": @"🙎", + @"[person_frowning]": @"🙍", + @"[bow]": @"🙇", + @"[couplekiss]": @"💏", + @"[couple_with_heart]": @"💑", + @"[massage]": @"💆", + @"[haircut]": @"💇", + @"[nail_care]": @"💅", + @"[boy]": @"👦", + @"[girl]": @"👧", + @"[woman]": @"👩", + @"[man]": @"👨", + @"[baby]": @"👶", + @"[older_woman]": @"👵", + @"[older_man]": @"👴", + @"[person_with_blond_hair]": @"👱", + @"[man_with_gua_pi_mao]": @"👲", + @"[man_with_turban]": @"👳", + @"[construction_worker]": @"👷", + @"[cop]": @"👮", + @"[angel]": @"👼", + @"[princess]": @"👸", + @"[smiley_cat]": @"😺", + @"[smile_cat]": @"😸", + @"[heart_eyes_cat]": @"😻", + @"[kissing_cat]": @"😽", + @"[smirk_cat]": @"😼", + @"[scream_cat]": @"🙀", + @"[crying_cat_face]": @"😿", + @"[joy_cat]": @"😹", + @"[pouting_cat]": @"😾", + @"[japanese_ogre]": @"👹", + @"[japanese_goblin]": @"👺", + @"[see_no_evil]": @"🙈", + @"[hear_no_evil]": @"🙉", + @"[speak_no_evil]": @"🙊", + @"[guardsman]": @"💂", + @"[skull]": @"💀", + @"[feet]": @"👣", + @"[lips]": @"👄", + @"[红唇]": @"💋", + @"[droplet]": @"💧", + @"[ear]": @"👂", + @"[eyes]": @"👀", + @"[nose]": @"👃", + @"[tongue]": @"👅", + @"[love_letter]": @"💌", + @"[bust_in_silhouette]": @"👤", + @"[busts_in_silhouette]": @"👥", + @"[speech_balloon]": @"💬", + @"[thought_balloon]": @"💭", + @"[sunny]": @"☀", + @"[umbrella]": @"☔", + @"[cloud]": @"☁", + @"[snowflake]": @"❄", + @"[snowman]": @"⛄", + @"[zap]": @"⚡", + @"[cyclone]": @"🌀", + @"[foggy]": @"🌁", + @"[ocean]": @"🌊", + @"[猫]": @"🐱", + @"[小狗]": @"🐶", + @"[老鼠]": @"🐭", + @"[仓鼠]": @"🐹", + @"[兔子]": @"🐰", + @"[狼]": @"🐺", + @"[青蛙]": @"🐸", + @"[老虎]": @"🐯", + @"[树袋熊]": @"🐨", + @"[熊]": @"🐻", + @"[猪头]": @"🐷", + @"[pig_nose]": @"🐽", + @"[cow]": @"🐮", + @"[boar]": @"🐗", + @"[猴子]": @"🐵", + @"[猴]": @"🐒", + @"[马]": @"🐴", + @"[racehorse]": @"🐎", + @"[骆驼]": @"🐫", + @"[sheep]": @"🐑", + @"[elephant]": @"🐘", + @"[panda_face]": @"🐼", + @"[snake]": @"🐍", + @"[bird]": @"🐦", + @"[baby_chick]": @"🐤", + @"[hatched_chick]": @"🐥", + @"[hatching_chick]": @"🐣", + @"[chicken]": @"🐔", + @"[penguin]": @"🐧", + @"[turtle]": @"🐢", + @"[bug]": @"🐛", + @"[honeybee]": @"🐝", + @"[ant]": @"🐜", + @"[beetle]": @"🐞", + @"[snail]": @"🐌", + @"[octopus]": @"🐙", + @"[tropical_fish]": @"🐠", + @"[fish]": @"🐟", + @"[whale]": @"🐳", + @"[whale2]": @"🐋", + @"[dolphin]": @"🐬", + @"[cow2]": @"🐄", + @"[ram]": @"🐏", + @"[rat]": @"🐀", + @"[water_buffalo]": @"🐃", + @"[tiger2]": @"🐅", + @"[rabbit2]": @"🐇", + @"[dragon]": @"🐉", + @"[goat]": @"🐐", + @"[rooster]": @"🐓", + @"[dog2]": @"🐕", + @"[pig2]": @"🐖", + @"[mouse2]": @"🐁", + @"[ox]": @"🐂", + @"[dragon_face]": @"🐲", + @"[blowfish]": @"🐡", + @"[crocodile]": @"🐊", + @"[dromedary_camel]": @"🐪", + @"[leopard]": @"🐆", + @"[cat2]": @"🐈", + @"[poodle]": @"🐩", + @"[paw_prints]": @"🐾", + @"[bouquet]": @"💐", + @"[cherry_blossom]": @"🌸", + @"[tulip]": @"🌷", + @"[four_leaf_clover]": @"🍀", + @"[rose]": @"🌹", + @"[sunflower]": @"🌻", + @"[hibiscus]": @"🌺", + @"[maple_leaf]": @"🍁", + @"[leaves]": @"🍃", + @"[fallen_leaf]": @"🍂", + @"[herb]": @"🌿", + @"[mushroom]": @"🍄", + @"[cactus]": @"🌵", + @"[palm_tree]": @"🌴", + @"[evergreen_tree]": @"🌲", + @"[deciduous_tree]": @"🌳", + @"[chestnut]": @"🌰", + @"[seedling]": @"🌱", + @"[blossum]": @"🌼", + @"[ear_of_rice]": @"🌾", + @"[shell]": @"🐚", + @"[globe_with_meridians]": @"🌐", + @"[sun_with_face]": @"🌞", + @"[full_moon_with_face]": @"🌝", + @"[new_moon_with_face]": @"🌚", + @"[new_moon]": @"🌑", + @"[waxing_crescent_moon]": @"🌒", + @"[first_quarter_moon]": @"🌓", + @"[waxing_gibbous_moon]": @"🌔", + @"[full_moon]": @"🌕", + @"[waning_gibbous_moon]": @"🌖", + @"[last_quarter_moon]": @"🌗", + @"[waning_crescent_moon]": @"🌘", + @"[last_quarter_moon_with_face]": @"🌜", + @"[first_quarter_moon_with_face]": @"🌛", + @"[moon]": @"🌙", + @"[earth_africa]": @"🌍", + @"[earth_americas]": @"🌎", + @"[earth_asia]": @"🌏", + @"[volcano]": @"🌋", + @"[milky_way]": @"🌌", + @"[partly_sunny]": @"⛅", + @"[bamboo]": @"🎍", + @"[gift_heart]": @"💝", + @"[dolls]": @"🎎", + @"[school_satchel]": @"🎒", + @"[mortar_board]": @"🎓", + @"[flags]": @"🎏", + @"[fireworks]": @"🎆", + @"[sparkler]": @"🎇", + @"[wind_chime]": @"🎐", + @"[rice_scene]": @"🎑", + @"[jack_o_lantern]": @"🎃", + @"[ghost]": @"👻", + @"[santa]": @"🎅", + @"[8ball]": @"🎱", + @"[alarm_clock]": @"⏰", + @"[苹果]": @"🍎", + @"[art]": @"🎨", + @"[baby_bottle]": @"🍼", + @"[balloon]": @"🎈", + @"[banana]": @"🍌", + @"[bar_chart]": @"📊", + @"[baseball]": @"⚾", + @"[basketball]": @"🏀", + @"[bath]": @"🛀", + @"[bathtub]": @"🛁", + @"[battery]": @"🔋", + @"[beer]": @"🍺", + @"[beers]": @"🍻", + @"[bell]": @"🔔", + @"[bento]": @"🍱", + @"[bicyclist]": @"🚴", + @"[bikini]": @"👙", + @"[birthday]": @"🎂", + @"[black_joker]": @"🃏", + @"[black_nib]": @"✒", + @"[blue_book]": @"📘", + @"[bomb]": @"💣", + @"[bookmark]": @"🔖", + @"[bookmark_tabs]": @"📑", + @"[books]": @"📚", + @"[boot]": @"👢", + @"[bowling]": @"🎳", + @"[bread]": @"🍞", + @"[briefcase]": @"💼", + @"[bulb]": @"💡", + @"[cake]": @"🍰", + @"[calendar]": @"📆", + @"[calling]": @"📲", + @"[camera]": @"📷", + @"[candy]": @"🍬", + @"[card_index]": @"📇", + @"[cd]": @"💿", + @"[chart_with_downwards_trend]": @"📉", + @"[chart_with_upwards_trend]": @"📈", + @"[cherries]": @"🍒", + @"[chocolate_bar]": @"🍫", + @"[christmas_tree]": @"🎄", + @"[clapper]": @"🎬", + @"[clipboard]": @"📋", + @"[closed_book]": @"📕", + @"[closed_lock_with_key]": @"🔐", + @"[closed_umbrella]": @"🌂", + @"[clubs]": @"♣", + @"[cocktail]": @"🍸", + @"[coffee]": @"☕", + @"[computer]": @"💻", + @"[confetti_ball]": @"🎊", + @"[cookie]": @"🍪", + @"[corn]": @"🌽", + @"[credit_card]": @"💳", + @"[crown]": @"👑", + @"[crystal_ball]": @"🔮", + @"[curry]": @"🍛", + @"[custard]": @"🍮", + @"[dango]": @"🍡", + @"[dart]": @"🎯", + @"[date]": @"📅", + @"[diamonds]": @"♦", + @"[dollar]": @"💵", + @"[door]": @"🚪", + @"[doughnut]": @"🍩", + @"[dress]": @"👗", + @"[dvd]": @"📀", + @"[e-mail]": @"📧", + @"[egg]": @"🍳", + @"[eggplant]": @"🍆", + @"[electric_plug]": @"🔌", + @"[email]": @"✉", + @"[envelope]": @"✉", + @"[euro]": @"💶", + @"[eyeglasses]": @"👓", + @"[fax]": @"📠", + @"[file_folder]": @"📁", + @"[fish_cake]": @"🍥", + @"[fishing_pole_and_fish]": @"🎣", + @"[flashlight]": @"🔦", + @"[软盘]": @"💾", + @"[flower_playing_cards]": @"🎴", + @"[football]": @"🏈", + @"[fork_and_knife]": @"🍴", + @"[fried_shrimp]": @"🍤", + @"[fries]": @"🍟", + @"[game_die]": @"🎲", + @"[gem]": @"💎", + @"[gift]": @"🎁", + @"[golf]": @"⛳", + @"[grapes]": @"🍇", + @"[green_apple]": @"🍏", + @"[green_book]": @"📗", + @"[guitar]": @"🎸", + @"[gun]": @"🔫", + @"[hamburger]": @"🍔", + @"[hammer]": @"🔨", + @"[handbag]": @"👜", + @"[headphones]": @"🎧", + @"[hearts]": @"♥", + @"[high_brightness]": @"🔆", + @"[high_heel]": @"👠", + @"[hocho]": @"🔪", + @"[honey_pot]": @"🍯", + @"[horse_racing]": @"🏇", + @"[hourglass]": @"⌛", + @"[hourglass_flowing_sand]": @"⏳", + @"[ice_cream]": @"🍨", + @"[icecream]": @"🍦", + @"[inbox_tray]": @"📥", + @"[incoming_envelope]": @"📨", + @"[iphone]": @"📱", + @"[jeans]": @"👖", + @"[key]": @"🔑", + @"[kimono]": @"👘", + @"[ledger]": @"📒", + @"[lemon]": @"🍋", + @"[lipstick]": @"💄", + @"[lock]": @"🔒", + @"[lock_with_ink_pen]": @"🔏", + @"[lollipop]": @"🍭", + @"[loop]": @"➿", + @"[loudspeaker]": @"📢", + @"[low_brightness]": @"🔅", + @"[mag]": @"🔍", + @"[mag_right]": @"🔎", + @"[mahjong]": @"🀄", + @"[mailbox]": @"📫", + @"[mailbox_closed]": @"📪", + @"[mailbox_with_mail]": @"📬", + @"[mailbox_with_no_mail]": @"📭", + @"[mans_shoe]": @"👞", + @"[shoe]": @"👞", + @"[meat_on_bone]": @"🍖", + @"[mega]": @"📣", + @"[melon]": @"🍈", + @"[memo]": @"📝", + @"[pencil]": @"📝", + @"[microphone]": @"🎤", + @"[microscope]": @"🔬", + @"[minidisc]": @"💽", + @"[money_with_wings]": @"💸", + @"[moneybag]": @"💰", + @"[mountain_bicyclist]": @"🚵", + @"[movie_camera]": @"🎥", + @"[musical_keyboard]": @"🎹", + @"[musical_score]": @"🎼", + @"[mute]": @"🔇", + @"[name_badge]": @"📛", + @"[necktie]": @"👔", + @"[newspaper]": @"📰", + @"[no_bell]": @"🔕", + @"[notebook]": @"📓", + @"[notebook_with_decorative_cover]": @"📔", + @"[nut_and_bolt]": @"🔩", + @"[oden]": @"🍢", + @"[open_file_folder]": @"📂", + @"[orange_book]": @"📙", + @"[outbox_tray]": @"📤", + @"[page_facing_up]": @"📄", + @"[page_with_curl]": @"📃", + @"[pager]": @"📟", + @"[paperclip]": @"📎", + @"[peach]": @"🍑", + @"[pear]": @"🍐", + @"[pencil2]": @"✏", + @"[phone]": @"☎", + @"[telephone]": @"☎", + @"[pill]": @"💊", + @"[pineapple]": @"🍍", + @"[pizza]": @"🍕", + @"[postal_horn]": @"📯", + @"[postbox]": @"📮", + @"[pouch]": @"👝", + @"[poultry_leg]": @"🍗", + @"[pound]": @"💷", + @"[purse]": @"👛", + @"[pushpin]": @"📌", + @"[radio]": @"📻", + @"[ramen]": @"🍜", + @"[ribbon]": @"🎀", + @"[rice]": @"🍚", + @"[rice_ball]": @"🍙", + @"[rice_cracker]": @"🍘", + @"[ring]": @"💍", + @"[rugby_football]": @"🏉", + @"[running_shirt_with_sash]": @"🎽", + @"[sake]": @"🍶", + @"[sandal]": @"👡", + @"[satellite]": @"📡", + @"[saxophone]": @"🎷", + @"[scissors]": @"✂", + @"[scroll]": @"📜", + @"[seat]": @"💺", + @"[shaved_ice]": @"🍧", + @"[shirt]": @"👕", + @"[tshirt]": @"👕", + @"[shower]": @"🚿", + @"[ski]": @"🎿", + @"[smoking]": @"🚬", + @"[snowboarder]": @"🏂", + @"[soccer]": @"⚽", + @"[sound]": @"🔉", + @"[space_invader]": @"👾", + @"[spades]": @"♠", + @"[spaghetti]": @"🍝", + @"[speaker]": @"🔊", + @"[stew]": @"🍲", + @"[straight_ruler]": @"📏", + @"[strawberry]": @"🍓", + @"[surfer]": @"🏄", + @"[sushi]": @"🍣", + @"[sweet_potato]": @"🍠", + @"[swimmer]": @"🏊", + @"[syringe]": @"💉", + @"[tada]": @"🎉", + @"[tanabata_tree]": @"🎋", + @"[tangerine]": @"🍊", + @"[tea]": @"🍵", + @"[telephone_receiver]": @"📞", + @"[telescope]": @"🔭", + @"[tennis]": @"🎾", + @"[toilet]": @"🚽", + @"[tomato]": @"🍅", + @"[tophat]": @"🎩", + @"[triangular_ruler]": @"📐", + @"[trophy]": @"🏆", + @"[tropical_drink]": @"🍹", + @"[trumpet]": @"🎺", + @"[tv]": @"📺", + @"[unlock]": @"🔓", + @"[vhs]": @"📼", + @"[video_camera]": @"📹", + @"[video_game]": @"🎮", + @"[violin]": @"🎻", + @"[watch]": @"⌚", + @"[watermelon]": @"🍉", + @"[wine_glass]": @"🍷", + @"[womans_clothes]": @"👚", + @"[womans_hat]": @"👒", + @"[wrench]": @"🔧", + @"[yen]": @"💴", + @"[aerial_tramway]": @"🚡", + @"[airplane]": @"✈", + @"[ambulance]": @"🚑", + @"[anchor]": @"⚓", + @"[articulated_lorry]": @"🚛", + @"[atm]": @"🏧", + @"[bank]": @"🏦", + @"[barber]": @"💈", + @"[beginner]": @"🔰", + @"[bike]": @"🚲", + @"[blue_car]": @"🚙", + @"[boat]": @"⛵", + @"[sailboat]": @"⛵", + @"[bridge_at_night]": @"🌉", + @"[bullettrain_front]": @"🚅", + @"[bullettrain_side]": @"🚄", + @"[bus]": @"🚌", + @"[busstop]": @"🚏", + @"[car]": @"🚗", + @"[red_car]": @"🚗", + @"[carousel_horse]": @"🎠", + @"[checkered_flag]": @"🏁", + @"[church]": @"⛪", + @"[circus_tent]": @"🎪", + @"[city_sunrise]": @"🌇", + @"[city_sunset]": @"🌆", + @"[construction]": @"🚧", + @"[convenience_store]": @"🏪", + @"[crossed_flags]": @"🎌", + @"[department_store]": @"🏬", + @"[european_castle]": @"🏰", + @"[european_post_office]": @"🏤", + @"[factory]": @"🏭", + @"[ferris_wheel]": @"🎡", + @"[fire_engine]": @"🚒", + @"[fountain]": @"⛲", + @"[fuelpump]": @"⛽", + @"[helicopter]": @"🚁", + @"[hospital]": @"🏥", + @"[hotel]": @"🏨", + @"[hotsprings]": @"♨", + @"[house]": @"🏠", + @"[house_with_garden]": @"🏡", + @"[japan]": @"🗾", + @"[japanese_castle]": @"🏯", + @"[light_rail]": @"🚈", + @"[love_hotel]": @"🏩", + @"[minibus]": @"🚐", + @"[monorail]": @"🚝", + @"[mount_fuji]": @"🗻", + @"[mountain_cableway]": @"🚠", + @"[mountain_railway]": @"🚞", + @"[moyai]": @"🗿", + @"[office]": @"🏢", + @"[oncoming_automobile]": @"🚘", + @"[oncoming_bus]": @"🚍", + @"[oncoming_police_car]": @"🚔", + @"[oncoming_taxi]": @"🚖", + @"[performing_arts]": @"🎭", + @"[police_car]": @"🚓", + @"[post_office]": @"🏣", + @"[railway_car]": @"🚃", + @"[train]": @"🚃", + @"[rainbow]": @"🌈", + @"[rocket]": @"🚀", + @"[roller_coaster]": @"🎢", + @"[rotating_light]": @"🚨", + @"[round_pushpin]": @"📍", + @"[rowboat]": @"🚣", + @"[school]": @"🏫", + @"[ship]": @"🚢", + @"[slot_machine]": @"🎰", + @"[speedboat]": @"🚤", + @"[stars]": @"🌃", + @"[station]": @"🚉", + @"[statue_of_liberty]": @"🗽", + @"[steam_locomotive]": @"🚂", + @"[sunrise]": @"🌅", + @"[sunrise_over_mountains]": @"🌄", + @"[suspension_railway]": @"🚟", + @"[taxi]": @"🚕", + @"[tent]": @"⛺", + @"[ticket]": @"🎫", + @"[tokyo_tower]": @"🗼", + @"[tractor]": @"🚜", + @"[traffic_light]": @"🚥", + @"[train2]": @"🚆", + @"[tram]": @"🚊", + @"[triangular_flag_on_post]": @"🚩", + @"[trolleybus]": @"🚎", + @"[truck]": @"🚚", + @"[vertical_traffic_light]": @"🚦", + @"[warning]": @"⚠", + @"[wedding]": @"💒", + @"[jp]": @"🇯🇵", + @"[kr]": @"🇰🇷", + @"[cn]": @"🇨🇳", + @"[us]": @"🇺🇸", + @"[fr]": @"🇫🇷", + @"[es]": @"🇪🇸", + @"[it]": @"🇮🇹", + @"[ru]": @"🇷🇺", + @"[gb]": @"🇬🇧", + @"[uk]": @"🇬🇧", + @"[de]": @"🇩🇪", + @"[100]": @"💯", + @"[1234]": @"🔢", + @"[a]": @"🅰", + @"[ab]": @"🆎", + @"[abc]": @"🔤", + @"[abcd]": @"🔡", + @"[accept]": @"🉑", + @"[aquarius]": @"♒", + @"[aries]": @"♈", + @"[arrow_backward]": @"◀", + @"[arrow_double_down]": @"⏬", + @"[arrow_double_up]": @"⏫", + @"[arrow_down]": @"⬇", + @"[arrow_down_small]": @"🔽", + @"[arrow_forward]": @"▶", + @"[arrow_heading_down]": @"⤵", + @"[arrow_heading_up]": @"⤴", + @"[arrow_left]": @"⬅", + @"[arrow_lower_left]": @"↙", + @"[arrow_lower_right]": @"↘", + @"[arrow_right]": @"➡", + @"[arrow_right_hook]": @"↪", + @"[arrow_up]": @"⬆", + @"[arrow_up_down]": @"↕", + @"[arrow_up_small]": @"🔼", + @"[arrow_upper_left]": @"↖", + @"[arrow_upper_right]": @"↗", + @"[arrows_clockwise]": @"🔃", + @"[arrows_counterclockwise]": @"🔄", + @"[b]": @"🅱", + @"[baby_symbol]": @"🚼", + @"[baggage_claim]": @"🛄", + @"[ballot_box_with_check]": @"☑", + @"[bangbang]": @"‼", + @"[black_circle]": @"⚫", + @"[black_square_button]": @"🔲", + @"[cancer]": @"♋", + @"[capital_abcd]": @"🔠", + @"[capricorn]": @"♑", + @"[chart]": @"💹", + @"[children_crossing]": @"🚸", + @"[cinema]": @"🎦", + @"[cl]": @"🆑", + @"[clock1]": @"🕐", + @"[clock10]": @"🕙", + @"[clock1030]": @"🕥", + @"[clock11]": @"🕚", + @"[clock1130]": @"🕦", + @"[clock12]": @"🕛", + @"[clock1230]": @"🕧", + @"[clock130]": @"🕜", + @"[clock2]": @"🕑", + @"[clock230]": @"🕝", + @"[clock3]": @"🕒", + @"[clock330]": @"🕞", + @"[clock4]": @"🕓", + @"[clock430]": @"🕟", + @"[clock5]": @"🕔", + @"[clock530]": @"🕠", + @"[clock6]": @"🕕", + @"[clock630]": @"🕡", + @"[clock7]": @"🕖", + @"[clock730]": @"🕢", + @"[clock8]": @"🕗", + @"[clock830]": @"🕣", + @"[clock9]": @"🕘", + @"[clock930]": @"🕤", + @"[congratulations]": @"㊗", + @"[cool]": @"🆒", + @"[copyright]": @"©", + @"[curly_loop]": @"➰", + @"[currency_exchange]": @"💱", + @"[customs]": @"🛃", + @"[diamond_shape_with_a_dot_inside]": @"💠", + @"[do_not_litter]": @"🚯", + @"[eight]": @"8⃣", + @"[eight_pointed_black_star]": @"✴", + @"[eight_spoked_asterisk]": @"✳", + @"[end]": @"🔚", + @"[fast_forward]": @"⏩", + @"[five]": @"5⃣", + @"[four]": @"4⃣", + @"[free]": @"🆓", + @"[gemini]": @"♊", + @"[hash]": @"#⃣", + @"[heart_decoration]": @"💟", + @"[heavy_check_mark]": @"✔", + @"[heavy_division_sign]": @"➗", + @"[heavy_dollar_sign]": @"💲", + @"[heavy_minus_sign]": @"➖", + @"[heavy_multiplication_x]": @"✖", + @"[heavy_plus_sign]": @"➕", + @"[id]": @"🆔", + @"[ideograph_advantage]": @"🉐", + @"[information_source]": @"ℹ", + @"[interrobang]": @"⁉", + @"[keycap_ten]": @"🔟", + @"[koko]": @"🈁", + @"[large_blue_circle]": @"🔵", + @"[large_blue_diamond]": @"🔷", + @"[large_orange_diamond]": @"🔶", + @"[left_luggage]": @"🛅", + @"[left_right_arrow]": @"↔", + @"[leftwards_arrow_with_hook]": @"↩", + @"[leo]": @"♌", + @"[libra]": @"♎", + @"[link]": @"🔗", + @"[m]": @"Ⓜ", + @"[mens]": @"🚹", + @"[metro]": @"🚇", + @"[mobile_phone_off]": @"📴", + @"[negative_squared_cross_mark]": @"❎", + @"[new]": @"🆕", + @"[ng]": @"🆖", + @"[nine]": @"9⃣", + @"[no_bicycles]": @"🚳", + @"[no_entry]": @"⛔", + @"[no_entry_sign]": @"🚫", + @"[no_mobile_phones]": @"📵", + @"[no_pedestrians]": @"🚷", + @"[no_smoking]": @"🚭", + @"[non-potable_water]": @"🚱", + @"[o]": @"⭕", + @"[o2]": @"🅾", + @"[ok]": @"🆗", + @"[on]": @"🔛", + @"[one]": @"1⃣", + @"[ophiuchus]": @"⛎", + @"[parking]": @"🅿", + @"[part_alternation_mark]": @"〽", + @"[passport_control]": @"🛂", + @"[pisces]": @"♓", + @"[potable_water]": @"🚰", + @"[put_litter_in_its_place]": @"🚮", + @"[radio_button]": @"🔘", + @"[recycle]": @"♻", + @"[red_circle]": @"🔴", + @"[registered]": @"®", + @"[repeat]": @"🔁", + @"[repeat_one]": @"🔂", + @"[restroom]": @"🚻", + @"[rewind]": @"⏪", + @"[sa]": @"🈂", + @"[sagittarius]": @"♐", + @"[scorpius]": @"♏", + @"[secret]": @"㊙", + @"[seven]": @"7⃣", + @"[signal_strength]": @"📶", + @"[six]": @"6⃣", + @"[six_pointed_star]": @"🔯", + @"[small_blue_diamond]": @"🔹", + @"[small_orange_diamond]": @"🔸", + @"[small_red_triangle]": @"🔺", + @"[small_red_triangle_down]": @"🔻", + @"[soon]": @"🔜", + @"[sos]": @"🆘", + @"[symbols]": @"🔣", + @"[taurus]": @"♉", + @"[three]": @"3⃣", + @"[tm]": @"™", + @"[top]": @"🔝", + @"[trident]": @"🔱", + @"[twisted_rightwards_arrows]": @"🔀", + @"[two]": @"2⃣", + @"[u5272]": @"🈹", + @"[u5408]": @"🈴", + @"[u55b6]": @"🈺", + @"[u6307]": @"🈯", + @"[u6708]": @"🈷", + @"[u6709]": @"🈶", + @"[u6e80]": @"🈵", + @"[u7121]": @"🈚", + @"[u7533]": @"🈸", + @"[u7981]": @"🈲", + @"[u7a7a]": @"🈳", + @"[underage]": @"🔞", + @"[up]": @"🆙", + @"[vibration_mode]": @"📳", + @"[virgo]": @"♍", + @"[vs]": @"🆚", + @"[wavy_dash]": @"〰", + @"[wc]": @"🚾", + @"[wheelchair]": @"♿", + @"[white_check_mark]": @"✅", + @"[white_circle]": @"⚪", + @"[white_flower]": @"💮", + @"[white_square_button]": @"🔳", + @"[womens]": @"🚺", + @"[x]": @"❌", + @"[zero]": @"0⃣", + }; + + __block NSString *text = self; + + [emojis enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + text = [text stringByReplacingOccurrencesOfString:key withString:obj]; + }]; + + return text; +} + + +/** + 将表情字符转换成文字 + + @return 文字 + */ +- (NSString *)ba_stringReplaceEmojiUnicodeWithText +{ + NSDictionary *emojis = @{ + @"😄": @"[哈哈]", + @"😆": @"[laughing]", + @"😊": @"[blush]", + @"😃": @"[微笑]", + @"☺": @"[relaxed]", + @"😏": @"[假笑]", + @"😍": @"[heart_eyes]", + @"😘": @"[kissing_heart]", + @"😚": @"[亲吻]", + @"😳": @"[脸红]", + @"😥": @"[relieved]", + @"😌": @"[满足]", + @"😁": @"[grin]", + @"😉": @"[wink]", + @"😜": @"[鬼脸]", + @"😝": @"[闭眼]", + @"😀": @"[grinning]", + @"😗": @"[kissing]", + @"😙": @"[kissing_smiling_eyes]", + @"😛": @"[stuck_out_tongue]", + @"😴": @"[sleeping]", + @"😟": @"[worried]", + @"😦": @"[frowning]", + @"😧": @"[anguished]", + @"😮": @"[open_mouth]", + @"😬": @"[grimacing]", + @"😕": @"[confused]", + @"😯": @"[hushed]", + @"😑": @"[expressionless]", + @"😒": @"[鄙视]", + @"😅": @"[sweat_smile]", + @"😓": @"[冷汗]", + @"😩": @"[weary]", + @"😔": @"[pensive]", + @"😞": @"[失望]", + @"😖": @"[confounded]", + @"😨": @"[害怕]", + @"😰": @"[糟糕]", + @"😣": @"[persevere]", + @"😢": @"[悲伤]", + @"😭": @"[大哭]", + @"😂": @"[joy]", + @"😲": @"[astonished]", + @"😱": @"[恐怖]", + @"😫": @"[tired_face]", + @"😠": @"[不高兴]", + @"😡": @"[愤怒]", + @"😤": @"[triumph]", + @"😪": @"[sleepy]", + @"😋": @"[yum]", + @"😷": @"[生病]", + @"😎": @"[sunglasses]", + @"😵": @"[dizzy_face]", + @"👿": @"[恶魔]", + @"😈": @"[smiling_imp]", + @"😐": @"[neutral_face]", + @"😶": @"[no_mouth]", + @"😇": @"[innocent]", + @"👽": @"[外星人]", + @"💛": @"[黄心]", + @"💙": @"[blue_heart]", + @"💜": @"[purple_heart]", + @"❤": @"[心]", + @"💚": @"[green_heart]", + @"💔": @"[心碎]", + @"💓": @"[heartbeat]", + @"💗": @"[heartpulse]", + @"💕": @"[two_hearts]", + @"💞": @"[revolving_hearts]", + @"💘": @"[cupid]", + @"💖": @"[sparkling_heart]", + @"✨": @"[星星]", + @"⭐": @"[star]", + @"🌟": @"[star2]", + @"💫": @"[dizzy]", + @"💥": @"[boom]", + @"💢": @"[anger]", + @"❗": @"[exclamation]", + @"❓": @"[question]", + @"❕": @"[grey_exclamation]", + @"❔": @"[grey_question]", + @"💤": @"[zzz]", + @"💨": @"[dash]", + @"💦": @"[sweat_drops]", + @"🎶": @"[notes]", + @"🎵": @"[音符]", + @"🔥": @"[火焰]", + @"💩": @"[hankey]", + @"👍": @"[点赞]", + @"👎": @"[thumbsdown]", + @"👌": @"[ok_hand]", + @"👊": @"[punch]", + @"✊": @"[fist]", + @"✌": @"[耶]", + @"👋": @"[挥手]", + @"✋": @"[hand]", + @"👐": @"[open_hands]", + @"☝": @"[point_up]", + @"👇": @"[下面]", + @"👈": @"[左边]", + @"👉": @"[右边]", + @"🙌": @"[raised_hands]", + @"🙏": @"[pray]", + @"👆": @"[上面]", + @"👏": @"[clap]", + @"💪": @"[强壮]", + @"🚶": @"[walking]", + @"🏃": @"[runner]", + @"👫": @"[couple]", + @"👪": @"[family]", + @"👬": @"[two_men_holding_hands]", + @"👭": @"[two_women_holding_hands]", + @"💃": @"[dancer]", + @"👯": @"[dancers]", + @"🙆": @"[ok_woman]", + @"🙅": @"[no_good]", + @"💁": @"[information_desk_person]", + @"🙋": @"[raised_hand]", + @"👰": @"[bride_with_veil]", + @"🙎": @"[person_with_pouting_face]", + @"🙍": @"[person_frowning]", + @"🙇": @"[bow]", + @"💏": @"[couplekiss]", + @"💑": @"[couple_with_heart]", + @"💆": @"[massage]", + @"💇": @"[haircut]", + @"💅": @"[nail_care]", + @"👦": @"[boy]", + @"👧": @"[girl]", + @"👩": @"[woman]", + @"👨": @"[man]", + @"👶": @"[baby]", + @"👵": @"[older_woman]", + @"👴": @"[older_man]", + @"👱": @"[person_with_blond_hair]", + @"👲": @"[man_with_gua_pi_mao]", + @"👳": @"[man_with_turban]", + @"👷": @"[construction_worker]", + @"👮": @"[cop]", + @"👼": @"[angel]", + @"👸": @"[princess]", + @"😺": @"[smiley_cat]", + @"😸": @"[smile_cat]", + @"😻": @"[heart_eyes_cat]", + @"😽": @"[kissing_cat]", + @"😼": @"[smirk_cat]", + @"🙀": @"[scream_cat]", + @"😿": @"[crying_cat_face]", + @"😹": @"[joy_cat]", + @"😾": @"[pouting_cat]", + @"👹": @"[japanese_ogre]", + @"👺": @"[japanese_goblin]", + @"🙈": @"[see_no_evil]", + @"🙉": @"[hear_no_evil]", + @"🙊": @"[speak_no_evil]", + @"💂": @"[guardsman]", + @"💀": @"[skull]", + @"👣": @"[feet]", + @"👄": @"[lips]", + @"💋": @"[红唇]", + @"💧": @"[droplet]", + @"👂": @"[ear]", + @"👀": @"[eyes]", + @"👃": @"[nose]", + @"👅": @"[tongue]", + @"💌": @"[love_letter]", + @"👤": @"[bust_in_silhouette]", + @"👥": @"[busts_in_silhouette]", + @"💬": @"[speech_balloon]", + @"💭": @"[thought_balloon]", + @"☀": @"[太阳]", + @"☔": @"[雨伞]", + @"☁": @"[多云]", + @"❄": @"[snowflake]", + @"⛄": @"[雪人]", + @"⚡": @"[zap]", + @"🌀": @"[cyclone]", + @"🌁": @"[foggy]", + @"🌊": @"[波浪]", + @"🐱": @"[猫]", + @"🐶": @"[小狗]", + @"🐭": @"[老鼠]", + @"🐹": @"[仓鼠]", + @"🐰": @"[兔子]", + @"🐺": @"[狼]", + @"🐸": @"[青蛙]", + @"🐯": @"[老虎]", + @"🐨": @"[树袋熊]", + @"🐻": @"[熊]", + @"🐷": @"[猪头]", + @"🐽": @"[pig_nose]", + @"🐮": @"[cow]", + @"🐗": @"[boar]", + @"🐵": @"[猴子]", + @"🐒": @"[猴]", + @"🐴": @"[马]", + @"🐎": @"[racehorse]", + @"🐫": @"[camel]", + @"🐑": @"[sheep]", + @"🐘": @"[elephant]", + @"🐼": @"[panda_face]", + @"🐍": @"[snake]", + @"🐦": @"[bird]", + @"🐤": @"[baby_chick]", + @"🐥": @"[hatched_chick]", + @"🐣": @"[hatching_chick]", + @"🐔": @"[chicken]", + @"🐧": @"[penguin]", + @"🐢": @"[turtle]", + @"🐛": @"[bug]", + @"🐝": @"[honeybee]", + @"🐜": @"[ant]", + @"🐞": @"[beetle]", + @"🐌": @"[snail]", + @"🐙": @"[octopus]", + @"🐠": @"[tropical_fish]", + @"🐟": @"[fish]", + @"🐳": @"[whale]", + @"🐋": @"[whale2]", + @"🐬": @"[dolphin]", + @"🐄": @"[cow2]", + @"🐏": @"[ram]", + @"🐀": @"[rat]", + @"🐃": @"[water_buffalo]", + @"🐅": @"[tiger2]", + @"🐇": @"[rabbit2]", + @"🐉": @"[dragon]", + @"🐐": @"[goat]", + @"🐓": @"[rooster]", + @"🐕": @"[dog2]", + @"🐖": @"[pig2]", + @"🐁": @"[mouse2]", + @"🐂": @"[ox]", + @"🐲": @"[dragon_face]", + @"🐡": @"[blowfish]", + @"🐊": @"[crocodile]", + @"🐪": @"[dromedary_camel]", + @"🐆": @"[leopard]", + @"🐈": @"[cat2]", + @"🐩": @"[poodle]", + @"🐾": @"[paw_prints]", + @"💐": @"[bouquet]", + @"🌸": @"[cherry_blossom]", + @"🌷": @"[tulip]", + @"🍀": @"[four_leaf_clover]", + @"🌹": @"[rose]", + @"🌻": @"[sunflower]", + @"🌺": @"[hibiscus]", + @"🍁": @"[maple_leaf]", + @"🍃": @"[leaves]", + @"🍂": @"[fallen_leaf]", + @"🌿": @"[herb]", + @"🍄": @"[mushroom]", + @"🌵": @"[cactus]", + @"🌴": @"[palm_tree]", + @"🌲": @"[evergreen_tree]", + @"🌳": @"[deciduous_tree]", + @"🌰": @"[chestnut]", + @"🌱": @"[seedling]", + @"🌼": @"[blossum]", + @"🌾": @"[ear_of_rice]", + @"🐚": @"[shell]", + @"🌐": @"[globe_with_meridians]", + @"🌞": @"[sun_with_face]", + @"🌝": @"[full_moon_with_face]", + @"🌚": @"[new_moon_with_face]", + @"🌑": @"[new_moon]", + @"🌒": @"[waxing_crescent_moon]", + @"🌓": @"[first_quarter_moon]", + @"🌔": @"[waxing_gibbous_moon]", + @"🌕": @"[full_moon]", + @"🌖": @"[waning_gibbous_moon]", + @"🌗": @"[last_quarter_moon]", + @"🌘": @"[waning_crescent_moon]", + @"🌜": @"[last_quarter_moon_with_face]", + @"🌛": @"[first_quarter_moon_with_face]", + @"🌙": @"[moon]", + @"🌍": @"[earth_africa]", + @"🌎": @"[earth_americas]", + @"🌏": @"[earth_asia]", + @"🌋": @"[volcano]", + @"🌌": @"[milky_way]", + @"⛅": @"[partly_sunny]", + @"🎍": @"[bamboo]", + @"💝": @"[gift_heart]", + @"🎎": @"[dolls]", + @"🎒": @"[school_satchel]", + @"🎓": @"[mortar_board]", + @"🎏": @"[flags]", + @"🎆": @"[fireworks]", + @"🎇": @"[sparkler]", + @"🎐": @"[wind_chime]", + @"🎑": @"[rice_scene]", + @"🎃": @"[jack_o_lantern]", + @"👻": @"[ghost]", + @"🎅": @"[santa]", + @"🎱": @"[8ball]", + @"⏰": @"[alarm_clock]", + @"🍎": @"[apple]", + @"🎨": @"[art]", + @"🍼": @"[baby_bottle]", + @"🎈": @"[balloon]", + @"🍌": @"[banana]", + @"📊": @"[bar_chart]", + @"⚾": @"[baseball]", + @"🏀": @"[basketball]", + @"🛀": @"[bath]", + @"🛁": @"[bathtub]", + @"🔋": @"[battery]", + @"🍺": @"[beer]", + @"🍻": @"[beers]", + @"🔔": @"[bell]", + @"🍱": @"[bento]", + @"🚴": @"[bicyclist]", + @"👙": @"[bikini]", + @"🎂": @"[birthday]", + @"🃏": @"[black_joker]", + @"✒": @"[black_nib]", + @"📘": @"[blue_book]", + @"💣": @"[bomb]", + @"🔖": @"[bookmark]", + @"📑": @"[bookmark_tabs]", + @"📚": @"[books]", + @"👢": @"[boot]", + @"🎳": @"[bowling]", + @"🍞": @"[bread]", + @"💼": @"[briefcase]", + @"💡": @"[bulb]", + @"🍰": @"[cake]", + @"📆": @"[calendar]", + @"📲": @"[calling]", + @"📷": @"[camera]", + @"🍬": @"[candy]", + @"📇": @"[card_index]", + @"💿": @"[cd]", + @"📉": @"[chart_with_downwards_trend]", + @"📈": @"[chart_with_upwards_trend]", + @"🍒": @"[cherries]", + @"🍫": @"[chocolate_bar]", + @"🎄": @"[christmas_tree]", + @"🎬": @"[clapper]", + @"📋": @"[clipboard]", + @"📕": @"[closed_book]", + @"🔐": @"[closed_lock_with_key]", + @"🌂": @"[closed_umbrella]", + @"♣": @"[clubs]", + @"🍸": @"[cocktail]", + @"☕": @"[coffee]", + @"💻": @"[computer]", + @"🎊": @"[confetti_ball]", + @"🍪": @"[cookie]", + @"🌽": @"[corn]", + @"💳": @"[credit_card]", + @"👑": @"[crown]", + @"🔮": @"[crystal_ball]", + @"🍛": @"[curry]", + @"🍮": @"[custard]", + @"🍡": @"[dango]", + @"🎯": @"[dart]", + @"📅": @"[date]", + @"♦": @"[diamonds]", + @"💵": @"[dollar]", + @"🚪": @"[door]", + @"🍩": @"[doughnut]", + @"👗": @"[dress]", + @"📀": @"[dvd]", + @"📧": @"[e-mail]", + @"🍳": @"[egg]", + @"🍆": @"[eggplant]", + @"🔌": @"[electric_plug]", + @"✉": @"[email]", + @"💶": @"[euro]", + @"👓": @"[eyeglasses]", + @"📠": @"[fax]", + @"📁": @"[file_folder]", + @"🍥": @"[fish_cake]", + @"🎣": @"[fishing_pole_and_fish]", + @"🔦": @"[flashlight]", + @"💾": @"[floppy_disk]", + @"🎴": @"[flower_playing_cards]", + @"🏈": @"[football]", + @"🍴": @"[fork_and_knife]", + @"🍤": @"[fried_shrimp]", + @"🍟": @"[fries]", + @"🎲": @"[game_die]", + @"💎": @"[gem]", + @"🎁": @"[gift]", + @"⛳": @"[golf]", + @"🍇": @"[grapes]", + @"🍏": @"[green_apple]", + @"📗": @"[green_book]", + @"🎸": @"[guitar]", + @"🔫": @"[gun]", + @"🍔": @"[hamburger]", + @"🔨": @"[hammer]", + @"👜": @"[handbag]", + @"🎧": @"[headphones]", + @"♥": @"[hearts]", + @"🔆": @"[high_brightness]", + @"👠": @"[high_heel]", + @"🔪": @"[hocho]", + @"🍯": @"[honey_pot]", + @"🏇": @"[horse_racing]", + @"⌛": @"[hourglass]", + @"⏳": @"[hourglass_flowing_sand]", + @"🍨": @"[ice_cream]", + @"🍦": @"[icecream]", + @"📥": @"[inbox_tray]", + @"📨": @"[incoming_envelope]", + @"📱": @"[iphone]", + @"👖": @"[jeans]", + @"🔑": @"[key]", + @"👘": @"[kimono]", + @"📒": @"[ledger]", + @"🍋": @"[lemon]", + @"💄": @"[lipstick]", + @"🔒": @"[lock]", + @"🔏": @"[lock_with_ink_pen]", + @"🍭": @"[lollipop]", + @"➿": @"[loop]", + @"📢": @"[loudspeaker]", + @"🔅": @"[low_brightness]", + @"🔍": @"[mag]", + @"🔎": @"[mag_right]", + @"🀄": @"[mahjong]", + @"📫": @"[mailbox]", + @"📪": @"[mailbox_closed]", + @"📬": @"[mailbox_with_mail]", + @"📭": @"[mailbox_with_no_mail]", + @"👞": @"[mans_shoe]", + @"🍖": @"[meat_on_bone]", + @"📣": @"[mega]", + @"🍈": @"[melon]", + @"📝": @"[memo]", + @"🎤": @"[microphone]", + @"🔬": @"[microscope]", + @"💽": @"[minidisc]", + @"💸": @"[money_with_wings]", + @"💰": @"[moneybag]", + @"🚵": @"[mountain_bicyclist]", + @"🎥": @"[movie_camera]", + @"🎹": @"[musical_keyboard]", + @"🎼": @"[musical_score]", + @"🔇": @"[mute]", + @"📛": @"[name_badge]", + @"👔": @"[necktie]", + @"📰": @"[newspaper]", + @"🔕": @"[no_bell]", + @"📓": @"[notebook]", + @"📔": @"[notebook_with_decorative_cover]", + @"🔩": @"[nut_and_bolt]", + @"🍢": @"[oden]", + @"📂": @"[open_file_folder]", + @"📙": @"[orange_book]", + @"📤": @"[outbox_tray]", + @"📄": @"[page_facing_up]", + @"📃": @"[page_with_curl]", + @"📟": @"[pager]", + @"📎": @"[paperclip]", + @"🍑": @"[peach]", + @"🍐": @"[pear]", + @"✏": @"[pencil2]", + @"☎": @"[phone]", + @"💊": @"[pill]", + @"🍍": @"[pineapple]", + @"🍕": @"[pizza]", + @"📯": @"[postal_horn]", + @"📮": @"[postbox]", + @"👝": @"[pouch]", + @"🍗": @"[poultry_leg]", + @"💷": @"[pound]", + @"👛": @"[purse]", + @"📌": @"[pushpin]", + @"📻": @"[radio]", + @"🍜": @"[ramen]", + @"🎀": @"[ribbon]", + @"🍚": @"[rice]", + @"🍙": @"[rice_ball]", + @"🍘": @"[rice_cracker]", + @"💍": @"[ring]", + @"🏉": @"[rugby_football]", + @"🎽": @"[running_shirt_with_sash]", + @"🍶": @"[sake]", + @"👡": @"[sandal]", + @"📡": @"[satellite]", + @"🎷": @"[saxophone]", + @"✂": @"[scissors]", + @"📜": @"[scroll]", + @"💺": @"[seat]", + @"🍧": @"[shaved_ice]", + @"👕": @"[shirt]", + @"🚿": @"[shower]", + @"🎿": @"[ski]", + @"🚬": @"[smoking]", + @"🏂": @"[snowboarder]", + @"⚽": @"[soccer]", + @"🔉": @"[sound]", + @"👾": @"[space_invader]", + @"♠": @"[spades]", + @"🍝": @"[spaghetti]", + @"🔊": @"[speaker]", + @"🍲": @"[stew]", + @"📏": @"[straight_ruler]", + @"🍓": @"[strawberry]", + @"🏄": @"[surfer]", + @"🍣": @"[sushi]", + @"🍠": @"[sweet_potato]", + @"🏊": @"[swimmer]", + @"💉": @"[syringe]", + @"🎉": @"[tada]", + @"🎋": @"[tanabata_tree]", + @"🍊": @"[tangerine]", + @"🍵": @"[tea]", + @"📞": @"[telephone_receiver]", + @"🔭": @"[telescope]", + @"🎾": @"[tennis]", + @"🚽": @"[toilet]", + @"🍅": @"[tomato]", + @"🎩": @"[tophat]", + @"📐": @"[triangular_ruler]", + @"🏆": @"[trophy]", + @"🍹": @"[tropical_drink]", + @"🎺": @"[trumpet]", + @"📺": @"[tv]", + @"🔓": @"[unlock]", + @"📼": @"[vhs]", + @"📹": @"[video_camera]", + @"🎮": @"[video_game]", + @"🎻": @"[violin]", + @"⌚": @"[watch]", + @"🍉": @"[watermelon]", + @"🍷": @"[wine_glass]", + @"👚": @"[womans_clothes]", + @"👒": @"[womans_hat]", + @"🔧": @"[wrench]", + @"💴": @"[yen]", + @"🚡": @"[aerial_tramway]", + @"✈": @"[airplane]", + @"🚑": @"[ambulance]", + @"⚓": @"[anchor]", + @"🚛": @"[articulated_lorry]", + @"🏧": @"[atm]", + @"🏦": @"[bank]", + @"💈": @"[barber]", + @"🔰": @"[beginner]", + @"🚲": @"[bike]", + @"🚙": @"[blue_car]", + @"⛵": @"[boat]", + @"🌉": @"[bridge_at_night]", + @"🚅": @"[bullettrain_front]", + @"🚄": @"[bullettrain_side]", + @"🚌": @"[bus]", + @"🚏": @"[busstop]", + @"🚗": @"[car]", + @"🎠": @"[carousel_horse]", + @"🏁": @"[checkered_flag]", + @"⛪": @"[church]", + @"🎪": @"[circus_tent]", + @"🌇": @"[city_sunrise]", + @"🌆": @"[city_sunset]", + @"🚧": @"[construction]", + @"🏪": @"[convenience_store]", + @"🎌": @"[crossed_flags]", + @"🏬": @"[department_store]", + @"🏰": @"[european_castle]", + @"🏤": @"[european_post_office]", + @"🏭": @"[factory]", + @"🎡": @"[ferris_wheel]", + @"🚒": @"[fire_engine]", + @"⛲": @"[fountain]", + @"⛽": @"[fuelpump]", + @"🚁": @"[helicopter]", + @"🏥": @"[hospital]", + @"🏨": @"[hotel]", + @"♨": @"[hotsprings]", + @"🏠": @"[house]", + @"🏡": @"[house_with_garden]", + @"🗾": @"[japan]", + @"🏯": @"[japanese_castle]", + @"🚈": @"[light_rail]", + @"🏩": @"[love_hotel]", + @"🚐": @"[minibus]", + @"🚝": @"[monorail]", + @"🗻": @"[mount_fuji]", + @"🚠": @"[mountain_cableway]", + @"🚞": @"[mountain_railway]", + @"🗿": @"[moyai]", + @"🏢": @"[office]", + @"🚘": @"[oncoming_automobile]", + @"🚍": @"[oncoming_bus]", + @"🚔": @"[oncoming_police_car]", + @"🚖": @"[oncoming_taxi]", + @"🎭": @"[performing_arts]", + @"🚓": @"[police_car]", + @"🏣": @"[post_office]", + @"🚃": @"[railway_car]", + @"🌈": @"[rainbow]", + @"🚀": @"[rocket]", + @"🎢": @"[roller_coaster]", + @"🚨": @"[rotating_light]", + @"📍": @"[round_pushpin]", + @"🚣": @"[rowboat]", + @"🏫": @"[school]", + @"🚢": @"[ship]", + @"🎰": @"[slot_machine]", + @"🚤": @"[speedboat]", + @"🌃": @"[stars]", + @"🚉": @"[station]", + @"🗽": @"[statue_of_liberty]", + @"🚂": @"[steam_locomotive]", + @"🌅": @"[sunrise]", + @"🌄": @"[sunrise_over_mountains]", + @"🚟": @"[suspension_railway]", + @"🚕": @"[taxi]", + @"⛺": @"[tent]", + @"🎫": @"[ticket]", + @"🗼": @"[tokyo_tower]", + @"🚜": @"[tractor]", + @"🚥": @"[traffic_light]", + @"🚆": @"[train2]", + @"🚊": @"[tram]", + @"🚩": @"[triangular_flag_on_post]", + @"🚎": @"[trolleybus]", + @"🚚": @"[truck]", + @"🚦": @"[vertical_traffic_light]", + @"⚠": @"[warning]", + @"💒": @"[wedding]", + @"🇯🇵": @"[jp]", + @"🇰🇷": @"[kr]", + @"🇨🇳": @"[cn]", + @"🇺🇸": @"[us]", + @"🇫🇷": @"[fr]", + @"🇪🇸": @"[es]", + @"🇮🇹": @"[it]", + @"🇷🇺": @"[ru]", + @"🇬🇧": @"[gb]", + @"🇩🇪": @"[de]", + @"💯": @"[100]", + @"🔢": @"[1234]", + @"🅰": @"[a]", + @"🆎": @"[ab]", + @"🔤": @"[abc]", + @"🔡": @"[abcd]", + @"🉑": @"[accept]", + @"♒": @"[aquarius]", + @"♈": @"[aries]", + @"◀": @"[arrow_backward]", + @"⏬": @"[arrow_double_down]", + @"⏫": @"[arrow_double_up]", + @"⬇": @"[arrow_down]", + @"🔽": @"[arrow_down_small]", + @"▶": @"[arrow_forward]", + @"⤵": @"[arrow_heading_down]", + @"⤴": @"[arrow_heading_up]", + @"⬅": @"[arrow_left]", + @"↙": @"[arrow_lower_left]", + @"↘": @"[arrow_lower_right]", + @"➡": @"[arrow_right]", + @"↪": @"[arrow_right_hook]", + @"⬆": @"[arrow_up]", + @"↕": @"[arrow_up_down]", + @"🔼": @"[arrow_up_small]", + @"↖": @"[arrow_upper_left]", + @"↗": @"[arrow_upper_right]", + @"🔃": @"[arrows_clockwise]", + @"🔄": @"[arrows_counterclockwise]", + @"🅱": @"[b]", + @"🚼": @"[baby_symbol]", + @"🛄": @"[baggage_claim]", + @"☑": @"[ballot_box_with_check]", + @"‼": @"[bangbang]", + @"⚫": @"[black_circle]", + @"🔲": @"[black_square_button]", + @"♋": @"[cancer]", + @"🔠": @"[capital_abcd]", + @"♑": @"[capricorn]", + @"💹": @"[chart]", + @"🚸": @"[children_crossing]", + @"🎦": @"[cinema]", + @"🆑": @"[cl]", + @"🕐": @"[clock1]", + @"🕙": @"[clock10]", + @"🕥": @"[clock1030]", + @"🕚": @"[clock11]", + @"🕦": @"[clock1130]", + @"🕛": @"[clock12]", + @"🕧": @"[clock1230]", + @"🕜": @"[clock130]", + @"🕑": @"[clock2]", + @"🕝": @"[clock230]", + @"🕒": @"[clock3]", + @"🕞": @"[clock330]", + @"🕓": @"[clock4]", + @"🕟": @"[clock430]", + @"🕔": @"[clock5]", + @"🕠": @"[clock530]", + @"🕕": @"[clock6]", + @"🕡": @"[clock630]", + @"🕖": @"[clock7]", + @"🕢": @"[clock730]", + @"🕗": @"[clock8]", + @"🕣": @"[clock830]", + @"🕘": @"[clock9]", + @"🕤": @"[clock930]", + @"㊗": @"[congratulations]", + @"🆒": @"[cool]", + @"©": @"[copyright]", + @"➰": @"[curly_loop]", + @"💱": @"[currency_exchange]", + @"🛃": @"[customs]", + @"💠": @"[diamond_shape_with_a_dot_inside]", + @"🚯": @"[do_not_litter]", + @"8⃣": @"[eight]", + @"✴": @"[eight_pointed_black_star]", + @"✳": @"[eight_spoked_asterisk]", + @"🔚": @"[end]", + @"⏩": @"[fast_forward]", + @"5⃣": @"[five]", + @"4⃣": @"[four]", + @"🆓": @"[free]", + @"♊": @"[gemini]", + @"#⃣": @"[hash]", + @"💟": @"[heart_decoration]", + @"✔": @"[heavy_check_mark]", + @"➗": @"[heavy_division_sign]", + @"💲": @"[heavy_dollar_sign]", + @"➖": @"[heavy_minus_sign]", + @"✖": @"[heavy_multiplication_x]", + @"➕": @"[heavy_plus_sign]", + @"🆔": @"[id]", + @"🉐": @"[ideograph_advantage]", + @"ℹ": @"[information_source]", + @"⁉": @"[interrobang]", + @"🔟": @"[keycap_ten]", + @"🈁": @"[koko]", + @"🔵": @"[large_blue_circle]", + @"🔷": @"[large_blue_diamond]", + @"🔶": @"[large_orange_diamond]", + @"🛅": @"[left_luggage]", + @"↔": @"[left_right_arrow]", + @"↩": @"[leftwards_arrow_with_hook]", + @"♌": @"[leo]", + @"♎": @"[libra]", + @"🔗": @"[link]", + @"Ⓜ": @"[m]", + @"🚹": @"[mens]", + @"🚇": @"[metro]", + @"📴": @"[mobile_phone_off]", + @"❎": @"[negative_squared_cross_mark]", + @"🆕": @"[new]", + @"🆖": @"[ng]", + @"9⃣": @"[nine]", + @"🚳": @"[no_bicycles]", + @"⛔": @"[no_entry]", + @"🚫": @"[no_entry_sign]", + @"📵": @"[no_mobile_phones]", + @"🚷": @"[no_pedestrians]", + @"🚭": @"[no_smoking]", + @"🚱": @"[non-potable_water]", + @"⭕": @"[o]", + @"🅾": @"[o2]", + @"🆗": @"[ok]", + @"🔛": @"[on]", + @"1⃣": @"[one]", + @"⛎": @"[ophiuchus]", + @"🅿": @"[parking]", + @"〽": @"[part_alternation_mark]", + @"🛂": @"[passport_control]", + @"♓": @"[pisces]", + @"🚰": @"[potable_water]", + @"🚮": @"[put_litter_in_its_place]", + @"🔘": @"[radio_button]", + @"♻": @"[recycle]", + @"🔴": @"[red_circle]", + @"®": @"[registered]", + @"🔁": @"[repeat]", + @"🔂": @"[repeat_one]", + @"🚻": @"[restroom]", + @"⏪": @"[rewind]", + @"🈂": @"[sa]", + @"♐": @"[sagittarius]", + @"♏": @"[scorpius]", + @"㊙": @"[secret]", + @"7⃣": @"[seven]", + @"📶": @"[signal_strength]", + @"6⃣": @"[six]", + @"🔯": @"[six_pointed_star]", + @"🔹": @"[small_blue_diamond]", + @"🔸": @"[small_orange_diamond]", + @"🔺": @"[small_red_triangle]", + @"🔻": @"[small_red_triangle_down]", + @"🔜": @"[soon]", + @"🆘": @"[sos]", + @"🔣": @"[symbols]", + @"♉": @"[taurus]", + @"3⃣": @"[three]", + @"™": @"[tm]", + @"🔝": @"[top]", + @"🔱": @"[trident]", + @"🔀": @"[twisted_rightwards_arrows]", + @"2⃣": @"[two]", + @"🈹": @"[u5272]", + @"🈴": @"[u5408]", + @"🈺": @"[u55b6]", + @"🈯": @"[u6307]", + @"🈷": @"[u6708]", + @"🈶": @"[u6709]", + @"🈵": @"[u6e80]", + @"🈚": @"[u7121]", + @"🈸": @"[u7533]", + @"🈲": @"[u7981]", + @"🈳": @"[u7a7a]", + @"🔞": @"[underage]", + @"🆙": @"[up]", + @"📳": @"[vibration_mode]", + @"♍": @"[virgo]", + @"🆚": @"[vs]", + @"〰": @"[wavy_dash]", + @"🚾": @"[wc]", + @"♿": @"[wheelchair]", + @"✅": @"[white_check_mark]", + @"⚪": @"[white_circle]", + @"💮": @"[white_flower]", + @"🔳": @"[white_square_button]", + @"🚺": @"[womens]", + @"❌": @"[x]", + @"0⃣": @"[zero]" + }; + + __block NSString *text = self; + [emojis enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { + text = [text stringByReplacingOccurrencesOfString:key withString:obj]; + }]; + + return text; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.h" new file mode 100644 index 0000000..4621756 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.h" @@ -0,0 +1,122 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (BAEncrypt) + +/** + * 创建一个MD5字符串 + */ +- (NSString *)ba_stringMD5; + +/** + * 创建一个SHA1字符串 + */ +- (NSString *)ba_stringSHA1; + +/** + * 创建一个SHA256字符串 + */ +- (NSString *)ba_stringSHA256; + +/** + * 创建一个SHA512字符串 + */ +- (NSString *)ba_stringSHA512; + +/** + * 检查自身是否追加字符串 + */ +- (BOOL)ba_stringIsHasString:(NSString *)substring; + +/** + Base64 编码 + + @param string 需要编码的 string + @return Base64 编码后的 string + */ ++ (NSString *)ba_stringEncodeToBase64:(NSString *)string; + +/** + Base64 编码 + + @return Base64 编码后的 string + */ +- (NSString *)ba_stringEncodeToBase64; + +/** + Base64 解码 + + @param string 需要解码的 string + @return Base64 解码后的 string + */ ++ (NSString *)ba_stringDecodeBase64:(NSString *)string; + +/** + Base64 解码 + + @return Base64 解码后的 string + */ +- (NSString *)ba_stringDecodeBase64; + +@end +NS_ASSUME_NONNULL_END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.m" new file mode 100644 index 0000000..c4cd179 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAEncrypt.m" @@ -0,0 +1,174 @@ +// +// NSString+BAEncrypt.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "NSString+BAEncrypt.h" +#import + +@implementation NSString (BAEncrypt) + +/* 创建一个MD5字符串 */ +- (NSString *)ba_stringMD5 +{ + if (self == nil || [self length] == 0) + { + return nil; + } + + unsigned char digest[CC_MD5_DIGEST_LENGTH], i; + CC_MD5([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest); + NSMutableString *ms = [NSMutableString string]; + for (i = 0; i < CC_MD5_DIGEST_LENGTH; i++) + { + [ms appendFormat: @"%02x", (int)(digest[i])]; + } + return [ms copy]; +} + +/* 创建一个SHA1字符串 */ +- (NSString *)ba_stringSHA1 +{ + if(self == nil || [self length] == 0) + return nil; + + unsigned char digest[CC_SHA1_DIGEST_LENGTH], i; + CC_SHA1([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest); + NSMutableString *ms = [NSMutableString string]; + for(i=0;i -#import +NS_ASSUME_NONNULL_BEGIN -/** - * 给NSString类添加许多有用的方法 - */ @interface NSString (BAKit) -/** - * 搜索两个字符之间的字符串。 - * 例如: "This is a test" 的开始字符'h'和结束字符't'将返回"his is a " - */ -+ (NSString *)searchInString:(NSString *)string - charStart:(char)start - charEnd:(char)end; - -/** - * 搜索两个字符之间的字符串。 - * 例如: "This is a test" 的开始字符'h'和结束字符't'将返回"his is a " - */ -- (NSString *)searchCharStart:(char)start - charEnd:(char)end; - -/** - * 创建一个MD5字符串 - */ -- (NSString *)MD5; - -/** - * 创建一个SHA1字符串 - */ -- (NSString *)SHA1; - -/** - * 创建一个SHA256字符串 - */ -- (NSString *)SHA256; - -/** - * 创建一个SHA512字符串 - */ -- (NSString *)SHA512; - -/** - * 检查自身是否追加字符串 - */ -- (BOOL)hasString:(NSString *)substring; - -/** - * 检查自身是否是一个email - */ -- (BOOL)isEmail; - -/** - * 检查给定的字符串是否是一个email - */ -+ (BOOL)isEmail:(NSString *)email; - -/** - * 字符串转换为UTF8 - */ -+ (NSString *)convertToUTF8Entities:(NSString *)string; - -/** - * 编码给定的字符串成Base64 - */ -+ (NSString *)encodeToBase64:(NSString *)string; - -/** - * 编码自身成Base64 - */ -- (NSString *)encodeToBase64; - -/** - * 解码给定的字符串成Base64 - */ -+ (NSString *)decodeBase64:(NSString *)string; - -/** - * 解码自身成Base64 - */ -- (NSString *)decodeBase64; - /** * 转换自身为开头大写字符串. * 例如: "This is a Test" 将返回 "This is a test" "this is a test" 将返回 "This is a test" */ -- (NSString *)sentenceCapitalizedString; - -/** - * 返回一个从时间戳人类易读的字符串 - */ -- (NSString *)dateFromTimestamp; +- (NSString *)ba_stringSentenceCapitalizedString; /** * 自编码成编码的URL字符串 */ -- (NSString *)urlEncode; - -#pragma mark - ***** 日期时间处理 类 - -/** - * 获得系统当前日期和时间 - * - * @return 获得系统当前日期和时间 - */ -+ (nullable NSString *)BA_time_getCurrentDateAndTime; - -/** - * 时间戳转换【YYYY-MM-dd HH:mm:ss】 - * - * @param string 时间戳 - * - * @return 时间戳转换【YYYY-MM-dd HH:mm:ss】 - */ -+ (nullable NSString *)BA_time_getCurrentDateAndTimeWithTimeString:(nullable NSString *)string; - -/** - * 时间戳转换【YYYY-MM-dd】 - * - * @param string 时间戳 - * - * @return 时间戳转换【YYYY-MM-dd】 - */ -+ (nullable NSString *)BA_time_getDateWithTimeString:(nullable NSString *)string; - -/** - * 时间戳转换【HH:mm】 - * - * @param string 时间戳 - * - * @return 时间戳转换【HH:mm】 - */ -+ (nullable NSString *)BA_time_getTimeWithTimeString:(nullable NSString *)string; - -/** - * 时间转换时间戳 - * - * @param string 时间 - * - * @return 时间转换时间戳 - */ -+ (nullable NSString *)BA_time_getTimeStamp; - -/*! - * 日期转换星期 - * - * @param inputDate 日期 - * - * @return 返回星期几 - */ -+ (nullable NSString *)weekdayStringFromDate:(nullable NSDate *)inputDate; - -/*! 一般应用程序设置这一组的存在,比如夜间模式,如果你。从8:00-23:00。在这个当前的时间是如何推断出期间。主要的困难在于如何使用NSDate生成8:00时间和23:00时间。然后用当前时间,也许有足够的时间,以使控制。 */ -/** - * @brief 推断当前时间是否在fromHour和toHour之间。如。fromHour=8,toHour=23时。即为推断当前时间是否在8:00-23:00之间 - */ -- (BOOL)BA_time_isBetweenFromHour:(NSInteger)fromHour toHour:(NSInteger)toHour; - -/*! - * @brief 生成当天的某个点(返回的是伦敦时间,可直接与当前时间[NSDate date]比較) - * @param hour 如hour为“8”。就是上午8:00(本地时间) - */ -- (nullable NSDate *)BA_time_getCustomDateWithHour:(NSInteger)hour; - -/*! 判断日期是今天,昨天还是明天 */ -- (nullable NSString *)BA_time_compareDate:(nullable NSDate *)date; - -/*! 计算上报时间差 */ -- (nullable NSString *)BA_time_compareTime; - -/*! 解析新浪微博中的日期, 判断日期是今天,昨天还是明天 */ -+ (nullable NSString *)BA_time_resolveSinaWeiboDate:(nullable NSString*)dateStr; - - -#pragma mark - ***** 数字处理 类 -/*! 判断数字为2.1千,3.4万(点赞数处理) */ -+ (nullable NSString *)BA_stringHandleWithString:(nullable NSString *)string; - -/*! 判断是否为整形 */ -- (BOOL)BA_isPureInt:(nullable NSString*)string; - -/*! 判断是否为浮点形 */ -- (BOOL)BA_isPureFloat:(nullable NSString*)string; - - -#pragma mark - ***** 特殊字符串处理 类 - -/*! 重复字符串N次 */ -+ (nullable NSString *)getText:(nullable NSString *)text withRepeat:(int)repeat; - -/*! 去掉字符串中的html标签的方法 */ -- (nullable NSString *)BA_filterHTML:(nullable NSString *)html; - -/*! 十六进制转换为普通字符串 */ -- (nullable NSString *)BA_stringFromHexString:(nullable NSString *)hexString; +- (NSString *)ba_stringUrlEncode; /** * Create a string from the file in main bundle (similar to [UIImage imageNamed:]). @@ -263,214 +82,65 @@ * * @return A new string create from the file in UTF-8 character encoding. */ -+ (nullable NSString *)stringNamed:(nullable NSString *)name; - -/** - * Returns a lowercase NSString for md5 hash. - * - * @return Returns a lowercase NSString for md5 hash. - */ -- (nullable NSString *)BA_md5String; - -/*! - * 去除字符串的特殊字符 - * - * @param string 需要处理的字符串(如:NSString *string = @"";) - * - * @return 去除字符串的特殊字符 - */ -- (nullable NSString *)BA_trimmedString:(nullable NSString *)string; - -/*! - * 判断字符串是否为空 - * - * @param aStirng aStirng - * - * @return 判断字符串是否为空 - */ -+ (BOOL)BA_NSStringIsNULL:(nullable NSString *)aStirng; - -/*! - * 判断字符串是否为url - * - * @param url url description - * - * @return 判断字符串是否为url - */ -+ (BOOL)BA_url_isURL:(nullable NSString *)url; - -/** - * Trim blank characters (space and newline) in head and tail. - * - * @return the trimmed string. - */ -- (nullable NSString *)stringByTrim; - -/** - * Try to parse this string and returns an `NSNumber`. - * - * @return Returns an `NSNumber` if parse succeed, or nil if an error occurs. - */ -- (nullable NSNumber *)numberValue; - -/** - * Returns an NSData using UTF-8 encoding. - * - * @return Returns an NSData using UTF-8 encoding. - */ -- (nullable NSData *)dataValue; - -/*! 判断字符串是否是邮箱账号 */ -+ (BOOL)BA_isEmailString:(nullable NSString *)emailString; - -/*! 判断字符串是否是字母或数字 */ -+ (BOOL)BA_isLetterOrNumberString:(nullable NSString *)string; - -/*! 获取字符串的长度 */ -+ (NSUInteger)BA_getLengthOfStr:(nullable NSString *)str; - -/*! 判断字符串是否是手机号码 */ -+ (BOOL)BA_isMobileNumber:(nullable NSString *)mobileNum; - -/*! 特殊字符串处理:改变部分字符串的字体颜色 */ -+ (nullable NSMutableAttributedString *)BA_creatMutableAttributedString:(nullable NSString *)text textColor:(nullable UIColor *)textColor bgColor:(nullable UIColor *)bgColor font:(CGFloat)fontSize range:(NSRange)range; - -/*! - * 字典转json - * - * @param dict 传入的字典 - * - * @return 返回json字符串 - */ -+ (NSString *)ba_JsonTurnWithDictionary:(NSDictionary *)dict; - -#pragma mark - ***** 获取软件沙盒路径 类 - -/*! 获取软件沙盒路径 */ -+ (nullable NSString *)BA_path_getApplicationSupportPath; - -/*! 获取软件沙盒Documents路径 */ -+ (nullable NSString *)BA_path_getDocumentsPath; - -/*! 获取软件沙盒cache路径 */ -+ (nullable NSString *)BA_path_getCachePath; - -/*! 获取软件沙盒cachesDic路径 */ -+ (nullable NSString *)BA_path_getTemPath; - -/*! 在软件沙盒指定的路径创建一个目录 */ -+ (BOOL)BA_path_createDirectory:(nullable NSString *)newDirectory; - -/*! 在软件沙盒指定的路径删除一个目录 */ -+ (BOOL)BA_path_deleteFilesysItem:(nullable NSString*)strItem; - -/*! 在软件沙盒路径移动一个目录到另一个目录中 */ -+ (BOOL)BA_path_moveFilesysItem:(nullable NSString *)srcPath toPath:(nullable NSString *)dstPath; - -/*! 在软件沙盒路径中查看有没有这个路径 */ -+ (BOOL)BA_path_fileExist:(nullable NSString*)strPath; - -/*! 在软件沙盒路径中获取指定userPath路径 */ -- (nullable NSString *)BA_path_getUserInfoStorePath:(nullable NSString *)userPath; - -@end - -@interface NSString (BALabelWidthAndHeight) - -/** - * Get the string's height with the fixed width. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * @param width Fixed width. - * - * @return String's height. - */ -- (CGFloat)ba_heightWithStringAttribute:(NSDictionary *)attribute fixedWidth:(CGFloat)width; - -/** - * Get the string's width. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * - * @return String's width. - */ -- (CGFloat)ba_widthWithStringAttribute:(NSDictionary *)attribute; - -/** - * Get a line of text height. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * - * @return String's width. - */ -+ (CGFloat)ba_oneLineOfTextHeightWithStringAttribute:(NSDictionary *)attribute; ++ (NSString *)ba_stringNamed:(nullable NSString *)name; /** - * 拼接baseUrl,用于拼接绝对路径 - */ -- (NSString *)addBaseUrl; - -/** - * 去除掉text的开头和结尾的空格 + string Data 格式化 + + @return Data */ -- (NSString *)cutwhitespace; +- (NSData *)ba_stringDataValue; /** - * 获取文字size + 搜索两个字符之间的字符串【注意:搜索的字符串必须只能是英文】 + + @param string 需要搜索的字符串 + @param start 起点索引字符【英文字母】 + @param end 结束索引字符【英文字母】 + @return 两个字符之间的字符串 */ -- (CGSize)sizeOfMaxSize:(CGSize)maxSize fontSize:(CGFloat)fontSize; - -- (CGSize)sizeOfMaxSize:(CGSize)maxSize font:(UIFont *)font; ++ (NSString *)ba_stringSearchInString:(NSString *)string + charStart:(char)start + charEnd:(char)end; /** - * 计算一个字符串在限定的宽度和字体下的长度 - * - * @param font 限定的字体 - * @param width 限定的宽度 - * - * @return 字符串的长度 + 搜索两个字符之间的字符串 + + @param start 开始的字符 + @param end 结束的字符 + @return 两个字符之间的字符串 */ -- (NSInteger)heightWithFont:(UIFont* )font width:(CGFloat)width; - -- (NSInteger)widthWithFont:(UIFont *)font height:(CGFloat)height; +- (NSString *)ba_stringSearchCharStart:(char)start + charEnd:(char)end; /** - * 偏好设置:存字符串(手势密码) + 判断 string 是否为空 + + @return YES:不为空,NO:为空 */ -+ (void)saveString:(NSString *)string Key:(NSString *)key; +- (BOOL)ba_stringIsNotBlank; /** - * 偏好设置:取字符串 + 从身份证号码里提取 生日,默认:@"yyyy-MM-dd" + + @return 生日 */ -+ (NSString *)getStringWithKey:(NSString *)key; +- (NSDate *)ba_stringExtractBirthdayFromIDNumber; /** - * 给我一个button,让它的文字底部对应的range划线 + 从身份证号码里提取 性别 + + @return 性别 */ -+ (void)stringToBeUnderlineWithRange:(NSRange)range button:(UIButton *)btn lineColor:(UIColor *)color; -+ (void)stringToBeUnderlineWithRange:(NSRange)range button:(UIButton *)btn lineColor:(UIColor *)color controlstate:(UIControlState)state; - -// 提供0-9,转换成0,一->九 -+ (NSString *)stringChangeNumberToText:(NSInteger)number; - -+ (NSString *)checkString:(NSString *)string range:(NSRange)range str:(NSString *)str; - - -@end - - -@interface NSString (BARange) +- (NSString *)ba_stringExtractGenderFromIDNumber; /** - * Finds and returns the ranges of a given string, within the given range of the receiver. - * - * @param searchString searchString. - * @param mask A mask specifying search options. The following options may be specified by combining them with the C bitwise OR operator: NSCaseInsensitiveSearch, NSLiteralSearch, NSBackwardsSearch, NSAnchoredSearch. See String Programming Guide for details on these options. - * @param range serachRange. - * - * @return Ranges. + 从身份证号码里提取 年龄 + + @return 年龄 */ -- (NSArray *)ba_rangesOfString:(NSString *)searchString options:(NSStringCompareOptions)mask serachRange:(NSRange)range; +- (NSUInteger)ba_stringExtractAgeFromIDNumber; @end +NS_ASSUME_NONNULL_END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAKit.m" index 1ace634..425bfda 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAKit.m" @@ -1,296 +1,22 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? +// NSString+BAKit.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 博爱1616【137361770】 - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ #import "NSString+BAKit.h" -#import "NSData+BAKit.h" -#import - @implementation NSString (BAKit) -/* 搜索两个字符之间的字符串 */ -+ (NSString *)searchInString:(NSString *)string - charStart:(char)start - charEnd:(char)end -{ - int inizio = 0, stop = 0; - for(int i = 0; i < [string length]; i++) - { - // 定位起点索引字符 - if([string characterAtIndex:i] == start) - { - inizio = i+1; - i += 1; - } - // 定位结束索引字符 - if([string characterAtIndex:i] == end) - { - stop = i; - break; - } - } - stop -= inizio; - // 裁剪字符串 - NSString *string2 = [[string substringFromIndex:inizio-1] substringToIndex:stop+1]; - return string2; -} - -/* 搜索两个字符之间的字符串 */ -- (NSString *)searchCharStart:(char)start - charEnd:(char)end -{ - int inizio = 0, stop = 0; - for(int i = 0; i < [self length]; i++) - { - if([self characterAtIndex:i] == start) - { - inizio = i+1; - i += 1; - } - if([self characterAtIndex:i] == end) - { - stop = i; - break; - } - } - stop -= inizio; - NSString *string = [[self substringFromIndex:inizio-1] substringToIndex:stop+1]; - - return string; -} - -/* 创建一个MD5字符串 */ -- (NSString *)MD5 -{ - if(self == nil || [self length] == 0) - return nil; - - unsigned char digest[CC_MD5_DIGEST_LENGTH], i; - CC_MD5([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest); - NSMutableString *ms = [NSMutableString string]; - for(i=0;i= 1) { - return [NSString stringWithFormat:@"%ld小时之前",cmp.hour]; - }else if (cmp.minute > 1){ - return [NSString stringWithFormat:@"%ld分钟之前",cmp.minute]; - }else{ - return @"刚刚"; - } - - }else if ([created_at isYesterday]){ // 昨天 - fmt.dateFormat = @"昨天 HH:mm"; - return [fmt stringFromDate:created_at]; - - }else{ // 前天 - fmt.dateFormat = @"MM-dd HH:mm"; - return [fmt stringFromDate:created_at]; - } - - - - }else{ // 不是今年 - - fmt.dateFormat = @"yyyy-MM-dd HH:mm"; - - return [fmt stringFromDate:created_at]; - - } - - return dateStr; -} - -- (nullable NSString *)stringByTrim { - NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet]; - return [self stringByTrimmingCharactersInSet:set]; -} - -- (NSNumber *)numberValue -{ - return [NSNumber numberWithString:self]; -} - -- (NSData *)dataValue -{ - return [self dataUsingEncoding:NSUTF8StringEncoding]; -} - -+ (NSString *)stringNamed:(NSString *)name { NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@""]; NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL]; if (!str) { @@ -506,709 +66,176 @@ + (NSString *)stringNamed:(NSString *)name { return str; } -- (NSString *)BA_md5String -{ - return [[self dataUsingEncoding:NSUTF8StringEncoding] md5String]; -} - -- (NSString *)BA_trimmedString:(NSString *)string -{ - // 去除字符串的特殊字符 - // NSString *string = @""; - NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、<>[]{}#%-*+=_\\|~<>$?^?'@#$%^&*()_+'\""]; - NSString*trimmedString = [string stringByTrimmingCharactersInSet:set]; - BALog(@"trimmedString1:%@",trimmedString); - // 去除字符串的空格 - trimmedString = [trimmedString stringByReplacingOccurrencesOfString:@" " withString:@""]; - BALog(@"trimmedString2: %@",trimmedString); - - return trimmedString; -} - -// 获得随机字符串 -//+ (NSString *)getRandString -//{ -// NSDate * date=[NSDate date]; -// CFGregorianDate tempDate=[NSString FormatNSDate:date]; -// -// NSString * tempText=[NSString stringWithFormat:@"%04d%02d%02d%02d%02d%02d", (int)tempDate.year, tempDate.month, tempDate.day, tempDate.hour, tempDate.minute, (int)tempDate.second]; -// -// return tempText; -//} - -+ (BOOL)BA_NSStringIsNULL:(NSString *)aStirng -{ - if([aStirng isKindOfClass:[NSNull class]]) return YES; - if(![aStirng isKindOfClass:[NSString class]]) return YES; - - if(aStirng == nil) return YES; - - NSUInteger len = aStirng.length; - if (len <= 0) return YES; - return NO; -} - -+ (BOOL)BA_url_isURL:(NSString *)url -{ - if([self BA_NSStringIsNULL:url]) return NO; - - if([url rangeOfString:@"http://" options:NSCaseInsensitiveSearch].location != NSNotFound) - return YES; - return NO; -} - -/*! 一般应用程序设置这一组的存在,比如夜间模式,如果你。从8:00-23:00。在这个当前的时间是如何推断出期间。主要的困难在于如何使用NSDate生成8:00时间和23:00时间。然后用当前时间,也许有足够的时间,以使控制。 */ /** - * @brief 推断当前时间是否在fromHour和toHour之间。如。fromHour=8,toHour=23时。即为推断当前时间是否在8:00-23:00之间 + string Data 格式化 + + @return Data */ -- (BOOL)BA_time_isBetweenFromHour:(NSInteger)fromHour toHour:(NSInteger)toHour +- (NSData *)ba_stringDataValue { - NSDate *date8 = [self BA_time_getCustomDateWithHour:8]; - NSDate *date23 = [self BA_time_getCustomDateWithHour:23]; - - NSDate *currentDate = [NSDate date]; - - if ([currentDate compare:date8]==NSOrderedDescending && [currentDate compare:date23]==NSOrderedAscending) - { - BALog(@"该时间在 %ld:00-%ld:00 之间!", (long)fromHour, (long)toHour); - return YES; - } - return NO; + return [self dataUsingEncoding:NSUTF8StringEncoding]; } /** - * @brief 生成当天的某个点(返回的是伦敦时间,可直接与当前时间[NSDate date]比較) - * @param hour 如hour为“8”。就是上午8:00(本地时间) - */ -- (NSDate *)BA_time_getCustomDateWithHour:(NSInteger)hour -{ - //获取当前时间 - NSDate *currentDate = [NSDate date]; - NSCalendar *currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - NSDateComponents *currentComps = [[NSDateComponents alloc] init]; - - NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; - - currentComps = [currentCalendar components:unitFlags fromDate:currentDate]; - - //设置当天的某个点 - NSDateComponents *resultComps = [[NSDateComponents alloc] init]; - [resultComps setYear:[currentComps year]]; - [resultComps setMonth:[currentComps month]]; - [resultComps setDay:[currentComps day]]; - [resultComps setHour:hour]; - - NSCalendar *resultCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; - return [resultCalendar dateFromComponents:resultComps]; -} + 搜索两个字符之间的字符串【注意:搜索的字符串必须只能是英文】 -/*! 判断日期是今天,昨天还是明天 */ -- (NSString *)BA_time_compareDate:(NSDate *)date + @param string 需要搜索的字符串 + @param start 起点索引字符【英文字母】 + @param end 结束索引字符【英文字母】 + @return 两个字符之间的字符串 + */ ++ (NSString *)ba_stringSearchInString:(NSString *)string + charStart:(char)start + charEnd:(char)end { - NSTimeInterval secondsPerDay = 24 * 60 * 60; - NSDate *today = [[NSDate alloc] init]; - NSDate *tomorrow, *yesterday; - - tomorrow = [today dateByAddingTimeInterval: secondsPerDay]; - yesterday = [today dateByAddingTimeInterval: -secondsPerDay]; - - // 10 first characters of description is the calendar date: - NSString * todayString = [[today description] substringToIndex:10]; - NSString * yesterdayString = [[yesterday description] substringToIndex:10]; - NSString * tomorrowString = [[tomorrow description] substringToIndex:10]; - - NSString * dateString = [[date description] substringToIndex:10]; - - if ([dateString isEqualToString:todayString]) - { - return @"今天"; - } else if ([dateString isEqualToString:yesterdayString]) - { - return @"昨天"; - }else if ([dateString isEqualToString:tomorrowString]) - { - return @"明天"; - } - else + int inizio = 0, stop = 0; + for(int i = 0; i < [string length]; i++) { - return dateString; + // 定位起点索引字符 + if([string characterAtIndex:i] == start) + { + inizio = i+1; + i += 1; + } + // 定位结束索引字符 + if([string characterAtIndex:i] == end) + { + stop = i; + break; + } } + stop -= inizio; + // 裁剪字符串 + NSString *string2 = [[string substringFromIndex:inizio-1] substringToIndex:stop+1]; + return string2; } -/*! 计算上报时间差 */ -- (NSString *)BA_time_compareTime -{ - // 计算上报时间差 - NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; - // 设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制 - [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; - NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"]; - [formatter setTimeZone:timeZone]; - NSDate *datenow = [NSDate date]; - // 设置一个字符串的时间 - NSMutableString *datestring = [NSMutableString stringWithFormat:@"%ld",20141202052740]; - // 注意 如果20141202052740必须是数字,如果是UNIX时间,不需要下面的插入字符串。 - [datestring insertString:@"-" atIndex:4]; - [datestring insertString:@"-" atIndex:7]; - [datestring insertString:@" " atIndex:10]; - [datestring insertString:@":" atIndex:13]; - [datestring insertString:@":" atIndex:16]; - BALog(@"datestring==%@",datestring); - NSDateFormatter * dm = [[NSDateFormatter alloc]init]; - - //指定输出的格式 这里格式必须是和上面定义字符串的格式相同,否则输出空 - [dm setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; - NSDate * newdate = [dm dateFromString:datestring]; - long dd = (long)[datenow timeIntervalSince1970] - [newdate timeIntervalSince1970]; - NSString *timeString=@""; - if (dd/3600<1) - { - timeString = [NSString stringWithFormat:@"%ld", dd/60]; - timeString=[NSString stringWithFormat:@"%@分钟前", timeString]; - } - if (dd/3600>1&&dd/86400<1) - { - timeString = [NSString stringWithFormat:@"%ld", dd/3600]; - timeString=[NSString stringWithFormat:@"%@小时前", timeString]; - } - if (dd/86400>1) - { - timeString = [NSString stringWithFormat:@"%ld", dd/86400]; - timeString=[NSString stringWithFormat:@"%@天前", timeString]; - } - BALog(@"=====%@",timeString); - return timeString; -} +/** + 搜索两个字符之间的字符串 -#pragma mark - ***** 数字处理 类 -/*! 判断数字为2.1千,3.4万(点赞数处理) */ -+ (NSString *)BA_stringHandleWithString:(NSString *)string + @param start 开始的字符 + @param end 结束的字符 + @return 两个字符之间的字符串 + */ +- (NSString *)ba_stringSearchCharStart:(char)start + charEnd:(char)end { - float number = [string integerValue]; - - NSString *numberString = @""; - if (number<1000) + int inizio = 0, stop = 0; + for(int i = 0; i < [self length]; i++) { - numberString = [NSString stringWithFormat:@"%.0f", number]; - } - else - if (number/1000 && number/10000 <1) + if([self characterAtIndex:i] == start) { - numberString = [NSString stringWithFormat:@"%.1f千", number/1000]; + inizio = i+1; + i += 1; } - else + if([self characterAtIndex:i] == end) { - numberString = [NSString stringWithFormat:@"%.1f万", number/10000]; + stop = i; + break; } - - return numberString; -} - -/*! 判断是否为整形 */ -- (BOOL)BA_isPureInt:(NSString*)string -{ - NSScanner* scan = [NSScanner scannerWithString:string]; - int val; - return [scan scanInt:&val] && [scan isAtEnd]; -} - -/*! 判断是否为浮点形 */ -- (BOOL)BA_isPureFloat:(NSString*)string -{ - NSScanner* scan = [NSScanner scannerWithString:string]; - float val; - return [scan scanFloat:&val] && [scan isAtEnd]; -} - -#pragma mark - ***** 特殊字符串处理 类 -/*! 去掉字符串中的html标签的方法 */ -- (NSString *)BA_filterHTML:(NSString *)html -{ - NSScanner * scanner = [NSScanner scannerWithString:html]; - NSString * text = nil; - while([scanner isAtEnd]==NO) - { - //找到标签的起始位置 - [scanner scanUpToString:@"<" intoString:nil]; - //找到标签的结束位置 - [scanner scanUpToString:@">" intoString:&text]; - //替换字符 - html = [html stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>",text] withString:@""]; } - // NSString * regEx = @"<([^>]*)>"; - // html = [html stringByReplacingOccurrencesOfString:regEx withString:@""]; - html = [html stringByReplacingOccurrencesOfString:@" " withString:@""]; //去掉html里面的空格 - html = [html stringByReplacingOccurrencesOfString:@"\n" withString:@""]; //去掉换行 + stop -= inizio; + NSString *string = [[self substringFromIndex:inizio-1] substringToIndex:stop+1]; - html = [html stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; //去掉前后两边空白 - // BALog(@"html:------------%@",html); - return html; + return string; } -/*! 十六进制转换为普通字符串 */ -- (NSString *)BA_stringFromHexString:(NSString *)hexString -{ - char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1); - bzero(myBuffer, [hexString length] / 2 + 1); - for (int i = 0; i < [hexString length] - 1; i += 2) { - unsigned int anInt; - NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)]; - NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr]; - [scanner scanHexInt:&anInt]; - myBuffer[i / 2] = (char)anInt; - } - NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4]; - BALog(@"------字符串=======%@",unicodeString); - return unicodeString; -} +/** + 判断 string 是否为空 -/*! - * 字典转json - * - * @param dict 传入的字典 - * - * @return 返回json字符串 + @return YES:不为空,NO:为空 */ -+ (NSString *)ba_JsonTurnWithDictionary:(NSDictionary *)dict -{ - NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil]; - - NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; - NSLog(@"字典转json:%@!", jsonStr); - - return jsonStr; -} - -/*! 获取软件沙盒路径 */ -+ (NSString *)BA_path_getApplicationSupportPath +- (BOOL)ba_stringIsNotBlank { - //such as:../Applications/9A425424-645E-4337-8730-8A080DF086F4/Library/Application Support - - NSArray* libraryPaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSAllDomainsMask, YES); - - NSString *path = nil; - if ([libraryPaths count] > 0) { - path = [libraryPaths objectAtIndex:0]; - } - - if (![self BA_path_fileExist:path]) { - [self BA_path_createDirectory:path]; + NSCharacterSet *blank = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + for (NSInteger i = 0; i < self.length; ++i) { + unichar c = [self characterAtIndex:i]; + if (![blank characterIsMember:c]) { + return YES; + } } - - return path; -} - -/*! 获取软件沙盒Documents路径 */ -+ (NSString *)BA_path_getDocumentsPath -{ - NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]; - - //such as:../Applications/9A425424-645E-4337-8730-8A080DF086F4/Documents - return documentPath; -} - -/*! 获取软件沙盒cache路径 */ -+ (NSString *)BA_path_getCachePath -{ - // such as : ../Applications/9A425424-645E-4337-8730-8A080DF086F4/Library/Caches - NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) objectAtIndex:0]; - return cachePath; -} - -/*! 获取软件沙盒cachesDic路径 */ -+ (NSString *)BA_path_getTemPath -{ - NSString *cachesDic = NSTemporaryDirectory(); - return cachesDic; + return NO; } -/*! 在软件沙盒指定的路径创建一个目录 */ -+ (BOOL)BA_path_createDirectory:(NSString *)newDirectory -{ - if([self BA_path_fileExist:newDirectory]) return YES; - - NSError * error = nil; - BOOL finished = [[NSFileManager defaultManager] createDirectoryAtPath:newDirectory - withIntermediateDirectories:YES - attributes:nil - error:&error]; - return finished; -} +/** + 从身份证号码里提取 生日,默认:@"yyyy-MM-dd" -/*! 在软件沙盒指定的路径删除一个目录 */ -+ (BOOL)BA_path_deleteFilesysItem:(NSString*)strItem + @return 生日 + */ +- (NSDate *)ba_stringExtractBirthdayFromIDNumber { - if ([strItem length] == 0) { - return YES; + NSString *result = @""; + NSDate *date; + if (self.length == 15) + { + result = [NSString stringWithFormat:@"19%@", [self substringWithRange:NSMakeRange(6, 6)]]; } - - NSError * error = nil; - - BOOL finished = [[NSFileManager defaultManager] removeItemAtPath:strItem error:&error]; - return finished; -} - -/*! 在软件沙盒路径移动一个目录到另一个目录中 */ -+ (BOOL)BA_path_moveFilesysItem:(NSString *)srcPath toPath:(NSString *)dstPath -{ - if (![self BA_path_fileExist:srcPath]) return NO; - - NSError * error = nil; - return [[NSFileManager defaultManager] moveItemAtPath:srcPath - toPath:dstPath - error:&error]; -} - -/*! 在软件沙盒路径中查看有没有这个路径 */ -+ (BOOL)BA_path_fileExist:(NSString*)strPath -{ - NSFileManager *file_manager = [NSFileManager defaultManager]; - BOOL finded = [file_manager fileExistsAtPath:strPath]; - return finded; -} - -/*! 在软件沙盒路径中获取指定userPath路径 */ -- (NSString *)BA_path_getUserInfoStorePath:(NSString *)userPath -{ - NSString *destPath = [NSString BA_path_getDocumentsPath]; - NSString *userInfoPath = [destPath stringByAppendingString:[NSString stringWithFormat:@"/%@", userPath]]; - return userInfoPath; -} - -/*! 判断字符串是否是邮箱账号 */ -+ (BOOL)BA_isEmailString:(NSString *)emailString -{ - NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; - NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; - return [emailTest evaluateWithObject:emailString]; -} - -/*! 判断字符串是否是字母或数字 */ -+ (BOOL)BA_isLetterOrNumberString:(NSString *)string -{ - NSString *letterOrNumberRegex = @"[A-Z0-9a-z]+"; - NSPredicate *letterOrNumberTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", letterOrNumberRegex]; - return [letterOrNumberTest evaluateWithObject:string]; -} - -/*! 获取字符串的长度 */ -+ (NSUInteger)BA_getLengthOfStr:(NSString*)str -{ - NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); - NSData* da = [str dataUsingEncoding:enc]; - return [da length]; -} - -/*! 判断字符串是否是手机号码 */ -+ (BOOL)BA_isMobileNumber:(NSString *)mobileNum -{ - /* - 13 14 15 16 17 18 开头号码段 - */ - NSString *phoneRegex = @"^1[34578]\\d{9}$"; - NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex]; - return [phoneTest evaluateWithObject:mobileNum]; -} - -/*! 特殊字符串处理:改变部分字符串的字体颜色 */ -+ (NSMutableAttributedString *)BA_creatMutableAttributedString:(NSString *)text textColor:(UIColor *)textColor bgColor:(UIColor *)bgColor font:(CGFloat)fontSize range:(NSRange)range -{ - NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc]initWithString:text]; - - [attributedStr addAttributes:@{NSForegroundColorAttributeName:textColor,NSBackgroundColorAttributeName:bgColor, NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} range:range]; - return attributedStr; -} - -/*! 重复字符串N次 */ -+ (NSString *)getText:(NSString *)text withRepeat:(int)repeat -{ - NSMutableString *String = [NSMutableString new]; - - for (int i = 0; i < repeat; i++) { - [String appendString:text]; + else if (self.length == 18) + { + result = [self substringWithRange:NSMakeRange(6, 8)]; } - - return String; + date = [result ba_time_dateWithFormat:@"yyyyMMdd" timezoneName:@"Asia/Shanghai"]; + return date; } -@end - -@implementation NSString (BALabelWidthAndHeight) - /** - * Get the string's height with the fixed width. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * @param width Fixed width. - * - * @return String's height. + 从身份证号码里提取 性别 + + @return 性别 */ -- (CGFloat)ba_heightWithStringAttribute:(NSDictionary *)attribute fixedWidth:(CGFloat)width +- (NSString *)ba_stringExtractGenderFromIDNumber { - NSParameterAssert(attribute); - CGFloat height = 0; - - if (self.length) + if (![BAKit_RegularExpression ba_regularIsIdCardNumberQualified:self]) { - CGRect rect = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil]; - height = rect.size.height; + return nil; } - return height; -} - -/** - * Get the string's width. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * - * @return String's width. - */ -- (CGFloat)ba_widthWithStringAttribute:(NSDictionary *)attribute -{ - NSParameterAssert(attribute); - CGFloat width = 0; - - if (self.length) + if (self.length == 15) { - CGRect rect = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil]; - - width = rect.size.width; + return [[self substringFromIndex:14] intValue] % 2 > 0 ? @"男" : @"女"; + } + else if (self.length == 18) + { + return [[self substringWithRange:NSMakeRange(16, 1)] intValue] % 2 > 0 ? @"男" : @"女"; } - return width; + return @""; } /** - * Get a line of text height. - * - * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} - * - * @return String's width. - */ -+ (CGFloat)ba_oneLineOfTextHeightWithStringAttribute:(NSDictionary *)attribute -{ - CGFloat height = 0; - - CGRect rect = [@"One" boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil]; - - height = rect.size.height; - - return height; -} - -//- (NSString *)addBaseUrl -//{ -// NSString *string = [NSString stringWithFormat:@"%@/%@",Base_URL,self]; -// -// return [string stringByReplacingOccurrencesOfString:@"//" withString:@"/"]; -//} - -- (NSString *)cutwhitespace -{ - return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; -} - -//计算文本的大小 -- (CGSize)sizeOfMaxSize:(CGSize)maxSize fontSize:(CGFloat)fontSize -{ - return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil].size; -} -- (CGSize)sizeOfMaxSize:(CGSize)maxSize font:(UIFont *)font -{ - return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size; -} -- (NSInteger)heightWithFont:(UIFont* )font width:(CGFloat)width { - - CGRect bounds = CGRectZero; - bounds = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; - return ceilf(bounds.size.height); -} + 从身份证号码里提取 年龄 -- (NSInteger)widthWithFont:(UIFont *)font height:(CGFloat)height -{ - CGRect bounds = CGRectZero; - - bounds = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, height) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; - - return ceilf(bounds.size.width); -} - -+ (void)saveString:(NSString *)string Key:(NSString *)key -{ - [[NSUserDefaults standardUserDefaults] setObject:string forKey:key]; - [[NSUserDefaults standardUserDefaults] synchronize]; -} - -+ (NSString *)getStringWithKey:(NSString *)key -{ - return [[NSUserDefaults standardUserDefaults] objectForKey:key]; -} - -+ (void)stringToBeUnderlineWithRange:(NSRange)range button:(UIButton *)btn lineColor:(UIColor *)color -{ - NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:btn.titleLabel.text]; - [str addAttribute:NSUnderlineColorAttributeName value:color range:range]; - [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; - [btn setAttributedTitle:str forState:UIControlStateNormal]; -} - -+ (void)stringToBeUnderlineWithRange:(NSRange)range button:(UIButton *)btn lineColor:(UIColor *)color controlstate:(UIControlState)state -{ - NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:btn.titleLabel.text]; - [str addAttribute:NSUnderlineColorAttributeName value:color range:range]; - [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; - [btn setAttributedTitle:str forState:state]; -} - -+ (NSString *)stringChangeNumberToText:(NSInteger)number + @return 年龄 + */ +- (NSUInteger)ba_stringExtractAgeFromIDNumber { - NSString *str = [NSString stringWithFormat:@"%ld", (long)number]; - - NSRange range; - range.length = 1; - - NSString *finalStr = [NSString string]; - - for (NSUInteger i = 0; i < [str length]; i++) { - range.location = i; - NSString *subStr = [str substringWithRange:range]; - NSInteger subNum = [subStr integerValue]; - - switch (subNum) { - case 0: - subStr = [NSString checkString:@"零" range:range str:str]; - break; - case 1: - subStr = [NSString checkString:@"一" range:range str:str]; - break; - case 2: - subStr = [NSString checkString:@"二" range:range str:str]; - break; - case 3: - subStr = [NSString checkString:@"三" range:range str:str]; - break; - case 4: - subStr = [NSString checkString:@"四" range:range str:str]; - break; - case 5: - subStr = [NSString checkString:@"五" range:range str:str]; - break; - case 6: - subStr = [NSString checkString:@"六" range:range str:str]; - break; - case 7: - subStr = [NSString checkString:@"七" range:range str:str]; - break; - case 8: - subStr = [NSString checkString:@"八" range:range str:str]; - break; - case 9: - subStr = [NSString checkString:@"九" range:range str:str]; - break; - default: - break; - } - - finalStr = [finalStr stringByAppendingString:subStr]; + if (self.length != 15 && self.length != 18) + { + return 0; } - - return finalStr; -} - -+ (NSString *)checkString:(NSString *)string range:(NSRange)range str:(NSString *)str -{ - NSString *subStr; - - if (str.length == 1) { - subStr = string; - } else if (str.length == 2) { - if (range.location == 0) { - subStr = [NSString stringWithFormat:@"%@十", string]; - } else if (range.location == 1){ - subStr = string; - } - } else if (str.length == 3) { - if (range.location == 0) { - subStr = [NSString stringWithFormat:@"%@百", string]; - } else if (range.location == 1){ - subStr = [NSString stringWithFormat:@"%@十", string]; - } else if (range.location == 2){ - subStr = string; - } + NSDate *birthday; + if (self.length == 15) + { + // FIRST GENERATION ID + birthday = [[NSString stringWithFormat:@"19%@", [self substringWithRange:NSMakeRange(6, 6)]] ba_time_dateWithFormat:@"yyyyMMdd" timezoneName:@"Asia/Shanghai"]; + } + else if (self.length == 18) + { + // SECOND GENERATION ID + birthday = [[self substringWithRange:NSMakeRange(6, 8)] ba_time_dateWithFormat:@"yyyyMMdd" timezoneName:@"Asia/Shanghai"]; } - return subStr; -} - -- (id)MD5 -{ - const char *cStr = [self UTF8String]; - unsigned char digest[16]; - CC_MD5( cStr, (unsigned int)strlen(cStr), digest ); // This is the md5 call - - NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; - for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) - [output appendFormat:@"%02x", digest[i]]; + NSDateComponents *cpBirthday = [[NSCalendar currentCalendar] components:(NSCalendarUnitDay|NSCalendarUnitMonth|NSCalendarUnitYear) fromDate:birthday]; + NSDateComponents *cpToday = [[NSCalendar currentCalendar] components:(NSCalendarUnitDay|NSCalendarUnitMonth|NSCalendarUnitYear) fromDate:[NSDate date]]; - return output; -} - -- (BOOL)isChinese{ - NSString *match=@"(^[\u4e00-\u9fa5]+$)"; - NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match]; - return [predicate evaluateWithObject:self]; -} - -//- (NSString *)absolutePath -//{ -// if (![self hasPrefix:@"http"]) { -// NSString *fullUrl = [NSString stringWithFormat:@"%@%@",Base_URL,self]; -// return fullUrl; -// } -// return self; -//} - - -@end - - -@implementation NSString (BARange) - -/** - * Finds and returns the ranges of a given string, within the given range of the receiver. - * - * @param searchString searchString. - * @param mask A mask specifying search options. The following options may be specified by combining them with the C bitwise OR operator: NSCaseInsensitiveSearch, NSLiteralSearch, NSBackwardsSearch, NSAnchoredSearch. See String Programming Guide for details on these options. - * @param range serachRange. - * - * @return Ranges. - */ -- (NSArray *)ba_rangesOfString:(NSString *)searchString options:(NSStringCompareOptions)mask serachRange:(NSRange)range -{ - NSMutableArray *array = [NSMutableArray array]; - [self ba_rangeOfString:searchString range:NSMakeRange(0, self.length) array:array options:mask]; + NSUInteger age = cpToday.year - cpBirthday.year - 1; + if ((cpToday.month > cpBirthday.month) || (cpToday.month == cpBirthday.month && cpToday.day >= cpBirthday.day)) { + age++; + } - return array; + return age; } -- (void)ba_rangeOfString:(NSString *)searchString - range:(NSRange)searchRange - array:(NSMutableArray *)array - options:(NSStringCompareOptions)mask -{ - - NSRange range = [self rangeOfString:searchString options:mask range:searchRange]; - - if (range.location != NSNotFound) { - - [array addObject:[NSValue valueWithRange:range]]; - [self ba_rangeOfString:searchString - range:NSMakeRange(range.location + range.length, self.length - (range.location + range.length)) - array:array - options:mask]; - } -} @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.h" new file mode 100644 index 0000000..b89ccb3 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.h" @@ -0,0 +1,141 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BANSNumber) +/*! + + 封装说明: + 所有 数字 类型的字符处理类,包含:手机号码格式化、数字格式化等 + + */ + + +/*! + 注意:中英文输出样式不一样,如果有国际化的请注意输出样式, + 本样式为中文输出环境,模拟器可能输出为英文样式 + */ + +/*! 手机号码格式化样式:344【中间空格】,示例:13855556666 --> 138 5555 6666 */ ++ (NSString *)ba_phoneNumberFormatterSpace:(NSString *)phoneNumber; + +/*! 手机号码格式化样式:3*4【中间4位为*】,示例:13855556666 --> 138****6666 */ ++ (NSString *)ba_phoneNumberFormatterCenterStar:(NSString *)phoneNumber; + +/*! 数字格式化样式,示例:12345678.89 --> 12,345,678.89 */ ++ (NSString *)ba_stringFormatterWithStyle:(NSNumberFormatterStyle)numberStyle numberString:(NSString *)numberString; + +/*! 格式化为带小数点的数字,示例:12345678.89 --> 12,345,678.89 */ ++ (NSString *)ba_stringFormatterWithDecimalStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为货币样式,示例:12345678.89 --> 12,345,678.89 */ ++ (NSString *)ba_stringFormatterWithCurrencyStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为百分比样式,示例:12345678.89 --> 1,234,567,889% */ ++ (NSString *)ba_stringFormatterWithPercentStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为科学计数样式,示例:12345678.89 --> 1.234567889E7 */ ++ (NSString *)ba_stringFormatterWithScientificStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为英文输出样式(注:此处根据系统语言输出),示例:12345678.89 --> 一千二百三十四万五千六百七十八点八九 */ ++ (NSString *)ba_stringFormatterWithSpellOutStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为序数样式,示例:12345678.89 --> 第1234,5679 */ ++ (NSString *)ba_stringFormatterWithOrdinalStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为货币ISO代码样式样式,示例:123456889.86 --> CNY123,456,889.86 */ ++ (NSString *)ba_stringFormatterWithCurrencyISOCodeStyleWithNumberString:(NSString *)numberString; + +/*! 格式化为货币多样式,示例:12345678.89 --> USD 12,345,678.89 */ ++ (NSString *)ba_stringFormatterWithCurrencyPluralStyleWithNumberString:(NSString *)numberString; + +/*! 保留纯数字 */ +- (NSString *)ba_removeStringSaveNumber; + +#pragma mark - 点赞数处理:2.1千,3.4万 +/** + 点赞数处理:2.1千,3.4万 + + @param string 传入的 string 类型的 数字 + @return 2.1千,3.4万 + */ ++ (NSString *)ba_stringTransformNumberWithString:(NSString *)string; + +#pragma mark - 判断是否为 int 类型 +/** + 判断是否为 int 类型 + + @param string 传入的 string 类型的 数字 + @return YES、NO + */ ++ (BOOL)ba_stringIsInt:(NSString*)string; + +#pragma mark - 判断是否为 float 类型 +/** + 判断是否为 float 类型 + + @param string 传入的 string 类型的 数字 + @return YES、NO + */ ++ (BOOL)ba_stringIsFloat:(NSString*)string; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.m" new file mode 100644 index 0000000..9b5c7a9 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BANSNumber.m" @@ -0,0 +1,247 @@ +// +// NSString+BANSNumber.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BANSNumber.h" + +@implementation NSString (BANSNumber) + +#pragma mark - ***** 手机号码格式化样式:344【中间空格】,示例:13855556666 --> 138 5555 6666 ++ (NSString *)ba_phoneNumberFormatterSpace:(NSString *)phoneNumber +{ + NSString *phone = phoneNumber; + + while (phone.length > 0) + { + NSString *subString = [phone substringToIndex:MIN(phone.length, 3)]; + if (phone.length >= 7 ) + { + subString = [subString stringByAppendingString:@" "]; + subString = [subString stringByAppendingString:[phone substringWithRange:NSMakeRange(3, 4)]]; + } + if ( phone.length == 11 ) + { + subString = [subString stringByAppendingString:@" "]; + subString = [subString stringByAppendingString:[phone substringWithRange:NSMakeRange(7, 4)]]; + phone = subString; + break; + } + } + + return phone; +} + +#pragma mark - ***** 手机号码格式化样式:3*4【中间4位为*】,示例:13855556666 --> 138****6666 ++ (NSString *)ba_phoneNumberFormatterCenterStar:(NSString *)phoneNumber +{ + NSString *phone = phoneNumber; + + while (phone.length > 0) + { + phone = [phone stringByReplacingCharactersInRange:NSMakeRange(3, 4) withString:@"****"]; + break; + } + + return phone; +} + +#pragma mark - ***** 数字格式化样式,示例:12345678.89 --> 12,345,678.89 ++ (NSString *)ba_stringFormatterWithStyle:(NSNumberFormatterStyle)numberStyle numberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = numberStyle; + NSString *string = [formatter stringFromNumber:number]; + + return string; +} + +#pragma mark - ***** 格式化为带小数点的数字,示例:12345678.89 --> 12,345,678.89 ++ (NSString *)ba_stringFormatterWithDecimalStyleWithNumberString:(NSString *)numberString +{ +// NSString *numString = [NSString stringWithFormat:@"%@",@"12345678.89"]; +// NSString *numString = numberString; +// NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; +// NSNumber *number = [formatter numberFromString:numString]; +// formatter.numberStyle = NSNumberFormatterDecimalStyle; +// NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 12,345,678.89 */ + return [NSString ba_stringFormatterWithStyle:NSNumberFormatterDecimalStyle numberString:numberString]; +} + +#pragma mark - ***** 格式化为货币样式,示例:12345678.89 --> $12,345,678.89 ++ (NSString *)ba_stringFormatterWithCurrencyStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterCurrencyStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 12,345,678.89 */ + return string; +} + +#pragma mark - ***** 格式化为百分比样式,示例:12345678.89 --> 1,234,567,889% ++ (NSString *)ba_stringFormatterWithPercentStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterPercentStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 1,234,567,889% */ + return string; +} + +#pragma mark - ***** 格式化为科学计数样式,示例:12345678.89 --> 1.234567889E7 ++ (NSString *)ba_stringFormatterWithScientificStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterScientificStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 1.234567889E7 */ + return string; +} + +#pragma mark - ***** 格式化为英文输出样式(注:此处根据系统语言输出),示例:12345678.89 --> 一千二百三十四万五千六百七十八点八九 ++ (NSString *)ba_stringFormatterWithSpellOutStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterSpellOutStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == twelve million three hundred forty-five thousand six hundred seventy-eight point eight nine */ + return string; +} + +#pragma mark - ***** 格式化为序数样式,示例:12345678.89 --> 第1234,5679 ++ (NSString *)ba_stringFormatterWithOrdinalStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterOrdinalStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 第1234,5679 */ + return string; +} + +#pragma mark - ***** 格式化为货币ISO代码样式样式,示例:123456889.86 --> CNY123,456,889.86 ++ (NSString *)ba_stringFormatterWithCurrencyISOCodeStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterCurrencyISOCodeStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 12,345,679 */ + return string; +} + +#pragma mark - ***** 格式化为货币多样式,示例:12345678.89 --> USD 12,345,678.89 ++ (NSString *)ba_stringFormatterWithCurrencyPluralStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterCurrencyPluralStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == USD 12,345,678.89 */ + return string; +} + +#pragma mark - ***** 格式化为货币会计样式,示例:12345678.89 --> 12,345,678.89美元 ++ (NSString *)ba_stringFormatterWithCurrencyAccountingStyleWithNumberString:(NSString *)numberString +{ + NSString *numString = numberString; + NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; + NSNumber *number = [formatter numberFromString:numString]; + formatter.numberStyle = NSNumberFormatterCurrencyAccountingStyle; + NSString *string = [formatter stringFromNumber:number]; + + /*! 输出结果示例:numberFormatter == 12,345,678.89美元 */ + return string; +} + +#pragma mark - 保留纯数字 +- (NSString *)ba_removeStringSaveNumber +{ + NSCharacterSet *setToRemove = [[ NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet ]; + return [[self componentsSeparatedByCharactersInSet:setToRemove] componentsJoinedByString:@""]; +} + +#pragma mark - 点赞数处理:2.1千,3.4万 +/** + 点赞数处理:2.1千,3.4万 + + @param string 传入的 string 类型的 数字 + @return 2.1千,3.4万 + */ ++ (NSString *)ba_stringTransformNumberWithString:(NSString *)string +{ + float number = [string integerValue]; + + NSString *numberString = @""; + if (number < 1000) + { + numberString = [NSString stringWithFormat:@"%.0f", number]; + } + else + if (number / 1000 && number / 10000 < 1) + { + numberString = [NSString stringWithFormat:@"%.1f千", number/1000]; + } + else + { + numberString = [NSString stringWithFormat:@"%.1f万", number/10000]; + } + + return numberString; +} + +#pragma mark - 判断是否为 int 类型 +/** + 判断是否为 int 类型 + + @param string 传入的 string 类型的 数字 + @return YES、NO + */ ++ (BOOL)ba_stringIsInt:(NSString*)string +{ + NSScanner* scan = [NSScanner scannerWithString:string]; + int val; + return [scan scanInt:&val] && [scan isAtEnd]; +} + +#pragma mark - 判断是否为 float 类型 +/** + 判断是否为 float 类型 + + @param string 传入的 string 类型的 数字 + @return YES、NO + */ ++ (BOOL)ba_stringIsFloat:(NSString*)string +{ + NSScanner* scan = [NSScanner scannerWithString:string]; + float val; + return [scan scanFloat:&val] && [scan isAtEnd]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.h" new file mode 100644 index 0000000..5183f46 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.h" @@ -0,0 +1,78 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +#import +#import + +@interface NSString (BARange) + +/** +  * 在接收器的给定范围内查找并返回给定字符串的范围 +  * +  * @param searchString searchString。 + * @param options 指定搜索选项的掩码。 可以通过将它们与C位OR运算符组合来指定以下选项:NSCaseInsensitiveSearch,NSLiteralSearch,NSBackwardsSearch,NSAnchoredSearch。 有关这些选项的详细信息,请参阅“String Programming Guide” +  * @param serachRange serachRange +  * +  * @return 范围 +  */ +- (NSArray *)ba_rangesOfString:(NSString *)searchString + options:(NSStringCompareOptions)options + serachRange:(NSRange)serachRange; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.m" new file mode 100644 index 0000000..b56c9c6 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARange.m" @@ -0,0 +1,56 @@ +// +// NSString+BARange.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BARange.h" + +@implementation NSString (BARange) + +/** +  * 在接收器的给定范围内查找并返回给定字符串的范围 +  * +  * @param searchString searchString。 + * @param options 指定搜索选项的掩码。 可以通过将它们与C位OR运算符组合来指定以下选项:NSCaseInsensitiveSearch,NSLiteralSearch,NSBackwardsSearch,NSAnchoredSearch。 有关这些选项的详细信息,请参阅“String Programming Guide” +  * @param serachRange serachRange +  * +  * @return 范围 +  */ +- (NSArray *)ba_rangesOfString:(NSString *)searchString + options:(NSStringCompareOptions)options + serachRange:(NSRange)serachRange +{ + if (serachRange.location == NSNotFound) + { + serachRange = NSMakeRange(0, self.length); + } + NSMutableArray *array = [NSMutableArray array]; + [self ba_rangeOfString:searchString range:serachRange array:array options:options]; + + return array; +} + +- (void)ba_rangeOfString:(NSString *)searchString + range:(NSRange)searchRange + array:(NSMutableArray *)array + options:(NSStringCompareOptions)mask +{ + + NSRange range = [self rangeOfString:searchString options:mask range:searchRange]; + + if (range.location != NSNotFound) + { + + [array addObject:[NSValue valueWithRange:range]]; + [self ba_rangeOfString:searchString + range:NSMakeRange(range.location + range.length, self.length - (range.location + range.length)) + array:array + options:mask]; + } +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.h" new file mode 100644 index 0000000..b029d00 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.h" @@ -0,0 +1,76 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BARegular) + +/** + * 返回正则表达式匹配的第一个结果 + * + * @param pattern 正则表达式 + * + * @return 匹配的第一个结果 是 NSTextCheckingResult 类型 + */ +- (NSTextCheckingResult *)ba_regularFirstMacthWithPattern:(NSString *)pattern; + +- (NSArray *)ba_regularMachesWithPattern:(NSString *)pattern; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.m" new file mode 100644 index 0000000..8d07b96 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BARegular.m" @@ -0,0 +1,52 @@ +// +// NSString+BARegular.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BARegular.h" + +@implementation NSString (BARegular) + +- (NSTextCheckingResult *)ba_regularFirstMacthWithPattern:(NSString *)pattern +{ + //正则表达式的创建很容易失败,注意捕获错误 + NSError *error = nil; + //根据正则表达式创建实例 + NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; + if ( error) + { + NSLog(@"正则表达式创建失败"); + + return nil; + } + //匹配出结果 + NSTextCheckingResult *result = [regular firstMatchInString:self options:0 range:NSMakeRange(0, self.length)]; + + if ( result) + { + NSLog(@"匹配"); + return result; + }else + { + NSLog(@"不匹配"); + return nil; + } +} + +- (NSArray *)ba_regularMachesWithPattern:(NSString *)pattern +{ + NSError *error = nil; + NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; + if (error) + { + NSLog(@"正则表达式创建失败"); + return nil; + } + return [expression matchesInString:self options:0 range:NSMakeRange(0, self.length)]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.h" new file mode 100644 index 0000000..d2e0da8 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.h" @@ -0,0 +1,140 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BASize) + +/** + 获取文字 size,根据字体大小 + + @param maxSize 最大的 size + @param fontSize 字体大小 + @return 文字 size + */ +- (CGSize)ba_stringGetSizeWithMaxSize:(CGSize)maxSize + fontSize:(CGFloat)fontSize; + +/** + 获取文字 size,根据字体 + + @param maxSize 最大的 size + @param font 字体 + @return 文字 size + */ +- (CGSize)ba_stringGetSizeWithMaxSize:(CGSize)maxSize + font:(UIFont *)font; + +/** + 计算一个字符串的 height,【限定 font、width】 + + @param font font + @param width width + @return 字符串的 height + */ +- (CGFloat)ba_stringGetHeightWithFont:(UIFont* )font width:(CGFloat)width; + +/** + 计算一个字符串的 width,【限定 font、height】 + + @param font font + @param height height + @return 字符串的 width + */ +- (CGFloat)ba_stringGetWidthWithFont:(UIFont *)font height:(CGFloat)height; + +/** + * Get the string's height with the fixed width. + * + * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + * @param width Fixed width. + * + * @return String's height. + */ + +/** + 计算一个 attributeString 的 height,【限定 attributeDictionary、width】 + + @param attributeDictionary attributeDictionary 例如:attributeDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + @param width width + @return attributeString 的 height + */ +- (CGFloat)ba_stringGetHeightWithStringAttributeDictionary:(NSDictionary *)attributeDictionary + width:(CGFloat)width; + +/** + 计算一个 attributeString 的 width,【限定 attributeDictionary】 + + @param attributeDictionary attributeDictionary 例如:attributeDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + @return attributeString 的 width + */ +- (CGFloat)ba_widthWithStringAttributeDictionary:(NSDictionary *)attributeDictionary; + + +/** + * Get a line of text height. + * + * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + * + * @return String's width. + */ ++ (CGFloat)ba_stringGetOneLineOfTextHeightWithStringAttribute:(NSDictionary *)attribute; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.m" new file mode 100644 index 0000000..3ec3990 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BASize.m" @@ -0,0 +1,121 @@ +// +// NSString+BASize.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BASize.h" + +@implementation NSString (BASize) + +/** + 获取文字 size,根据字体大小 + + @param maxSize 最大的 size + @param fontSize 字体大小 + @return 文字 size + */ +- (CGSize)ba_stringGetSizeWithMaxSize:(CGSize)maxSize + fontSize:(CGFloat)fontSize +{ + return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]} context:nil].size; +} + +/** + 获取文字 size,根据字体 + + @param maxSize 最大的 size + @param font 字体 + @return 文字 size + */ +- (CGSize)ba_stringGetSizeWithMaxSize:(CGSize)maxSize + font:(UIFont *)font +{ + return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size; +} + +- (CGFloat)ba_stringGetHeightWithFont:(UIFont* )font + width:(CGFloat)width +{ + + CGRect bounds = CGRectZero; + bounds = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; + return ceilf(bounds.size.height); +} + +- (CGFloat)ba_stringGetWidthWithFont:(UIFont *)font + height:(CGFloat)height +{ + CGRect bounds = CGRectZero; + + bounds = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, height) options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil]; + + return ceilf(bounds.size.width); +} + +/** + 计算一个 attributeString 的 height,【限定 attributeDictionary、width】 + + @param attributeDictionary attributeDictionary 例如:attributeDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + @param width width + @return attributeString 的 height + */ +- (CGFloat)ba_stringGetHeightWithStringAttributeDictionary:(NSDictionary *)attributeDictionary + width:(CGFloat)width +{ + NSParameterAssert(attributeDictionary); + CGFloat height = 0; + + if (self.length) + { + CGRect rect = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributeDictionary context:nil]; + height = rect.size.height; + } + + return height; +} + +/** + 计算一个 attributeString 的 width,【限定 attributeDictionary】 + + @param attributeDictionary attributeDictionary 例如:attributeDictionary = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + @return attributeString 的 width + */ +- (CGFloat)ba_widthWithStringAttributeDictionary:(NSDictionary *)attributeDictionary +{ + NSParameterAssert(attributeDictionary); + CGFloat width = 0; + + if (self.length) + { + CGRect rect = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 0) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributeDictionary context:nil]; + + width = rect.size.width; + } + + return width; +} + +/** + * Get a line of text height. + * + * @param attribute String's attribute, eg. attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:18.f]} + * + * @return String's width. + */ ++ (CGFloat)ba_stringGetOneLineOfTextHeightWithStringAttribute:(NSDictionary *)attribute +{ + CGFloat height = 0; + + CGRect rect = [@"One" boundingRectWithSize:CGSizeMake(200, MAXFLOAT) options:NSStringDrawingTruncatesLastVisibleLine |NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attribute context:nil]; + + height = rect.size.height; + + return height; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.h" new file mode 100644 index 0000000..e4af9ca --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.h" @@ -0,0 +1,206 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (BATime) + +#pragma mark - 获取系统当前日期和时间 +/** + * 获取系统当前日期和时间【YYYY-MM-dd HH:mm:ss】 + * + * @return 系统当前日期和时间 + */ ++ (NSString *)ba_time_getSystermCurrentDateYMDHMS; + +/** + 获取系统当前日期和时间 【自定义 formatString】 + + @param formatString formatString + @return 系统当前日期和时间 + */ ++ (NSString *)ba_time_getSystermCurrentDateWithFormatString:(NSString *)formatString; + +#pragma mark - 时间戳转换时间 +#pragma mark 时间戳转换时间【YYYY-MM-dd HH:mm:ss】 +/** + * 时间戳转换时间【YYYY-MM-dd HH:mm:ss】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【YYYY-MM-dd HH:mm:ss】 + */ ++ (NSString *)ba_time_getDateWithTimeStampYMDHMS:(NSString *)timeStamp; + +#pragma mark 时间戳转换【YYYY-MM-dd】 +/** + * 时间戳转换时间【YYYY-MM-dd】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【YYYY-MM-dd】 + */ ++ (NSString *)ba_time_getDateWithTimeStampYMD:(NSString *)timeStamp; + +#pragma mark 时间戳转换【HH:mm】 +/** + * 时间戳转换时间【HH:mm】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【HH:mm】 + */ ++ (NSString *)ba_time_getDateWithTimeStampHM:(NSString *)timeStamp; + +/** + 时间戳转换时间【自定义 formatString】 + + @param timeStamp 时间戳 + @param formatString formatString + @return 时间 + */ ++ (NSString *)ba_time_getDateWithTimeStamp:(NSString *)timeStamp + formatString:(NSString *)formatString; + +#pragma mark - 当前时间转换成时间戳 +/** + * 当前时间【YYYY-MM-dd HH:mm:ss】转换成时间戳【10位数,如:1492672164】 + * + * @return 时间戳【10位数,如:1492672164】 + */ ++ (NSString *)ba_time_getCurrentDateTransformTimeStampYMDHMS; + +#pragma mark 根据日期提取当前 星期几【返回 周一...周日】 +/*! + * 根据日期提取当前 星期几【返回 周一...周日】 + * + * @param date 需要提取的日期 + * + * @return 返回 周一...周日 + */ ++ (NSString *)ba_time_getWeekdayWithDate:(NSDate *)date; + +#pragma mark 计算 指定日期 与 当前时间 的时间差 +/** + 计算 指定日期 与 当前时间 的时间差 + + @param date 指定日期 + @return 时间差 + */ ++ (NSString *)ba_time_getIntervalSinceNowWithDate:(NSDate *)date; + +/** + 判断当前时间是否在 fromHour 和 toHour 之间。如。fromHour=8,toHour=23时。即为推断当前时间是否在8:00-23:00之间【一般应用程序设置这一组的存在,比如夜间模式,如果你。从8:00-23:00。在这个当前的时间是如何推断出期间。主要的困难在于如何使用NSDate生成8:00时间和23:00时间。然后用当前时间,也许有足够的时间,以使控制。】 + + @param fromHour 开始时间 + @param toHour 结束时间 + @return YES,NO + */ +- (BOOL)ba_time_isBetweenFromHour:(NSInteger)fromHour + toHour:(NSInteger)toHour; + +/*! + * 生成当天的某个点(返回的是伦敦时间,可直接与当前时间[NSDate date]比較) + * + * @param hour 如hour为“8”。就是上午8:00(本地时间) + */ +- (NSDate *)ba_time_getCustomDateWithHour:(NSInteger)hour; + +/*! + * 计算上报时间差: 几分钟前,几天前,传入时间戳,自动解析,注意:具体情况在 NSDate+BAKit.h 中也有详细说明 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ ++ (NSString *)ba_time_formatWithTimeStamp:(NSString *)timeStamp; + +/** + 解析新浪微博中的日期【判断日期是今天,昨天还是明天】 + + @param dateString dateString + @return 今天,昨天还是明天 + */ ++ (NSString *)ba_time_formatWithDateString:(NSString *)dateString; + +/** + 字符串时间转 NSDate + + @param formatString 转换格式 + @return NSDate + */ +- (NSDate *)ba_time_dateWithFormatString:(NSString *)formatString; + +/** + 字符串转换时间对象 + + @param formatString 转换格式 + @param timezoneName 时区标识符 + @return 时间对象结果 + */ +- (NSDate *)ba_time_dateWithFormat:(NSString *)formatString + timezoneName:(NSString *)timezoneName; + +- (NSDate *)ba_time_dateWithFormat:(NSString *)formatString + dateStyle:(NSDateFormatterStyle)dateStyle; + + +@end +NS_ASSUME_NONNULL_END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.m" new file mode 100644 index 0000000..d3cd686 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATime.m" @@ -0,0 +1,383 @@ +// +// NSString+BATime.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BATime.h" +#import "NSDate+BAKit.h" + +@implementation NSString (BATime) + +#pragma mark - 获得系统当前日期和时间 + +/** + * 获取系统当前日期和时间【YYYY-MM-dd HH:mm:ss】 + * + * @return 系统当前日期和时间 + */ ++ (NSString *)ba_time_getSystermCurrentDateYMDHMS +{ + NSString *resultString = [NSString ba_time_getSystermCurrentDateWithFormatString:BAKit_FormatString_YMDHMS]; + return resultString; +} + +/** + 获取系统当前日期和时间 【自定义 formatString】 + + @param formatString formatString + @return 系统当前日期和时间 + */ ++ (NSString *)ba_time_getSystermCurrentDateWithFormatString:(NSString *)formatString +{ + //获得系统日期 + NSDate *senddate = [NSDate date]; + NSDateFormatter *dateformatter = [[NSDateFormatter alloc] init]; + + [dateformatter setDateFormat:formatString]; + NSString *resultString = [dateformatter stringFromDate:senddate]; + + return resultString; +} + +#pragma mark - 时间戳转换时间 +#pragma mark 时间戳转换时间【YYYY-MM-dd HH:mm:ss】 +/** + * 时间戳转换时间【YYYY-MM-dd HH:mm:ss】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【YYYY-MM-dd HH:mm:ss】 + */ ++ (NSString *)ba_time_getDateWithTimeStampYMDHMS:(NSString *)timeStamp +{ + return [NSString ba_time_getDateWithTimeStamp:timeStamp formatString:BAKit_FormatString_YMDHMS]; +} + +#pragma mark 时间戳转换【YYYY-MM-dd】 +/** + * 时间戳转换时间【YYYY-MM-dd】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【YYYY-MM-dd】 + */ ++ (NSString *)ba_time_getDateWithTimeStampYMD:(NSString *)timeStamp +{ + return [NSString ba_time_getDateWithTimeStamp:timeStamp formatString:BAKit_FormatString_YMD]; +} + +#pragma mark 时间戳转换【HH:mm】 +/** + * 时间戳转换时间【HH:mm】 + * + * @param timeStamp 时间戳 + * + * @return 时间戳转换【HH:mm】 + */ ++ (NSString *)ba_time_getDateWithTimeStampHM:(NSString *)timeStamp +{ + return [NSString ba_time_getDateWithTimeStamp:timeStamp formatString:BAKit_FormatString_HM]; +} + +/** + 时间戳转换时间【自定义 formatString】 + + @param timeStamp 时间戳 + @param formatString formatString + @return 时间 + */ ++ (NSString *)ba_time_getDateWithTimeStamp:(NSString *)timeStamp + formatString:(NSString *)formatString +{ + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + [formatter setDateStyle:NSDateFormatterMediumStyle]; + [formatter setTimeStyle:NSDateFormatterShortStyle]; + [formatter setDateFormat:formatString]; + // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制 + // 时间戳转换 + NSDate *confromTimesp = [NSDate dateWithTimeIntervalSince1970:[timeStamp intValue]]; + NSString *confromTimespStr = [formatter stringFromDate:confromTimesp]; + + return confromTimespStr; +} + +#pragma mark - 当前时间转换成时间戳 +/** + * 当前时间【YYYY-MM-dd HH:mm:ss】转换成时间戳【10位数,如:1492672164】 + * + * @return 时间戳【10位数,如:1492672164】 + */ ++ (NSString *)ba_time_getCurrentDateTransformTimeStampYMDHMS +{ + NSDate *datenow = [NSDate date]; + // 时间转时间戳的方法: + NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]]; + + return timeSp; +} + +#pragma mark 根据日期提取当前 星期几【返回 周一...周日】 +/*! + * 根据日期提取当前 星期几【返回 周一...周日】 + * + * @param date 需要提取的日期 + * + * @return 返回 周一...周日 + */ ++ (NSString *)ba_time_getWeekdayWithDate:(NSDate *)date +{ + NSArray *weekdays = [NSArray arrayWithObjects: [NSNull null], @"周天", @"周一", @"周二", @"周三", @"周四", @"周五", @"周六", nil]; + + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSTimeZone *timeZone = [[NSTimeZone alloc] initWithName:@"Asia/Shanghai"]; + [calendar setTimeZone: timeZone]; + NSCalendarUnit calendarUnit = NSCalendarUnitWeekday; + NSDateComponents *theComponents = [calendar components:calendarUnit fromDate:date]; + + return [weekdays objectAtIndex:theComponents.weekday]; +} + +#pragma mark 计算 指定日期 与 当前时间 的时间差 +/** + 计算 指定日期 与 当前时间 的时间差 + + @param date 指定日期 + @return 时间差 + */ ++ (NSString *)ba_time_getIntervalSinceNowWithDate:(NSDate *)date +{ + NSTimeInterval late = [date timeIntervalSince1970]*1; + + NSDate *dat = [NSDate date]; + NSTimeInterval now = [dat timeIntervalSince1970]*1; + + NSTimeInterval cha = now -late; + NSString *timeString=[NSString stringWithFormat:@"%f",cha]; + + return timeString; +} + +/** + 判断当前时间是否在 fromHour 和 toHour 之间。如。fromHour=8,toHour=23时。即为推断当前时间是否在8:00-23:00之间【一般应用程序设置这一组的存在,比如夜间模式,如果你。从8:00-23:00。在这个当前的时间是如何推断出期间。主要的困难在于如何使用NSDate生成8:00时间和23:00时间。然后用当前时间,也许有足够的时间,以使控制。】 + + @param fromHour 开始时间 + @param toHour 结束时间 + @return YES,NO + */ +- (BOOL)ba_time_isBetweenFromHour:(NSInteger)fromHour + toHour:(NSInteger)toHour +{ + NSDate *date8 = [self ba_time_getCustomDateWithHour:8]; + NSDate *date23 = [self ba_time_getCustomDateWithHour:23]; + + NSDate *currentDate = [NSDate date]; + + if ([currentDate compare:date8]==NSOrderedDescending && [currentDate compare:date23]==NSOrderedAscending) + { + NSLog(@"该时间在 %ld:00-%ld:00 之间!", (long)fromHour, (long)toHour); + return YES; + } + return NO; +} + +/** + * @brief 生成当天的某个点(返回的是伦敦时间,可直接与当前时间[NSDate date]比較) + * @param hour 如hour为“8”。就是上午8:00(本地时间) + */ +- (NSDate *)ba_time_getCustomDateWithHour:(NSInteger)hour +{ + // 获取当前时间 + NSDate *currentDate = [NSDate date]; + NSCalendar *currentCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *currentComps = [[NSDateComponents alloc] init]; + + NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekday | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; + + currentComps = [currentCalendar components:unitFlags fromDate:currentDate]; + + // 设置当天的某个点 + NSDateComponents *resultComps = [[NSDateComponents alloc] init]; + [resultComps setYear:[currentComps year]]; + [resultComps setMonth:[currentComps month]]; + [resultComps setDay:[currentComps day]]; + [resultComps setHour:hour]; + + NSCalendar *resultCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + return [resultCalendar dateFromComponents:resultComps]; +} + +/*! + * 计算上报时间差: 几分钟前,几天前,传入时间戳,自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ ++ (NSString *)ba_time_formatWithTimeStamp:(NSString *)timeStamp +{ + NSDateFormatter *dateFormatter = [NSDateFormatter ba_setupDateFormatterWithYMD]; + NSString *theDay = [NSString ba_time_getDateWithTimeStampYMDHMS:timeStamp]; + NSDate *theDate = [NSDate dateWithTimeIntervalSince1970:[timeStamp integerValue]]; + // 当前年月日 + NSString *currentDay = [dateFormatter stringFromDate:[NSDate date]]; + + NSInteger timeInterval = -[theDate timeIntervalSinceNow]; + + if (timeInterval < 0) + { + // 超过当前时间 + NSDateFormatter *dateFormatter = [NSDateFormatter ba_setupDateFormatterWithYMDHMS]; + return [dateFormatter stringFromDate:theDate]; + } + else if (timeInterval < 60) + { + return @"刚刚"; + } + else if (timeInterval < 3600) + { + // 1小时内 + return [NSString stringWithFormat:@"%zd分钟前", timeInterval / 60]; + } + else if (timeInterval < 21600) + { + // 6小时内 + return [NSString stringWithFormat:@"%zd小时内", timeInterval / 3600]; + } + else if ([theDay isEqualToString:currentDay]) + { + // 当天 + [dateFormatter setDateFormat:BAKit_FormatString_HMS]; + return [NSString stringWithFormat:@"今天 %@", [dateFormatter stringFromDate:theDate]]; + } + else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) + { + // 昨天 + [dateFormatter setDateFormat:BAKit_FormatString_HM]; + return [NSString stringWithFormat:@"昨天 %@", [dateFormatter stringFromDate:theDate]]; + } + else + { + //以前 + NSDateFormatter *dateFormatter = [NSDateFormatter ba_setupDateFormatterWithYMDHMS]; + return [dateFormatter stringFromDate:theDate]; + } +} + +/** + 解析新浪微博中的日期【判断日期是今天,昨天还是明天】 + + @param dateString dateString + @return 今天,昨天还是明天 + */ ++ (NSString *)ba_time_formatWithDateString:(NSString *)dateString +{ + // 日期格式字符串 + NSDateFormatter *format = [[NSDateFormatter alloc] init]; + format.dateFormat = @"EEE MMM d HH:mm:ss Z yyyy"; + + // 设置格式本地化,日期格式字符串需要知道是哪个国家的日期,才知道怎么转换 + format.locale = [NSLocale localeWithLocaleIdentifier:@"en_us"]; + + NSDate *created_at = [format dateFromString:dateString]; + + if (created_at.isThisYear) + { // 今年 + if (created_at.isToday) + { + // 今天 + // 计算跟当前时间差距 + NSDateComponents *cmp = [created_at ba_dateDeltaWithNow]; + + if (cmp.hour >= 1) + { + return [NSString stringWithFormat:@"%ld小时之前",cmp.hour]; + } + else if (cmp.minute > 1) + { + return [NSString stringWithFormat:@"%ld分钟之前",cmp.minute]; + } + else + { + return @"刚刚"; + } + } + else if (created_at.isYesterday) + { // 昨天 + format.dateFormat = @"昨天 HH:mm"; + return [format stringFromDate:created_at]; + } + else + { // 前天 + format.dateFormat = BAKit_FormatString_MDHM; + return [format stringFromDate:created_at]; + } + } + else + { // 不是今年 + format.dateFormat = BAKit_FormatString_YMDHM; + return [format stringFromDate:created_at]; + } + + return dateString; +} + +/** + 字符串时间转 NSDate + + @param formatString 转换格式 + @return NSDate + */ +- (NSDate *)ba_time_dateWithFormatString:(NSString *)formatString +{ + if (self == nil || [self isEqualToString:@""] || formatString == nil || [formatString isEqualToString:@""]) + { + return nil; + } + + NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; + fmt.dateFormat = formatString; + + return [fmt dateFromString:self]; +} + +/** + 字符串转换时间对象 + + @param formatString 转换格式 + @param timezoneName 时区标识符 + @return 时间对象结果 + */ +- (NSDate *)ba_time_dateWithFormat:(NSString *)formatString + timezoneName:(NSString *)timezoneName +{ + if (self == nil || [self isEqualToString:@""] || formatString == nil || [formatString isEqualToString:@""]) + { + return nil; + } + NSDateFormatter *fmt = [NSDateFormatter ba_dateFormatterWithFormatString:formatString timezoneName:timezoneName]; + + NSDate *date= [fmt dateFromString:self]; + return date; + +} + +- (NSDate *)ba_time_dateWithFormat:(NSString *)formatString + dateStyle:(NSDateFormatterStyle)dateStyle +{ + if (self == nil || [self isEqualToString:@""] || formatString == nil || [formatString isEqualToString:@""]) + { + return nil; + } + + NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; + fmt.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"]; + fmt.dateStyle = dateStyle; + fmt.dateFormat = formatString; + + return [fmt dateFromString:self]; +} + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.h" new file mode 100644 index 0000000..87009d3 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.h" @@ -0,0 +1,86 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BATransform) + + +/** + 将 数字 0、1、2...9 转换成 零、一、二...九 + + @param number 输入的数字 + @return 转换后的文字 + */ ++ (NSString *)ba_stringTransformNumberToString:(NSInteger)number; + +/** + 将旧的字符替换成指定的新的字符 + + @param newString 替换后的字符 + @param range 替换的 range + @param oldString 需要替换的旧的字符 + @return 替换后的字符 + */ ++ (NSString *)ba_replaceNewString:(NSString *)newString + range:(NSRange)range + oldString:(NSString *)oldString; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.m" new file mode 100644 index 0000000..bd30a1f --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATransform.m" @@ -0,0 +1,121 @@ +// +// NSString+BATransform.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BATransform.h" + +@implementation NSString (BATransform) + +/** + 将 一串数字 1001 转换成 一零零一 + + @param number 输入的数字 + @return 转换后的文字 + */ ++ (NSString *)ba_stringTransformNumberToString:(NSInteger)number +{ + NSString *str = [NSString stringWithFormat:@"%ld", (long)number]; + + NSRange range; + range.length = 1; + + NSString *finalStr = [NSString string]; + + for (NSUInteger i = 0; i < [str length]; i++) + { + range.location = i; + NSString *subStr = [str substringWithRange:range]; + NSInteger subNum = [subStr integerValue]; + + switch (subNum) { + case 0: + subStr = [NSString ba_replaceNewString:@"零" range:range oldString:str]; + break; + case 1: + subStr = [NSString ba_replaceNewString:@"一" range:range oldString:str]; + break; + case 2: + subStr = [NSString ba_replaceNewString:@"二" range:range oldString:str]; + break; + case 3: + subStr = [NSString ba_replaceNewString:@"三" range:range oldString:str]; + break; + case 4: + subStr = [NSString ba_replaceNewString:@"四" range:range oldString:str]; + break; + case 5: + subStr = [NSString ba_replaceNewString:@"五" range:range oldString:str]; + break; + case 6: + subStr = [NSString ba_replaceNewString:@"六" range:range oldString:str]; + break; + case 7: + subStr = [NSString ba_replaceNewString:@"七" range:range oldString:str]; + break; + case 8: + subStr = [NSString ba_replaceNewString:@"八" range:range oldString:str]; + break; + case 9: + subStr = [NSString ba_replaceNewString:@"九" range:range oldString:str]; + break; + default: + break; + } + finalStr = [finalStr stringByAppendingString:subStr]; + } + return finalStr; +} + +/** + 将旧的字符替换成指定的新的字符 + + @param newString 替换后的字符 + @param range 替换的 range + @param oldString 需要替换的旧的字符 + @return 替换后的字符 + */ ++ (NSString *)ba_replaceNewString:(NSString *)newString + range:(NSRange)range + oldString:(NSString *)oldString +{ + NSString *subStr = @""; + + if (oldString.length == 1) + { + subStr = newString; + } + else if (oldString.length == 2) + { + if (range.location == 0) + { + subStr = [NSString stringWithFormat:@"%@十", newString]; + } + else if (range.location == 1) + { + subStr = newString; + } + } + else if (oldString.length == 3) + { + if (range.location == 0) + { + subStr = [NSString stringWithFormat:@"%@百", newString]; + } + else if (range.location == 1) + { + subStr = [NSString stringWithFormat:@"%@十", newString]; + } + else if (range.location == 2) + { + subStr = newString; + } + } + return subStr; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.h" new file mode 100755 index 0000000..259527e --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.h" @@ -0,0 +1,147 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (BATrims) + +/*! + * 清除html标签 + * + * @return 清除后的结果 + */ +- (NSString *)ba_trimStrippingHTMLString; + +/*! + * 清除js脚本 + * + * @return 清楚js后的结果 + */ +- (NSString *)ba_trimScriptsAndStrippingHTMLString; + +/*! + * 去除空格 + * + * @return 去除空格后的字符串 + */ +- (NSString *)ba_trimWhitespace; + +/*! + * 去除字符串与空行 + * + * @return 去除字符串与空行的字符串 + */ +- (NSString *)ba_trimWhitespaceAndNewlines; + +/** + 去掉字符串中的 html 标签的方法 + + @param HTMLString HTMLString + @return 去掉字符串中的 html 标签后的 string + */ ++ (NSString *)ba_trimfilterHTML:(NSString *)HTMLString; + +/*! + * 去除字符串的特殊字符 + * + * @param string 需要处理的字符串(如:NSString *string = @"";) + * + * @return 去除字符串的特殊字符 + */ ++ (nullable NSString *)ba_trimWithString:(nullable NSString *)string; + +/** + 十六进制转换为普通 string + + @param hexString 十六进制 string + @return 转换后的 string + */ +- (NSString *)ba_stringFromHexString:(NSString *)hexString; + +/*! + * 字典转 json + * + * @param dictionary 传入的字典 + * + * @return 返回 json 字符串 + */ ++ (NSString *)ba_stringJsonTurnWithDictionary:(NSDictionary *)dictionary; + +/** + 获取 string 的长度 + + @param string string + @return string 的长度 + */ ++ (NSUInteger)ba_stringGetLengthOfString:(NSString*)string; + +/** + 重复字符串 N 次 + + @param repeatString 需要重复的 string + @param repeatCount 重复次数 + @return 重复后的 string + */ ++ (NSString *)ba_stringWithNeedRepeatString:(NSString *)repeatString + repeatCount:(NSInteger)repeatCount; + +@end +NS_ASSUME_NONNULL_END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.m" new file mode 100755 index 0000000..811e278 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BATrims.m" @@ -0,0 +1,187 @@ +// +// NSString+BATrims.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BATrims.h" + +@implementation NSString (BATrims) + +/*! + * 清除html标签 + * + * @return 清除后的结果 + */ +- (NSString *)ba_trimStrippingHTMLString +{ + return [self stringByReplacingOccurrencesOfString:@"<[^>]+>" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, self.length)]; +} + +/*! + * 清除js脚本 + * + * @return 清楚js后的结果 + */ +- (NSString *)ba_trimScriptsAndStrippingHTMLString +{ + NSMutableString *mString = [self mutableCopy]; + NSError *error = nil; + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"]*>[\\w\\W]*" options:NSRegularExpressionCaseInsensitive error:&error]; + NSArray *matches = [regex matchesInString:mString options:NSMatchingReportProgress range:NSMakeRange(0, [mString length])]; + for (NSTextCheckingResult *match in [matches reverseObjectEnumerator]) + { + [mString replaceCharactersInRange:match.range withString:@""]; + } + return [mString ba_trimStrippingHTMLString]; +} + +/*! + * 去除空格 + * + * @return 去除空格后的字符串 + */ +- (NSString *)ba_trimWhitespace +{ + return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; +} + +/*! + * 去除字符串与空行 + * + * @return 去除字符串与空行的字符串 + */ +- (NSString *)ba_trimWhitespaceAndNewlines +{ + return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; +} + +/** + 去掉字符串中的 html 标签的方法 + + @param HTMLString HTMLString + @return 去掉字符串中的 html 标签后的 string + */ ++ (NSString *)ba_trimfilterHTML:(NSString *)HTMLString +{ + NSScanner *scanner = [NSScanner scannerWithString:HTMLString]; + NSString *text = nil; + while([scanner isAtEnd]==NO) + { + // 找到标签的起始位置 + [scanner scanUpToString:@"<" intoString:nil]; + // 找到标签的结束位置 + [scanner scanUpToString:@">" intoString:&text]; + // 替换字符 + HTMLString = [HTMLString stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"%@>",text] withString:@""]; + } + // NSString * regEx = @"<([^>]*)>"; + // html = [html stringByReplacingOccurrencesOfString:regEx withString:@""]; + // 去掉 html 里面的空格 + HTMLString = [HTMLString stringByReplacingOccurrencesOfString:@" " withString:@""]; + // 去掉换行 + HTMLString = [HTMLString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; + + // 去掉前后两边空白 + HTMLString = [HTMLString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + // NSLog(@"html:------------%@",html); + return HTMLString; +} + +/*! + * 去除字符串的特殊字符 + * + * @param string 需要处理的字符串(如:NSString *string = @"";) + * + * @return 去除字符串的特殊字符 + */ ++ (nullable NSString *)ba_trimWithString:(nullable NSString *)string +{ + // 去除字符串的特殊字符 + // NSString *string = @""; + NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"@/:;()¥「」"、<>[]{}#%-*+=_\\|~<>$?^?'@#$%^&*()_+'\""]; + NSString*trimmedString = [string stringByTrimmingCharactersInSet:set]; + NSLog(@"trimmedString1:%@",trimmedString); + // 去除字符串的空格 + trimmedString = [trimmedString stringByReplacingOccurrencesOfString:@" " withString:@""]; + NSLog(@"trimmedString2: %@",trimmedString); + + return trimmedString; +} + +/** + 十六进制转换为普通 string + + @param hexString 十六进制 string + @return 转换后的 string + */ +- (NSString *)ba_stringFromHexString:(NSString *)hexString +{ + char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1); + bzero(myBuffer, [hexString length] / 2 + 1); + for (int i = 0; i < [hexString length] - 1; i += 2) + { + unsigned int anInt; + NSString * hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)]; + NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr]; + [scanner scanHexInt:&anInt]; + myBuffer[i / 2] = (char)anInt; + } + NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4]; +// NSLog(@"------字符串=======%@",unicodeString); + return unicodeString; +} + +/*! + * 字典转 json + * + * @param dictionary 传入的字典 + * + * @return 返回 json 字符串 + */ ++ (NSString *)ba_stringJsonTurnWithDictionary:(NSDictionary *)dictionary +{ + NSData *data = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:nil]; + + NSString *jsonStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +// NSLog(@"字典转 json:%@!", jsonStr); + + return jsonStr; +} + +/** + 获取 string 的长度 + + @param string string + @return string 的长度 + */ ++ (NSUInteger)ba_stringGetLengthOfString:(NSString*)string +{ + NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); + NSData *data = [string dataUsingEncoding:enc]; + return [data length]; +} + +/** + 重复字符串 N 次 + + @param repeatString 需要重复的 string + @param repeatCount 重复次数 + @return 重复后的 string + */ ++ (NSString *)ba_stringWithNeedRepeatString:(NSString *)repeatString + repeatCount:(NSInteger)repeatCount +{ + NSMutableString *String = [NSMutableString new]; + for (int i = 0; i < repeatCount; i++) + { + [String appendString:repeatString]; + } + return String; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.h" new file mode 100644 index 0000000..6791780 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.h" @@ -0,0 +1,89 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSString (BAUIButton) + +/** + 给 button 添加下划线 + + @param button button + @param range button 的 title 需要加下划线的地方 + @param lineColor 下划线颜色 + */ ++ (void)ba_stringToBeUnderlineWithButton:(UIButton *)button + range:(NSRange)range + lineColor:(UIColor *)lineColor; + +/** + 给 button 添加下划线 + + @param button button + @param range button 的 title 需要加下划线的地方 + @param lineColor 下划线颜色 + @param controlstate UIControlState + */ ++ (void)ba_stringToBeUnderlineWithButton:(UIButton *)button + range:(NSRange)range + lineColor:(UIColor *)lineColor + controlstate:(UIControlState)controlstate; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.m" new file mode 100644 index 0000000..53dc7ea --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSString/NSString+BAUIButton.m" @@ -0,0 +1,50 @@ +// +// NSString+BAUIButton.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + + +#import "NSString+BAUIButton.h" + +@implementation NSString (BAUIButton) + +/** + 给 button 添加下划线 + + @param button button + @param range button 的 title 需要加下划线的地方 + @param lineColor 下划线颜色 + */ ++ (void)ba_stringToBeUnderlineWithButton:(UIButton *)button + range:(NSRange)range + lineColor:(UIColor *)lineColor +{ + NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:button.titleLabel.text]; + [str addAttribute:NSUnderlineColorAttributeName value:lineColor range:range]; + [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; + [button setAttributedTitle:str forState:UIControlStateNormal]; +} + +/** + 给 button 添加下划线 + + @param button button + @param range button 的 title 需要加下划线的地方 + @param lineColor 下划线颜色 + @param controlstate UIControlState + */ ++ (void)ba_stringToBeUnderlineWithButton:(UIButton *)button + range:(NSRange)range + lineColor:(UIColor *)lineColor + controlstate:(UIControlState)controlstate +{ + NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:button.titleLabel.text]; + [str addAttribute:NSUnderlineColorAttributeName value:lineColor range:range]; + [str addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:range]; + [button setAttributedTitle:str forState:controlstate]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.h" new file mode 100644 index 0000000..a30eede --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.h" @@ -0,0 +1,146 @@ +// +// BAKit_UserDefaults.h +// BAQMUIDemo +// +// Created by boai on 2017/5/28. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN +@interface BAKit_UserDefaults : NSObject + +#pragma mark - 信息存储 类 + +/** + 保存指定对象 id 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setObject:(nullable id)value forKey:(NSString *)defaultName; + +/** + 读取指定对象 id 对象 + + @param defaultName defaultName + @return 读取指定的对象 + */ ++ (nullable id)ba_archive_getObjectForKey:(NSString *)defaultName; + +/** + 读取指定 NSArray 对象 + + @param defaultName defaultName + @return 读取指定的 NSArray 对象 + */ ++ (NSArray *)ba_archive_getArrayForKey:(NSString *)defaultName; + +/** + 读取指定 NSData 对象 + + @param defaultName defaultName + @return 读取指定的 NSData 对象 + */ ++ (NSArray *)ba_archive_getStringArrayForKey:(NSString *)defaultName; + +/** + 读取指定 NSDictionary 对象 + + @param defaultName defaultName + @return 读取指定的 NSDictionary 对象 + */ ++ (NSDictionary *)ba_archive_getDictionaryForKey:(NSString *)defaultName; + +/** + 读取指定 NSData 对象 + + @param defaultName defaultName + @return 读取指定的 NSData 对象 + */ ++ (NSData *)ba_archive_getDatayForKey:(NSString *)defaultName; + +/** + 删除指定对象 + + @param defaultName defaultName + */ ++ (void)ba_archive_removeObjectForKey:(NSString *)defaultName; + +/** + 保存指定 int 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setInteger:(NSInteger)value forKey:(NSString *)defaultName; + +/** + 读取指定 int 对象 + + @param defaultName defaultName + @return 读取指定的 int 对象 + */ ++ (NSInteger)ba_archive_getIntegerForKey:(NSString *)defaultName; + +/** + 保存指定 float 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setFloat:(CGFloat)value forKey:(NSString *)defaultName; + +/** + 读取指定 float 对象 + + @param defaultName defaultName + @return 读取指定的 int 对象 + */ ++ (CGFloat)ba_archive_getFloatForKey:(NSString *)defaultName; + +/** + 保存指定 BOOL 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setBool:(BOOL)value forKey:(NSString *)defaultName; + +/** + 读取指定 BOOL 对象 + + @param defaultName defaultName + @return 读取指定的 BOOL 对象 + */ ++ (BOOL)ba_archive_getBoolForKey:(NSString *)defaultName; + +#pragma mark - 文件归档 +/** + 归档 + + @param rootObject 需要归档的 rootObject + @param path path + @return 是否归档 + */ ++ (BOOL)ba_archive_rootObject:(id)rootObject toFile:(NSString *)path; + +/** + 删档 + + @param path path + @return 是否删档 + */ ++ (BOOL)ba_archive_removeRootObjectWithFile:(NSString *)path; + +/** + 解档 + + @param path path + @return 解档后的数据 + */ ++ (nullable id)ba_archive_unarchiveObjectWithFile:(NSString *)path; + +@end +NS_ASSUME_NONNULL_END diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.m" new file mode 100644 index 0000000..49d6032 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/BAKit_UserDefaults.m" @@ -0,0 +1,206 @@ +// +// BAKit_UserDefaults.m +// BAQMUIDemo +// +// Created by boai on 2017/5/28. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import "BAKit_UserDefaults.h" + +@implementation BAKit_UserDefaults + +#pragma mark - 保存对象 + +/** + 保存指定对象 id 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setObject:(nullable id)value forKey:(NSString *)defaultName +{ + // 保存 + [BAKit_NSUserDefaults setObject:value forKey:defaultName]; + // 立即同步 + [BAKit_NSUserDefaults synchronize]; +} + +/** + 读取指定对象 id 对象 + + @param defaultName defaultName + @return 读取指定的对象 + */ ++ (nullable id)ba_archive_getObjectForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults objectForKey:defaultName]; +} + +/** + 读取指定 NSArray 对象 + + @param defaultName defaultName + @return 读取指定的 NSArray 对象 + */ ++ (NSArray *)ba_archive_getArrayForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults arrayForKey:defaultName]; +} + +/** + 读取指定 NSData 对象 + + @param defaultName defaultName + @return 读取指定的 NSData 对象 + */ ++ (NSArray *)ba_archive_getStringArrayForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults stringArrayForKey:defaultName]; +} + +/** + 读取指定 NSDictionary 对象 + + @param defaultName defaultName + @return 读取指定的 NSDictionary 对象 + */ ++ (NSDictionary *)ba_archive_getDictionaryForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults dictionaryForKey:defaultName]; +} + +/** + 读取指定 NSData 对象 + + @param defaultName defaultName + @return 读取指定的 NSData 对象 + */ ++ (NSData *)ba_archive_getDatayForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults dataForKey:defaultName]; +} + +/** + 删除指定对象 + + @param defaultName defaultName + */ ++ (void)ba_archive_removeObjectForKey:(NSString *)defaultName +{ + [BAKit_NSUserDefaults removeObjectForKey:defaultName]; +} + +/** + 保存指定 int 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setInteger:(NSInteger)value forKey:(NSString *)defaultName +{ + // 保存 + [BAKit_NSUserDefaults setInteger:value forKey:defaultName]; + // 立即同步 + [BAKit_NSUserDefaults synchronize]; +} + +/** + 读取指定 int 对象 + + @param defaultName defaultName + @return 读取指定的 int 对象 + */ ++ (NSInteger)ba_archive_getIntegerForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults integerForKey:defaultName]; +} + +/** + 保存指定 float 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setFloat:(CGFloat)value forKey:(NSString *)defaultName +{ + // 保存 + [BAKit_NSUserDefaults setFloat:value forKey:defaultName]; + // 立即同步 + [BAKit_NSUserDefaults synchronize]; +} + +/** + 读取指定 float 对象 + + @param defaultName defaultName + @return 读取指定的 int 对象 + */ ++ (CGFloat)ba_archive_getFloatForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults floatForKey:defaultName]; +} + +/** + 保存指定 BOOL 对象 + + @param value value + @param defaultName defaultName + */ ++ (void)ba_archive_setBool:(BOOL)value forKey:(NSString *)defaultName +{ + // 保存 + [BAKit_NSUserDefaults setFloat:value forKey:defaultName]; + // 立即同步 + [BAKit_NSUserDefaults synchronize]; +} + +/** + 读取指定 BOOL 对象 + + @param defaultName defaultName + @return 读取指定的 BOOL 对象 + */ ++ (BOOL)ba_archive_getBoolForKey:(NSString *)defaultName +{ + return [BAKit_NSUserDefaults boolForKey:defaultName]; +} + + + +#pragma mark - 文件归档 +/** + 归档 + + @param rootObject 需要归档的 rootObject + @param path path + @return 是否归档 + */ ++ (BOOL)ba_archive_rootObject:(id)rootObject toFile:(NSString *)path +{ + return [NSKeyedArchiver archiveRootObject:rootObject toFile:path]; +} + +/** + 删档 + + @param path path + @return 是否删档 + */ ++ (BOOL)ba_archive_removeRootObjectWithFile:(NSString *)path +{ + return [self ba_archive_rootObject:nil toFile:path]; +} + +/** + 解档 + + @param path path + @return 解档后的数据 + */ ++ (nullable id)ba_archive_unarchiveObjectWithFile:(NSString *)path +{ + return [NSKeyedUnarchiver unarchiveObjectWithFile:path]; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.h" new file mode 100644 index 0000000..09fac9f --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.h" @@ -0,0 +1,21 @@ +// +// NSFileManager+BAKit.h +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import + +@interface NSFileManager (BAKit) + +/** + 计算路径下的文件内存大小,完全使用 unix c 函数 性能最好 + + @param filepath 文件路径 + @return 文件内存大小 + */ ++ (int64_t)ba_fileManagerGetSizeWithFilePath:(NSString *)filepath; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.m" new file mode 100644 index 0000000..9b1c589 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSFileManager+BAKit.m" @@ -0,0 +1,116 @@ +// +// NSFileManager+BAKit.m +// BAKit +// +// Created by boai on 2017/6/7. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "NSFileManager+BAKit.h" +#include +#include +#include +#include + +@implementation NSFileManager (BAKit) + +/** + 计算路径下的文件内存大小 + + @param filepath 文件路径 + @return 文件内存大小 + */ ++ (int64_t)ba_fileManagerGetSizeWithFilePath:(NSString *)filepath +{ +// NSFileManager *fmgr = [NSFileManager defaultManager]; +// // CHECK FILE EXIST +// BOOL isFolder = NO; +// if ([fmgr fileExistsAtPath:filepath isDirectory:&isFolder]) +// { +// float filesize = 0; +// if (isFolder) +// { +// // FOLDER +// NSArray *files = [fmgr subpathsAtPath:filepath]; +// for (NSString *filename in files) +// { +// filesize += [NSFileManager ba_fileManagerGetSizeWithFilePath:filename]; +// } +// } +// else +// { +// // FILE +// filesize = [fmgr attributesOfItemAtPath:filepath error:NULL].fileSize / 1024.0f / 1024.0f; +// } +// return filesize; +// } +// return 0; + return [self folderSizeAtPath:[filepath cStringUsingEncoding:NSUTF8StringEncoding] maxTime:nil]; +} + +// 完全使用unix c 函数 性能最好 +// 实测 1000个文件速度 0.005896 ++ (int64_t)folderSizeAtPath:(const char *)folderPath maxTime:(NSNumber *)maxTime +{ + CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent(); + + int64_t folderSize = 0; + DIR* dir = opendir(folderPath); + + + if (dir == NULL) return 0; + struct dirent* child; + while ((child = readdir(dir))!=NULL) { + if (child->d_type == DT_DIR && ( + (child->d_name[0] == '.' && child->d_name[1] == 0) || // 忽略目录 . + (child->d_name[0] == '.' && child->d_name[1] == '.' && child->d_name[2] == 0) // 忽略目录 .. + )) continue; + + int64_t folderPathLength = strlen(folderPath); + + // 子文件的路径地址 + char childPath[1024]; + stpcpy(childPath, folderPath); + + if (folderPath[folderPathLength-1] != '/') { + childPath[folderPathLength] = '/'; + folderPathLength++; + } + + stpcpy(childPath+folderPathLength, child->d_name); + childPath[folderPathLength + child->d_namlen] = 0; + + if (child->d_type == DT_DIR) { // directory + // 递归调用子目录 + folderSize += [[self class] folderSizeAtPath:childPath maxTime:maxTime]; + + // 把目录本身所占的空间也加上 + struct stat st; + if(lstat(childPath, &st) == 0) folderSize += st.st_size; + }else if (child->d_type == DT_REG || child->d_type == DT_LNK) { // file or link + //特殊处理几个月前的内容 + if (maxTime) { + BOOL shouldCountSize = YES; + char *p = child->d_name; + NSString *fileName = [NSString stringWithCString:p encoding:NSUTF8StringEncoding]; + NSComparisonResult result = [fileName compare:[maxTime stringValue]]; + if (result == NSOrderedDescending)//小于三个月不统计 + { + shouldCountSize = NO; + } + + if (!shouldCountSize) { + continue; + } + } + + struct stat st; + if(lstat(childPath, &st) == 0) folderSize += st.st_size; + } + } + CFAbsoluteTime endTime = CFAbsoluteTimeGetCurrent(); + NSLog(@"ttttttttttt:%s,%f,%lld",__func__,endTime-startTime,folderSize); + return folderSize; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.h" new file mode 100644 index 0000000..1c67727 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.h" @@ -0,0 +1,42 @@ +// +// NSString+BAFileManager.h +// BAQMUIDemo +// +// Created by boai on 2017/5/28. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import + +@interface NSString (BAFileManager) + +#pragma mark - 获取软件沙盒路径 类 + +/*! 获取软件沙盒路径 */ ++ (nullable NSString *)ba_path_getApplicationSupportPath; + +/*! 获取软件沙盒Documents路径 */ ++ (nullable NSString *)ba_path_getDocumentsPath; + +/*! 获取软件沙盒cache路径 */ ++ (nullable NSString *)ba_path_getCachePath; + +/*! 获取软件沙盒cachesDic路径 */ ++ (nullable NSString *)ba_path_getTemPath; + +/*! 在软件沙盒指定的路径创建一个目录 */ ++ (BOOL)ba_path_createDirectory:(nullable NSString *)newDirectory; + +/*! 在软件沙盒指定的路径删除一个目录 */ ++ (BOOL)ba_path_deleteFilesysItem:(nullable NSString*)strItem; + +/*! 在软件沙盒路径移动一个目录到另一个目录中 */ ++ (BOOL)ba_path_moveFilesysItem:(nullable NSString *)srcPath toPath:(nullable NSString *)dstPath; + +/*! 在软件沙盒路径中查看有没有这个路径 */ ++ (BOOL)ba_path_fileExist:(nullable NSString*)strPath; + +/*! 在软件沙盒路径中获取指定userPath路径 */ +- (nullable NSString *)ba_path_getUserInfoStorePath:(nullable NSString *)userPath; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.m" new file mode 100644 index 0000000..a4a9b31 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/Foundation/NSUserDefaults/NSString+BAFileManager.m" @@ -0,0 +1,109 @@ +// +// NSString+BAFileManager.m +// BAQMUIDemo +// +// Created by boai on 2017/5/28. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import "NSString+BAFileManager.h" + +@implementation NSString (BAFileManager) + +/*! 获取软件沙盒路径 */ ++ (NSString *)ba_path_getApplicationSupportPath +{ + //such as:../Applications/9A425424-645E-4337-8730-8A080DF086F4/Library/Application Support + + NSArray* libraryPaths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSAllDomainsMask, YES); + + NSString *path = nil; + if ([libraryPaths count] > 0) { + path = [libraryPaths objectAtIndex:0]; + } + + if (![self ba_path_fileExist:path]) { + [self ba_path_createDirectory:path]; + } + + return path; +} + +/*! 获取软件沙盒 Documents 路径 */ ++ (NSString *)ba_path_getDocumentsPath +{ + NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]; + + // such as:../Applications/9A425424-645E-4337-8730-8A080DF086F4/Documents + return documentPath; +} + +/*! 获取软件沙盒 cache 路径 */ ++ (NSString *)ba_path_getCachePath +{ + // such as : ../Applications/9A425424-645E-4337-8730-8A080DF086F4/Library/Caches + NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) objectAtIndex:0]; + return cachePath; +} + +/*! 获取软件沙盒 cachesDic 路径 */ ++ (NSString *)ba_path_getTemPath +{ + NSString *cachesDic = NSTemporaryDirectory(); + return cachesDic; +} + +/*! 在软件沙盒指定的路径创建一个目录 */ ++ (BOOL)ba_path_createDirectory:(NSString *)newDirectory +{ + if([self ba_path_fileExist:newDirectory]) return YES; + + NSError *error = nil; + BOOL finished = [[NSFileManager defaultManager] createDirectoryAtPath:newDirectory + withIntermediateDirectories:YES + attributes:nil + error:&error]; + return finished; +} + +/*! 在软件沙盒指定的路径删除一个目录 */ ++ (BOOL)ba_path_deleteFilesysItem:(NSString*)strItem +{ + if ([strItem length] == 0) { + return YES; + } + + NSError * error = nil; + + BOOL finished = [[NSFileManager defaultManager] removeItemAtPath:strItem error:&error]; + return finished; +} + +/*! 在软件沙盒路径移动一个目录到另一个目录中 */ ++ (BOOL)ba_path_moveFilesysItem:(NSString *)srcPath toPath:(NSString *)dstPath +{ + if (![self ba_path_fileExist:srcPath]) return NO; + + NSError * error = nil; + return [[NSFileManager defaultManager] moveItemAtPath:srcPath + toPath:dstPath + error:&error]; +} + +/*! 在软件沙盒路径中查看有没有这个路径 */ ++ (BOOL)ba_path_fileExist:(NSString*)strPath +{ + NSFileManager *file_manager = [NSFileManager defaultManager]; + BOOL finded = [file_manager fileExistsAtPath:strPath]; + return finded; +} + +/*! 在软件沙盒路径中获取指定userPath路径 */ +- (NSString *)ba_path_getUserInfoStorePath:(NSString *)userPath +{ + NSString *destPath = [NSString ba_path_getDocumentsPath]; + NSString *userInfoPath = [destPath stringByAppendingString:[NSString stringWithFormat:@"/%@", userPath]]; + return userInfoPath; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAPP.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAAPP.h" similarity index 93% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAPP.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAAPP.h" index d116092..2f1a68d 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAPP.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAAPP.h" @@ -83,6 +83,17 @@ /*! 6、获取sharedApplication */ #define BASharedApplication [UIApplication sharedApplication] + +// 7、获取temp +#define BA_PathTemp NSTemporaryDirectory() + +// 8、获取沙盒 Document +#define BA_PathDocument [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] + +// 9、获取沙盒 Cache +#define BA_PathCache [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] + + FOUNDATION_EXPORT NSString * _Nonnull const BABundleName; FOUNDATION_EXPORT NSString * _Nonnull const BABundleVersion; FOUNDATION_EXPORT NSString * _Nonnull const BABundleShortVersionString; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAPP.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAAPP.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAAPP.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAAPP.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALog.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BALog.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALog.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BALog.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALog.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BALog.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BALog.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BALog.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAPassword.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAPassword.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAPassword.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAPassword.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAPassword.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAPassword.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BAPassword.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BAPassword.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.h" new file mode 100755 index 0000000..15b6b4a --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.h" @@ -0,0 +1,109 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import +#import + +@interface BASystemService : NSObject + +/** + * 直接拨打电话 + * + * @param phoneNum 电话号码 + */ ++ (void)ba_directPhoneCallWithPhoneNum:(NSString *)phoneNum; + +/** + * 弹出对话框并询问是否拨打电话 + * + * @param phoneNum 电话号码 + * @param view contentView + */ ++ (void)ba_phoneCallWithPhoneNum:(NSString *)phoneNum contentView:(UIView *)view; + +/** + * 跳到app的评论页 + * + * @param appId APP的id号 + */ ++ (void)ba_jumpToAppReviewPageWithAppId:(NSString *)appId; + +/** + * 发邮件 + * + * @param address 邮件地址 + */ ++ (void)ba_sendEmailToAddress:(NSString *)address; + +/** + * app版本号 + * + * @return app版本号 + */ ++ (NSString *)ba_appVersion; + +/** + * 获取启动页图片 + * + * @return 启动页图片 + */ ++ (UIImage *)ba_launchImage; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.m" new file mode 100755 index 0000000..bfb7897 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemService.m" @@ -0,0 +1,121 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import "BASystemService.h" + +@implementation BASystemService + ++ (void)ba_directPhoneCallWithPhoneNum:(NSString *)phoneNum +{ + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[@"tel:" stringByAppendingString:phoneNum]]]; +} + ++ (void)ba_phoneCallWithPhoneNum:(NSString *)phoneNum contentView:(UIView *)view +{ + UIWebView * callWebview = [[UIWebView alloc] init]; + [callWebview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[@"tel:" stringByAppendingString:phoneNum]]]]; + [view addSubview:callWebview]; +} + ++ (void)ba_jumpToAppReviewPageWithAppId:(NSString *)appId +{ + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[@"itms-apps://itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=" stringByAppendingString:appId]]]; +} + ++ (void)ba_sendEmailToAddress:(NSString *)address +{ + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[@"mailto://" stringByAppendingString:address]]]; +} + ++ (NSString *)ba_appVersion +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; +} + ++ (UIImage *)ba_launchImage +{ + UIImage *lauchImage = nil; + NSString *viewOrientation = nil; + CGSize viewSize = [UIScreen mainScreen].bounds.size; + UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; + + if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) { + + viewOrientation = @"Landscape"; + + } else { + + viewOrientation = @"Portrait"; + } + + NSArray *imagesDictionary = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"]; + for (NSDictionary *dict in imagesDictionary) { + + CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]); + if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]]) { + + lauchImage = [UIImage imageNamed:dict[@"UILaunchImageName"]]; + } + } + + return lauchImage; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystemSound.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemSound.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystemSound.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemSound.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystemSound.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemSound.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BASystemSound.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BASystemSound.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BATouchID.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BATouchID.h" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BATouchID.h" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BATouchID.h" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BATouchID.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BATouchID.m" similarity index 100% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/BACustom/BATouchID.m" rename to "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/BATouchID.m" diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.h" new file mode 100755 index 0000000..94e6eb3 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.h" @@ -0,0 +1,177 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import +#import +#import +#import "AddressBook/ABAddressBook.h" +#import "EventKit/EventKit.h" +#import "AVFoundation/AVFoundation.h" +#import "AssetsLibrary/AssetsLibrary.h" + +typedef void(^grantBlock)(BOOL granted); + +@interface UIApplication (AppInfo) + + +@property (strong, nonatomic) UIWindow *window; + + +///------------------------------------- +/// @name app基本信息 +///------------------------------------- + +/** + 当前app名称 + */ +- (NSString *)appName; + +/* + 当前app版本号 + */ +- (NSString *)appVersion; + +/** + build 版本号 + */ +- (NSString *)appBuild; + +/** + apps 证书编号 (例如MacKun.az.com) + */ +- (NSString *)appBundleID; + +///-------------------------------------------------------------- +/// @name 沙盒缓存大小 +///-------------------------------------------------------------- + +/** + * 沙盒的路径 + */ +- (NSString *)documentsDirectoryPath; +/** + 沙盒的内容大小 (例如5 MB) + */ +- (NSString *)documentsFolderSizeAsString; + +/** + 沙盒内的字节大小 + */ +- (int)documentsFolderSizeInBytes; +/** + * 程序的大小 包括文件 缓冲 以及 下载 + * + * @return 所有文件大小 + */ +- (NSString *)applicationSize; + + +/////--------------------------------------------------------------- +///// @name app 隐私权限 +/////--------------------------------------------------------------- + +/** + 定位权限是否开启 + */ +- (BOOL)applicationHasAccessToLocationData; + +/** + 通讯录访问权限是否开启 + */ +- (BOOL)applicationhasAccessToAddressBook; + +/** + 相机权限是否开启 + */ +- (BOOL)applicationHasAccessToCalendar; + +/** + 推送功能是否开启 + */ +- (BOOL)applicationHasAccessToReminders; + +/** + 相册权限是否开启 + */ +- (BOOL)applicationHasAccessToPhotosLibrary; + +/** + * 麦克风开启 + * + * @warning + */ +- (void)applicationHasAccessToMicrophone:(grantBlock)flag; + +///------------------------------------- +/// @name app 相关事件 +///------------------------------------- + +/** + * 注册推送(兼容iOS8) + */ +- (void)registerNotifications; +///** +// * 获取当前视图 +// * +// */ +- (UIViewController*)getCurrentViewConttoller; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.m" new file mode 100755 index 0000000..ab7de5d --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIApplication/UIApplication+AppInfo.m" @@ -0,0 +1,365 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import "UIApplication+AppInfo.h" +#import +#import + +@implementation UIApplication (AppInfo) + +@dynamic window; + +#pragma mark - app基本信息 +- (NSString *)appName +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; +} + +- (NSString *)appVersion +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; +} + +- (NSString *)appBuild +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; +} + +- (NSString *)appBundleID +{ + return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; +} + +- (NSString *)documentsFolderSizeAsString +{ + NSString *folderPath = [self documentsDirectoryPath]; + + NSArray *filesArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil]; + + unsigned long long int folderSize = 0; + + for (NSString *fileName in filesArray) + { + NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:fileName] error:nil]; + folderSize += [fileDictionary fileSize]; + } + + + NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:folderSize countStyle:NSByteCountFormatterCountStyleFile]; + return folderSizeStr; +} + +- (int)documentsFolderSizeInBytes +{ + + NSString *folderPath = [self documentsDirectoryPath]; + + NSArray *filesArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil]; + unsigned long long int folderSize = 0; + + for (NSString *fileName in filesArray) { + NSDictionary *fileDictionary = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:fileName] error:nil]; + folderSize += [fileDictionary fileSize]; + } + return (int)folderSize; +} + +- (NSString *)applicationSize +{ + unsigned long long docSize = [self sizeOfFolder:[self documentPath]]; + unsigned long long libSize = [self sizeOfFolder:[self libraryPath]]; + unsigned long long cacheSize = [self sizeOfFolder:[self cachePath]]; + + unsigned long long total = docSize + libSize + cacheSize; + + NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:total countStyle:NSByteCountFormatterCountStyleFile]; + return folderSizeStr; +} + + +- (NSString *)documentPath +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *basePath = [paths firstObject]; + return basePath; +} + +- (NSString *)libraryPath +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); + NSString *basePath = [paths firstObject]; + return basePath; +} + +- (NSString *)cachePath +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); + NSString *basePath = [paths firstObject]; + return basePath; +} + +- (unsigned long long)sizeOfFolder:(NSString *)folderPath +{ + NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil]; + NSEnumerator *contentsEnumurator = [contents objectEnumerator]; + + NSString *file; + unsigned long long folderSize = 0; + + while (file = [contentsEnumurator nextObject]) { + NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:file] error:nil]; + folderSize += [[fileAttributes objectForKey:NSFileSize] intValue]; + } + return folderSize; +} + +//#pragma mark - Privacy data access + +- (BOOL)applicationHasAccessToLocationData +{ + if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined||[CLLocationManager authorizationStatus]==kCLAuthorizationStatusRestricted||[CLLocationManager authorizationStatus]==kCLAuthorizationStatusDenied) + { + return NO; + } + #if __IPHONE_8_0 + #else + if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorized) + return YES; + #endif + + return NO; +} + +- (BOOL)applicationhasAccessToAddressBook +{ + BOOL hasAccess = NO; +#if __IPHONE_9_0 + if ([CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts]==CNAuthorizationStatusAuthorized) + { + hasAccess=YES; + } +#else + switch (ABAddressBookGetAuthorizationStatus()) + { + case kABAuthorizationStatusNotDetermined: + hasAccess = NO; + break; + case kABAuthorizationStatusRestricted: + hasAccess = NO; + break; + case kABAuthorizationStatusDenied: + hasAccess = NO; + break; + case kABAuthorizationStatusAuthorized: + hasAccess = YES; + break; + } +#endif + + return hasAccess; +} + +- (BOOL)applicationHasAccessToCalendar +{ + + BOOL hasAccess = NO; + + switch ([EKEventStore authorizationStatusForEntityType:EKEntityTypeEvent]) + { + case EKAuthorizationStatusNotDetermined: + hasAccess = NO; + break; + case EKAuthorizationStatusRestricted: + hasAccess = NO; + break; + case EKAuthorizationStatusDenied: + hasAccess = NO; + break; + case EKAuthorizationStatusAuthorized: + hasAccess = YES; + break; + } + + return hasAccess; +} + + +- (BOOL)applicationHasAccessToReminders +{ + BOOL hasAccess = NO; + switch ([EKEventStore authorizationStatusForEntityType:EKEntityTypeReminder]) + { + case EKAuthorizationStatusNotDetermined: + hasAccess = NO; + break; + case EKAuthorizationStatusRestricted: + hasAccess = NO; + break; + case EKAuthorizationStatusDenied: + hasAccess = NO; + break; + case EKAuthorizationStatusAuthorized: + hasAccess = YES; + break; + } + + return hasAccess; +} + + +- (BOOL)applicationHasAccessToPhotosLibrary +{ + BOOL hasAccess = NO; + +#if __IPHONE_8_0 + int author = [PHPhotoLibrary authorizationStatus]; + if (author==PHAuthorizationStatusAuthorized) { + hasAccess=YES; + } + +#else + int author = [ALAssetsLibrary authorizationStatus]; + if(author== ALAuthorizationStatusAuthorized) + { + hasAccess=YES; + } +#endif + return hasAccess; +} +/** + * 麦克风开启 + * + * @warning + */ +- (void)applicationHasAccessToMicrophone:(grantBlock)flag +{ + //检测麦克风功能是否打开 + [[AVAudioSession sharedInstance]requestRecordPermission:^(BOOL granted) { + + flag(granted); + + }]; +} + +- (NSString *)documentsDirectoryPath +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsPath = [paths objectAtIndex:0]; + + return documentsPath; +} +-(void)registerNotifications +{ + #if __IPHONE_8_0 + + //注册推送 + if ([[[UIDevice currentDevice] systemVersion] floatValue]>=8.0) + { + // [UIApplication sharedApplication] + + [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings + settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) + categories:nil]]; + [[UIApplication sharedApplication] registerForRemoteNotifications]; + //远程推送 + + } + #else + //这里还是原来的代码 + [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound]; + #endif + +} +//-(UIViewController *)getCurrentViewConttoller +//{ +// // UIViewController *vc=nil; +// UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; +// if ([topController isKindOfClass:[RESideMenu class]]) { +// RESideMenu *mainVC=((RESideMenu *)topController); +// UINavigationController *nav = (UINavigationController *)mainVC.contentViewController; +// topController=nav.topViewController; +// } +// while (topController.presentedViewController) { +// topController = topController.presentedViewController; +// } +// return topController; +//} +- (UIViewController*) topMostController +{ + UIViewController *topController = [UIApplication sharedApplication].keyWindow.rootViewController; + // Getting topMost ViewController + while ([topController presentedViewController]) topController = [topController presentedViewController]; + // Returning topMost ViewController + return topController; +} +// +- (UIViewController*)getCurrentViewConttoller +{ + UIViewController *currentViewController = [self topMostController]; + + while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController]) + currentViewController = [(UINavigationController*)currentViewController topViewController]; + while (currentViewController.presentedViewController) { + currentViewController = currentViewController.presentedViewController; + } + return currentViewController; +} + +@end \ No newline at end of file diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.h" deleted file mode 100755 index 884a51a..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.h" +++ /dev/null @@ -1,93 +0,0 @@ - -/*! - * @header BAKit - * demoTest - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - ********************************************************************************* - - */ - -#import - - -@protocol BAPickerViewDelegate - -/*! 代理方法1:获取选择的城市 */ -- (void)getSelectCity:(NSString *)city; - -@end - -@interface BAPickerView : UIView - -@property (nonatomic, copy) NSString *province; -@property (nonatomic, copy) NSString *city; -@property (nonatomic, copy) NSString *area; - -@property (nonatomic, weak) id delegate; - -/*! - * 显示pickView - * - * @param view 在哪里显示 - */ -- (void)showInView:(UIView *)view; - -/*! - * 隐藏pickView - */ -- (void)hiddenPickerView; - -/*! - * 获取的城市名字 - * - * @param string 城市名字 - * - * @return 返回城市名字 - */ -- (NSString *)protectString:(NSString *)string; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.m" deleted file mode 100755 index 0b40e1c..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BAPickerView.m" +++ /dev/null @@ -1,336 +0,0 @@ - -/*! - * @header BAKit - * demoTest - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - ********************************************************************************* - - */ - -#import "BAPickerView.h" - -@interface BAPickerView () -< - UIPickerViewDataSource, - UIPickerViewDelegate -> - -@property (nonatomic, copy) NSMutableArray *provinces;//省 -@property (nonatomic, copy) NSMutableArray *cityArray;//市 -@property (nonatomic, copy) NSMutableArray *areaArray;//县 - -@property (nonatomic, copy) NSMutableArray *selectedArray; - -@property (nonatomic, strong) UIPickerView *pickerView; - -@property (nonatomic, strong) UIView *chooseCityView; - -@end - -@implementation BAPickerView - -- (instancetype)initWithFrame:(CGRect)frame -{ - if (self = [super initWithFrame:frame]) - { - self.backgroundColor = BA_BGClearColor; - - UIView *bgView = [UIView new]; - bgView.frame = CGRectMake(30, (BA_SCREEN_HEIGHT - 300)/2, BA_SCREEN_WIDTH - 60, BA_SCREEN_HEIGHT/3); - bgView.backgroundColor = BA_White_Color; - [self addSubview:bgView]; - - CGRect pickerViewFrame = CGRectMake(0, 0, bgView.frame.size.width, bgView.frame.size.height - 40); - self.pickerView = [[UIPickerView alloc]initWithFrame:pickerViewFrame]; - self.pickerView.dataSource = self; - self.pickerView.delegate = self; - self.pickerView.backgroundColor = [UIColor whiteColor]; - [bgView addSubview:_pickerView]; - - UIButton *cancelButton = [UIButton buttonWithType:UIButtonTypeCustom]; - cancelButton.frame = CGRectMake((bgView.frame.size.width - 200)/3, CGRectGetMaxY(self.pickerView.frame), 100, 35); - [cancelButton setTitle:@"取消" forState:UIControlStateNormal]; - [cancelButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; - [cancelButton addTarget:self action:@selector(removeBtnClick:) forControlEvents:UIControlEventTouchUpInside]; - [bgView addSubview:cancelButton]; - - UIButton *chooseButton = [UIButton buttonWithType:UIButtonTypeCustom]; - chooseButton.frame = CGRectMake(CGRectGetMaxX(cancelButton.frame)+(bgView.frame.size.width - 200)/3, CGRectGetMaxY(self.pickerView.frame), 100, 35); - [chooseButton setTitle:@"确定" forState:UIControlStateNormal]; - [chooseButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; - [chooseButton addTarget:self action:@selector(sureBtnClick:) forControlEvents:UIControlEventTouchUpInside]; - [bgView addSubview:chooseButton]; - - bgView.layer.cornerRadius = 5; - bgView.layer.borderWidth = 1; - bgView.layer.borderColor = [[UIColor whiteColor]CGColor]; - bgView.layer.masksToBounds = YES; - - /** 确定 */ - chooseButton.layer.cornerRadius = 3; - chooseButton.layer.borderWidth = 1; - chooseButton.layer.borderColor = [[UIColor colorWithHexString:@"5AC33B" alpha:1.0f] CGColor]; - chooseButton.layer.masksToBounds = YES; - - /** 取消按钮 */ - cancelButton.layer.cornerRadius = 3; - cancelButton.layer.borderWidth = 1; - cancelButton.layer.borderColor = [[UIColor colorWithHexString:@"BAB9B9" alpha:1.0f] CGColor]; - cancelButton.layer.masksToBounds = YES; - - [self creatData]; - } - return self; -} - -- (void)creatData -{ - NSString *path = [[NSBundle mainBundle]pathForResource:@"area" ofType:@"plist"]; - NSArray *provinceArray = [[NSArray alloc]initWithContentsOfFile:path]; - [provinceArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - - NSMutableArray *temp = [NSMutableArray arrayWithArray:self.provinces]; - [temp addObject:obj[@"state"]]; - - self.provinces = temp; - }]; - - NSMutableArray *citys =[NSMutableArray arrayWithArray:[provinceArray firstObject][@"cities"]]; - [citys enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - - NSMutableArray *temp = [NSMutableArray arrayWithArray:self.cityArray]; - [temp addObject:obj[@"city"]]; - - self.cityArray = temp; - }]; - - self.areaArray = [NSMutableArray arrayWithArray:[citys firstObject][@"areas"]]; - - self.province = [self.provinces firstObject]; - self.city = [self.cityArray firstObject]; - self.area = 0 == self.areaArray.count ? @"" : [self.areaArray firstObject]; -} - -#pragma mark -- -#pragma mark -- UIPickerViewDataSource -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { - - return 3; -} - -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { - - return 0 == component ? self.provinces.count : 1 == component ? self.cityArray.count : self.areaArray.count; -} - -#pragma mark -- UIPickerViewDelegate -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { - - NSString *path = [[NSBundle mainBundle] pathForResource:@"area" ofType:@"plist"]; - NSArray *provinceArray = [[NSArray alloc]initWithContentsOfFile:path]; - - if (0 == component) { - - self.selectedArray = provinceArray[row][@"cities"]; - - NSMutableArray *temp = [NSMutableArray arrayWithArray:self.cityArray]; - [temp removeAllObjects]; - self.cityArray = temp; - - [self.selectedArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { - - NSMutableArray *temp = [NSMutableArray arrayWithArray:self.cityArray]; - [temp addObject:obj[@"city"]]; - - self.cityArray = temp; - }]; - - self.areaArray = [NSMutableArray arrayWithArray:[self.selectedArray firstObject][@"areas"]]; - [pickerView reloadComponent:1]; - [pickerView selectRow:0 inComponent:1 animated:YES]; - - [pickerView reloadComponent:2]; - [pickerView selectRow:0 inComponent:2 animated:YES]; - - }else if (1 == component) { - - if (0 == self.selectedArray.count) { - self.selectedArray = [provinceArray firstObject][@"cities"]; - } - - self.areaArray = [NSMutableArray arrayWithArray:[self.selectedArray objectAtIndex:row][@"areas"]]; - [pickerView reloadComponent:2]; - [pickerView selectRow:0 inComponent:2 animated:YES]; - } - - NSInteger provinces = [_pickerView selectedRowInComponent:0]; - NSInteger city = [_pickerView selectedRowInComponent:1]; - NSInteger area = [_pickerView selectedRowInComponent:2]; - - self.province = self.provinces[provinces]; - self.city = self.cityArray[city]; - self.area = 0 == self.areaArray.count ? @"" : self.areaArray[area]; -} - -- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { - - return 0 == component ? self.provinces[row] : 1 == component ? self.cityArray[row] : 0 == self.areaArray.count ? nil : self.areaArray[row]; -} - -#pragma mark -- show and hidden -- (void)showInView:(UIView *)view { - - self.frame = CGRectMake(0, view.frame.size.height, self.frame.size.width, self.frame.size.height); - [view addSubview:self]; - - [UIView animateWithDuration:0.3f animations:^{ - - self.frame = CGRectMake(0, view.frame.size.height - self.frame.size.height, self.frame.size.width, self.frame.size.height); - }]; -} - -- (void)hiddenPickerView { - - // 开始动画 - // [self animationbegin:sender]; - - [UIView animateWithDuration:0.3f animations:^{ - - self.frame = CGRectMake(0, self.frame.origin.y + self.frame.size.height, self.frame.size.width, self.frame.size.height); - - } completion:^(BOOL finished) { - - [self removeFromSuperview]; - }]; -} - -- (void)animationbegin:(UIView *)view { - /* 放大缩小 */ - - // 设定为缩放 - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; - - // 动画选项设定 - animation.duration = 0.1; // 动画持续时间 - animation.repeatCount = -1; // 重复次数 - animation.autoreverses = YES; // 动画结束时执行逆动画 - - // 缩放倍数 - animation.fromValue = [NSNumber numberWithFloat:1.0]; // 开始时的倍率 - animation.toValue = [NSNumber numberWithFloat:0.9]; // 结束时的倍率 - - // 添加动画 - [view.layer addAnimation:animation forKey:@"scale-layer"]; - -} - -- (IBAction)removeBtnClick:(id)sender { - // 开始动画 - [self animationbegin:sender]; - - [UIView animateWithDuration:0.3 animations:^{ - self.alpha = 0; - } completion:^(BOOL finished) { - [self removeFromSuperview]; - }]; -} - -- (IBAction)sureBtnClick:(id)sender { - // 开始动画 - [self animationbegin:sender]; - - NSString *province = [self protectString:self.province]; - NSString *city = [self protectString:self.city]; - NSString *area = [self protectString:self.area]; - - NSString *selectCity = [NSString stringWithFormat:@"%@%@%@",province, city, area]; - - //delegate - [self.delegate getSelectCity:selectCity]; - - [self removeBtnClick:nil]; -} - -- (NSString *)protectString:(NSString *)string -{ - if (string == nil || [string isKindOfClass:NULL]) { - string = @""; - } - return string; -} - -#pragma mark -- setter getter -- (NSMutableArray *)provinces { - if (!_provinces) { - self.provinces = [@[] mutableCopy]; - } - return _provinces; -} - -- (NSMutableArray *)cityArray { - if (!_cityArray) { - self.cityArray = [@[] mutableCopy]; - } - return _cityArray; -} - -- (NSMutableArray *)areaArray { - if (!_areaArray) { - self.areaArray = [@[] mutableCopy]; - } - return _areaArray; -} - -- (NSMutableArray *)selectedArray { - if (!_selectedArray) { - self.selectedArray = [@[] mutableCopy]; - } - return _selectedArray; -} - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.h" new file mode 100644 index 0000000..b129f9a --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.h" @@ -0,0 +1,102 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import + +/*! BATextField 样式枚举 */ +typedef NS_ENUM(NSInteger, BATextFieldStyle) { + /*! 默认 */ + BATextfieldStyleNone, + /*! 手机号码格式化 【格式化结果:138 1111 1111】 */ + BATextfieldStylePhone, + /*! 银行卡卡号格式化【格式化结果:1111 1111 1111 1234】 */ + BATextfieldStyleBank +}; + +@interface BATextField : UITextField + +/*! textfiled 输入的格式化格式 有四种 */ +@property (nonatomic) BATextFieldStyle textfieldStyle; + +/*! 可以用 xib 直接设置 */ + +/** + * 电话号码限制验证码限制(默认只能输入11位数字) + */ +@property (assign, nonatomic) IBInspectable BOOL phoneRestrict; +/** + * 限制输入长度 + */ +@property (assign, nonatomic) IBInspectable NSInteger lengthRestrict; +/** + * 带小数点的数字限制(默认只能输入小数位后2位) + */ +@property (assign, nonatomic) IBInspectable BOOL decimalsRestrict; +/** + * 验证码限制(默认只能输入6位数字) + */ +@property (assign, nonatomic) IBInspectable BOOL verCodeRestrict; +/** + * 限制只能输入数字 + */ +@property (assign, nonatomic) IBInspectable BOOL numberRestrict; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.m" new file mode 100644 index 0000000..00802a8 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextField.m" @@ -0,0 +1,427 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 博爱1616【137361770】 + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + + ********************************************************************************* + + */ + +#import "BATextField.h" +#import + +/*! 电话号码限制验证码限制(默认只能输入11位数字) */ +static const void *phoneRestrictKey = & phoneRestrictKey; +/*! 长度限制 */ +static const void *lengthRestrictKey = & lengthRestrictKey; +/*! 带小数点的数字限制(默认只能输入小数位后2位) */ +static const void *decimalsRestrictKey = & decimalsRestrictKey; +/*! 验证码限制(默认只能输入6位数字) */ +static const void *verCodeRestrictKey = & verCodeRestrictKey; +/*! 限制只能输入数字 */ +static const void *numberRestrictKey = & numberRestrictKey; + +static NSInteger byteNil = 3; +static NSInteger byteNilFlag = 0; +static NSInteger byteNilBank = 4; +static NSInteger byteNilFlagBank = 0; +static NSInteger tableHeight = 30; +static CGFloat keyHchange = 0; +static CGFloat keyChangeTableH = 0; +static CGFloat selfLocation_MAXy = 0; + +@interface BATextField () + +@end + +@implementation BATextField + +/*! 初始化配置 */ +- (void)setup +{ + self.delegate = self; + self.phoneRestrict = NO; + self.decimalsRestrict = NO; + self.verCodeRestrict = NO; + self.lengthRestrict = 0; + self.numberRestrict = NO; +} + +- (instancetype)init +{ + if (self = [super init]) + { + [self performSelector:@selector(setup)]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) + { + [self performSelector:@selector(setup)]; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + if (self = [super initWithCoder:aDecoder]) + { + [self performSelector:@selector(setup)]; + } + return self; +} + +#pragma mark - 重写电话号码限制getter和setter的方法 +- (void)setPhoneRestrict:(BOOL)phoneRestrict +{ + /*! + objc_setAssociatedObject(self, &imageURLkey, url,OBJC_ASSOCIATION_RETAIN_NONATOMIC); + 这四个后面的参数分别表示:源对象,关键字,关联的对象和一个关联策略。 + 关键策略是一个枚举值。 + */ + /*! 指定一个弱引用关联的对象 */ + objc_setAssociatedObject(self, phoneRestrictKey, @(phoneRestrict), OBJC_ASSOCIATION_ASSIGN); +} + +- (BOOL)phoneRestrict +{ + /*! + objc_getAssociatedObject(self, &imageURLkey); + 这个来获取关联的对象。 + + 但我们不需要关联时。需要移除关联 + objc_setAssociatedObject(self, &imageURLkey, nil, OBJC_ASSOCIATION_ASSIGN); + */ + return [objc_getAssociatedObject(self, phoneRestrictKey) boolValue]; +} + +#pragma mark - 重写限制输入长度getter和setter的方法 +- (void)setLengthRestrict:(NSInteger)lengthRestrict +{ + objc_setAssociatedObject(self, lengthRestrictKey, @(lengthRestrict), OBJC_ASSOCIATION_ASSIGN); +} + +- (NSInteger)lengthRestrict +{ + return [objc_getAssociatedObject(self, lengthRestrictKey) integerValue]; +} + +#pragma mark - 重写带小数点的数字限制getter和setter的方法 +- (void)setDecimalsRestrict:(BOOL)decimalsRestrict +{ + objc_setAssociatedObject(self, decimalsRestrictKey, @(decimalsRestrict), OBJC_ASSOCIATION_ASSIGN); +} + +- (BOOL)decimalsRestrict +{ + return [objc_getAssociatedObject(self, decimalsRestrictKey) boolValue]; +} + +#pragma mark - 重写验证码限制getter和setter的方法 +- (void)setVerCodeRestrict:(BOOL)verCodeRestrict +{ + objc_setAssociatedObject(self, verCodeRestrictKey, @(verCodeRestrict), OBJC_ASSOCIATION_ASSIGN); +} + +- (BOOL)verCodeRestrict +{ + return [objc_getAssociatedObject(self, verCodeRestrictKey) boolValue]; +} + +#pragma mark - 限制只能输入数子 +- (void)setNumberRestrict:(BOOL)numberRestrict +{ + objc_setAssociatedObject(self, numberRestrictKey, @(numberRestrict), OBJC_ASSOCIATION_ASSIGN); +} + +- (BOOL)numberRestrict +{ + return [objc_getAssociatedObject(self, numberRestrictKey) boolValue]; +} + +- (void)setTextfieldStyle:(BATextFieldStyle)textfieldStyle +{ + _textfieldStyle = textfieldStyle; +} + +#pragma mark - UITextFieldDelegate +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + NSUInteger lengthOfString = string.length; + NSUInteger proposedNewLength = textField.text.length -range.length + lengthOfString; + + /*! 限制字符串长度 */ + if (self.lengthRestrict > 0) + { + if (proposedNewLength > self.lengthRestrict) + { + return NO; + } + } + + if (self.decimalsRestrict) + { + /*! 只允许数字输入 */ + for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex ++) + { + unichar character = [string characterAtIndex:loopIndex]; + /*! 46 unichar for " . " */ + if (character < 46) + { + return NO; + } + /*! 47 unichar for " / " */ + if (character == 47) + { + return NO; + } + /*! 48 ~ 57 unichar for 0 ~ 9 */ + if (character > 57) + { + return NO; + } + } + + /*! 获取Textfield实际内容 */ + NSString *currentText = @""; + if (range.length) + { + currentText = [textField.text substringWithRange:NSMakeRange(0, textField.text.length - range.length)]; + } + else + { + currentText = [textField.text stringByAppendingString:string]; + } + + /*! 判断是否已经输入小数点 */ + if ([currentText rangeOfString:@"."].location != NSNotFound) + { + /*! 不能重复输入小数点(判断当前输入的字符是否是" . ",再判断原内容是否已经有" . ") */ + if ([string isEqualToString:@"."] && [textField.text rangeOfString:@"."].location != NSNotFound) + { + return false; + } + /*! 获取小数点在当前内容的坐标 */ + NSRange pointRange = [currentText rangeOfString:@"."]; + if ((currentText.length - 1) - pointRange.location > 2) + { + return false; + } + } + } + + if (self.phoneRestrict || self.verCodeRestrict) + { + /*! 只允许数字输入 */ + for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) + { + unichar character = [string characterAtIndex:loopIndex]; + if (character < 48 || character > 57) + { + return NO; + } + } + + if (self.phoneRestrict) + { + if (_textfieldStyle == BATextfieldStylePhone) + { + if (proposedNewLength > 13) + { + return NO; + } + [self ba_phoneNumberTextField:textField shouldChangeCharactersInRange:range replacementString:string]; + } + else + { + if (proposedNewLength > 11) + { + return NO; + } + } + } + else if (self.verCodeRestrict) + { + if (proposedNewLength > 6) + { + return NO; + } + } + } + + /*! 只允许数字输入 */ + if (self.numberRestrict) + { + for (NSInteger loopIndex = 0; loopIndex < lengthOfString; loopIndex++) + { + int character = [string characterAtIndex:loopIndex]; + if (character < 48 || character > 57) + { + return NO; + } + else + { + if (self.lengthRestrict > 0) + { + if (proposedNewLength > self.lengthRestrict) + { + return NO; + } + } + if (_textfieldStyle == BATextfieldStyleBank) + { + [self ba_bankNumberTextField:textField shouldChangeCharactersInRange:range replacementString:string]; + } + } + } + } + return YES; +} + + +#pragma mark - 手机号码格式 +- (BOOL)ba_phoneNumberTextField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ + if (textField.text.length >12 && ![string isEqualToString:@""]) { + return NO; + }else if ([string isEqualToString:@" "]) { + NSLog(@"不能输入空格"); + return NO; + }else if(![string isEqualToString:@""]){ + // NSLog(@"====%@ string = %@",textField.text,string); + if ((textField.text.length - byteNilFlag)%byteNil == 0 && (textField.text.length - byteNilFlag)/byteNil != 0 && string.length > 0) { + byteNilFlag = byteNilFlag + byteNil; + byteNil = 5; + + NSMutableString * str = [NSMutableString stringWithFormat:@"%@ ",textField.text]; + textField.text = str; + } + NSString *str = [NSString stringWithFormat:@"%@%@",textField.text,string]; + NSLog(@"格式化结果:%@", str); + return YES; + }else{ + //删除是遇到空格多删除一位 + if ([[textField.text substringWithRange:range] isEqualToString:@" "]) { + NSRange deleteRange = NSMakeRange(0, textField.text.length - 1); + NSString * str = [textField.text substringWithRange:deleteRange]; + textField.text = str; + + } + if (textField.text.length < 3) { + byteNil = 3; + byteNilFlag = 0; + } + if(textField.text.length <= byteNilFlag){ + + byteNilFlag = byteNilFlag - byteNil; + } + NSString *str = [NSString stringWithFormat:@"%@%@",textField.text,string]; + NSLog(@"格式化结果:%@", str); + return YES; + } +} + +#pragma mark - 银行卡格式化 +- (BOOL)ba_bankNumberTextField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ + //NSLog(); + if (textField.text.length > 19 + 3 && ![string isEqualToString:@""]){ + return NO; + }else if ([string isEqualToString:@" "]) { + NSLog(@"不能输入空格"); + return NO; + }else if(![string isEqualToString:@""]){ + // NSLog(@"====%@ string = %@",textField.text,string); + if ((textField.text.length - byteNilFlagBank)%byteNilBank == 0 && (textField.text.length - byteNilFlagBank)/byteNilBank != 0 && string.length > 0) { + byteNilFlagBank = byteNilFlagBank + byteNilBank; + byteNilBank = 5; + + NSMutableString * str = [NSMutableString stringWithFormat:@"%@ ",textField.text]; + textField.text = str; + } + NSString *str = [NSString stringWithFormat:@"%@%@",textField.text,string]; + NSLog(@"格式化结果:%@", str); + return YES; + + }else{ + + /*! 删除是遇到空格多删除一位 */ + if ([[textField.text substringWithRange:range] isEqualToString:@" "]) { + NSRange deleteRange = NSMakeRange(0, textField.text.length - 1); + NSString * str = [textField.text substringWithRange:deleteRange]; + textField.text = str; + } + if (textField.text.length < 4) { + byteNilBank = 4; + byteNilFlagBank = 0; + } + if(textField.text.length <= byteNilFlagBank){ + + byteNilFlagBank = byteNilFlagBank - byteNilBank; + } + NSString *str = [NSString stringWithFormat:@"%@%@",textField.text,string]; + NSLog(@"格式化结果:%@", str); + return YES; + } +} + + + + + + + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextView.m" index e1f99fb..84a5dab 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextView.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/BATextView.m" @@ -76,9 +76,9 @@ - (id)init - (void)addObserver { // 注册通知 - [BA_Noti addObserver:self selector:@selector(didBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:self]; - [BA_Noti addObserver:self selector:@selector(didEndEditing:) name:UITextViewTextDidEndEditingNotification object:self]; - [BA_Noti addObserver:self selector:@selector(terminate:) name:UIApplicationWillTerminateNotification object:BASharedApplication]; + [BA_NotiCenter addObserver:self selector:@selector(didBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:self]; + [BA_NotiCenter addObserver:self selector:@selector(didEndEditing:) name:UITextViewTextDidEndEditingNotification object:self]; + [BA_NotiCenter addObserver:self selector:@selector(terminate:) name:UIApplicationWillTerminateNotification object:BASharedApplication]; } - (void)setPlaceholder:(NSString *)placeholder @@ -91,7 +91,7 @@ - (void)setPlaceholder:(NSString *)placeholder - (void)terminate:(NSNotification *)notification { // 移除通知 - [BA_Noti removeObserver:self]; + [BA_NotiCenter removeObserver:self]; } - (void)didBeginEditing:(NSNotification *)notification diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.h" new file mode 100755 index 0000000..02b2ca0 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.h" @@ -0,0 +1,190 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +#import + +#if TARGET_OS_IOS +typedef void (^UIAlertControllerPopoverPresentationControllerBlock) (UIPopoverPresentationController * __nonnull popover); +#endif + +/** + 按钮点击事件 block + + @param alertController alertController + @param action UIAlertAction + @param buttonIndex buttonIndex + */ +typedef void (^BAKit_AlertControllerButtonActionBlock) (UIAlertController * __nonnull alertController, UIAlertAction * __nonnull action, NSInteger buttonIndex); + +/** + textField 配置信息 block + + @param textField textField + @param index index + */ +typedef void (^BAKit_AlertControllerTextFieldConfigurationActionBlock)(UITextField * _Nullable textField, NSInteger index); + +@interface UIAlertController (BAKit) + +/** + 快速创建一个系统 普通 UIAlertController-Alert + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param block block + @return UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alertShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + block:(nullable BAKit_AlertControllerButtonActionBlock)block; + +/** + 快速创建一个系统 普通 带 textField 的 UIAlertController-Alert + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param buttonEnabledNoWithTitleArray 初始化的时候按钮为 EnabledNo 状态 的 title 数组 + @param textFieldPlaceholderArray textFieldPlaceholderArray 需要添加的 textField placeholder 数组 + @param textFieldConfigurationActionBlock textField 配置信息 block + @param block block + @return 普通 带 textField 的 UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alert2ShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + buttonEnabledNoWithTitleArray:(NSArray *_Nullable)buttonEnabledNoWithTitleArray + textFieldPlaceholderArray:(NSArray *_Nullable)textFieldPlaceholderArray + textFieldConfigurationActionBlock:(nullable BAKit_AlertControllerTextFieldConfigurationActionBlock)textFieldConfigurationActionBlock + block:(nullable BAKit_AlertControllerButtonActionBlock)block; + +/** + 快速创建一个系统 attributedTitle UIAlertController-Alert + + @param viewController 显示的VC + @param attributedTitle attributedTitle + @param attributedMessage attributedMessage + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param block block + @return UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alertAttributedShowInViewController:(nonnull UIViewController *)viewController + attributedTitle:(nullable NSMutableAttributedString *)attributedTitle + attributedMessage:(nullable NSMutableAttributedString *)attributedMessage + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + block:(nullable BAKit_AlertControllerButtonActionBlock)block; + + +/** + 快速创建一个系统 普通 UIAlertController-ActionSheet + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param popoverPresentationControllerBlock popoverPresentationControllerBlock description + @param block block + @return UIAlertController-ActionSheet + */ ++ (nonnull instancetype)ba_actionSheetShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray +#if TARGET_OS_IOS + popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock +#endif + block:(nullable BAKit_AlertControllerButtonActionBlock)block; + +/** + 快速创建一个系统 attributedTitle UIAlertController-ActionSheet + + @param viewController 显示的VC + @param attributedTitle attributedTitle + @param attributedMessage attributedMessage + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param popoverPresentationControllerBlock popoverPresentationControllerBlock description + @param block block + @return UIAlertController-ActionSheet + */ ++ (nonnull instancetype)ba_actionSheetAttributedShowInViewController:(nonnull UIViewController *)viewController + attributedTitle:(nullable NSMutableAttributedString *)attributedTitle + attributedMessage:(nullable NSMutableAttributedString *)attributedMessage + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray +#if TARGET_OS_IOS + popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock +#endif + block:(nullable BAKit_AlertControllerButtonActionBlock)block; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.m" new file mode 100755 index 0000000..1fe6cc3 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIAlertController+BAKit.m" @@ -0,0 +1,374 @@ + +// +// BAAlertController.h +// BAAlertController +// +// Created by boai on 2017/6/5. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "UIAlertController+BAKit.h" +#import +#import "NSObject+BARunTime.h" + + +@interface UIViewController (BAKit) + +- (UIViewController *)ba_currentViewController; + +@end + +@implementation UIAlertController (BAKit) + + +/** + 快速创建一个系统 普通 UIAlertController-Alert + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param block block + @return UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alertShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + block:(nullable BAKit_AlertControllerButtonActionBlock)block +{ + return [self ba_alertControllerShowInViewController:viewController + title:title + attributedTitle:nil + message:message + attributedMessage:nil + preferredStyle:UIAlertControllerStyleAlert + buttonTitleArray:buttonTitleArray + buttonTitleColorArray:buttonTitleColorArray + buttonEnabledNoWithTitleArray:nil + textFieldPlaceholderArray:nil + textFieldConfigurationActionBlock:nil +#if TARGET_OS_IOS + popoverPresentationControllerBlock:nil +#endif + block:block]; +} + +/** + 快速创建一个系统 普通 带 textField 的 UIAlertController-Alert + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param buttonEnabledNoWithTitleArray 初始化的时候按钮为 EnabledNo 状态 的 title 数组 + @param textFieldPlaceholderArray textFieldPlaceholderArray 需要添加的 textField placeholder 数组 + @param textFieldConfigurationActionBlock textField 配置信息 block + @param block block + @return 普通 带 textField 的 UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alert2ShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + buttonEnabledNoWithTitleArray:(NSArray *_Nullable)buttonEnabledNoWithTitleArray + textFieldPlaceholderArray:(NSArray *_Nullable)textFieldPlaceholderArray + textFieldConfigurationActionBlock:(nullable BAKit_AlertControllerTextFieldConfigurationActionBlock)textFieldConfigurationActionBlock + block:(nullable BAKit_AlertControllerButtonActionBlock)block +{ + return [self ba_alertControllerShowInViewController:viewController + title:title + attributedTitle:nil + message:message + attributedMessage:nil + preferredStyle:UIAlertControllerStyleAlert + buttonTitleArray:buttonTitleArray + buttonTitleColorArray:buttonTitleColorArray + buttonEnabledNoWithTitleArray:buttonEnabledNoWithTitleArray + textFieldPlaceholderArray:textFieldPlaceholderArray + textFieldConfigurationActionBlock:textFieldConfigurationActionBlock +#if TARGET_OS_IOS + popoverPresentationControllerBlock:nil +#endif + block:block]; +} + +/** + 快速创建一个系统 attributedTitle UIAlertController-Alert + + @param viewController 显示的VC + @param attributedTitle attributedTitle + @param attributedMessage attributedMessage + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param block block + @return UIAlertController-Alert + */ ++ (nonnull instancetype)ba_alertAttributedShowInViewController:(nonnull UIViewController *)viewController + attributedTitle:(nullable NSMutableAttributedString *)attributedTitle + attributedMessage:(nullable NSMutableAttributedString *)attributedMessage + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + block:(nullable BAKit_AlertControllerButtonActionBlock)block +{ + return [self ba_alertControllerShowInViewController:viewController + title:nil + attributedTitle:attributedTitle + message:nil + attributedMessage:attributedMessage + preferredStyle:UIAlertControllerStyleAlert + buttonTitleArray:buttonTitleArray + buttonTitleColorArray:buttonTitleColorArray + buttonEnabledNoWithTitleArray:nil + textFieldPlaceholderArray:nil + textFieldConfigurationActionBlock:nil +#if TARGET_OS_IOS + popoverPresentationControllerBlock:nil +#endif + block:block]; +} + + +/** + 快速创建一个系统 普通 UIAlertController-ActionSheet + + @param viewController 显示的VC + @param title title + @param message message + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param popoverPresentationControllerBlock popoverPresentationControllerBlock description + @param block block + @return UIAlertController-ActionSheet + */ ++ (nonnull instancetype)ba_actionSheetShowInViewController:(nonnull UIViewController *)viewController + title:(nullable NSString *)title + message:(nullable NSString *)message + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray +#if TARGET_OS_IOS + popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock +#endif + block:(nullable BAKit_AlertControllerButtonActionBlock)block +{ + return [self ba_alertControllerShowInViewController:viewController + title:title + attributedTitle:nil + message:message + attributedMessage:nil + preferredStyle:UIAlertControllerStyleActionSheet + buttonTitleArray:buttonTitleArray + buttonTitleColorArray:buttonTitleColorArray + buttonEnabledNoWithTitleArray:nil + textFieldPlaceholderArray:nil + textFieldConfigurationActionBlock:nil +#if TARGET_OS_IOS + popoverPresentationControllerBlock:popoverPresentationControllerBlock +#endif + block:block]; +} + +/** + 快速创建一个系统 attributedTitle UIAlertController-ActionSheet + + @param viewController 显示的VC + @param attributedTitle attributedTitle + @param attributedMessage attributedMessage + @param buttonTitleArray 按钮数组 + @param buttonTitleColorArray 按钮颜色数组,默认:系统蓝色,如果颜色数组个数小于title数组个数,则全部为默认蓝色 + @param popoverPresentationControllerBlock popoverPresentationControllerBlock description + @param block block + @return UIAlertController-ActionSheet + */ ++ (nonnull instancetype)ba_actionSheetAttributedShowInViewController:(nonnull UIViewController *)viewController + attributedTitle:(nullable NSMutableAttributedString *)attributedTitle + attributedMessage:(nullable NSMutableAttributedString *)attributedMessage + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray +#if TARGET_OS_IOS + popoverPresentationControllerBlock:(nullable UIAlertControllerPopoverPresentationControllerBlock)popoverPresentationControllerBlock +#endif + block:(nullable BAKit_AlertControllerButtonActionBlock)block +{ + return [self ba_alertControllerShowInViewController:viewController + title:nil + attributedTitle:attributedTitle + message:nil + attributedMessage:attributedMessage + preferredStyle:UIAlertControllerStyleActionSheet + buttonTitleArray:buttonTitleArray + buttonTitleColorArray:buttonTitleColorArray + buttonEnabledNoWithTitleArray:nil + textFieldPlaceholderArray:nil + textFieldConfigurationActionBlock:nil +#if TARGET_OS_IOS + popoverPresentationControllerBlock:popoverPresentationControllerBlock +#endif + block:block]; +} + + ++ (instancetype)ba_alertControllerShowInViewController:(UIViewController *)viewController + title:(NSString *)title + attributedTitle:(nullable NSMutableAttributedString *)attributedTitle + message:(NSString *)message + attributedMessage:(nullable NSMutableAttributedString *)attributedMessage + preferredStyle:(UIAlertControllerStyle)preferredStyle + buttonTitleArray:(nullable NSArray *)buttonTitleArray + buttonTitleColorArray:(nullable NSArray *)buttonTitleColorArray + buttonEnabledNoWithTitleArray:(NSArray *_Nullable)buttonEnabledNoWithTitleArray + textFieldPlaceholderArray:(NSArray *_Nullable)textFieldPlaceholderArray + textFieldConfigurationActionBlock:(nullable BAKit_AlertControllerTextFieldConfigurationActionBlock)textFieldConfigurationActionBlock +#if TARGET_OS_IOS + popoverPresentationControllerBlock:(void(^)(UIPopoverPresentationController *popover))popoverPresentationControllerBlock +#endif + block:(BAKit_AlertControllerButtonActionBlock)block +{ + UIAlertController *strongController = [self alertControllerWithTitle:title + message:message + preferredStyle:preferredStyle]; + + __weak UIAlertController *alertController = strongController; + + if (buttonTitleArray) + { + for (NSUInteger i = 0; i < buttonTitleArray.count; i++) + { + NSString *buttonTitle = buttonTitleArray[i]; + + UIAlertAction *action = [UIAlertAction actionWithTitle:buttonTitle + style:UIAlertActionStyleDefault + handler:^(UIAlertAction *action){ + if (block) + { + block(alertController, action, i); + } + }]; + [alertController addAction:action]; + + for (NSInteger j = 0; j < buttonEnabledNoWithTitleArray.count; j ++) + { + if ([buttonEnabledNoWithTitleArray[j] isEqualToString:buttonTitle]) + { + action.enabled = NO; + } + } + + if (!buttonTitleColorArray || buttonTitleColorArray.count == 0 || + buttonTitleColorArray.count < buttonTitleArray.count) + { + NSMutableArray *mutArr = [NSMutableArray array]; + for (NSInteger i = 0; i < buttonTitleArray.count; i ++) + { + [mutArr addObject:[UIColor blueColor]]; + } + buttonTitleColorArray = [mutArr mutableCopy]; + } + if (buttonTitleColorArray) + { + [strongController setAlertWithAlert:strongController + mutableAttributedTitle:attributedTitle + mutableAttributedMessage:attributedMessage + Action:action + buttonTitleColor:buttonTitleColorArray[i]]; + } + } + } + if (textFieldPlaceholderArray) + { + for (NSInteger i = 0; i < textFieldPlaceholderArray.count; i++) + { + [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { + + textField.placeholder = textFieldPlaceholderArray[i]; + if (textFieldConfigurationActionBlock) + { + textFieldConfigurationActionBlock(textField, i); + } + }]; + } + } + + if (preferredStyle == UIAlertControllerStyleActionSheet) + { + UIAlertAction *action = [UIAlertAction actionWithTitle:@"取 消" + style:UIAlertActionStyleCancel + handler:nil]; + [alertController addAction:action]; + } + +#if TARGET_OS_IOS + if (popoverPresentationControllerBlock) + { + popoverPresentationControllerBlock(alertController.popoverPresentationController); + } +#endif + + [viewController.ba_currentViewController presentViewController:alertController animated:YES completion:nil]; + + return alertController; +} + +#pragma mark - setter / getter + +- (void)setAlertWithAlert:(UIAlertController * __nonnull )alert + mutableAttributedTitle:(NSMutableAttributedString *)mutableAttributedTitle + mutableAttributedMessage:(nullable NSMutableAttributedString *)mutableAttributedMessage + Action:(UIAlertAction * __nonnull )action + buttonTitleColor:(UIColor *)buttonTitleColor +{ + /*! 1、首先获得对应的属性 */ +// NSArray *propertysListArray = [[UIAlertController class] ba_propertysList]; +// NSLog(@"1、获取【UIAlertController】所有的属性名:%@", propertysListArray); + + /*! 2、获得成员变量 */ + NSArray *ivarListArray = [[UIAlertAction class] ba_ivarList]; +// NSLog(@"2、获取【UIAlertController】所有的成员变量:%@", ivarListArray); + + for (NSInteger i = 0; i < ivarListArray.count; i++) + { + NSString *ivarName = ivarListArray[i]; + if ([ivarName isEqualToString:@"_titleTextColor"]) + { + [action setValue:buttonTitleColor forKey:@"titleTextColor"]; + } + } + + /*! 3、改变显示提示字体颜色 */ + NSArray *propertysListArray2 = [[UIAlertController class] ba_ivarList]; +// NSLog(@"3、获取【UIAlertController】所有的成员变量:%@", propertysListArray2); + for (NSInteger i = 0; i < propertysListArray2.count; i++) + { + NSString *ivarName = propertysListArray2[i]; + if ([ivarName isEqualToString:@"_attributedTitle"]) + { + [alert setValue:mutableAttributedTitle forKey:@"attributedTitle"]; + } + if ([ivarName isEqualToString:@"_attributedMessage"]) + { + [alert setValue:mutableAttributedMessage forKey:@"attributedMessage"]; + } + } +} + +@end + +@implementation UIViewController (BAKit) + +- (UIViewController *)ba_currentViewController +{ + UIViewController *topVC = self; + + UIViewController *above; + while ((above = topVC.presentedViewController)) { + topVC = above; + } + + return topVC; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIBarButtonItem+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIBarButtonItem+BAKit.m" index 6d8bddc..6678efd 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIBarButtonItem+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIBarButtonItem+BAKit.m" @@ -121,10 +121,10 @@ + (UIBarButtonItem *)leftChangeItemWithTitle:(NSString *)title Icon:(NSString *) [button setTitle:title forState:UIControlStateNormal]; [button setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal]; [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; - [button setTitleColor:BA_COLOR(220, 33, 43, 1.0) forState:UIControlStateNormal]; + [button setTitleColor:BAKit_Color_RGBA(220, 33, 43, 1.0) forState:UIControlStateNormal]; button.titleLabel.font = [UIFont systemFontOfSize:14]; [button sizeToFit]; - CGSize size = [title sizeOfMaxSize:CGSizeMake(1000, button.frame.size.height) fontSize:14.0f]; + CGSize size = [title ba_stringGetSizeWithMaxSize:CGSizeMake(1000, button.frame.size.height) fontSize:14.0f]; button.frame = (CGRect){CGPointZero, size.width + 25, button.frame.size.height}; [button setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; return [[UIBarButtonItem alloc] initWithCustomView:button]; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.h" deleted file mode 100755 index 1dcf52f..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.h" +++ /dev/null @@ -1,146 +0,0 @@ - -/*! - * @header BAKit - * demoTest - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - ********************************************************************************* - - */ - -#import -#import "UIFont+BAKit.h" - -/** - * 给UIButton类添加许多有用的方法 - */ -@interface UIButton (BAKit) - -/** - * 给定框架创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame; - -/** - * 给定框架和字符串(字符串字体颜色默认是白色)创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title; - -/** - * 给定框架、字符串和背景图片创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - backgroundImage:(UIImage *)backgroundImage; - -/** - * 给定框架、字符串、背景图片和高亮背景图片创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - backgroundImage:(UIImage *)backgroundImage -highlightedBackgroundImage:(UIImage *)highlightedBackgroundImage; - -/** - * 给定框架、字符串、颜色创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - color:(UIColor *)color; - -/** - * 给定框架、字符串、背景颜色和高亮背景颜色创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - color:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor; - -/** - * 给定框架、颜色创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - color:(UIColor *)color; - -/** - * 给定框架、背景颜色和高亮背景颜色创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - color:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor; - -/** - * 给定框架和图片创建一个UIButton对象 - */ -+ (id)initWithFrame:(CGRect)frame - image:(UIImage *)image; - -/** - * 给定框架、背景图片和高亮背景图片创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - image:(UIImage *)image - highlightedImage:(UIImage *)highlightedImage; - -/** - * 设置字符字体和大小 - */ -- (void)setTitleFont:(FontName)fontName - size:(CGFloat)size; - -/** - * 设置字符颜色 - */ -- (void)setTitleColor:(UIColor *)color; - -/** - * 设置字符颜色和高亮颜色 - */ -- (void)setTitleColor:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor; - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.m" deleted file mode 100755 index f634998..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIButton+BAKit.m" +++ /dev/null @@ -1,206 +0,0 @@ - -/*! - * @header BAKit - * demoTest - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - ********************************************************************************* - - */ - -#import "UIButton+BAKit.h" -#import "UIImage+BAKit.h" -#import "UIColor+BAKit.h" - -@implementation UIButton (BAKit) - -/* 给定框架创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame -{ - return [UIButton initWithFrame:frame - title:nil]; -} - -/* 给定框架和字符串(字符串字体颜色默认是白色)创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title -{ - return [UIButton initWithFrame:frame - title:title - backgroundImage:nil]; -} - -/* 给定框架、字符串和背景图片创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - backgroundImage:(UIImage *)backgroundImage -{ - return [UIButton initWithFrame:frame - title:title - backgroundImage:backgroundImage - highlightedBackgroundImage:nil]; -} - -/* 给定框架、字符串、背景图片和高亮背景图片创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - backgroundImage:(UIImage *)backgroundImage -highlightedBackgroundImage:(UIImage *)highlightedBackgroundImage -{ - UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; - [button setFrame:frame]; - [button setTitle:title - forState:UIControlStateNormal]; - [button setBackgroundImage:backgroundImage - forState:UIControlStateNormal]; - [button setBackgroundImage:highlightedBackgroundImage - forState:UIControlStateHighlighted]; - return button; -} - -/* 给定框架、字符串、颜色创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - color:(UIColor *)color -{ - // 返回与'色'关联的颜色组件(包括透明度) - const CGFloat *components = CGColorGetComponents(color.CGColor); - return [UIButton initWithFrame:frame - title:title - backgroundImage:[UIImage imageWithColor:color] - highlightedBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:components[0]-0.1 - green:components[1]-0.1 - blue:components[2]-0.1 - alpha:1]]]; -} - -/* 给定框架、字符串、背景颜色和高亮背景颜色创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - title:(NSString *)title - color:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor -{ - return [UIButton initWithFrame:frame - title:title - backgroundImage:[UIImage imageWithColor:color] - highlightedBackgroundImage:[UIImage imageWithColor:highlightedColor]]; -} - -/* 给定框架、颜色创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - color:(UIColor *)color -{ - // 返回与'色'关联的颜色组件(包括透明度) - const CGFloat *components = CGColorGetComponents(color.CGColor); - return [UIButton initWithFrame:frame - title:nil - backgroundImage:[UIImage imageWithColor:color] - highlightedBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:components[0]-0.1 - green:components[1]-0.1 - blue:components[2]-0.1 - alpha:1]]]; -} - -/* 给定框架、背景颜色和高亮背景颜色创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - color:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor -{ - return [UIButton initWithFrame:frame - title:nil - backgroundImage:[UIImage imageWithColor:color] - highlightedBackgroundImage:[UIImage imageWithColor:highlightedColor]]; -} - -/* 给定框架和图片创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - image:(UIImage *)image -{ - return [UIButton initWithFrame:frame - image:image - highlightedImage:nil]; -} - -/* 给定框架、背景图片和高亮背景图片创建一个UIButton对象 */ -+ (id)initWithFrame:(CGRect)frame - image:(UIImage *)image - highlightedImage:(UIImage *)highlightedImage -{ - UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; - [button setFrame:frame]; - [button setImage:image - forState:UIControlStateNormal]; - [button setImage:highlightedImage - forState:UIControlStateHighlighted]; - return button; -} - -/* 设置字符字体和大小 */ -- (void)setTitleFont:(FontName)fontName - size:(CGFloat)size -{ - [self.titleLabel setFont:[UIFont fontForFontName:fontName - size:size]]; -} - -/* 设置字符颜色 */ -- (void)setTitleColor:(UIColor *)color -{ - [self setTitleColor:color - highlightedColor:[UIColor colorWithColor:color - alpha:0.4]]; -} - -/* 设置字符颜色和高亮颜色 */ -- (void)setTitleColor:(UIColor *)color - highlightedColor:(UIColor *)highlightedColor -{ - [self setTitleColor:color - forState:UIControlStateNormal]; - [self setTitleColor:highlightedColor - forState:UIControlStateHighlighted]; -} -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.h" new file mode 100755 index 0000000..f6a1b22 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.h" @@ -0,0 +1,79 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +//https://github.com/AugustRush/UICollectionView-ARDynamicHeightLayoutCell +#import + +@interface UICollectionView (ARDynamicCacheHeightLayoutCell) + +/** + * caculate cell size + * + * @param identifier cell's reuse identifier + * @param indexPath indexPath + * @param configuration fill cell with you feed data + * + * @return the caculated cell's height + */ +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + configuration: + (void (^)(__kindof UICollectionViewCell *)) + configuration; + +/** + * caculate cell size with a fixed width + * + * @param identifier cell's reuse identifier + * @param indexPath indexPath + * @param fixedWidth your expect width + * @param configuration fill cell with you feed data + * + * @return the caculated cell's height + */ + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + fixedWidth:(CGFloat)fixedWidth + configuration: + (void (^)(__kindof UICollectionViewCell *cell)) + configuration; + +/** + * caculate cell size with fixed height + * + * @param identifier cell's reuse identifier + * @param indexPath indexPath + * @param fixedWidth your expect height + * @param configuration fill cell with you feed data + * + * @return the caculated cell's height + */ + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + fixedHeight:(CGFloat)fixedHeight + configuration: + (void (^)(__kindof UICollectionViewCell *cell)) + configuration; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.m" new file mode 100755 index 0000000..16d280b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UICollectionView+ARDynamicCacheHeightLayoutCell.m" @@ -0,0 +1,298 @@ +// The MIT License (MIT) +// +// Copyright (c) 2015 +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#import "UICollectionView+ARDynamicCacheHeightLayoutCell.h" +#import + +typedef NS_ENUM(NSUInteger, ARDynamicSizeCaculateType) { + ARDynamicSizeCaculateTypeSize = 0, + ARDynamicSizeCaculateTypeHeight, + ARDynamicSizeCaculateTypeWidth +}; + +#define ARLayoutCellInvalidateValue [NSValue valueWithCGSize:CGSizeZero] + +@implementation UICollectionView (ARDynamicCacheHeightLayoutCell) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self swizzlingMethods]; + }); +} + ++ (void)swizzlingMethods { + SEL selectors[] = { + @selector(registerNib:forCellWithReuseIdentifier:), + @selector(registerClass:forCellWithReuseIdentifier:), + @selector(reloadData), + @selector(reloadSections:), + @selector(deleteSections:), + @selector(moveSection:toSection:), + @selector(reloadItemsAtIndexPaths:), + @selector(deleteItemsAtIndexPaths:), + @selector(moveItemAtIndexPath:toIndexPath:) + }; + + for (int i = 0; i < sizeof(selectors) / sizeof(SEL); i++) { + SEL originalSelector = selectors[i]; + SEL swizzledSelector = NSSelectorFromString([@"ar_" + stringByAppendingString:NSStringFromSelector(originalSelector)]); + + Method originalMethod = class_getInstanceMethod(self, originalSelector); + Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector); + + method_exchangeImplementations(originalMethod, swizzledMethod); + } +} + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + configuration: + (void (^)(__kindof UICollectionViewCell *)) + configuration { + return [self ar_sizeForCellWithIdentifier:identifier + indexPath:indexPath + fixedValue:0 + caculateType:ARDynamicSizeCaculateTypeSize + configuration:configuration]; +} + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + fixedWidth:(CGFloat)fixedWidth + configuration: + (void (^)(__kindof UICollectionViewCell *)) + configuration { + return [self ar_sizeForCellWithIdentifier:identifier + indexPath:indexPath + fixedValue:fixedWidth + caculateType:ARDynamicSizeCaculateTypeWidth + configuration:configuration]; +} + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + fixedHeight:(CGFloat)fixedHeight + configuration: + (void (^)(__kindof UICollectionViewCell *)) + configuration { + return [self ar_sizeForCellWithIdentifier:identifier + indexPath:indexPath + fixedValue:fixedHeight + caculateType:ARDynamicSizeCaculateTypeHeight + configuration:configuration]; +} + +- (CGSize)ar_sizeForCellWithIdentifier:(NSString *)identifier + indexPath:(NSIndexPath *)indexPath + fixedValue:(CGFloat)fixedValue + caculateType:(ARDynamicSizeCaculateType)caculateType + configuration: + (void (^)(__kindof UICollectionViewCell *)) + configuration { + BOOL hasCache = [self hasCacheAtIndexPath:indexPath]; + if (hasCache) { + if (![[self sizeCacheAtIndexPath:indexPath] + isEqualToValue:ARLayoutCellInvalidateValue]) { + return [[self sizeCacheAtIndexPath:indexPath] CGSizeValue]; + } + } + + // has no size chche + UICollectionViewCell *cell = + [self templeCaculateCellWithIdentifier:identifier]; + configuration(cell); + CGSize size = CGSizeMake(fixedValue, fixedValue); + if (caculateType != ARDynamicSizeCaculateTypeSize) { + NSLayoutAttribute attribute = caculateType == ARDynamicSizeCaculateTypeWidth + ? NSLayoutAttributeWidth + : NSLayoutAttributeHeight; + NSLayoutConstraint *tempConstraint = + [NSLayoutConstraint constraintWithItem:cell.contentView + attribute:attribute + relatedBy:NSLayoutRelationEqual + toItem:nil + attribute:NSLayoutAttributeNotAnAttribute + multiplier:1 + constant:fixedValue]; + [cell.contentView addConstraint:tempConstraint]; + size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; + [cell.contentView removeConstraint:tempConstraint]; + } else { + size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; + } + + NSMutableArray *sectionCache = [self sizeCache][indexPath.section]; + NSValue *sizeValue = [NSValue valueWithCGSize:size]; + if (hasCache) { + [sectionCache replaceObjectAtIndex:indexPath.row withObject:sizeValue]; + } else { + [sectionCache insertObject:sizeValue atIndex:indexPath.row]; + } + return size; +} + +#pragma mark - swizzled methods + +- (void)ar_registerClass:(Class)cellClass + forCellWithReuseIdentifier:(NSString *)identifier { + [self ar_registerClass:cellClass forCellWithReuseIdentifier:identifier]; + + id cell = [[cellClass alloc] initWithFrame:CGRectZero]; + NSMutableDictionary *templeCells = [self templeCells]; + templeCells[identifier] = cell; +} + +- (void)ar_registerNib:(UINib *)nib + forCellWithReuseIdentifier:(NSString *)identifier { + [self ar_registerNib:nib forCellWithReuseIdentifier:identifier]; + id cell = [[nib instantiateWithOwner:nil options:nil] lastObject]; + NSMutableDictionary *templeCells = [self templeCells]; + templeCells[identifier] = cell; +} + +#pragma mark - section changes + +- (void)ar_reloadSections:(NSIndexSet *)sections { + [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { + [[self sizeCache] replaceObjectAtIndex:idx withObject:@[].mutableCopy]; + }]; + [self ar_reloadSections:sections]; +} + +- (void)ar_deleteSections:(NSIndexSet *)sections { + [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { + [[self sizeCache] removeObjectAtIndex:idx]; + }]; + [self ar_deleteSections:sections]; +} + +- (void)ar_moveSection:(NSInteger)section toSection:(NSInteger)newSection { + [[self sizeCache] exchangeObjectAtIndex:section withObjectAtIndex:newSection]; + [self ar_moveSection:section toSection:newSection]; +} + +#pragma mark - item changes + +- (void)ar_deleteItemsAtIndexPaths:(NSArray *)indexPaths { + [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath *obj, NSUInteger idx, + BOOL *stop) { + NSMutableArray *section = [self sizeCache][obj.section]; + [section removeObjectAtIndex:obj.row]; + }]; + [self ar_deleteItemsAtIndexPaths:indexPaths]; +} + +- (void)ar_reloadItemsAtIndexPaths:(NSArray *)indexPaths { + [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath *obj, NSUInteger idx, + BOOL *stop) { + if ([self.sizeCache count] > obj.section) { + NSMutableArray *section = [self sizeCache][obj.section]; + section[obj.row] = ARLayoutCellInvalidateValue; + } + }]; + [self ar_reloadItemsAtIndexPaths:indexPaths]; +} + +- (void)ar_moveItemAtIndexPath:(NSIndexPath *)indexPath + toIndexPath:(NSIndexPath *)newIndexPath { + if ([self hasCacheAtIndexPath:indexPath] && + [self hasCacheAtIndexPath:newIndexPath]) { + NSValue *indexPathSizeValue = [self sizeCacheAtIndexPath:indexPath]; + NSValue *newIndexPathSizeValue = [self sizeCacheAtIndexPath:newIndexPath]; + + NSMutableArray *section1 = [self sizeCache][indexPath.section]; + NSMutableArray *section2 = [self sizeCache][newIndexPath.section]; + [section1 replaceObjectAtIndex:indexPath.row + withObject:newIndexPathSizeValue]; + [section2 replaceObjectAtIndex:newIndexPath.row + withObject:indexPathSizeValue]; + } + [self ar_moveItemAtIndexPath:indexPath toIndexPath:newIndexPath]; +} + +- (void)ar_reloadData { + [[self sizeCache] removeAllObjects]; + [self ar_reloadData]; +} + +#pragma mark - private methods + +- (NSMutableDictionary *)templeCells { + NSMutableDictionary *templeCells = objc_getAssociatedObject(self, _cmd); + if (templeCells == nil) { + templeCells = @{}.mutableCopy; + objc_setAssociatedObject(self, _cmd, templeCells, + OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + return templeCells; +} + +- (id)templeCaculateCellWithIdentifier:(NSString *)identifier { + NSMutableDictionary *templeCells = [self templeCells]; + id cell = [templeCells objectForKey:identifier]; + if (cell == nil) { + NSDictionary *cellNibDict = [self valueForKey:@"_cellNibDict"]; + UINib *cellNIb = cellNibDict[identifier]; + cell = [[cellNIb instantiateWithOwner:nil options:nil] lastObject]; + templeCells[identifier] = cell; + } + + return cell; +} + +#pragma mark - cache methods + +- (NSMutableArray *)sizeCache { + NSMutableArray *cache = objc_getAssociatedObject(self, _cmd); + if (cache == nil) { + cache = @[].mutableCopy; + objc_setAssociatedObject(self, _cmd, cache, OBJC_ASSOCIATION_RETAIN); + } + return cache; +} + +- (BOOL)hasCacheAtIndexPath:(NSIndexPath *)indexPath { + BOOL hasCache = NO; + NSMutableArray *cacheArray = [self sizeCache]; + if (cacheArray.count > indexPath.section) { + if ([cacheArray[indexPath.section] count] > indexPath.row) { + hasCache = YES; + } + } else { + NSUInteger index = cacheArray.count; + for (; index < indexPath.section + 1; index++) { + [cacheArray addObject:@[].mutableCopy]; + } + } + + return hasCache; +} + +- (NSValue *)sizeCacheAtIndexPath:(NSIndexPath *)indexPath { + NSValue *sizeValue = [self sizeCache][indexPath.section][indexPath.row]; + return sizeValue; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.h" index 51cc3fd..5e18c2c 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.h" @@ -60,50 +60,67 @@ @import UIKit; -/** - * 给UIColor类添加许多有用的方法 - */ @interface UIColor (BAKit) -/** + +/*! * 返回一个RGBA格式的UIColor对象 */ -#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a] +#define KRGBA(r, g, b, a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a] -/** +/*! * 返回一个RGB格式的UIColor对象 */ -#define RGB(r, g, b) RGBA(r, g, b, 1.0f) +#define KRGB(r, g, b) RGBA(r, g, b, 1.0f) -/** +/*! * 从HEX字符串得到一个UIColor对象 */ + (UIColor *)colorWithHexString:(NSString *)hexString; + (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha; -/** +/*! + * 获取字符,转换数据类型,改变部分字体颜色 + * + * @param string string + * @param start 开始位置 + * @param length 截取长度 + * + * @return float + */ ++ (CGFloat)colorComponentFrom:(NSString *)string + start:(NSUInteger)start + length:(NSUInteger)length; + +/*! * 从HEX数值得到一个UIColor对象 */ + (UIColor *)colorWithHex:(unsigned int)hex; -/** +/*! * 从HEX数值和Alpha数值得到一个UIColor对象 */ + (UIColor *)colorWithHex:(unsigned int)hex alpha:(float)alpha; -/** +/*! * 创建一个随机UIColor对象 */ + (UIColor *)randomColor; -/** +/*! * 从已知UIColor对象和Alpha对象得到一个UIColor对象 */ + (UIColor *)colorWithColor:(UIColor *)color alpha:(float)alpha; -//UIColor 转UIImage -+ (UIImage *)imageWithColor: (UIColor*) color; +/*! + * UIColor 转UIImage + * + * @param color color + * + * @return UIColor 转UIImage + */ ++ (UIImage *)imageWithColor:(UIColor *)color; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.m" index 81fe950..32ac867 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIColor+BAKit.m" @@ -62,7 +62,7 @@ @implementation UIColor (BAKit) -/* 从HEX字符串得到一个UIColor对象 */ +/*! 从HEX字符串得到一个UIColor对象 */ + (UIColor *)colorWithHexString:(NSString *)hexString { // 获取目标字符串,替换字符并转换成大写字符串 @@ -134,7 +134,15 @@ + (UIColor *)colorWithHexString:(NSString *)hexString alpha:alpha]; } -/* 获取字符,转换数据类型 */ +/*! + * 获取字符,转换数据类型,改变部分字体颜色 + * + * @param string string + * @param start 开始位置 + * @param length 截取长度 + * + * @return float + */ + (CGFloat)colorComponentFrom:(NSString *)string start:(NSUInteger)start length:(NSUInteger)length @@ -245,8 +253,14 @@ + (UIColor *)colorWithHexString:(NSString *)color alpha:(CGFloat)alpha return [UIColor colorWithRed:((float)r / 255.0f) green:((float)g / 255.0f) blue:((float)b / 255.0f) alpha:alpha]; } -// UIColor 转UIImage -+ (UIImage*) imageWithColor: (UIColor*) color +/*! + * UIColor 转UIImage + * + * @param color color + * + * @return UIColor 转UIImage + */ ++ (UIImage *)imageWithColor:(UIColor *)color { CGRect rect=CGRectMake(0,0, 1, 1); UIGraphicsBeginImageContext(rect.size); diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.h" index 894ef50..a1878f6 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.h" @@ -1,7 +1,7 @@ /*! - * @header BAKit - * demoTest + * @header BAKit.h + * BABaseProject * * @brief BAKit * @@ -10,31 +10,36 @@ * @version V1.0 */ -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? /* @@ -42,11 +47,13 @@ * * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + ********************************************************************************* */ @@ -63,11 +70,30 @@ */ #define IOS_VERSION [UIDevice currentDevice].systemVersion +//#define isiOS10 ([[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] stringByAppendingString:@"0"] intValue] == 10) + +#define isiOS10 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) + +/*! 大于8.0 */ +#define IOS8x ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) + +//#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) + +/*! 判断真机还是模拟器 */ +#if TARGET_IPHONE_SIMULATOR +//NSLog(@"run on simulator"); +#define BA_SIMULATOR_TEST +#else +//不定义SIMULATOR_TEST这个宏 +//NSLog(@"run on device"); +#endif + + /** * 获取屏幕宽度和高度 */ -#define SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) -#define SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) +#define BA_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) +#define BA_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) /** * 系统版本号对比 @@ -84,6 +110,29 @@ // 系统版本小于等于 #define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending) +/*! 判断当前的iPhone设备 */ +// 判断是否为iPhone +//#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) +#define IS_IPHONE ([[[UIDevice currentDevice] model] isEqualToString:@"iPhone"]) + +// 判断是否为iPad +//#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) +#define IS_IPAD ([[[UIDevice currentDevice] model] isEqualToString:@"iPad"]) + +//判断是否为ipod +#define IS_IPOD ([[[UIDevice currentDevice] model] isEqualToString:@"iPod touch"]) + +// 判断是否为 iPhone 5S / SE +#define iPhone5SE [[UIScreen mainScreen] bounds].size.width == 320.0f && [[UIScreen mainScreen] bounds].size.height == 568.0f + +// 判断是否为iPhone 6/6s +#define iPhone6_6s [[UIScreen mainScreen] bounds].size.width == 375.0f && [[UIScreen mainScreen] bounds].size.height == 667.0f + +// 判断是否为iPhone 6Plus/6sPlus +#define iPhone6Plus_6sPlus [[UIScreen mainScreen] bounds].size.width == 414.0f && [[UIScreen mainScreen] bounds].size.height == 736.0f + + + /** * 返回平台设备 */ @@ -178,4 +227,8 @@ * 返回唯一标识符 */ + (NSString *)uniqueIdentifier; + +/*! 调用私有方法实现强制屏幕旋转 */ ++ (void)changeOrientation:(UIInterfaceOrientation)orientation; + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.m" index 2c6d060..ea787cd 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIDevice+BAKit.m" @@ -1,7 +1,7 @@ /*! - * @header BAKit - * demoTest + * @header BAKit.h + * BABaseProject * * @brief BAKit * @@ -10,31 +10,36 @@ * @version V1.0 */ -/*! - * - * ┌─┐ ┌─┐ - * ┌──┘ ┴───────┘ ┴──┐ - * │ │ - * │ ─── │ - * │ ─┬┘ └┬─ │ - * │ │ - * │ ─┴─ │ - * │ │ - * └───┐ ┌───┘ - * │ │ - * │ │ - * │ │ - * │ └──────────────┐ - * │ │ - * │ ├─┐ - * │ ┌─┘ - * │ │ - * └─┐ ┐ ┌───────┬──┐ ┌──┘ - * │ ─┤ ─┤ │ ─┤ ─┤ - * └──┴──┘ └──┴──┘ - * 神兽保佑 - * 代码无BUG! - */ +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? /* @@ -42,15 +47,20 @@ * * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + ********************************************************************************* */ + #import "UIDevice+BAKit.h" #include #include @@ -343,5 +353,16 @@ + (NSString *)generateUUID return (__bridge_transfer NSString *)string; } +/*! 调用私有方法实现强制屏幕旋转 */ ++ (void)changeOrientation:(UIInterfaceOrientation)orientation +{ + SEL selector = NSSelectorFromString(@"setOrientation:"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:[self currentDevice]]; + int val = orientation; + [invocation setArgument:&val atIndex:2]; + [invocation invoke]; +} @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.h" index 7b3e786..8acae42 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.h" @@ -337,8 +337,8 @@ + (instancetype)imageWithStretchableName:(NSString *)imageName; -/*! 获得的就是一个圆形的图片 */ -- (UIImage *)BA_circleImage; +/*! 返回一个圆形的图片 */ +- (UIImage *)ba_circleImage; /*! * creat a circleImage @@ -349,12 +349,14 @@ * * @return creat a circleImage */ -+ (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor; ++ (instancetype)circleImageWithName:(NSString *)name + borderWidth:(CGFloat)borderWidth + borderColor:(UIColor *)borderColor; /*! 加载最原始的图片,没有渲染 */ + (instancetype)imageWithOriginalName:(NSString *)imageName; -/** +/*! * 图片的压缩方法 * * @param sourceImg 要被压缩的图片 @@ -364,34 +366,39 @@ */ + (UIImage *)ba_IMGCompressed:(UIImage *)sourceImg targetWidth:(CGFloat)defineWidth; - -- (UIImage *)ba_circleImage; - -/** +/*! * 图片拉伸 */ + (UIImage *)ba_resizeImage:(NSString *)imgName; -/** +/*! * icon 要裁剪的图片 * borderWith 头像边框的宽度 * borderColor 边框的颜色 */ -+ (instancetype)ba_image:(UIImage *)image borderWith:(CGFloat)borderWith borderColor:(UIColor *)borderColor; ++ (instancetype)ba_image:(UIImage *)image + borderWith:(CGFloat)borderWith + borderColor:(UIColor *)borderColor; -/** - * 缓存图片 - */ -+ (void)ba_writeImageToFileWithImage:(UIImage *)image fileName:(NSString *)fileName; +///*! +// * 缓存图片 +// */ +//+ (void)ba_writeImageToFileWithImage:(UIImage *)image fileName:(NSString *)fileName; -/** - * 取图片 +/*! + * 从本地取图片 */ + (UIImage *)ba_getImageFromFileWithFileName:(NSString *)fileName; -/** - * 图片缩放 +/*! + * 压缩图片尺寸 */ + (UIImage*)ba_imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize; +/*! 图片旋转 */ ++ (UIImage *)ba_rotationImage:(UIImage *)image rotation:(UIImageOrientation)orientation; + +/*! View转化为图片 */ ++ (UIImage *)getImageFromView:(UIView *)view; + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.m" index 4364870..bf4e1cb 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImage+BAKit.m" @@ -40,7 +40,7 @@ CGSize sizeForSizeString(NSString *sizeString) } } -@implementation UIImage (STKit) +@implementation UIImage (BAKit) + (void)load { @@ -804,8 +804,8 @@ + (instancetype)imageWithStretchableName:(NSString *)imageName return [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height * 0.5]; } -/*! 获得的就是一个圆形的图片 */ -- (UIImage *)BA_circleImage +/*! 返回一个圆形的图片 */ +- (UIImage *)ba_circleImage { // 开始图形上下文 UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); @@ -939,23 +939,6 @@ + (UIImage *)ba_IMGCompressed:(UIImage *)sourceImage targetWidth:(CGFloat)define return newImage; } -- (UIImage *)ba_circleImage -{ - UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); - - CGContextRef ctx = UIGraphicsGetCurrentContext(); - - CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); - CGContextAddEllipseInRect(ctx, rect); - CGContextClip(ctx); - [self drawInRect:rect]; - - UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - return image; -} - + (UIImage *)ba_resizeImage:(NSString *)imgName { UIImage *img = [UIImage imageNamed:imgName]; @@ -1004,12 +987,12 @@ + (instancetype)ba_image:(UIImage *)image borderWith:(CGFloat)borderWith borderC return lastImage; } -+ (void)ba_writeImageToFileWithImage:(UIImage *)image fileName:(NSString *)fileName -{ - NSString *path = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.data", fileName]]; - NSData *data = UIImagePNGRepresentation(image); - [data writeToFile:path atomically:YES]; -} +//+ (void)ba_writeImageToFileWithImage:(UIImage *)image fileName:(NSString *)fileName +//{ +// NSString *path = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.data", fileName]]; +// NSData *data = UIImagePNGRepresentation(image); +// [data writeToFile:path atomically:YES]; +//} + (UIImage *)ba_getImageFromFileWithFileName:(NSString *)fileName { @@ -1032,7 +1015,10 @@ + (UIImage *)ba_imageCompressForWidth:(UIImage *)sourceImage return newImage; } -+ (UIImage*)ba_imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize +/*! + * 压缩图片尺寸 + */ ++ (UIImage *)ba_imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize { // Create a graphics image context UIGraphicsBeginImageContext(newSize); @@ -1051,4 +1037,72 @@ + (UIImage*)ba_imageWithImage:(UIImage*)image scaledToSize:(CGSize)newSize return newImage; } +/*! 图片旋转 */ ++ (UIImage *)ba_rotationImage:(UIImage *)image rotation:(UIImageOrientation)orientation +{ + long double rotate = 0.0; + CGRect rect; + float translateX = 0; + float translateY = 0; + float scaleX = 1.0; + float scaleY = 1.0; + + switch (orientation) { + case UIImageOrientationLeft: + rotate = M_PI_2; + rect = CGRectMake(0, 0, image.size.height, image.size.width); + translateX = 0; + translateY = -rect.size.width; + scaleY = rect.size.width/rect.size.height; + scaleX = rect.size.height/rect.size.width; + break; + case UIImageOrientationRight: + rotate = 3 * M_PI_2; + rect = CGRectMake(0, 0, image.size.height, image.size.width); + translateX = -rect.size.height; + translateY = 0; + scaleY = rect.size.width/rect.size.height; + scaleX = rect.size.height/rect.size.width; + break; + case UIImageOrientationDown: + rotate = M_PI; + rect = CGRectMake(0, 0, image.size.width, image.size.height); + translateX = -rect.size.width; + translateY = -rect.size.height; + break; + default: + rotate = 0.0; + rect = CGRectMake(0, 0, image.size.width, image.size.height); + translateX = 0; + translateY = 0; + break; + } + + UIGraphicsBeginImageContext(rect.size); + CGContextRef context = UIGraphicsGetCurrentContext(); + //做CTM变换 + CGContextTranslateCTM(context, 0.0, rect.size.height); + CGContextScaleCTM(context, 1.0, -1.0); + CGContextRotateCTM(context, rotate); + CGContextTranslateCTM(context, translateX, translateY); + + CGContextScaleCTM(context, scaleX, scaleY); + //绘制图片 + CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage); + + UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext(); + + return newPic; +} + +/*! View转化为图片 */ ++ (UIImage *)getImageFromView:(UIView *)view +{ + UIGraphicsBeginImageContext(view.bounds.size); + [view.layer renderInContext:UIGraphicsGetCurrentContext()]; + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + return image; +} + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImageView+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImageView+BAKit.m" index c67151e..3eb1360 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImageView+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIImageView+BAKit.m" @@ -97,7 +97,7 @@ - (void)ba_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder - (void)ba_setHeardWithUrl:(NSString *)hearUrl { - UIImage *placeHolder = [[UIImage imageNamed:BA_PLACEHOLDER_IMAGE] ba_circleImage]; + UIImage *placeHolder = [[UIImage imageNamed:BA_placeHolder_Image] ba_circleImage]; [self sd_setImageWithURL:[NSURL URLWithString:hearUrl] placeholderImage:placeHolder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { self.image = image ? [image ba_circleImage] : placeHolder; }]; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.h" new file mode 100755 index 0000000..24b168b --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.h" @@ -0,0 +1,62 @@ +// +// UILabel+BAAttributeTextTapAction +// testDemo +// +// Created by 博爱 on 2016/11/7. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import + +/*! 源码:https://github.com/lyb5834/YBAttributeTextTapAction */ + +@protocol BAAttributeTapActionDelegate + +@optional +/** + * BAAttributeTapActionDelegate + * + * @param string 点击的字符串 + * @param range 点击的字符串range + * @param index 点击的字符在数组中的index + */ +- (void)ba_attributeTapReturnString:(NSString *)string + range:(NSRange)range + index:(NSInteger)index; +@end + +@interface BAAttributeModel : NSObject + +@property (nonatomic, copy) NSString *str; + +@property (nonatomic, assign) NSRange range; + +@end + +@interface UILabel (BAAttributeTextTapAction) + +/** + * 是否打开点击效果,默认是打开 + */ +@property (nonatomic, assign) BOOL enabledTapEffect; + +/** + * 给文本添加点击事件Block回调 + * + * @param strings 需要添加的字符串数组 + * @param tapClick 点击事件回调 + */ +- (void)ba_addAttributeTapActionWithStrings:(NSArray *)strings + tapClicked:(void (^) (NSString *string , NSRange range , NSInteger index))tapClick; + +/** + * 给文本添加点击事件delegate回调 + * + * @param strings 需要添加的字符串数组 + * @param delegate delegate + */ +- (void)ba_addAttributeTapActionWithStrings:(NSArray *)strings + delegate:(id )delegate; + +@end + diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.m" new file mode 100755 index 0000000..ac5c90f --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UILabel+BAAttributeTextTapAction.m" @@ -0,0 +1,386 @@ +// +// UILabel+BAAttributeTextTapAction.m +// testDemo +// +// Created by 博爱 on 2016/11/7. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "UILabel+BAAttributeTextTapAction.h" +#import +#import +#import + +@implementation BAAttributeModel + +@end + +@implementation UILabel (BAAttributeTextTapAction) + +#pragma mark - AssociatedObjects + +- (NSMutableArray *)attributeStrings +{ + return objc_getAssociatedObject(self, _cmd); +} + +- (void)setAttributeStrings:(NSMutableArray *)attributeStrings +{ + objc_setAssociatedObject(self, @selector(attributeStrings), attributeStrings, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (NSMutableDictionary *)effectDic +{ + return objc_getAssociatedObject(self, _cmd); +} + +- (void)setEffectDic:(NSMutableDictionary *)effectDic +{ + objc_setAssociatedObject(self, @selector(effectDic), effectDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +- (BOOL)isTapAction +{ + return [objc_getAssociatedObject(self, _cmd) boolValue]; +} + +- (void)setIsTapAction:(BOOL)isTapAction +{ + objc_setAssociatedObject(self, @selector(isTapAction), @(isTapAction), OBJC_ASSOCIATION_ASSIGN); +} + +- (void (^)(NSString *, NSRange, NSInteger))tapBlock +{ + return objc_getAssociatedObject(self, _cmd); +} + +- (void)setTapBlock:(void (^)(NSString *, NSRange, NSInteger))tapBlock +{ + objc_setAssociatedObject(self, @selector(tapBlock), tapBlock, OBJC_ASSOCIATION_COPY_NONATOMIC); +} + +- (id)delegate +{ + return objc_getAssociatedObject(self, _cmd); +} + +- (BOOL)enabledTapEffect +{ + return [objc_getAssociatedObject(self, _cmd) boolValue]; +} + +- (void)setEnabledTapEffect:(BOOL)enabledTapEffect +{ + objc_setAssociatedObject(self, @selector(enabledTapEffect), @(enabledTapEffect), OBJC_ASSOCIATION_ASSIGN); + self.isTapEffect = enabledTapEffect; +} + +- (BOOL)isTapEffect +{ + return [objc_getAssociatedObject(self, _cmd) boolValue]; +} + +- (void)setIsTapEffect:(BOOL)isTapEffect +{ + objc_setAssociatedObject(self, @selector(isTapEffect), @(isTapEffect), OBJC_ASSOCIATION_ASSIGN); +} + +- (void)setDelegate:(id)delegate +{ + objc_setAssociatedObject(self, @selector(delegate), delegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - mainFunction +- (void)ba_addAttributeTapActionWithStrings:(NSArray *)strings tapClicked:(void (^) (NSString *string , NSRange range , NSInteger index))tapClick +{ + [self ba_getRangesWithStrings:strings]; + + if (self.tapBlock != tapClick) { + self.tapBlock = tapClick; + } +} + +- (void)ba_addAttributeTapActionWithStrings:(NSArray *)strings + delegate:(id )delegate +{ + [self ba_getRangesWithStrings:strings]; + + if (self.delegate != delegate) { + self.delegate = delegate; + } +} + +#pragma mark - touchAction +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + if (!self.isTapAction) { + return; + } + + if (objc_getAssociatedObject(self, @selector(enabledTapEffect))) { + self.isTapEffect = self.enabledTapEffect; + } + + UITouch *touch = [touches anyObject]; + + CGPoint point = [touch locationInView:self]; + + __weak typeof(self) weakSelf = self; + + [self ba_getTapFrameWithTouchPoint:point result:^(NSString *string, NSRange range, NSInteger index) { + + if (weakSelf.tapBlock) { + weakSelf.tapBlock (string , range , index); + } + + if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(ba_attributeTapReturnString:range:index:)]) { + [weakSelf.delegate ba_attributeTapReturnString:string range:range index:index]; + } + + if (self.isTapEffect) { + + [self ba_saveEffectDicWithRange:range]; + + [self ba_tapEffectWithStatus:YES]; + } + + }]; +} + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { + + if (self.isTapAction) { + if ([self ba_getTapFrameWithTouchPoint:point result:nil]) { + return self; + } + } + return [super hitTest:point withEvent:event]; +} + +#pragma mark - getTapFrame +- (BOOL)ba_getTapFrameWithTouchPoint:(CGPoint)point result:(void (^) (NSString *string , NSRange range , NSInteger index))resultBlock +{ + CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)self.attributedText); + + CGMutablePathRef Path = CGPathCreateMutable(); + + CGPathAddRect(Path, NULL, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)); + + CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL); + + CFRange range = CTFrameGetVisibleStringRange(frame); + + if (self.attributedText.length > range.length) { + + UIFont *font ; + + if ([self.attributedText attribute:NSFontAttributeName atIndex:0 effectiveRange:nil]) { + + font = [self.attributedText attribute:NSFontAttributeName atIndex:0 effectiveRange:nil]; + + }else if (self.font){ + font = self.font; + + }else { + font = [UIFont systemFontOfSize:17]; + } + + Path = CGPathCreateMutable(); + + CGPathAddRect(Path, NULL, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height + font.lineHeight)); + + frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), Path, NULL); + } + + CFArrayRef lines = CTFrameGetLines(frame); + + if (!lines) { + return NO; + } + + CFIndex count = CFArrayGetCount(lines); + + CGPoint origins[count]; + + CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), origins); + + CGAffineTransform transform = [self BA_transformForCoreText]; + + CGFloat verticalOffset = 0; + + for (CFIndex i = 0; i < count; i++) { + CGPoint linePoint = origins[i]; + + CTLineRef line = CFArrayGetValueAtIndex(lines, i); + + CGRect flippedRect = [self BA_getLineBounds:line point:linePoint]; + + CGRect rect = CGRectApplyAffineTransform(flippedRect, transform); + + rect = CGRectInset(rect, 0, 0); + + rect = CGRectOffset(rect, 0, verticalOffset); + + NSParagraphStyle *style = [self.attributedText attribute:NSParagraphStyleAttributeName atIndex:0 effectiveRange:nil]; + + CGFloat lineSpace; + + if (style) { + lineSpace = style.lineSpacing; + }else { + lineSpace = 0; + } + + CGFloat lineOutSpace = (self.bounds.size.height - lineSpace * (count - 1) -rect.size.height * count) / 2; + + rect.origin.y = lineOutSpace + rect.size.height * i + lineSpace * i; + + if (CGRectContainsPoint(rect, point)) { + + CGPoint relativePoint = CGPointMake(point.x - CGRectGetMinX(rect), point.y - CGRectGetMinY(rect)); + + CFIndex index = CTLineGetStringIndexForPosition(line, relativePoint); + + CGFloat offset; + + CTLineGetOffsetForStringIndex(line, index, &offset); + + if (offset > relativePoint.x) { + index = index - 1; + } + + NSInteger link_count = self.attributeStrings.count; + + for (int j = 0; j < link_count; j++) { + + BAAttributeModel *model = self.attributeStrings[j]; + + NSRange link_range = model.range; + if (NSLocationInRange(index, link_range)) { + if (resultBlock) { + resultBlock (model.str , model.range , (NSInteger)j); + } + return YES; + } + } + } + } + return NO; +} + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + if (self.isTapEffect) { + + [self performSelectorOnMainThread:@selector(ba_tapEffectWithStatus:) withObject:nil waitUntilDone:NO]; + + } +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + if (self.isTapEffect) { + + [self performSelectorOnMainThread:@selector(ba_tapEffectWithStatus:) withObject:nil waitUntilDone:NO]; + + } +} + +- (CGAffineTransform)BA_transformForCoreText +{ + return CGAffineTransformScale(CGAffineTransformMakeTranslation(0, self.bounds.size.height), 1.f, -1.f); +} + +- (CGRect)BA_getLineBounds:(CTLineRef)line point:(CGPoint)point +{ + CGFloat ascent = 0.0f; + CGFloat descent = 0.0f; + CGFloat leading = 0.0f; + CGFloat width = (CGFloat)CTLineGetTypographicBounds(line, &ascent, &descent, &leading); + CGFloat height = ascent + fabs(descent) + leading; + + return CGRectMake(point.x, point.y , width, height); +} + +#pragma mark - tapEffect +- (void)ba_tapEffectWithStatus:(BOOL)status +{ + if (self.isTapEffect) { + NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText]; + + NSMutableAttributedString *subAtt = [[NSMutableAttributedString alloc] initWithAttributedString:[[self.effectDic allValues] firstObject]]; + + NSRange range = NSRangeFromString([[self.effectDic allKeys] firstObject]); + + if (status) { + [subAtt addAttribute:NSBackgroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(0, subAtt.string.length)]; + + [attStr replaceCharactersInRange:range withAttributedString:subAtt]; + }else { + + [attStr replaceCharactersInRange:range withAttributedString:subAtt]; + } + self.attributedText = attStr; + } +} + +- (void)ba_saveEffectDicWithRange:(NSRange)range +{ + self.effectDic = [NSMutableDictionary dictionary]; + + NSAttributedString *subAttribute = [self.attributedText attributedSubstringFromRange:range]; + + [self.effectDic setObject:subAttribute forKey:NSStringFromRange(range)]; +} + +#pragma mark - getRange +- (void)ba_getRangesWithStrings:(NSArray *)strings +{ + if (self.attributedText == nil) { + self.isTapAction = NO; + return; + } + + self.isTapAction = YES; + + self.isTapEffect = YES; + + __block NSString *totalStr = self.attributedText.string; + + self.attributeStrings = [NSMutableArray array]; + + __weak typeof(self) weakSelf = self; + + [strings enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + + NSRange range = [totalStr rangeOfString:obj]; + + if (range.length != 0) { + + totalStr = [totalStr stringByReplacingCharactersInRange:range withString:[weakSelf ba_getStringWithRange:range]]; + + BAAttributeModel *model = [BAAttributeModel new]; + + model.range = range; + + model.str = obj; + + [weakSelf.attributeStrings addObject:model]; + + } + + }]; +} + +- (NSString *)ba_getStringWithRange:(NSRange)range +{ + NSMutableString *string = [NSMutableString string]; + + for (int i = 0; i < range.length ; i++) { + + [string appendString:@" "]; + } + return string; +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UINavigationBar+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UINavigationBar+BAKit.m" index 18afc51..bd8cf23 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UINavigationBar+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UINavigationBar+BAKit.m" @@ -26,10 +26,10 @@ - (void)ba_setBackgroundColor:(UIColor *)backgroundColor { if (!self.overlay) { [self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault]; - self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, -20, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) + 20)]; + self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetHeight(self.bounds) + 20)]; self.overlay.userInteractionEnabled = NO; - self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; - [self insertSubview:self.overlay atIndex:0]; + self.overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth; // Should not set `UIViewAutoresizingFlexibleHeight` + [[self.subviews firstObject] insertSubview:self.overlay atIndex:0]; } self.overlay.backgroundColor = backgroundColor; } @@ -51,11 +51,13 @@ - (void)ba_setElementsAlpha:(CGFloat)alpha UIView *titleView = [self valueForKey:@"_titleView"]; titleView.alpha = alpha; -// when viewController first load, the titleView maybe nil + // when viewController first load, the titleView maybe nil [[self subviews] enumerateObjectsUsingBlock:^(UIView *obj, NSUInteger idx, BOOL *stop) { if ([obj isKindOfClass:NSClassFromString(@"UINavigationItemView")]) { obj.alpha = alpha; - *stop = YES; + } + if ([obj isKindOfClass:NSClassFromString(@"_UINavigationBarBackIndicatorView")]) { + obj.alpha = alpha; } }]; } diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.h" index 244069e..f757ff7 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.h" @@ -52,7 +52,7 @@ */ #import -#import +#import "MJRefresh.h" /** * 给UIScrollView类添加许多有用的方法 diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.m" index 3a68dba..3516001 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIScrollView+BAKit.m" @@ -80,9 +80,9 @@ - (void)addHeaderRefresh:(MJRefreshComponentRefreshingBlock)refreshBlock /*! 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法) */ BACustomMJHeader *header = [BACustomMJHeader headerWithRefreshingBlock:refreshBlock]; /*! 设置文字 */ - [header setTitle:@"下拉博爱为您刷新!" forState:MJRefreshStateIdle]; - [header setTitle:@"松开博爱再为您刷新!" forState:MJRefreshStatePulling]; - [header setTitle:@"感谢博爱的刷新 ..." forState:MJRefreshStateRefreshing]; +// [header setTitle:@"下拉博爱为您刷新!" forState:MJRefreshStateIdle]; +// [header setTitle:@"松开博爱再为您刷新!" forState:MJRefreshStatePulling]; +// [header setTitle:@"感谢博爱的刷新 ..." forState:MJRefreshStateRefreshing]; /*! 设置字体 */ header.stateLabel.font = [UIFont systemFontOfSize:15]; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.h" new file mode 100644 index 0000000..331bd98 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.h" @@ -0,0 +1,89 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import + +@interface UITableViewCell (Reuse) +/** + * 这两个配套使用,哪个类用就哪个类调用,用于xib(重用的identify为类名) + */ ++ (void )registCellWithTableView:(UITableView *)tableView; ++ (__kindof UITableViewCell *)cellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath; + +/** + * 获取重用的cell(重用的identify为类名) + */ ++ (__kindof UITableViewCell *)dequeueCellWithTableView:(UITableView *)tableView; + +/** + * 从xib里获取cell,获取不到则创建新的(默认重用的identify为类名) + * + * @param index xib里第几个cell + * @param identify 重用的identify + * @param tableView tableView + * + * @return cell + */ ++ (__kindof UITableViewCell *)dequeueCellFromNibIndex:(NSInteger )index identify:(NSString *)identify tableView:(UITableView *)tableView; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.m" new file mode 100644 index 0000000..6f248c4 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UITableViewCell+Reuse.m" @@ -0,0 +1,106 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import "UITableViewCell+Reuse.h" + +@implementation UITableViewCell (Reuse) + ++ (void )registCellWithTableView:(UITableView *)tableView +{ + NSString *iden = NSStringFromClass([self class]); + UINib *nib = [UINib nibWithNibName:iden bundle:nil]; + if (nib) + { + [tableView registerNib:nib forCellReuseIdentifier:iden]; + } + else + { + [tableView registerClass:[self class] forCellReuseIdentifier:iden]; + } +} + ++ (__kindof UITableViewCell *)cellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath *)indexPath +{ + return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath]; +} + ++ (__kindof UITableViewCell *)dequeueCellWithTableView:(UITableView *)tableView +{ + return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class])]; +} + ++ (__kindof UITableViewCell *)dequeueCellFromNibIndex:(NSInteger )index identify:(NSString *)identify tableView:(UITableView *)tableView +{ + UITableViewCell *cell = nil; + if (identify == nil) + { + identify = NSStringFromClass([self class]); + } + cell = [tableView dequeueReusableCellWithIdentifier:identify]; + if (cell == nil) + { + cell = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil][index]; + } + return cell; +} +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.h" index 2b50eac..c30148b 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.h" @@ -131,6 +131,7 @@ typedef NS_ENUM(NSInteger, UIViewLinearGradientDirection) }; +IB_DESIGNABLE @interface UIView (BAKit) @@ -160,6 +161,11 @@ typedef NS_ENUM(NSInteger, UIViewLinearGradientDirection) @property (nonatomic ) BAKitManager *bakit_manager; +@property (nonatomic, assign) IBInspectable BOOL masksToBounds; +@property (nonatomic, assign) IBInspectable CGFloat cornerRadius; +@property (nonatomic, assign) IBInspectable CGFloat borderWidth; +@property (nonatomic, assign) IBInspectable UIColor *borderColor; +@property (nonatomic, assign) IBInspectable CGFloat defineValue; /** * 1.设置颜色 @@ -231,12 +237,6 @@ typedef NS_ENUM(NSInteger, UIViewLinearGradientDirection) radius:(CGFloat)radius; - -/** - * 8.设置圆角半径 - */ -- (void)setCornerRadius:(CGFloat)radius; - /** * 9.摇摆动画 */ @@ -299,4 +299,7 @@ typedef NS_ENUM(NSInteger, UIViewLinearGradientDirection) */ + (CGFloat)ba_AutoSizeOfWidthWithText:(NSString *)text font:(UIFont *)font height:(CGFloat)height; + +//- (void)ba_showHudWitTitle:(NSString *)title atView:(UIView *)view; + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.m" index 3cb911c..35c9a63 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIView+BAKit.m" @@ -262,6 +262,47 @@ - (CGPoint)middlePoint { }; } +- (void)setCornerRadius:(CGFloat)cornerRadius +{ + self.layer.masksToBounds = YES; + self.layer.cornerRadius = cornerRadius; +} + +- (void)setBorderColor:(UIColor *)borderColor +{ + self.layer.borderColor = borderColor.CGColor; +} + +- (void)setBorderWidth:(CGFloat)borderWidth +{ + self.layer.borderWidth = borderWidth; +} + +- (void)setDefineValue:(CGFloat)defineValue +{ + objc_setAssociatedObject(self, @selector(defineValue), @(defineValue),OBJC_ASSOCIATION_ASSIGN); +} + +- (CGFloat)cornerRadius +{ + return self.layer.cornerRadius; +} + +- (CGFloat)borderWidth +{ + return self.layer.borderWidth; +} + +- (UIColor *)borderColor +{ + return [UIColor colorWithCGColor:self.layer.borderColor]; +} + +- (CGFloat)defineValue +{ + return [objc_getAssociatedObject(self, @selector(defineValue)) floatValue]; +} + /* 1.给UIView添加点击事件*/ - (void)addTarget:(id)target action:(SEL)action; @@ -324,13 +365,13 @@ - (void)ba_removeShadow [self.layer setShadowOffset:CGSizeMake(0.0f, 0.0f)]; } -/* 6.设置圆角半径 */ -- (void)ba_setCornerRadius:(CGFloat)radius -{ - CALayer *roundedlayer = [self layer]; - roundedlayer.cornerRadius = radius; - [roundedlayer setMasksToBounds:YES]; -} +///* 6.设置圆角半径 */ +//- (void)ba_setCornerRadius:(CGFloat)radius +//{ +// CALayer *roundedlayer = [self layer]; +// roundedlayer.cornerRadius = radius; +// [roundedlayer setMasksToBounds:YES]; +//} /* 7.创建阴影 */ - (void)ba_setRectShadowWithOffset:(CGSize)offset @@ -682,11 +723,6 @@ - (UIViewController *)getCurrentViewController return nil; } -- (void)ba_showAlertView:(NSString *)title message:(NSString *)message -{ - [[[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"确 定" otherButtonTitles: nil] show]; -} - /*! * 自适应label的高度 * @@ -725,7 +761,7 @@ + (CGFloat)ba_AutoSizeOfWidthWithText:(NSString *)text font:(UIFont *)font heigh - (void)setManager:(BAKitManager *)manager { - objc_setAssociatedObject(self, @selector(manager), manager, OBJC_ASSOCIATION_RETAIN); + objc_setAssociatedObject(self, @selector(bakit_manager), manager, OBJC_ASSOCIATION_RETAIN); } - (BAKitManager *)getManager @@ -750,4 +786,26 @@ - (BAKitManager *)bakit_manager return manager; } +- (void)ba_showAlertView:(NSString *)title message:(NSString *)message +{ + [[[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"确 定" otherButtonTitles: nil] show]; +} + +//- (void)ba_showHudWitTitle:(NSString *)title atView:(UIView *)view +//{ +// MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view animated:YES]; +// +// // Set the label text. +// hud.label.text = title; +// // You can also adjust other label properties if needed. +// hud.label.font = [UIFont italicSystemFontOfSize:15.f]; +// +// dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ +// +// dispatch_async(dispatch_get_main_queue(), ^{ +// [hud hideAnimated:YES]; +// }); +// }); +//} + @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.h" index aff735d..65209d1 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.h" @@ -60,6 +60,6 @@ /** * 采取截屏 */ -- (UIImage *)takeScreenshot; +- (UIImage *)ba_takeScreenshot; @end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.m" index c875625..8e6f728 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/UIKit/UIWindow+BAKit.m" @@ -57,7 +57,7 @@ @implementation UIWindow (BAKit) /* 采取截屏 */ -- (UIImage *)takeScreenshot +- (UIImage *)ba_takeScreenshot { // 源代码地址 (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35 // 判断系统版本号 diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/BARotateView/BARotateView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/BARotateView/BARotateView.m" index a91c29b..81ce7bf 100644 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/BARotateView/BARotateView.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/BARotateView/BARotateView.m" @@ -27,7 +27,7 @@ - (instancetype)initWithFrame:(CGRect)frame */ - (void)ba_changeToUpAnimated:(BOOL)animated { - BA_Weak; + BA_WEAKSELF; if (animated) { [UIView animateWithDuration:(self.rotateDuration > 0 ? self.rotateDuration : 0.5f) animations:^{ @@ -47,7 +47,7 @@ - (void)ba_changeToUpAnimated:(BOOL)animated */ - (void)ba_changeToLeftAnimated:(BOOL)animated { - BA_Weak; + BA_WEAKSELF; if (animated) { [UIView animateWithDuration:(self.rotateDuration > 0 ? self.rotateDuration : 0.5f) animations:^{ @@ -67,7 +67,7 @@ - (void)ba_changeToLeftAnimated:(BOOL)animated */ - (void)ba_changeToRightAnimated:(BOOL)animated { - BA_Weak; + BA_WEAKSELF; if (animated) { [UIView animateWithDuration:(self.rotateDuration > 0 ? self.rotateDuration : 0.5f) animations:^{ @@ -87,7 +87,7 @@ - (void)ba_changeToRightAnimated:(BOOL)animated */ - (void)ba_changeToDownAnimated:(BOOL)animated { - BA_Weak; + BA_WEAKSELF; if (animated) { [UIView animateWithDuration:(self.rotateDuration > 0 ? self.rotateDuration : 0.5f) animations:^{ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BASnowView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BASnowView.m" index 5015e31..57e3f77 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BASnowView.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BASnowView.m" @@ -25,7 +25,7 @@ - (void)sutupSubView self.emitterLayer.emitterShape = kCAEmitterLayerLine; self.emitterLayer.emitterMode = kCAEmitterLayerSurface; // 发射区域 - self.emitterLayer.emitterSize = self.size; + self.emitterLayer.emitterSize = self.frame.size; // 发射中心点位置 self.emitterLayer.emitterPosition = CGPointMake(self.bounds.size.width / 2.f, - 5); } diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BAUpdatingView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BAUpdatingView.m" index 8d55f21..185d8e0 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BAUpdatingView.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/BAUpdatingView.m" @@ -59,7 +59,7 @@ - (void)initLabel { [self addSubview:self.label]; self.label.textColor = [UIColor whiteColor]; self.label.textAlignment = NSTextAlignmentCenter; - self.label.font = [UIFont fontWithName:LATO_LIGHT size:18.f]; +// self.label.font = [UIFont fontWithName:LATO_LIGHT size:18.f]; self.label.text = @"Updating . . ."; self.label.GCDTimerInterval = @(0.8f); self.label.glowDuration = @(0.7f); @@ -81,7 +81,7 @@ - (void)initLabel { [self addSubview:self.failedLabel]; self.failedLabel.textColor = [UIColor whiteColor]; self.failedLabel.textAlignment = NSTextAlignmentCenter; - self.failedLabel.font = [UIFont fontWithName:LATO_LIGHT size:24.f]; +// self.failedLabel.font = [UIFont fontWithName:LATO_LIGHT size:24.f]; self.failedLabel.text = @"Failed"; self.failedLabel.GCDTimerInterval = @(0.8f); self.failedLabel.glowDuration = @(0.7f); diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/UIView+BAGlowView.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/UIView+BAGlowView.m" index 2627cea..5afe938 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/UIView+BAGlowView.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAKit(\345\267\245\345\205\267\347\261\273)/\345\212\250\347\224\273/\351\233\252\350\212\261\345\212\240\350\275\275\345\212\250\347\224\273/UIView+BAGlowView.m" @@ -106,7 +106,7 @@ - (void)createGlowLayerWithColor:(UIColor *)color glowRadius:(CGFloat)radius { } - (void)startGlow { - BA_Weak; + BA_WEAKSELF; [self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CALayer *layer = obj; @@ -189,7 +189,7 @@ - (void)startGlow { } - (void)glowToGlowLayerOnce { - BA_Weak; + BA_WEAKSELF; [self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CALayer *layer = obj; @@ -227,7 +227,7 @@ - (void)glowToGlowLayerOnce { - (void)glowToNormalLayerOnce { - BA_Weak; + BA_WEAKSELF; [self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { CALayer *layer = obj; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BABaseProject.pch" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BABaseProject.pch" index 018aa34..cb59c42 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BABaseProject.pch" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BABaseProject.pch" @@ -74,23 +74,21 @@ /*! 全局宏定义文件 */ #import "BADefin.h" - #import "BAColorHeader.h" #import "BAFrameHeader.h" - /*! 正则表达式 */ - #import "BARegularExpression.h" + #import + + /*! 用户基本信心 model */ + #import "BAUserModel.h" /*! BAKit框架 */ #import "BAKit.h" - /*! 自定义modal动画 */ - #import "BAModal.h" - /*! 本地通知 */ #import "BALocalNotification.h" /*! 自定义button */ - #import + #import "BAButton.h" /*! 文本宽度/高度自适应 */ #import "BAAutoSizeWithWH.h" @@ -99,13 +97,17 @@ #import "UINavigationItem+CustomItem.h" /*! 自动布局三方库 */ - #import + #import "Masonry.h" #import "UIView+SDAutoLayout.h" #import "UITableView+SDAutoTableViewCellHeight.h" /*! 缓存三方库 */ #import "UIImageView+WebCache.h" - #import + #import "SDImageCache.h" + + /*! FMDB 封装 */ + #import "FMDB.h" + #import "JKDBHelper.h" /*! 键盘 */ #import "IQKeyboardManager.h" @@ -114,15 +116,15 @@ #import "NSObject+BAProgressHUD.h" /*! 网络库 */ - #import - #import + #import "AFNetworking.h" + #import "UIKit+AFNetworking.h" /*! block三方库 */ - #import - #import +// #import +// #import /*! 上下拉刷新 */ - #import + #import "MJRefresh.h" /*! 友盟分享/登陆 的详细封装 */ #import "BAShareManage.h" @@ -133,6 +135,9 @@ /*! 离屏渲染绘制 layer */ #import "UIView+RoundedCorner.h" + /*! 截屏 */ +// #import + /*! 将Toast通知添加到UIView对象类 */ //#import "UIView+Toast.h" @@ -145,7 +150,7 @@ /*! 自定义字体 */ #import "AddedFont.h" - + #import #endif diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAColorHeader.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAColorHeader.h" deleted file mode 100755 index 96481d5..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAColorHeader.h" +++ /dev/null @@ -1,112 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#ifndef BAColorHeader_h -#define BAColorHeader_h - -#pragma mark - ***** 颜色设置 - -/*! RGB色值 */ -#define BA_COLOR(R, G, B, A) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A] - -/*! 随机色 */ -#define BARandomColor [UIColor colorWithRed:arc4random_uniform(256)%255.0 green:arc4random_uniform(256)%255.0 blue:arc4random_uniform(256)%255.0 alpha:1.0] -#define BA_ColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] - -/*! navi蓝色 */ -#define BA_NaviBgBlueColor BA_COLOR(92, 177, 251, 1.0) -#define BA_BGGrayColor BA_COLOR(239, 239, 239, 1.0) -#define BA_TEXTGrayColor BA_COLOR(148, 147, 133, 1.0) -#define BA_BLUEColor BA_COLOR(78, 164, 255, 1.0) -#define BA_BGClearColor [UIColor colorWithRed:0.1f green:0.1f blue:0.1f alpha:0.7f] - -/*! 主题浅绿 */ -#define BA_Them_greenColor BA_COLOR(30, 198, 181, 1.0) - -/*! 白色 */ -#define BA_White_Color [UIColor whiteColor] - -/*! 红色 */ -#define BA_Red_Color [UIColor redColor] - -/*! 黄色 */ -#define BA_Yellow_Color [UIColor yellowColor] - -/*! 绿色 */ -#define BA_Green_Color [UIColor greenColor] - -/*! 蓝色 */ -#define BA_Blue_Color [UIColor blueColor] - -/*! 无色 */ -#define BA_Clear_Color [UIColor clearColor] - -/*! 橙色 */ -#define BA_Orange_Color [UIColor orangeColor] - -/*! 黑色 */ -#define BA_Black_Color [UIColor blackColor] - -/*! 浅灰色色 */ -#define BA_LightGray_Color [UIColor lightGrayColor] - - - -#endif /* BAColorHeader_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BADefin.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BADefin.h" index 45ca209..291f608 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BADefin.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BADefin.h" @@ -64,21 +64,15 @@ #pragma mark - ***** AppDelegate -/*! 友盟分享SDK:接入自己项目时需要更改各个属性值 */ -#define BA_Umeng_Appkey @"56f217d467e58e513a000434" -#define BA_Sina_AppKey @"2447331824" -#define BA_WX_APPKEY @"wx19d8c52e02fa7556" -#define BA_WX_APPSECRET @"90eeb0c9ef2a1c99fb473890809f7f19" -#define BA_QQKey @"wrGGgg89e0lqqoXT" -#define BA_QQAppID @"1105285308" +/*! 友盟统计 SDK */ +#define BA_UMengAnalyticskey @"58199af182b635155d0028cd" + +/*! 百度地图 AppKey */ +#define BA_BaiDuMapAppKey @"qhqlttbTzqPdGilGTVoaH7fYGenIxNK5" /*! 字体 */ #define BA_FontSize(fontSize) [UIFont systemFontOfSize:fontSize] - -/*! weak */ -#define BA_Weak __weak __typeof(self) weakSelf = self - /*! Loading */ #define BA_Loading @"Loading..." @@ -93,23 +87,38 @@ /*! weakSelf */ #define BA_WEAKSELF typeof(self) __weak weakSelf = self +#define BA_WeakSelf(type) __weak typeof(type) weak##type = type; + +/*! strongSelf */ +#define BA_StrongSelf(type) __strong typeof(type) type = weak##type; /*! 通知 */ -#define BA_Noti [NSNotificationCenter defaultCenter] +#define BA_NotiCenter [NSNotificationCenter defaultCenter] #define BA_UserDefault [NSUserDefaults standardUserDefaults] -/*! 大于8.0 */ -#define IOS8x ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) +/*! 图片 */ +#define BA_ImageName(imageName) [UIImage imageNamed:imageName] + +/*! 获取图片资源 */ +#define BA_GetImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@",imageName]] + +/*! 定义 UIImage 对象 */ +#define BA_ImageFromBundle(fileName) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:A ofType:nil]] + +/*! 获取当前语言 */ +#define BA_CurrentLanguage ([[NSLocale preferredLanguages] objectAtIndex:0]) +#pragma mark - 通知类 +#define BANotioKey_LoginFinish @"BANotioKey_LoginFinish" /*! 其他 */ #pragma mark - ***** 应用内相关设置 -#define BA_PLACEHOLDER_IMAGE @"placeHolder" +#define BA_placeHolder_Image @"placeHolder" /*! 警告框-一个按钮【VC】 */ @@ -120,7 +129,7 @@ BALog(@"你点击了确定按钮!");\ [self presentViewController:alert animated:YES completion:nil];\ /*! 警告框-一个按钮【View】 */ -#define BA_SHOW_AlertAtView(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示:" message:msg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil] show]; +#define BA_AlertAtView(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示:" message:msg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil] show]; diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAFrameHeader.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAFrameHeader.h" index f3c36a1..95542da 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAFrameHeader.h" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BAMacros(\345\256\217)/BAFrameHeader.h" @@ -68,11 +68,11 @@ ///*! 当前设备的屏幕高度 */ //#define BA_SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height -///*! 当前设备的屏幕宽度 */ -#define BA_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) - -/*! 当前设备的屏幕高度 */ -#define BA_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) +/////*! 当前设备的屏幕宽度 */ +//#define BA_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) +// +///*! 当前设备的屏幕高度 */ +//#define BA_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) /*! 黄金比例的宽 */ #define BA_WIDTH_0_618 BA_SCREEN_WIDTH * 0.618 @@ -101,9 +101,23 @@ /*! iPhone6Plus or iPhone6sPlus */ #define BA_iPhone6_6sPlus (Width == 414.f && Height == 736.f) -/*! cell的间距:10 */ +/*! cell 的间距:10 */ #define BAStatusCellMargin 10 +/*! 设置 view 圆角和边框 */ +#define BA_ViewBorderRadius(View, Radius, Width, Color)\ +\ +[View.layer setCornerRadius:(Radius)];\ +[View.layer setMasksToBounds:YES];\ +[View.layer setBorderWidth:(Width)];\ +[View.layer setBorderColor:[Color CGColor]] + +/*! 由角度转换弧度 */ +#define BA_DegreesToRadian(x) (M_PI * (x) / 180.0) + +/*! 由弧度转换角度 */ +#define BA_RadianToDegrees(radian) (radian*180.0)/(M_PI) + #endif /* BAFrameHeader_h */ diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.h" deleted file mode 100755 index 4b2e488..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.h" +++ /dev/null @@ -1,204 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 博爱1616【137361770】 - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import -#import - - -#define BANetManagerShare [BANetManager sharedBANetManager] - -/*! 使用枚举NS_ENUM:区别可判断编译器是否支持新式枚举,支持就使用新的,否则使用旧的 */ -typedef NS_ENUM(NSUInteger, BANetworkStatus) -{ - /*! 未知网络 */ - BANetworkStatusUnknown = 0, - /*! 没有网络 */ - BANetworkStatusNotReachable, - /*! 手机自带网络 */ - BANetworkStatusReachableViaWWAN, - /*! wifi */ - BANetworkStatusReachableViaWiFi -}; - -/*!定义请求类型的枚举 */ -typedef NS_ENUM(NSUInteger, BAHttpRequestType) -{ - /*! get请求 */ - BAHttpRequestTypeGet = 0, - /*! post请求 */ - BAHttpRequestTypePost, - /*! put请求 */ - BAHttpRequestTypePut, - /*! delete请求 */ - BAHttpRequestTypeDelete - - -}; - -/*! 定义请求成功的block */ -typedef void( ^ BAResponseSuccess)(id response); -/*! 定义请求失败的block */ -typedef void( ^ BAResponseFail)(NSError *error); - -/*! 定义上传进度block */ -typedef void( ^ BAUploadProgress)(int64_t bytesProgress, - int64_t totalBytesProgress); -/*! 定义下载进度block */ -typedef void( ^ BADownloadProgress)(int64_t bytesProgress, - int64_t totalBytesProgress); - -/*! - * 方便管理请求任务。执行取消,暂停,继续等任务. - * - (void)cancel,取消任务 - * - (void)suspend,暂停任务 - * - (void)resume,继续任务 - */ -typedef NSURLSessionTask BAURLSessionTask; - - - -@interface BANetManager : NSObject - -/*! 获取当前网络状态 */ -@property (nonatomic, assign) BANetworkStatus netWorkStatus; - -/*! - * 获得全局唯一的网络请求实例单例方法 - * - * @return 网络请求类BANetManager单例 - */ -+ (instancetype)sharedBANetManager; - -/*! - * 开启网络监测 - */ -+ (void)ba_startNetWorkMonitoring; - -/*! - * 网络请求方法,block回调 - * - * @param type get / post - * @param urlString 请求的地址 - * @param paraments 请求的参数 - * @param successBlock 请求成功的回调 - * @param failureBlock 请求失败的回调 - * @param progress 进度 - */ -+ (BAURLSessionTask *)ba_requestWithType:(BAHttpRequestType)type - withUrlString:(NSString *)urlString - withParameters:(NSDictionary *)parameters - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - progress:(BADownloadProgress)progress; - -/*! - * 上传图片(多图) - * - * @param operations 上传图片预留参数---视具体情况而定 可移除 - * @param imageArray 上传的图片数组 - * @param urlString 上传的url - * @param successBlock 上传成功的回调 - * @param failureBlock 上传失败的回调 - * @param progress 上传进度 - */ -+ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withImageArray:(NSArray *)imageArray - withSuccessBlock:(BAResponseSuccess)successBlock - withFailurBlock:(BAResponseFail)failureBlock - withUpLoadProgress:(BAUploadProgress)progress; - -/*! - * 视频上传 - * - * @param operations 上传视频预留参数---视具体情况而定 可移除 - * @param videoPath 上传视频的本地沙河路径 - * @param urlString 上传的url - * @param successBlock 成功的回调 - * @param failureBlock 失败的回调 - * @param progress 上传的进度 - */ -+ (void)ba_uploadVideoWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withVideoPath:(NSString *)videoPath - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - withUploadProgress:(BAUploadProgress)progress; - -/*! - * 文件下载 - * - * @param operations 文件下载预留参数---视具体情况而定 可移除 - * @param savePath 下载文件保存路径 - * @param urlString 请求的url - * @param successBlock 下载文件成功的回调 - * @param failureBlock 下载文件失败的回调 - * @param progress 下载文件的进度显示 - */ -+ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withSavaPath:(NSString *)savePath - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - withDownLoadProgress:(BADownloadProgress)progress; - - - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.m" deleted file mode 100755 index 5eeae0b..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANetManager.m" +++ /dev/null @@ -1,679 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 博爱1616【137361770】 - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import "BANetManager.h" -#import -#import -#import - -/*! 系统相册 */ -#import -#import -#import -#import - - -#import -#import "AFNetworkActivityIndicatorManager.h" - -#import "UIImage+CompressImage.h" - - -static NSMutableArray *tasks; - -@interface BANetManager () - -@end - -@implementation BANetManager - -/*! - * 获得全局唯一的网络请求实例单例方法 - * - * @return 网络请求类BANetManager单例 - */ -+ (instancetype)sharedBANetManager -{ - static BANetManager *manager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - - manager = [[self alloc] init]; - - }); - return manager; -} - -+ (AFHTTPSessionManager *)sharedAFManager -{ - static AFHTTPSessionManager *manager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - manager = [AFHTTPSessionManager manager]; - - /*! 设置请求超时时间 */ - manager.requestSerializer.timeoutInterval = 30; - - /*! 设置相应的缓存策略:此处选择不用加载也可以使用自动缓存【注:只有get方法才能用此缓存策略,NSURLRequestReturnCacheDataDontLoad】 */ - manager.requestSerializer.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; - - /*! 设置返回数据为json, 分别设置请求以及相应的序列化器 */ - manager.responseSerializer = [AFJSONResponseSerializer serializer]; - - AFJSONResponseSerializer * response = [AFJSONResponseSerializer serializer]; - response.removesKeysWithNullValues = YES; - - /*! 设置apikey ------类似于自己应用中的tokken---此处仅仅作为测试使用*/ - // [manager.requestSerializer setValue:apikey forHTTPHeaderField:@"apikey"]; - - /*! 复杂的参数类型 需要使用json传值-设置请求内容的类型*/ - // [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; - - /*! 设置响应数据的基本了类型 */ - manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/css",@"text/xml",@"text/plain", @"application/javascript", nil]; - - /*! https 参数配置 */ - /*! - 采用默认的defaultPolicy就可以了. AFN默认的securityPolicy就是它, 不必另写代码. AFSecurityPolicy类中会调用苹果security.framework的机制去自行验证本次请求服务端放回的证书是否是经过正规签名. - */ - AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; - securityPolicy.allowInvalidCertificates = YES; - securityPolicy.validatesDomainName = NO; - manager.securityPolicy = securityPolicy; - - /*! 自定义的CA证书配置如下: */ - /*! 自定义security policy, 先前确保你的自定义CA证书已放入工程Bundle */ - /*! - https://api.github.com网址的证书实际上是正规CADigiCert签发的, 这里把Charles的CA根证书导入系统并设为信任后, 把Charles设为该网址的SSL Proxy (相当于"中间人"), 这样通过代理访问服务器返回将是由Charles伪CA签发的证书. - AFNetworking会自动扫描bundle中.cer的文件,并引入,这样就可以通过自签证书来验证服务器唯一性了。 - 验证站点证书,是通过域名的,如果服务器端站点没有绑定域名(万恶的备案),仅靠IP地址上面的方法是绝对不行的。怎么办?答案是想通过设置是不可以的,你只能修改AFNetworking2的源代码!打开AFSecurityPolicy.m文件,找到方法: - securityPolicy.validatesDomainName = NO; - */ - // NSSet *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]; - // AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet]; - // policy.allowInvalidCertificates = YES; - // manager.securityPolicy = policy; - - /*! 如果服务端使用的是正规CA签发的证书, 那么以下几行就可去掉: */ - // NSSet *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]; - // AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet]; - // policy.allowInvalidCertificates = YES; - // manager.securityPolicy = policy; - - - }); - - return manager; -} - -+ (NSMutableArray *)tasks -{ - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - BALog(@"创建数组"); - tasks = [[NSMutableArray alloc] init]; - }); - return tasks; -} - -#pragma mark - ***** 网络请求的类方法---get / post / put / delete -/*! - * 网络请求的实例方法 - * - * @param type get / post / put / delete - * @param urlString 请求的地址 - * @param paraments 请求的参数 - * @param successBlock 请求成功的回调 - * @param failureBlock 请求失败的回调 - * @param progress 进度 - */ -+ (BAURLSessionTask *)ba_requestWithType:(BAHttpRequestType)type - withUrlString:(NSString *)urlString - withParameters:(NSDictionary *)parameters - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - progress:(BADownloadProgress)progress -{ - if (urlString == nil) - { - return nil; - } - - /*! 检查地址中是否有中文 */ - NSString *URLString = [NSURL URLWithString:urlString] ? urlString : [self strUTF8Encoding:urlString]; - - BALog(@"******************** 请求参数 ***************************"); - BALog(@"请求头: %@\n请求方式: %@\n请求URL: %@\n请求param: %@\n\n",[self sharedAFManager].requestSerializer.HTTPRequestHeaders, (type == BAHttpRequestTypeGet) ? @"POST":@"GET",URLString, parameters); - BALog(@"******************************************************"); - - BAURLSessionTask *sessionTask = nil; - - if (type == BAHttpRequestTypeGet) - { - sessionTask = [[self sharedAFManager] GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) { - - } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - - /****************************************************/ - // 如果请求成功 , 回调请求到的数据 , 同时 在这里 做本地缓存 - NSString *path = [NSString stringWithFormat:@"%ld.plist", [URLString hash]]; - // 存储的沙盒路径 - NSString *path_doc = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; - // 归档 - [NSKeyedArchiver archiveRootObject:responseObject toFile:[path_doc stringByAppendingPathComponent:path]]; - - if (successBlock) - { - successBlock(responseObject); - } - - [[self tasks] removeObject:sessionTask]; - - // [self writeInfoWithDict:(NSDictionary *)responseObject]; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - } - [[self tasks] removeObject:sessionTask]; - - }]; - - } - else if (type == BAHttpRequestTypePost) - { - sessionTask = [[self sharedAFManager] POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { - - } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - - /* ************************************************** */ - // 如果请求成功 , 回调请求到的数据 , 同时 在这里 做本地缓存 - NSString *path = [NSString stringWithFormat:@"%ld.plist", [URLString hash]]; - // 存储的沙盒路径 - NSString *path_doc = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; - // 归档 - [NSKeyedArchiver archiveRootObject:responseObject toFile:[path_doc stringByAppendingPathComponent:path]]; - - if (successBlock) - { - successBlock(responseObject); - } - - [[self tasks] removeObject:sessionTask]; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - BALog(@"错误信息:%@",error); - } - [[self tasks] removeObject:sessionTask]; - - }]; - } - else if (type == BAHttpRequestTypePut) - { - sessionTask = [[self sharedAFManager] PUT:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - - if (successBlock) - { - successBlock(responseObject); - } - - [[self tasks] removeObject:sessionTask]; - - // [self writeInfoWithDict:(NSDictionary *)responseObject]; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - } - [[self tasks] removeObject:sessionTask]; - - }]; - } - else if (type == BAHttpRequestTypeDelete) - { - sessionTask = [[self sharedAFManager] DELETE:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - if (successBlock) - { - successBlock(responseObject); - } - - [[self tasks] removeObject:sessionTask]; - - // [self writeInfoWithDict:(NSDictionary *)responseObject]; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - } - [[self tasks] removeObject:sessionTask]; - - }]; - } - - if (sessionTask) - { - [[self tasks] addObject:sessionTask]; - } - - return sessionTask; -} - -/*! - * 上传图片(多图) - * - * @param operations 上传图片预留参数---视具体情况而定 可移除 - * @param imageArray 上传的图片数组 - * @parm width 图片要被压缩到的宽度 - * @param urlString 上传的url - * @param successBlock 上传成功的回调 - * @param failureBlock 上传失败的回调 - * @param progress 上传进度 - */ -+ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withImageArray:(NSArray *)imageArray - withSuccessBlock:(BAResponseSuccess)successBlock - withFailurBlock:(BAResponseFail)failureBlock - withUpLoadProgress:(BAUploadProgress)progress -{ - if (urlString == nil) - { - return nil; - } - - /*! 检查地址中是否有中文 */ - NSString *URLString = [NSURL URLWithString:urlString] ? urlString : [self strUTF8Encoding:urlString]; - - BALog(@"******************** 请求参数 ***************************"); - BALog(@"请求头: %@\n请求方式: %@\n请求URL: %@\n请求param: %@\n\n",[self sharedAFManager].requestSerializer.HTTPRequestHeaders, @"POST",URLString, parameters); - BALog(@"******************************************************"); - - - BAURLSessionTask *sessionTask = nil; - sessionTask = [[self sharedAFManager] POST:URLString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { - - /*! 出于性能考虑,将上传图片进行压缩 */ - for (int i = 0; i < imageArray.count; i++) - { - /*! image的压缩方法 */ - UIImage *resizedImage; - /*! 此处是使用原生系统相册 */ - if([imageArray[i] isKindOfClass:[ALAsset class]]) - { - // 用ALAsset获取Asset URL 转化为image - ALAssetRepresentation *assetRep = [imageArray[i] defaultRepresentation]; - - CGImageRef imgRef = [assetRep fullResolutionImage]; - resizedImage = [UIImage imageWithCGImage:imgRef - scale:1.0 - orientation:(UIImageOrientation)assetRep.orientation]; - // imageWithImage - BALog(@"1111-----size : %@",NSStringFromCGSize(resizedImage.size)); - - resizedImage = [self imageWithImage:resizedImage scaledToSize:resizedImage.size]; - BALog(@"2222-----size : %@",NSStringFromCGSize(resizedImage.size)); - } - else - { - /*! 此处是使用其他第三方相册,可以自由定制压缩方法 */ - resizedImage = imageArray[i]; - } - - /*! 此处压缩方法是jpeg格式是原图大小的0.8倍,要调整大小的话,就在这里调整就行了还是原图等比压缩 */ - NSData *imgData = UIImageJPEGRepresentation(resizedImage, 0.8); - - /*! 拼接data */ - if (imgData != nil) - { // 图片数据不为空才传递 - [formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"picflie%ld",(long)i] fileName:@"image.png" mimeType:@" image/jpeg"]; - } - } - } progress:^(NSProgress * _Nonnull uploadProgress) { - - BALog(@"上传进度--%lld,总进度---%lld",uploadProgress.completedUnitCount,uploadProgress.totalUnitCount); - - if (progress) - { - progress(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount); - } - - } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { - - BALog(@"上传图片成功 = %@",responseObject); - if (successBlock) - { - successBlock(responseObject); - } - - [[self tasks] removeObject:sessionTask]; - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - } - [[self tasks] removeObject:sessionTask]; - }]; - - if (sessionTask) - { - [[self tasks] addObject:sessionTask]; - } - - return sessionTask; -} - -/*! - * 视频上传 - * - * @param operations 上传视频预留参数---视具体情况而定 可移除 - * @param videoPath 上传视频的本地沙河路径 - * @param urlString 上传的url - * @param successBlock 成功的回调 - * @param failureBlock 失败的回调 - * @param progress 上传的进度 - */ -+ (void)ba_uploadVideoWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withVideoPath:(NSString *)videoPath - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - withUploadProgress:(BAUploadProgress)progress -{ - /*! 获得视频资源 */ - AVURLAsset *avAsset = [AVURLAsset assetWithURL:[NSURL URLWithString:videoPath]]; - - /*! 压缩 */ - - // NSString *const AVAssetExportPreset640x480; - // NSString *const AVAssetExportPreset960x540; - // NSString *const AVAssetExportPreset1280x720; - // NSString *const AVAssetExportPreset1920x1080; - // NSString *const AVAssetExportPreset3840x2160; - - AVAssetExportSession * avAssetExport = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPreset640x480]; - - /*! 创建日期格式化器 */ - - NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; - - [formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"]; - - /*! 转化后直接写入Library---caches */ - - NSString * videoWritePath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingString:[NSString stringWithFormat:@"/output-%@.mp4",[formatter stringFromDate:[NSDate date]]]]; - - - avAssetExport.outputURL = [NSURL URLWithString:videoWritePath]; - - - avAssetExport.outputFileType = AVFileTypeMPEG4; - - [avAssetExport exportAsynchronouslyWithCompletionHandler:^{ - - switch ([avAssetExport status]) { - case AVAssetExportSessionStatusCompleted: - { - [[self sharedAFManager] POST:urlString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { - - //获得沙盒中的视频内容 - - [formData appendPartWithFileURL:[NSURL fileURLWithPath:videoWritePath] name:@"write you want to writre" fileName:videoWritePath mimeType:@"video/mpeg4" error:nil]; - - } progress:^(NSProgress * _Nonnull uploadProgress) { - - BALog(@"上传进度--%lld,总进度---%lld",uploadProgress.completedUnitCount,uploadProgress.totalUnitCount); - - if (progress) - { - progress(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount); - } - - } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) { - - BALog(@"上传视频成功 = %@",responseObject); - if (successBlock) - { - successBlock(responseObject); - } - - } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { - - if (failureBlock) - { - failureBlock(error); - } - }]; - - break; - } - default: - break; - } - - - }]; - -} - -#pragma mark - ***** 文件下载 -/*! - * 文件下载 - * - * @param operations 文件下载预留参数---视具体情况而定 可移除 - * @param savePath 下载文件保存路径 - * @param urlString 请求的url - * @param successBlock 下载文件成功的回调 - * @param failureBlock 下载文件失败的回调 - * @param progress 下载文件的进度显示 - */ -+ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString - parameters:(NSDictionary *)parameters - withSavaPath:(NSString *)savePath - withSuccessBlock:(BAResponseSuccess)successBlock - withFailureBlock:(BAResponseFail)failureBlock - withDownLoadProgress:(BADownloadProgress)progress -{ - if (urlString == nil) - { - return nil; - } - - NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; - - BALog(@"******************** 请求参数 ***************************"); - BALog(@"请求头: %@\n请求方式: %@\n请求URL: %@\n请求param: %@\n\n",[self sharedAFManager].requestSerializer.HTTPRequestHeaders, @"download",urlString, parameters); - BALog(@"******************************************************"); - - - BAURLSessionTask *sessionTask = nil; - - sessionTask = [[self sharedAFManager] downloadTaskWithRequest:downloadRequest progress:^(NSProgress * _Nonnull downloadProgress) { - - BALog(@"下载进度:%.2lld%%",100 * downloadProgress.completedUnitCount/downloadProgress.totalUnitCount); - /*! 回到主线程刷新UI */ - dispatch_async(dispatch_get_main_queue(), ^{ - - if (progress) - { - progress(downloadProgress.completedUnitCount, downloadProgress.totalUnitCount); - } - - }); - - } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { - - if (!savePath) - { - NSURL *downloadURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; - BALog(@"默认路径--%@",downloadURL); - return [downloadURL URLByAppendingPathComponent:[response suggestedFilename]]; - } - else - { - return [NSURL fileURLWithPath:savePath]; - } - - } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { - - [[self tasks] removeObject:sessionTask]; - - BALog(@"下载文件成功"); - if (error == nil) - { - if (successBlock) - { - /*! 返回完整路径 */ - successBlock([filePath path]); - } - else - { - if (failureBlock) - { - failureBlock(error); - } - } - } - }]; - - /*! 开始启动任务 */ - [sessionTask resume]; - - if (sessionTask) - { - [[self tasks] addObject:sessionTask]; - } - return sessionTask; -} - -#pragma mark - ***** 开始监听网络连接 -/*! - * 开启网络监测 - */ -+ (void)ba_startNetWorkMonitoring -{ - // 1.获得网络监控的管理者 - AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; - // 当使用AF发送网络请求时,只要有网络操作,那么在状态栏(电池条)wifi符号旁边显示 菊花提示 - [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; - // 2.设置网络状态改变后的处理 - [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { - // 当网络状态改变了, 就会调用这个block - switch (status) - { - case AFNetworkReachabilityStatusUnknown: // 未知网络 - BALog(@"未知网络"); - BANetManagerShare.netWorkStatus = BANetworkStatusUnknown; - break; - case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网) - BALog(@"没有网络"); - BANetManagerShare.netWorkStatus = BANetworkStatusNotReachable; - break; - case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络 - BALog(@"手机自带网络"); - BANetManagerShare.netWorkStatus = BANetworkStatusReachableViaWWAN; - break; - case AFNetworkReachabilityStatusReachableViaWiFi: // WIFI - - BANetManagerShare.netWorkStatus = BANetworkStatusReachableViaWiFi; - BALog(@"WIFI--%lu", (unsigned long)BANetManagerShare.netWorkStatus); - break; - } - }]; - [manager startMonitoring]; -} - -/*! 对图片尺寸进行压缩 */ -+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize -{ - if (newSize.height > 375/newSize.width*newSize.height) - { - newSize.height = 375/newSize.width*newSize.height; - } - - if (newSize.width > 375) - { - newSize.width = 375; - } - - UIImage *newImage = [UIImage needCenterImage:image size:newSize scale:1.0]; - - return newImage; -} - -+ (NSString *)strUTF8Encoding:(NSString *)str -{ - /*! ios9适配的话 打开第一个 */ - //return [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; - return [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; -} - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANewsNetManager.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANewsNetManager.m" index b8ef232..f29d418 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANewsNetManager.m" +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BANewsNetManager.m" @@ -84,15 +84,12 @@ + (id)getVideosWithStartIndex:(NSInteger)startIndex completionHandle:(void (^)(i // // completionHandle([BAVideoModel BAMJParse:model], error); // }]; - return [BANetManager ba_requestWithType:BAHttpRequestTypeGet withUrlString:path withParameters:nil withSuccessBlock:^(id response) { - + + return [BANetManager ba_request_GETWithUrlString:path isNeedCache:YES parameters:nil successBlock:^(id response) { completionHandle([BAVideoModel BAMJParse:response], nil); - - } withFailureBlock:^(NSError *error) { - + } failureBlock:^(NSError *error) { BALog(@"error:%@", error); completionHandle(nil, error); - } progress:^(int64_t bytesProgress, int64_t totalBytesProgress) { }]; @@ -105,9 +102,8 @@ + (id)getVideosWithStartIndex:(NSInteger)startIndex completionHandle:(void (^)(i */ + (id)getDemoVC11DataCompletionHandle:(void(^)(id model, NSError *error))completionHandle { - return [BANetManager ba_requestWithType:BAHttpRequestTypeGet withUrlString:DemoVC11URLPath withParameters:nil withSuccessBlock:^(id response) { - - /*! + return [BANetManager ba_request_GETWithUrlString:DemoVC11URLPath isNeedCache:YES parameters:nil successBlock:^(id response) { + /*! 获取的字典示例: { @@ -129,13 +125,11 @@ + (id)getDemoVC11DataCompletionHandle:(void(^)(id model, NSError *error))complet */ - completionHandle([DemoVC11_model BAMJParse:response], nil); - - } withFailureBlock:^(NSError *error) { - + completionHandle([DemoVC11_model BAMJParse:response], nil); + + } failureBlock:^(NSError *error) { BALog(@"error:%@", error); completionHandle(nil, error); - } progress:^(int64_t bytesProgress, int64_t totalBytesProgress) { }]; @@ -149,9 +143,10 @@ + (id)getDemoVC11DataCompletionHandle:(void(^)(id model, NSError *error))complet + (id)postDemoVC11DataWithParameters:parameters completionHandle:(void(^)(id model, NSError *error))completionHandle { // NSString *url = [NSString stringWithFormat:@"%@%@", DemoVC11URLPath2, parameters[@"page"]]; - return [BANetManager ba_requestWithType:BAHttpRequestTypePost withUrlString:DemoVC11URLPath2 withParameters:parameters withSuccessBlock:^(id response) { + + return [BANetManager ba_request_POSTWithUrlString:DemoVC11URLPath2 isNeedCache:YES parameters:nil successBlock:^(id response) { completionHandle([DemoVC11_model BAMJParse:response], nil); - } withFailureBlock:^(NSError *error) { + } failureBlock:^(NSError *error) { BALog(@"error:%@", error); completionHandle(nil, error); } progress:^(int64_t bytesProgress, int64_t totalBytesProgress) { diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.h" new file mode 100644 index 0000000..868b65a --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.h" @@ -0,0 +1,42 @@ +// +// BAPage.h +// BABaseProject +// +// Created by 博爱 on 2016/12/16. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import + +@interface BAPage : NSObject + +/*! + * 总共的数据记录数 + */ +@property (nonatomic, assign) int count; + +/*! + * 分页数据的大小 + */ +@property (nonatomic, assign) int pageSize; + +/*! + * 当前页数 + */ +@property (nonatomic, assign) int cuPage; + +/*! + * 是否已到最后一页 + * + * @return 是否 + */ +- (BOOL)ba_page_isEnd; + +/*! + * 获得下一个页面请求的页码数。 + * + * @return 页码数 + */ +- (int)ba_page_getNextPage; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.m" new file mode 100644 index 0000000..d2e0217 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/BAPage.m" @@ -0,0 +1,60 @@ +// +// BAPage.m +// BABaseProject +// +// Created by 博爱 on 2016/12/16. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BAPage.h" + +@implementation BAPage + +- (instancetype)init +{ + self = [super init]; + if(self) + { + _count=0; + _pageSize=10; + _cuPage=1; + } + return self; +} + +/*! + * 是否已到最后一页 + * + * @return 是否 + */ +- (BOOL)ba_page_isEnd +{ + int maxPage = _cuPage * _pageSize; + BALog(@"当前页码:%@,pageSize:%@,总条数:%@", _cuPage, _pageSize, _count); + + if (maxPage >= _count) + { + return YES; + } + return NO; +} + +/*! + * 获得下一个页面请求的页码数。 + * + * @return 页码数 + */ +- (int)ba_page_getNextPage +{ + BALog(@"当前页码:%@,pageSize:%@,总条数:%@", _cuPage, _pageSize, _count); + if ([self ba_page_isEnd]) + { + return -1; + } + else + { + return _cuPage + 1; + } +} + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.h" deleted file mode 100755 index a02341a..0000000 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.h" +++ /dev/null @@ -1,105 +0,0 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' -// -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 博爱1616【137361770】 - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - -#import - -typedef UIImage JPEGImage; -typedef UIImage PNGImage; -typedef NSData JPEGData; -typedef NSData PNGData; - -@interface UIImage (CompressImage) -/** - * 传入图片,需要的大小,比例,得到压缩图片大小 - * - * @prama image 需要压缩的图片 - * @prama size 压缩后图片的大小 - * @prama scale 压缩的比例 0.0 - 1.0 - * - * @return 返回新的图片 - */ -+ (JPEGImage *)needCompressImage:(UIImage *)image size:(CGSize )size scale:(CGFloat )scale; -+ (JPEGImage *)needCompressImageData:(NSData *)imageData size:(CGSize )size scale:(CGFloat )scale; - -/** - * 传入图片,获取中间部分,需要的大小,压缩比例 - * - * @prama image 需要压缩的图片 - * @prama size 压缩后图片的大小 - * @prama scale 压缩的比例 0.0 - 1.0 - * - * @return 返回新的图片 - */ -+ (JPEGImage *)needCenterImage:(UIImage *)image size:(CGSize )size scale:(CGFloat )scale; - - -/** - * png图片转为jpeg(jpg)图片 - * - * @prama image 需要转为jpeg的png图片 - * - * @return 返回一张jpeg图片 - */ -+ (JPEGImage *)jpegImageWithPNGImage:(PNGImage *)pngImage; -+ (JPEGImage *)jpegImageWithPNGData:(PNGData *)pngData; -+ (JPEGData *)jpegDataWithPNGData:(PNGData *)pngData; -+ (JPEGData *)jpegDataWithPNGImage:(PNGImage *)pngImage; - -@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.h" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.h" new file mode 100644 index 0000000..b79dfd8 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.h" @@ -0,0 +1,26 @@ +// +// BAUserSqlite.h +// BABaseProject +// +// Created by 博爱 on 2016/11/28. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "JKDBModel.h" + +@interface BAUserSqlite : JKDBModel + +/*!电话号码 */ +@property (nonatomic, copy ) NSString *phone; + +/*!昵称 */ +@property (nonatomic, copy ) NSString *nickName; + +/*!密码 */ +@property (nonatomic, copy ) NSString *pwd; + +/*!用户识别码:唯一【登录后才有】 */ +@property (nonatomic, copy ) NSString *userCode; + + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.m" "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.m" new file mode 100644 index 0000000..6984110 --- /dev/null +++ "b/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BASqlite(\346\225\260\346\215\256\345\272\223)/BAUserSqlite.m" @@ -0,0 +1,13 @@ +// +// BAUserSqlite.m +// BABaseProject +// +// Created by 博爱 on 2016/11/28. +// Copyright © 2016年 博爱之家. All rights reserved. +// + +#import "BAUserSqlite.h" + +@implementation BAUserSqlite + +@end diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/Info.plist" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/Info.plist" index 1165da9..d673c47 100755 --- "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/Info.plist" +++ "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/Info.plist" @@ -4,6 +4,8 @@ CFBundleDevelopmentRegion en + CFBundleDisplayName + $(PRODUCT_NAME) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -15,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.01 CFBundleSignature ???? CFBundleURLTypes @@ -66,9 +68,19 @@ QQ41e150bc + + CFBundleTypeRole + Editor + CFBundleURLName + urlOpenApp + CFBundleURLSchemes + + openBoaiApp + + CFBundleVersion - 1 + 2 LSApplicationQueriesSchemes wechat @@ -88,6 +100,7 @@ mqqopensdkapi mqqopensdkapiV2 mqqopensdkapiV3 + mqqopensdkapiV4 mqzoneopensdk wtloginmqq wtloginmqq2 @@ -118,6 +131,13 @@ fb-messenger-api fbauth2 fbshareextension + kakaofa63a0b2356e923f3edd6512d531f546 + kakaokompassauth + storykompassauth + kakaolink + kakaotalk-4.5.0 + kakaostory-2.9.0 + pinterestsdk.v1 LSRequiresIPhoneOS @@ -148,6 +168,51 @@ NSIncludesSubdomains + kakao.co.kr + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + kakao.com + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + kakaocdn.net + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + kakaocorp.com + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + + linkedin.com + + NSExceptionAllowsInsecureHTTPLoads + + NSExceptionRequiresForwardSecrecy + + NSIncludesSubdomains + + log.umsns.com NSIncludesSubdomains @@ -177,6 +242,8 @@ sina.cn + NSExceptionMinimumTLSVersion + TLSv1.0 NSIncludesSubdomains NSThirdPartyExceptionRequiresForwardSecrecy @@ -227,6 +294,8 @@ weibo.cn + NSExceptionMinimumTLSVersion + TLSv1.0 NSIncludesSubdomains NSThirdPartyExceptionRequiresForwardSecrecy @@ -234,6 +303,8 @@ weibo.com + NSExceptionMinimumTLSVersion + TLSv1.0 NSIncludesSubdomains NSThirdPartyExceptionAllowsInsecureHTTPLoads @@ -243,6 +314,48 @@ + + + NSContactsUsageDescription + 是否允许访问通讯录? + NSCameraUsageDescription + cameraDesciption + NSPhotoLibraryUsageDescription + photoLibraryDesciption + NSMicrophoneUsageDescription + microphoneDesciption + + NSLocationUsageDescription + App需要您的同意,才能访问位置 + + NSLocationWhenInUseUsageDescription + App需要您的同意,才能在使用期间访问位置 + + NSLocationAlwaysUsageDescription + App需要您的同意,才能始终访问位置 + + NSCalendarsUsageDescription + App需要您的同意,才能访问日历 + + NSRemindersUsageDescription + App需要您的同意,才能访问提醒事项 + + NSMotionUsageDescription + App需要您的同意,才能访问运动与健身 + + NSHealthUpdateUsageDescription + App需要您的同意,才能访问健康更新 + + NSHealthShareUsageDescription + App需要您的同意,才能访问健康分享 + + NSBluetoothPeripheralUsageDescription + App需要您的同意,才能访问蓝牙 + + NSAppleMusicUsageDescription + App需要您的同意,才能访问媒体资料库 + + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/InfoPlist.strings" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/InfoPlist.strings" index a43ee8d..9ee6606 100755 --- "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/InfoPlist.strings" +++ "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/InfoPlist.strings" @@ -6,4 +6,4 @@ Copyright © 2016年 博爱之家. All rights reserved. */ -CFBundleDisplayName = "BABlog"; +"CFBundleDisplayName" = "Boai"; diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/Localizable.strings" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/Localizable.strings" index a5a1d2b..61e669f 100755 --- "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/Localizable.strings" +++ "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/en.lproj/Localizable.strings" @@ -6,6 +6,6 @@ Copyright © 2016年 博爱之家. All rights reserved. */ -title = "boai"; -DemoVC10Title = "custom collectionView"; +"title" = "boai"; +"DemoVC10Title" = "custom collectionView"; diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/zh-Hans.lproj/InfoPlist.strings" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/zh-Hans.lproj/InfoPlist.strings" index 88012f3..8b46355 100755 --- "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/zh-Hans.lproj/InfoPlist.strings" +++ "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/Plist/zh-Hans.lproj/InfoPlist.strings" @@ -6,4 +6,4 @@ Copyright © 2016年 博爱之家. All rights reserved. */ -CFBundleDisplayName = "博爱博客"; +"CFBundleDisplayName" = "博爱"; diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/gif/gif3.gif" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/gif/gif3.gif" new file mode 100644 index 0000000..7f4903b Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/gif/gif3.gif" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@2x.png" new file mode 100644 index 0000000..107e563 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@3x.png" new file mode 100644 index 0000000..4845f07 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/client@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@2x.png" new file mode 100644 index 0000000..33ebe9b Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@3x.png" new file mode 100644 index 0000000..f2e3d7c Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/distance@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@2x.png" new file mode 100644 index 0000000..ef4e384 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@3x.png" new file mode 100644 index 0000000..d7dd917 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/locate@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@2x.png" new file mode 100644 index 0000000..0e534ed Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@3x.png" new file mode 100644 index 0000000..d17f387 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/search@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@2x.png" new file mode 100644 index 0000000..3183fd0 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@3x.png" new file mode 100644 index 0000000..66afb46 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/voice@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@2x.png" new file mode 100644 index 0000000..4057761 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@3x.png" new file mode 100644 index 0000000..5f44698 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/messageVC.bundle/\345\256\232\344\275\215@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops.png" new file mode 100755 index 0000000..64a3a2d Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@2x.png" new file mode 100755 index 0000000..cd1125f Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@3x.png" new file mode 100755 index 0000000..c7dbc4c Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreExpressionShops@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum.png" new file mode 100755 index 0000000..a834fa0 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@2x.png" new file mode 100755 index 0000000..1383ee0 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@3x.png" new file mode 100755 index 0000000..fb4214a Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyAlbum@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard.png" new file mode 100755 index 0000000..7a8a060 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@2x.png" new file mode 100755 index 0000000..6e92651 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@3x.png" new file mode 100755 index 0000000..6b3240f Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyBankCard@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites.png" new file mode 100755 index 0000000..ada1ca9 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@2x.png" new file mode 100755 index 0000000..a11b174 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@3x.png" new file mode 100755 index 0000000..91f77b5 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreMyFavorites@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@2x.png" new file mode 100755 index 0000000..bb5c135 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@3x.png" new file mode 100755 index 0000000..a243e3c Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MoreSetting@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MyCardPackageIcon@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MyCardPackageIcon@2x.png" new file mode 100755 index 0000000..e478cd1 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/MyCardPackageIcon@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@2x.png" new file mode 100755 index 0000000..a667c75 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@3x.png" new file mode 100755 index 0000000..57bb896 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/ProfileLockOn@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set.png" new file mode 100755 index 0000000..1820f37 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@2x.png" new file mode 100755 index 0000000..8510256 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@3x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@3x.png" new file mode 100755 index 0000000..970e58f Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/barbuttonicon_set@3x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/qrcode@2x.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/qrcode@2x.png" new file mode 100644 index 0000000..b749b8c Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/qrcode@2x.png" differ diff --git "a/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/xhr.png" "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/xhr.png" new file mode 100755 index 0000000..f735b99 Binary files /dev/null and "b/BABaseProject/BAMainCode/Resources(\350\265\204\346\272\220)/\345\233\276\347\211\207/profileVC.bundle/xhr.png" differ diff --git a/BABaseProject/Main/Controller/BATabBarController.h b/BABaseProject/Main/Controller/BATabBarController.h index bf36029..4965a2c 100755 --- a/BABaseProject/Main/Controller/BATabBarController.h +++ b/BABaseProject/Main/Controller/BATabBarController.h @@ -1,63 +1,10 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBarController.h +// 博爱微博 +// +// Created by 孙博岩 on 15/7/26. +// Copyright © 2015年 boai. All rights reserved. +// #import diff --git a/BABaseProject/Main/Controller/BATabBarController.m b/BABaseProject/Main/Controller/BATabBarController.m index f2a56ab..ac77b83 100755 --- a/BABaseProject/Main/Controller/BATabBarController.m +++ b/BABaseProject/Main/Controller/BATabBarController.m @@ -1,65 +1,13 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBarController.m +// 博爱微博 +// +// Created by 孙博岩 on 15/7/26. +// Copyright © 2015年 boai. All rights reserved. +// #import "BATabBarController.h" +#import "UIImage+BAKit.h" #import "BATabBar.h" #import "BAHomeViewController.h" @@ -69,7 +17,8 @@ #import "BANavigationController.h" -#import "BAWebViewController.h" +//#import "BAUserTool.h" +//#import "BAUserResult.h" #import @@ -82,12 +31,12 @@ @interface BATabBarController () -@property (nonatomic, strong) NSMutableArray *items; +@property (nonatomic, strong) NSMutableArray *items; -@property (nonatomic, weak ) BAHomeViewController *home; -@property (nonatomic, weak ) BAMessageViewController *message; -@property (nonatomic, weak ) BADiscoverViewController *discover; -@property (nonatomic, weak ) BAProfileViewController *profile; +@property (nonatomic, weak) BAHomeViewController *home; +@property (nonatomic, weak) BAMessageViewController *message; +@property (nonatomic, weak) BADiscoverViewController *discover; +@property (nonatomic, weak) BAProfileViewController *profile; @end @@ -126,7 +75,7 @@ - (void)viewDidLoad { [self setUpTabBar]; // 每隔一段时间请求未读数 -// [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(requestUnread) userInfo:nil repeats:YES]; + [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(requestUnread) userInfo:nil repeats:YES]; } // 请求未读数 @@ -174,11 +123,11 @@ - (void)setUpTabBar #pragma mark - 当点击tabBar上的按钮调用 - (void)tabBar:(BATabBar *)tabBar didClickButton:(NSInteger)index { -// if (index == 0 && self.selectedIndex == index) -// { -// // 点击首页刷新 + if (index == 0 && self.selectedIndex == index) + { + // 点击首页刷新 // [_home refresh]; -// } + } self.selectedIndex = index; } @@ -208,7 +157,6 @@ - (void)setUpAllChildViewController { // 首页 BAHomeViewController *home = [[BAHomeViewController alloc] init]; - [self setUpOneChildViewController:home image:[UIImage imageNamed:@"otherImages.bundle/首页-不点亮"] selectedImage:[UIImage imageWithOriginalName:@"otherImages.bundle/首页-点亮"] title:@"首页"]; _home = home; @@ -248,36 +196,4 @@ - (void)setUpOneChildViewController:(UIViewController *)vc image:(UIImage *)imag [self addChildViewController:nav]; } -// 哪些页面支持自动转屏 -- (BOOL)shouldAutorotate{ - - BANavigationController *nav = self.viewControllers[self.selectedIndex]; - - // MoviePlayerViewController 、ZFTableViewController 控制器支持自动转屏 -// if ([nav.topViewController isKindOfClass:[BAWebViewController class]]) { -// // 调用ZFPlayerSingleton单例记录播放状态是否锁定屏幕方向 -// return !ZFPlayerShared.isLockScreen; -// } -// else - if ([nav.topViewController isKindOfClass:[BAWebViewController class]]) - { - return YES; - } - return NO; -} - -// viewcontroller支持哪些转屏方向 -- (UIInterfaceOrientationMask)supportedInterfaceOrientations{ - - BANavigationController *nav = self.viewControllers[self.selectedIndex]; - if ([nav.topViewController isKindOfClass:[BAWebViewController class]]) - { // MoviePlayerViewController这个页面支持转屏方向 - return UIInterfaceOrientationMaskAllButUpsideDown; - } - // 其他页面 - return UIInterfaceOrientationMaskPortrait; -} - - - @end diff --git a/BABaseProject/Main/View/BATabBar.h b/BABaseProject/Main/View/BATabBar.h index 23a2e0b..0a89160 100755 --- a/BABaseProject/Main/View/BATabBar.h +++ b/BABaseProject/Main/View/BATabBar.h @@ -1,63 +1,10 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBar.h +// 博爱微博 +// +// Created by 孙博岩 on 15/7/27. +// Copyright © 2015年 boai. All rights reserved. +// #import diff --git a/BABaseProject/Main/View/BATabBar.m b/BABaseProject/Main/View/BATabBar.m index a66bb98..f2896f7 100755 --- a/BABaseProject/Main/View/BATabBar.m +++ b/BABaseProject/Main/View/BATabBar.m @@ -1,74 +1,21 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBar.m +// 博爱微博 +// +// Created by 孙博岩 on 15/7/27. +// Copyright © 2015年 boai. All rights reserved. +// #import "BATabBar.h" #import "BATabBarButton.h" @interface BATabBar () -//@property (nonatomic, weak ) UIButton *plusButton; +@property (nonatomic, weak) UIButton *plusButton; -@property (nonatomic, strong) NSMutableArray *buttons; +@property (nonatomic, strong) NSMutableArray *buttons; -@property (nonatomic, weak ) UIButton *selectedButton; +@property (nonatomic, weak) UIButton *selectedButton; @end @@ -125,37 +72,38 @@ - (void)btnClick:(UIButton *)button } } -//- (UIButton *)plusButton -//{ -// if (!_plusButton) -// { -// UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; -// [btn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; -// [btn setImage:[UIImage imageNamed:@"tabbar_compose_background_icon_add"] forState:UIControlStateHighlighted]; -// [btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; -// [btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; -// -// // 默认按钮的尺寸和背景图一样大 -// // sizeToFit : 默认会根据按钮的背景图片活着image 和文字计算出按钮的最适合的尺寸 -// [btn sizeToFit]; -// -// _plusButton = btn; -// [self addSubview:_plusButton]; -// } -// return _plusButton; -//} +- (UIButton *)plusButton +{ + if (!_plusButton) + { + UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; + [btn setImage:[UIImage imageNamed:@"tabbar_compose_icon_add"] forState:UIControlStateNormal]; + [btn setImage:[UIImage imageNamed:@"tabbar_compose_background_icon_add"] forState:UIControlStateHighlighted]; + [btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button"] forState:UIControlStateNormal]; + [btn setBackgroundImage:[UIImage imageNamed:@"tabbar_compose_button_highlighted"] forState:UIControlStateHighlighted]; + + // 默认按钮的尺寸和背景图一样大 + // sizeToFit : 默认会根据按钮的背景图片活着image 和文字计算出按钮的最适合的尺寸 + [btn sizeToFit]; + + _plusButton = btn; + [self addSubview:_plusButton]; + } + return _plusButton; +} // 调整子控件的位置 - (void)layoutSubviews { [super layoutSubviews]; - CGFloat W = BA_SCREEN_WIDTH; + + CGFloat W = self.bounds.size.width; CGFloat H = self.bounds.size.height; CGFloat btn_X = 0; CGFloat btn_Y = 0; - CGFloat btn_W = W / (self.items.count); + CGFloat btn_W = W / (self.items.count + 1); CGFloat btn_H = self.bounds.size.height; // int i = 0; @@ -174,6 +122,10 @@ - (void)layoutSubviews // 调整系统自带的tabBar上的按钮位置frame for (UIView *tabBarButton in self.buttons) { + if (i == 2) + { + i = 3; + } btn_X = i * btn_W; tabBarButton.frame = CGRectMake(btn_X, btn_Y, btn_W, btn_H); @@ -182,7 +134,7 @@ - (void)layoutSubviews } // 设置添加按钮的位置 -// self.plusButton.center = CGPointMake(W * 0.5, H * 0.5); + self.plusButton.center = CGPointMake(W * 0.5, H * 0.5); // self.plusButton.bounds = CGRectMake(0, 0, self.plusButton.currentBackgroundImage.size.width, self.plusButton.currentBackgroundImage.size.height); // } diff --git a/BABaseProject/Main/View/BATabBarButton.h b/BABaseProject/Main/View/BATabBarButton.h index 1e8f740..b2b3f57 100755 --- a/BABaseProject/Main/View/BATabBarButton.h +++ b/BABaseProject/Main/View/BATabBarButton.h @@ -1,70 +1,15 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBarButton.h +// 博爱微博 +// +// Created by 孙博岩 on 15/8/1. +// Copyright © 2015年 boai. All rights reserved. +// #import @interface BATabBarButton : UIButton -@property (nonatomic, strong) UITabBarItem *item; -@property (nonatomic, strong) UIView *lineView; - +@property (nonatomic, strong) UITabBarItem *item; @end diff --git a/BABaseProject/Main/View/BATabBarButton.m b/BABaseProject/Main/View/BATabBarButton.m index b1e34ab..c6f1c4d 100755 --- a/BABaseProject/Main/View/BATabBarButton.m +++ b/BABaseProject/Main/View/BATabBarButton.m @@ -1,63 +1,10 @@ - -/*! - * @header BAKit.h - * BABaseProject - * - * @brief BAKit - * - * @author 博爱 - * @copyright Copyright © 2016年 博爱. All rights reserved. - * @version V1.0 - */ - -// _ooOoo_ -// o8888888o -// 88" . "88 -// (| -_- |) -// O\ = /O -// ____/`---'\____ -// . ' \\| |// `. -// / \\||| : |||// \ -// / _||||| -:- |||||- \ -// | | \\\ - /// | | -// | \_| ''\---/'' | | -// \ .-\__ `-` ___/-. / -// ___`. .' /--.--\ `. . __ -// ."" '< `.___\_<|>_/___.' >'"". -// | | : `- \`.;`\ _ /`;.`/ - ` : | | -// \ \ `-. \_ __\ /__ _/ .-` / / -// ======`-.____`-.___\_____/___.-`____.-'====== -// `=---=' // -// ............................................. -// 佛祖镇楼 BUG辟易 -// 佛曰: -// 写字楼里写字间,写字间里程序员; -// 程序人员写程序,又拿程序换酒钱。 -// 酒醒只在网上坐,酒醉还来网下眠; -// 酒醉酒醒日复日,网上网下年复年。 -// 但愿老死电脑间,不愿鞠躬老板前; -// 奔驰宝马贵者趣,公交自行程序员。 -// 别人笑我忒疯癫,我笑自己命太贱; -// 不见满街漂亮妹,哪个归得程序员? - -/* - - ********************************************************************************* - * - * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug - * - * QQ : 可以添加SDAutoLayout群 497140713 在这里找到我(博爱1616【137361770】) - * 微博 : 博爱1616 - * Email : 137361770@qq.com - * GitHub : https://github.com/boai - * 博客园 : http://www.cnblogs.com/boai/ - * 博客 : http://boai.github.io - - ********************************************************************************* - - */ - +// BATabBarButton.m +// 博爱微博 +// +// Created by 孙博岩 on 15/8/1. +// Copyright © 2015年 boai. All rights reserved. +// #import "BATabBarButton.h" #import "BABadgeView.h" @@ -92,18 +39,6 @@ - (BABadgeView *)badgeView return _badgeView; } -- (UIView *)lineView -{ - if (!_lineView) - { - UIView *lineView = [UIView new]; - - [self addSubview:lineView]; - _lineView = lineView; - } - return _lineView; -} - - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { @@ -118,10 +53,6 @@ - (instancetype)initWithFrame:(CGRect)frame // 设置文字字体 self.titleLabel.font = [UIFont systemFontOfSize:12]; -// self.lineView.backgroundColor = BA_Red_Color; -// self.lineView.hidden = YES; - -// [self addObserver:self forKeyPath:@"selected" options:NSKeyValueObservingOptionNew context:nil]; } return self; } @@ -145,47 +76,12 @@ - (void)setItem:(UITabBarItem *)item // 只要监听的属性一有新值,就会调用 - (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context { -// self.lineView.hidden = !self.selected; - [self setTitle:_item.title forState:UIControlStateNormal]; [self setImage:_item.image forState:UIControlStateNormal]; [self setImage:_item.selectedImage forState:UIControlStateSelected]; // 设置badgeValue self.badgeView.badgeValue = _item.badgeValue; - - NSString *title = _item.title; - if ([title isEqualToString:@"首页"]) { - - [self setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; - [self setTitleColor:BA_Red_Color forState:UIControlStateSelected]; - } - else if ([title isEqualToString:@"消息"]) - { - [self setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; - [self setTitleColor:BA_Orange_Color forState:UIControlStateSelected]; - } - else if ([title isEqualToString:@"发现"]) - { - [self setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; - [self setTitleColor:BA_Green_Color forState:UIControlStateSelected]; - } - else if ([title isEqualToString:@"我的"]) - { - [self setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal]; - [self setTitleColor:BA_Blue_Color forState:UIControlStateSelected]; - } - - -} - -- (void)dealloc -{ - [_item removeObserver:self forKeyPath:@"title"]; - [_item removeObserver:self forKeyPath:@"image"]; - [_item removeObserver:self forKeyPath:@"selectedImage"]; - [_item removeObserver:self forKeyPath:@"badgeValue"]; -// [self removeObserver:self forKeyPath:@"selected"]; } // 修改按钮内部子控件的frame @@ -196,27 +92,20 @@ - (void)layoutSubviews // 1.imageView CGFloat imageX = 0; CGFloat imageY = 0; - CGFloat imageW = self.frame.size.width; - CGFloat imageH = self.frame.size.height * BAImageRidio; + CGFloat imageW = self.bounds.size.width; + CGFloat imageH = self.bounds.size.height * BAImageRidio; self.imageView.frame = CGRectMake(imageX, imageY, imageW, imageH); // 2.title CGFloat titleX = 0; CGFloat titleY = imageH - 3; - CGFloat titleW = self.frame.size.width; - CGFloat titleH = self.frame.size.height - titleY -2; + CGFloat titleW = self.bounds.size.width; + CGFloat titleH = self.bounds.size.height - titleY; self.titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH); // 3.badgeView self.badgeView.x = self.width - self.badgeView.width - 10; self.badgeView.y = 0; - - CGFloat lineViewX = 0; - CGFloat lineViewY = self.titleLabel.bottom; - CGFloat lineViewW = self.frame.size.width; - CGFloat lineViewH = 2; - self.lineView.frame = CGRectMake(lineViewX, lineViewY, lineViewW, lineViewH); } - @end diff --git a/Podfile b/Podfile index b092d5a..716b65b 100755 --- a/Podfile +++ b/Podfile @@ -1,7 +1,7 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '8.0' +platform :ios, '8.0' # Uncomment this line if you're using Swift -# use_frameworks! +#use_frameworks! project 'BABaseProject.project' @@ -14,39 +14,65 @@ inhibit_all_warnings! target 'BABaseProject' do - # 自定义button框架 - pod 'BAButton', '~> 1.0.1' - + # BAHome 系列代码 + pod 'BANetManager' + pod 'BAButton' + pod 'BAAlert' + pod 'BAPickView' + pod 'BATouchID' + pod 'BATextView' +# pod 'BAAlertController' + + # 对系统原生的AutoLayout 的 NSLayoutConstraints类的封装,优雅的链式语法,GitHub 排名第三 - pod 'Masonry', '~> 0.6.4' + pod 'Masonry' # 两个都是自动布局框架 pod 'SDAutoLayout' # 为UI控件提供网络图片加载和缓存功能,AF已经整合了此功能,一般用AF就够了,据专业人士说:SD比AF快0.02秒,如果,同时引用AF和SD,那么AF的网络图片加载方法会被划线 - pod 'SDWebImage', '~> 3.7.5' + pod 'SDWebImage' # 为滚动控件(UIScrollView, UITableView, UICollectionView)添加头部脚部刷新UI - pod 'MJRefresh', '~> 3.1.0' + pod 'MJRefresh' # 键盘框架 pod 'IQKeyboardManager' # 专门用于转换 Array/Dictionary -> 对象模型 主要用于JSON解析,基本都用这个框架(必会) - pod 'MJExtension', '~> 3.0.10' + pod 'MJExtension' # GitHub 排名第一的网络操作框架,底层使用NSURLSession+NSOperation(多线程) - pod 'AFNetworking', '~> 3.0' + pod 'AFNetworking' # 在屏幕中间显示 加载框 类似于安卓的toast效果 pod 'MBProgressHUD' + # 数据库 sqlite + pod 'FMDB' + # 网络或本地 多张图片浏览 控制器 # pod 'MWPhotoBrowser' # 友盟分享 - pod 'UMengSocial', '~> 4.4' - +# pod 'UMengSocial', '~> 4.4' +# pod 'UMengSocialCOM', '~> 5.2.1' + pod 'UMengUShare/UI' + + # 集成新浪微博 【友盟官网技术文档这里标点符号有错,导入的时候记得更改】 + pod 'UMengUShare/Social/Sina' + # 集成微信 + pod 'UMengUShare/Social/WeChat' + + # 集成QQ + pod 'UMengUShare/Social/QQ' + # 集成支付宝 + pod 'UMengUShare/Social/AlipayShare' + + + # 百度地图SDK + pod 'BaiduMapKit' + # 二维码 #pod 'LBXScan','~> 1.1.1' # pod 'LBXAlertAction' @@ -56,17 +82,21 @@ target 'BABaseProject' do pod 'JMRoundedCorner' # 把系统的target+selector/委托模式 转为 Block语法,让代码结构更加紧凑 - pod 'BlocksKit' - +# pod 'BlocksKit' + + # Facebook kit 框架 +# pod 'AsyncDisplayKit' + + # 自定义提示框 # pod 'Toast', '~> 3.0' # 线性布局MyLinearLayout/相对布局MyRelativeLayout/框架布局MyFrameLayout/表格布局MyTableLayout/流式布局MyFlowLayout/浮动布局MyFloatLayout/SizeClass的支持 - pod 'MyLayout', '~> 1.1.6' + pod 'MyLayout' # 各种封装的集合!大神的多年积累! - pod 'YYKit' - +# pod 'YYKit' + # 内存泄露检测工具 pod 'MLeaksFinder' @@ -74,10 +104,19 @@ target 'BABaseProject' do pod 'NullSafe' # oc 与 js 交互框架 - pod 'WebViewJavascriptBridge', '~> 5.0' - +# pod 'WebViewJavascriptBridge', '~> 5.0' + # Facebook的内存检测工具 - pod 'FBMemoryProfiler' +# pod 'FBMemoryProfiler' + + # 空数据 的三方库 + pod 'DZNEmptyDataSet' + + + # 截屏 +# pod 'SDScreenshotCapture' + + # 类似QQ侧滑框架 # pod "JVFloatingDrawer" @@ -105,6 +144,14 @@ target 'BABaseProject' do # #地址:https://github.com/rnapier/RNCachingURLProtocol + # Aspect库是对面向切面编程(Aspect Oriented Programming)的实现,里面封装了Runtime的方法,也封装了上文的Method Swizzling方法。因此我们也可以看到,Method Swizzling也是AOP编程的一种。Aspect的用途很广泛,这里不具体展开,想了解更多的可以看一下官方github的介绍,已经够详细了。 + # pod "Aspects" + + # 友盟统计 + pod 'UMengAnalytics-NO-IDFA' + + # ReactiveObjC包含RAC 2原来包含的全部代码 + pod 'ReactiveObjC' target 'BABaseProjectTests' do @@ -115,3 +162,59 @@ target 'BABaseProject' do end end +#Last login: Sat Jun 3 15:33:55 on ttys000 + +#- AFNetworking, 3.1.0 +#- BAAlert, 1.1.9 +#- BAButton, 2.4.2 +#- BANetManager, 2.2.2 +#- BAPickView, 1.0.3 +#- BATextView, 1.0.1 +#- BATouchID, 1.0.1 +#- BaiduMapKit, 3.3.2 +#- DZNEmptyDataSet, 1.8.1 +#- FBRetainCycleDetector, 0.1.3 +#- FMDB, 2.6.2 +#- IQKeyboardManager, 4.0.10 +#- JMRoundedCorner, 1.2.1 +#- MBProgressHUD, 1.0.0 +#- MJExtension, 3.0.13 +#- MJRefresh, 3.1.12 +#- MLeaksFinder, 0.2.1 +#- Masonry, 1.0.2 +#- MyLayout, 1.3.8 +#- NullSafe, 1.2.2 +#- ReactiveObjC, 3.0.0 +#- SDAutoLayout, 2.1.8 +#- SDWebImage, 4.0.0 +#- UMengAnalytics-NO-IDFA, 4.2.5 +#- UMengUShare, 6.4.4 +#- YYCache, 1.0.4 +#- YYKit, 1.0.9 + +#Last login: Sat Jun 3 15:04:25 on ttys003 + +#- AFNetworking, 3.1.0 +#- BAAlert, 1.1.9 +#- BAButton, 2.4.2 +#- BaiduMapKit, 3.3.2 +#- DZNEmptyDataSet, 1.8.1 +#- FBRetainCycleDetector, 0.1.3 +#- FMDB, 2.6.2 +#- IQKeyboardManager, 4.0.10 +#- JMRoundedCorner, 1.2.1 +#- MBProgressHUD, 1.0.0 +#- MJExtension, 3.0.13 +#- MJRefresh, 3.1.12 +#- MLeaksFinder, 0.2.1 +#- Masonry, 1.0.2 +#- MyLayout, 1.3.8 +#- NullSafe, 1.2.2 +#- ReactiveObjC, 3.0.0 +#- SDAutoLayout, 2.1.8 +#- SDWebImage, 4.0.0 +#- UMengAnalytics-NO-IDFA, 4.2.5 +#- UMengUShare, 6.4.4 +#- YYKit, 1.0.9 + + diff --git a/Podfile.lock b/Podfile.lock index 4726b8a..2b23d46 100755 --- a/Podfile.lock +++ b/Podfile.lock @@ -14,89 +14,118 @@ PODS: - AFNetworking/Serialization (3.1.0) - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - - BAButton (1.0.1) - - BlocksKit (2.2.5): - - BlocksKit/All (= 2.2.5) - - BlocksKit/All (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - BlocksKit/MessageUI - - BlocksKit/UIKit - - BlocksKit/Core (2.2.5) - - BlocksKit/DynamicDelegate (2.2.5) - - BlocksKit/MessageUI (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - BlocksKit/UIKit (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - FBAllocationTracker (0.1.5) - - FBMemoryProfiler (0.1.3): - - FBAllocationTracker (~> 0.1) - - FBRetainCycleDetector (~> 0.1) - - FBRetainCycleDetector (0.1.2) - - IQKeyboardManager (4.0.4) + - BAAlert (1.1.9) + - BAButton (2.4.3) + - BaiduMapKit (3.3.2) + - BANetManager (2.2.2): + - AFNetworking + - YYCache + - BAPickView (1.0.3) + - BATextView (1.0.1) + - BATouchID (1.0.1) + - DZNEmptyDataSet (1.8.1) + - FBRetainCycleDetector (0.1.3) + - FMDB (2.7.2): + - FMDB/standard (= 2.7.2) + - FMDB/standard (2.7.2) + - IQKeyboardManager (4.0.10) - JMRoundedCorner (1.2.1) - - Masonry (0.6.4) + - Masonry (1.0.2) - MBProgressHUD (1.0.0) - - MJExtension (3.0.11) - - MJRefresh (3.1.10) - - MLeaksFinder (0.2.0): + - MJExtension (3.0.13) + - MJRefresh (3.1.12) + - MLeaksFinder (0.2.1): - FBRetainCycleDetector - - MyLayout (1.1.9) + - MyLayout (1.3.9) - NullSafe (1.2.2) - - SDAutoLayout (2.1.4) - - SDWebImage (3.7.6): - - SDWebImage/Core (= 3.7.6) - - SDWebImage/Core (3.7.6) - - UMengSocial (4.4) - - WebViewJavascriptBridge (5.0.5) - - YYKit (1.0.7): - - YYKit/no-arc (= 1.0.7) - - YYKit/no-arc (1.0.7) + - ReactiveObjC (3.0.0) + - SDAutoLayout (2.1.8) + - SDWebImage (4.0.0): + - SDWebImage/Core (= 4.0.0) + - SDWebImage/Core (4.0.0) + - UMengAnalytics-NO-IDFA (4.2.5) + - UMengUShare/Core (6.4.4): + - UMengUShare/Network + - UMengUShare/Network (6.4.4) + - UMengUShare/Social/AlipayShare (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/QQ (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedQQ + - UMengUShare/Social/ReducedQQ (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedSina (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedWeChat (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/Sina (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedSina + - UMengUShare/Social/WeChat (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedWeChat + - UMengUShare/UI (6.4.4): + - UMengUShare/Core + - YYCache (1.0.4) DEPENDENCIES: - - AFNetworking (~> 3.0) - - BAButton (~> 1.0.1) - - BlocksKit - - FBMemoryProfiler + - AFNetworking + - BAAlert + - BAButton + - BaiduMapKit + - BANetManager + - BAPickView + - BATextView + - BATouchID + - DZNEmptyDataSet + - FMDB - IQKeyboardManager - JMRoundedCorner - - Masonry (~> 0.6.4) + - Masonry - MBProgressHUD - - MJExtension (~> 3.0.10) - - MJRefresh (~> 3.1.0) + - MJExtension + - MJRefresh - MLeaksFinder - - MyLayout (~> 1.1.6) + - MyLayout - NullSafe + - ReactiveObjC - SDAutoLayout - - SDWebImage (~> 3.7.5) - - UMengSocial (~> 4.4) - - WebViewJavascriptBridge (~> 5.0) - - YYKit + - SDWebImage + - UMengAnalytics-NO-IDFA + - UMengUShare/Social/AlipayShare + - UMengUShare/Social/QQ + - UMengUShare/Social/Sina + - UMengUShare/Social/WeChat + - UMengUShare/UI SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 - BAButton: bb8f74e5e167a7e01ce8c0a66eafc3245ebb8c31 - BlocksKit: 7f422b971407001178d181a43b99014ea2591fe6 - FBAllocationTracker: dfdca3f71aceca6a85e95e3c6ec76a9785eba0f1 - FBMemoryProfiler: 623fc5f8a61f7d02ec75c87e3b97c90f621d8b02 - FBRetainCycleDetector: 45462f9ed1af0cd77224a4cc4e6dacaca47371b4 - IQKeyboardManager: 4a6f83b540283c2645aaeba2bd8dc0f09b5c77f8 + BAAlert: 99fb0f11877797481623369032eb2ff788ae8ddb + BAButton: 5297ede563f199a8110b85a46f861217d92b1543 + BaiduMapKit: 5118390d63b375483bd64c963e8e32a40fd9ddb5 + BANetManager: bd2e6d0bcb5fc7397f3098b90c3bcf25a04127b5 + BAPickView: 0ddba863e40bf706bc4417c5bc2d220b74a46a1e + BATextView: 0514fcbc994a7abafc0a3addb35596fe56c1910c + BATouchID: 33732f62f7d656733a3208c94744c61806095d3c + DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 + FBRetainCycleDetector: f0c7b290bf48ae77f6ae060843ce34ae341781eb + FMDB: 6198a90e7b6900cfc046e6bc0ef6ebb7be9236aa + IQKeyboardManager: 593ee99b88381f4b9ccb22bd680f22606351bd41 JMRoundedCorner: 214e56c2a7e3a0916e8d6040c66d85519cc1be87 - Masonry: 281802d04d787ea2973179ee8bcb50500579ede2 + Masonry: 7c429b56da9d4ee0bbb3ed77a5ea710d6a5df39e MBProgressHUD: 4890f671c94e8a0f3cf959aa731e9de2f036d71a - MJExtension: f9ae6ddc0f1c482c3c9af750280ccebd14381958 - MJRefresh: bb72948c985914b0b5cecac573a2c69a8915fb02 - MLeaksFinder: 07ab450d72d3bf5ef4201b74047d74ceae66d605 - MyLayout: a908e6a34cd9dc5320b6ac27b7fb419c6a8933d2 + MJExtension: 5932755f451458eefa24239358817f8d291240c7 + MJRefresh: b96cdb21c4aa75a7b07654311ab2f315c497e806 + MLeaksFinder: '0850e2f2abc7227adc4d4e2d1992b431264eb4d5' + MyLayout: 3d0450e4b5c404806929ea689ebbca6dea7ac45c NullSafe: cbf1f77a24558e49bc76e2673f31250d3087c792 - SDAutoLayout: 1b2926b193a63287f473dae426ed07861e21e271 - SDWebImage: c325cf02c30337336b95beff20a13df489ec0ec9 - UMengSocial: aba7296602310385114d82c255539a7bef3b7ab0 - WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5 - YYKit: 843d1b26e20b82c695790c9a89907eaa1e99907f + ReactiveObjC: ce79989e8684b9086b5f8d0c74bc7b81a8729c9e + SDAutoLayout: 5a4b48d6b8a5172ae8d088d2879e40dd795e6251 + SDWebImage: 76a6348bdc74eb5a55dd08a091ef298e56b55e41 + UMengAnalytics-NO-IDFA: 16666e32edce5be44ae5b14aaaa7f3582e09d6ab + UMengUShare: cd54ae52958426b79aa9193a7b02058d6a6d9aa0 + YYCache: 8105b6638f5e849296c71f331ff83891a4942952 -PODFILE CHECKSUM: a2e7a9ca6e8652cd21e7bc06e38899dea225bf83 +PODFILE CHECKSUM: 8136b95a48adadabc0540614ee4d5836b1f967d8 -COCOAPODS: 1.0.1 +COCOAPODS: 1.2.1 diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.h b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.h new file mode 100644 index 0000000..48d73f8 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.h @@ -0,0 +1,66 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import +#import "BAAlert_Config.h" + +@class BAActionSheet, BAActionSheetModel; + +typedef void(^BAActionSheet_ConfigBlock)(BAActionSheet *tempView); +typedef void (^BAActionSheet_ActionBlock)(NSIndexPath *indexPath, BAActionSheetModel *model); + + +@interface BAActionSheet : UIView + +/*! 是否开启边缘触摸隐藏 alert 默认:YES */ +@property (nonatomic, assign) BOOL isTouchEdgeHide; + +/*! 是否开启进出场动画 默认:NO,如果 YES ,并且同步设置进出场动画枚举为默认值:1 */ +@property (nonatomic, assign, getter=isShowAnimate) BOOL showAnimate; + +/*! 进出场动画枚举 默认:1 ,并且默认开启动画开关 */ +@property (nonatomic, assign) BAAlertAnimatingStyle animatingStyle; + +/*! BAActionSheet 类型,默认:1 */ +@property (nonatomic, assign) BAActionSheetType actionSheetType; + +@property (nonatomic, strong) NSArray *dataArray; +@property (nonatomic, strong) NSString *title; + +/*! + * + * @param configuration 属性配置:如 bgColor、buttonTitleColor、isTouchEdgeHide... + * @param actionBlock block回调点击的选项 + */ ++ (void)ba_actionSheetShowWithConfiguration:(BAActionSheet_ConfigBlock)configuration + actionBlock:(BAActionSheet_ActionBlock)actionBlock; + +/*! + * 隐藏 BAActionSheet + */ +- (void)ba_actionSheetHidden; + +@end + +@class BAActionSheetSubContentModel; +@interface BAActionSheetModel : NSObject + +@property(nonatomic, copy) NSString *imageUrl; +@property(nonatomic, copy) NSString *content; +@property(nonatomic, copy) NSString *subContent; +@property(nonatomic, strong) NSArray *subContentArray; + +@end + +@interface BAActionSheetSubContentModel : NSObject + +@property(nonatomic, copy) NSString *subContent; + +@end diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.m b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.m new file mode 100644 index 0000000..d44d0cb --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheet.m @@ -0,0 +1,637 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + +#import "BAActionSheet.h" +#import "BAActionSheetCell.h" +#import "CALayer+Animation.h" +#import "BAAlert_OC.h" + +static NSString * const kCellID = @"BAActionSheetCell"; + +@interface BAActionSheet () +< + UITableViewDelegate, + UITableViewDataSource +> +/*! tableView */ +@property (strong, nonatomic) UITableView *tableView; + +/*! 点击事件回调 */ +@property (nonatomic, copy) BAActionSheet_ActionBlock actionBlock; + +@property (nonatomic, strong) UIWindow *actionSheetWindow; +@property (nonatomic, strong) UIView *headerView; +@property (nonatomic, strong) NSIndexPath *indexPath; +@property (nonatomic, assign) BOOL isExpand; +@property (nonatomic, strong) UILabel *titleLabel; +@property(nonatomic, assign) BOOL isAnimating; + +@end + +@implementation BAActionSheet + +/*! + * + * @param configuration 属性配置:如 bgColor、buttonTitleColor、isTouchEdgeHide... + * @param actionBlock block回调点击的选项 + */ ++ (void)ba_actionSheetShowWithConfiguration:(BAActionSheet_ConfigBlock)configuration + actionBlock:(BAActionSheet_ActionBlock)actionBlock +{ + BAActionSheet *actionSheet = [[self alloc] init]; + + if (configuration) + { + configuration(actionSheet); + } + actionSheet.actionBlock = actionBlock; + [actionSheet ba_actionSheetShow]; +} + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self setupCommonUI]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupCommonUI]; + } + return self; +} + +- (void)setupCommonUI +{ + self.backgroundColor = BAAlert_Color_Translucent; + self.actionSheetType = BAActionSheetTypeNormal; + self.isExpand = NO; + self.isTouchEdgeHide = YES; + + [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(handleDeviceOrientationRotateAction:) name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +#pragma mark - UITableView +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +{ + if (self.actionSheetType == BAActionSheetTypeCustom) + { + return 2; + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + return 1; + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + return self.dataArray.count; + } + return 0; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + if (self.actionSheetType == BAActionSheetTypeCustom) + { + return (section == 0) ? self.dataArray.count : 1; + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + return self.dataArray.count; + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + if (self.isExpand) + { + if (section == self.indexPath.section) + { + BAActionSheetModel *model = self.dataArray[section]; + + return model.subContentArray.count; + } + } + else + { + return 0; + } + } + return 0; +} + +- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath +{ + + BAActionSheetCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID]; + + if (!cell) + { + cell = [[BAActionSheetCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellID]; + } + cell.actionSheetType = self.actionSheetType; + + if (self.actionSheetType == BAActionSheetTypeCustom) + { + if (indexPath.section == 0) + { + BAActionSheetModel *model = self.dataArray[indexPath.row]; + cell.textLabel.text = model.content; + } + else if (indexPath.section == 1) + { + cell.textLabel.text = @"取 消"; + } + cell.textLabel.textAlignment = NSTextAlignmentCenter; + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + BAActionSheetModel *model = self.dataArray[indexPath.row]; + cell.textLabel.text = model.content; + cell.detailTextLabel.text = model.subContent; + cell.imageView.image = [UIImage imageNamed:model.imageUrl]; + cell.detailTextLabel.textColor = BAAlert_Color_gray7; + + if (indexPath.row == 0) + { + self.indexPath = indexPath; + } + + if (self.indexPath == indexPath) + { + cell.accessoryType = UITableViewCellAccessoryCheckmark; + } + else + { + cell.accessoryType = UITableViewCellAccessoryNone; + } + + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + if (self.isExpand) + { + BAActionSheetModel *model = self.dataArray[indexPath.section]; + if (model.subContentArray.count) + { + BAActionSheetSubContentModel *subContentModel = model.subContentArray[indexPath.row]; + cell.textLabel.text = subContentModel.subContent; + cell.textLabel.textColor = BAAlert_Color_gray7; + + cell.backgroundColor = BAAlert_Color_gray11; + + return cell; + } + if (indexPath.row == model.subContentArray.count-1) + { + self.isExpand = NO; + } + } + } + return cell; +} + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; + + if (self.actionSheetType == BAActionSheetTypeCustom) + { + if (indexPath.section == 0) + { + if (self.actionBlock) + { + [self ba_actionSheetHidden]; + BAActionSheetModel *model = self.dataArray[indexPath.row]; + + self.actionBlock(indexPath, model); + } + } + else if (indexPath.section == 1) + { + [self ba_actionSheetHidden]; + } + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + // 之前选中的,取消选择 + UITableViewCell *celled = [tableView cellForRowAtIndexPath:self.indexPath]; + celled.accessoryType = UITableViewCellAccessoryNone; + // 记录当前选中的位置索引 + self.indexPath = indexPath; + // 当前选择的打勾 + UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; + cell.accessoryType = UITableViewCellAccessoryCheckmark; + + if (self.actionBlock) + { + [self ba_actionSheetHidden]; + BAActionSheetModel *model = self.dataArray[indexPath.row]; + self.actionBlock(self.indexPath, model); + } + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + if (self.actionBlock) + { + [self ba_actionSheetHidden]; + BAActionSheetModel *model = self.dataArray[indexPath.section]; + + self.actionBlock(indexPath, model); + } + } +} + +- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath +{ + if (self.actionSheetType == BAActionSheetTypeNormal) + { + UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; + + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + [self.tableView reloadData]; + } +} + +- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath +{ + return 44; +} + +- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section +{ + if (self.actionSheetType == BAActionSheetTypeCustom) + { + return (section == 0) ? FLT_MIN : 10; + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + return FLT_MIN; + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + return 44; + } + else + { + return FLT_MIN; + } +} + +- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section +{ + return FLT_MIN; +} + +- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section +{ + if (self.actionSheetType == BAActionSheetTypeExpand) + { + BAActionSheetModel *model = self.dataArray[section]; + + UIButton *header = [UIButton new]; + header.backgroundColor = [UIColor whiteColor]; + header.userInteractionEnabled = YES; + [header addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + header.tag = section; + + NSString *imageName = @""; + imageName = @"BAAlert.bundle/Images/arow_down"; + + UIButton *expandButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [expandButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal]; + expandButton.frame = CGRectMake(SCREENWIDTH - 50, 0, 30, 30); + expandButton.userInteractionEnabled = NO; + + UILabel *titleLabel = [UILabel new]; + titleLabel.frame = CGRectMake(15, 0, SCREENWIDTH - 15 * 2, 43); + titleLabel.text = model.content; + + [header addSubview:titleLabel]; + if (model.subContentArray.count > 0) + { + [header addSubview:expandButton]; + } + + return header; + } + return [UIView new]; +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + NSLog(@"触摸了边缘隐藏View!"); + UITouch *touch = [touches anyObject]; + UIView *view = [touch view]; + + if (self.isAnimating) + { + NSLog(@"请在动画结束时点击!"); + return; + } + if (!self.isTouchEdgeHide) + { + NSLog(@"触摸了View边缘,但您未开启触摸边缘隐藏方法,请设置 isTouchEdgeHide 属性为 YES 后再使用!"); + } + + if ([view isKindOfClass:[self class]]) + { + [self ba_actionSheetHidden]; + } +} + +- (void)handleDeviceOrientationRotateAction:(NSNotification *)noti +{ + [self ba_layoutSubViews]; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; +} + +- (void)ba_layoutSubViews +{ + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + CGFloat header_h = 0; + + self.frame = [UIScreen mainScreen].bounds; + + min_w = SCREENWIDTH; + min_h = (self.title.length > 0) ? 44 : 0; + self.headerView.frame = CGRectMake(min_x, min_y, min_w, min_h); + _titleLabel.frame = self.headerView.bounds; + + + header_h = CGRectGetHeight(self.headerView.frame); + if (self.actionSheetType == BAActionSheetTypeCustom) + { + min_h = (self.dataArray.count + 1) * 44 + 10; + } + else if (self.actionSheetType == BAActionSheetTypeNormal) + { + min_h = (self.dataArray.count) * 44; + } + else if (self.actionSheetType == BAActionSheetTypeExpand) + { + if (self.isExpand) + { + BAActionSheetModel *model = self.dataArray[self.indexPath.section]; + min_h = (self.dataArray.count + model.subContentArray.count) * 44; + } + else + { + min_h = (self.dataArray.count) * 44; + } + } + min_y = SCREENHEIGHT - min_h; + min_y -= header_h; + min_y = MAX(min_y, 0); + min_h += header_h; + min_h = MIN(min_h, SCREENHEIGHT); + if (min_h == SCREENHEIGHT) + { + _tableView.scrollEnabled = YES; + } + self.tableView.frame = CGRectMake(min_x, min_y, min_w, min_h);; + + if (self.title.length > 0) + { + self.tableView.tableHeaderView = self.headerView; + } + self.tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0); + [self.tableView reloadData]; +} + +- (void)ba_actionSheetShow +{ + [self.actionSheetWindow addSubview:self]; + + [self ba_layoutSubViews]; + + /*! 设置默认样式为: */ + if (self.isShowAnimate && !self.animatingStyle) + { + _animatingStyle = BAAlertAnimatingStyleScale; + } + /*! 如果没有开启动画,就直接默认第一个动画样式 */ + else if (!self.isShowAnimate && self.animatingStyle) + { + self.showAnimate = YES; + } + else + { + if (!self.animatingStyle) + { + NSLog(@"您没有开启动画,也没有设置动画样式,默认为没有动画!"); + } + } + + if (self.isShowAnimate) + { + [self showAnimationWithView:self.tableView]; + } +} + +- (void)ba_actionSheetHidden +{ + if (self.isShowAnimate) + { + [self dismissAnimationView:self.tableView]; + } + else + { + [self ba_removeSelf]; + } +} + +#pragma mark - 进场动画 +- (void )showAnimationWithView:(UIView *)animationView +{ + self.isAnimating = YES; + BAKit_WeakSelf + if (self.animatingStyle == BAAlertAnimatingStyleScale) + { + [animationView scaleAnimationShowFinishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleShake) + { + [animationView.layer shakeAnimationWithDuration:1.0 shakeRadius:16.0 repeat:1 finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleFall) + { + [animationView.layer fallAnimationWithDuration:0.35 finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } +} + +#pragma mark - 出场动画 +- (void )dismissAnimationView:(UIView *)animationView +{ + self.isAnimating = YES; + BAKit_WeakSelf; + if (self.animatingStyle == BAAlertAnimatingStyleScale) + { + [animationView scaleAnimationDismissFinishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self performSelector:@selector(ba_removeSelf)]; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleShake) + { + [animationView.layer floatAnimationWithDuration:0.35f finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self performSelector:@selector(ba_removeSelf)]; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleFall) + { + [animationView.layer floatAnimationWithDuration:0.35f finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self performSelector:@selector(ba_removeSelf)]; + }]; + } +} + +- (void)ba_removeSelf +{ + [self.tableView removeFromSuperview]; + self.tableView = nil; + [self removeFromSuperview]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)handleButtonAction:(UIButton *)sender +{ + BAActionSheetModel *model = self.dataArray[sender.tag]; + for (NSInteger i = 0; i < model.subContentArray.count; i++) + { + self.indexPath = [NSIndexPath indexPathForRow:i inSection:sender.tag]; + } + + if (model.subContentArray.count > 0) + { + self.isExpand = !self.isExpand; + } + else + { + self.isExpand = NO; + if (self.actionBlock) + { + [self ba_actionSheetHidden]; + BAActionSheetModel *model = self.dataArray[sender.tag]; + + self.actionBlock(self.indexPath, model); + } + } + + [self ba_layoutSubViews]; + + [self.tableView reloadData]; +} + +#pragma mark - setter / getter +- (UITableView *)tableView +{ + if ( !_tableView ) + { + _tableView = [[UITableView alloc] init]; + _tableView.delegate = self; + _tableView.dataSource = self; + _tableView.scrollEnabled = NO; + _tableView.backgroundColor = BAAlert_Color_gray11; + + [self addSubview:_tableView]; + } + return _tableView; +} + +- (UIView *)headerView +{ + if (!_headerView) + { + _headerView = [UIView new]; + + _titleLabel = [UILabel new]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.text = self.title; + + [self.headerView addSubview:_titleLabel]; + } + return _headerView; +} + +- (UIWindow *)actionSheetWindow +{ + if (!_actionSheetWindow) + { + _actionSheetWindow = [UIApplication sharedApplication].keyWindow; + + if (self.actionSheetWindow.windowLevel != UIWindowLevelNormal) + { + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"windowLevel == %ld AND hidden == 0 " , UIWindowLevelNormal]; + self.actionSheetWindow = [[UIApplication sharedApplication].windows filteredArrayUsingPredicate:predicate].firstObject; + } + self.actionSheetWindow.backgroundColor = BAAlert_Color_Translucent; + } + + return _actionSheetWindow; +} + +- (void)setIsTouchEdgeHide:(BOOL)isTouchEdgeHide +{ + _isTouchEdgeHide = isTouchEdgeHide; +} + +- (void)setShowAnimate:(BOOL)showAnimate +{ + _showAnimate = showAnimate; +} + +- (void)setAnimatingStyle:(BAAlertAnimatingStyle)animatingStyle +{ + _animatingStyle = animatingStyle; +} + +- (void)setActionSheetType:(BAActionSheetType)actionSheetType +{ + _actionSheetType = actionSheetType; +} + +- (void)setIsAnimating:(BOOL)isAnimating +{ + _isAnimating = isAnimating; +} + +@end + +@implementation BAActionSheetModel + +@end + +@implementation BAActionSheetSubContentModel + +@end diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.h b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.h new file mode 100644 index 0000000..e48ac9c --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.h @@ -0,0 +1,21 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import +#import "BAAlert_Config.h" + +@interface BAActionSheetCell : UITableViewCell + +/*! BAActionSheet 类型,默认:1 */ +@property (nonatomic, assign) BAActionSheetType actionSheetType; + + +@end + diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.m b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.m new file mode 100644 index 0000000..9e0d754 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAActionSheetCell.m @@ -0,0 +1,62 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + +#import "BAActionSheetCell.h" + +@implementation BAActionSheetCell + +- (void)layoutSubviews { + [super layoutSubviews]; + + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + + if (self.actionSheetType == BAActionSheetTypeNormal) + { + min_x = 15; + min_w = 30; + min_y = 7; + min_h = min_w; + self.imageView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_w = CGRectGetWidth(self.frame) - CGRectGetMaxX(self.imageView.frame) - 15 * 2; + if (self.imageView.image.size.width > 0) + { + min_x = CGRectGetMaxX(self.imageView.frame) + 10; + } + min_y = 0; + min_h = CGRectGetHeight(self.frame); + if (self.detailTextLabel.text.length > 0) + { + min_y = 5; + min_h = CGRectGetHeight(self.frame)/2 - 5; + } + self.textLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + min_y = CGRectGetMaxY(self.textLabel.frame); + self.detailTextLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + } + else if (self.actionSheetType == BAActionSheetTypeCustom) + { + min_x = 15; + min_w = CGRectGetWidth(self.frame) - 15 * 2; + min_y = 0; + min_h = CGRectGetHeight(self.frame); + self.textLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + } +} + +- (void)setActionSheetType:(BAActionSheetType)actionSheetType +{ + _actionSheetType = actionSheetType; +} + +@end + diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@2x.png b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@2x.png new file mode 100644 index 0000000..8321f28 Binary files /dev/null and b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@2x.png differ diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@3x.png b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@3x.png new file mode 100644 index 0000000..8074c65 Binary files /dev/null and b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_down@3x.png differ diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@2x.png b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@2x.png new file mode 100644 index 0000000..61016cf Binary files /dev/null and b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@2x.png differ diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@3x.png b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@3x.png new file mode 100644 index 0000000..aad0bc8 Binary files /dev/null and b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.bundle/Images/arow_right@3x.png differ diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.h b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.h new file mode 100755 index 0000000..4fc83c0 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.h @@ -0,0 +1,72 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import +#import "BAAlert_Config.h" + +@class BAAlert; + +typedef void(^BAAlert_ConfigBlock)(BAAlert *tempView); + +@interface BAAlert : UIView + +/*! 背景颜色 默认:半透明*/ +@property (nonatomic, strong) UIColor *bgColor; + +/*! 是否开启边缘触摸隐藏 alert 默认:NO */ +@property (nonatomic, assign) BOOL isTouchEdgeHide; + +/*! 背景图片名字 默认:没有图片*/ +@property (nonatomic, strong) NSString *bgImageName; + +/*! 是否开启进出场动画 默认:NO,如果 YES ,并且同步设置进出场动画枚举为默认值:1 */ +@property (nonatomic, assign, getter=isShowAnimate) BOOL showAnimate; + +/*! 进出场动画枚举 默认:1 ,并且默认开启动画开关 */ +@property (nonatomic, assign) BAAlertAnimatingStyle animatingStyle; + +/*! 背景高斯模糊枚举 默认:没有模糊效果 */ +@property (nonatomic, assign) BAAlertBlurEffectStyle blurEffectStyle; + +/*! + * 创建一个完全自定义的 alertView,注意:【自定义 alert 只适用于竖屏状态!】 + * + * @param customView 自定义 View + * @param configuration 属性配置:如 bgColor、buttonTitleColor、isTouchEdgeHide... + */ ++ (void)ba_alertShowCustomView:(UIView *)customView + configuration:(BAAlert_ConfigBlock) configuration; + +/*! + * 创建一个类似于系统的alert + * + * @param title 标题:可空 + * @param message 消息内容:可空 + * @param image 图片:可空 + * @param buttonTitleArray 按钮标题:不可空 + * @param buttonTitleColorArray 按钮标题颜色:可空,默认蓝色 + * @param configuration 属性配置:如 bgColor、buttonTitleColor、isTouchEdgeHide... + * @param actionBlock 按钮的点击事件处理 + */ ++ (void)ba_alertShowWithTitle:(NSString *)title + message:(NSString *)message + image:(UIImage *)image + buttonTitleArray:(NSArray *)buttonTitleArray + buttonTitleColorArray:(NSArray *)buttonTitleColorArray + configuration:(BAAlert_ConfigBlock)configuration + actionBlock:(BAAlert_ButtonActionBlock)actionBlock; + +/*! + * 视图消失 + */ +- (void)ba_alertHidden; + + +@end diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert.m b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.m new file mode 100755 index 0000000..45f01f7 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAAlert.m @@ -0,0 +1,1118 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import "BAAlert.h" +#import +#import +//#import "UIView+BAAnimation.h" +#import "CALayer+Animation.h" +#import "BAAlert_OC.h" + +@interface UIImage (BAAlertImageEffects) + +- (UIImage*)BAAlert_ApplyLightEffect; + +- (UIImage*)BAAlert_ApplyExtraLightEffect; + +- (UIImage*)BAAlert_ApplyDarkEffect; + +- (UIImage*)BAAlert_ApplyTintEffectWithColor:(UIColor*)tintColor; + +- (UIImage*)BAAlert_ApplyBlurWithRadius:(CGFloat)blurRadius + tintColor:(UIColor*)tintColor + saturationDeltaFactor:(CGFloat)saturationDeltaFactor + maskImage:(UIImage*)maskImage; +@end + +@implementation UIImage (BAAlertImageEffects) + +- (UIImage *)BAAlert_ApplyLightEffect +{ + UIColor *tintColor = [UIColor colorWithWhite:0.3 alpha:0.4]; + return [self BAAlert_ApplyBlurWithRadius:1.3 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil]; +} + +- (UIImage *)BAAlert_ApplyExtraLightEffect +{ + UIColor *tintColor = [UIColor colorWithWhite:0.97 alpha:0.82]; + return [self BAAlert_ApplyBlurWithRadius:2 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil]; +} + +- (UIImage *)BAAlert_ApplyDarkEffect +{ + UIColor *tintColor = [UIColor colorWithWhite:0.11 alpha:0.73]; + return [self BAAlert_ApplyBlurWithRadius:20 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil]; +} + +- (UIImage *)BAAlert_ApplyTintEffectWithColor:(UIColor *)tintColor +{ + const CGFloat EffectColorAlpha = 0.45; + UIColor *effectColor = tintColor; + size_t componentCount = CGColorGetNumberOfComponents(tintColor.CGColor); + if (componentCount == 2) { + CGFloat b; + if ([tintColor getWhite:&b alpha:NULL]) { + effectColor = [UIColor colorWithWhite:b alpha:EffectColorAlpha]; + } + } + else { + CGFloat r, g, b; + if ([tintColor getRed:&r green:&g blue:&b alpha:NULL]) { + effectColor = [UIColor colorWithRed:r green:g blue:b alpha:EffectColorAlpha]; + } + } + return [self BAAlert_ApplyBlurWithRadius:10 tintColor:effectColor saturationDeltaFactor:-1.0 maskImage:nil]; +} + +- (UIImage *)BAAlert_ApplyBlurWithRadius:(CGFloat)blurRadius + tintColor:(UIColor *)tintColor + saturationDeltaFactor:(CGFloat)saturationDeltaFactor + maskImage:(UIImage *)maskImage +{ + // Check pre-conditions. + if (self.size.width < 1 || self.size.height < 1) + { + NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@", self.size.width, self.size.height, self); + return nil; + } + if (!self.CGImage) + { + NSLog (@"*** error: image must be backed by a CGImage: %@", self); + return nil; + } + if (maskImage && !maskImage.CGImage) + { + NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage); + return nil; + } + + CGRect imageRect = { CGPointZero, self.size }; + UIImage *effectImage = self; + + BOOL hasBlur = blurRadius > __FLT_EPSILON__; + BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__; + if (hasBlur || hasSaturationChange) { + UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); + CGContextRef effectInContext = UIGraphicsGetCurrentContext(); + CGContextScaleCTM(effectInContext, 1.0, -1.0); + CGContextTranslateCTM(effectInContext, 0, -self.size.height); + CGContextDrawImage(effectInContext, imageRect, self.CGImage); + + vImage_Buffer effectInBuffer; + effectInBuffer.data = CGBitmapContextGetData(effectInContext); + effectInBuffer.width = CGBitmapContextGetWidth(effectInContext); + effectInBuffer.height = CGBitmapContextGetHeight(effectInContext); + effectInBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectInContext); + + UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); + CGContextRef effectOutContext = UIGraphicsGetCurrentContext(); + vImage_Buffer effectOutBuffer; + effectOutBuffer.data = CGBitmapContextGetData(effectOutContext); + effectOutBuffer.width = CGBitmapContextGetWidth(effectOutContext); + effectOutBuffer.height = CGBitmapContextGetHeight(effectOutContext); + effectOutBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectOutContext); + + if (hasBlur) { + // A description of how to compute the box kernel width from the Gaussian + // radius (aka standard deviation) appears in the SVG spec: + // http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement + // + // For larger values of 's' (s >= 2.0), an approximation can be used: Three + // successive box-blurs build a piece-wise quadratic convolution kernel, which + // approximates the Gaussian kernel to within roughly 3%. + // + // let d = floor(s * 3*sqrt(2*pi)/4 + 0.5) + // + // ... if d is odd, use three box-blurs of size 'd', centered on the output pixel. + // + CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale]; + NSUInteger radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5); + if (radius % 2 != 1) { + radius += 1; // force radius to be odd so that the three box-blur methodology works. + } + vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, (int)radius, (int)radius, 0, kvImageEdgeExtend); + vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, 0, 0, (int)radius, (int)radius, 0, kvImageEdgeExtend); + vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, (int)radius, (int)radius, 0, kvImageEdgeExtend); + } + BOOL effectImageBuffersAreSwapped = NO; + if (hasSaturationChange) { + CGFloat s = saturationDeltaFactor; + CGFloat floatingPointSaturationMatrix[] = { + 0.0722 + 0.9278 * s, 0.0722 - 0.0722 * s, 0.0722 - 0.0722 * s, 0, + 0.7152 - 0.7152 * s, 0.7152 + 0.2848 * s, 0.7152 - 0.7152 * s, 0, + 0.2126 - 0.2126 * s, 0.2126 - 0.2126 * s, 0.2126 + 0.7873 * s, 0, + 0, 0, 0, 1, + }; + const int32_t divisor = 256; + NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]); + int16_t saturationMatrix[matrixSize]; + for (NSUInteger i = 0; i < matrixSize; ++i) { + saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor); + } + if (hasBlur) { + vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags); + effectImageBuffersAreSwapped = YES; + } + else { + vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags); + } + } + if (!effectImageBuffersAreSwapped) + effectImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + if (effectImageBuffersAreSwapped) + effectImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + } + + // 开启上下文 用于输出图像 + UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); + CGContextRef outputContext = UIGraphicsGetCurrentContext(); + CGContextScaleCTM(outputContext, 1.0, -1.0); + CGContextTranslateCTM(outputContext, 0, -self.size.height); + + // 开始画底图 + CGContextDrawImage(outputContext, imageRect, self.CGImage); + + // 开始画模糊效果 + if (hasBlur) { + CGContextSaveGState(outputContext); + if (maskImage) { + CGContextClipToMask(outputContext, imageRect, maskImage.CGImage); + } + CGContextDrawImage(outputContext, imageRect, effectImage.CGImage); + CGContextRestoreGState(outputContext); + } + + // 添加颜色渲染 + if (tintColor) { + CGContextSaveGState(outputContext); + CGContextSetFillColorWithColor(outputContext, tintColor.CGColor); + CGContextFillRect(outputContext, imageRect); + CGContextRestoreGState(outputContext); + } + + // 输出成品,并关闭上下文 + UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return outputImage; +} + +@end + + +#define BAKit_BaseScreenWidth 320.0f +#define BAKit_BaseScreenHeight 568.0f + + +/*! 屏幕适配(5S标准屏幕:320 * 568) */ +// iPhone 7 屏幕:375 * 667 +//376/320 = +//667/568 = +#define BAKit_ScaleXAndWidth SCREENWIDTH/BAKit_BaseScreenWidth +#define BAKit_ScaleYAndHeight SCREENHEIGHT/BAKit_BaseScreenHeight + +#define kBAAlert_Padding 10 +#define kBAAlert_Radius 10 +#define kBAAlert_ButtonHeight 40 + +#pragma mark - 根据文字内容、宽度和字体返回 size +CG_INLINE CGSize +ba_LabelSizeWithTextAndWidthAndFont(NSString *text, CGFloat width, UIFont *font){ + CGSize size = CGSizeMake(width, MAXFLOAT); + NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; + [style setLineBreakMode:NSLineBreakByWordWrapping]; + + CGRect frame = [text boundingRectWithSize:size + options: + NSStringDrawingTruncatesLastVisibleLine | + NSStringDrawingUsesLineFragmentOrigin | + NSStringDrawingUsesFontLeading + attributes:@{NSFontAttributeName : font, NSParagraphStyleAttributeName : style} context:nil]; + CGRect newFrame = CGRectMake(frame.origin.x, frame.origin.y, width, frame.size.height); + return newFrame.size; +} + +typedef NS_ENUM(NSUInteger, BAAlertType) { + BAAlertTypeNormal = 0, + BAAlertTypeCustom +}; + +@interface BAAlert () +{ + CGFloat _scroll_bottom; + CGFloat _button_totalHeight; + CGFloat _maxContent_Width; + CGFloat _maxContent_Height; + +} +/*! 自定义 View */ +@property (nonatomic, strong) UIView *customView; + + +@property (nonatomic, strong) NSString *title; +@property (nonatomic, strong) NSString *message; +@property (nonatomic, strong) UIImage *image; +@property (nonatomic, strong) NSArray *buttonTitleArray; +@property (nonatomic, strong) NSArray *buttonTitleColorArray; +@property (nonatomic, strong) NSMutableArray *buttonArray; +@property (nonatomic, strong) NSMutableArray *lineArray; + + +@property (nonatomic, strong) UIImageView *containerView; +@property (nonatomic, strong) UIScrollView *scrollView; +@property (nonatomic, strong) UILabel *titleLabel; +@property (nonatomic, strong) UIImageView *imageView; +@property (nonatomic, strong) UILabel *messageLabel; + +@property (nonatomic, assign) BAAlertType alertType; +@property (nonatomic, strong) UIWindow *alertWindow; + +@property (nonatomic, assign) CGFloat view_width; +@property (nonatomic, assign) CGFloat view_height; + +@property (nonatomic, assign) CGRect customView_frame; +@property (nonatomic, strong) UIImageView *blurImageView; + +@property (nonatomic, assign) BAAlertBlurEffectStyle current_blurEffectStyle; +@property (nonatomic, copy) BAAlert_ButtonActionBlock actionBlock; +@property(nonatomic, assign) BOOL isAnimating; + +@end + +@implementation BAAlert + +#pragma mark - 快速创建方法 ++ (void)ba_alertShowCustomView:(UIView *)customView + configuration:(BAAlert_ConfigBlock) configuration +{ + BAAlert *tempView = [[BAAlert alloc] initWithCustomView:customView]; + if (configuration) + { + configuration(tempView); + } + [tempView ba_alertShow]; +} + +/*! + * 创建一个类似于系统的alert + * + * @param title 标题:可空 + * @param message 消息内容:可空 + * @param image 图片:可空 + * @param buttonTitleArray 按钮标题:不可空 + * @param buttonTitleColorArray 按钮标题颜色:可空,默认蓝色 + * @param configuration 属性配置:如 bgColor、buttonTitleColor、isTouchEdgeHide... + * @param actionBlock 按钮的点击事件处理 + */ ++ (void)ba_alertShowWithTitle:(NSString *)title + message:(NSString *)message + image:(UIImage *)image + buttonTitleArray:(NSArray *)buttonTitleArray + buttonTitleColorArray:(NSArray *)buttonTitleColorArray + configuration:(BAAlert_ConfigBlock)configuration + actionBlock:(BAAlert_ButtonActionBlock)actionBlock +{ + BAAlert *tempView = [[BAAlert alloc] ba_showTitle:title + message:message + image:image + buttonTitles:buttonTitleArray + buttonTitlesColor:buttonTitleColorArray]; + if (configuration) + { + configuration(tempView); + } + tempView.actionBlock = actionBlock; + [tempView ba_alertShow]; +} + +#pragma mark - ***** 初始化自定义View +- (instancetype)initWithCustomView:(UIView *)customView +{ + if (self = [super initWithFrame:CGRectZero]) + { + self.customView = customView; + self.alertType = BAAlertTypeCustom; + self.customView_frame = customView.frame; + + [self addSubview:customView]; + [self bringSubviewToFront:customView]; + [self setupCommonUI]; + } + return self; +} + +#pragma mark - ***** 创建一个类似系统的警告框 +- (instancetype)ba_showTitle:(NSString *)title + message:(NSString *)message + image:(UIImage *)image + buttonTitles:(NSArray *)buttonTitles + buttonTitlesColor:(NSArray *)buttonTitlesColor +{ + if (self == [super initWithFrame:CGRectZero]) + { + _title = [title copy]; + _image = image; + _message = [message copy]; + _buttonTitleArray = [NSArray arrayWithArray:buttonTitles]; + _buttonTitleColorArray = [NSArray arrayWithArray:buttonTitlesColor]; + self.alertType = BAAlertTypeNormal; + + [self setupCommonUI]; + } + return self; +} + +- (void)setupCommonUI +{ + self.bgColor = BAAlert_Color_Translucent; + self.blurImageView.hidden = NO; + + if (self.alertType == BAAlertTypeCustom) + { + [self interfaceOrientation:UIInterfaceOrientationPortrait]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardShowAction:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleKeyboardHiddenAction:) name:UIKeyboardWillHideNotification object:nil]; + } + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationRotateAction:) name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +#pragma mark - 系统默认 alert +#pragma mark 初始化按钮 +- (void)loadButtons +{ + if (!_buttonTitleArray || _buttonTitleArray.count == 0) + { + return; + } + if (!_buttonTitleColorArray || _buttonTitleColorArray.count == 0 || _buttonTitleColorArray.count < _buttonTitleArray.count) + { + NSMutableArray *mutArr = [NSMutableArray array]; + for (NSInteger i = 0; i < _buttonTitleArray.count; i ++) + { + [mutArr addObject:[UIColor blueColor]]; + } + _buttonTitleColorArray = [mutArr mutableCopy]; + } + + CGFloat buttonHeight = kBAAlert_ButtonHeight; + CGFloat buttonWidth = CGRectGetWidth(self.containerView.frame); + CGFloat top = CGRectGetHeight(_containerView.frame) - _button_totalHeight; + [self addLine:CGRectMake(0, top - 0.5, buttonWidth, 0.5) toView:_containerView]; + + if (_buttonTitleColorArray.count) + { + if (1 == _buttonTitleArray.count) + { + [self addButton:CGRectMake(0, top, buttonWidth, buttonHeight) title:_buttonTitleArray[0] tag:(0) titleColor:_buttonTitleColorArray[0]]; + } + else if (2 == _buttonTitleArray.count) + { + for (NSInteger i = 0; i < _buttonTitleArray.count; i ++) + { + CGRect button_frame = CGRectMake(buttonWidth/2 * i, top, buttonWidth/2, buttonHeight); + + [self addButton:button_frame title:_buttonTitleArray[i] tag:i titleColor:_buttonTitleColorArray[i]]; + } + + [self addLine:CGRectMake(buttonWidth/2-.5, top, 0.5, buttonHeight) toView:_containerView]; + } + else + { + for (NSInteger i=0; i<_buttonTitleArray.count; i++) + { + [self addButton:CGRectMake(0, top, buttonWidth, buttonHeight) title:_buttonTitleArray[i] tag:i titleColor:_buttonTitleColorArray[i]]; + top += buttonHeight; + if (_buttonTitleArray.count-1!=i) + { + [self addLine:CGRectMake(0, top, buttonWidth, 0.5) toView:_containerView]; + } + } + [_lineArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { + [_containerView bringSubviewToFront:obj]; + }]; + } + } +} + +#pragma mark 添加按钮方法 +- (void)addButton:(CGRect)frame + title:(NSString *)title + tag:(NSInteger)tag + titleColor:(UIColor *)titleColor +{ + UIButton *button = [[UIButton alloc] initWithFrame:frame]; + button.titleLabel.font = [UIFont boldSystemFontOfSize:17]; + button.tag = tag; + + [button setTitle:title forState:UIControlStateNormal]; + [button setTitleColor:titleColor forState:UIControlStateNormal]; + + if (self.bgImageName) + { + [button setBackgroundImage:[self imageWithColor:[UIColor clearColor]] forState:UIControlStateNormal]; + } + else + { + [button setBackgroundImage:[self imageWithColor:[UIColor whiteColor]] forState:UIControlStateNormal]; + } + [button setBackgroundImage:[self imageWithColor:BAAlert_Color_RGBA(135, 140, 145, 0.45)] forState:UIControlStateHighlighted]; + + [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; + [self.containerView addSubview:button]; + [self.buttonArray addObject:button]; +} + +#pragma mark 添加底部横线方法 +- (void)addLine:(CGRect)frame toView:(UIView *)view +{ + UIView *line = [[UIView alloc] initWithFrame:frame]; + line.backgroundColor = BAAlert_Color_RGBA(160, 170, 160, 0.5); + [view addSubview:line]; + [_lineArray addObject:line]; +} + +#pragma mark 按钮事件 +- (void)buttonClicked:(UIButton *)button +{ + [self endEditing:YES]; + + if (self.actionBlock) + { + self.actionBlock(button.tag); + } +} + +#pragma mark 纯颜色转图片 +- (UIImage *)imageWithColor:(UIColor *)color +{ + UIImage *image = [self imageWithColor:color andSize:CGSizeMake(1.0f, 1.0f)]; + return image; +} + +- (UIImage *)imageWithColor:(UIColor *)color andSize:(CGSize )size +{ + CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height); + UIGraphicsBeginImageContext(rect.size); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, [color CGColor]); + + CGContextFillRect(context, rect); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} + +#pragma mark - 通知处理 +- (void)handleDeviceOrientationRotateAction:(NSNotification *)notification +{ + [self ba_layoutSubViews]; +} + +- (void)handleKeyboardShowAction:(NSNotification *)notification +{ + NSDictionary *infoDic = notification.userInfo; + CGFloat duration = [infoDic[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + CGRect keyBoardRect = [infoDic[UIKeyboardFrameEndUserInfoKey] CGRectValue]; + + CGRect viewFrame = self.customView.frame; + CGFloat height_different = CGRectGetMaxY(viewFrame) - keyBoardRect.origin.y; + + if (height_different > 0) + { + viewFrame.origin.y -= height_different; + viewFrame.origin.y -= 10; + BAKit_WeakSelf + [UIView animateWithDuration:duration animations:^{ + BAKit_StrongSelf + self.customView.frame = viewFrame; + }]; + } +} + +- (void)handleKeyboardHiddenAction:(NSNotification *)notification +{ + NSDictionary *info = [notification userInfo]; + double duration = [info[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + + BAKit_WeakSelf + [UIView animateWithDuration:duration animations:^{ + BAKit_StrongSelf + self.customView.frame = self.customView_frame; + }]; +} + +#pragma mark - custom method + +/*! + * 视图显示 + */ +- (void)ba_alertShow +{ + [self.alertWindow addSubview:self]; + [self.alertWindow bringSubviewToFront:self]; + + [self ba_layoutSubViews]; + + /*! 设置默认样式为: */ + if (self.isShowAnimate && !self.animatingStyle) + { + _animatingStyle = BAAlertAnimatingStyleScale; + } + /*! 如果没有开启动画,就直接默认第一个动画样式 */ + else if (!self.isShowAnimate && self.animatingStyle) + { + self.showAnimate = YES; + } + else + { + if (!self.animatingStyle) + { + NSLog(@"您没有开启动画,也没有设置动画样式,默认为没有动画!"); + } + } + + if (self.isShowAnimate) + { + [self showAnimationWithView:(self.alertType == BAAlertTypeNormal) ? self.containerView:self.customView]; + } +} + +/*! + * 视图消失 + */ +- (void)ba_alertHidden +{ + if (self.isShowAnimate) + { + [self dismissAnimationView:(self.alertType == BAAlertTypeNormal) ? self.containerView:self.customView]; + } + else + { + [self ba_removeSelf]; + } +} + +- (void)ba_resetButtons +{ + if (self.buttonArray.count > 0) + { + [self.buttonArray makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + [self.buttonArray removeAllObjects]; + } + if (self.lineArray.count > 0) + { + [self.lineArray makeObjectsPerformSelector:@selector(removeFromSuperview)]; + [self.lineArray removeAllObjects]; + } +} + +#pragma mark - 进场动画 +- (void )showAnimationWithView:(UIView *)animationView +{ + self.isAnimating = YES; + BAKit_WeakSelf + if (self.animatingStyle == BAAlertAnimatingStyleScale) + { + [animationView scaleAnimationShowFinishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleShake) + { + [animationView.layer shakeAnimationWithDuration:1.0 shakeRadius:16.0 repeat:1 finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleFall) + { + [animationView.layer fallAnimationWithDuration:0.35 finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } +} + +#pragma mark - 出场动画 +- (void )dismissAnimationView:(UIView *)animationView +{ + self.isAnimating = YES; + BAKit_WeakSelf + if (self.animatingStyle == BAAlertAnimatingStyleScale) + { + [animationView scaleAnimationDismissFinishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleShake) + { + [animationView.layer floatAnimationWithDuration:0.35f finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + else if (self.animatingStyle == BAAlertAnimatingStyleFall) + { + [animationView.layer floatAnimationWithDuration:0.35f finishAnimation:^{ + BAKit_StrongSelf + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } +} + +#pragma mark - 清除所有视图 +- (void)ba_removeSelf +{ + // NSLog(@"【 %@ 】已经释放!",[self class]); + if (_titleLabel) + { + [_titleLabel removeFromSuperview]; + _titleLabel = nil; + } + if (_imageView) + { + [_imageView removeFromSuperview]; + _imageView = nil; + } + if (_messageLabel) + { + [_messageLabel removeFromSuperview]; + _messageLabel = nil; + } + + [self ba_resetButtons]; + + if (_customView) + { + [_customView removeFromSuperview]; + _customView = nil; + } + if (_containerView) + { + [_containerView removeFromSuperview]; + _containerView = nil; + } + if (_blurImageView) + { + [_blurImageView removeFromSuperview]; + _blurImageView = nil; + } + if (_scrollView) + { + [_scrollView removeFromSuperview]; + _scrollView = nil; + } + _alertWindow = nil; + [self removeFromSuperview]; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)dealloc +{ + [self ba_removeSelf]; +} + +- (void)interfaceOrientation:(UIInterfaceOrientation)orientation +{ + // arc下 + if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) + { + SEL selector = NSSelectorFromString(@"setOrientation:"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:[UIDevice currentDevice]]; + int val = orientation; + // 从2开始是因为0 1 两个参数已经被selector和target占用 + [invocation setArgument:&val atIndex:2]; + [invocation invoke]; + } +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + NSLog(@"触摸了边缘隐藏View!"); + UITouch *touch = [touches anyObject]; + UIView *view = [touch view]; + + if (self.isAnimating) + { + NSLog(@"请在动画结束时点击!"); + return; + } + if (!self.isTouchEdgeHide) + { + NSLog(@"触摸了View边缘,但您未开启触摸边缘隐藏方法,请设置 isTouchEdgeHide 属性为 YES 后再使用!"); + } + + if ([view isKindOfClass:[self class]]) + { + [self ba_alertHidden]; + } +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + +} + +- (void)ba_layoutSubViews +{ + self.frame = self.window.bounds; + self.alertWindow.frame = self.window.bounds; + + if (self.blurEffectStyle) + { + self.blurImageView.image = nil; + self.blurImageView.frame = [UIScreen mainScreen].bounds; + self.current_blurEffectStyle = self.blurEffectStyle; + } + + self.view_width = [UIScreen mainScreen].bounds.size.width; + self.view_height = [UIScreen mainScreen].bounds.size.height; + + if (self.alertType == BAAlertTypeNormal) + { + [self layoutNormalAlert]; + } + else if (self.alertType == BAAlertTypeCustom) + { + NSLog(@"【 BAAlert 】注意:【自定义 alert 只适用于竖屏状态!】"); + self.customView.frame = self.customView_frame; + } +} + +- (void)layoutNormalAlert +{ + [self ba_resetButtons]; + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + _scroll_bottom = 0; + + _maxContent_Width = self.view_width - 50 * BAKit_ScaleXAndWidth * 2; + _maxContent_Height = self.view_height - 20 * BAKit_ScaleYAndHeight * 2; + _button_totalHeight = kBAAlert_ButtonHeight*((_buttonTitleArray.count>2||_buttonTitleArray.count==0)?_buttonTitleArray.count:1); + + // 标题 + min_x = kBAAlert_Padding; + min_y = 0; + CGSize titleLabel_size = ba_LabelSizeWithTextAndWidthAndFont(self.titleLabel.text, _maxContent_Width - kBAAlert_Padding * 2, self.titleLabel.font); + min_w = titleLabel_size.width; + min_h = titleLabel_size.height; + self.titleLabel.backgroundColor = [UIColor clearColor]; + self.titleLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_y = CGRectGetMaxY(self.titleLabel.frame) + kBAAlert_Padding; + min_h = 0.5f; + [self addLine:CGRectMake(min_x, min_y, min_w, min_h) toView:self.scrollView]; + + // 图片 + min_y = CGRectGetMaxY(self.titleLabel.frame) + kBAAlert_Padding * 2; + CGSize imageView_size = self.image.size; + if (imageView_size.width > _maxContent_Width) + { + imageView_size = CGSizeMake(_maxContent_Width, imageView_size.height / imageView_size.width * _maxContent_Width); + } + min_w = imageView_size.width - kBAAlert_Padding * 2; + min_h = imageView_size.height; + + self.imageView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + // message + if (min_h <= 0) + { + min_y = CGRectGetMaxY(self.titleLabel.frame) + kBAAlert_Padding * 2; + } + else + { + min_y = CGRectGetMaxY(self.imageView.frame) + kBAAlert_Padding; + } + CGSize messageLabel_size = ba_LabelSizeWithTextAndWidthAndFont(self.messageLabel.text, _maxContent_Width - kBAAlert_Padding * 2, self.messageLabel.font); + min_w = messageLabel_size.width; + min_h = messageLabel_size.height; + self.messageLabel.frame = CGRectMake(min_x, min_y, min_w, min_h); + _scroll_bottom = CGRectGetMaxY(self.messageLabel.frame) + kBAAlert_Padding; + + min_x = 0; + min_y = 0; + min_w = _maxContent_Width; + min_h = MIN(MAX(_scroll_bottom + 2 * kBAAlert_Padding + _button_totalHeight, 3 * kBAAlert_Padding), _maxContent_Height); + + self.containerView.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.containerView.center = self.center; + + min_y = kBAAlert_Padding; + min_h = MIN(_scroll_bottom, CGRectGetHeight(self.containerView.frame) - 2 * kBAAlert_Padding - _button_totalHeight); + self.scrollView.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.scrollView.contentSize = CGSizeMake(_maxContent_Width, _scroll_bottom); + + [self loadButtons]; +} + +#pragma mark - setter / getter +- (NSMutableArray *)buttonArray +{ + if (!_buttonArray) + { + _buttonArray = @[].mutableCopy; + } + return _buttonArray; +} + +- (NSMutableArray *)lineArray +{ + if (!_lineArray) + { + _lineArray = @[].mutableCopy; + } + return _lineArray; +} + +- (UIImageView *)containerView +{ + if (!_containerView) + { + _containerView = [UIImageView new]; + self.containerView.userInteractionEnabled = YES; + self.containerView.layer.masksToBounds = YES; + self.containerView.layer.cornerRadius = kBAAlert_Radius; + self.containerView.backgroundColor = [UIColor whiteColor]; + + [self addSubview:self.containerView]; + } + return _containerView; +} + +- (UIScrollView *)scrollView +{ + if (!_scrollView) + { + _scrollView = [[UIScrollView alloc] init]; + self.scrollView.backgroundColor = [UIColor whiteColor]; + self.scrollView.scrollEnabled = YES; + [self.containerView addSubview:self.scrollView]; + } + return _scrollView; +} + +- (UIWindow *)alertWindow +{ + if (!_alertWindow) + { + _alertWindow = [UIApplication sharedApplication].keyWindow; + + if (self.alertWindow.windowLevel != UIWindowLevelNormal) + { + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"windowLevel == %ld AND hidden == 0 " , UIWindowLevelNormal]; + self.alertWindow = [[UIApplication sharedApplication].windows filteredArrayUsingPredicate:predicate].firstObject; + } + self.alertWindow.backgroundColor = BAAlert_Color_Translucent; + } + return _alertWindow; +} + +- (UILabel *)titleLabel +{ + if (!_titleLabel) + { + _titleLabel = [UILabel new]; + _titleLabel.textColor = [UIColor blackColor]; + _titleLabel.font = [UIFont fontWithName:@"FontNameAmericanTypewriterBold" size:20]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.numberOfLines = 0; + _titleLabel.text = self.title; + + [self.scrollView addSubview:_titleLabel]; + } + return _titleLabel; +} + +- (UIImageView *)imageView +{ + if (!_imageView) + { + _imageView = [UIImageView new]; + self.imageView.image = self.image; + + [self.scrollView addSubview:self.imageView]; + } + return _imageView; +} + +- (UILabel *)messageLabel +{ + if (!_messageLabel) + { + _messageLabel = [UILabel new]; + self.messageLabel.textColor = [UIColor blackColor]; + self.messageLabel.font = [UIFont systemFontOfSize:14]; + self.messageLabel.textAlignment = NSTextAlignmentCenter; + self.messageLabel.numberOfLines = 0; + self.messageLabel.backgroundColor = [UIColor clearColor]; + self.messageLabel.text = self.message; + [self.scrollView addSubview:self.messageLabel]; + } + return _messageLabel; +} + +- (UIImageView *)blurImageView +{ + if ( !_blurImageView ) + { + _blurImageView = [[UIImageView alloc] init]; + _blurImageView.contentMode = UIViewContentModeScaleAspectFit; + _blurImageView.clipsToBounds = true; + _blurImageView.backgroundColor = [UIColor clearColor]; + + [self.alertWindow addSubview:_blurImageView]; + //[self sendSubviewToBack:_blurImageView]; + } + return _blurImageView; +} + +- (void)setAlertType:(BAAlertType)alertType +{ + _alertType = alertType; +} + +- (void)setBgColor:(UIColor *)bgColor +{ + _bgColor = bgColor; + self.backgroundColor = bgColor; +} + +- (void)setIsTouchEdgeHide:(BOOL)isTouchEdgeHide +{ + _isTouchEdgeHide = isTouchEdgeHide; +} + +- (void)setShowAnimate:(BOOL)showAnimate +{ + _showAnimate = showAnimate; +} + +- (void)setAnimatingStyle:(BAAlertAnimatingStyle)animatingStyle +{ + _animatingStyle = animatingStyle; +} + +- (void)setIsAnimating:(BOOL)isAnimating +{ + _isAnimating = isAnimating; +} + +- (void)setBgImageName:(NSString *)bgImageName +{ + _bgImageName = bgImageName; + + _containerView.backgroundColor = [UIColor clearColor]; + _scrollView.backgroundColor = [UIColor clearColor]; + _containerView.image = [UIImage imageNamed:bgImageName]; + _containerView.contentMode = UIViewContentModeScaleAspectFill; +} + +- (void)setCurrent_blurEffectStyle:(BAAlertBlurEffectStyle)current_blurEffectStyle +{ + _current_blurEffectStyle = current_blurEffectStyle; + + self.blurImageView.image = nil; + + self.blurImageView.image = [self getCurrentWindowImage]; + + if (self.blurEffectStyle == BAAlertBlurEffectStyleLight) + { + self.blurImageView.image = [self.blurImageView.image BAAlert_ApplyLightEffect]; + } + else if (self.blurEffectStyle == BAAlertBlurEffectStyleExtraLight) + { + self.blurImageView.image = [self.blurImageView.image BAAlert_ApplyExtraLightEffect]; + } + else if (self.blurEffectStyle == BAAlertBlurEffectStyleDark) + { + self.blurImageView.image = [self.blurImageView.image BAAlert_ApplyDarkEffect]; + } + // [self imageOutPut:^(UIImage *image) { + // self.blurImageView.image = image; + // }]; +} + +- (UIImage *)getCurrentWindowImage +{ + UIGraphicsBeginImageContext(self.alertWindow.rootViewController.view.bounds.size); + + [self.alertWindow.rootViewController.view.layer renderInContext:UIGraphicsGetCurrentContext()]; + + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + + UIGraphicsEndImageContext(); + + return image; +} + +/*! 待优化 */ +- (void )imageOutPut:(void(^)(UIImage *image)) outPutImage +{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + /*! CIImage,不能用UIImage的CIImage属性 */ + CIImage *ciImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"123.png"]]; + // UIImage *tempImage = [self imageWithColor:[UIColor grayColor] andSize:[UIScreen mainScreen].bounds.size]; + // CIImage *ciImage = [[CIImage alloc] initWithImage:tempImage]; + + // CIFilter(滤镜的名字) + CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"]; + // CIColor *color = [CIColor colorWithRed:1.0 green:0 blue:0]; + // 将图片放到滤镜中 + // [blurFilter setValue:color forKey:kCIInputColorKey]; + [blurFilter setValue:ciImage forKey:kCIInputImageKey]; + + // inputRadius参数: 模糊的程度 默认为10, 范围为0-100, 接收的参数为NSNumber类型 + + // 设置模糊的程度 + [blurFilter setValue:@(10) forKey:kCIInputRadiusKey]; + // [blurFilter setValue:@(10) forKey:kCIInputSharpnessKey]; + + // 将处理好的图片导出 + CIImage *outImage = [blurFilter valueForKey:kCIOutputImageKey]; + + //理论上这些东西需要放到子线程去渲染,待优化 + // CIContext 上下文(参数nil,默认为CPU渲染, 如果想用GPU渲染来提高效率的话,则需要传参数) + CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer:@(YES)}]; + + // 将处理好的图片创建出来 + CGImageRef outputCGImage = [context createCGImage:outImage fromRect:[UIScreen mainScreen].bounds]; + + UIImage *blurImage = [UIImage imageWithCGImage:outputCGImage]; + + // 释放CGImageRef + CGImageRelease(outputCGImage); + + if (outPutImage) { + dispatch_async(dispatch_get_main_queue(), ^{ + outPutImage(blurImage); + }); + } + }); +} + +@end diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert_Config.h b/Pods/BAAlert/BAAlert/BAAlert/BAAlert_Config.h new file mode 100644 index 0000000..5e65ded --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAAlert_Config.h @@ -0,0 +1,135 @@ +// +// BAAlert_Config.h +// BAAlert +// +// Created by boai on 2017/5/13. +// Copyright © 2017年 boai. All rights reserved. +// + +#ifndef BAAlert_Config_h +#define BAAlert_Config_h + + +/*! 背景高斯模糊枚举 默认:1 */ +typedef NS_ENUM(NSInteger, BAAlertBlurEffectStyle) { + /*! 较亮的白色模糊 */ + BAAlertBlurEffectStyleExtraLight = 1, + /*! 一般亮的白色模糊 */ + BAAlertBlurEffectStyleLight, + /*! 深色背景模糊 */ + BAAlertBlurEffectStyleDark +} NS_ENUM_AVAILABLE_IOS(7_0); + +/*! 进出场动画枚举 默认:1 */ +typedef NS_ENUM(NSUInteger, BAAlertAnimatingStyle) { + /*! 缩放显示动画 */ + BAAlertAnimatingStyleScale = 1, + /*! 晃动动画 */ + BAAlertAnimatingStyleShake, + /*! 天上掉下动画 / 上升动画 */ + BAAlertAnimatingStyleFall +}; + +///*! BAActionSheet 样式 */ +//typedef NS_ENUM(NSUInteger, BAActionSheetStyle) { +// /*! +// * 普通样式 +// */ +// BAActionSheetStyleNormal = 1, +// /*! +// * 带标题样式 +// */ +// BAActionSheetStyleTitle, +// /*! +// * 带图片和标题样式 +// */ +// BAActionSheetStyleImageAndTitle, +// /*! +// * 带图片样式 +// */ +// BAActionSheetStyleImage +//}; + +/*! BAActionSheet 类型,默认:1 */ +typedef NS_ENUM(NSUInteger, BAActionSheetType) { + BAActionSheetTypeNormal = 1, + BAActionSheetTypeCustom, + BAActionSheetTypeExpand +}; + +typedef void(^BAAlert_ButtonActionBlock)(NSInteger index); + +#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width +#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height + +#pragma mark - weak / strong +#define BAKit_WeakSelf @BAKit_Weakify(self); +#define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! RGB色值 */ +#define BAAlert_Color_RGBA(R, G, B, A) [UIColor colorWithRed:R/255.0 green:G/255.0 blue:B/255.0 alpha:A] +#define BAAlert_Color_Translucent [UIColor colorWithRed:0.3f green:0.3f blue:0.3f alpha:0.5f] +#define BAAlert_Color_gray11 BAAlert_Color_RGBA(248, 248, 248, 1.0) +#define BAAlert_Color_gray7 BAAlert_Color_RGBA(173, 180, 190, 1.0) + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; +#endif +#endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; +#endif +#endif +#endif + +#ifndef __OPTIMIZE__ +#define NSLog(...) NSLog(__VA_ARGS__) +#else +#define NSLog(...){} +#endif + +#endif /* BAAlert_Config_h */ diff --git a/Pods/BAAlert/BAAlert/BAAlert/BAAlert_OC.h b/Pods/BAAlert/BAAlert/BAAlert/BAAlert_OC.h new file mode 100644 index 0000000..cd7de2e --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/BAAlert_OC.h @@ -0,0 +1,121 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 最新更新时间:2017-05-20 【倒叙】
+ 最新Version:【Version:1.1.9】
+ 更新内容:
+ 1.1.9.1、修复动画过度白屏问题
+ + + 最新更新时间:2017-05-15 【倒叙】
+ 最新Version:【Version:1.1.8】
+ 更新内容:
+ 1.1.8.1、精简代码结构,删除多余或者重复代码
+ 1.1.8.2、规范代码属性和方法命名,原有方法名和属性名有较大改动,忘见谅
+ 1.1.8.3、重构 actionSheet,新增多种样式
+ + + 最新更新时间:2017-05-13 【倒叙】
+ 最新Version:【Version:1.1.7】
+ 更新内容:
+ 1.1.7.1、精简代码结构,删除多余或者重复代码
+ 1.1.7.2、规范代码属性和方法命名,原有方法名和属性名有较大改动,忘见谅
+ 1.1.7.3、优化部分动画
+ 1.1.7.4、subView 布局优化
+ 1.1.7.5、actionSheet 新增自定义文字颜色、title 字体颜色
+ + + 最新更新时间:2017-05-10 【倒叙】
+ 最新Version:【Version:1.1.5】
+ 更新内容:
+ 1.1.5.1、删除原有封装内部按钮点击事件中 ba_dismissAlertView 方法,此方法可在外部自由调用
+ + + 最新更新时间:2017-05-09 【倒叙】
+ 最新Version:【Version:1.1.4】
+ 更新内容:
+ 1.1.4.1、pod 更新xib 文件
+ + + 最新更新时间:2017-05-08 【倒叙】 + 最新Version:【Version:1.1.0】 + 更新内容: + 1.1.0.1、优化方法名命名规范 + 1.1.0.2、新增键盘内部处理 + 1.1.0.3、用原生 autoLayout 重构,自定义 alert 的布局再也不是问题了 + 1.1.0.4、优化代码结构,修复内在隐藏内存泄漏 + 1.1.0.5、新增 BAAlert_OC.h 文件,只需导入 BAAlert_OC.h 一个文件就可以使用 alert 和 actionSheet 了 + 1.1.0.6、删除了部分代码和属性,具体见源码 和 demo + + */ + + +#ifndef BAAlert_OC_h +#define BAAlert_OC_h + +#import "BAAlert.h" +#import "BAActionSheet.h" + + +#endif /* BAAlert_OC_h */ diff --git a/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.h b/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.h new file mode 100644 index 0000000..f7b9786 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.h @@ -0,0 +1,67 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import +#import + +@interface CALayer (MyAnimation) +/*! + * 晃动动画 + * + * @param duration 一次动画用时 + * @param radius 晃动角度0-180 + * @param repeat 重复次数 + * @param finish 动画完成 + */ +- (void )shakeAnimationWithDuration:(NSTimeInterval )duration + shakeRadius:(CGFloat )radius + repeat:(NSUInteger )repeat + finishAnimation:(void(^)()) finish; + +/*! + * 根据路径执行动画 + * + * @param duration 一次动画用时 + * @param path 路径CGPathRef + * @param repeat 重复次数 + * @param finish 动画完成 + */ +- (void )pathAnimationWithDuration:(NSTimeInterval )duration + path:(CGPathRef )path + repeat:(NSUInteger )repeat + finishAnimation:(void(^)()) finish; + + +/*! 这两个动画只适合本项目 */ +/*! 天上掉下 */ +- (void )fallAnimationWithDuration:(NSTimeInterval )duration + finishAnimation:(void(^)()) finish; +/*! 上升 */ +- (void )floatAnimationWithDuration:(NSTimeInterval )duration + finishAnimation:(void(^)()) finish; +@end + + +@interface UIView (MyAnimation) +/*! + * 缩放显示动画 + * + * @param finish 动画完成 + */ + +- (void )scaleAnimationShowFinishAnimation:(void(^)()) finish; +/*! + * 缩放隐藏动画 + * + * @param finish 动画完成 + */ +- (void )scaleAnimationDismissFinishAnimation:(void(^)()) finish; + +@end diff --git a/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.m b/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.m new file mode 100644 index 0000000..7d52e71 --- /dev/null +++ b/Pods/BAAlert/BAAlert/BAAlert/CALayer+Animation.m @@ -0,0 +1,125 @@ + +/*! + * @brief BAAlert + * + * @author BAHome + * @copyright Copyright © 2016年 BAHome. All rights reserved. + * @version V1.1.0 + */ + + +#import "CALayer+Animation.h" + +@implementation CALayer (MyAnimation) +- (void )shakeAnimationWithDuration:(NSTimeInterval )duration + shakeRadius:(CGFloat )radius + repeat:(NSUInteger )repeat + finishAnimation:(void(^)()) finish +{ + CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animation]; + keyAnimation.duration = duration; + keyAnimation.keyPath = @"transform.rotation.z"; + keyAnimation.values = @[@((0) / 180.0 * M_PI),@((-radius) / 180.0 * M_PI),@((radius) / 180.0 * M_PI),@((-radius) / 180.0 * M_PI),@((0) / 180.0 * M_PI)]; + keyAnimation.repeatCount = repeat; + [self addAnimation:keyAnimation forKey:nil]; + if (finish) + { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * (CGFloat )repeat * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + finish(); + }); + } +} + +- (void )pathAnimationWithDuration:(NSTimeInterval )duration + path:(CGPathRef )path + repeat:(NSUInteger )repeat + finishAnimation:(void(^)()) finish +{ + CAKeyframeAnimation *keyAnimation = [CAKeyframeAnimation animation]; + keyAnimation.keyPath = @"position"; + keyAnimation.duration = duration; + keyAnimation.repeatCount = repeat; + keyAnimation.fillMode = kCAFillModeForwards; + keyAnimation.path = path; + [self addAnimation:keyAnimation forKey:nil]; + if (finish) + { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((duration * (CGFloat )repeat - 0.1) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + finish(); + }); + } +} + +- (void )fallAnimationWithDuration:(NSTimeInterval )duration + finishAnimation:(void(^)()) finish +{ + CGRect frame = [UIScreen mainScreen].bounds; + CGPoint center = CGPointMake(CGRectGetWidth(frame)*0.5, (CGRectGetHeight(frame) * 0.5)); + CGPoint point = CGPointMake(CGRectGetWidth(frame)*0.5, -(CGRectGetHeight(self.frame))); + UIBezierPath *path = [UIBezierPath bezierPath]; + [path moveToPoint:point]; + [path addLineToPoint:center]; + + [self pathAnimationWithDuration:duration path:path.CGPath repeat:1 finishAnimation:^{ + if (finish) + { + finish(); + } + }]; +} + +- (void )floatAnimationWithDuration:(NSTimeInterval )duration + finishAnimation:(void(^)()) finish +{ + CGRect frame = [UIScreen mainScreen].bounds; + CGPoint center = CGPointMake(CGRectGetWidth(frame)*0.5, (CGRectGetHeight(frame) * 0.5)); + CGPoint point = CGPointMake(CGRectGetWidth(frame)*0.5, -(CGRectGetHeight(self.frame))); + UIBezierPath *path = [UIBezierPath bezierPath]; + [path moveToPoint:center]; + [path addLineToPoint:point]; + + [self pathAnimationWithDuration:duration path:path.CGPath repeat:1 finishAnimation:^{ + if (finish) + { + finish(); + } + }]; +} +@end + + +@implementation UIView(MyAnimation) + + +- (void )scaleAnimationShowFinishAnimation:(void(^)()) finish +{ + self.transform = CGAffineTransformMakeScale(0.001f, 0.001f); + [UIView animateWithDuration:0.35f animations:^{ + self.transform = CGAffineTransformMakeScale(1.18f, 1.18f); + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.25f animations:^{ + self.transform = CGAffineTransformMakeScale(1.0f, 1.0f); + } completion:^(BOOL finished) { + if (finish) { + finish(); + } + }]; + }]; +} + +- (void )scaleAnimationDismissFinishAnimation:(void(^)()) finish +{ + [UIView animateWithDuration:0.15f animations:^{ + self.transform = CGAffineTransformMakeScale(1.18f, 1.18f); + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.25f animations:^{ + self.transform = CGAffineTransformMakeScale(0.0001f, 0.0001f); + } completion:^(BOOL finished) { + if (finish) { + finish(); + } + }]; + }]; +} + +@end diff --git a/Pods/BAAlert/LICENSE b/Pods/BAAlert/LICENSE new file mode 100644 index 0000000..421b3c2 --- /dev/null +++ b/Pods/BAAlert/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/BAAlert/README.md b/Pods/BAAlert/README.md new file mode 100644 index 0000000..95fff16 --- /dev/null +++ b/Pods/BAAlert/README.md @@ -0,0 +1,384 @@ +# BAAlert + +目前为止,最为精简的 alert 和 actionSheet 封装!BAAlert 是原 DSAlert 的转移,以后更新都在这里更新,希望大家注意下! + +--- + +## 更新提示:【倒叙更新】 + + 最新更新时间:2017-05-20 【倒叙】
+ 最新Version:【Version:1.1.9】
+ 更新内容:
+ 1.1.9.1、修复动画过度白屏问题
+ + +最新更新时间:2017-05-15 【倒叙】
+最新Version:【Version:1.1.8】
+更新内容:
+1.1.8.1、精简代码结构,删除多余或者重复代码
+1.1.8.2、规范代码属性和方法命名,原有方法名和属性名有较大改动,忘见谅
+1.1.8.3、重构 actionSheet,新增多种样式
+ + +最新更新时间:2017-05-13 【倒叙】
+最新Version:【Version:1.1.7】
+更新内容:
+1.1.7.1、精简代码结构,删除多余或者重复代码
+1.1.7.2、规范代码属性和方法命名,原有方法名和属性名有较大改动,忘见谅
+1.1.7.3、优化部分动画
+1.1.7.4、subView 布局优化
+1.1.7.5、actionSheet 新增自定义文字颜色、title 字体颜色
+ + +最新更新时间:2017-05-10 【倒叙】
+最新Version:【Version:1.1.6】
+更新内容:
+1.1.6.1、修复 两个按钮的情况下,button title 只显示最后一个title 的bug!
+ +最新更新时间:2017-05-10 【倒叙】
+最新Version:【Version:1.1.5】
+更新内容:
+1.1.5.1、删除原有封装内部按钮点击事件中 ba_dismissAlertView 方法,此方法可在外部自由调用
+ +最新更新时间:2017-05-09 【倒叙】
+最新Version:【Version:1.1.4】
+更新内容:
+1.1.4.1、pod 更新xib 文件
+ +最新更新时间:2017-05-08 【倒叙】
+最新Version:【Version:1.1.0】
+更新内容:
+1.1.0.1、优化方法名命名规范
+1.1.0.2、新增键盘内部处理
+1.1.0.3、用原生 autoLayout 重构,自定义 alert 的布局再也不是问题了
+1.1.0.4、优化代码结构,修复内在隐藏内存泄漏
+1.1.0.5、新增 BAAlert_OC.h 文件,只需导入 BAAlert_OC.h 一个文件就可以使用 alert 和 actionSheet 了
+1.1.0.6、删除了部分代码和属性,具体见源码 和 demo + +* 12、终于可以愉快的 pod 导入了,pod 导入:` pod 'BAAlert' ` 【最新版本:1.0.1】 +* 11、可以自定义每个按钮的字体颜色了! +* 10、再次设计结构,新增frameWork静态库文件封装,喜欢简洁的你可以直接导入frameWork即可! +* 9、多种炫酷入场、退出动画,让你的APP各种叼! +* 8、新增高斯模糊,枚举选择,简单明了! +* 7、新增是否开启边缘触摸隐藏 alert 默认:关闭,属性:isTouchEdgeHide,可自由开关边缘触摸! +* 6、完美适配横竖屏 +* 5、简单的两行搞定一个自定义 alert +* 4、手势触摸隐藏 +* 3、可以自定义背景图片、按钮颜色 +* 2、可以添加文字和图片,且可以滑动查看 +* 1、理论完全兼容目前所有 iOS 系统版本 + +--- + +## 0、安装、导入示例和源码地址: +* 0.1、pod 导入:` pod 'BAAlert' ` ` pod 'BAAlert-Swift' ` 【最新版本:1.1.9】 +* 0.2、使用方法2:下载demo,把 BAAlert 文件夹拖入项目即可,
+导入头文件:
+` #import "BAAlert_OC.h" `
+* 0.3、项目源码地址:
+ OC 版 :[https://github.com/BAHome/BAAlert](https://github.com/BAHome/BAAlert)
+ swift 版 :[https://github.com/BAHome/BAAlert-Swift](https://github.com/BAHome/BAAlert-Swift)
+ +--- + +## 1、图片示例: + + + +--- + +## 2、代码示例: +* 2.1 类似系统 alert【加边缘手势消失】、高斯模糊背景 + +``` + +- (void)alert1 +{ + BAKit_WeakSelf + /*! 第一种封装使用示例 */ + [BAAlert ba_alertShowWithTitle:title0 message:titleMsg0 image:nil buttonTitleArray:@[@"取消",@"确定",@"确定2",@"确定3"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor], [UIColor grayColor], [UIColor purpleColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + // temp.bgColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:0.3]; + /*! 开启边缘触摸隐藏alertView */ + tempView.isTouchEdgeHide = NO; + /*! 添加高斯模糊的样式 */ + tempView.blurEffectStyle = BAAlertBlurEffectStyleLight; + /*! 开启动画 */ + // temp.isShowAnimate = YES; + // /*! 进出场动画样式 默认为:1 */ + // temp.animatingStyle = 1; + self.alertView1 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView1 ba_alertHidden]; + if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert1"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert2 +{ +// /*! 2、自定义按钮颜色 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg2 image:nil buttonTitleArray:@[@"取消", @"跳转VC2"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + tempView.bgColor = [UIColor colorWithRed:1.0 green:1.0 blue:0 alpha:0.3]; + + /*! 是否开启进出场动画 默认:NO,如果 YES ,并且同步设置进出场动画枚举为默认值:1 */ + tempView.showAnimate = YES; + tempView.animatingStyle = BAAlertAnimatingStyleShake; + + self.alertView2 = tempView; + + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView2 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert2"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert3 +{ + /*! 3、自定义背景图片 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg1 image:nil buttonTitleArray:@[@"取消", @"确定"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + /*! 自定义alert的背景图片 */ + tempView.bgImageName = @"背景.jpg"; + /*! 开启动画,并且设置动画样式,默认:1 */ +// tempView.showAnimate = YES; + + /*! 没有开启动画,直接进出场动画样式,默认开启动画 */ + tempView.animatingStyle = BAAlertAnimatingStyleFall; + + self.alertView3 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView3 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert3"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +- (void)alert4 +{ + /*! 4、内置图片和文字,可滑动查看 */ + BAKit_WeakSelf + [BAAlert ba_alertShowWithTitle:@"温馨提示:" message:titleMsg1 image:[UIImage imageNamed:@"美女.jpg"] buttonTitleArray:@[@"取消", @"跳转VC2"] buttonTitleColorArray:@[[UIColor redColor], [UIColor greenColor]] configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + /*! 自定义按钮文字颜色 */ + // tempView.buttonTitleColor = [UIColor orangeColor]; + /*! 自定义alert的背景图片 */ + tempView.bgImageName = @"背景.jpg"; + /*! 是否显示动画效果 */ + tempView.showAnimate = YES; + self.alertView4 = tempView; + } actionBlock:^(NSInteger index) { + BAKit_StrongSelf + [self.alertView4 ba_alertHidden]; + if (index == 0) + { + NSLog(@"点击了取消按钮!"); + } + else if (index == 1) + { + NSLog(@"点击了确定按钮!"); + ViewController2 *vc2 = [ViewController2 new]; + vc2.title = @"alert4"; + [self.navigationController pushViewController:vc2 animated:YES]; + } + }]; +} + +``` + +* 2.5 完全自定义alert,具体看 demo 源码 + +``` +- (void)alert5 +{ + /*! 5、完全自定义alert */ + _customView = [CustomView new]; + self.customView.frame = CGRectMake(50, SCREENHEIGHT - 300, SCREENWIDTH - 50 * 2, 162); + + BAKit_WeakSelf + [BAAlert ba_alertShowCustomView:self.customView configuration:^(BAAlert *tempView) { + BAKit_StrongSelf + tempView.isTouchEdgeHide = YES; + tempView.animatingStyle = BAAlertAnimatingStyleScale; + self.alertView5 = tempView; + }]; + + self.customView.block = ^(NSInteger index) { + BAKit_StrongSelf + if (index == 1) + { + [self.alertView5 ba_alertHidden]; + } + }; +} + + +``` + +* 2.6 actionSheet,样式一:带图片、title、subTitle + +``` +- (void)actionSheet1 +{ + NSMutableArray *dataArray = [NSMutableArray array]; + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户"]; + NSArray *subContentArray = @[@"", @"18588888888", @"余额:¥480.00"]; + NSArray *imageArray = @[@"123.png", @"背景.jpg", @"美女.jpg"]; + + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; + model.imageUrl = imageArray[i]; + model.content = contentArray[i]; + model.subContent = subContentArray[i]; + + [dataArray addObject:model]; + } + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf + tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.isTouchEdgeHide = NO; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + BAKit_ShowAlertWithMsg_ios8(model.content); + }]; +} +``` + +* 2.7 actionSheet,样式二:类似微博得 actionSheet + +``` +- (void)actionSheet2 +{ + NSMutableArray *dataArray = [NSMutableArray array]; + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户"]; + + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; +// model.imageUrl = imageArray[i]; + model.content = contentArray[i]; +// model.subContent = subContentArray[i]; + + [dataArray addObject:model]; + } + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf +// tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.actionSheetType = BAActionSheetTypeCustom; + // tempView.isTouchEdgeHide = NO; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + BAKit_ShowAlertWithMsg_ios8(model.content); + }]; +} +``` + +* 2.8 actionSheet,样式三:可展开二级菜单 + +``` +- (void)actionSheet3 +{ + NSArray *contentArray = @[@"微信支付", @"支付宝", @"预付款账户", @"中行"]; + NSArray *subContentArray = @[ + @[@"微信支付1", @"微信支付2", @"微信支付3"], + @[@"支付宝1", @"支付宝2", @"支付宝3", @"支付宝4"], + @[], + @[@"中行1", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7", @"中行2", @"中行3", @"中行4", @"中行5", @"中行6", @"中行7"] + ]; + + NSMutableArray *dataArray = @[].mutableCopy; + for (NSInteger i = 0; i < contentArray.count; i++) + { + BAActionSheetModel *model = [BAActionSheetModel new]; + model.content = contentArray[i]; + + NSMutableArray *mutArray = @[].mutableCopy; + for (NSInteger j = 0; j < subContentArray[i].count; j ++) + { + BAActionSheetSubContentModel *subContentModel = [BAActionSheetSubContentModel new]; + subContentModel.subContent = subContentArray[i][j]; + [mutArray addObject:subContentModel]; + } + model.subContentArray = mutArray; + + [dataArray addObject:model]; + } + + BAKit_WeakSelf + [BAActionSheet ba_actionSheetShowWithConfiguration:^(BAActionSheet *tempView) { + + BAKit_StrongSelf + tempView.title = @"支付方式"; + tempView.dataArray = dataArray; + tempView.actionSheetType = BAActionSheetTypeExpand; + // tempView.isTouchEdgeHide = NO; + + self.actionSheet = tempView; + } actionBlock:^(NSIndexPath *indexPath, BAActionSheetModel *model) { + if (model.subContentArray.count > 0) + { + BAKit_ShowAlertWithMsg_ios8(model.subContentArray[indexPath.row].subContent); + } + else + { + BAKit_ShowAlertWithMsg_ios8(model.content); + } + }]; +} + +``` + +## 3、系统要求 + + 该项目最低支持 iOS 7.0 和 Xcode 8.0,理论支持目前所有 iOS 系统版本! + +--- + + + + + + diff --git a/Pods/BAButton/BAButton/BAButton.h b/Pods/BAButton/BAButton/BAButton.h deleted file mode 100644 index 8c8c015..0000000 --- a/Pods/BAButton/BAButton/BAButton.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// BAButton.h -// demoTest -// -// Created by 博爱 on 16/3/31. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import - -/*! 自定义按钮1: */ -@interface BAButton : UIButton - -/** - * Create an UIButton with a fade animation from image to highlightedImage on touch - * - * @param frame Button's frame - * @param image Button's image - * @param highlightedImage Button's highlighted image - * @param fadeDuration Fade duration - * - * @return Returns the created BFButton, subclass of UIButton - */ - -- (instancetype _Nonnull)initWithFrame:(CGRect)frame - image:(UIImage * _Nonnull)image - highlightedImage:(UIImage * _Nonnull)highlightedImage - fadeDuration:(CGFloat)fadeDuration; - -@end - -/*! 自定义按钮2:多种button自定义 */ -/*! 图标在上,文本在下按钮的图文间隔比例(0-1),默认0.8 */ -#define BA_ButtonTopRadio 0.8 - -/*! 图标在下,文本在上按钮的图文间隔比例(0-1),默认0.5 */ -#define BA_ButtonBottomRadio 0.5 - -typedef enum{ - BAAligenmentStatusNormal, // 默认 - BAAligenmentStatusLeft, // 左对齐 - BAAligenmentStatusCenter, // 居中对齐 - BAAligenmentStatusRight, // 右对齐 - BAAligenmentStatusTop, // 图标在上,文本在下(居中) - BAAligenmentStatusBottom, // 图标在下,文本在上(居中) -}BAAligenmentStatus; - -@interface BACustomButton : UIButton - -/** 设置样式 */ -@property (nonatomic, assign) BAAligenmentStatus buttonStatus; -/** 设置圆角 */ -@property (nonatomic, assign) CGFloat buttonCornerRadius; - -/*! 外界通过设置按钮的status属性,创建不同类型的按钮 */ -+ (instancetype _Nonnull)BA_ShareButton; - -- (instancetype _Nonnull)initWitAligenmentStatus:(BAAligenmentStatus)status; - - -@end - diff --git a/Pods/BAButton/BAButton/BAButton.m b/Pods/BAButton/BAButton/BAButton.m deleted file mode 100644 index 97597ee..0000000 --- a/Pods/BAButton/BAButton/BAButton.m +++ /dev/null @@ -1,218 +0,0 @@ -// -// BAButton.m -// demoTest -// -// Created by 博爱 on 16/3/31. -// Copyright © 2016年 博爱之家. All rights reserved. -// - -#import "BAButton.h" - -@implementation BAButton -{ - UIImageView *_overlayImgView; - CGFloat _fadeDuration; -} - -- (instancetype _Nonnull)initWithFrame:(CGRect)frame - image:(UIImage * _Nonnull)image - highlightedImage:(UIImage * _Nonnull)highlightedImage - fadeDuration:(CGFloat)fadeDuration { - if ((self = [BAButton buttonWithType:UIButtonTypeCustom])) { - self.frame = frame; - - _fadeDuration = fadeDuration; - - [self setImage:image forState:UIControlStateNormal]; - self.overlayImgView = [[UIImageView alloc] initWithImage:highlightedImage]; - _overlayImgView.frame = self.imageView.frame; - _overlayImgView.bounds = self.imageView.bounds; - - self.adjustsImageWhenHighlighted = NO; - } - - return self; -} - -- (void)setHighlighted:(BOOL)highlighted { - if (![self isHighlighted] && highlighted) { - [self addSubview:_overlayImgView]; - - [UIView animateWithDuration:_fadeDuration animations:^{ - _overlayImgView.alpha = 1; - } completion:NULL]; - } else if ([self isHighlighted] && !highlighted) { - [UIView animateWithDuration:_fadeDuration animations:^{ - _overlayImgView.alpha = 0; - } completion:^(BOOL finished) { - [_overlayImgView removeFromSuperview]; - }]; - } - - [super setHighlighted:highlighted]; -} - -- (void)setOverlayImgView:(UIImageView *)overlayImgView { - if (overlayImgView != _overlayImgView) { - _overlayImgView = overlayImgView; - } - - _overlayImgView.alpha = 0; -} - - -@end - -/*! 定义宏:按钮中文本和图片的间隔 */ -#define BA_padding 7 -#define BA_btnRadio 0.6 -/*! 获得按钮的大小 */ -#define BA_btnWidth self.bounds.size.width -#define BA_btnHeight self.bounds.size.height -/*! 获得按钮中UILabel文本的大小 */ -#define BA_labelWidth self.titleLabel.bounds.size.width -#define BA_labelHeight self.titleLabel.bounds.size.height -/*! 获得按钮中image图标的大小 */ -#define BA_imageWidth self.imageView.bounds.size.width -#define BA_imageHeight self.imageView.bounds.size.height - - -@implementation BACustomButton - -+ (instancetype)BA_ShareButton -{ - return [[self alloc] init]; -} - -- (instancetype)initWitAligenmentStatus:(BAAligenmentStatus)status -{ - BACustomButton *button = [[BACustomButton alloc] init]; - button.buttonStatus = status; - return button; -} - -- (void)setButtonStatus:(BAAligenmentStatus)buttonStatus -{ - _buttonStatus = buttonStatus; -} - -#pragma mark - 左对齐 -- (void)alignmentLeft -{ - // 获得按钮的文本的frame - CGRect titleFrame = self.titleLabel.frame; - // 设置按钮的文本的x坐标为0---左对齐 - titleFrame.origin.x = 0; - // 获得按钮的图片的frame - CGRect imageFrame = self.imageView.frame; - // 设置按钮的图片的x坐标紧跟文本的后面 - imageFrame.origin.x = CGRectGetWidth(titleFrame); - - self.titleLabel.frame = titleFrame; - self.imageView.frame = imageFrame; -} - -#pragma mark - 右对齐【文字在左,图片在右】 -- (void)alignmentRight -{ - CGRect frame = [self getTitleLabelWith]; - CGRect imageFrame = self.imageView.frame; - imageFrame.origin.x = BA_btnWidth - BA_imageWidth; - CGRect titleFrame = self.titleLabel.frame; - titleFrame.origin.x = imageFrame.origin.x - frame.size.width; - - // 重写赋值frame - self.titleLabel.frame = titleFrame; - self.imageView.frame = imageFrame; -} - -#pragma mark - 计算文本的的宽度 -- (CGRect)getTitleLabelWith -{ - NSMutableDictionary *dictM = [NSMutableDictionary dictionary]; - dictM[NSFontAttributeName] = self.titleLabel.font; - CGRect frame = [self.titleLabel.text boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dictM context:nil]; - - return frame; -} - -#pragma mark - 居中对齐 -- (void)alignmentCenter -{ - // 设置文本的坐标 - CGFloat labelX = (BA_btnWidth - BA_labelWidth - BA_imageWidth - BA_padding) * 0.5; - CGFloat labelY = (BA_btnHeight - BA_labelHeight) * 0.5; - // 设置label的frame - self.titleLabel.frame = CGRectMake(labelX, labelY, BA_labelWidth, BA_labelHeight); - - // 设置图片的坐标 - CGFloat imageX = CGRectGetMaxX(self.titleLabel.frame) + BA_padding; - CGFloat imageY = (BA_btnHeight - BA_imageHeight) * 0.5; - // 设置图片的frame - self.imageView.frame = CGRectMake(imageX, imageY, BA_imageWidth, BA_imageHeight); -} - -#pragma mark - 图标在上,文本在下(居中) -- (void)alignmentTop -{ - CGRect frame = [self getTitleLabelWith]; - - CGFloat imageX = (BA_btnWidth - BA_imageWidth) * 0.5; - self.imageView.frame = CGRectMake(imageX, BA_btnHeight * 0.5 - BA_imageHeight * BA_ButtonTopRadio, BA_imageWidth, BA_imageHeight); - self.titleLabel.frame = CGRectMake((self.center.x - frame.size.width) * 0.5, BA_btnHeight * 0.5 + BA_labelHeight * BA_ButtonTopRadio, BA_labelWidth, BA_labelHeight); - CGPoint labelCenter = self.titleLabel.center; - labelCenter.x = self.imageView.center.x; - self.titleLabel.center = labelCenter; -} - -#pragma mark - 图标在下,文本在上(居中) -- (void)alignmentBottom -{ - CGRect frame = [self getTitleLabelWith]; - - CGFloat imageX = (BA_btnWidth - BA_imageWidth) * 0.5; - self.titleLabel.frame = CGRectMake((self.center.x - frame.size.width) * 0.5, BA_btnHeight * 0.5 - BA_labelHeight * (1 + BA_ButtonBottomRadio), BA_labelWidth, BA_labelHeight); - self.imageView.frame = CGRectMake(imageX, BA_btnHeight * 0.5, BA_imageWidth, BA_imageHeight); - CGPoint labelCenter = self.titleLabel.center; - labelCenter.x = self.imageView.center.x; - self.titleLabel.center = labelCenter; -} - -- (void)setButtonCornerRadius:(CGFloat)buttonCornerRadius -{ - self.layer.masksToBounds = YES; - self.layer.cornerRadius = buttonCornerRadius; -} - -/** 布局子控件 */ -- (void)layoutSubviews -{ - [super layoutSubviews]; - - if (_buttonStatus == BAAligenmentStatusNormal) - { - } - else if (_buttonStatus == BAAligenmentStatusLeft) - { - [self alignmentLeft]; - } - else if (_buttonStatus == BAAligenmentStatusCenter) - { - [self alignmentCenter]; - } - else if (_buttonStatus == BAAligenmentStatusRight) - { - [self alignmentRight]; - } - else if (_buttonStatus == BAAligenmentStatusTop) - { - [self alignmentTop]; - } - else if (_buttonStatus == BAAligenmentStatusBottom) - { - [self alignmentBottom]; - } -} -@end - - diff --git a/Pods/BAButton/BAButton/BAButton/BAButton.h b/Pods/BAButton/BAButton/BAButton/BAButton.h new file mode 100644 index 0000000..71f254e --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/BAButton.h @@ -0,0 +1,139 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#ifndef BAButton_h +#define BAButton_h + + +#import "UIButton+BAKit.h" +#import "UIButton+BAState.h" +#import "UIButton+BACountDown.h" +#import "UIView+BARectCorner.h" + + +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) + +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) + +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) + +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA),class_getInstanceMethod([self class], methodB)); + +/*! 随机色 */ +CG_INLINE UIColor * +BAKit_ColorRandom(){ + return [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]; +} + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BAButton + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.3】 + 更新内容: + 2.4.3.1、快速创建 button 方法改为类方法,可直接调用! + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.2】 + 更新内容: + 2.4.2.1、优化注释 + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.1】 + 更新内容: + 2.4.1.1、优化注释,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + 最新更新时间:2017-05-27 【倒叙】 + 最新Version:【Version:2.4.0】 + 更新内容: + 2.4.0.1、此版本由 [子丰大神](https://github.com/renzifeng) 亲自改版,再次感谢 [子丰大神](https://github.com/renzifeng) + 2.4.0.2、新增 UIButton 各种状态下背景颜色、字体、border、font、动画等的监测及改变 + 2.4.0.3、新增 UIButton 倒计时的封装,两行代码搞定倒计时! + 2.4.0.4、优化整体代码结构,代码规范! + + 最新更新时间:2017-05-26 【倒叙】 + 最新Version:【Version:2.3.2】 + 更新内容: + 2.3.2.1、优化代码结构,修复 frame 改变后 padding 无法更改的问题! + + 最新更新时间:2017-05-24 【倒叙】 + 最新Version:【Version:2.3.1】 + 更新内容: + 2.3.1.1、新增:padding_inset,文字或图片距离 button 左右边界的最小距离,默认为:5 + + 最新更新时间:2017-05-20 【倒叙】 + 最新Version:【Version:2.3.0】 + 更新内容: + 2.3.0.1、用分类全新重构 BAButton,代码配置更灵活 + 2.3.0.2、可以自由设置 button 的文字和图片的布局、间距、每个角的切圆角 + 2.3.0.3、全面适配 纯代码、xib、storyboard + 2.3.0.4、版本改动较大,希望大家谅解,如果用老版本的 BAButton,可以参考demo 更换新版本,后期改动不大 + +*/ + +#endif /* BAButton_h */ diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.h b/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.h new file mode 100755 index 0000000..2625b4d --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.h @@ -0,0 +1,28 @@ +// +// UIButton+BACountDown.h +// BAButton +// +// Created by 任子丰 on 16/6/17. +// Copyright © 2016年 任子丰. All rights reserved. +// + +#import + +@interface UIButton (BACountDown) + +@property (nonatomic, copy) void(^timeStoppedCallback)(); + +/** + 设置倒计时的间隔和倒计时文案 + + @param duration 倒计时时间 + @param format 可选,传nil默认为 @"%zd秒" + */ +- (void)ba_countDownWithTimeInterval:(NSTimeInterval)duration countDownFormat:(NSString *)format; + +/** + * invalidate timer + */ +- (void)ba_cancelTimer; + +@end diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.m b/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.m new file mode 100755 index 0000000..d86b458 --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BACountDown.m @@ -0,0 +1,103 @@ +// +// UIButton+BACountDown.m +// BAButton +// +// Created by 任子丰 on 16/6/17. +// Copyright © 2016年 任子丰. All rights reserved. +// + +#import "UIButton+BACountDown.h" +#import "BAButton.h" +#import + +@interface UIButton () + +@property (nonatomic, assign) NSTimeInterval leaveTime; +@property (nonatomic, copy) NSString *normalTitle; +@property (nonatomic, copy) NSString *countDownFormat; +@property (nonatomic, strong) dispatch_source_t timer; + +@end + +@implementation UIButton (BACountDown) + +- (void)setTimer:(dispatch_source_t)timer { + BAKit_Objc_setObj(@selector(timer), timer); +} + +- (dispatch_source_t)timer { + return BAKit_Objc_getObj; +} + +- (void)setLeaveTime:(NSTimeInterval)leaveTime { + BAKit_Objc_setObj(@selector(leaveTime), @(leaveTime)); +} + +- (NSTimeInterval)leaveTime { + return [BAKit_Objc_getObj doubleValue]; +} + +- (void)setCountDownFormat:(NSString *)countDownFormat { + BAKit_Objc_setObjCOPY(@selector(countDownFormat), countDownFormat); +} + +- (NSString *)countDownFormat { + return BAKit_Objc_getObj; +} + +- (void)setTimeStoppedCallback:(void (^)())timeStoppedCallback { + BAKit_Objc_setObjCOPY(@selector(timeStoppedCallback), timeStoppedCallback); +} + +- (void (^)())timeStoppedCallback { + return BAKit_Objc_getObj; +} + +- (void)setNormalTitle:(NSString *)normalTitle { + BAKit_Objc_setObjCOPY(@selector(normalTitle), normalTitle); +} + +- (NSString *)normalTitle { + return BAKit_Objc_getObj; +} + +#pragma mark - public + +- (void)ba_countDownWithTimeInterval:(NSTimeInterval)duration countDownFormat:(NSString *)format{ + if (!format){ + self.countDownFormat = @"%zd秒"; + } else { + self.countDownFormat = format; + } + self.normalTitle = self.titleLabel.text; + __block NSInteger timeOut = duration; //倒计时时间 + __weak typeof(self) weakSelf = self; + dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); + self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); + dispatch_source_set_timer(self.timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行 + dispatch_source_set_event_handler(self.timer, ^{ + if (timeOut <= 0) { // 倒计时结束,关闭 + [weakSelf ba_cancelTimer]; + } else { + NSString *title = [NSString stringWithFormat:weakSelf.countDownFormat,timeOut]; + dispatch_async(dispatch_get_main_queue(), ^{ + [weakSelf setTitle:title forState:UIControlStateNormal]; + }); + timeOut--; + } + }); + dispatch_resume(self.timer); +} + +- (void)ba_cancelTimer { + dispatch_source_cancel(self.timer); + self.timer = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + // 设置界面的按钮显示 根据自己需求设置 + [self setTitle:self.normalTitle forState:UIControlStateNormal]; + self.userInteractionEnabled = YES; + if (self.timeStoppedCallback) { self.timeStoppedCallback(); } + }); +} + +@end diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.h b/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.h new file mode 100644 index 0000000..84dc368 --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.h @@ -0,0 +1,235 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import +#import "UIView+BARectCorner.h" + +NS_ASSUME_NONNULL_BEGIN +/** + button 的样式,以图片为基准 + + - BAButtonLayoutTypeNormal: button 默认样式:内容居中-图左文右 + - BAButtonLayoutTypeCenterImageRight: 内容居中-图右文左 + - BAButtonLayoutTypeCenterImageTop: 内容居中-图上文下 + - BAButtonLayoutTypeCenterImageBottom: 内容居中-图下文上 + - BAButtonLayoutTypeLeftImageLeft: 内容居左-图左文右 + - BAButtonLayoutTypeLeftImageRight: 内容居左-图右文左 + - BAButtonLayoutTypeRightImageLeft: 内容居右-图左文右 + - BAButtonLayoutTypeRightImageRight: 内容居右-图右文左 + */ +typedef NS_ENUM(NSInteger, BAButtonLayoutType) { + BAButtonLayoutTypeNormal = 0, + BAButtonLayoutTypeCenterImageRight, + BAButtonLayoutTypeCenterImageTop, + BAButtonLayoutTypeCenterImageBottom, + BAButtonLayoutTypeLeftImageLeft, + BAButtonLayoutTypeLeftImageRight, + BAButtonLayoutTypeRightImageLeft, + BAButtonLayoutTypeRightImageRight, +}; + +@interface UIButton (BAKit) + +/** + button 的布局样式,默认为:BAButtonLayoutTypeNormal,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + */ +@property(nonatomic, assign) BAButtonLayoutType buttonLayoutType; + +/*! + * 文字与图片之间的间距,默认为:0 + */ +@property (nonatomic, assign) CGFloat padding; + +/*! + * 文字或图片距离 button 左右边界的最小距离,默认为:5 + */ +@property (nonatomic, assign) CGFloat padding_inset; + +/** + 快速设置 button 的布局样式 和 间距,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + @param type button 的布局样式 + @param padding 文字与图片之间的间距 + */ +- (void)ba_button_setBAButtonLayoutType:(BAButtonLayoutType)type padding:(CGFloat)padding; + +/** + 快速切圆角,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_button_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius; + +/** + * 给定框架创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame; + +/** + * 给定框架和字符串(字符串字体颜色默认是白色)创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title; + +/** + * 给定框架、字符串和背景图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage; + +/** + * 给定框架、字符串、背景图片和高亮背景图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage +highlightedBackgroundImage:(UIImage *)highlightedBackgroundImage; + +/** + * 给定框架、字符串、颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color; + +/** + * 给定框架、字符串、背景颜色和高亮背景颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +/** + * 给定框架、颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color; + +/** + * 给定框架、背景颜色和高亮背景颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +/** + * 给定框架和图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image; + +/** + * 给定框架、背景图片和高亮背景图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image + highlightedImage:(UIImage *)highlightedImage; + +/** + * 设置字符字体和大小 + */ +- (void)setTitleFont:(NSString *)fontName + size:(CGFloat)size; + +/** + * 设置字符颜色和高亮颜色 + */ +- (void)setTitleColor:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +#pragma mark - 快速创建 button +/** + 创建 button + + @param frame frame + @param title title + @param selTitle selTitle + @param titleColor titleColor,默认:黑色 + @param titleFont titleFont默认:15 + @param image image description + @param selImage selImage + @param padding padding 文字图片间距 + @param buttonLayoutType buttonLayoutType 文字图片布局样式 + @param viewRectCornerType viewRectCornerType 圆角样式 + @param viewCornerRadius viewCornerRadius 圆角角度 + @param target target + @param sel sel + @return button + */ ++ (instancetype __nonnull)ba_creatButtonWithFrame:(CGRect)frame + title:(NSString * __nullable)title + selTitle:(NSString * __nullable)selTitle + titleColor:(UIColor * __nullable)titleColor + titleFont:(UIFont * __nullable)titleFont + image:(UIImage * __nullable)image + selImage:(UIImage * __nullable)selImage + padding:(CGFloat)padding + buttonPositionStyle:(BAButtonLayoutType)buttonLayoutType + viewRectCornerType:(BAViewRectCornerType)viewRectCornerType + viewCornerRadius:(CGFloat)viewCornerRadius + target:(id __nullable)target + selector:(SEL __nullable)sel; + +@end +NS_ASSUME_NONNULL_END + + diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.m b/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.m new file mode 100644 index 0000000..00b86d7 --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BAKit.m @@ -0,0 +1,399 @@ +// +// UIButton+BAKit.m +// BAButtonDemo +// +// Created by boai on 2017/5/17. +// Copyright © 2017年 博爱之家. All rights reserved. +// + +#import "UIButton+BAKit.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIImage (BAKit) + ++ (UIImage *)imageWithColor:(UIColor *)color; + +@end + +@implementation UIImage (BAKit) + ++ (UIImage *)imageWithColor:(UIColor *)color +{ + CGRect rect = CGRectMake(0, 0, 1, 1); + UIGraphicsBeginImageContext(rect.size); + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSetFillColorWithColor(context, [color CGColor]); + + CGContextFillRect(context, rect); + UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return image; +} + +@end + +static void *buttonLayoutTypeKey = @"buttonLayoutTypeKey"; +static void *paddingKey = @"paddingKey"; +static void *padding_insetKey = @"padding_insetKey"; + +@implementation UIButton (BAKit) + +- (void)setupButtonLayout +{ + CGFloat image_w = self.imageView.frame.size.width; + CGFloat image_h = self.imageView.frame.size.height; + + CGFloat title_w = self.titleLabel.frame.size.width; + CGFloat title_h = self.titleLabel.frame.size.height; + + if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) + { + // 由于iOS8中titleLabel的size为0,用下面的这种设置 + title_w = self.titleLabel.intrinsicContentSize.width; + title_h = self.titleLabel.intrinsicContentSize.height; + } + + UIEdgeInsets imageEdge = UIEdgeInsetsZero; + UIEdgeInsets titleEdge = UIEdgeInsetsZero; + + if (self.padding_inset == 0) + { + self.padding_inset = 5; + } + + switch (self.buttonLayoutType) { + case BAButtonLayoutTypeNormal: + { + + titleEdge = UIEdgeInsetsMake(0, self.padding, 0, 0); + + imageEdge = UIEdgeInsetsMake(0, 0, 0, self.padding); + + } + break; + case BAButtonLayoutTypeCenterImageRight: + { + titleEdge = UIEdgeInsetsMake(0, -image_w - self.padding, 0, image_w); + imageEdge = UIEdgeInsetsMake(0, title_w + self.padding, 0, -title_w); + } + break; + case BAButtonLayoutTypeCenterImageTop: + { + titleEdge = UIEdgeInsetsMake(0, -image_w, -image_h - self.padding, 0); + imageEdge = UIEdgeInsetsMake(-title_h - self.padding, 0, 0, -title_w); + } + break; + case BAButtonLayoutTypeCenterImageBottom: + { + titleEdge = UIEdgeInsetsMake(-image_h - self.padding, -image_w, 0, 0); + imageEdge = UIEdgeInsetsMake(0, 0, -title_h - self.padding, -title_w); + } + break; + case BAButtonLayoutTypeLeftImageLeft: + { + titleEdge = UIEdgeInsetsMake(0, self.padding + self.padding_inset, 0, 0); + + imageEdge = UIEdgeInsetsMake(0, self.padding_inset, 0, 0); + + self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + } + break; + case BAButtonLayoutTypeLeftImageRight: + { + titleEdge = UIEdgeInsetsMake(0, -image_w + self.padding_inset, 0, 0); + imageEdge = UIEdgeInsetsMake(0, title_w + self.padding + self.padding_inset, 0, 0); + self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; + } + break; + case BAButtonLayoutTypeRightImageLeft: + { + imageEdge = UIEdgeInsetsMake(0, 0, 0, self.padding + self.padding_inset); + titleEdge = UIEdgeInsetsMake(0, 0, 0, self.padding_inset); + + self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight; + } + break; + case BAButtonLayoutTypeRightImageRight: + { + titleEdge = UIEdgeInsetsMake(0, 0, 0, image_w + self.padding + self.padding_inset); + imageEdge = UIEdgeInsetsMake(0, 0, 0, -title_w + self.padding_inset); + self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight; + } + break; + + default: + break; + } + self.imageEdgeInsets = imageEdge; + self.titleEdgeInsets = titleEdge; +} + +/** + 快速设置 button 的布局样式 和 间距 + + @param type button 的布局样式 + @param padding 文字与图片之间的间距 + */ +- (void)ba_button_setBAButtonLayoutType:(BAButtonLayoutType)type padding:(CGFloat)padding +{ + self.buttonLayoutType = type; + self.padding = padding; +} + +/** + 快速切圆角 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_button_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius +{ + [self ba_view_setBAViewRectCornerType:type viewCornerRadius:viewCornerRadius]; +} + +/* 给定框架创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame +{ + return [UIButton initWithFrame:frame + title:nil]; +} + +/* 给定框架和字符串(字符串字体颜色默认是白色)创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title +{ + return [UIButton initWithFrame:frame + title:title + backgroundImage:nil]; +} + +/* 给定框架、字符串和背景图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage +{ + return [UIButton initWithFrame:frame + title:title + backgroundImage:backgroundImage + highlightedBackgroundImage:nil]; +} + +/* 给定框架、字符串、背景图片和高亮背景图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage +highlightedBackgroundImage:(UIImage *)highlightedBackgroundImage +{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setFrame:frame]; + [button setTitle:title + forState:UIControlStateNormal]; + [button setBackgroundImage:backgroundImage + forState:UIControlStateNormal]; + [button setBackgroundImage:highlightedBackgroundImage + forState:UIControlStateHighlighted]; + return button; +} + +/* 给定框架、字符串、颜色创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color +{ + // 返回与'色'关联的颜色组件(包括透明度) + const CGFloat *components = CGColorGetComponents(color.CGColor); + return [UIButton initWithFrame:frame + title:title + backgroundImage:[UIImage imageWithColor:color] + highlightedBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:components[0]-0.1 + green:components[1]-0.1 + blue:components[2]-0.1 + alpha:1]]]; +} + +/* 给定框架、字符串、背景颜色和高亮背景颜色创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor +{ + return [UIButton initWithFrame:frame + title:title + backgroundImage:[UIImage imageWithColor:color] + highlightedBackgroundImage:[UIImage imageWithColor:highlightedColor]]; +} + +/* 给定框架、颜色创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color +{ + // 返回与'色'关联的颜色组件(包括透明度) + const CGFloat *components = CGColorGetComponents(color.CGColor); + return [UIButton initWithFrame:frame + title:nil + backgroundImage:[UIImage imageWithColor:color] + highlightedBackgroundImage:[UIImage imageWithColor:[UIColor colorWithRed:components[0]-0.1 + green:components[1]-0.1 + blue:components[2]-0.1 + alpha:1]]]; +} + +/* 给定框架、背景颜色和高亮背景颜色创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor +{ + return [UIButton initWithFrame:frame + title:nil + backgroundImage:[UIImage imageWithColor:color] + highlightedBackgroundImage:[UIImage imageWithColor:highlightedColor]]; +} + +/* 给定框架和图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image +{ + return [UIButton initWithFrame:frame + image:image + highlightedImage:nil]; +} + +/* 给定框架、背景图片和高亮背景图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image + highlightedImage:(UIImage *)highlightedImage +{ + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setFrame:frame]; + [button setImage:image + forState:UIControlStateNormal]; + [button setImage:highlightedImage + forState:UIControlStateHighlighted]; + return button; +} + +/* 设置字符字体和大小 */ +- (void)setTitleFont:(NSString *)fontName + size:(CGFloat)size +{ + [self.titleLabel setFont:[UIFont fontWithName:fontName size:size]]; +} + +/* 设置字符颜色和高亮颜色 */ +- (void)setTitleColor:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor +{ + [self setTitleColor:color + forState:UIControlStateNormal]; + [self setTitleColor:highlightedColor + forState:UIControlStateHighlighted]; +} + +#pragma mark - 快速创建 button +/** + 创建 button + + @param frame frame + @param title title + @param selTitle selTitle + @param titleColor titleColor,默认:黑色 + @param titleFont titleFont默认:15 + @param image image description + @param selImage selImage + @param padding padding 文字图片间距 + @param buttonLayoutType buttonLayoutType 文字图片布局样式 + @param viewRectCornerType viewRectCornerType 圆角样式 + @param viewCornerRadius viewCornerRadius 圆角角度 + @param target target + @param sel sel + @return button + */ ++ (instancetype __nonnull)ba_creatButtonWithFrame:(CGRect)frame + title:(NSString * __nullable)title + selTitle:(NSString * __nullable)selTitle + titleColor:(UIColor * __nullable)titleColor + titleFont:(UIFont * __nullable)titleFont + image:(UIImage * __nullable)image + selImage:(UIImage * __nullable)selImage + padding:(CGFloat)padding + buttonPositionStyle:(BAButtonLayoutType)buttonLayoutType + viewRectCornerType:(BAViewRectCornerType)viewRectCornerType + viewCornerRadius:(CGFloat)viewCornerRadius + target:(id __nullable)target + selector:(SEL __nullable)sel +{ + UIButton *button = [[UIButton alloc] init]; + button.frame = frame; + if (title) + { + [button setTitle:title forState:UIControlStateNormal]; + } + if (selTitle) + { + [button setTitle:selTitle forState:UIControlStateSelected]; + } + [button setTitleColor:titleColor ? titleColor : [UIColor blackColor] forState:UIControlStateNormal]; + + button.titleLabel.font = titleFont ? titleFont : [UIFont systemFontOfSize:15.0f]; + + if (selImage) + { + [button setImage:selImage forState:UIControlStateSelected]; + } + if (image) + { + [button setImage:image forState:UIControlStateNormal]; + } + [button ba_button_setBAButtonLayoutType:buttonLayoutType padding:padding]; + [button ba_button_setBAViewRectCornerType:viewRectCornerType viewCornerRadius:viewCornerRadius]; + [button addTarget:target action:sel forControlEvents:UIControlEventTouchUpInside]; + + return button; +} + +#pragma mark - setter / getter +- (void)setButtonLayoutType:(BAButtonLayoutType)buttonLayoutType +{ + objc_setAssociatedObject(self, buttonLayoutTypeKey, @(buttonLayoutType), OBJC_ASSOCIATION_ASSIGN); + [self setupButtonLayout]; +} + +- (BAButtonLayoutType)buttonLayoutType +{ + return [objc_getAssociatedObject(self, buttonLayoutTypeKey) integerValue]; +} + +- (void)setPadding:(CGFloat)padding +{ + objc_setAssociatedObject(self, paddingKey, @(padding), OBJC_ASSOCIATION_ASSIGN); + [self setupButtonLayout]; +} + +- (CGFloat)padding +{ + return [objc_getAssociatedObject(self, paddingKey) floatValue]; +} + +- (void)setPadding_inset:(CGFloat)padding_inset +{ + objc_setAssociatedObject(self, padding_insetKey, @(padding_inset), OBJC_ASSOCIATION_ASSIGN); + [self setupButtonLayout]; +} + +- (CGFloat)padding_inset +{ + return [objc_getAssociatedObject(self, padding_insetKey) floatValue]; +} + +- (void)setFrame:(CGRect)frame +{ + [super setFrame:frame]; + [self setupButtonLayout]; +} + +@end +NS_ASSUME_NONNULL_END + diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BAState.h b/Pods/BAButton/BAButton/BAButton/UIButton+BAState.h new file mode 100755 index 0000000..0a6330c --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BAState.h @@ -0,0 +1,85 @@ +// +// UIButton+BAState.h +// BAButton +// +// Created by 任子丰 on 17/5/25. +// Copyright © 2017年 boai. All rights reserved. +// + +#import +#import +NS_ASSUME_NONNULL_BEGIN + +@interface UIButton (BAState) +/** + * 获取当前borderColor + */ +@property(nonatomic, readonly, strong) UIColor *ba_currentBorderColor; + +/** + * 获取当前backgroundColor + */ +@property(nonatomic, readonly, strong) UIColor *ba_currentBackgroundColor; + +/** + * 获取当前titleLabelFont + */ +@property(nonatomic, readonly, strong) UIFont *ba_currentTitleLabelFont; + +/** + * 切换按钮状态时,执行动画的时间,默认0.25s(只有动画执行完毕后,才能会执行下一个点击事件) + */ +@property (nonatomic, assign) NSTimeInterval ba_animatedDuration; + +/** + * 设置不同状态下的borderColor(支持动画效果) + */ +- (void)ba_buttonSetborderColor:(UIColor *)borderColor forState:(UIControlState)state animated:(BOOL)animated; + +/** + * 设置不同状态下的backgroundColor(支持动画效果) + */ +- (void)ba_buttonSetBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state animated:(BOOL)animated; + +/** + * 设置不同状态下的titleLabelFont + */ +- (void)ba_buttonSetTitleLabelFont:(UIFont *)titleLabelFont forState:(UIControlState)state; + +/** + * 获取某个状态的borderColor + */ +- (UIColor *)ba_buttonBorderColorForState:(UIControlState)state; + +/** + * 获取某个状态的backgroundColor + */ +- (UIColor *)ba_buttonBackgroundColorForState:(UIControlState)state; + +/** + * 获取某个状态的titleLabelFont + */ +- (UIFont *)ba_buttonTitleLabelFontForState:(UIControlState)state; + +#pragma mark - 使用key-value方式设置 + +/** + * key:@(UIControlState枚举) + * 注:此方式无动画 + */ +- (void)ba_buttonConfigBorderColors:(NSDictionary *)borderColors; + +/** + * key:@(UIControlState枚举) + * 注:此方式无动画 + */ +- (void)ba_buttonConfigBackgroundColors:(NSDictionary *)backgroundColors; + +/** + * key:@(UIControlState枚举) + */ +- (void)ba_buttonConfigTitleLabelFont:(NSDictionary *)titleLabelFonts; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/BAButton/BAButton/BAButton/UIButton+BAState.m b/Pods/BAButton/BAButton/BAButton/UIButton+BAState.m new file mode 100755 index 0000000..2baaefc --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIButton+BAState.m @@ -0,0 +1,338 @@ +// +// UIButton+BAState.m +// BAButton +// +// Created by 任子丰 on 17/5/25. +// Copyright © 2017年 boai. All rights reserved. +// + +#define BABackgroundColorKEY(state) [NSString stringWithFormat:@"backgroundColor%zd",state] +#define BABorderColorKEY(state) [NSString stringWithFormat:@"borderColor%zd",state] + +#import "UIButton+BAState.h" +#import "BAButton.h" +#import + +// Model +@interface BAPropertyModel : NSObject + +@property (nonatomic, assign) UIControlState state; +@property (nonatomic, copy) NSString *keyPath; +@property (nonatomic, weak) id value; + ++ (instancetype)propertyModelWithValue:(nullable id)value keyPath:(NSString *)keyPath state:(UIControlState)state; + +@end + +@implementation BAPropertyModel + ++ (instancetype)propertyModelWithValue:(id)value keyPath:(NSString *)keyPath state:(UIControlState)state { + BAPropertyModel *model = [BAPropertyModel new]; + model.value = value; + model.keyPath = keyPath; + model.state = state; + return model; +} + +@end + +@interface UIButton () + +@property (nonatomic, strong) NSMutableDictionary *animates; +@property (nonatomic, strong) NSMutableDictionary *borderColors; +@property (nonatomic, strong) NSMutableDictionary *backgroundColors; +@property (nonatomic, strong) NSMutableDictionary *titleLabelFonts; +@property (nonatomic, strong) NSMutableArray *subViewPropertyArr; +@property (nonatomic, assign) NSInteger subViewTag; + +@end + +@implementation UIButton (BAState) + +#pragma mark - lefe cycle + ++ (void)load { + BAKit_Objc_exchangeMethodAToB(@selector(setHighlighted:), + @selector(ba_setHighlighted:)); + BAKit_Objc_exchangeMethodAToB(@selector(setEnabled:), + @selector(ba_setEnabled:)); + BAKit_Objc_exchangeMethodAToB(@selector(setSelected:), + @selector(ba_setSelected:)); +} + +#pragma mark - public method + +- (UIColor *)ba_currentBorderColor { + UIColor *color = [self ba_buttonBorderColorForState:self.state]; + if (!color) { + color = [UIColor colorWithCGColor:self.layer.borderColor]; + } + return color; +} + +- (UIColor *)ba_currentBackgroundColor { + UIColor *color = [self ba_buttonBackgroundColorForState:self.state]; + if (!color) { + color = self.backgroundColor; + } + return color; +} + +- (UIFont *)ba_currentTitleLabelFont { + UIFont *font = [self ba_buttonTitleLabelFontForState:(self.state-1)]; + if (!font) { + font = self.titleLabel.font; + } + return font; +} + +- (void)ba_buttonSetBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state animated:(BOOL)animated { + if (backgroundColor) { + [self.backgroundColors setObject:backgroundColor forKey:@(state)]; + [self.animates setObject:@(animated) forKey:BABackgroundColorKEY(state)]; + } + if(self.state == state) { + self.backgroundColor = backgroundColor; + } +} + +- (void)ba_buttonSetborderColor:(UIColor *)borderColor forState:(UIControlState)state animated:(BOOL)animated { + if (borderColor) { + [self.borderColors setObject:borderColor forKey:@(state)]; + [self.animates setObject:@(animated) forKey:BABorderColorKEY(state)]; + } + if(self.state == state) { + self.layer.borderColor = borderColor.CGColor; + } +} + +- (void)ba_buttonSetTitleLabelFont:(UIFont *)titleLabelFont forState:(UIControlState)state { + if (titleLabelFont) { + [self.titleLabelFonts setObject:titleLabelFont forKey:@(state)]; + } + if(self.state == state) { + self.titleLabel.font = titleLabelFont; + } +} + +- (UIColor *)ba_buttonBorderColorForState:(UIControlState)state { + return [self.borderColors objectForKey:@(state)]; +} + +- (UIColor *)ba_buttonBackgroundColorForState:(UIControlState)state { + return [self.backgroundColors objectForKey:@(state)]; +} + +- (UIFont *)ba_buttonTitleLabelFontForState:(UIControlState)state { + return [self.titleLabelFonts objectForKey:@(state)]; +} + +- (void)ba_buttonConfigBorderColors:(NSDictionary *)borderColors { + self.borderColors = [borderColors mutableCopy]; + [borderColors enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, UIColor * _Nonnull obj, BOOL * _Nonnull stop) { + [self.animates setObject:@(NO) forKey:BABorderColorKEY(key.integerValue)]; + }]; + [self updateButton]; +} + +- (void)ba_buttonConfigBackgroundColors:(NSDictionary *)backgroundColors { + self.backgroundColors = [backgroundColors mutableCopy]; + [backgroundColors enumerateKeysAndObjectsUsingBlock:^(NSNumber * _Nonnull key, UIColor * _Nonnull obj, BOOL * _Nonnull stop) { + [self.animates setObject:@(NO) forKey:BABackgroundColorKEY(key.integerValue)]; + }]; + [self updateButton]; +} + +- (void)ba_buttonConfigTitleLabelFont:(NSDictionary *)titleLabelFonts { + self.titleLabelFonts = [titleLabelFonts mutableCopy]; + [self updateButton]; +} + +#pragma mark - override + +- (void)ba_setSelected:(BOOL)selected { + [self ba_setSelected:selected]; + [self updateButton]; +} + +- (void)ba_setEnabled:(BOOL)enabled { + [self ba_setEnabled:enabled]; + [self updateButton]; +} + +- (void)ba_setHighlighted:(BOOL)highlighted { + [self ba_setHighlighted:highlighted]; + [self updateButton]; +} + +#pragma mark - private method + +- (void)updateButton { + // updateBackgroundColor + UIColor *backgroundColor = [self ba_buttonBackgroundColorForState:self.state]; + if (backgroundColor) { + [self updateBackgroundColor:backgroundColor]; + } else { + UIColor *normalColor = [self ba_buttonBackgroundColorForState:UIControlStateNormal]; + if (normalColor) { + [self updateBackgroundColor:normalColor]; + } + } + + // updateBorderColor + UIColor *borderColor = [self ba_buttonBorderColorForState:self.state]; + if (borderColor) { + [self updateBorderColor:borderColor]; + } else { + UIColor *normalColor = [self ba_buttonBorderColorForState:UIControlStateNormal]; + if (normalColor) { + [self updateBorderColor:normalColor]; + } + } + + // updateTitleLabelFont + UIFont *titleLabelFont = [self ba_buttonTitleLabelFontForState:self.state]; + if (titleLabelFont) { + self.titleLabel.font = titleLabelFont; + } else { + UIFont *normalFont = [self ba_buttonTitleLabelFontForState:UIControlStateNormal]; + if (normalFont) { + self.titleLabel.font = normalFont; + } + } + + // updateSubViewProperty + UIView *subView = [self viewWithTag:self.subViewTag]; + if (subView && self.subViewPropertyArr.count>0) { + [self.subViewPropertyArr enumerateObjectsUsingBlock:^(BAPropertyModel * _Nonnull model, NSUInteger idx, BOOL * _Nonnull stop) { + //点击一次,方法多次调用,model.value可能为nil,此时不应进入赋值,否则覆盖掉之前的值 + if (self.state == model.state && model.value) { + //转换成nil + id nullableValue = (model.value == [NSNull null]) ? nil : model.value; + [subView setValue:nullableValue forKeyPath:model.keyPath]; + } + }]; + } +} + +- (void)updateBackgroundColor:(UIColor *)backgroundColor { + NSNumber *animateValue = [self.animates objectForKey:BABackgroundColorKEY(self.state)]; + if (!animateValue) return;//不存在 + + if (animateValue.integerValue == self.subViewTag) { + self.backgroundColor = backgroundColor; + } else { //等于1 + [UIView animateWithDuration:self.ba_animatedDuration animations:^{ + self.backgroundColor = backgroundColor; + }]; + } +} + +- (void)updateBorderColor:(UIColor *)borderColor { + NSNumber *animateValue = [self.animates objectForKey:BABorderColorKEY(self.state)]; + + if (!animateValue) return;//不存在 + + if (animateValue.integerValue == 0) { + self.layer.borderColor = borderColor.CGColor; + [self.layer removeAnimationForKey:@"KEYAnimation"]; + } else {//等于1 + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"borderColor"]; + animation.fromValue = (__bridge id _Nullable)(self.layer.borderColor); + animation.toValue = (__bridge id _Nullable)(borderColor.CGColor); + animation.duration = self.ba_animatedDuration; + animation.removedOnCompletion = NO; + animation.fillMode = kCAFillModeForwards; + [self.layer addAnimation:animation forKey:@"KEYAnimation"]; + self.layer.borderColor = borderColor.CGColor; + } +} + +#pragma mark - getters and setters + +- (void)setAnimates:(NSMutableDictionary *)animates { + BAKit_Objc_setObj(@selector(animates),animates); +} + +- (NSMutableDictionary *)animates { + NSMutableDictionary *animates = BAKit_Objc_getObj; + if (!animates) { + animates = [NSMutableDictionary new]; + self.animates = animates; + } + return animates; +} + +- (void)setBorderColors:(NSMutableDictionary *)borderColors { + BAKit_Objc_setObj(@selector(borderColors),borderColors); +} + +- (NSMutableDictionary *)borderColors { + NSMutableDictionary *borderColors = BAKit_Objc_getObj; + if (!borderColors) { + borderColors = [NSMutableDictionary new]; + self.borderColors = borderColors; + } + return borderColors; +} + +- (void)setBackgroundColors:(NSMutableDictionary *)backgroundColors { + BAKit_Objc_setObj(@selector(backgroundColors),backgroundColors); +} + +- (NSMutableDictionary *)backgroundColors { + NSMutableDictionary *backgroundColors = BAKit_Objc_getObj; + if(!backgroundColors) { + backgroundColors = [[NSMutableDictionary alloc] init]; + self.backgroundColors = backgroundColors; + } + return backgroundColors; +} + +- (void)setTitleLabelFonts:(NSMutableDictionary *)titleLabelFonts { + BAKit_Objc_setObj(@selector(titleLabelFonts),titleLabelFonts); +} + +- (NSMutableDictionary *)titleLabelFonts { + NSMutableDictionary *titleLabelFonts = BAKit_Objc_getObj; + if(!titleLabelFonts) { + titleLabelFonts = [[NSMutableDictionary alloc] init]; + self.titleLabelFonts = titleLabelFonts; + } + return titleLabelFonts; +} + +- (void)setBa_animatedDuration:(NSTimeInterval)ba_animatedDuration { + BAKit_Objc_setObj(@selector(ba_animatedDuration),@(ba_animatedDuration)); +} + +- (NSTimeInterval)ba_animatedDuration { + NSTimeInterval duartion = [BAKit_Objc_getObj doubleValue]; + if (duartion == 0) { + duartion = 0.25; + } + return duartion; +} + +- (void)setSubViewPropertyArr:(NSMutableArray *)subViewPropertyArr { + BAKit_Objc_setObj(@selector(subViewPropertyArr),subViewPropertyArr); +} + +- (NSMutableArray *)subViewPropertyArr { + NSMutableArray *subViewPropertyArr = BAKit_Objc_getObj; + if(!subViewPropertyArr) { + subViewPropertyArr = [[NSMutableArray alloc] init]; + self.subViewPropertyArr = subViewPropertyArr; + } + return subViewPropertyArr; +} + +- (void)setSubViewTag:(NSInteger)subViewTag { + BAKit_Objc_setObj(@selector(subViewTag),@(subViewTag)); +} + +- (NSInteger)subViewTag { + return [BAKit_Objc_getObj integerValue]; +} + +@end diff --git a/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.h b/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.h new file mode 100644 index 0000000..d84caad --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.h @@ -0,0 +1,135 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +typedef NS_ENUM(NSInteger, BAViewRectCornerType) { + /*! + * 设置下左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeft = 0, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRight, + /*! + * 设置上左角 圆角半径 + */ + BAViewRectCornerTypeTopLeft, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeTopRight, + /*! + * 设置下左、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndBottomRight, + /*! + * 设置上左、上右角 圆角半径 + */ + BAViewRectCornerTypeTopLeftAndTopRight, + /*! + * 设置下左、上左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndTopLeft, + /*! + * 设置下右、上右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRight, + /*! + * 设置上左、上右、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft, + /*! + * 设置下右、上右、下左角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft, + /*! + * 设置全部四个角 圆角半径 + */ + BAViewRectCornerTypeAllCorners +}; + +@interface UIView (BARectCorner) + +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +@property (nonatomic, assign) BAViewRectCornerType viewRectCornerType; + +/*! + * 设置 button 圆角,如果要全部设置四个角的圆角,可以直接用这个方法,必须要在设置 frame 之后 + */ +@property (nonatomic, assign) CGFloat viewCornerRadius; + +/** + 快速切圆角 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_view_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius; + +@end diff --git a/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.m b/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.m new file mode 100644 index 0000000..86b8476 --- /dev/null +++ b/Pods/BAButton/BAButton/BAButton/UIView+BARectCorner.m @@ -0,0 +1,127 @@ +// +// UIView+BARectCorner.m +// BAButton +// +// Created by boai on 2017/5/19. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "UIView+BARectCorner.h" +#import +#import "BAButton.h" + +@implementation UIView (BARectCorner) + +- (void)ba_view_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius +{ + self.viewCornerRadius = viewCornerRadius; + self.viewRectCornerType = type; +} + +#pragma mark - view 的 角半径,默认 CGSizeMake(0, 0) +- (void)setupButtonCornerType +{ + UIRectCorner corners; + CGSize cornerRadii; + + cornerRadii = CGSizeMake(self.viewCornerRadius, self.viewCornerRadius); + if (self.viewCornerRadius == 0) + { + cornerRadii = CGSizeMake(0, 0); + } + + switch (self.viewRectCornerType) + { + case BAViewRectCornerTypeBottomLeft: + { + corners = UIRectCornerBottomLeft; + } + break; + case BAViewRectCornerTypeBottomRight: + { + corners = UIRectCornerBottomRight; + } + break; + case BAViewRectCornerTypeTopLeft: + { + corners = UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeTopRight: + { + corners = UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomLeftAndBottomRight: + { + corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; + } + break; + case BAViewRectCornerTypeTopLeftAndTopRight: + { + corners = UIRectCornerTopLeft | UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomLeftAndTopLeft: + { + corners = UIRectCornerBottomLeft | UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRight: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerBottomLeft; + } + break; + case BAViewRectCornerTypeAllCorners: + { + corners = UIRectCornerAllCorners; + } + break; + + default: + break; + } + + UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds + byRoundingCorners:corners + cornerRadii:cornerRadii]; + CAShapeLayer *maskLayer = [CAShapeLayer layer]; + maskLayer.frame = self.bounds; + maskLayer.path = maskPath.CGPath; + self.layer.mask = maskLayer; +} + +#pragma mark - setter / getter + +- (void)setViewRectCornerType:(BAViewRectCornerType)viewRectCornerType +{ + BAKit_Objc_setObj(@selector(viewRectCornerType), @(viewRectCornerType)); + [self setupButtonCornerType]; +} + +- (BAViewRectCornerType)viewRectCornerType +{ + return [BAKit_Objc_getObj integerValue]; +} + +- (void)setViewCornerRadius:(CGFloat)viewCornerRadius +{ + BAKit_Objc_setObj(@selector(viewCornerRadius), @(viewCornerRadius)); +} + +- (CGFloat)viewCornerRadius +{ + return [BAKit_Objc_getObj floatValue]; +} + +@end diff --git a/Pods/BAButton/LICENSE b/Pods/BAButton/LICENSE old mode 100644 new mode 100755 diff --git a/Pods/BAButton/README.md b/Pods/BAButton/README.md old mode 100644 new mode 100755 index 899c645..08c8b78 --- a/Pods/BAButton/README.md +++ b/Pods/BAButton/README.md @@ -1,62 +1,605 @@ # BAButton -自定义button +[![BAHome Team Name](https://img.shields.io/badge/Team-BAHome-brightgreen.svg?style=flat)](https://github.com/BAHome "BAHome Team") +![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) +![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg) +![](https://img.shields.io/cocoapods/v/BAButton.svg?style=flat) ![](https://img.shields.io/cocoapods/dt/BAButton.svg +) [![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123) ->**开发中如有问题,可以联系本人** +## 1、功能及简介 +* 1、UIButton 图片、文字自定义布局
+* 2、UIButton 自定义切圆角,可以设置任意一个角的角半径 +* 3、用 UIButton 的分类处理,处理更简单,一行代码轻松搞定所有 UIButton 自定义 +* 4、新增 UIButton 各种状态下背景颜色、字体、border、font、动画等的监测及改变 +* 5、新增 UIButton 倒计时的封装,两行代码搞定倒计时! +* 6、注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 -**新浪微博:@博爱1616** +## 2、图片示例 +![BAButton1](https://github.com/BAHome/BAButton/blob/master/Images/BAButton1.png) +![BAButton2](https://github.com/BAHome/BAButton/blob/master/Images/BAButton2.png) +![BAButton4](https://github.com/BAHome/BAButton/blob/master/Images/BAButton4.png) -**QQ: 137361770** +## 3、安装、导入示例和源码地址 +* 1、pod 导入【最新版本:![](https://img.shields.io/cocoapods/v/BAButton.svg?style=flat)】:
+ `pod 'BAButton'`
+如果发现 `pod search BAButton` 搜索出来的不是最新版本,需要在终端执行 cd 转换文件路径命令退回到 desktop,然后执行 `pod setup` 命令更新本地spec缓存(可能需要几分钟),然后再搜索就可以了。
+具体步骤: + - pod setup : 初始化 + - pod repo update : 更新仓库 + - pod search BAButton +* 2、文件夹拖入:下载demo,把 BAButton 文件夹拖入项目即可,
+* 3、导入头文件:
+` #import "BAButton.h" `
+* 4、项目源码地址:
+ OC 版 :[https://github.com/BAHome/BAButton](https://github.com/BAHome/BAButton)
-#### 对pod还是不熟的同学,可以看下我的博客,是最新的pod安装和使用方法, +## 4、BAButton 的类结构及 demo 示例 +![BAButton3](https://github.com/BAHome/BAButton/blob/master/Images/BAButton3.png) -###### http://www.cnblogs.com/boai/p/4977976.html +### BAButton.h +``` +#ifndef BAButton_h +#define BAButton_h + + +#import "UIButton+BAKit.h" +#import "UIButton+BAState.h" +#import "UIButton+BACountDown.h" +#import "UIView+BARectCorner.h" -# 更新记录: -## 2016.04.4 --- +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) -###示例展示: +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) -![image](https://raw.githubusercontent.com/boai/BAButton/master/BAButtonDemo/images/image1.png) -![image](https://raw.githubusercontent.com/boai/BAButton/master/BAButtonDemo/images/image2.png) +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA),class_getInstanceMethod([self class], methodB)); ->##完全实现button的自定义, +/*! 随机色 */ +CG_INLINE UIColor * +BAKit_ColorRandom(){ + return [UIColor colorWithRed:arc4random_uniform(255)/255.0 green:arc4random_uniform(255)/255.0 blue:arc4random_uniform(255)/255.0 alpha:1]; +} -###pod 导入:pod 'BAButton', '~> 1.0.0' +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BAButton + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.3】 + 更新内容: + 2.4.3.1、快速创建 button 方法改为类方法,可直接调用! + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.2】 + 更新内容: + 2.4.2.1、优化注释 + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.1】 + 更新内容: + 2.4.1.1、优化注释,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + 最新更新时间:2017-05-27 【倒叙】 + 最新Version:【Version:2.4.0】 + 更新内容: + 2.4.0.1、此版本由 [子丰大神](https://github.com/renzifeng) 亲自改版,再次感谢 [子丰大神](https://github.com/renzifeng) + 2.4.0.2、新增 UIButton 各种状态下背景颜色、字体、border、font、动画等的监测及改变 + 2.4.0.3、新增 UIButton 倒计时的封装,两行代码搞定倒计时! + 2.4.0.4、优化整体代码结构,代码规范! + + 最新更新时间:2017-05-26 【倒叙】 + 最新Version:【Version:2.3.2】 + 更新内容: + 2.3.2.1、优化代码结构,修复 frame 改变后 padding 无法更改的问题! + + 最新更新时间:2017-05-24 【倒叙】 + 最新Version:【Version:2.3.1】 + 更新内容: + 2.3.1.1、新增:padding_inset,文字或图片距离 button 左右边界的最小距离,默认为:5 + + 最新更新时间:2017-05-20 【倒叙】 + 最新Version:【Version:2.3.0】 + 更新内容: + 2.3.0.1、用分类全新重构 BAButton,代码配置更灵活 + 2.3.0.2、可以自由设置 button 的文字和图片的布局、间距、每个角的切圆角 + 2.3.0.3、全面适配 纯代码、xib、storyboard + 2.3.0.4、版本改动较大,希望大家谅解,如果用老版本的 BAButton,可以参考demo 更换新版本,后期改动不大 -###项目中导入头文件: +*/ + +#endif /* BAButton_h */ ``` -#import 即可 + +### UIButton+BAKit.h ``` +#import +#import "UIView+BARectCorner.h" + +NS_ASSUME_NONNULL_BEGIN +/** + button 的样式,以图片为基准 + + - BAButtonLayoutTypeNormal: button 默认样式:内容居中-图左文右 + - BAButtonLayoutTypeCenterImageRight: 内容居中-图右文左 + - BAButtonLayoutTypeCenterImageTop: 内容居中-图上文下 + - BAButtonLayoutTypeCenterImageBottom: 内容居中-图下文上 + - BAButtonLayoutTypeLeftImageLeft: 内容居左-图左文右 + - BAButtonLayoutTypeLeftImageRight: 内容居左-图右文左 + - BAButtonLayoutTypeRightImageLeft: 内容居右-图左文右 + - BAButtonLayoutTypeRightImageRight: 内容居右-图右文左 + */ +typedef NS_ENUM(NSInteger, BAButtonLayoutType) { + BAButtonLayoutTypeNormal = 0, + BAButtonLayoutTypeCenterImageRight, + BAButtonLayoutTypeCenterImageTop, + BAButtonLayoutTypeCenterImageBottom, + BAButtonLayoutTypeLeftImageLeft, + BAButtonLayoutTypeLeftImageRight, + BAButtonLayoutTypeRightImageLeft, + BAButtonLayoutTypeRightImageRight, +}; + +@interface UIButton (BAKit) + +/** + button 的布局样式,默认为:BAButtonLayoutTypeNormal,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + */ +@property(nonatomic, assign) BAButtonLayoutType buttonLayoutType; + +/*! + * 文字与图片之间的间距,默认为:0 + */ +@property (nonatomic, assign) CGFloat padding; + +/*! + * 文字或图片距离 button 左右边界的最小距离,默认为:5 + */ +@property (nonatomic, assign) CGFloat padding_inset; + +/** + 快速设置 button 的布局样式 和 间距,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + @param type button 的布局样式 + @param padding 文字与图片之间的间距 + */ +- (void)ba_button_setBAButtonLayoutType:(BAButtonLayoutType)type padding:(CGFloat)padding; + +/** + 快速切圆角,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_button_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius; + +/** + * 给定框架创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame; + +/** + * 给定框架和字符串(字符串字体颜色默认是白色)创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title; + +/** + * 给定框架、字符串和背景图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage; + +/** + * 给定框架、字符串、背景图片和高亮背景图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + backgroundImage:(UIImage *)backgroundImage +highlightedBackgroundImage:(UIImage *)highlightedBackgroundImage; + +/** + * 给定框架、字符串、颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color; + +/** + * 给定框架、字符串、背景颜色和高亮背景颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + title:(NSString *)title + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +/** + * 给定框架、颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color; + +/** + * 给定框架、背景颜色和高亮背景颜色创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + color:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +/** + * 给定框架和图片创建一个UIButton对象 + */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image; + +/** + * 给定框架、背景图片和高亮背景图片创建一个UIButton对象 */ ++ (id)initWithFrame:(CGRect)frame + image:(UIImage *)image + highlightedImage:(UIImage *)highlightedImage; + +/** + * 设置字符字体和大小 + */ +- (void)setTitleFont:(NSString *)fontName + size:(CGFloat)size; + +/** + * 设置字符颜色和高亮颜色 + */ +- (void)setTitleColor:(UIColor *)color + highlightedColor:(UIColor *)highlightedColor; + +#pragma mark - 快速创建 button +/** + 创建 button + + @param frame frame + @param title title + @param selTitle selTitle + @param titleColor titleColor,默认:黑色 + @param titleFont titleFont默认:15 + @param image image description + @param selImage selImage + @param padding padding 文字图片间距 + @param buttonLayoutType buttonLayoutType 文字图片布局样式 + @param viewRectCornerType viewRectCornerType 圆角样式 + @param viewCornerRadius viewCornerRadius 圆角角度 + @param target target + @param sel sel + @return button + */ ++ (instancetype __nonnull)ba_creatButtonWithFrame:(CGRect)frame + title:(NSString * __nullable)title + selTitle:(NSString * __nullable)selTitle + titleColor:(UIColor * __nullable)titleColor + titleFont:(UIFont * __nullable)titleFont + image:(UIImage * __nullable)image + selImage:(UIImage * __nullable)selImage + padding:(CGFloat)padding + buttonPositionStyle:(BAButtonLayoutType)buttonLayoutType + viewRectCornerType:(BAViewRectCornerType)viewRectCornerType + viewCornerRadius:(CGFloat)viewCornerRadius + target:(id __nullable)target + selector:(SEL __nullable)sel; + +@end +NS_ASSUME_NONNULL_END +``` + +### UIView+BARectCorner.h +``` +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +typedef NS_ENUM(NSInteger, BAViewRectCornerType) { + /*! + * 设置下左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeft = 0, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRight, + /*! + * 设置上左角 圆角半径 + */ + BAViewRectCornerTypeTopLeft, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeTopRight, + /*! + * 设置下左、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndBottomRight, + /*! + * 设置上左、上右角 圆角半径 + */ + BAViewRectCornerTypeTopLeftAndTopRight, + /*! + * 设置下左、上左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndTopLeft, + /*! + * 设置下右、上右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRight, + /*! + * 设置上左、上右、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft, + /*! + * 设置下右、上右、下左角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft, + /*! + * 设置全部四个角 圆角半径 + */ + BAViewRectCornerTypeAllCorners +}; + +@interface UIView (BARectCorner) + +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +@property (nonatomic, assign) BAViewRectCornerType viewRectCornerType; + +/*! + * 设置 button 圆角,如果要全部设置四个角的圆角,可以直接用这个方法,必须要在设置 frame 之后 + */ +@property (nonatomic, assign) CGFloat viewCornerRadius; + +/** + 快速切圆角 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_view_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius; +``` +### UIButton+BAState.h +``` +#import +#import +NS_ASSUME_NONNULL_BEGIN + +@interface UIButton (BAState) +/** + * 获取当前borderColor + */ +@property(nonatomic, readonly, strong) UIColor *ba_currentBorderColor; + +/** + * 获取当前backgroundColor + */ +@property(nonatomic, readonly, strong) UIColor *ba_currentBackgroundColor; + +/** + * 获取当前titleLabelFont + */ +@property(nonatomic, readonly, strong) UIFont *ba_currentTitleLabelFont; + +/** + * 切换按钮状态时,执行动画的时间,默认0.25s(只有动画执行完毕后,才能会执行下一个点击事件) + */ +@property (nonatomic, assign) NSTimeInterval ba_animatedDuration; + +/** + * 设置不同状态下的borderColor(支持动画效果) + */ +- (void)ba_buttonSetborderColor:(UIColor *)borderColor forState:(UIControlState)state animated:(BOOL)animated; + +/** + * 设置不同状态下的backgroundColor(支持动画效果) + */ +- (void)ba_buttonSetBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state animated:(BOOL)animated; + +/** + * 设置不同状态下的titleLabelFont + */ +- (void)ba_buttonSetTitleLabelFont:(UIFont *)titleLabelFont forState:(UIControlState)state; + +/** + * 获取某个状态的borderColor + */ +- (UIColor *)ba_buttonBorderColorForState:(UIControlState)state; + +/** + * 获取某个状态的backgroundColor + */ +- (UIColor *)ba_buttonBackgroundColorForState:(UIControlState)state; + +/** + * 获取某个状态的titleLabelFont + */ +- (UIFont *)ba_buttonTitleLabelFontForState:(UIControlState)state; + +#pragma mark - 使用key-value方式设置 + +/** + * key:@(UIControlState枚举) + * 注:此方式无动画 + */ +- (void)ba_buttonConfigBorderColors:(NSDictionary *)borderColors; + +/** + * key:@(UIControlState枚举) + * 注:此方式无动画 + */ +- (void)ba_buttonConfigBackgroundColors:(NSDictionary *)backgroundColors; + +/** + * key:@(UIControlState枚举) + */ +- (void)ba_buttonConfigTitleLabelFont:(NSDictionary *)titleLabelFonts; + +@end + +NS_ASSUME_NONNULL_END +``` + +### UIButton+BACountDown.h +``` +#import + +@interface UIButton (BACountDown) + +@property (nonatomic, copy) void(^timeStoppedCallback)(); + +/** + 设置倒计时的间隔和倒计时文案 + + @param duration 倒计时时间 + @param format 可选,传nil默认为 @"%zd秒" + */ +- (void)ba_countDownWithTimeInterval:(NSTimeInterval)duration countDownFormat:(NSString *)format; + +/** + * invalidate timer + */ +- (void)ba_cancelTimer; + +@end +``` + +### demo 示例 +``` +// 示例1: + // 注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + [self.normalButton ba_button_setBAButtonLayoutType:BAButtonLayoutTypeNormal padding:padding]; + [self.normalButton ba_button_setBAViewRectCornerType:BAViewRectCornerTypeBottomLeft viewCornerRadius:viewCornerRadius]; + +// 示例2: +- (void)setupNavi +{ + CGRect frame = CGRectMake(0, 0, 80, 40); + UIButton *navi_rightButton = [UIButton ba_creatButtonWithFrame:frame title:@"xib" selTitle:nil titleColor:nil titleFont:nil image:[UIImage imageNamed:@"tabbar_mainframeHL"] selImage:nil padding:2 buttonPositionStyle:BAButtonLayoutTypeCenterImageRight viewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:20 target:self selector:@selector(handleRightNaviButtonAction)]; + navi_rightButton.backgroundColor = BAKit_ColorRandom(); + self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:navi_rightButton]; + + UIButton *navi_leftButton = [UIButton ba_creatButtonWithFrame:frame title:@"state" selTitle:nil titleColor:nil titleFont:nil image:[UIImage imageNamed:@"tabbar_mainframeHL"] selImage:nil padding:2 buttonPositionStyle:BAButtonLayoutTypeCenterImageRight viewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:20 target:self selector:@selector(handleLeftNaviButtonAction)]; + navi_rightButton.backgroundColor = BAKit_ColorRandom(); + self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:navi_leftButton]; +} + +// 示例3:倒计时 +- (IBAction)countDownClick:(UIButton *)sender { + sender.userInteractionEnabled = NO; + __block UIButton *btn = sender; + [sender ba_countDownWithTimeInterval:60 countDownFormat:@"剩余 %zd"]; + [sender setTimeStoppedCallback:^{ + [btn setTitle:@"倒计时" forState:UIControlStateNormal]; + }]; +} + +- (IBAction)skipClick:(UIButton *)sender { + __block UIButton *btn = sender; + [sender ba_countDownWithTimeInterval:5 countDownFormat:@"跳过 %zd"]; + [sender setTimeStoppedCallback:^{ + [btn setTitle:@"跳过" forState:UIControlStateNormal]; + }]; +} + +其他示例可下载demo查看源码! +``` + +## 5、更新记录:【倒叙】 + 欢迎使用 [【BAHome】](https://github.com/BAHome) 系列开源代码 ! + 如有更多需求,请前往:[【https://github.com/BAHome】](https://github.com/BAHome) + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.3】 + 更新内容: + 2.4.3.1、快速创建 button 方法改为类方法,可直接调用! + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.2】 + 更新内容: + 2.4.2.1、优化注释 + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:2.4.1】 + 更新内容: + 2.4.1.1、优化注释,注意:文字、字体大小、图片等设置一定要在设置 ba_button_setBAButtonLayoutType 之前设置,要不然计算会以默认字体大小计算,导致位置偏移 + + 最新更新时间:2017-05-27 【倒叙】 + 最新Version:【Version:2.4.0】 + 更新内容: + 2.4.0.1、此版本由 [子丰大神](https://github.com/renzifeng) 亲自改版,再次感谢 [子丰大神](https://github.com/renzifeng) + 2.4.0.2、新增 UIButton 各种状态下背景颜色、字体、border、font、动画等的监测及改变 + 2.4.0.3、新增 UIButton 倒计时的封装,两行代码搞定倒计时! + 2.4.0.4、优化整体代码结构,代码规范! + + 最新更新时间:2017-05-26 【倒叙】 + 最新Version:【Version:2.3.2】 + 更新内容: + 2.3.2.1、优化代码结构,修复 frame 改变后 padding 无法更改的问题! + + 最新更新时间:2017-05-24 【倒叙】 + 最新Version:【Version:2.3.1】 + 更新内容: + 2.3.1.1、新增:padding_inset,文字或图片距离 button 左右边界的最小距离,默认为:5 + + 最新更新时间:2017-05-20 【倒叙】 + 最新Version:【Version:2.3.0】
+ 更新内容:
+ 2.3.0.1、用分类全新重构 BAButton,代码配置更灵活
+ 2.3.0.2、可以自由设置 button 的文字和图片的布局、间距、每个角的切圆角
+ 2.3.0.3、全面适配 纯代码、xib、storyboard
+ 2.3.0.4、版本改动较大,希望大家谅解,如果用老版本的 BAButton,可以参考demo 更换新版本,后期改动不大
+ +* 2017-04-24
+最新Version:【Version:2.2.1】
+更新内容:
+2.2.1.1、新增快速创建button 的demo,和 自定义 naviButton demo + +* 2017-03-15
+ 最新Version:【Version:2.2.1】
+ 更新内容:
+ 2.2.1.1、button 的 角半径 buttonCornerRadii,默认 CGSizeMake(0, 0) + +* 2017-03-02
+ 最新Version:【Version:2.2.0】
+ 更新内容:
+ 2.2.0.1、修复 buttonCornerRadii 只能在添加frame 后设置才能有效的问题,现在可以随意设置
+ 2.2.0.2、新增设置文字或和图片间距,举个🌰:self.padding = 10; + +* 2017-02-28 【倒叙】
+ 最新Version:【Version:2.1.0】
+ 更新内容:
+ 2.1.1、继承自 UIButton 可以像 UIButton 一样随便添加系统属性
+ 2.1.2、可以单独设置文字和图片的位置
+ 2.1.3、还可以设置文字或者图片间距
+ 2.1.4、可以设置按钮的任意一个角的圆角度数
+ 2.1.4、全面适配纯代码、xib、storyboard +* 2016.03.04
+pod 最新上架,修复部分已知bug,代码更精简! + +## 6、bug 反馈 和 联系方式 +> 1、开发中遇到 bug,希望小伙伴儿们能够及时反馈与我们 BAHome 团队,我们必定会认真对待每一个问题!
-``` 用枚举展示button的类型: -BAAligenmentStatusNormal, // 默认 -BAAligenmentStatusLeft, // 左对齐 -BAAligenmentStatusCenter, // 居中对齐 -BAAligenmentStatusRight, // 右对齐 -BAAligenmentStatusTop, // 图标在上,文本在下(居中) -BAAligenmentStatusBottom, // 图标在下,文本在上(居中) +> 2、联系方式
+QQ群:479663605 【注意:此群为 2 元 付费群,介意的小伙伴儿勿扰!】
+博爱QQ:137361770
+博爱微博:[![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123)
-BACustomButton *btn1 = [BACustomButton BA_ShareButton]; -[btn1 setBackgroundColor:[UIColor greenColor]]; -[btn1 setImage:[UIImage imageNamed:@"btn_share"] forState:UIControlStateNormal]; -[btn1 setTitle:@"左对齐[文字左图片右]" forState:UIControlStateNormal]; -[btn1 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; -btn1.buttonStatus = BAAligenmentStatusLeft; -btn1.buttonCornerRadius = 5.0; -btn1.titleLabel.font = [UIFont systemFontOfSize:15]; -btn1.frame = CGRectMake(CGRectGetMinX(btn.frame), CGRectGetMaxY(btn.frame) + 10, 200, 50); -[self.view addSubview:btn1]; +## 7、开发环境 和 支持版本 +> 开发使用 Xcode Version 8.3.2 (8E2002) ,理论上支持所有 iOS 版本,如有版本适配问题,请及时反馈!多谢合作! -BACustomButton *btn5 = [[BACustomButton alloc] initWitAligenmentStatus:BAAligenmentStatusTop]; -[btn5 setBackgroundColor:[UIColor greenColor]]; -[btn5 setImage:[UIImage imageNamed:@"btn_share"] forState:UIControlStateNormal]; -[btn5 setTitle:@"图片在上,文字在下" forState:UIControlStateNormal]; -btn5.titleLabel.font = [UIFont systemFontOfSize:10]; -btn5.buttonCornerRadius = 5.0; -[btn5 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; -btn5.frame = CGRectMake(CGRectGetMinX(btn.frame), CGRectGetMaxY(btn4.frame) + 10, 200, 80); -[self.view addSubview:btn5]; +## 8、感谢 +> 感谢 BAHome 团队成员倾力合作,后期会推出一系列 常用 UI 控件的封装,大家有需求得也可以在 issue 提出,如果合理,我们会尽快推出新版本!
+> BAHome 的发展离不开小伙伴儿的信任与推广,再次感谢各位小伙伴儿的支持! diff --git a/Pods/BANetManager/BANetManager/BANetManager.h b/Pods/BANetManager/BANetManager/BANetManager.h new file mode 100644 index 0000000..3cb2686 --- /dev/null +++ b/Pods/BANetManager/BANetManager/BANetManager.h @@ -0,0 +1,386 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 最新更新时间:2017-05-03 【倒叙】 + 最新Version:【Version:2.2.2】 + 更新内容: + 2.2.1、优化方法名命名规范 + 2.2.2、优化网络状态实时监测 block 回调,去除多余设置,需要网络判断,直接调用block回调即可 + 2.2.3、新增 YYCache 缓存处理 + 2.2.4、新增自定义:超时设置 + 2.2.5、新增自定义:requestSerializer设置 + 2.2.6、新增自定义:responseSerializer设置 + 2.2.7、新增自定义:请求头设置 + 2.2.8、新增自定义 CA 证书 和 HTTPS 请求配置,只需把证书导入项目目录即可,无需设置 + 2.2.9、新增史上最全的 AFN 请求 NSLog 打印,详见 demo 控制台打印结果 + 2.2.10、新增 DEBUG 模式下的 NSLog 判断,release 下不会打印,请放心使用 + 2.2.11、如果打印数据不完整,是因为 Xcode 8 版本问题,请下断点打印数据 + 2.2.12、由于新版本改动较大,原有方法命名可能有所改动,希望老用户见谅! + 2.2.13、目前版本较稳定,稍后奉上 pod 版本!请大家耐心等待 + + + 最新更新时间:2016-11-24 【倒叙】 + 最新Version:【Version:2.1】 + 更新内容: + 2.1.1、优化方法名命名规范 + 2.1.2、新增网络状态实时监测 block 回调,新增单独网络监测 bool 返回,详见 demo + 2.1.3、新增旧方法更新提示 + 2.1.4、优化各种注释 + + 最新更新时间:2016-11-17 + 最新Version:【Version:2.0】 + 更新内容: + 2.0.1、优化方法名命名规范 + 2.0.2、新增部分注释 + 2.0.3、视频上传方法对接,目前有很多项目对接成功 + */ +#import +#import + + +#define BANetManagerShare [BANetManager sharedBANetManager] + +#define BAWeak __weak __typeof(self) weakSelf = self + +/*! 过期属性或方法名提醒 */ +#define BANetManagerDeprecated(instead) __deprecated_msg(instead) + + +/*! 使用枚举NS_ENUM:区别可判断编译器是否支持新式枚举,支持就使用新的,否则使用旧的 */ +typedef NS_ENUM(NSUInteger, BANetworkStatus) +{ + /*! 未知网络 */ + BANetworkStatusUnknown = 0, + /*! 没有网络 */ + BANetworkStatusNotReachable, + /*! 手机 3G/4G 网络 */ + BANetworkStatusReachableViaWWAN, + /*! wifi 网络 */ + BANetworkStatusReachableViaWiFi +}; + +/*!定义请求类型的枚举 */ +typedef NS_ENUM(NSUInteger, BAHttpRequestType) +{ + /*! get请求 */ + BAHttpRequestTypeGet = 0, + /*! post请求 */ + BAHttpRequestTypePost, + /*! put请求 */ + BAHttpRequestTypePut, + /*! delete请求 */ + BAHttpRequestTypeDelete +}; + +typedef NS_ENUM(NSUInteger, BAHttpRequestSerializer) { + /** 设置请求数据为JSON格式*/ + BAHttpRequestSerializerJSON, + /** 设置请求数据为HTTP格式*/ + BAHttpRequestSerializerHTTP, +}; + +typedef NS_ENUM(NSUInteger, BAHttpResponseSerializer) { + /** 设置响应数据为JSON格式*/ + BAHttpResponseSerializerJSON, + /** 设置响应数据为HTTP格式*/ + BAHttpResponseSerializerHTTP, +}; + +/*! 实时监测网络状态的 block */ +typedef void(^BANetworkStatusBlock)(BANetworkStatus status); + +/*! 定义请求成功的 block */ +typedef void( ^ BAResponseSuccess)(id response); +/*! 定义请求失败的 block */ +typedef void( ^ BAResponseFail)(NSError *error); + +/*! 定义上传进度 block */ +typedef void( ^ BAUploadProgress)(int64_t bytesProgress, + int64_t totalBytesProgress); +/*! 定义下载进度 block */ +typedef void( ^ BADownloadProgress)(int64_t bytesProgress, + int64_t totalBytesProgress); + +/*! + * 方便管理请求任务。执行取消,暂停,继续等任务. + * - (void)cancel,取消任务 + * - (void)suspend,暂停任务 + * - (void)resume,继续任务 + */ +typedef NSURLSessionTask BAURLSessionTask; + + +@interface BANetManager : NSObject + +/** + 创建的请求的超时间隔(以秒为单位),此设置为全局统一设置一次即可,默认超时时间间隔为30秒。 + */ +@property (nonatomic, assign) NSTimeInterval timeoutInterval; + +/** + 设置网络请求参数的格式,此设置为全局统一设置一次即可,默认:BAHttpRequestSerializerJSON + */ +@property (nonatomic, assign) BAHttpRequestSerializer requestSerializer; + +/** + 设置服务器响应数据格式,此设置为全局统一设置一次即可,默认:BAHttpResponseSerializerJSON + */ +@property (nonatomic, assign) BAHttpResponseSerializer responseSerializer; + +/** + 自定义请求头:httpHeaderField + */ +@property(nonatomic, strong) NSDictionary *httpHeaderFieldDictionary; + +/*! + * 获得全局唯一的网络请求实例单例方法 + * + * @return 网络请求类BANetManager单例 + */ ++ (instancetype)sharedBANetManager; + + +#pragma mark - 网络请求的类方法 --- get / post / put / delete +/** + 网络请求的实例方法 get + + @param urlString 请求的地址 + @param isNeedCache 是否需要缓存,只有 get / post 请求有缓存配置 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_GETWithUrlString:(NSString *)urlString + isNeedCache:(BOOL)isNeedCache + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress; + +/** + 网络请求的实例方法 post + + @param urlString 请求的地址 + @param isNeedCache 是否需要缓存,只有 get / post 请求有缓存配置 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_POSTWithUrlString:(NSString *)urlString + isNeedCache:(BOOL)isNeedCache + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress; + +/** + 网络请求的实例方法 put + + @param urlString 请求的地址 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_PUTWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress; + +/** + 网络请求的实例方法 delete + + @param urlString 请求的地址 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_DELETEWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress; + +/** + 上传图片(多图) + + @param urlString 上传的url + @param parameters 上传图片预留参数---视具体情况而定 可移除 + @param imageArray 上传的图片数组 + @param fileName 上传的图片数组fileName + @param successBlock 上传成功的回调 + @param failureBlock 上传失败的回调 + @param progress 上传进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + imageArray:(NSArray *)imageArray + fileName:(NSString *)fileName + successBlock:(BAResponseSuccess)successBlock + failurBlock:(BAResponseFail)failureBlock + upLoadProgress:(BAUploadProgress)progress; + +/** + 视频上传 + + @param urlString 上传的url + @param parameters 上传视频预留参数---视具体情况而定 可移除 + @param videoPath 上传视频的本地沙河路径 + @param successBlock 成功的回调 + @param failureBlock 失败的回调 + @param progress 上传的进度 + */ ++ (void)ba_uploadVideoWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + videoPath:(NSString *)videoPath + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + uploadProgress:(BAUploadProgress)progress; + +/** + 文件下载 + + @param urlString 请求的url + @param parameters 文件下载预留参数---视具体情况而定 可移除 + @param savePath 下载文件保存路径 + @param successBlock 下载文件成功的回调 + @param failureBlock 下载文件失败的回调 + @param progress 下载文件的进度显示 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + savaPath:(NSString *)savePath + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + downLoadProgress:(BADownloadProgress)progress; + +#pragma mark - 网络状态监测 +/*! + * 开启实时网络状态监测,通过Block回调实时获取(此方法可多次调用) + */ ++ (void)ba_startNetWorkMonitoringWithBlock:(BANetworkStatusBlock)networkStatus; + +#pragma mark - 自定义请求头 +/** + * 自定义请求头 + */ ++ (void)ba_setValue:(NSString *)value forHTTPHeaderKey:(NSString *)HTTPHeaderKey; + +#pragma mark - 取消 Http 请求 +/*! + * 取消所有 Http 请求 + */ ++ (void)ba_cancelAllRequest; + +/*! + * 取消指定 URL 的 Http 请求 + */ ++ (void)ba_cancelRequestWithURL:(NSString *)URL; + + +#pragma mark - 各版本过期方法名 +#pragma mark version 2.0 过期方法名 +//+ (BAURLSessionTask *)ba_requestWithType:(BAHttpRequestType)type +// UrlString:(NSString *)urlString +// Parameters:(NSDictionary *)parameters +// SuccessBlock:(BAResponseSuccess)successBlock +// FailureBlock:(BAResponseFail)failureBlock +// progress:(BADownloadProgress)progress BANetManagerDeprecated("该方法已过期,请使用最新方法:+ (BAURLSessionTask *)ba_requestWithType:(BAHttpRequestType)type urlString:(NSString *)urlString parameters:(NSDictionary *)parameters successBlock:(BAResponseSuccess)successBlock failureBlock:(BAResponseFail)failureBlock progress:(BADownloadProgress)progress"); + +//+ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString +// parameters:(NSDictionary *)parameters +// ImageArray:(NSArray *)imageArray +// FileName:(NSString *)fileName +// SuccessBlock:(BAResponseSuccess)successBlock +// FailurBlock:(BAResponseFail)failureBlock +// UpLoadProgress:(BAUploadProgress)progress BANetManagerDeprecated("该方法已过期,请使用最新方法:+ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString parameters:(NSDictionary *)parameters imageArray:(NSArray *)imageArray fileName:(NSString *)fileName successBlock:(BAResponseSuccess)successBlock failurBlock:(BAResponseFail)failureBlock upLoadProgress:(BAUploadProgress)progress"); +// +//+ (void)ba_uploadVideoWithUrlString:(NSString *)urlString +// parameters:(NSDictionary *)parameters +// VideoPath:(NSString *)videoPath +// SuccessBlock:(BAResponseSuccess)successBlock +// FailureBlock:(BAResponseFail)failureBlock +// UploadProgress:(BAUploadProgress)progress BANetManagerDeprecated("该方法已过期,请使用最新方法:+ (void)ba_uploadVideoWithUrlString:(NSString *)urlString parameters:(NSDictionary *)parameters videoPath:(NSString *)videoPath successBlock:(BAResponseSuccess)successBlock failureBlock:(BAResponseFail)failureBlock uploadProgress:(BAUploadProgress)progress"); +// +//+ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString +// parameters:(NSDictionary *)parameters +// SavaPath:(NSString *)savePath +// SuccessBlock:(BAResponseSuccess)successBlock +// FailureBlock:(BAResponseFail)failureBlock +// DownLoadProgress:(BADownloadProgress)progress BANetManagerDeprecated("该方法已过期,请使用最新方法:+ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString parameters:(NSDictionary *)parameters savaPath:(NSString *)savePath successBlock:(BAResponseSuccess)successBlock failureBlock:(BAResponseFail)failureBlock downLoadProgress:(BADownloadProgress)progress"); + +@end diff --git a/Pods/BANetManager/BANetManager/BANetManager.m b/Pods/BANetManager/BANetManager/BANetManager.m new file mode 100644 index 0000000..029babf --- /dev/null +++ b/Pods/BANetManager/BANetManager/BANetManager.m @@ -0,0 +1,958 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import "BANetManager.h" + +#import +#import +#import + +/*! 系统相册 */ +#import +#import +#import +#import + + +#import "AFNetworking.h" +#import "AFNetworkActivityIndicatorManager.h" + +#import "UIImage+CompressImage.h" + +#import "BANetManagerCache.h" + + +static NSMutableArray *tasks; + +//static void *isNeedCacheKey = @"isNeedCacheKey"; + +#ifndef __OPTIMIZE__ +#define NSLog(...) NSLog(__VA_ARGS__) +#else +#define NSLog(...){} +#endif + +@interface BANetManager () + +@property(nonatomic, strong) AFHTTPSessionManager *sessionManager; + +@end + +@implementation BANetManager + ++ (instancetype)sharedBANetManager +{ + /*! 为单例对象创建的静态实例,置为nil,因为对象的唯一性,必须是static类型 */ + static id sharedBANetManager = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedBANetManager = [[super allocWithZone:NULL] init]; + }); + return sharedBANetManager; +} + ++ (void)initialize +{ + [self setupBANetManager]; +} + ++ (void)setupBANetManager +{ + BANetManagerShare.sessionManager = [AFHTTPSessionManager manager]; + + BANetManagerShare.requestSerializer = BAHttpRequestSerializerJSON; + BANetManagerShare.responseSerializer = BAHttpResponseSerializerJSON; + + /*! 设置请求超时时间,默认:30秒 */ + BANetManagerShare.timeoutInterval = 30; + /*! 打开状态栏的等待菊花 */ + [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; + /*! 设置返回数据类型为 json, 分别设置请求以及相应的序列化器 */ + /*! + 根据服务器的设定不同还可以设置: + json:[AFJSONResponseSerializer serializer](常用) + http:[AFHTTPResponseSerializer serializer] + */ +// AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer]; +// /*! 这里是去掉了键值对里空对象的键值 */ +//// response.removesKeysWithNullValues = YES; +// BANetManagerShare.sessionManager.responseSerializer = response; + + /* 设置请求服务器数类型式为 json */ + /*! + 根据服务器的设定不同还可以设置: + json:[AFJSONRequestSerializer serializer](常用) + http:[AFHTTPRequestSerializer serializer] + */ +// AFJSONRequestSerializer *request = [AFJSONRequestSerializer serializer]; +// BANetManagerShare.sessionManager.requestSerializer = request; + /*! 设置apikey ------类似于自己应用中的tokken---此处仅仅作为测试使用*/ + // [manager.requestSerializer setValue:apikey forHTTPHeaderField:@"apikey"]; + + /*! 复杂的参数类型 需要使用json传值-设置请求内容的类型*/ + // [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; + + /*! 设置响应数据的基本类型 */ + BANetManagerShare.sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/css", @"text/xml", @"text/plain", @"application/javascript", @"image/*", nil]; + + // 配置自建证书的Https请求 + [self ba_setupSecurityPolicy]; +} + +/** + 配置自建证书的Https请求,只需要将CA证书文件放入根目录就行 + */ ++ (void)ba_setupSecurityPolicy +{ + // NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; + NSSet *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]; + + if (cerSet.count == 0) + { + /*! + 采用默认的defaultPolicy就可以了. AFN默认的securityPolicy就是它, 不必另写代码. AFSecurityPolicy类中会调用苹果security.framework的机制去自行验证本次请求服务端放回的证书是否是经过正规签名. + */ + AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy]; + securityPolicy.allowInvalidCertificates = YES; + securityPolicy.validatesDomainName = NO; + BANetManagerShare.sessionManager.securityPolicy = securityPolicy; + } + else + { + /*! 自定义的CA证书配置如下: */ + /*! 自定义security policy, 先前确保你的自定义CA证书已放入工程Bundle */ + /*! + https://api.github.com网址的证书实际上是正规CADigiCert签发的, 这里把Charles的CA根证书导入系统并设为信任后, 把Charles设为该网址的SSL Proxy (相当于"中间人"), 这样通过代理访问服务器返回将是由Charles伪CA签发的证书. + */ + // 使用证书验证模式 + AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet]; + // 如果需要验证自建证书(无效证书),需要设置为YES + securityPolicy.allowInvalidCertificates = YES; + // 是否需要验证域名,默认为YES + // securityPolicy.pinnedCertificates = [[NSSet alloc] initWithObjects:cerData, nil]; + + BANetManagerShare.sessionManager.securityPolicy = securityPolicy; + + + /*! 如果服务端使用的是正规CA签发的证书, 那么以下几行就可去掉: */ + // NSSet *cerSet = [AFSecurityPolicy certificatesInBundle:[NSBundle mainBundle]]; + // AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:cerSet]; + // policy.allowInvalidCertificates = YES; + // BANetManagerShare.sessionManager.securityPolicy = policy; + } +} + +/** + 网络请求的实例方法 get + + @param urlString 请求的地址 + @param isNeedCache 是否需要缓存,只有 get / post 请求有缓存配置 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_GETWithUrlString:(NSString *)urlString + isNeedCache:(BOOL)isNeedCache + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress +{ + return [self ba_requestWithType:BAHttpRequestTypeGet isNeedCache:isNeedCache urlString:urlString parameters:parameters successBlock:successBlock failureBlock:failureBlock progress:progress]; +} + +/** + 网络请求的实例方法 post + + @param urlString 请求的地址 + @param isNeedCache 是否需要缓存,只有 get / post 请求有缓存配置 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_POSTWithUrlString:(NSString *)urlString + isNeedCache:(BOOL)isNeedCache + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress +{ + return [self ba_requestWithType:BAHttpRequestTypePost isNeedCache:isNeedCache urlString:urlString parameters:parameters successBlock:successBlock failureBlock:failureBlock progress:progress]; +} + +/** + 网络请求的实例方法 put + + @param urlString 请求的地址 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_PUTWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress +{ + return [self ba_requestWithType:BAHttpRequestTypePut isNeedCache:NO urlString:urlString parameters:parameters successBlock:successBlock failureBlock:failureBlock progress:progress]; +} + +/** + 网络请求的实例方法 delete + + @param urlString 请求的地址 + @param parameters 请求的参数 + @param successBlock 请求成功的回调 + @param failureBlock 请求失败的回调 + @param progress 进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_request_DELETEWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress +{ + return [self ba_requestWithType:BAHttpRequestTypeDelete isNeedCache:NO urlString:urlString parameters:parameters successBlock:successBlock failureBlock:failureBlock progress:progress]; +} + +#pragma mark - 网络请求的类方法 --- get / post / put / delete +/*! + * 网络请求的实例方法 + * + * @param type get / post / put / delete + * @param isNeedCache 是否需要缓存,只有 get / post 请求有缓存配置 + * @param urlString 请求的地址 + * @param parameters 请求的参数 + * @param successBlock 请求成功的回调 + * @param failureBlock 请求失败的回调 + * @param progress 进度 + */ ++ (BAURLSessionTask *)ba_requestWithType:(BAHttpRequestType)type + isNeedCache:(BOOL)isNeedCache + urlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + progress:(BADownloadProgress)progress +{ + if (urlString == nil) + { + return nil; + } + + BAWeak; + /*! 检查地址中是否有中文 */ + NSString *URLString = [NSURL URLWithString:urlString] ? urlString : [self strUTF8Encoding:urlString]; + + NSString *requestType; + switch (type) { + case 0: + requestType = @"GET"; + break; + case 1: + requestType = @"POWT"; + break; + case 2: + requestType = @"PUT"; + break; + case 3: + requestType = @"DELETE"; + break; + + default: + break; + } + + AFHTTPSessionManager *scc = BANetManagerShare.sessionManager; + AFHTTPResponseSerializer *scc2 = scc.responseSerializer; + AFHTTPRequestSerializer *scc3 = scc.requestSerializer; + NSTimeInterval timeoutInterval = BANetManagerShare.timeoutInterval; + + NSString *isCache = isNeedCache ? @"开启":@"关闭"; + CGFloat allCacheSize = [BANetManagerCache ba_getAllHttpCacheSize]; + + NSLog(@"\n******************** 请求参数 ***************************"); + NSLog(@"\n请求头: %@\n超时时间设置:%.1f 秒【默认:30秒】\nAFHTTPResponseSerializer:%@【默认:AFJSONResponseSerializer】\nAFHTTPRequestSerializer:%@【默认:AFJSONRequestSerializer】\n请求方式: %@\n请求URL: %@\n请求param: %@\n是否启用缓存:%@【默认:开启】\n目前总缓存大小:%.6fM\n", BANetManagerShare.sessionManager.requestSerializer.HTTPRequestHeaders, timeoutInterval, scc2, scc3, requestType, URLString, parameters, isCache, allCacheSize); + NSLog(@"\n********************************************************"); + + BAURLSessionTask *sessionTask = nil; + + // 读取缓存 + id responseCacheData = [BANetManagerCache ba_httpCacheWithUrlString:urlString parameters:parameters]; + + if (isNeedCache && responseCacheData != nil) + { + if (successBlock) + { + successBlock(responseCacheData); + } + NSLog(@"取用缓存数据成功: *** %@", responseCacheData); + + [[weakSelf tasks] removeObject:sessionTask]; + return nil; + } + + if (type == BAHttpRequestTypeGet) + { + sessionTask = [BANetManagerShare.sessionManager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) { + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + if (successBlock) + { + successBlock(responseObject); + } + // 对数据进行异步缓存 + [BANetManagerCache ba_setHttpCache:responseObject urlString:urlString parameters:parameters]; + [[weakSelf tasks] removeObject:sessionTask]; + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + if (failureBlock) + { + failureBlock(error); + } + [[weakSelf tasks] removeObject:sessionTask]; + + }]; + + } + else if (type == BAHttpRequestTypePost) + { + sessionTask = [BANetManagerShare.sessionManager POST:URLString parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) { + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + if (successBlock) + { + successBlock(responseObject); + } + NSLog(@"post请求数据成功: *** %@", responseObject); + + // 对数据进行异步缓存 + [BANetManagerCache ba_setHttpCache:responseObject urlString:urlString parameters:parameters]; + [[weakSelf tasks] removeObject:sessionTask]; + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + if (failureBlock) + { + failureBlock(error); + NSLog(@"错误信息:%@",error); + } + [[weakSelf tasks] removeObject:sessionTask]; + + }]; + } + else if (type == BAHttpRequestTypePut) + { + sessionTask = [BANetManagerShare.sessionManager PUT:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + if (successBlock) + { + successBlock(responseObject); + } + + [[weakSelf tasks] removeObject:sessionTask]; + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + if (failureBlock) + { + failureBlock(error); + } + [[weakSelf tasks] removeObject:sessionTask]; + + }]; + } + else if (type == BAHttpRequestTypeDelete) + { + sessionTask = [BANetManagerShare.sessionManager DELETE:URLString parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + if (successBlock) + { + successBlock(responseObject); + } + + [[weakSelf tasks] removeObject:sessionTask]; + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + if (failureBlock) + { + failureBlock(error); + } + [[weakSelf tasks] removeObject:sessionTask]; + + }]; + } + + if (sessionTask) + { + [[weakSelf tasks] addObject:sessionTask]; + } + + return sessionTask; +} + +/** + 上传图片(多图) + + @param urlString 上传的url + @param parameters 上传图片预留参数---视具体情况而定 可移除 + @param imageArray 上传的图片数组 + @param fileName 上传的图片数组fileName + @param successBlock 上传成功的回调 + @param failureBlock 上传失败的回调 + @param progress 上传进度 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_uploadImageWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + imageArray:(NSArray *)imageArray + fileName:(NSString *)fileName + successBlock:(BAResponseSuccess)successBlock + failurBlock:(BAResponseFail)failureBlock + upLoadProgress:(BAUploadProgress)progress +{ + if (urlString == nil) + { + return nil; + } + + BAWeak; + /*! 检查地址中是否有中文 */ + NSString *URLString = [NSURL URLWithString:urlString] ? urlString : [self strUTF8Encoding:urlString]; + + NSLog(@"******************** 请求参数 ***************************"); + NSLog(@"请求头: %@\n请求方式: %@\n请求URL: %@\n请求param: %@\n\n",BANetManagerShare.sessionManager.requestSerializer.HTTPRequestHeaders, @"POST",URLString, parameters); + NSLog(@"******************************************************"); + + BAURLSessionTask *sessionTask = nil; + sessionTask = [BANetManagerShare.sessionManager POST:URLString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { + + /*! 出于性能考虑,将上传图片进行压缩 */ + [imageArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + + /*! image的压缩方法 */ + UIImage *resizedImage; + /*! 此处是使用原生系统相册 */ + if([obj isKindOfClass:[ALAsset class]]) + { + // 用ALAsset获取Asset URL 转化为image + ALAssetRepresentation *assetRep = [obj defaultRepresentation]; + + CGImageRef imgRef = [assetRep fullResolutionImage]; + resizedImage = [UIImage imageWithCGImage:imgRef + scale:1.0 + orientation:(UIImageOrientation)assetRep.orientation]; + // imageWithImage + NSLog(@"1111-----size : %@",NSStringFromCGSize(resizedImage.size)); + + resizedImage = [weakSelf imageWithImage:resizedImage scaledToSize:resizedImage.size]; + NSLog(@"2222-----size : %@",NSStringFromCGSize(resizedImage.size)); + } + else + { + /*! 此处是使用其他第三方相册,可以自由定制压缩方法 */ + resizedImage = obj; + } + + /*! 此处压缩方法是jpeg格式是原图大小的0.8倍,要调整大小的话,就在这里调整就行了还是原图等比压缩 */ + NSData *imgData = UIImageJPEGRepresentation(resizedImage, 0.8); + + /*! 拼接data */ + if (imgData != nil) + { // 图片数据不为空才传递 fileName + // [formData appendPartWithFileData:imgData name:[NSString stringWithFormat:@"picflie%ld",(long)i] fileName:@"image.png" mimeType:@" image/jpeg"]; + + [formData appendPartWithFileData:imgData + name:[NSString stringWithFormat:@"picflie%ld",(long)idx] + fileName:fileName + mimeType:@"image/jpeg"]; + + } + + }]; + + } progress:^(NSProgress * _Nonnull uploadProgress) { + + NSLog(@"上传进度--%lld,总进度---%lld",uploadProgress.completedUnitCount,uploadProgress.totalUnitCount); + + if (progress) + { + progress(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount); + } + + } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { + + NSLog(@"上传图片成功 = %@",responseObject); + if (successBlock) + { + successBlock(responseObject); + } + + [[weakSelf tasks] removeObject:sessionTask]; + + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + + if (failureBlock) + { + failureBlock(error); + } + [[weakSelf tasks] removeObject:sessionTask]; + }]; + + if (sessionTask) + { + [[weakSelf tasks] addObject:sessionTask]; + } + + return sessionTask; +} + +/** + 视频上传 + + @param urlString 上传的url + @param parameters 上传视频预留参数---视具体情况而定 可移除 + @param videoPath 上传视频的本地沙河路径 + @param successBlock 成功的回调 + @param failureBlock 失败的回调 + @param progress 上传的进度 + */ ++ (void)ba_uploadVideoWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + videoPath:(NSString *)videoPath + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + uploadProgress:(BAUploadProgress)progress +{ + /*! 获得视频资源 */ + AVURLAsset *avAsset = [AVURLAsset URLAssetWithURL:[NSURL URLWithString:videoPath] options:nil]; + + /*! 压缩 */ + + // NSString *const AVAssetExportPreset640x480; + // NSString *const AVAssetExportPreset960x540; + // NSString *const AVAssetExportPreset1280x720; + // NSString *const AVAssetExportPreset1920x1080; + // NSString *const AVAssetExportPreset3840x2160; + + /*! 创建日期格式化器 */ + + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + + [formatter setDateFormat:@"yyyy-MM-dd-HH:mm:ss"]; + + /*! 转化后直接写入Library---caches */ + NSString *videoWritePath = [NSString stringWithFormat:@"output-%@.mp4",[formatter stringFromDate:[NSDate date]]]; + NSString *outfilePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", videoWritePath]; + + AVAssetExportSession *avAssetExport = [[AVAssetExportSession alloc] initWithAsset:avAsset presetName:AVAssetExportPresetMediumQuality]; + + avAssetExport.outputURL = [NSURL fileURLWithPath:outfilePath]; + avAssetExport.outputFileType = AVFileTypeMPEG4; + + [avAssetExport exportAsynchronouslyWithCompletionHandler:^{ + switch ([avAssetExport status]) { + case AVAssetExportSessionStatusCompleted: + { + [BANetManagerShare.sessionManager POST:urlString parameters:parameters constructingBodyWithBlock:^(id _Nonnull formData) { + + NSURL *filePathURL2 = [NSURL URLWithString:[NSString stringWithFormat:@"file://%@", outfilePath]]; + // 获得沙盒中的视频内容 + [formData appendPartWithFileURL:filePathURL2 name:@"video" fileName:outfilePath mimeType:@"application/octet-stream" error:nil]; + + } progress:^(NSProgress * _Nonnull uploadProgress) { + NSLog(@"上传进度--%lld,总进度---%lld",uploadProgress.completedUnitCount,uploadProgress.totalUnitCount); + if (progress) + { + progress(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount); + } + } success:^(NSURLSessionDataTask * _Nonnull task, NSDictionary * _Nullable responseObject) { + NSLog(@"上传视频成功 = %@",responseObject); + if (successBlock) + { + successBlock(responseObject); + } + } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { + NSLog(@"上传视频失败 = %@", error); + if (failureBlock) + { + failureBlock(error); + } + }]; + break; + } + default: + break; + } + }]; +} + +#pragma mark - ***** 文件下载 +/** + 文件下载 + + @param urlString 请求的url + @param parameters 文件下载预留参数---视具体情况而定 可移除 + @param savePath 下载文件保存路径 + @param successBlock 下载文件成功的回调 + @param failureBlock 下载文件失败的回调 + @param progress 下载文件的进度显示 + @return BAURLSessionTask + */ ++ (BAURLSessionTask *)ba_downLoadFileWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters + savaPath:(NSString *)savePath + successBlock:(BAResponseSuccess)successBlock + failureBlock:(BAResponseFail)failureBlock + downLoadProgress:(BADownloadProgress)progress +{ + if (urlString == nil) + { + return nil; + } + + NSURLRequest *downloadRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; + + NSLog(@"******************** 请求参数 ***************************"); + NSLog(@"请求头: %@\n请求方式: %@\n请求URL: %@\n请求param: %@\n\n",BANetManagerShare.sessionManager.requestSerializer.HTTPRequestHeaders, @"download",urlString, parameters); + NSLog(@"******************************************************"); + + + BAURLSessionTask *sessionTask = nil; + + sessionTask = [BANetManagerShare.sessionManager downloadTaskWithRequest:downloadRequest progress:^(NSProgress * _Nonnull downloadProgress) { + + NSLog(@"下载进度:%.2lld%%",100 * downloadProgress.completedUnitCount/downloadProgress.totalUnitCount); + /*! 回到主线程刷新UI */ + dispatch_async(dispatch_get_main_queue(), ^{ + + if (progress) + { + progress(downloadProgress.completedUnitCount, downloadProgress.totalUnitCount); + } + + }); + + } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { + + if (!savePath) + { + NSURL *downloadURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil]; + NSLog(@"默认路径--%@",downloadURL); + return [downloadURL URLByAppendingPathComponent:[response suggestedFilename]]; + } + else + { + return [NSURL fileURLWithPath:savePath]; + } + + } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { + + [[self tasks] removeObject:sessionTask]; + + NSLog(@"下载文件成功"); + if (error == nil) + { + if (successBlock) + { + /*! 返回完整路径 */ + successBlock([filePath path]); + } + else + { + if (failureBlock) + { + failureBlock(error); + } + } + } + }]; + + /*! 开始启动任务 */ + [sessionTask resume]; + + if (sessionTask) + { + [[self tasks] addObject:sessionTask]; + } + return sessionTask; +} + +#pragma mark - 网络状态监测 +/*! + * 开启网络监测 + */ ++ (void)ba_startNetWorkMonitoringWithBlock:(BANetworkStatusBlock)networkStatus +{ + /*! 1.获得网络监控的管理者 */ + AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager]; + /*! 当使用AF发送网络请求时,只要有网络操作,那么在状态栏(电池条)wifi符号旁边显示 菊花提示 */ + [AFNetworkActivityIndicatorManager sharedManager].enabled = YES; + /*! 2.设置网络状态改变后的处理 */ + [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + /*! 当网络状态改变了, 就会调用这个block */ + switch (status) + { + case AFNetworkReachabilityStatusUnknown: + NSLog(@"未知网络"); + networkStatus ? networkStatus(BANetworkStatusUnknown) : nil; + break; + case AFNetworkReachabilityStatusNotReachable: + NSLog(@"没有网络"); + networkStatus ? networkStatus(BANetworkStatusNotReachable) : nil; + break; + case AFNetworkReachabilityStatusReachableViaWWAN: + NSLog(@"手机自带网络"); + networkStatus ? networkStatus(BANetworkStatusReachableViaWWAN) : nil; + break; + case AFNetworkReachabilityStatusReachableViaWiFi: + NSLog(@"wifi 网络"); + networkStatus ? networkStatus(BANetworkStatusReachableViaWiFi) : nil; + break; + } + }]; + [manager startMonitoring]; +} + +#pragma mark - 取消 Http 请求 +/*! + * 取消所有 Http 请求 + */ ++ (void)ba_cancelAllRequest +{ + // 锁操作 + @synchronized(self) + { + [[self tasks] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) { + [task cancel]; + }]; + [[self tasks] removeAllObjects]; + } +} + +/*! + * 取消指定 URL 的 Http 请求 + */ ++ (void)ba_cancelRequestWithURL:(NSString *)URL +{ + if (!URL) + { + return; + } + @synchronized (self) + { + [[self tasks] enumerateObjectsUsingBlock:^(NSURLSessionTask *_Nonnull task, NSUInteger idx, BOOL * _Nonnull stop) { + + if ([task.currentRequest.URL.absoluteString hasPrefix:URL]) + { + [task cancel]; + [[self tasks] removeObject:task]; + *stop = YES; + } + }]; + } +} + + +#pragma mark - 压缩图片尺寸 +/*! 对图片尺寸进行压缩 */ ++ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize +{ + if (newSize.height > 375/newSize.width*newSize.height) + { + newSize.height = 375/newSize.width*newSize.height; + } + + if (newSize.width > 375) + { + newSize.width = 375; + } + + UIImage *newImage = [UIImage needCenterImage:image size:newSize scale:1.0]; + + return newImage; +} + +#pragma mark - url 中文格式化 ++ (NSString *)strUTF8Encoding:(NSString *)str +{ + /*! ios9适配的话 打开第一个 */ + if ([[UIDevice currentDevice] systemVersion].floatValue >= 9.0) + { + return [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLPathAllowedCharacterSet]]; + } + else + { + return [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } +} + +#pragma mark - setter / getter +/** + 存储着所有的请求task数组 + + @return 存储着所有的请求task数组 + */ ++ (NSMutableArray *)tasks +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSLog(@"创建数组"); + tasks = [[NSMutableArray alloc] init]; + }); + return tasks; +} + +- (void)setTimeoutInterval:(NSTimeInterval)timeoutInterval +{ + _timeoutInterval = timeoutInterval; + BANetManagerShare.sessionManager.requestSerializer.timeoutInterval = timeoutInterval; +} + +- (void)setRequestSerializer:(BAHttpRequestSerializer)requestSerializer +{ + _requestSerializer = requestSerializer; + switch (requestSerializer) { + case BAHttpRequestSerializerJSON: + { + BANetManagerShare.sessionManager.requestSerializer = [AFJSONRequestSerializer serializer] ; + } + break; + case BAHttpRequestSerializerHTTP: + { + BANetManagerShare.sessionManager.requestSerializer = [AFHTTPRequestSerializer serializer] ; + } + break; + + default: + break; + } +} + +- (void)setResponseSerializer:(BAHttpResponseSerializer)responseSerializer +{ + _responseSerializer = responseSerializer; + switch (responseSerializer) { + case BAHttpResponseSerializerJSON: + { + BANetManagerShare.sessionManager.responseSerializer = [AFJSONResponseSerializer serializer] ; + } + break; + case BAHttpResponseSerializerHTTP: + { + BANetManagerShare.sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer] ; + } + break; + + default: + break; + } +} + +- (void)setHttpHeaderFieldDictionary:(NSDictionary *)httpHeaderFieldDictionary +{ + _httpHeaderFieldDictionary = httpHeaderFieldDictionary; + + if (![httpHeaderFieldDictionary isKindOfClass:[NSDictionary class]]) + { + NSLog(@"请求头数据有误,请检查!"); + return; + } + NSArray *keyArray = httpHeaderFieldDictionary.allKeys; + + if (keyArray.count <= 0) + { + NSLog(@"请求头数据有误,请检查!"); + return; + } + + for (NSInteger i = 0; i < keyArray.count; i ++) + { + NSString *keyString = keyArray[i]; + NSString *valueString = httpHeaderFieldDictionary[keyString]; + + [BANetManager ba_setValue:valueString forHTTPHeaderKey:keyString]; + } +} + +/** + * 自定义请求头 + */ ++ (void)ba_setValue:(NSString *)value forHTTPHeaderKey:(NSString *)HTTPHeaderKey +{ + [BANetManagerShare.sessionManager.requestSerializer setValue:value forHTTPHeaderField:HTTPHeaderKey]; +} + + + +@end diff --git a/Pods/BANetManager/BANetManager/BANetManagerCache.h b/Pods/BANetManager/BANetManager/BANetManagerCache.h new file mode 100644 index 0000000..1c7b234 --- /dev/null +++ b/Pods/BANetManager/BANetManager/BANetManagerCache.h @@ -0,0 +1,114 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ // 此缓存框架采用网络开源缓存框架 + + +#import +#import + +@interface BANetManagerCache : NSObject + +/** + 异步缓存网络数据,根据请求的 url 与 parameters + + @param httpData 服务器返回的数据 + @param urlString 请求的 URL 地址 + @param parameters 请求的参数 + */ ++ (void)ba_setHttpCache:(id)httpData + urlString:(NSString *)urlString + parameters:(NSDictionary *)parameters; + +/** + 根据请求的 URL 与 parameters 异步取出缓存数据 + + @param urlString 请求的URL + @param parameters 请求的参数 + @return 缓存的服务器数据 + */ ++ (id)ba_httpCacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters; + +/** + 根据请求的 URL 与 parameters 异步取出缓存数据 + + @param urlString 请求的URL + @param parameters 请求的参数 + @param block 异步回调缓存的数据 + */ ++ (void)ba_httpCacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters block:(void(^)(id responseObject))block; + ++ (NSString *)ba_cacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters; + +/** + 返回此缓存中对象的总成本(以M为单位)。 +   此方法可能阻止调用线程,直到文件读取完成。 + + @return 总对象的大小(以M为单位)。 + */ ++ (CGFloat)ba_getAllHttpCacheSize; + +/** + 清空缓存。 +   此方法可能会阻止调用线程,直到文件删除完成。 + */ ++ (void)ba_clearAllHttpCache; + +@end diff --git a/Pods/BANetManager/BANetManager/BANetManagerCache.m b/Pods/BANetManager/BANetManager/BANetManagerCache.m new file mode 100644 index 0000000..9afb457 --- /dev/null +++ b/Pods/BANetManager/BANetManager/BANetManagerCache.m @@ -0,0 +1,105 @@ +// +// BANetManagerCache.m +// BANetManagerDemo +// +// Created by boai on 2017/5/2. +// Copyright © 2017年 博爱之家. All rights reserved. +// + +#import "BANetManagerCache.h" +#import "YYCache.h" + +static NSString * const kBANetManagerCache = @"BANetManagerCache"; +static YYCache *_dataCache; + +@implementation BANetManagerCache + ++ (void)initialize +{ + _dataCache = [YYCache cacheWithName:kBANetManagerCache]; +} + +/** + 异步缓存网络数据,根据请求的 url 与 parameters + + @param httpData 服务器返回的数据 + @param urlString 请求的 URL 地址 + @param parameters 请求的参数 + */ ++ (void)ba_setHttpCache:(id)httpData + urlString:(NSString *)urlString + parameters:(NSDictionary *)parameters +{ + NSString *cacheKey = [self ba_cacheWithUrlString:urlString parameters:parameters]; + [_dataCache setObject:httpData forKey:cacheKey]; +} + +/** + 根据请求的 URL 与 parameters 异步取出缓存数据 + + @param urlString 请求的URL + @param parameters 请求的参数 + @return 缓存的服务器数据 + */ ++ (id)ba_httpCacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters +{ + NSString *cacheKey = [self ba_cacheWithUrlString:urlString parameters:parameters]; + return [_dataCache objectForKey:cacheKey]; +} + +/** + 根据请求的 URL 与 parameters 异步取出缓存数据 + + @param urlString 请求的URL + @param parameters 请求的参数 + @param block 异步回调缓存的数据 + */ ++ (void)ba_httpCacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters block:(void(^)(id responseObject))block +{ + NSString *cacheKey = [self ba_cacheWithUrlString:urlString parameters:parameters]; + [_dataCache objectForKey:cacheKey withBlock:^(NSString * _Nonnull key, id _Nonnull object) { + + dispatch_async(dispatch_get_main_queue(), ^{ + block(object); + }); + }]; + +} + ++ (NSString *)ba_cacheWithUrlString:(NSString *)urlString + parameters:(NSDictionary *)parameters +{ + if (!parameters) + { + return urlString; + } + NSData *cacheData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil]; + NSString *cacheString = [[NSString alloc] initWithData:cacheData encoding:NSUTF8StringEncoding]; + + NSString *cacheKey = [NSString stringWithFormat:@"%@%@", urlString, cacheString]; + return cacheKey; +} + +/** + 返回此缓存中对象的总大小(以M为单位)。 +   此方法可能阻止调用线程,直到文件读取完成。 + + @return 总对象的大小(以M为单位)。 + */ ++ (CGFloat)ba_getAllHttpCacheSize +{ + return [_dataCache.diskCache totalCost]/1024.0/1024.0; +} + +/** + 清空缓存。 +   此方法可能会阻止调用线程,直到文件删除完成。 + */ ++ (void)ba_clearAllHttpCache +{ + [_dataCache.diskCache removeAllObjects]; +} + +@end diff --git a/Pods/BANetManager/BANetManager/UIImage+CompressImage.h b/Pods/BANetManager/BANetManager/UIImage+CompressImage.h new file mode 100755 index 0000000..a8c7aab --- /dev/null +++ b/Pods/BANetManager/BANetManager/UIImage+CompressImage.h @@ -0,0 +1,108 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客园 : http://www.cnblogs.com/boai/ + * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 + + ********************************************************************************* + + */ + + +#import + +typedef UIImage JPEGImage; +typedef UIImage PNGImage; +typedef NSData JPEGData; +typedef NSData PNGData; + +@interface UIImage (CompressImage) +/** + * 传入图片,需要的大小,比例,得到压缩图片大小 + * + * @prama image 需要压缩的图片 + * @prama size 压缩后图片的大小 + * @prama scale 压缩的比例 0.0 - 1.0 + * + * @return 返回新的图片 + */ ++ (JPEGImage *)needCompressImage:(UIImage *)image size:(CGSize )size scale:(CGFloat )scale; ++ (JPEGImage *)needCompressImageData:(NSData *)imageData size:(CGSize )size scale:(CGFloat )scale; + +/** + * 传入图片,获取中间部分,需要的大小,压缩比例 + * + * @prama image 需要压缩的图片 + * @prama size 压缩后图片的大小 + * @prama scale 压缩的比例 0.0 - 1.0 + * + * @return 返回新的图片 + */ ++ (JPEGImage *)needCenterImage:(UIImage *)image size:(CGSize )size scale:(CGFloat )scale; + + +/** + * png图片转为jpeg(jpg)图片 + * + * @prama image 需要转为jpeg的png图片 + * + * @return 返回一张jpeg图片 + */ ++ (JPEGImage *)jpegImageWithPNGImage:(PNGImage *)pngImage; ++ (JPEGImage *)jpegImageWithPNGData:(PNGData *)pngData; ++ (JPEGData *)jpegDataWithPNGData:(PNGData *)pngData; ++ (JPEGData *)jpegDataWithPNGImage:(PNGImage *)pngImage; + +@end diff --git "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.m" b/Pods/BANetManager/BANetManager/UIImage+CompressImage.m similarity index 94% rename from "BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.m" rename to Pods/BANetManager/BANetManager/UIImage+CompressImage.m index 8395a3e..f5e8e72 100755 --- "a/BABaseProject/BAMainCode/BATools(\345\267\245\345\205\267\347\261\273)/BANetManager(\347\275\221\347\273\234\347\261\273)/UIImage+CompressImage.m" +++ b/Pods/BANetManager/BANetManager/UIImage+CompressImage.m @@ -47,17 +47,20 @@ * * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug * - * QQ : 博爱1616【137361770】 + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) * 微博 : 博爱1616 * Email : 137361770@qq.com * GitHub : https://github.com/boai * 博客园 : http://www.cnblogs.com/boai/ * 博客 : http://boai.github.io + * 简书 : http://www.jianshu.com/users/95c9800fdf47/latest_articles + * 简书专题 : http://www.jianshu.com/collection/072d578bf782 ********************************************************************************* */ + #import "UIImage+CompressImage.h" @implementation UIImage (CompressImage) diff --git a/Pods/BANetManager/LICENSE b/Pods/BANetManager/LICENSE new file mode 100644 index 0000000..81daf9e --- /dev/null +++ b/Pods/BANetManager/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 博爱1616 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/BANetManager/README.md b/Pods/BANetManager/README.md new file mode 100755 index 0000000..53628b3 --- /dev/null +++ b/Pods/BANetManager/README.md @@ -0,0 +1,291 @@ +# BANetManager +![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) ![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg) [![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123) + +### 基于AFNetworking 3.1最新版本的封装 + + +## 1、更新内容 + +``` +最新更新时间:2017-05-03 【倒叙】 +最新Version:【Version:2.2】 +更新内容: +2.2.1、优化方法名命名规范 +2.2.2、优化网络状态实时监测 block 回调,去除多余设置,需要网络判断,直接调用block回调即可 +2.2.3、新增 YYCache 缓存处理 +2.2.4、新增自定义:超时设置,取消单个网络请求和取消所有网络请求 +2.2.5、新增自定义:requestSerializer设置 +2.2.6、新增自定义:responseSerializer设置 +2.2.7、新增自定义:请求头设置 +2.2.8、新增自定义 CA 证书 和 HTTPS 请求配置,只需把证书导入项目目录即可,无需设置 +2.2.9、新增史上最全的 AFN 请求 NSLog 打印,详见 demo 控制台打印结果 +2.2.10、新增 DEBUG 模式下的 NSLog 判断,release 下不会打印,请放心使用 +2.2.11、如果打印数据不完整,是因为 Xcode 8 版本问题,请下断点打印数据 +2.2.12、由于新版本改动较大,原有方法命名可能有所改动,希望老用户见谅! +2.2.13、目前版本较稳定,稍后奉上 pod 版本!请大家耐心等待 + + +最新更新时间:2016-11-24 【倒叙】 +最新Version:【Version:2.1】 +更新内容: +2.1.1、优化方法名命名规范 +2.1.2、新增网络状态实时监测 block 回调,新增单独网络监测 bool 返回,详见 demo +2.1.3、新增旧方法更新提示 +2.1.4、优化各种注释 + +最新更新时间:2016-11-17 +最新Version:【Version:2.0】 +更新内容: +2.0.1、优化方法名命名规范 +2.0.2、新增部分注释 +2.0.3、视频上传方法对接,目前有很多项目对接成功 +``` + +## 2、功能列表 +- 10、视频上传部分已经亲测可用,目前多个项目检测暂无问题,大家可以放心使用了! +- 9、如果使用PHP后台,后台不会对接此接口的话,博爱已经为你们量身定做了PHP后台接口,你们只需要把文件夹中的 postdynamic.php 文件发送给你们的PHP后台同事,他们就知道了,里面都有详细说明! +- 8、优化自定义CA证书的导入配置 +- 7、新增https请求参数设置,新增详细打印参数! +- 6、优化,新增https请求参数设置,新增详细打印参数! +- 5、集成网络监测,让你实时监测你的宝贝APP的网络状态【已经测试通过】 +- 3、集成视频上传/下载,和文件下载,让视频的上传下载更方便,支持异步下载【已测试多个项目通过】 +- 2、集成单图/多图上传,让图片上传更简单,自带压缩处理【已经测试通过】 +- 1、集成 get / post / put / delete 等常用请求方式的封装【已经测试通过】 + +## 3、图片展示 + +![image](https://github.com/boai/BANetManager/blob/master/images/image.png) + +## 4、数据打印展示 + +get 请求结果打印: + +``` +2017-05-03 10:32:38.070372+0800 BANetManagerDemo[1472:479146] ******************** 请求参数 *************************** +2017-05-03 10:32:38.070784+0800 BANetManagerDemo[1472:479146] +请求头: { + "Accept-Language" = "zh-Hans-CN;q=1"; + "User-Agent" = "BANetManagerDemo/1.0 (iPhone; iOS 10.3.2; Scale/2.00)"; +} +超时时间设置:30.0 秒【默认:30秒】 +AFHTTPResponseSerializer:【默认:AFJSONResponseSerializer】 +AFHTTPRequestSerializer:【默认:AFJSONRequestSerializer】 +请求方式: GET +请求URL: http://chanyouji.com/api/users/likes/268717.json +请求param: (null) +是否启用缓存:开启【默认:开启】 +目前总缓存大小:0.005991M + +2017-05-03 10:32:38.070833+0800 BANetManagerDemo[1472:479146] ******************************************************** + +``` + +post 请求结果打印: + +``` +2017-05-03 10:33:07.165523+0800 BANetManagerDemo[1472:479146] ******************** 请求参数 *************************** +2017-05-03 10:33:07.166295+0800 BANetManagerDemo[1472:479146] +请求头: { + Accept = "application/json"; + "Accept-Encoding" = gzip; + "Accept-Language" = "zh-Hans-CN;q=1"; + "User-Agent" = "BANetManagerDemo/1.0 (iPhone; iOS 10.3.2; Scale/2.00)"; +} +超时时间设置:15.0 秒【默认:30秒】 +AFHTTPResponseSerializer:【默认:AFJSONResponseSerializer】 +AFHTTPRequestSerializer:【默认:AFJSONRequestSerializer】 +请求方式: POWT +请求URL: http://chanyouji.com/api/users/likes/268717.json +请求param: { + page = 1; + "per_page" = 10; +} +是否启用缓存:开启【默认:开启】 +目前总缓存大小:0.008538M + +2017-05-03 10:33:07.166472+0800 BANetManagerDemo[1472:479146] ******************************************************** +``` + +## 5、自定义设置示例: +``` + // 1、自定义超时设置 + BANetManagerShare.timeoutInterval = 15; + + // 2、自定义添加请求头 + NSDictionary *headerDict = @{@"Accept":@"application/json", @"Accept-Encoding":@"gzip"}; + BANetManagerShare.httpHeaderFieldDictionary = headerDict; + + // 3、自定义更改 requestSerializer +// BANetManagerShare.requestSerializer = BAHttpRequestSerializerHTTP; + // 4、自定义更改 responseSerializer +// BANetManagerShare.responseSerializer = BAHttpRequestSerializerHTTP; + +``` + +## 6、请求示例 +``` +#pragma mark - ***** get +- (IBAction)getData:(UIButton *)sender +{ + BAWeak; + // 如果打印数据不完整,是因为 Xcode 8 版本问题,请下断点打印数据 + [BANetManager ba_request_GETWithUrlString:url5 isNeedCache:YES parameters:nil successBlock:^(id response) { + NSLog(@"get请求数据成功: *** %@", response); + + } failureBlock:^(NSError *error) { + + } progress:nil]; +} + +#pragma mark - ***** post +- (IBAction)postData:(UIButton *)sender +{ + BAWeak; + // 1、自定义超时设置 + BANetManagerShare.timeoutInterval = 15; + + // 2、自定义添加请求头 + NSDictionary *headerDict = @{@"Accept":@"application/json", @"Accept-Encoding":@"gzip"}; + BANetManagerShare.httpHeaderFieldDictionary = headerDict; + + // 3、自定义更改 requestSerializer +// BANetManagerShare.requestSerializer = BAHttpRequestSerializerHTTP; + // 4、自定义更改 responseSerializer +// BANetManagerShare.responseSerializer = BAHttpRequestSerializerHTTP; + + int page = 1; + NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:@(page).stringValue, @"page", @"10", @"per_page", nil];; + + // 如果打印数据不完整,是因为 Xcode 8 版本问题,请下断点打印数据 + [BANetManager ba_request_POSTWithUrlString:url5 isNeedCache:YES parameters:parameters successBlock:^(id response) { + NSLog(@"post请求数据成功: *** %@", response); + + } failureBlock:^(NSError *error) { + + } progress:nil]; +} + + +#pragma mark - ***** 下载视频、图片 +- (IBAction)downloadData:(UIButton *)sender +{ + UIButton *downloadBtn = (UIButton *)sender; + NSString *path1 = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/半塘.mp4"]]; + // NSString *path2 = [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/image123.mp3"]]; + + NSLog(@"路径:%@", path1); + + /*! 查找路径中是否存在"半塘.mp4",是,返回真;否,返回假。 */ + // BOOL result2 = [path1 hasSuffix:@"半塘.mp4"]; + // NSLog(@"%d", result2); + + /*! + 下载前先判断该用户是否已经下载,目前用了两种方式: + 1、第一次下载完用变量保存, + 2、查找路径中是否包含改文件的名字 + 如果下载完了,就不要再让用户下载,也可以添加alert的代理方法,增加用户的选择! + */ + // if (isFinishDownload || result2) + // { + // [[[UIAlertView alloc] initWithTitle:@"温馨提示:" message:@"您已经下载该视频!" delegate:nil cancelButtonTitle:@"确 定" otherButtonTitles:nil, nil] show]; + // return; + // } + BAWeak; + NSString *url = @"http://static.yizhibo.com/pc_live/static/video.swf?onPlay=YZB.play&onPause=YZB.pause&onSeek=YZB.seek&scid=pALRs7JBtTRU9TWy"; + self.tasks = [BANetManager ba_downLoadFileWithUrlString:url + parameters:nil + savaPath:path1 + successBlock:^(id response) { + + NSLog(@"下载完成,路径为:%@", response); + self.downloadLabel.text = @"下载完成"; + isFinishDownload = YES; + [downloadBtn setTitle:@"下载完成" forState:UIControlStateNormal]; + [downloadBtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; + BAKit_ShowAlertWithMsg(@"视频下载完成!"); + + } failureBlock:^(NSError *error) { + + } downLoadProgress:^(int64_t bytesProgress, int64_t totalBytesProgress) { + /*! 封装方法里已经回到主线程,所有这里不用再调主线程了 */ + self.downloadLabel.text = [NSString stringWithFormat:@"下载进度:%.2lld%%",100 * bytesProgress/totalBytesProgress]; + [downloadBtn setTitle:@"下载中..." forState:UIControlStateNormal]; + }]; + +// sender.selected = !sender.selected; +// if (sender.selected) +// { +// [self.tasks resume]; +// } +// else +// { +// [self.tasks suspend]; +// UIButton *downloadBtn = (UIButton *)sender; +// [downloadBtn setTitle:@"暂停下载" forState:UIControlStateNormal]; +// } + +} + + +#pragma mark - ***** 上传图片 +- (IBAction)uploadImageData:(UIButton *)sender +{ + /*! + + 1、此上传图片单张、多图上传都经过几十个项目亲测可用,大家可以放心使用,使用过程中有问题,请加群:479663605 进行反馈,多谢! + 2、此处只需要传URL 和 parameters,和你的image数组、FileName就行了,具体压缩方法都已经做好处理! + + + 3、注意:如果使用PHP后台,后台不会对接此接口的话,博爱已经为你们量身定做了PHP后台接口,你们只需要把文件夹中的 postdynamic.php 文件发送给你们的PHP后台同事,他们就知道了,里面都有详细说明! + + */ + + [BANetManager ba_uploadImageWithUrlString:nil parameters:nil imageArray:nil fileName:nil successBlock:^(id response) { + + } failurBlock:^(NSError *error) { + + } upLoadProgress:^(int64_t bytesProgress, int64_t totalBytesProgress) { + + }]; +} + +#pragma mark - ***** 上传视频 +- (IBAction)uploadVideoData:(UIButton *)sender +{ + /*! + + 1、此上传视频都经过几十个项目亲测可用,大家可以放心使用,使用过程中有问题,请加群:479663605 进行反馈,多谢! + 2、此处只需要传URL 和 parameters就行了,具体压缩方法都已经做好处理! + + */ + [BANetManager ba_uploadVideoWithUrlString:nil parameters:nil videoPath:nil successBlock:^(id response) { + + } failureBlock:^(NSError *error) { + + } uploadProgress:^(int64_t bytesProgress, int64_t totalBytesProgress) { + + }]; +} + +- (IBAction)putData:(UIButton *)sender +{ + NSString *url = @"http://120.76.245.240:8080/bda/resetPassword/?account=761463699@qq.com&password=q&OTP=634613"; + NSDictionary *dict = @{@"EquipmentType":@"iPhone", @"EquipmentGUID":@"b61df00d-87db-426f-bc5a-bc8fffa907db"}; + + [BANetManager ba_request_PUTWithUrlString:url parameters:dict successBlock:^(id response) { + NSLog(@"*********00000 : %@", response); + } failureBlock:^(NSError *error) { + + } progress:nil]; +} + +- (IBAction)deleteData:(UIButton *)sender +{ + [BANetManager ba_request_DELETEWithUrlString:nil parameters:nil successBlock:nil failureBlock:nil progress:nil]; +} + +``` + +## 5、demo 下载 +详情demo,请前往[『BABaseProject』](https://github.com/boai/BABaseProject)!
+Code4App 下载链接:[『BANetManager』](http://www.code4app.com/forum.php?mod=viewthread&tid=11787)! diff --git a/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.h b/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.h new file mode 100644 index 0000000..fd08223 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.h @@ -0,0 +1,300 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import +#import + +@class BAKit_CityModel; + +/** + 选择器样式,默认为:BAKit_PickerViewTypeCity + + - BAKit_PickerViewTypeCity: 城市选择器 + - BAKit_PickerViewTypeArray: 普通数组自定义数据 + - BAKit_PickerViewTypeDate: 日期选择器:年月日,可以完全自定义 NSDateFormatter + - BAKit_PickerViewTypeDateYM: 日期选择器:年月,可以完全自定义 NSDateFormatter + - BAKit_PickerViewTypeDateWeek: 日期选择器:年周,如:2017年,第21周 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewType) { + BAKit_PickerViewTypeCity = 0, + BAKit_PickerViewTypeArray, + BAKit_PickerViewTypeDate, + BAKit_PickerViewTypeDateYM, + BAKit_PickerViewTypeDateWeek +}; + +/** + 日期选择器样式下返回的数据格式,默认为:BAKit_PickerViewDateTypeYMD + + - BAKit_PickerViewDateTypeYY: 如:2017 + - BAKit_PickerViewDateTypeYM: 如:2017-03 + - BAKit_PickerViewDateTypeYMD: 如:20172017-03-01 + - BAKit_PickerViewDateTypeYMDHMS: 如:2017-03-01 18:20:12 + - BAKit_PickerViewDateTypeYMDEHMS: 如:2017-03-01,周二, 18:20:12 + - BAKit_PickerViewDateTypeHM: 如:18:20 + - BAKit_PickerViewDateTypeHMS: 如:18:20:12 + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewDateType) { + BAKit_PickerViewDateTypeYY = 0, + BAKit_PickerViewDateTypeYM, + BAKit_PickerViewDateTypeYMD, + BAKit_PickerViewDateTypeYMDHMS, + BAKit_PickerViewDateTypeYMDEHMS, + BAKit_PickerViewDateTypeHM, + BAKit_PickerViewDateTypeHMS +}; + +/** + 设置日期选择器的样式,具体的显示顺序取决于设备的本地化设置。默认为:BAKit_PickerViewDateModeDate + + - BAKit_PickerViewDateModeTime: 显示时、分、AM/PM标志(可选) + - BAKit_PickerViewDateModeDate: 显示年、月、日 + - BAKit_PickerViewDateModeDateAndTime: 显示日期的月、日、星期,时间的时、分、AM/PM标志(可选) + - BAKit_PickerViewDateModeCountDownTimer: 显示时、分。应用程序必须实现一个计数器(NSTimer对象),让倒计时中的时间不断减少。 + */ +typedef NS_ENUM(NSInteger, BAKit_PickerViewDateMode) { + BAKit_PickerViewDateModeTime, + /*! 选择此样式后,dateType 默认为:BAKit_PickerViewDateTypeYMD */ + BAKit_PickerViewDateModeDate, + /*! 选择此样式后,dateType 默认为:ba_setupDateFormatterWithYMDEHMS */ + BAKit_PickerViewDateModeDateAndTime, + BAKit_PickerViewDateModeCountDownTimer +}; + +typedef NS_ENUM(NSUInteger, BAKit_PickerViewAnimationType) { + BAKit_PickerViewAnimationTypeScale = 0, + BAKit_PickerViewAnimationTypeTop, + BAKit_PickerViewAnimationTypeBottom, + BAKit_PickerViewAnimationTypeLeft, + BAKit_PickerViewAnimationTypeRight +}; + +/** + 设置取消和确定按钮相对pickerView的位置 + + - BAKit_PickerViewPositionTypeNormal: 默认PickerView在屏幕的底部 + - BAKit_PickerViewPositionTypeBottom: 设置pickerView在屏幕的中心 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewPositionType) { + BAKit_PickerViewPositionTypeNormal = 0, + BAKit_PickerViewPositionTypeCenter, +}; + +/** + 设置取消和确定按钮相对pickerView的位置 + + - BAKit_PickerViewButtonPositionTypeNormal: 默认“取消”和“确定”button在pickerView的顶部 + - BAKit_PickerViewButtonPositionTypeBottom: 设置“取消”和“确定”button在pickerView的底部 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewButtonPositionType) { + BAKit_PickerViewButtonPositionTypeNormal = 0, + BAKit_PickerViewButtonPositionTypeBottom, +}; + +/** + 城市选择器的返回值 + + @param model BAKit_CityModel + */ +typedef void (^BAKit_PickerViewBlock)(BAKit_CityModel *model); + +/** + 普通数组自定义数据返回,日期选择器返回值 + + @param resultString resultString + */ +typedef void (^BAKit_PickerViewResultBlock)(NSString *resultString); + +@interface BAKit_PickerView : UIView + +#pragma mark - 自定义样式 +@property (nonatomic, copy) BAKit_PickerViewBlock block; +@property (nonatomic, copy) BAKit_PickerViewResultBlock resultBlock; + +/*! 是否开启边缘触摸隐藏 默认:YES */ +@property (nonatomic, assign) BOOL isTouchEdgeHide; + +/** + 动画样式 + */ +@property(nonatomic, assign) BAKit_PickerViewAnimationType animationType; + +/** + 选择器样式,默认为城市选择器 + */ +@property(nonatomic, assign) BAKit_PickerViewType pickerViewType; +@property(nonatomic, assign) BAKit_PickerViewDateType dateType; +@property(nonatomic, assign) BAKit_PickerViewDateMode dateMode; +@property(nonatomic, assign) BAKit_PickerViewButtonPositionType buttonPositionType; +@property(nonatomic, assign) BAKit_PickerViewPositionType pickerViewPositionType; + +/** + 自定义 NSDateFormatter,返回的日期格式,注意:如果同时设置 BAKit_PickerViewDateType 和 customDateFormatter,以 customDateFormatter 为主 + */ +@property(nonatomic, strong) NSDateFormatter *customDateFormatter; + +/** + 自定义数据的数组,如:@[@"男", @"女"] + */ +@property(nonatomic, strong) NSArray *dataArray; + +/** + toolBar 背景颜色,默认:白色 + */ +@property(nonatomic, strong) UIColor *backgroundColor_toolBar; + +/** + pickView 背景颜色,默认:白色 + */ +@property(nonatomic, strong) UIColor *backgroundColor_pickView; + +/** + cancleButton title颜色,默认:黑色 + */ +@property(nonatomic, strong) UIColor *buttonTitleColor_cancle; + +/** + sureButton title颜色,默认:黑色 + */ +@property(nonatomic, strong) UIColor *buttonTitleColor_sure; + +/** + pickView 字体,默认:[UIFont boldSystemFontOfSize:17],注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改 + */ +@property(nonatomic, strong) UIFont *ba_pickViewFont; + +/** + pickView 字体颜色,默认:[UIColor blackColor],注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改 + */ +@property(nonatomic, strong) UIColor *ba_pickViewTextColor; + + +#pragma mark - custom method + +/** + 快速创建一个 pickerView + + @param pickerViewType type 类型 + @param configuration 可以设置 BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatPickerViewWithType:(BAKit_PickerViewType)pickerViewType + configuration:(void (^)(BAKit_PickerView *tempView))configuration + block:(BAKit_PickerViewResultBlock)block; + +/** + 快速创建一个 城市选择器 + + @param configuration 可以设置BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatCityPickerViewWithConfiguration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewBlock)block; + +/** + 快速创建一个 自定义单列 pickerView + + @param dataArray 数组 + @param configuration 可以设置BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatCustomPickerViewWithDataArray:(NSArray *)dataArray + configuration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewResultBlock)block; +/** + 显示 pick + */ +- (void)ba_pickViewShow; + +/** + 隐藏 pick + */ +- (void)ba_pickViewHidden; + +@end + +@interface BAKit_CityModel : NSObject + +/** + 省 + */ +@property (nonatomic, copy) NSString *province; + +/** + 市 + */ +@property (nonatomic, copy) NSString *city; + +/** + 区 + */ +@property (nonatomic, copy) NSString *area; + +/** + 经纬度 + */ +@property (nonatomic, assign) CLLocationCoordinate2D coordie; + +@end + + diff --git a/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.m b/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.m new file mode 100644 index 0000000..96f28b8 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/BAKit_PickerView.m @@ -0,0 +1,1346 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import "BAKit_PickerView.h" + +#import "BAPickView_Config.h" +#import "NSDateFormatter+BAKit.h" +#import "NSDate+BAKit.h" +#import "UIView+BAAnimation.h" +#import "UIView+BARectCorner.h" + +#define kBAKit_PickerView_H 200 * BAKit_ScaleYAndHeight +#define kBAKit_PickerViewToolBar_H 40 * BAKit_ScaleYAndHeight + +@interface BAKit_PickerView () +{ + NSString *m_local2DString; +} + +// 省 数组 +@property (nonatomic, copy) NSMutableArray *provinceArray; +// 城市 数组 +@property (nonatomic, copy) NSMutableArray *cityArray; +// 区县 数组 +@property (nonatomic, copy) NSMutableArray *areaArray; + +/** + 选择的那组数据,主要是城市 + */ +@property (nonatomic, copy) NSMutableArray *selectedArray; + +@property (nonatomic, strong) UIPickerView *pickView; +@property (nonatomic, strong) UIDatePicker *datePicker; +@property (nonatomic, strong) UIView *bgView; + +/** + 取消按钮 + */ +@property (nonatomic, strong) UIButton *cancleButton; + +/** + 确定按钮 + */ +@property (nonatomic, strong) UIButton *sureButton; + +/** + 顶部 toolbar 工具栏 + */ +@property (nonatomic, strong) UIView *toolBarView; + +/** + 省,用于保存选择后的数据 + */ +@property (nonatomic, copy) NSString *province; + +/** + 市,用于保存选择后的数据 + */ +@property (nonatomic, copy) NSString *city; + +/** + 区,用于保存选择后的数据 + */ +@property (nonatomic, copy) NSString *area; + +/** + 选择的结果 + */ +@property(nonatomic, strong) NSString *resultString; + +@property(nonatomic, strong) NSDateFormatter *formatter; + +@property(nonatomic, strong) NSMutableArray *yearArray; +@property(nonatomic, strong) NSMutableArray *mounthArray; +@property(nonatomic, strong) NSMutableArray *weekArray; + +@property(nonatomic, strong) NSString *defaultMounthString; +@property(nonatomic, strong) NSString *defaultYearString; +@property(nonatomic, strong) NSString *defaultWeekString; + +@property (nonatomic, strong) UIWindow *alertWindow; +@property(nonatomic, assign) BOOL isAnimating; + + +@end + +@implementation BAKit_PickerView + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self setupUI]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self setupUI]; + } + return self; +} + +- (instancetype)initWitPlist:(NSString *)plistName +{ + if (self = [super init]) + { + [self setupUI]; + } + return self; +} + ++ (void)ba_creatCityPickerViewWithConfiguration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewBlock)block +{ + BAKit_PickerView *pickerView = [[BAKit_PickerView alloc] init]; + if (configuration) + { + configuration(pickerView); + } + [pickerView ba_pickViewShow]; + pickerView.block = block; +} + ++ (void)ba_creatCustomPickerViewWithDataArray:(NSArray *)dataArray + configuration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewResultBlock)block +{ + BAKit_PickerView *pickerView = [[BAKit_PickerView alloc] init]; + pickerView.pickerViewType = BAKit_PickerViewTypeArray; + + if (configuration) + { + configuration(pickerView); + } + pickerView.dataArray = dataArray; + [pickerView ba_pickViewShow]; + pickerView.resultBlock = block; +} + ++ (void)ba_creatPickerViewWithType:(BAKit_PickerViewType)pickerViewType + configuration:(void (^)(BAKit_PickerView *tempView))configuration + block:(BAKit_PickerViewResultBlock)block +{ + BAKit_PickerView *pickerView = [[BAKit_PickerView alloc] init]; + pickerView.pickerViewType = pickerViewType; + + if (configuration) + { + configuration(pickerView); + } + [pickerView ba_pickViewShow]; + pickerView.resultBlock = block; +} + +- (void)setupUI +{ + self.backgroundColor = BAKit_Color_Translucent; + self.pickView.hidden = NO; + + self.pickView.delegate = self; + self.pickView.dataSource = self; + + // 默认配置 + self.pickerViewType = BAKit_PickerViewTypeCity; + self.dateType = BAKit_PickerViewDateTypeYMD; + self.dateMode = BAKit_PickerViewDateModeDate; + self.animationType = BAKit_PickerViewAnimationTypeScale; + self.isTouchEdgeHide = YES; + self.toolBarView.backgroundColor = BAKit_Color_White; + self.pickView.backgroundColor = BAKit_Color_White; + self.datePicker.backgroundColor = BAKit_Color_White; + self.ba_pickViewFont = [UIFont boldSystemFontOfSize:17]; + self.ba_pickViewTextColor = [UIColor blackColor]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationRotateAction:) name:UIDeviceOrientationDidChangeNotification object:nil]; +} + +#pragma mark - 通知处理 +- (void)handleDeviceOrientationRotateAction:(NSNotification *)notification +{ + [self ba_layoutSubViews]; +} + +#pragma mark - layout +- (void)ba_layoutSubViews +{ + self.frame = [UIScreen mainScreen].bounds; + self.alertWindow.frame = self.window.bounds; + + + CGFloat min_x = 0; + CGFloat min_y = 0; + CGFloat min_w = 0; + CGFloat min_h = 0; + + CGFloat min_view_w = CGRectGetWidth(self.frame); + CGFloat min_view_h = CGRectGetHeight(self.frame); + + + min_h = kBAKit_PickerView_H + kBAKit_PickerViewToolBar_H; + min_y = min_view_h - min_h; + min_w = min_view_w; + + if (self.pickerViewPositionType == BAKit_PickerViewPositionTypeCenter) + { + min_w = 250 * BAKit_ScaleXAndWidth; + } + + self.bgView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + CGFloat min_bgView_w = CGRectGetWidth(self.bgView.frame); + CGFloat min_bgView_h = CGRectGetHeight(self.bgView.frame); + + if (self.pickerViewPositionType == BAKit_PickerViewPositionTypeCenter) + { + self.bgView.center = self.center; + } + + if (self.buttonPositionType == BAKit_PickerViewButtonPositionTypeNormal) + { + min_y = kBAKit_PickerViewToolBar_H; + min_h = kBAKit_PickerView_H; + self.pickView.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.datePicker.frame = self.pickView.frame; + + min_y = 0; + min_h = kBAKit_PickerViewToolBar_H; + self.toolBarView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_x = 20; + min_w = 40; + min_h = kBAKit_PickerViewToolBar_H; + self.cancleButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + + if (self.pickerViewPositionType == BAKit_PickerViewPositionTypeCenter && CGRectGetWidth(self.frame) > CGRectGetHeight(self.frame)) + { + min_x = min_bgView_h - 40 - 20; + } + else + { + min_x = min_bgView_w - 40 - 20; + } + self.sureButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + } + else if (self.buttonPositionType == BAKit_PickerViewButtonPositionTypeBottom) + { + min_y = 0; + min_w = min_bgView_w; + min_h = min_bgView_h - kBAKit_PickerViewToolBar_H; + min_x = 0; + self.pickView.frame = CGRectMake(min_x, min_y, min_w, min_h); + self.datePicker.frame = self.pickView.frame; + + min_y = CGRectGetMaxY(self.pickView.frame); + min_h = kBAKit_PickerViewToolBar_H; + self.toolBarView.frame = CGRectMake(min_x, min_y, min_w, min_h); + + min_y = 0; + min_x = 20; + min_w = 40; + min_h = kBAKit_PickerViewToolBar_H; + self.cancleButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + + if (self.pickerViewPositionType == BAKit_PickerViewPositionTypeCenter && min_view_w > min_view_h) + { + min_x = min_bgView_h - 40 - 20; + } + else + { + min_x = min_bgView_w - 40 - 20; + } + self.sureButton.frame = CGRectMake(min_x, min_y, min_w, min_h); + } + + if (self.pickerViewPositionType == BAKit_PickerViewPositionTypeCenter) + { + [self.bgView ba_view_setBAViewRectCornerType:BAViewRectCornerTypeAllCorners viewCornerRadius:10]; + } +} + +#pragma mark - UIPickerViewDelegate UIPickerViewDataSource +- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView +{ + switch (self.pickerViewType) { + case BAKit_PickerViewTypeCity: + return 3; + break; + case BAKit_PickerViewTypeArray: + return 1; + break; + case BAKit_PickerViewTypeDate: + return 0; + break; + case BAKit_PickerViewTypeDateWeek: + case BAKit_PickerViewTypeDateYM: + return 2; + break; + + default: + break; + } +} + +- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component +{ + switch (self.pickerViewType) { + case BAKit_PickerViewTypeCity: + { + return 0 == component ? self.provinceArray.count : 1 == component ? self.cityArray.count : self.areaArray.count; + } + break; + + case BAKit_PickerViewTypeArray: + { + return self.dataArray.count; + } + break; + + case BAKit_PickerViewTypeDate: + { + return 0; + } + break; + case BAKit_PickerViewTypeDateYM: + { + return (component == 0) ? self.yearArray.count : self.mounthArray.count; + } + break; + case BAKit_PickerViewTypeDateWeek: + { + return (component == 0) ? self.yearArray.count : self.weekArray.count; + } + break; + default: + break; + } +} + +- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component +{ + if (self.pickerViewType == BAKit_PickerViewTypeCity) + { + return 0 == component ? [self cutLocalStringForShow:self.provinceArray[row]] : 1 == component ? [self cutLocalStringForShow:self.cityArray[row]] : 0 == self.areaArray.count ? nil : [self cutLocalStringForShow:self.areaArray[row]]; + } + else if (self.pickerViewType == BAKit_PickerViewTypeArray) + { + return self.dataArray[row]; + } + else if (self.pickerViewType == BAKit_PickerViewTypeDate) + { + + } + else if (self.pickerViewType == BAKit_PickerViewTypeDateYM) + { + return (component == 0) ? self.yearArray[row] : self.mounthArray[row]; + } + else if (self.pickerViewType == BAKit_PickerViewTypeDateWeek) + { + return (component == 0) ? self.yearArray[row] : self.weekArray[row]; + } + return nil; +} + +- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component +{ + if (self.pickerViewType == BAKit_PickerViewTypeCity) + { + NSString *path = [[NSBundle mainBundle] pathForResource:@"BAPickView.bundle/BACity" ofType:@"plist"]; + NSArray *provinceArray = [[NSArray alloc]initWithContentsOfFile:path]; + + if (0 == component) + { + self.selectedArray = provinceArray[row][@"cities"]; + [self.cityArray removeAllObjects]; + + [self.selectedArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [self.cityArray addObject:obj[@"city"]]; + }]; + + self.areaArray = [NSMutableArray arrayWithArray:self.selectedArray[0][@"areas"]]; + [pickerView reloadComponent:1]; + [pickerView selectRow:0 inComponent:1 animated:YES]; + + [pickerView reloadComponent:2]; + [pickerView selectRow:0 inComponent:2 animated:YES]; + } + else if (1 == component) + { + if (0 == self.selectedArray.count) + { + self.selectedArray = provinceArray[0][@"cities"]; + } + + self.areaArray = self.selectedArray[row][@"areas"]; + [pickerView reloadComponent:2]; + [pickerView selectRow:0 inComponent:2 animated:YES]; + } + + NSInteger provinces = [pickerView selectedRowInComponent:0]; + NSInteger city = [pickerView selectedRowInComponent:1]; + NSInteger area = [pickerView selectedRowInComponent:2]; + + self.province = [self cutLocalString:self.provinceArray[provinces]]; + self.city = [self cutLocalString:self.cityArray[city]]; + self.area = 0 == self.areaArray.count ? @"" : [self cutLocalString:self.areaArray[area]]; + } + else if (self.pickerViewType == BAKit_PickerViewTypeArray) + { + self.resultString = self.dataArray[row]; + } + else if (self.pickerViewType == BAKit_PickerViewTypeDate) + { + + } + else if (self.pickerViewType == BAKit_PickerViewTypeDateYM) + { + if (component == 0) + { + self.defaultYearString = self.yearArray[row]; + } + else + { + self.defaultMounthString = self.mounthArray[row]; + } + + NSString *yearString = [self.defaultYearString substringToIndex:4]; + + NSString *monthString = @""; + NSString *month = [NSString stringWithFormat:@"%02li", (long)BAKit_Current_Date.month]; + + if ([self.defaultMounthString isEqualToString:month]) + { + monthString = month; + } + else + { + monthString = [self.defaultMounthString substringToIndex:self.defaultMounthString.length - 1]; + } + + self.resultString = [NSString stringWithFormat:@"%@-%@", yearString,monthString]; + + if (self.customDateFormatter) + { + self.resultString = [self.resultString stringByAppendingString:@"-10"]; + NSDateFormatter *formatter = [NSDateFormatter ba_setupDateFormatterWithYMD]; + NSDate *date = [formatter dateFromString:self.resultString]; + self.resultString = [self.customDateFormatter stringFromDate:date]; + } + } + else if (self.pickerViewType == BAKit_PickerViewTypeDateWeek) + { + if (component == 0) + { + self.defaultYearString = self.yearArray[row]; + [self ba_refreshWeeksByYear:self.defaultYearString]; + [pickerView reloadComponent:1]; + [pickerView selectRow:0 inComponent:1 animated:YES]; + } + else + { + self.defaultMounthString = self.weekArray[row]; + } + NSString *yearString = [self.defaultYearString substringToIndex:4]; + + NSString *weekString = @""; + NSString *week = [NSString stringWithFormat:@"%02li", (long)BAKit_Current_Date.weekOfYear]; + + if ([self.defaultMounthString isEqualToString:week]) + { + weekString = week; + } + else + { + weekString = [self.defaultWeekString substringToIndex:self.defaultWeekString.length - 1]; + } + + self.resultString = [NSString stringWithFormat:@"%@年,第 %@ 周", yearString, self.defaultWeekString]; + } +} + +- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view +{ + UILabel* pickerLabel = (UILabel*)view; + if (!pickerLabel){ + pickerLabel = [[UILabel alloc] init]; + pickerLabel.adjustsFontSizeToFitWidth = YES; + pickerLabel.textAlignment = NSTextAlignmentCenter; + pickerLabel.backgroundColor = [UIColor clearColor]; + pickerLabel.font = self.ba_pickViewFont; + pickerLabel.textColor = self.ba_pickViewTextColor; + } + pickerLabel.text = [self pickerView:pickerView titleForRow:row forComponent:component]; + return pickerLabel; +} + +#pragma mark - custom method +- (void)ba_pickViewShow +{ + [self.alertWindow addSubview:self]; + [self ba_layoutSubViews]; + + [self ba_pickViewShowAnimation]; +} + +- (void)ba_pickViewHidden +{ +// self.isAnimating = YES; +// BAKit_WeakSelf +// [self.bgView ba_animation_scaleDismissWithDuration:0.6f ratio:1.0f finishBlock:^{ +// BAKit_StrongSelf +// self.isAnimating = NO; +// [self ba_removeSelf]; +// }]; + [self ba_pickViewHiddenAnimation]; +} + +#pragma mark 进场动画 + +- (void)ba_pickViewShowAnimation +{ + self.isAnimating = YES; + BAKit_WeakSelf + switch (self.animationType) { + case BAKit_PickerViewAnimationTypeScale: + { + [self.bgView ba_animation_scaleShowWithDuration:0.6f ratio:1.0f finishBlock:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + break; + case BAKit_PickerViewAnimationTypeTop: + { + [self.bgView ba_animation_showFromPositionType:BAAnimationPositionTypeTop duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + break; + case BAKit_PickerViewAnimationTypeBottom: + { + [self.bgView ba_animation_showFromPositionType:BAAnimationPositionTypeBottom duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + break; + case BAKit_PickerViewAnimationTypeLeft: + { + [self.bgView ba_animation_showFromPositionType:BAAnimationPositionTypeLeft duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + break; + case BAKit_PickerViewAnimationTypeRight: + { + [self.bgView ba_animation_showFromPositionType:BAAnimationPositionTypeRitht duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.isAnimating = NO; + }]; + } + break; + + default: + break; + } +} + +#pragma mark 出场动画 +- (void)ba_pickViewHiddenAnimation +{ + self.isAnimating = YES; + self.bgView.alpha = 1.0f; + BAKit_WeakSelf + switch (self.animationType) { + case BAKit_PickerViewAnimationTypeScale: + { + [self.bgView ba_animation_scaleDismissWithDuration:0.6f ratio:1.0f finishBlock:^{ + BAKit_StrongSelf + self.bgView.alpha = 0.1f; + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + break; + case BAKit_PickerViewAnimationTypeTop: + { + [self.bgView ba_animation_dismissFromPositionType:BAAnimationPositionTypeTop duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.bgView.alpha = 0.1f; + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + break; + case BAKit_PickerViewAnimationTypeBottom: + { + [self.bgView ba_animation_dismissFromPositionType:BAAnimationPositionTypeBottom duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.bgView.alpha = 0.1f; + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + break; + case BAKit_PickerViewAnimationTypeLeft: + { + [self.bgView ba_animation_dismissFromPositionType:BAAnimationPositionTypeLeft duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.bgView.alpha = 0.1f; + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + break; + case BAKit_PickerViewAnimationTypeRight: + { + [self.bgView ba_animation_dismissFromPositionType:BAAnimationPositionTypeRitht duration:0.6f finishBlock:^{ + BAKit_StrongSelf + self.bgView.alpha = 0.1f; + self.isAnimating = NO; + [self ba_removeSelf]; + }]; + } + break; + + default: + break; + } +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + NSLog(@"触摸了边缘隐藏View!"); + UITouch *touch = [touches anyObject]; + UIView *view = [touch view]; + + if (self.isAnimating) + { + NSLog(@"请在动画结束时点击!"); + return; + } + if (!self.isTouchEdgeHide) + { + NSLog(@"触摸了View边缘,但您未开启触摸边缘隐藏方法,请设置 isTouchEdgeHide 属性为 YES 后再使用!"); + return; + } + + if ([view isKindOfClass:[self class]]) + { + [self ba_pickViewHidden]; + } +} + +- (void)handleButtonAction:(UIButton *)sender +{ + if (sender.tag == 1000) + { + [self ba_pickViewHidden]; + } + else if (sender.tag == 1001) + { + if (self.pickerViewType == BAKit_PickerViewTypeCity) + { + if (self.province.length > 0) + { + BAKit_CityModel *model = [[BAKit_CityModel alloc] init]; + model.province = self.province; + model.city = self.city; + model.area = self.area; + + CLLocationCoordinate2D coordie; + coordie.latitude = 0; + coordie.longitude = 0; + + if (m_local2DString.length > 0) + { + NSArray *arr = [m_local2DString componentsSeparatedByString:NSLocalizedString(@",", nil)]; + if([arr count] > 1) + { + coordie.latitude = [arr[0] floatValue]; + coordie.longitude = [arr[1] floatValue]; + } + } + model.coordie = coordie; + if (self.block) + { + self.block(model); + } + } + } + else if (self.pickerViewType == BAKit_PickerViewTypeArray || + self.pickerViewType == BAKit_PickerViewTypeDate || + self.pickerViewType == BAKit_PickerViewTypeDateYM || + self.pickerViewType == BAKit_PickerViewTypeDateWeek ) + { + if (self.resultString.length > 0) + { + if (self.resultBlock) + { + self.resultBlock(self.resultString); + } + } + else + { + + } + } + + [self ba_pickViewHidden]; + } +} + +#pragma mark 默认配置:城市选择器 +- (void)setupCityData +{ + NSString *path = [[NSBundle mainBundle] pathForResource:@"BAPickView.bundle/BACity" ofType:@"plist"]; + NSArray *provinceArray = [[NSArray alloc]initWithContentsOfFile:path]; + + [self ba_removcArray:self.provinceArray]; + [self ba_removcArray:self.cityArray]; + [self ba_removcArray:self.areaArray]; + + [provinceArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [self.provinceArray addObject:obj[@"state"]]; + }]; + + NSMutableArray *citys = provinceArray[0][@"cities"]; + [citys enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + [self.cityArray addObject:obj[@"city"]]; + }]; + + self.areaArray = citys[0][@"areas"]; + + // 设置城市选择器的默认值 + self.province = [self cutLocalString:self.provinceArray[0]]; + self.city = [self cutLocalString:self.cityArray[0]]; + self.area = 0 == self.areaArray.count ? @"" : [self cutLocalString:self.areaArray[0]]; +} + +- (void)ba_removcArray:(NSMutableArray *)array +{ + if (array.count > 0) + { + [array removeAllObjects]; + } +} + +- (NSString *)cutLocalStringForShow:(NSString *)iStr +{ + // 对显示坐标进行去重 + NSArray *arr = [iStr componentsSeparatedByString:NSLocalizedString(@"|", nil)]; + if([arr count] < 2) return iStr; + return arr[0]; +} + +- (NSString *)cutLocalString:(NSString *)iStr +{ + // 对显示坐标进行去重 + NSArray * arr = [iStr componentsSeparatedByString:NSLocalizedString(@"|", nil)]; + if([arr count] < 2) return iStr; + m_local2DString = arr[1]; + return arr[0]; +} + +#pragma mark 默认配置:日期选择器-年月 +- (void)setupDateYM +{ + NSDate *current_date = [NSDate date]; + NSInteger current_year = current_date.year; + + self.defaultYearString = [NSString stringWithFormat:@"%04li", current_year]; + if (self.pickerViewType == BAKit_PickerViewTypeDateWeek) + { + self.defaultWeekString = [NSString stringWithFormat:@"%ld", (long)current_date.weekOfYear]; + } + else + { + NSInteger current_mounth = current_date.month; + self.defaultMounthString = [NSString stringWithFormat:@"%02li", current_mounth]; + } + + NSInteger index_year = [self.defaultYearString integerValue]; + NSInteger index_mounth = [self.defaultMounthString integerValue]; + NSInteger index_week = [self.defaultWeekString integerValue]; + + [self.pickView selectRow:(index_year - 1900) inComponent:0 animated:YES]; + + // 设置年月、年周选择器的默认值 + if (self.pickerViewType == BAKit_PickerViewTypeDateWeek) + { + [self ba_refreshWeeksByYear:self.defaultYearString]; + [self.pickView reloadComponent:1]; + [self.pickView selectRow:(index_week - 1) inComponent:1 animated:YES]; + + self.resultString = [NSString stringWithFormat:@"%@年,第 %@ 周", self.defaultYearString, self.defaultWeekString]; + } + else + { + [self.pickView selectRow:(index_mounth - 1) inComponent:1 animated:YES]; + + self.resultString = [NSString stringWithFormat:@"%@-%@", self.defaultYearString, self.defaultMounthString]; + + if (self.customDateFormatter) + { + self.resultString = [self.resultString stringByAppendingString:@"-10"]; + NSDateFormatter *formatter = [NSDateFormatter ba_setupDateFormatterWithYMD]; + NSDate *date = [formatter dateFromString:self.resultString]; + self.resultString = [self.customDateFormatter stringFromDate:date]; + } + } +} + +#pragma mark 刷新年份的最大周数 +- (void)ba_refreshWeeksByYear:(NSString *)year +{ + [self ba_removcArray:self.weekArray]; + + for (NSInteger i = 1; i < [NSDate ba_dateGetWeekNumbersOfYear:[year integerValue]]+1; i++) + { + [self.weekArray addObject:[NSString stringWithFormat:@"第 %ld 周", i]]; + } +} + +#pragma mark 日期选择器数据更新 +- (void)datePickValueChanged:(UIDatePicker *)sender +{ + self.resultString = [self.formatter stringFromDate:sender.date]; +} + +#pragma mark 计算出当月有多少天 +- (NSInteger)ba_totaldaysInMonth:(NSDate *)date +{ + NSRange daysInOfMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; + return daysInOfMonth.length; +} + +- (void)ba_removeSelf +{ + if (self.toolBarView) + { + [self.toolBarView removeFromSuperview]; + self.toolBarView = nil; + } + + if (self.bgView) + { + [self.bgView removeFromSuperview]; + self.bgView = nil; + } + + if (self.pickView) + { + [self.pickView removeFromSuperview]; + self.pickView = nil; + } + +// if (self.datePicker) +// { +// [self.datePicker removeFromSuperview]; +// self.datePicker = nil; +// } + self.alertWindow = nil; + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [self removeAllSubviews]; + [self removeFromSuperview]; +} + +- (void)removeAllSubviews +{ + //[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + while (self.subviews.count) { + [self.subviews.lastObject removeFromSuperview]; + } +} + +- (void)dealloc +{ + [self ba_removeSelf]; +} + +#pragma mark - setter / getter + +- (UIView *)bgView +{ + if (!_bgView) + { + _bgView = [UIView new]; + self.bgView.backgroundColor = BAKit_Color_Clear; + + [self addSubview:self.bgView]; + } + return _bgView; +} + +- (UIPickerView *)pickView +{ + if (!_pickView) + { + _pickView = [UIPickerView new]; + + [self.bgView addSubview:self.pickView]; + } + return _pickView; +} + +- (UIDatePicker *)datePicker +{ + if (!_datePicker) + { + _datePicker = [[UIDatePicker alloc] init]; + + /*! 跟踪所有可用的地区,取出想要的地区 */ +// NSLog(@"%@", [NSLocale availableLocaleIdentifiers]); + + /*! 1、设置日期选择控件的地区 */ + [_datePicker setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"zh_Hans_CN"]]; + /*! 英文 */ + // [_datePicker setLocale:[[NSLocale alloc]initWithLocaleIdentifier:@"en_SC"]]; + + /*! 2、设置DatePicker的日历。默认为当天。 */ + [_datePicker setCalendar:[NSCalendar currentCalendar]]; + + /*! 3、设置DatePicker的时区。*/ + [_datePicker setTimeZone:[NSTimeZone defaultTimeZone]]; + + /*! 4、设置DatePicker的日期。 */ + [_datePicker setDate:BAKit_Current_Date]; + + /*! 5、设置DatePicker的允许的最小日期。 */ + // NSDate *minDate = [[NSDate alloc]initWithTimeIntervalSince1970:NSTimeIntervalSince1970]; + // _datePicker.minimumDate = minDate; + + /*! 6、设置DatePicker的允许的最大日期。 */ + NSDateComponents *dc = [[NSDateComponents alloc] init]; + dc.year = 2099; + NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + _datePicker.maximumDate = [gregorian dateFromComponents:dc]; + + /*! 6.1 限定UIDatePicker的时间范围 */ + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDate *currentDate = [NSDate date]; + NSDateComponents *comps = [[NSDateComponents alloc] init]; + comps.year = 30; + NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0]; + comps.year = -30; + + NSDate *minDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0]; + _datePicker.minimumDate = [minDate ba_dateWithYMD]; + _datePicker.maximumDate = [maxDate ba_dateWithYMD]; + +// /*! 7、显示年月日,名称根据本地设置,显示小时,分钟和AM/PM,这个的名称是根据本地设置的 */ +// [_datePicker setDatePickerMode:UIDatePickerModeDate]; +// + /*! 8、当值发生改变的时候调用的方法 */ + [_datePicker addTarget:self action:@selector(datePickValueChanged:) forControlEvents:UIControlEventValueChanged]; + + /*! 9、用 runtime 和 KVC 改变字体颜色 */ +// [self setTextColor]; + } + return _datePicker; +} + +- (UIView *)toolBarView +{ + if (!_toolBarView) + { + _toolBarView = [UIView new]; + + [self.bgView addSubview:self.toolBarView]; + } + return _toolBarView; +} + +- (UIButton *)cancleButton +{ + if (!_cancleButton) + { + _cancleButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [self.cancleButton setTitle:@"取消" forState:UIControlStateNormal]; + [self.cancleButton setTitleColor:BAKit_Color_Black forState:UIControlStateNormal]; + [self.cancleButton addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + self.cancleButton.tag = 1000; + [self.toolBarView addSubview:self.cancleButton]; + } + return _cancleButton; +} + +- (UIButton *)sureButton +{ + if (!_sureButton) + { + _sureButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [self.sureButton setTitle:@"确定" forState:UIControlStateNormal]; + [self.sureButton setTitleColor:BAKit_Color_Black forState:UIControlStateNormal]; + [self.sureButton addTarget:self action:@selector(handleButtonAction:) forControlEvents:UIControlEventTouchUpInside]; + self.sureButton.tag = 1001; + [self.toolBarView addSubview:self.sureButton]; + } + return _sureButton; +} + +- (UIWindow *)alertWindow +{ + if (!_alertWindow) + { + _alertWindow = [UIApplication sharedApplication].keyWindow; + + if (self.alertWindow.windowLevel != UIWindowLevelNormal) + { + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"windowLevel == %ld AND hidden == 0 " , UIWindowLevelNormal]; + self.alertWindow = [[UIApplication sharedApplication].windows filteredArrayUsingPredicate:predicate].firstObject; + } + self.alertWindow.backgroundColor = BAKit_Color_Translucent; + } + return _alertWindow; +} + +- (NSMutableArray *)provinceArray +{ + if (!_provinceArray) + { + _provinceArray = @[].mutableCopy; + } + return _provinceArray; +} + +- (NSMutableArray *)cityArray +{ + if (!_cityArray) + { + _cityArray = @[].mutableCopy; + } + return _cityArray; +} + +- (NSMutableArray *)areaArray +{ + if (!_areaArray) + { + _areaArray = @[].mutableCopy; + } + return _areaArray; +} + +- (NSMutableArray *)selectedArray +{ + if (!_selectedArray) + { + _selectedArray = @[].mutableCopy; + } + return _selectedArray; +} + +- (NSMutableArray *)yearArray +{ + if (!_yearArray) + { + _yearArray = @[].mutableCopy; + for (int i = 1900; i < 2100; i++) + { + NSString *str = [NSString stringWithFormat:@"%04i%@",i,@"年"]; + [self.yearArray addObject:str]; + } + } + return _yearArray; +} + +- (NSMutableArray *)mounthArray +{ + if (!_mounthArray) + { + _mounthArray = @[].mutableCopy; + for (int i = 1; i < 13; i++) + { + NSString *str = [NSString stringWithFormat:@"%02i%@",i,@"月"]; + [self.mounthArray addObject:str]; + } + } + return _mounthArray; +} + +- (NSMutableArray *)weekArray +{ + if (!_weekArray) + { + _weekArray = @[].mutableCopy; + } + return _weekArray; +} + +- (void)setDataArray:(NSArray *)dataArray +{ + _dataArray = dataArray; + self.resultString = dataArray[0]; +} + +- (void)setBackgroundColor_toolBar:(UIColor *)backgroundColor_toolBar +{ + _backgroundColor_toolBar = backgroundColor_toolBar; + self.toolBarView.backgroundColor = backgroundColor_toolBar; +} + +- (void)setBackgroundColor_pickView:(UIColor *)backgroundColor_pickView +{ + _backgroundColor_pickView = backgroundColor_pickView; + self.pickView.backgroundColor = backgroundColor_pickView; + self.datePicker.backgroundColor = backgroundColor_pickView; +} + +- (void)setButtonTitleColor_cancle:(UIColor *)buttonTitleColor_cancle +{ + _buttonTitleColor_cancle = buttonTitleColor_cancle; + [self.cancleButton setTitleColor:buttonTitleColor_cancle forState:UIControlStateNormal]; +} + +- (void)setButtonTitleColor_sure:(UIColor *)buttonTitleColor_sure +{ + _buttonTitleColor_sure = buttonTitleColor_sure; + [self.sureButton setTitleColor:buttonTitleColor_sure forState:UIControlStateNormal]; +} + +- (void)setPickerViewType:(BAKit_PickerViewType)pickerViewType +{ + _pickerViewType = pickerViewType; + + switch (pickerViewType) { + case BAKit_PickerViewTypeCity: + { + if (self.datePicker) + { + [self.datePicker removeFromSuperview]; + } + + [self setupCityData]; + } + break; + case BAKit_PickerViewTypeArray: + { + if (self.datePicker) + { + [self.datePicker removeFromSuperview]; + } + } + break; + case BAKit_PickerViewTypeDate: + { + if (self.pickView) + { + [self.pickView removeFromSuperview]; + } + [self.bgView addSubview:self.datePicker]; + } + break; + case BAKit_PickerViewTypeDateYM: + { + if (self.datePicker) + { + [self.datePicker removeFromSuperview]; + } + self.dateType = BAKit_PickerViewDateTypeYM; + [self setupDateYM]; + } + break; + case BAKit_PickerViewTypeDateWeek: + { + if (self.datePicker) + { + [self.datePicker removeFromSuperview]; + } + self.dateType = BAKit_PickerViewDateTypeYM; + [self setupDateYM]; + } + break; + + default: + break; + } +} + +- (void)setDateType:(BAKit_PickerViewDateType)dateType +{ + _dateType = dateType; + + if (self.customDateFormatter) + { + self.resultString = [self.resultString stringByAppendingString:@"-10"]; + NSDateFormatter *formatter = [NSDateFormatter ba_setupDateFormatterWithYMD]; + NSDate *date = [formatter dateFromString:self.resultString]; + self.resultString = [self.customDateFormatter stringFromDate:date]; + } + else + { + switch (self.dateType) { + case BAKit_PickerViewDateTypeYY: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithYY]; + break; + case BAKit_PickerViewDateTypeYM: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithYM]; + break; + case BAKit_PickerViewDateTypeYMD: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithYMD]; + break; + case BAKit_PickerViewDateTypeYMDHMS: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithYMDHMS]; + break; + case BAKit_PickerViewDateTypeYMDEHMS: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithYMDEHMS]; + break; + case BAKit_PickerViewDateTypeHM: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithHM]; + break; + case BAKit_PickerViewDateTypeHMS: + self.formatter = [NSDateFormatter ba_setupDateFormatterWithHMS]; + break; + + default: + break; + } + self.resultString = [self.formatter stringFromDate:BAKit_Current_Date]; + } +} + +- (void)setDateMode:(BAKit_PickerViewDateMode)dateMode +{ + _dateMode = dateMode; + switch (dateMode) { + case BAKit_PickerViewDateModeTime: + /*! 7、显示年月日,名称根据本地设置,显示小时,分钟和AM/PM,这个的名称是根据本地设置的 */ + [self.datePicker setDatePickerMode:UIDatePickerModeTime]; + break; + case BAKit_PickerViewDateModeDate: +// self.dateType = BAKit_PickerViewDateTypeYMD; + [self.datePicker setDatePickerMode:UIDatePickerModeDate]; + break; + case BAKit_PickerViewDateModeDateAndTime: + self.dateType = BAKit_PickerViewDateTypeYMDEHMS; + [self.datePicker setDatePickerMode:UIDatePickerModeDateAndTime]; + break; + case BAKit_PickerViewDateModeCountDownTimer: + [self.datePicker setDatePickerMode:UIDatePickerModeCountDownTimer]; + break; + + default: + break; + } +} + +- (void)setCustomDateFormatter:(NSDateFormatter *)customDateFormatter +{ + _customDateFormatter = customDateFormatter; + self.formatter = customDateFormatter; +} + +- (void)setIsAnimating:(BOOL)isAnimating +{ + _isAnimating = isAnimating; +} + +- (void)setIsTouchEdgeHide:(BOOL)isTouchEdgeHide +{ + _isTouchEdgeHide = isTouchEdgeHide; +} + +- (void)setAnimationType:(BAKit_PickerViewAnimationType)animationType +{ + _animationType = animationType; +} + +- (void)setBa_pickViewFont:(UIFont *)ba_pickViewFont +{ + _ba_pickViewFont = ba_pickViewFont; +} + +- (void)setBa_pickViewTextColor:(UIColor *)ba_pickViewTextColor +{ + _ba_pickViewTextColor = ba_pickViewTextColor; +} + +@end + +@implementation BAKit_CityModel + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/BAPickView.bundle/BACity.plist b/Pods/BAPickView/BAPickView/BAPickView/BAPickView.bundle/BACity.plist new file mode 100644 index 0000000..05e29de --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/BAPickView.bundle/BACity.plist @@ -0,0 +1,6272 @@ + + + + + + cities + + + areas + + city + 通州|39.9161,116.6635 + + + areas + + city + 房山|39.7541,116.1493 + + + areas + + city + 昌平|40.2264,116.2378 + + + areas + + city + 顺义|40.1363,116.6611 + + + areas + + city + 怀柔|40.3223,116.6381 + + + areas + + city + 大兴|39.7324,116.3482 + + + areas + + city + 密云|40.3821,116.8497 + + + areas + + city + 平谷|40.1469,117.1277 + + + areas + + city + 延庆|40.4624,115.9816 + + + areas + + city + 东城|39.9347,116.4227 + + + areas + + city + 崇文|39.9010,116.4355 + + + areas + + city + 西城|39.9182,116.3726 + + + areas + + city + 朝阳|39.9276,116.4501 + + + areas + + city + 宣武|39.8986,116.3696 + + + areas + + city + 石景山|39.9113,116.2296 + + + areas + + city + 丰台|39.8648,116.2925 + + + areas + + city + 门头沟|39.9461,116.1080 + + + areas + + city + 海淀|39.9655,116.3048 + + + state + 北京|39.9110,116.4135 + + + cities + + + areas + + city + 普陀|31.2551,121.4035 + + + areas + + city + 闸北|31.2880,121.4577 + + + areas + + city + 虹口|31.2701,121.5117 + + + areas + + city + 杨浦|31.2654,121.5326 + + + areas + + city + 卢湾|31.2133,121.4812 + + + areas + + city + 徐汇|31.1946,121.4432 + + + areas + + city + 长宁|31.2264,121.4303 + + + areas + + city + 静安|31.2297,121.4623 + + + areas + + city + 黄浦|31.2373,121.4911 + + + areas + + city + 金山|30.7479,121.3489 + + + areas + + city + 浦东新|31.1675,121.4919 + + + areas + + city + 嘉定|31.3804,121.2728 + + + areas + + city + 闵行|31.1188,121.3886 + + + areas + + city + 宝山|31.4109,121.4959 + + + areas + + city + 南汇|31.0643,121.7621 + + + areas + + city + 青浦|31.1555,121.1308 + + + areas + + city + 松江|31.0384,121.2330 + + + areas + + city + 奉贤|30.9239,121.4806 + + + areas + + city + 崇明|31.6286,121.4038 + + + state + 上海|31.2363,121.4802 + + + cities + + + areas + + city + 武清|39.3890,117.0507 + + + areas + + city + 河东|39.1266,117.2616 + + + areas + + city + 和平|39.1232,117.2211 + + + areas + + city + 西青|39.1474,117.0137 + + + areas + + city + 津南|38.9697,117.3929 + + + areas + + city + 大港|38.8663,117.4840 + + + areas + + city + 东丽|39.0922,117.3208 + + + areas + + city + 塘沽|39.0411,117.6797 + + + areas + + city + 汉沽|39.2158,117.7814 + + + areas + + city + 河北|39.1731,117.2202 + + + areas + + city + 红桥|39.1733,117.1581 + + + areas + + city + 河西|39.0844,117.2361 + + + areas + + city + 南开|39.1441,117.1566 + + + areas + + city + 蓟县|40.0514,117.4148 + + + areas + + city + 宁河|39.3370,117.8311 + + + areas + + city + 静海|38.9534,116.9807 + + + areas + + city + 宝坻|39.7232,117.3164 + + + areas + + city + 北辰|39.2301,117.1418 + + + state + 天津|39.0909,117.2059 + + + cities + + + areas + + city + 开县|31.1669,108.3996 + + + areas + + city + 江北|29.9663,121.4932 + + + areas + + city + 沙坪坝|29.5471,106.4641 + + + areas + + city + 九龙坡|29.5078,106.5179 + + + areas + + city + 南岸|29.5279,106.5689 + + + areas + + city + 北碚|29.8116,106.4028 + + + areas + + city + 万盛|28.9164,106.9237 + + + areas + + city + 双桥|29.5028,105.7934 + + + areas + + city + 渝北|29.8162,106.7537 + + + areas + + city + 巴南|29.3780,106.7582 + + + areas + + city + 黔江|29.5389,108.7776 + + + areas + + city + 垫江|30.3324,107.3417 + + + areas + + city + 武隆|29.3317,107.7663 + + + areas + + city + 巫山|31.0804,109.8853 + + + areas + + city + 巫溪|31.4048,109.5765 + + + areas + + city + 云阳|30.9367,108.7034 + + + areas + + city + 奉节|31.0245,109.4705 + + + areas + + city + 忠县|30.3061,108.0442 + + + areas + + city + 梁平|30.6795,107.8088 + + + areas + + city + 璧山|29.5675,106.1987 + + + areas + + city + 荣昌|29.4111,105.6008 + + + areas + + city + 大足|29.6607,105.7476 + + + areas + + city + 铜梁|29.8183,106.0392 + + + areas + + city + 潼南|30.1499,105.8196 + + + areas + + city + 綦江|28.8761,106.6792 + + + areas + + city + 长寿|29.8636,107.0875 + + + areas + + city + 彭水|29.2995,108.1721 + + + areas + + city + 酉阳|28.8470,108.7743 + + + areas + + city + 合川|29.9786,106.2833 + + + areas + + city + 江津|29.2958,106.2659 + + + areas + + city + 南川|29.1635,107.1055 + + + areas + + city + 永川|29.3619,105.9335 + + + areas + + city + 丰都|29.8695,107.7373 + + + areas + + city + 城口|31.9533,108.6709 + + + areas + + city + 大渡口|29.4898,106.4887 + + + areas + + city + 渝中|29.5552,106.5469 + + + areas + + city + 涪陵|29.7094,107.3962 + + + areas + + city + 万州|30.8136,108.4152 + + + areas + + city + 石柱|30.0059,108.1205 + + + areas + + city + 秀山|28.4548,109.0078 + + + state + 重庆|29.5709,106.5571 + + + cities + + + areas + + 莲都区|28.4518,119.9193 + 青田县|28.1455,120.2961 + 缙云县|28.6653,120.0980 + 龙泉市|28.0805,119.1481 + 景宁畲族自治县|27.9795,119.6422 + 庆元|27.6252,119.0691县 + 云和县|28.1215,119.5799 + 遂昌县|28.5984,119.2824 + 松阳县|28.4553,119.4885 + + city + 丽水|28.4729,119.9295 + + + areas + + 普陀区|29.9553,122.3092 + 定海区|30.0254,122.1133 + 嵊泗县|30.7314,122.4579 + 岱山县|30.2494,122.2115 + + city + 舟山|29.9910,122.2143 + + + areas + + 鄞州区|29.8234,121.5534 + 象山县|29.4823,121.8758 + 北仑区|29.9046,121.8508 + 镇海区|29.9548,121.7227 + 慈溪市|30.1752,121.2730 + 奉化市|29.6609,121.4133 + 宁海县|29.2943,121.4360 + 海曙区|29.8658,121.5572 + 江东区|29.8732,121.5765 + 江北区|29.8925,121.5611 + 余姚市|30.0428,121.1609 + + city + 宁波|29.8801,121.5566 + + + areas + + 常山县|28.9071,118.5177 + 开化县|29.1421,118.4206 + 柯城区|28.9743,118.8777 + 衢江区|28.9854,118.9657 + 江山市|28.7429,118.6334 + 龙游县|29.0345,119.1786 + + city + 衢州|28.9416,118.8807 + + + areas + + 鹿城区|28.0203,120.6618 + 龙湾|27.9385,120.8194区 + 乐清市|28.1190,120.9898 + 文成县|27.7931,120.0978 + 苍南县|27.5230,120.4329 + 瑞安市|27.7840,120.6617 + 泰顺县|27.5621,119.7240 + 洞头县|27.8419,121.1637 + 瓯海区|28.0129,120.6442 + 平阳县|27.6680,120.5724 + 永嘉县|28.1593,120.6981 + + city + 温州|28.0010,120.7058 + + + areas + + 萧山区|30.1914,120.2710 + 余杭区|30.4243,120.3050 + 桐庐县|29.7988,119.6981 + 淳安县|29.6152,119.0484 + 拱墅区|30.3258,120.1485 + 江干区|30.2631,120.2117 + 下城区|30.2868,120.1877 + 上城区|30.2482,120.1758 + 临安市|30.2397,119.7313 + 滨江区|30.2144,120.2184 + 西湖区|30.2659,120.1366 + 建德市|29.4811,119.2876 + 富阳市|30.0010,119.8466 + + city + 杭州|30.2800,120.1616 + + + areas + + 玉环县|28.1418,121.2381 + 路桥|28.5869,121.3714区 + 三门县|29.1104,121.4022 + 天台县|29.1487,121.0138 + 仙居县|28.8531,120.7352 + 温岭市28.3774,121.3925 + 黄岩区|28.6552,121.2695 + 椒江区|28.6794,121.4493 + 临海市|28.8640,121.1515 + + city + 台州|28.6622,121.4269 + + + areas + + 秀城区|30.7152,120.9319 + 秀洲区|30.7701,120.7156 + 嘉善县|30.8366,120.9336 + 海盐县|30.5318,120.9522 + 海宁市|30.5152,120.6875 + 平湖市|30.6714,121.0226 + 桐乡|30.6366,120.5708市 + + city + 嘉兴|30.7509,120.7620 + + + areas + + 新昌县|29.5054,120.9104 + 绍兴|30.0365,120.5866县 + 越城区|29.9952,120.5884 + 嵊州市|29.5946,120.8281 + 上虞市|29.9780,120.8894 + 诸暨市|29.7199,120.2427 + + city + 绍兴|30.0365,120.5866 + + + areas + + 东阳市|29.2958,120.2483 + 永康市|28.8942,120.0538 + 兰溪市|29.2140,119.4671 + 义乌市|29.3113,120.0812 + 浦江县|29.4588,119.8984 + 磐安县|29.0600,120.4567 + 武义县|28.8982,119.8230 + 金东区|29.1048,119.36996 + 婺城区|29.0919,119.5780 + + city + 金华|29.0844,119.6540 + + + areas + + 德清县|30.5488,119.9840 + 长兴县|31.0326,119.9166 + 安吉县|30.6440,119.6887 + 吴兴区|30.8638,120.1922 + 南浔区|30.8554,120.4250 + + city + 湖州|30.8990,120.0945 + + + state + 浙江|30.2714,120.1601 + + + cities + + + areas + + 香洲区|22.2727,113.5498 + 斗门区|22.2152,113.3030 + 金湾区|22.1517,113.3707 + + city + 珠海|22.2763,113.5832 + + + areas + + 博罗县|23.1788,114.2963 + 惠城区|23.0899,114.3892 + 龙门县|23.7338,114.2612 + 惠东县|22.9912,114.7264 + 惠阳区|22.7946,114.4629 + + city + 惠州|23.1164,114.4233 + + + areas + + 连山壮族瑶族自治县|24.5773,112.100 + 阳山县|24.4708,112.6478 + 佛冈县|23.8854,113.5381 + 清城区|23.7040,113.0691 + 连南瑶族自治县|24.7313,112.2934 + 清新县|23.8991,112.8865 + 英德市|24.1919,113.4214 + 连州市|24.7856,112.3833 + + city + 清远|23.6882,113.0626 + + + areas + + 南雄市|25.1253,114.3174 + 乐昌市|25.1358,113.3540 + 浈江区|24.8104,113.6174 + 武江区|24.7983,113.5942 + 翁源县|24.3564,114.1367 + 仁化县|25.0919,113.7556 + 始兴县|24.9583,114.0686 + 曲江区|24.6885,113.6110 + 新丰县|24.0655,114.2134 + 乳源瑶族自治县|24.7822,113.2823 + + city + 韶关|24.8161,113.6037 + + + areas + + 台山市|22.2578,112.8003 + 开平市|22.3825,112.7049 + 江海区|22.5659,113.1175 + 新会区|22.4650,113.0387 + 蓬江区|22.6009,113.0849 + 鹤山市|22.7710,112.9708 + 恩平市|22.1891,112.3117 + + city + 江门|22.5844,113.0881 + + + areas + + 普宁市|23.3036,116.1721 + 惠来县|23.0394,116.3015 + 榕城区|23.5308,116.3734 + 揭东县|23.6067,116.3617 + 揭西县|23.4372,115.8484 + + city + 揭阳|23.5557,116.3792 + + + areas + + 郁南县|23.2403,111.5419 + 云安县|22.8473,111.9631 + 云城区|22.9338,112.0502 + 新兴县|22.7018,112.2318 + 罗定市|22.7742,111.576 + + city + 云浮|22.9211,112.0510 + + + areas + + 南海区|23.0350,113.1492 + 禅城区|23.0153,113.1289 + 三水区|23.1619,112.9031 + 顺德区|22.8103,113.3008 + 高明区|22.9063,112.8990 + + city + 佛山|23.0277,113.1284 + + + areas + + 海珠区|23.0819,113.3237 + 天河区|23.1304,113.3684 + 花都区|23.4095,113.2268 + 番禺区|22.9432,113.3882 + 黄埔区|23.1872,113.4872 + 白云区|23.1642,113.2796 + 从化市|23.6802,113.6848 + 增城市|23.3467,113.7676 + 荔湾区|23.1317,113.2507 + 越秀区|23.1351,113.2732 + 萝岗区|23.2562,113.5225 + 南沙区|22.8080,113.5314 + + city + 广州|23.1353,113.2707 + + + areas + + 南山区|22.5390,113.9369 + 宝安区|22.5596,113.8895 + 龙岗区|22.7262,114.2542 + 盐田区|22.5641,114.2439 + 福田区|22.5285,114.0610 + 罗湖区|22.5552,114.1375 + + city + 深圳|22.5485,114.0661 + + + areas + + 源城区|23.7403,114.7088 + 紫金县|23.6415,115.1904 + 龙川县|24.1057,115.2663 + 连平县|24.3758,114.4950 + 东源县|23.7942,114.7529 + 和平县|24.4481,114.9451 + + city + 河源|23.7498,114.7070 + + + areas + + 龙湖区|23.3782,116.7232 + 潮阳区|23.2707,116.6080 + 金平区|23.3709,116.7119 + 潮南区|23.2562,116.4395 + 濠江区|23.2918,116.7331 + 南澳县|23.4279,117.0299 + 澄海区|23.4724,116.7625 + + city + 汕头|23.3592,116.6887 + + + areas + + 陆河县|23.3076,115.6664 + 陆丰市|22.9510,115.6511 + 城区 + 海丰县|22.9729,115.3298 + + city + 汕尾|22.7913,115.3816 + + + areas + + 化州市|21.6703,110.6459 + 高州市|21.9241,110.8598 + 信宜市|22.3599,110.9536 + 电白县|21.6850,111.2405 + 茂港区|21.5794,110.9862 + 茂南区|21.6469,110.9253 + + city + 茂名|21.6690,110.9317 + + + areas + + 四会市|23.3331,112.7406 + 端州区|23.0577,112.4911 + 鼎湖区|23.1644,112.5734 + 广宁县|23.6412,112.4475 + 怀集县|23.9181,112.1910 + 封开县|23.4304,111.5184 + 德庆县|23.1494,111.7921 + 高要市|23.0320,112.4648 + + city + 肇庆|23.0529,112.4717 + + + areas + + 厚街|30.4763,106.6463 + 樟木头|22.9208,114.0897 + 石龙|30.6757,106.7332 + 长安|22.8210,113.8090 + 虎门|22.8206,113.6793 + + city + 东莞|23.0269,113.7582 + + + areas + + 遂溪县|21.3830,110.2565 + 赤坎区|21.2721,110.3718 + 霞山区|21.1980,110.4046 + 雷州市|20.9201,110.1030 + 廉江市|21.6159,110.2926 + 徐闻县|20.3327,110.1814 + 麻章区|21.2689,110.3408 + 吴川市|21.4480,110.7846 + 坡头区|21.2504,110.4620 + + city + 湛江|21.2771,110.3654 + + + areas + + 湘桥区|23.6807,116.6348 + 潮安县|23.7259,116.6338 + 饶平县|23.6704,117.0103 + + city + 潮州|23.6629,116.6294 + + + areas + + 阳春市|22.1760,111.7980 + 阳东县|21.9638,112.0662 + 阳西县|21.7584,111.6243 + 江城区|21.8681,111.9616 + + city + 阳江|21.8644,111.9890 + + + areas + + city + 中山|22.5222,113.3990 + + + areas + + 蕉岭县|24.6649,116.1776 + 兴宁市|24.1421,115.7377 + 梅县|24.3714,116.1995 + 梅江区|24.3157,116.1235 + 丰顺县|23.7455,116.1887 + 大埔县|24.3535,116.7017 + 平远县|24.5723,115.8975 + 五华县|23.9386,115.7825 + + city + 梅州|24.2943,116.1291 + + + state + 广东|23.4080,113.3948 + + + cities + + + areas + + 连云区|34.7653,119.3455 + 新浦区|34.6568,119.2605 + 灌云县|34.2899,119.2474 + 东海县|34.5481,118.7779 + 海州区|34.5783,119.1698 + 赣榆县|34.8895,119.0414 + 灌南县|34.0926,119.3221 + + city + 连云港|34.6023,119.2995 + + + areas + + 滨海县|33.9953,119.8272 + 阜宁县|33.7650,119.8091 + 射阳县|33.7811,120.2645 + 建湖县|33.4699,119.8051 + 亭湖区|33.3946,120.2018 + 盐都区|33.3432,120.1609 + 响水县|34.2048,119.5849 + 东台市|32.8727,120.3270 + 大丰市|33.2072,120.5074 + + city + 盐城|33.3553,120.1681 + + + areas + + 江阴市|31.9257,120.2919 + 滨湖区|31.5342,120.2908 + 惠山区|31.6866,120.3049 + 锡山区|31.5948,120.3640 + 北塘区|31.6114,120.3003 + 南长区|31.5691,120.3155 + 崇安区|31.5716,120.3095 + 宜兴市|31.3460,119.8300 + + city + 无锡|31.4967,120.3189 + + + areas + + 泗洪县|33.4652,118.2226 + 泗阳县|33.7271,118.7098 + 沭阳县|34.1185,118.8104 + 宿豫区|33.9531,118.3370 + 宿城区|33.9689,118.2489 + + city + 宿迁|33.9676,118.2820 + + + areas + + 邗江区|32.3828,119.4046 + 广陵区|32.4005,119.4380 + 宝应县|33.2472,119.3649 + 维扬区|32.4320,119.4127 + 高邮市|32.7867,119.4621 + 仪征市|32.2781,119.1909 + 江都市|32.5398,119.7016 + + city + 扬州|32.3998,119.4191 + + + areas + + 丹徒区|32.1378,119.4404 + 润州区|32.2015,119.4168 + 句容市|31.9511,119.1750 + 丹阳市|32.0153,119.6134 + 扬中市|32.2428,119.8033 + 京口区|32.2038,119.4762 + + city + 镇江|32.1956,119.4314 + + + areas + + 浦口区|32.0646,118.6350 + 栖霞区|32.1026,118.9154 + 雨花台区|31.9984,118.7851 + 江宁区|31.9584,118.8465 + 秦淮区|32.0453,118.8009 + 建邺区|32.0090,118.7380 + 鼓楼区|32.0723,118.7766 + 下关区|32.1092,118.7725 + 六合区|32.3283,118.8280 + 高淳县|31.3363,118.9719 + 白下区|32.0303,118.8298 + 玄武区|32.0547,118.8045 + 溧水县|31.5969,119.0399 + + city + 南京|32.0647,118.8028 + + + areas + + 鼓楼区|32.0723,118.7766 + 邳州市|34.3408,118.0190 + 新沂市|34.3751,118.3620 + 泉山区|34.2499,117.2004 + 贾汪区|34.4491,117.4600 + 九里区|34.3212,117.1245 + 云龙区|34.2553,117.2358 + 睢宁县|33.9189,117.9475 + 铜山县|34.2884,117.2953 + 沛县|34.7273,116.9441 + 丰县|34.6997,116.6019 + + city + 徐州|34.2101,117.2923 + + + areas + + 姜堰市|32.5264,120.0908 + 靖江市|32.0208,120.2810 + 泰兴市|32.1775,120.0585 + 高港区|32.3247,119.8875 + 兴化市|32.9164,119.8592 + 海陵区|32.4968,119.9260 + + city + 泰州|32.4612,119.9321 + + + areas + + 启东市|31.8141,121.6643 + 如皋市|32.3776,120.5802 + 海安县|35.5393,120.4740 + 如东县|32.3358,121.1914 + 通州市|32.2038,120.8688 + 海门市|31.8778,121.1882 + 港闸区|32.0375,120.8245 + 崇川区|32.0160,120.8637 + + city + 南通|31.9852,120.9003 + + + areas + + 天宁区|31.7858,119.9811 + 钟楼区|31.8077,119.9078 + 戚墅堰区|31.7628,120.0547 + 新北区|31.8365,119.9779 + 武进区|31.7072,119.9497 + 溧阳市|31.4217,119.4911 + 金坛市|31.7290,119.6045 + + city + 常州|31.8167,119.9801 + + + areas + + 涟水县|33.7871,119.2673 + 清浦区|33.5593,119.0330 + 淮阴区|33.6381,119.0413 + 楚州区|33.5040,119.3031 + 清河区|33.6054,119.0145 + 盱眙县|33.0171,118.5514 + 洪泽县|33.3000,118.8800 + 金湖县|33.0297,119.0268 + + city + 淮安|33.6162,119.0224 + + + areas + + 吴江市|31.0148,120.6394 + 平江区|31.3323,120.6308 + 金阊区|31.3445,120.5816 + 昆山市|31.3909,120.9882 + 张家港市|31.8812,120.5620 + 太仓市|31.4648,121.1363 + 沧浪区|31.2957,120.6167 + 吴中区|31.2684,120.6386 + 虎丘区|31.3018,120.5783 + 常熟市|31.6597,120.7588 + 相城区|31.3747,120.6490 + + city + 苏州|31.3045,120.5896 + + + state + 江苏|32.0665,118.7695 + + + cities + + + areas + + 淄川区|36.6498,117.9731 + 博山区|36.5008,117.8681 + 张店区|36.8122,118.0244 + 周村区|36.8089,117.8762 + 临淄区|36.8233,118.3161 + 沂源县|36.1908,118.1772 + 桓台县|36.9655,118.1044 + 高青县|37.1773,117.8331 + + city + 淄博|36.8191,118.0612 + + + areas + + 芝罘区|37.5464,121.4066 + 福山区|37.5036,121.2741 + 牟平区|37.3926,121.6069 + 莱山区|37.5173,121.4518 + 招远市|37.3610,120.4408 + 蓬莱市|37.8165,120.7653 + 莱州市|37.1826,119.9487 + 莱阳市|36.9851,120.7182 + 海阳市|36.7822,121.1650 + 长岛县|37.9275,120.7428 + 龙口市|37.6498,120.4850 + 栖霞市|37.3413,120.8561 + + city + 烟台|37.4698,121.4544 + + + areas + + 莒县|35.5858,118.8434 + 五莲县|35.7558,119.2153 + 岚山区|35.1278,119.3254 + 东港区|35.4311,119.4690 + + city + 日照|35.4227,119.5336 + + + areas + + 鄄城县|35.5692,115.5166 + 东明县|35.2958,115.0965 + 郓城县|35.6059,115.9500 + 巨野县|35.4019,116.1015 + 成武县|34.9584,115.8961 + 单县|34.8001,116.0938 + 曹县|34.8317,115.5485 + 牡丹区|35.2575,115.4231 + 定陶县|35.0772,115.5794 + + city + 荷泽|35.2374,115.5082 + + + areas + + 寒亭区|36.7801,119.2265 + 潍城区|36.7329,119.0303 + 临朐县|36.5185,118.5494 + 昌乐县|36.7130,118.8363 + 高密市|36.3889,119.7620 + 昌邑市|36.8652,119.4050 + 寿光市|36.8617,118.7973 + 诸城市|36.0021,119.4162 + 安丘市|36.4840,119.2244 + 奎文区|36.7146,119.1392 + 坊子区|36.6609,119.1724 + 青州市|36.6903,118.4861 + + city + 潍坊|36.7132,119.1681 + + + areas + + 平阴县|36.2950,116.4626 + 长清区|36.5598,116.7583 + 历下区|36.6722,117.0829 + 商河县|37.3149,117.1636 + 章丘市|36.6854,117.5323 + 历城区|36.6857,117.0719 + 天桥区|36.6841,116.9937 + 槐荫区|36.6575,116.9072 + 市中区|36.6575,117.0038 + 济阳县|36.9841,117.1799 + + city + 济南|36.6827,117.0249 + + + areas + + 梁山县|35.8080,116.1024 + 邹城市|35.4115,117.0102 + 兖州市|35.5740,116.7541 + 泗水县|35.6709,117.2585 + 汶上县|35.7387,116.4956 + 市中区|35.4105,116.5983 + 任城区|35.4139,116.6030 + 鱼台县|35.0179,116.6568 + 微山县|34.8134,117.1352 + 嘉祥县|35.4131,116.3491 + 金乡县|35.0725,116.3180 + 曲阜市|35.5870,116.9928 + + city + 济宁|35.4202,116.5938 + + + areas + + 李沧区|36.1508,120.4395 + 城阳区|36.3133,120.4028 + 即墨市|36.3952,120.4536 + 胶州市|36.2703,120.0400 + 胶南市|35.8528,119.8563 + 平度市|36.7925,119.9664 + 市南区|36.0808,120.4194 + 市北区|36.0936,120.3811 + 四方区|36.1315,120.3679 + 黄岛区|35.9657,120.2030 + 崂山区|36.1143,120.4744 + 莱西市|36.8939,120.5243 + + city + 青岛|36.0723,120.3894 + + + areas + + 沂南县|35.5560,118.4721 + 河东区|35.0931,118.4083 + 罗庄区|35.0022,118.2908 + 兰山区|35.0575,118.3543 + 蒙阴县|35.7163,117.9513 + 临沭县|34.9258,118.6571 + 平邑县|35.5116,117.6470 + 莒南县|35.1807,118.8419 + 苍山县|34.8653,117.9983 + 费县|35.2728,117.9835 + 郯城县|34.6192,118.3737 + 沂水县|35.7960,118.6344 + + city + 临沂|35.1105,118.3629 + + + areas + + 荣成市|37.1711,122.4927 + 乳山市|36.9263,121.5466 + 环翠区|36.9263,121.5466 + 文登市|37.1541,122.0107 + + city + 威海|37.5193,122.1282 + + + areas + + 钢城区|36.0646,117.8175 + 莱城区|36.2088,117.6665 + + city + 莱芜|36.2193,117.6832 + + + areas + + 泰山区|36.1982,117.1416 + 岱岳区|36.1933,117.0483 + 宁阳县|35.7653,116.8138 + 东平县|35.9427,116.4768 + 新泰市|35.9145,117.7746 + 肥城市|36.1887,116.7755 + + city + 泰安|36.2059,117.0948 + + + areas + + 东营区|37.4549,118.5886 + 河口区|37.8921,118.5319 + 垦利县|37.5937,118.5541 + 利津县|37.4959,118.2619 + 广饶县|37.0595,118.4135 + + city + 东营|37.4549,118.5886 + + + areas + + 冠县|36.4896,115.4490 + 东昌府区|36.4402,115.9950 + 高唐县|36.8717,116.2377 + 临清市|36.8444,115.7115 + 阳谷县|36.1207,115.7977 + 莘县|36.2399,115.6771 + 茌平县|36.5867,116.2616 + 东阿县|36.3409,116.2542 + + city + 聊城|36.4626,115.9920 + + + areas + + 滕州市|35.1191,117.1725 + 市中区|34.8700,117.5625 + 台儿庄区|34.5688,117.7402 + 山亭区|35.1058,117.4677 + 薛城区|34.8011,117.2696 + 峄城区|34.7785,117.5969 + + city + 枣庄|34.8165,117.3285 + + + areas + + 惠民县|37.4958,117.5157 + 阳信县|37.6472,117.5846 + 滨城区|37.4329,118.0293 + 邹平县|36.8691,117.7495 + 博兴县|37.1589,118.1174 + 沾化县|37.7872,118.0900 + 无棣县|37.7760,117.6322 + + city + 滨州|37.3883,117.9792 + + + areas + + 庆云县|37.7813,117.3914 + 宁津县|37.6580,116.8067 + 齐河县|36.8012,116.7663 + 临邑县|37.1962,116.8730 + 夏津县|36.9544,116.0082 + 平原县|37.1713,116.4405 + 乐陵市|37.7316,117.2381 + 武城县|37.2191,116.0757 + 禹城市|36.9402,116.6445 + 德城区|37.4569,116.3058 + 陵县|37.34171,116.6650 + + city + 德州|37.4413,116.3658 + + + state + 山东|36.0992,118.5276 + + + cities + + + areas + + 松溪县|27.5325,118.7918 + 政和县|27.3717,118.8641 + 顺昌县|26.7990,117.8168 + 光泽县|27.5471,117.3403 + 建瓯市|27.0289,118.3114 + 建阳市|27.3375,118.1269 + 邵武市|27.3466,117.4989 + 武夷山市|27.7624,118.0420 + 浦城县|27.9234,118.5478 + 延平区|26.6441,118.1884 + + city + 南平|26.6476,118.1843 + + + areas + + 湖里区|24.5147,118.1523 + 集美区|24.5821,118.1037 + 同安区|24.7285,118.1586 + 翔安区|24.6242,118.2537 + 思明区|24.4521,118.0888 + 海沧区|24.4897,118.0404 + + city + 厦门|24.4858,118.0959 + + + areas + + 闽清县|26.2268,118.8700 + 罗源县|26.4953,119.5561 + 连江县|26.2037,119.5460 + 闽侯县|26.1562,119.1378 + 晋安区|26.0870,119.3350 + 马尾区|25.9950,119.4621 + 仓山区|26.0540,119.2798 + 台江区|26.0586,119.3206 + 鼓楼区|26.0880,119.3105 + 平潭县|25.5047,119.7966 + 永泰县|25.8730,118.9390 + 福清市|25.7264,119.3905 + 长乐市|25.9691,119.5296 + + city + 福州|26.0804,119.3029 + + + areas + + 周宁县|27.1103,119.3455 + 屏南县|26.9141,118.9923 + 福安市|27.0942,119.6540 + 福鼎市|27.3304,120.2231 + 蕉城区|26.6665,119.5326 + 古田县|26.5832,118.7526 + 霞浦县|26.8915,120.0119 + 寿宁县|27.4667,119.5112 + 柘荣县|27.2412,119.9073 + + city + 宁德|26.6717,119.5547 + + + areas + + 漳平市|25.2957,117.4265 + 新罗区|25.1042,117.0439 + 长汀县|25.8392,116.3642 + 上杭县|25.0555,116.4267 + 永定县|24.7618,116.8255 + 连城县|25.7163,116.7613 + 武平县|25.1010,116.1069 + + city + 龙岩|25.0812,117.0236 + + + areas + + 仙游县|25.3684,118.6982 + 城厢区|25.4245,119.0012 + 涵江区|25.4645,119.1228 + 荔城区|25.4374,119.0214 + 秀屿区|25.3240,119.1129 + + city + 莆田|25.4599,119.0142 + + + areas + + 龙文区|24.5096,117.7162 + 云霄县|23.9642,117.3460 + 东山县|23.7070,117.4362 + 长泰县|24.6316,117.7660 + 诏安县|23.7171,117.1816 + 漳浦县|24.1233,117.6201 + 龙海市|24.4527,117.8245 + 华安县|25.0101,117.5407 + 平和县|24.3692,117.3224 + 芗城区|24.5163,117.6604 + 南靖县|24.5208,117.3638 + + city + 漳州|24.5191,117.6538 + + + areas + + 安溪县|25.0617,118.1932 + 永春县|25.3279,118.3007 + 德化县|25.4974,118.2475 + 金门县|24.4237,118.2334 + 石狮市|24.7376,118.6545 + 晋江市|24.7877,118.5584 + 南安市|24.9660,118.3928 + 鲤城区|24.9135,118.5933 + 洛江区|24.9462,118.6776 + 丰泽区|24.8951,118.6195 + 惠安县|25.0370,118.8033 + 泉港区|25.1264,118.9224 + + city + 泉州|24.8802,118.6823 + + + areas + + 将乐县|26.7353,117.4773 + 沙县|26.4018,117.7992 + 建宁县|26.8368,116.8525 + 清流县|26.1834,116.8235 + 宁化县|26.2680,116.6608 + 三元区|26.2401,117.6145 + 明溪县|26.3618,117.2087 + 梅列区|26.2774,117.6523 + 永安市|25.9477,117.3716 + 泰宁县|26.9057,117.1823 + 大田县|25.6989,117.8535 + 尤溪县|26.1763,118.1969 + + city + 三明|26.2696,117.6457 + + + state + 福建|26.1060,119.3030 + + + cities + + + areas + + 大通区|32.6371,117.0599 + 谢家集区|32.6061,116.8655 + 田家庵区|32.6533,117.0238 + 潘集区|32.7784,116.8428 + 八公山区|32.6371,116.8401 + 凤台县|32.7151,116.7173 + + city + 淮南|32.6428,117.0186 + + + areas + + 黄山区|30.2786,118.1482 + 屯溪区|29.7021,118.3215 + 歙县|29.8668,118.4200 + 徽州区|29.8341,118.3432 + 黟县|29.9309,117.9448 + 休宁县|29.7924,118.1889 + 祁门县|29.8604,117.7235 + + city + 黄山|30.1340,118.1769 + + + areas + + 固镇县|33.3234,117.3232 + 龙子湖区|32.9487,117.3998 + 蚌山区|32.9508,117.3741 + 淮上区|32.9707,117.3663 + 禹会区|32.9354,117.3485 + 五河县|33.1508,117.8918 + 怀远县|32.9760,117.2116 + + city + 蚌埠|32.9214,117.3958 + + + areas + + 包河区|31.7992,117.3164 + 蜀山区|31.8573,117.2670 + 庐阳区|31.8848,117.2714 + 瑶海区|31.8636,117.3160 + 肥西县|31.7123,117.1649 + 肥东县|31.8939,117.4756 + 长丰县|32.4836,117.1742 + + city + 合肥|31.8268,117.2354 + + + areas + + 灵璧县|33.5481,117.5651 + 泗县|33.4885,117.9176 + 萧县|34.1944,116.9538 + 砀山县|34.4468,116.3725 + 埇桥区|33.6461,116.9837 + + city + 宿州|33.6520,116.9704 + + + areas + + 金安区|31.7555,116.5459 + 裕安区|31.7437,116.4865 + 寿县|32.5793,116.7935 + 霍山县|31.3984,116.3392 + 金寨县|31.7334,115.9406 + 舒城县|31.4677,116.9553 + 霍邱县|32.3595,116.2846 + + city + 六安|31.7412,116.5296 + + + areas + + 东至县|30.1026,117.0341 + 贵池区|30.6926,117.5738 + 石台县|30.2165,117.4925 + 青阳县|30.6456,117.8539 + + city + 池州|30.6709,117.4978 + + + areas + + 弋江区|31.3175,118.3792 + 鸠江区|31.3753,118.3989 + 镜湖区|31.3463,118.3920 + 繁昌县|31.0892,118.2057 + 南陵县|30.9209,118.3404 + 三山区|31.2302,118.2411 + 芜湖县|31.1410,118.5817 + + city + 芜湖|31.3587,118.4395 + + + areas + + 宁国市|30.6392,118.9899 + 绩溪县|30.0725,118.5863 + 旌德县|30.2925,118.5469 + 广德县|30.9000,119.4234 + 泾县|30.6946,118.4261 + 宣州区|30.9518,118.7628 + 郎溪县|31.1327,119.1859 + + city + 宣城|30.9465,118.7651 + + + areas + + 居巢区|31.6506,117.7280 + 庐江县|31.2736,117.3321 + 无为县|31.2569,117.8648 + 含山县|31.6620,118.0520 + 和县|31.7164,118.2938 + + city + 巢湖|31.6087,117.8804 + + + areas + + 涡阳县|33.4985,116.2224 + 谯城区|33.8825,115.7856 + 利辛县|33.1505,116.2149 + 蒙城县|33.2716,116.5710 + + city + 亳州|33.8507,115.7857 + + + areas + + 太和县|33.1659,115.6286 + 临泉县|33.0702,115.2647 + 颍泉区|32.9313,115.8148 + 颍东区|32.9186,115.8632 + 界首市|33.1618,115.3811 + 颍上县|32.6351,116.2709 + 阜南县|32.6648,115.5997 + 颍州区|32.8895,115.8131 + + city + 阜阳|32.8958,115.8213 + + + areas + + 狮子山区|30.9620,117.8808 + 郊区|30.9104,117.8075 + 铜官山区|30.9403,117.8218 + 铜陵县|30.9584,117.7980 + + city + 铜陵|30.9508,117.8187 + + + areas + + 烈山区|33.9014,116.8197 + 相山区|33.9659,116.8007 + 杜集区|33.9970,116.8346 + 濉溪县|33.9216,116.7725 + + city + 淮北|33.9600,116.7914 + + + areas + + 明光市|32.7830,117.9959 + 南谯区|32.3591,118.1778 + 来安县|32.4585,118.4421 + 琅琊区|32.3010,118.3119 + 凤阳县|32.8718,117.5677 + 天长市|32.6953,119.0100 + 全椒县|32.0910,118.2796 + 定远县|32.5361,117.7050 + + city + 滁州|32.3081,118.3232 + + + areas + + 当涂县|31.5755,118.5044 + 雨山区|31.6878,118.5051 + 花山区|31.7056,118.5180 + 金家庄区|31.7447,118.5259 + + city + 马鞍山|31.6763,118.5126 + + + areas + + 望江县|30.1300,116.7008 + 宿松县|30.1596,116.1357 + 桐城市|31.0419,116.9806 + 岳西县|30.8552,116.3665 + 潜山县|30.6367,116.5879 + 太湖县|30.4601,116.3153 + 大观区|30.5181,117.0407 + 宜秀区|30.6195,116.9937 + 怀宁县|30.7395,116.8363 + 枞阳县|30.7057,117.2266 + 迎江区|30.5175,117.0973 + + city + 安庆|30.5485,117.0701 + + + state + 安徽|31.8673,117.2922 + + + cities + + + areas + + 翠屏区|28.7720,104.6259 + 宜宾县|28.6962,104.5396 + 南溪县|28.8514,104.9760 + 屏山县|28.6593,104.1576 + 兴文县|28.3099,150.2428 + 筠连县|28.1704,104.5182 + 珙县|28.4445,104.7153 + 高县|28.4425,104.5240 + 长宁县|28.5881,104.9276 + 江安县|28.7295,105.0734 + + city + 宜宾|28.7576,104.6481 + + + areas + + 巴州区|31.8572,106.7754 + 南江县|32.3524,106.8355 + 通江县|31.9177,107.2514 + 平昌县|31.5662,107.1101 + + city + 巴中|31.8691,106.7579 + + + areas + + 高坪区|30.7873,106.1253 + 顺庆区|30.8027,106.0986 + 南部县|31.3594,106.0737 + 嘉陵区|30.7650,106.0781 + 蓬安县|31.0346,106.4187 + 营山县|31.0830,106.5719 + 西充县|31.0008,105.9073 + 仪陇县|31.2761,106.3097 + 阆中市|31.5641,106.0115 + + city + 南充|30.8432,106.1172 + + + areas + + 成华区|30.6655,104.1085 + 龙泉驿区|30.5629,104.2811 + 金牛区|30.6963,104.0593 + 武侯区|30.6487,104.0495 + 锦江区|30.6619,104.0898 + 青羊区|30.6809,104.0693 + 都江堰市|30.9943,103.6531 + 温江区|30.6871,103.8624 + 邛崃市|30.4164,103.4708 + 彭州市|30.9960,103.9646 + 新津县|30.4165,103.8180 + 郫县|30.8020,103.9089 + 青白江区|30.8845,104.2577 + 新都区|30.8303,104.1644 + 双流县|30.5807,103.9301 + 大邑县|30.5934,103.5273 + 崇州市|30.6365,103.6793 + 蒲江县|30.2024,103.5128 + 金堂县|30.8682,104.4184 + + city + 成都|30.5762,104.0712 + + + areas + + 普格县|27.3821,102.5475 + 宁南县|27.0725,102.7670 + 会东县|26.6407,102.5646 + 会理县|26.6615,102.2510 + 喜德县|28.3123,102.4188 + 金阳县|27.7022,103.2555 + 西昌市|27.9006,102.2695 + 木里|27.9311,101.2857 + 盐源县|27.4286,101.5156 + 德昌县|27.4085,102.1821 + 越西县|28.6460,102.5139 + 布拖县|27.7122,102.8179 + 雷波县|28.2689,103.5779 + 甘洛县|28.9644,102.7769 + 美姑县|28.3345,103.1388 + 冕宁县|28.5558,102.1833 + 昭觉县|28.0205,102.8490 + + city + 凉山彝族|27.8943,102.2661 + + + areas + + 青神县|29.8372,103.8531 + 洪雅县|29.9106,103.3794 + 丹棱县|30.0202,103.5194 + 仁寿县|30.0017,104.1405 + 彭山县|30.2544,103.8656 + 东坡区|30.0482,103.8386 + + city + 眉山|30.0813,103.8550 + + + areas + + 壤塘县|32.2711,100.9851 + 马尔康县|31.9117,102.2129 + 黑水县|32.0677,102.9967 + 小金县|31.0054,102.3708 + 金川县|31.4816,102.0698 + 理县|31.4425,103.1735 + 茂县|31.6873,103.8599 + 阿坝县|32.9081,101.7129 + 汶川县|31.4826,103.5968 + 红原县|32.7965,102.5509 + 松潘县|32.6439,103.6054 + 九寨沟县|32.2672,104.2422 + 若尔盖县|33.5821,102.9682 + + city + 阿坝|32.9081,101.7129 + + + areas + + 峨眉山市|29.6070,103.4910 + 马边彝族|28.8385,103.5509 + 沐川县|28.9629,103.9088 + 峨边彝族|29.6116,103.7589 + 市中区|29.5613,103.7677 + 沙湾区|29.4193,103.5567 + 五通桥区|29.4134,103.8249 + 金口河区|29.2507,103.0851 + 犍为县|29.2142,103.9558 + 井研县|29.6591,104.0713 + 夹江县|29.7437,103.5779 + + city + 乐山|29.5581,103.7719 + + + areas + + 盐亭县|31.2141,105.3964 + 安县|31.5404,104.5741 + 游仙区|31.4799,104.7731 + 三台县|31.1017,105.1010 + 涪城区|31.4612,104.7635 + 北川羌族|31.5510,104.5663 + 梓潼县|31.6411,105.1677 + 江油市|31.7628,104.7310 + 平武县|32.4148,104.5354 + + city + 绵阳|31.4733,104.6861 + + + areas + + 广安区|30.4797,106.6484 + 邻水县|30.3408,106.9368 + 华蓥市|30.3962,106.7894 + 武胜县|30.6554,106.3024 + 岳池县|30.5442,106.4462 + + city + 广安|302.4797,106.6484 + + + areas + + 元坝区|32.1499,105.8833 + 市中区|29.5613,103.7677 + 旺苍县|32.2350,106.2962 + 朝天区|32.6498,105.8963 + 苍溪县|31.7385,105.9409 + 剑阁县|32.2942,105.5318 + 青川县|32.5904,105.2446 + + city + 广元|32.4418,105.8499 + + + areas + + 广汉市|30.9833,104.2889 + 什邡市|31.1336,104.1733 + 中江县|31.0388,104.6852 + 罗江县|31.3230,104.5166 + 绵竹市|31.3434,104.2274 + 旌阳区|31.1488,104.4234 + + city + 德阳|31.1331,104.4043 + + + areas + + 安岳县|30.1034,105.3418 + 乐至县|30.2820,105.0278 + 雁江区|30.1238,104.6586 + 简阳市|30.4173,104.5538 + + city + 资阳|30.1348,104.6344 + + + areas + + 宣汉县|31.3598,107.7336 + 开江县|31.0894,107.8749 + 大竹县|30.7418,107.2109 + 渠县|30.8423,106.9795 + 通川区|31.2209,107.5109 + 达县|31.1820,107.4243 + 万源市|32.0879,108.0409 + + city + 达州|31.2143,107.4745 + + + areas + + 古蔺县|28.0448,105.8188 + 纳溪区|28.7793,105.3777 + 江阳区|28.8845,105.4415 + 叙永县|28.1617,105.4512 + 合江县|28.8177,105.8377 + 泸县|29.1577,105.3883 + 龙马潭区|28.9189,105.4433 + + city + 泸州|28.8775,105.4490 + + + areas + + 自流井区|29.3435,104.7837 + 贡井区|29.3515,104.7218 + 大安区|29.3699,104.7803 + 沿滩区|29.2786,104.8806 + 荣县|29.4506,104.4241 + 富顺县|29.1873,104.9814 + + city + 自贡|29.3453,104.7848 + + + areas + + 蓬溪县|30.7640,105.7140 + 安居区|30.3615,105.4628 + 船山区|30.5314,105.5747 + 大英县|30.6008.105.2428 + 射洪县|30.8771,105.3978 + + city + 遂宁|30.5391,105.5991 + + + areas + + 色达县|32.2743,100.3390 + 理塘县|30.0017,100.2762 + 巴塘县|30.0116,99.1169 + 乡城县|28.9370,99.8049 + 稻城县|29.0431,100.3047 + 得荣县|28.7188,99.2929 + 丹巴县|30.8849,101.8972 + 九龙县|29.0064,101.5137 + 雅江县|30.0375,101.0207 + 道孚县|30.9852,101.1316 + 炉霍县|31.3963,100.6834 + 甘孜县|31.6289,99.9991 + 新龙县|30.9455,100.3179 + 德格县|31.8118,98.5874 + 白玉县|31.2158,98.8307 + 石渠县|32.9840,98.1095 + 泸定县|29.9204,102.2411 + 康定县|30.0045,101.9630 + + city + 甘孜藏族|31.6228,99.9947 + + + areas + + 名山县|30.1324,103.2273 + 芦山县|30.1500,102.9347 + 天全县|30.0725,102.7649 + 宝兴县|30.3741,102.8210 + 荥经县|29.7993,102.8531 + 雨城区|30.0111,103.0396 + 石棉县|29.2342,102.3658 + 汉源县|29.3502,102.6591 + + city + 雅安|30.0212,103.0463 + + + areas + + 隆昌县|29.3452,105.2943 + 资中县|29.7701,104.8586 + 威远县|29.5334,104.6753 + 东兴区|29.5992,105.0811 + 市中区|29.5927,105.0742 + + city + 内江|29.5858,105.0650 + + + areas + + 西区|29.3436,105.2869 + 仁和区|26.5039,101.7451 + 盐边县|26.6887,101.8604 + 米易县|26.8969,102.1166 + 东区|26.5520,101.7107 + + city + 攀枝花|26.5881,101.7252 + + + state + 四川|30.6567,104.0822 + + + cities + + + areas + + 嘉鱼县|29.9762,113.9458 + 咸安区|29.8581,114.3049 + 崇阳县|29.5612,114.0454 + 通城县|29.2510,113.8235 + 赤壁市|29.7309,113.9069 + 通山县|29.6127,114.4891 + + city + 咸宁|29.8471,114.3289 + + + areas + + 西陵区|30.7165,111.2923 + 枝江市|30.4316,111.7669 + 当阳市|30.8268,111.7948 + 兴山县|31.3543,110.7536 + 远安县|31.0672,111.6463 + 长阳|30.4785,111.2137 + 秭归县|30.8319,110.9841 + 点军区|30.6992,111.2747 + 伍家岗区|30.6507,111.3674 + 夷陵区|30.7758,111.3314 + 猇亭区|30.5364,111.4412 + 宜都市|30.3844,111.4566 + 五峰|30.2084,110.6746 + + city + 宜昌|30.6976,111.2929 + + + areas + + 武穴市|29.8506,115.5679 + 黄州区|30.4405,114.8865 + 团风县|30.6495,114.8788 + 红安县|31.2942,114.6245 + 罗田县|30.7897,115.4059 + 英山县|30.7415,115.6878 + 浠水县|30.4575,115.2720 + 麻城市|31.1790,115.0152 + 黄梅县|30.0764,115.9507 + 蕲春县|30.2325,115.4426 + + city + 黄冈|30.4594,114.8788 + + + areas + + 江陵县|30.0480,112.4311 + 石首市|29.7270,112.4319 + 洪湖市|29.8333,113.4842 + 松滋市|30.1753,111.7740 + 荆州区|30.3589,112.1965 + 沙市区|30.3166,112.2615 + 监利县|29.8455,112.9113 + 公安县|30.0643,112.2359 + + city + 荆州|30.3406,112.2472 + + + areas + + 应城市|30.9340,113.5794 + 云梦县|31.0273,113.7597 + 大悟县|31.5672,114.1333 + 孝昌县|31.5643,114.0044 + 汉川市|30.6670,113.8456 + 安陆市|31.5312,113.6957 + 孝南区|30.9227,113.9169 + + city + 孝感|30.9307,113.9229 + + + areas + + 京山县|31.0243,113.1260 + 沙洋县|30.7152,112.5950 + 东宝区|31.0582,112.2079 + 掇刀区|30.9793,112.2135 + 钟祥市|31.1739,112.5946 + + city + 荆门|31.0417,112.2058 + + + areas + + 丹江口市|32.5463,111.5197 + 张湾区|32.6582,110.7755 + 郧县|32.8643,110.7363 + 茅箭区|32.5974,110.8194 + 竹溪县|32.3241,109.7218 + 房县|32.0617,110.7476 + 郧西县|32.9991,110.4323 + 竹山县|32.2303,110.2353 + + city + 十堰|32.6350,110.8045 + + + areas + + 华容区|30.5406,114.7362 + 鄂城区|30.4062,114.8983 + 梁子湖区|30.1058,114.6310 + + city + 鄂州|30.3965,114.9015 + + + areas + + city + 天门|35.5539,106.6635 + + + areas + + city + 潜江|30.4076,112.9057 + + + areas + + 来凤县|29.4998,109.4134 + 鹤峰县|29.8971,110.0414 + 恩施市|30.3008,109.4857 + 利川市|30.2973,108.9424 + 宣恩县|29.9928,109.4984 + 咸丰县|29.6708,109.1462 + 建始县|30.6079,109.7286 + 巴东县|31.0479,110.3473 + + city + 恩施|30.3008,109.4857 + + + areas + + 蔡甸区|30.5880,114.0356 + 汉南区|30.3148,114.0912 + 洪山区|30.5061,114.3503 + 东西湖区|30.6261,114.1434 + 新洲区|30.8473,114.8076 + 黄陂区|30.8875,114.3815 + 江夏区|30.3814,114.3282 + 江岸区|30.6055,114.3161 + 江汉区|30.6074,114.2774 + 硚口区|30.5875,114.2214 + 汉阳区|30.5608,114.2241 + 武昌区|30.5596,114.3225 + 青山区|30.6464,114.3906 + + city + 武汉|30.5984,114.3118 + + + areas + + city + 仙桃|30.3681,113.4610 + + + areas + + city + 神农架林|31.7489,110.6836 + + + areas + + 曾都区|31.7221,113.3777 + 广水市|31.6225,113.8325 + + city + 随州|31.6963,113.3890 + + + areas + + 大冶市|30.1016,114.9862 + 阳新县|29.8366,115.2217 + 铁山区|30.2123,114.9080 + 下陆区|30.1801,114.9675 + 西塞山区|30.2108,115.1166 + 黄石港区|30.2291,115.0725 + + city + 黄石|30.2053,115.0454 + + + areas + + 枣阳市|32.1344,112.7804 + 老河口市|32.3924,111.6816 + 樊城区|32.0505,112.1421 + 襄城区|32.0163,112.1408 + 南漳县|31.7810,111.8454 + 襄阳区|32.2291,112.2500 + 保康县|31.8836,111.2676 + 谷城县|32.2690,111.6596 + 宜城市|31.7254,112.2643 + + city + 襄樊|31.9892,112.1095 + + + state + 湖北|31.2093,112.4105 + + + cities + + + areas + + 怀来县|40.4211,115.5243 + 涿鹿县|40.3862,115.2260 + 桥东区|40.7941,114.9009 + 万全县|40.7731,114.7469 + 宣化区|40.6146,115.1056 + 桥西区|40.8255,114.8758 + 宣化县|40.5851,115.0080 + 下花园区|40.5083,115.2940 + 康保县|41.8586,114.6067 + 张北县|41.1649,114.7262 + 沽源县|41.6759,115.6950 + 尚义县|41.0819,113.9757 + 怀安县|40.6803,114.3921 + 赤城县|40.9189,115.8381 + 崇礼县|40.9804,115.2891 + 蔚县|39.8470,114.5953 + 阳原县|40.1096,114.1570 + + city + 张家口|40.8301,114.8941 + + + areas + + 成安县|36.4498,114.6765 + 大名县|36.2912,115.1544 + 邯郸县|36.5995,114.5377 + 临漳县|36.3408,114.6259 + 复兴区|36.6232,114.4795 + 峰峰矿区|36.4257,114.2195 + 邯山区|36.6063,114.4901 + 丛台区|36.6247,114.4998 + 肥乡县|36.5539,114.8065 + 魏县|36.3660,114.9452 + 永年县|36.7839,114.4973 + 鸡泽县|36.9261,114.8847 + 涉县|36.5911,113.6972 + 磁县|36.3802,114.3803 + 邱县|36.8259,115.1828 + 曲周县|36.7854,114.9512 + 武安市|36.7025,114.2102 + 馆陶县|36.5415,115.3127 + 广平县|36.4897 + + city + 邯郸|36.6312,114.5458 + + + areas + + 新河县|37.5344,115.2486 + 广宗县|37.0802,115.1492 + 清河县|37.0461,115.6735 + 桥东区|37.0739,114.5136 + 威县|36.9811,115.2733 + 临西县|36.8764,115.5076 + 平乡县|37.0688,115.0366 + 沙河市|36.8612,114.5097 + 宁晋县|37.6256,114.9258 + 巨鹿县|37.2268,115.0443 + 南宫市|37.3639,115.4151 + 柏乡县|37.4885,114.7001 + 隆尧县|37.3559,114.7769 + 任县|37.1266,114.6779 + 南和县|37.0107,114.6903 + 桥西区|37.0661,114.4745 + 邢台县|37.0919,114.5515 + 临城县|37.4504,114.5054 + 内丘县|37.2968,114.5216 + + city + 邢台|37.0766,114.5108 + + + areas + + 武强县|38.0468,115.9891 + 饶阳县|38.2410,115.7321 + 故城县|37.3532,115.9724 + 安平县|38.2402,115.5256 + 枣强县|37.5191,115.7307 + 武邑县|37.8078,115.8940 + 深州市|38.0065,115.5663 + 冀州市|37.5570,115.5858 + 阜城县|37.8750,116.1507 + 景县|37.6986,116.2770 + 桃城区|37.7414,115.6810 + + city + 衡水|37.7451,115.6769 + + + areas + + 海港区|39.9405,119.6171 + 昌黎县|39.7191,119.1692 + 青龙满族自治县|40.4219,118.9566 + 北戴河区|39.8409,119.4911 + 山海关区|39.9851,119.7824 + 卢龙县|39.8978,118.8994 + 抚宁县|39.8822,119.2509 + + city + 秦皇岛|39.9412,119.6061 + + + areas + + 三河市|39.9882,117.0848 + 安次区|39.5088,116.6923 + 大城县|38.7109,116.6606 + 文安县|38.8789,116.4650 + 永清县|39.3279,116.5054 + 香河县|39.7677,117.0128 + 固安县|39.4444,116.3049 + 广阳区|39.5285,116.7171 + 大厂回族自治县|39.8953,116.9550 + 霸州市|39.1334,116.3977 + + city + 廊坊|39.5435,116.6903 + + + areas + + 涿州市|39.4909,115.9810 + 雄县|39.0001,116.1153 + 蠡县|38.4941,115.5900 + 曲阳县|38.6283,114.7514 + 博野县|38.4637,115.4708 + 顺平县|38.8432,115.1420 + 望都县|38.7147,115.1622 + 涞源县|39.3662,114.7007 + 易县|39.3549,115.5050 + 安新县|38.9415,115.9420 + 北市区|38.8882,115.5036 + 新市区|38.8837,115.4648 + 清苑县|38.7709,115.4964 + 涞水县|39.4002,115.7203 + 南市区|38.8605,115.5351 + 满城县|38.9552,115.3285 + 定兴县|39.2694,115.8143 + 唐县|38.37540,114.9893 + 阜平县|38.8549,114.2018 + 徐水县|39.0247,115.6623 + 高阳县|38.7062,115.7852 + 容城县|39.0485,115.8682 + 安国市|38.4247,115.3330 + 定州市|38.4658,115.0574 + 高碑店市|39.3323,115.8803 + + city + 保定|38.8800,115.4710 + + + areas + + 围场满族蒙古族自治县|41.9442,117.7667 + 宽城满族自治县|40.6170,118.4920 + 丰宁满族自治县|41.2104,116.6550 + 隆化县|41.3200,117.7454 + 滦平县|40.9475,117.3393 + 平泉县|41.0245,118.7084 + 兴隆县|40.4234,117.5071 + 承德县|40.7745,118.1802 + 鹰手营子矿区|40.5520,117.6661 + 双滦区|40.9649,117.8068 + 双桥区|40.9809,117.9499 + + city + 承德|40.9578,117.9697 + + + areas + + 迁安市|40.0045,118.7071 + 遵化市|40.1955,117.9720 + 唐海县|39.2734,118.4267 + 路北区|39.6305,118.2076 + 古冶区|39.7223,118.4652 + 开平区|39.6769,118.2683 + 丰南区|39.5812,118.0914 + 丰润区|39.8385,118.1686 + 滦县|39.7467,118.70998 + 滦南县|39.5102,118.6805 + 乐亭县|39.4319,118.9189 + 迁西县|40.1478,118.3209 + 玉田县|39.9066,117.7452 + 路南区|39.6310,118.1613 + + city + 唐山|39.6366,118.1870 + + + areas + + 任丘市|38.7172,116.1061 + 黄骅市|38.3773,117.3366 + 献县|38.1960,116.1293 + 吴桥县|37.6340,116.3979 + 河间市|38.4511,116.1056 + 肃宁县|38.4287,115.8364 + 南皮县|38.0434,116.7143 + 泊头市|38.0892,116.5849 + 孟村回族自治县|38.0596,117.1106 + 青县|38.5892,116.8097 + 东光县|37.8944,116.5435 + 海兴县|38.1494,117.5042 + 盐山县|38.0646,117.2366 + 新华区|38.3204,116.8726 + 运河区|38.3164,116.8385 + 沧县|38.3306,116.6137 + + city + 沧州|38.3102,116.8452 + + + areas + + 藁城市|38.0549,114.8164 + 辛集市|37.9241,115.2987 + 新乐市|38.3492,114.6903 + 晋州市|38.0394,115.0506 + 平山县|38.2656,114.1926 + 无极县|38.1853,114.9828 + 赵县|37.7619,114.7827 + 元氏县|37.7722,114.5320 + 鹿泉市|38.0847,114.3473 + 桥东区|38.0633,114.5107 + 长安区|38.0421,114.5461 + 新华区|38.0571,114.4695 + 桥西区|38.0102,114.4674 + 深泽县|38.1905,115.2073 + 赞皇县|37.6718,114.3923 + 井陉县|38.0383,114.1517 + 正定县|38.1521,114.5774 + 井陉矿区|38.0706,114.0689 + 裕华区|38.0117,114.5378 + 灵寿县|38.3147,114.3891 + 高邑县|37.6212,114.6178 + 栾城县|37.9061,114.6329 + 行唐县|38.4442,114.5595 + + city + 石家庄|38.0486,114.5208 + + + state + 河北|39.1731,117.2202 + + + cities + + + areas + + 瑞丽|39.1138,117.1408 + 潞西|24.3294,98.4269 + 盈江|24.7114,97.9386 + 梁河|24.8105,98.3031 + 陇川|24.1893,97.7984 + + city + 德宏|24.4380,98.5914 + + + areas + + 红塔区|24.3599,102.5517 + 江川县|24.2933,102.7602 + 澄江县|24.6795,102.9147 + 通海县|24.1194,102.7730 + 华宁县|24.1993,102.9349 + 易门县|24.6768,102.1692 + 元江|23.5862,102.0188 + 新平|24.0762,101.9965 + 峨山|24.1748,102.4123 + + city + 玉溪|24.3575,102.5537 + + + areas + + 富源县|25.6802,104.2613 + 会泽县|26.4240,103.3038 + 沾益县|25.6062,103.8287 + 宣威市|26.2255,104.1110 + 陆良县|25.0356,103.6732 + 马龙县|25.4342,103.5847 + 麒麟区|25.5014,103.8112 + 罗平县|24.8907,104.3152 + 师宗县|24.8342,103.9964 + + city + 曲靖|25.4963,103.8026 + + + areas + + 腾冲|25.0265,98.4974 + 施甸|24.7288,99.1955 + 昌宁|24.8337,99.6120 + 龙陵|24.5925,98.6958 + 隆阳区|25.1268,99.1723 + + city + 保山|25.1178,99.1683 + + + areas + + 泸水|25.8291,98.8645 + 兰坪|26.4592,99.4232 + 贡山|27.7469,98.6723 + 福贡|26.9081,98.8755 + + city + 怒江|25.8237,98.8631 + + + areas + + 维西|27.4529,99.1527 + 德钦|28.4694,98.9235 + 香格里拉|27.8357,99.7073 + + city + 迪庆|27.8252,99.7094 + + + areas + + 鲁甸|27.1929,103.5643 + 昭阳区|27.3263,103.7124 + 水富|28.6362,104.4220 + 大关|27.7540,103.8976 + 永善|28.2349,103.6447 + 巧家|26.9146,102.9365 + 盐津|28.1143,104.2412 + 彝良|27.6318,104.0544 + 威信|27.8525,105.0556 + 绥江|28.6042,103.9649 + 镇雄|27.4477,104.8800 + + city + 昭通|27.3440,103.7233 + + + areas + + 寻甸|25.5654,103.2613 + 禄劝|25.5575,102.4778 + 嵩明县|25.3445,103.0434 + 石林|24.8230,103.3325 + 富民县|25.2281,102.5041 + 宜良县|24.9257,103.1477 + 呈贡县|24.8716,102.8726 + 晋宁县|24.6761,102.6020 + 西山区|25.0441,102.6713 + 东川区|26.0891,103.1941 + 盘龙区|25.1222,102.7585 + 官渡区|25.0211,102.7501 + 五华区|25.0497,102.7137 + 安宁市|24.9258,102.4844 + + city + 昆明|24.8859,102.8396 + + + areas + + 武定|25.3616,102.4109 + 禄丰|25.1558,102.0855 + 沧源|23.1489,99.2622 + 双柏|24.6951,101.6484 + 楚雄|25.0389,101.5522 + 南华|25.1985,101.2799 + 牟定|25.3184,101.5534 + 大姚|25.7275,101.3309 + 姚安|25.5101,101.2481 + 元谋|25.7106,101.8809 + 永仁|26.0621,101.6763 + + city + 楚雄|25.0389,101.5522 + + + areas + + 广南|23.9678,105.0064 + 富宁|23.6313,105.6370 + 丘北|24.1278,104.1103 + 砚山|23.6115,104.3436 + 西畴|23.4430,104.6787 + 文山|23.4017,104.0891 + 麻栗坡|23.1309,104.7090 + 马关|23.0192,104.4002 + + city + 文山|23.4017,104.0891 + + + areas + + 景洪|22.0061,100.7781 + 勐腊|21.4651,101.5711 + 勐海|21.9637,100.4586 + + city + 西双版纳|22.0137,100.8038 + + + areas + + 古城区|26.8832,100.2319 + 宁蒗|27.2877,100.8585 + 华坪|26.6354,101.2727 + 永胜|26.6900,100.7574 + 玉龙|26.9904,100.2128 + + city + 丽江|26.8625,100.2335 + + + areas + + 河口|26.4516,100.6577 + 绿春县|22.9994,120.3994 + 建水|23.6412,102.8334 + 石屏|23.7117,102.5026 + 蒙自|23.3465,103.4996 + 屏边|23.1029,103.7484 + 个旧|23.3648,103.1665 + 开远|23.7200,103.2733 + 元阳|23.2262,102.8417 + 红河|23.3699,103.3821 + 金平|23.3709,116.7119 + 弥勒|24.2261,103.3897 + 泸西|24.5172,103.7832 + + city + 红河|23.3699,103.3821 + + + areas + + 弥渡|25.3493,100.4978 + 南涧|25.0600,100.5295 + 巍山|25.5992,100.2669 + 永平|25.4702,99.5475 + 云龙|25.8919,99.3773 + 洱源|26.1173,99.9573 + 剑川|26.5426,99.9120 + 鹤庆|26.5662,100.1829 + 漾濞|25.6762,99.9645 + 大理|25.5975,100.2362 + 宾川|25.8332,100.5791 + 祥云|25.4900,100.5570 + + city + 大理|25.5975,100.2362 + + + areas + + 耿马|23.5445,99.4094 + 镇康|23.7688,98.8320 + 双江|23.4798,99.8341 + 临翔区|23.9014,100.0887 + 凤庆|24.5863,99.9348 + 云县|24.4503,100.1376 + 永德|24.0244,99.2657 + + city + 临沧|23.8825,100.0859 + + + areas + + 镇沅|23.9471,100.9820 + 景谷|23.7418,100.6318 + 景东|24.3967,100.7952 + 墨江|22.7662,100.9802 + 普洱|22.7884,100.9811 + 翠云|22.6269,100.7270 + 江城|21.8681,111.9616 + 孟连|22.3353,99.5908 + 澜沧|22.5583,99.9383 + 西盟|22.7342,99.4631 + + city + 思茅|22.7925,100.9834 + + + state + 云南|24.8642,101.5929 + + + cities + + + areas + + 向阳区|47.3486,130.3007 + 工农区|47.3244,130.2814 + 东山区|47.3451,130.3239 + 兴山区|47.3908,130.3393 + 南山区|47.3210,130.2936 + 兴安区|47.2586,130.2457 + 萝北县|47.5835,130.8350 + 绥滨县|47.2951,131.8587 + + city + 鹤岗|47.3560,130.3042 + + + areas + + 呼玛县|51.7317,126.6595 + 漠河县|52.9782,122.5450 + 塔河县|52.3403,124.7165 + + city + 大兴安岭地|53.4970,122.3346 + + + areas + + 萨尔图区|46.6093,125.0606 + 龙凤区|46.5679,125.1406 + 杜尔伯特蒙古族自治县|46.8686,124.4491 + 林甸县|47.1886,124.8779 + 肇源县|45.5241,125.0845 + 肇州县|45.7051,125.2749 + 大同区|46.0453,124.8169 + 红岗区|46.4041,124.8972 + 让胡路区|46.6579,124.8774 + + city + 大庆|46.5932,125.1097 + + + areas + + 勃利县|45.7610,130.5979 + 新兴区|45.8222,130.9384 + 桃山区|45.7717,131.0264 + 茄子河区|45.7909,131.0734 + + city + 七台河|45.7765,131.0096 + + + areas + + 富裕县|47.7812,124.4804 + 克山县|48.0433,125.8819 + 铁锋区|47.3469,123.9844 + 建华区|47.3606,123.9618 + 龙沙区|47.3237,123.9640 + 依安县|47.8995,125.3126 + 泰来县|46.3995,123.4240 + 甘南县|47.9264,123.5127 + 昂昂溪区|47.1613,123.8287 + 富拉尔基区|47.2149,123.6358 + 碾子山区|47.5233,122.8941 + 梅里斯达斡尔族区|47.3154,123.7593 + 龙江县|47.3432,123.2113 + 拜泉县|47.6018,126.1064 + 克东县|48.0480,126.2550 + 讷河市|48.4900,124.8905 + + city + 齐齐哈尔|47.3600,123.9245 + + + areas + + 东宁县|44.0928,131.1311 + 西安区|44.5837,129.6225 + 爱民区|44.6024,129.5981 + 阳明区|44.6021,129.6421 + 宁安市|44.3465,129.4891 + 海林市|44.5999,129.3870 + 绥芬河市|44.4195,131.1565 + 林口县|45.2836,130.2897 + 东安区|44.5872,129.6331 + 穆棱市|44.9247,130.5312 + + city + 牡丹江|44.5586,129.6389 + + + areas + + 孙吴县|49.4316,127.3424 + 北安市|48.2477,126.4974 + 爱辉区|50.2577,127.5071 + 逊克县|49.5696,128.4854 + 五大连池市|48.5223,126.2110 + 嫩江县|49.1913,125.2275 + + city + 黑河|50.2511,127.5350 + + + areas + + 集贤县|46.7.46,131.1475 + 友谊县|46.7731,131.8145 + 宝清县|46.3327,132.2036 + 饶河县|46.8042,134.0197 + 尖山区|46.6525,131.1647 + 岭东区|46.5509,131.1584 + 四方台区|46.5998,131.3411 + 宝山区|46.5836,131.4081 + + city + 双鸭山|46.6672,131.2013 + + + areas + + 海伦市|47.4683,126.9797 + 青冈县|46.6960,126.1202 + 庆安县|46.8858,127.5141 + 绥棱县|47.2419,127.1213 + 明水县|47.1794,125.9124 + 肇东市|46.0570,125.9690 + 安达市|46.4233,125.3504 + 望奎县|46.8391,126.4924 + 兰西县|46.2581,126.2944 + 北林区|46.6433,126.9921 + + city + 绥化|46.6587,126.9756 + + + areas + + 上甘岭区|47.9807,129.0308 + 友好区|47.8596,128.8472 + 南岔区|47.1437,129.2902 + 伊春区|47.7340,128.9138 + 嘉荫县|48.8952,130.4096 + 铁力市|46.9929,128.0387 + 红星区|48.2453,129.3973 + 乌马河区|47.7324,128.8067 + 汤旺河区|48.4607,129.5774 + 金山屯区|47.4186,129.4356 + 五营区|48.1143,129.2517 + 新青区|48.2960,129.5402 + 美溪区|47.6414,129.1356 + 西林区|47.4865,129.3194 + 翠峦区|47.7318,128.6754 + 带岭区|47.0345,129.0269 + 乌伊岭区|48.5963,129.4443 + + city + 伊春|47.7333,128.8470 + + + areas + + 桦川县|47.0288,130.7255 + 汤原县|46.7363,129.9115 + 抚远县|48.3708,134.3144 + 同江市|47.6481,132.5175 + 富锦市|47.2560,132.0438 + 向阳区|47.3486,130.3007 + 永红区|47.2951,130.2931 + 东风区|46.8285,130.4096 + 前进区|46.8197,130.3818 + 桦南县|46.2456,130.5600 + + city + 佳木斯|46.8065,130.3269 + + + areas + + 五常市|44.9378,127.1739 + 尚志市|45.2168,127.9668 + 双城市|45.3892,126.3188 + 阿城市|45.5477,126.9816 + 延寿县|45.4575,128.3382 + 通河县|45.9963,128.7524 + 木兰县|45.9567,128.0502 + 依兰县|46.3308,129.5751 + 方正县|45.8581,128.8337 + 松北区|45.8140,126.5693 + 呼兰区|45.8952,126.5943 + 动力区|45.7063,126.7002 + 平房区|45.6037,126.6442 + 道外区|45.7976,126.6559 + 香坊区|45.7140,126.6694 + 南岗区|45.7658,126.6750 + 道里区|45.7619,126.6232 + 宾县|45.7643,127.4924 + 巴彦县|46.0912,127.4100 + + city + 哈尔滨|45.8077,126.5424 + + + areas + + 虎林市|45.7688,132.9434 + 密山市|45.5356,131.8528 + 鸡东县|45.2659,131.1306 + 麻山区|45.2179,130.4847 + 滴道区|45.3544,130.8502 + 恒山区|45.2169,130.9113 + 城子河区|45.3429,131.0178 + 梨树区|45.0982,130.7034 + 鸡冠区|45.3097,130.9874 + + city + 鸡西|45.3215,130.9417 + + + state + 黑龙江|45.7477,126.6695 + + + cities + + + areas + + 宁江区|45.1780,124.8234 + 前郭尔罗斯蒙古族自治县|45.1234,124.8300 + 长岭县|44.2822,123.9736 + 乾安县|45.0102,124.0345 + 扶余县|45.1310,125.5645 + + city + 松原|45.1472,124.8316 + + + areas + + 铁西区|43.4524,124.3516 + 双辽市|43.5245,123.5093 + 伊通满族自治县|43.3510,125.3118 + 公主岭市|43.5108,124.8292 + 梨树县|43.3134,124.3420 + 铁东区|43.1680,124.4159 + + city + 四平|43.1724,124.3568 + + + areas + + 洮南市|45.3416,122.7928 + 大安市|45.5131,124.2990 + 洮北区|45.6276,122.8576 + 镇赉县|45.8540,123.2064 + 通榆县|44.8189,123.0948 + + city + 白城|45.6254,122.8453 + + + areas + + 长白朝鲜族自治县|41.4257,128.2070 + 靖宇县|42.3947,126.8197 + 抚松县|42.3478,127.2869 + 八道江区|41.8886,126.3614 + 临江市|41.8177,126.9245 + 江源县|42.0951,126.6045 + + city + 白山|41.9464,126.4310 + + + areas + + 舒兰市|44.4122,126.9716 + 桦甸市|42.9781,126.7527 + 磐石市|42.9522,126.0670 + 丰满区|43.8272,126.5686 + 船营区|43.8395,126.5477 + 蛟河市|43.7300,127.3512 + 永吉县|43.6787,126.5039 + 龙潭区|43.9364,126.5687 + 昌邑区|43.8879,126.5808 + + city + 吉林|43.8435,126.5560 + + + areas + + 集安市|41.1319,126.1992 + 梅河口市|42.5444,125.7187 + 二道江区|41.7799,126.0492 + 辉南县|42.6906,126.0534 + 东昌区|41.7342,125.9616 + 通化县|41.6856,125.7657 + 柳河县|42.2909,125.7512 + + city + 通化|41.7339,125.9465 + + + areas + + 二道区|43.8710,125.3807 + 朝阳区|43.8396,125.2948 + 双阳区|43.5311,125.6710 + 绿园区|43.8865,125.2625 + 九台市|44.2097,125.9851 + 农安县|44.4380,125.1916 + 德惠市|44.5427,125.7122 + 榆树市|44.8455,126.5396 + 南关区|43.8698,125.3570 + 宽城区|43.9486,125.3327 + + city + 长春|43.8217,125.3301 + + + areas + + 图们市|42.9744,129.8502 + 延吉市|42.8970,129.5156 + 珲春市|42.8682,130.3723 + 敦化市|43.3784,128.2386 + 和龙市|42.5527,129.0171 + 龙井市|42.7715,129.4330 + 安图县|43.1178,128.9056 + 汪清县|43.3184,129.7778 + + city + 延边朝鲜族|43.1126,128.9200 + + + areas + + 龙山区|42.9076,125.1432 + 东辽县|42.9320,124.9982 + 西安区|42.9332,125.1555 + 东丰县|42.6833,125.5369 + + city + 辽源|42.8943,125.1501 + + + state + 吉林|43.8435,126.5560 + + + cities + + + areas + + 银州区|42.2925,123.8487 + 清河区|42.5526,124.1657 + 调兵山市|42.4734,123.5734 + 昌图县|42.7921,124.1174 + 西丰县|42.7440,124.7339 + 铁岭县|42.2291,123.7341 + 开原市|42.5522,124.0447 + + city + 铁岭|42.2925,123.8487 + + + areas + + 建昌县|40.8298,119.8437 + 兴城市|40.6160,120.7627 + 南票区|41.1131,120.7563 + 绥中县|40.3318,120.3507 + 连山区|40.7812,120.8755 + 龙港区|40.7411,120.9005 + + city + 葫芦岛|40.7173,120.8433 + + + areas + + 鲅鱼圈区|40.2326,122.1282 + 老边区|40.6862,122.3865 + 站前区|40.6787,122.2653 + 西市区|40.6720,122.2132 + 盖州市|40.4061,122.3553 + 大石桥市|40.6507,122.5155 + + city + 营口|40.6725,122.2414 + + + areas + + 平山区|41.2271,123.6899 + 溪湖区|41.3348,123.7742 + 明山区|41.3149,123.8234 + 桓仁满族自治县|41.2728,125.3675 + 南芬区|41.1064,123.7515 + 本溪满族自治县|41.3084,124.1285 + + city + 本溪|41.2998,123.7734 + + + areas + + 宏伟区|41.2230,123.2029 + 文圣区|41.2683,123.1918 + 弓长岭区|41.1572,123.4267 + 太子河区|42.2591,123.1878 + 白塔区|41.2759,123.1808 + 灯塔市|41.4323,123.3457 + 辽阳县|41.2117,123.1122 + + city + 辽阳|41.2744,123.2437 + + + areas + + 双台子区|41.1966,122.0666 + 兴隆台区|41.1444,122.1121 + 大洼县|41.0082,122.0890 + 盘山县|41.2484,122.0028 + + city + 盘锦|41.1259,122.0772 + + + areas + + 阜新蒙古族自治县|42.0709,121.7644 + 细河区|42.0317,121.6864 + 彰武县|42.3926,122.5153 + 新邱区|42.0937,121.7986 + 海州区|42.0194,121.6626 + 清河门区|41.7898,121.4226 + 太平区|42.0170,121.6850 + + city + 阜新|42.0279,121.6765 + + + areas + + 喀喇沁左翼蒙古族自治县|41.1335,119.7470 + 建平县|41.4095,119.6503 + 北票市|41.8064,120.7775 + 凌源市|41.2518,119.4076 + 朝阳县|41.3734,120.3025 + 龙城区|41..6053,120.4221 + 双塔区|41.5717,120.4602 + + city + 朝阳|41.3734,120.3025 + + + areas + + 凌海市|41.1795,121.3642 + 古塔区|41.1229,121.1349 + 北镇市|41.6010,121.8049 + 黑山县|41.6997,122.1272 + 义县|41.5389,121.2457 + 太和区|41.1150,121.1102 + 凌河区|41.1208,121.1578 + + city + 锦州|41.1008,121.1336 + + + areas + + 清原满族自治县|42.1067,124.9304 + 东洲区|41.08588,124.0457 + 新抚区|41.8651,123.8806 + 望花区|41.8589,123.7909 + 顺城区|41.8893,123.9515 + 抚顺县|41.7925,124.2023 + 新宾满族自治县|41.7400,125.0461 + + city + 抚顺|41.8860,123.9635 + + + areas + + 凤城市|40.4590,124.0724 + 东港市|39.8674,124.1587 + 宽甸满族自治县|40.7376,124.7899 + 振安区|40.1645,124.4345 + 振兴区|40.1107,124.3669 + 元宝区|40.1424,124.4024 + + city + 丹东|40.1290,124.3385 + + + areas + + 新民市|42.0033,122.8346 + 康平县|42.7562,123.3598 + 法库县|42.5097,123.4150 + 沈河区|41.8022,123.4649 + 和平区|41.7954,123.4276 + 东陵区|41.7655,123.5998 + 新城子区|42.0564,123.5239 + 于洪区|41.7997,123.3147 + 辽中县|41.5178,122.7380 + 大东区|41.8114,123.4762 + 皇姑区|41.8261,123.4317 + 铁西区|41.8089,123.3836 + 苏家屯区|41.6709,123.3507 + + city + 沈阳|41.8113,123.4389 + + + areas + + 铁东区|41.0962,122.9975 + 立山区|41.1561,123.0360 + 铁西区|41.1255,122.9758 + 台安县|41.4185,122.4424 + 千山区|41.0807,122.9674 + 海城市|40.8871,122.6911 + 岫岩满族自治县|40.2957,123.2882 + + city + 鞍山|41.1141,123.0009 + + + areas + + 庄河市|39.6862,122.9726 + 瓦房店市|39.6320,121.9865 + 普兰店市|39.4002,121.9698 + 金州区|39.0563,121.7890 + 长海县|39.2784,122.5952 + 甘井子区|38.9581,121.5320 + 旅顺口区|38.8569,121.2686 + 西岗区|38.9204,121.6189 + 沙河口区|38.9105,121.6010 + 中山区|38.9245,121.6516 + + city + 大连|38.9193,121.6213 + + + state + 辽宁|41.8413,123.4358 + + + cities + + + areas + + city + 保亭|18.6407,109.7180 + + + areas + + city + 澄迈|19.6931,109.9967 + + + areas + + city + 陵水黎族|18.4360,109.8639 + + + areas + + city + 屯昌|19.3477,110.0633 + + + areas + + city + 昌江黎族|19.2224,109.0113 + + + areas + + city + 乐东黎族|18.6586,109.0626 + + + areas + + city + 琼海|19.2148,110.4143 + + + areas + + city + 儋州|19.5711,109.4139 + + + areas + + city + 文昌|19.7509,110.7809 + + + areas + + city + 万宁|18.8689,110.4625 + + + areas + + city + 白沙黎族|19.2160,109.3585 + + + areas + + 琼山区|20.0096,110.3608 + 龙华区|20.0354,110.3359 + 秀英区|20.0138,110.3000 + 美兰区|20.0345,110.3731 + + city + 海口|20.0500,110.2064 + + + areas + + city + 三亚|18.2582,109.5186 + + + areas + + city + 五指山|18.2641,109.5069 + + + areas + + city + 琼中|19.0397,109.8618 + + + areas + + city + 定安|19.6870,110.3658 + + + areas + + city + 临高|19.9187,109.6972 + + + state + 海南|39.2962,106.9253 + + + cities + + + areas + + 北湖区|25.7899,113.0174 + 安仁县|26.7157,113.2759 + 资兴市|25.9819,113.2425 + 嘉禾县|25.5933,112.3751 + 临武县|25.2822,112.5693 + 汝城县|25.5561,113.6914 + 桂东县|26.0831,113.9511 + 苏仙区|25.8067,113.0487 + 桂阳县|25.7597,112.7402 + 宜章县|25.4055,112.9553 + 永兴县|26.1329,113.1231 + + city + 郴州|25.7767,113.0213 + + + areas + + 君山区|29.4672,113.0130 + 云溪区|29.4798,113.2787 + 岳阳楼区|29.3779,113.1357 + 平江县|28.7076,113.5879 + 湘阴县|28.6955,112.9156 + 华容县|29.5364,112.5474 + 岳阳县|29.1499,113.1228 + 临湘市|29.4825,113.4571 + 汨罗市|28.8124,113.0736 + + city + 岳阳|29.3632,113.1356 + + + areas + + 通道侗族自治县|26.1641,109.7909 + 靖州苗族侗族自治县|26.5813,109.7027 + 洪江市|27.2151,109.8430 + 新晃侗族自治县|27.3587,109.1813 + 芷江侗族自治县|27.4495,109.6915 + 中方县|27.4460,109.9514 + 沅陵县|28.4590,110.4003 + 鹤城区|27.5840,110.0473 + 会同县|26.8928,109.7422 + 麻阳苗族自治县|27.8718,109.8089 + 辰溪县|28.0126,110.1901 + 溆浦县|27.9141,110.6014 + + city + 怀化|27.5755,110.0081 + + + areas + + 新化县|27.7325,111.3339 + 双峰县|27.4633,112.2003 + 涟源市|27.6983,111.6710 + 冷水江市|27.6919,111.4417 + 娄星区|27.7355,112.0082 + + city + 娄底|27.7031,112.0010 + + + areas + + 慈利县|29.4358,111.1456 + 武陵源区|29.3517,110.5564 + 桑植县|29.4060,110.1706 + 永定区|29.1260,110.5438 + + city + 张家界|29.1224,110.4849 + + + areas + + 沅江市|28.8499,112.3612 + 资阳区|28.5973,112.3306 + 南县|29.3673,112.4028 + 赫山区|28.5849,112.3806 + 安化县|28.3803,111.2195 + 桃江县|28.5239,112.1622 + + city + 益阳|28.5598,112.3616 + + + areas + + 凤凰县|27.9542,109.6048 + 花垣县|28.5779,109.4888 + 保靖县|28.7061,109.6670 + 古丈县|28.6230,109.9573 + 泸溪县|28.2220,110.2262 + 吉首市|28.2686,109.7045 + 龙山县|29.4642,109.4502 + 永顺县|29.0108,109.8546 + + city + 湘西土家族苗族|28.2627,109.6991 + + + areas + + 津市市|29.6112,111.8839 + 桃源县|28.9088,111.4953 + 石门县|29.5902,111.3862 + 澧县|29.6390,111.7652 + 临澧县|29.4462,111.6539 + 安乡县|29.4174,112.1774 + 汉寿县|28.9117,111.9768 + 武陵区|29.0598,111.6905 + 鼎城区|29.0245,111.6872 + + city + 常德|29.0377,111.7049 + + + areas + + 岳塘区|27.8783,112.9767 + 雨湖区|27.8625,112.9138 + 湘乡市|27.7401,112.5415 + 湘潭县|27.7850,112.9574 + 韶山市|27.9210,112.5331 + + city + 湘潭|27.8358,112.9505 + + + areas + + 江华瑶族自治县|25.1915,111.5859 + 新田县|25.9106,112.2096 + 蓝山县|25.3757,112.2032 + 宁远县|25.5754,111.9509 + 江永县|25.2797,111.3502 + 道县|25.5338,111.6064 + 双牌县|25.9678,111.6669 + 东安县|26.3978,111.3229 + 祁阳县|26.5864,111.8465 + 冷水滩区|26.4672,111.5988 + 零陵区|26.2285,111.6376 + + city + 永州|26.4266,111.6187 + + + areas + + 珠晖区|26.9002,112.6269 + 祁东县|26.8059,112.0968 + 耒阳市|26.4280,112.8664 + 衡山县|27.2359,112.8748 + 衡东县|27.0870,112.9597 + 衡阳县|26.9754,112.3772 + 衡南县|26.7446,112.6843 + 蒸湘区|26.8995,112.5783 + 南岳区|27.2382,112.7453 + 石鼓区|26.9492,112.6045 + 雁峰区|26.8943,112.6232 + 常宁市|26.4267,112.4064 + + city + 衡阳|26.8995,112.5783 + + + areas + + 醴陵市|27.6522,113.5035 + 炎陵县|26.4960,113.7789 + 攸县|27.0059,113.3522 + 茶陵县|26.7836,113.5457 + 芦淞区|27.7913,113.1587 + 石峰区|27.8813,113.1244 + 天元区|27.8326,113.0888 + 株洲县|27.7056,113.1504 + 荷塘区|27.8622,113.1797 + + city + 株洲|27.8337,113.1404 + + + areas + + 长沙县|28.2517,113.0874 + 雨花区|28.1418,113.0419 + 开福区|28.2615,112.9928 + 岳麓区|28.2415,112.9377 + 天心区|28.1183,112.9965 + 芙蓉区|28.2091,113.0418 + 望城县|28.2970,112.8252 + 宁乡县|28.2837,112.5582 + 浏阳市|28.1701,113.6495 + + city + 长沙|28.2339,112.9453 + + + areas + + 大祥区|27.2271,111.4454 + 北塔区|27.2516,111.4585 + 邵东县|27.2645,111.7509 + 新邵县|27.3270,111.4654 + 邵阳县|26.9967,111.2803 + 隆回县|27.1199,111.0389 + 洞口县|27.0660,110.5824 + 绥宁县|26.5883,110.1621 + 新宁县|26.4395,110.8632 + 城步苗族自治县|26.3963,110.3287 + 武冈市|26.7328,110.6377 + 双清区|27.2390,111.5031 + + city + 邵阳|27.2451,111.4741 + + + state + 湖南|27.6958,111.7206 + + + cities + + + areas + + 桐柏县|32.3851,113.4353 + 新野县|32.5267,112.3666 + 唐河县|32.6874,112.8138 + 社旗县|33.0621,112.9544 + 邓州市|32.6940,112.0937 + 镇平县|33.0398,112.2410 + 西峡县|33.3119,111.4788 + 淅川县|33.1444,111.4972 + 内乡县|33.0511,111.8556 + 卧龙区|32.9925,112.5414 + 宛城区|33.0097,112.5460 + 方城县|33.2604,113.0190 + 南召县|33.4960,112.4355 + + city + 南阳|32.9967,112.5350 + + + areas + + 宜阳县|34.5211,112.1856 + 洛宁县|34.3948,111.6597 + 嵩县|34.1408,112.0921 + 汝阳县|34.1598,112.4796 + 老城区|34.6895,112.4760 + 廛河回族区|34.7012,112.5410 + 洛龙区|34.6247,112.4704 + 西工区|34.6669,112.4346 + 吉利区|34.9070,112.5953 + 涧西区|34.6635,112.4022 + 孟津县|34.8317,112.4515 + 伊川县|34.4275,112.4320 + 偃师市|34.7339,112.7960 + 新安县|34.7338,112.1390 + 栾川县|33.7979,111.6222 + + city + 洛阳|34.6243,112.4600 + + + areas + + 陕县|34.7267,111.1098 + 卢氏县|34.0601,111.0543 + 湖滨区|34.7770,111.1940 + 渑池县|34.7730,111.7684 + 义马市|34.7531,111.8810 + 灵宝市|34.5230,110.9009 + + city + 三门峡|34.7784,111.2068 + + + areas + + 夏邑县|34.2452,116.1362 + 睢阳区|34.3942,115.6599 + 民权县|34.6525,115.1542 + 睢县|34.4515,115.0779 + 宁陵县|34.4607,115.3116 + 永城市|33.9348,116.4560 + 梁园区|34.4494,115.6205 + 柘城县|34.0973,115.3118 + 虞城县|34.4030,115.8717 + + city + 商丘|34.4203,115.6627 + + + areas + + 温县|34.9460,113.0871 + 武陟县|35.1058,113.4082 + 博爱县|35.1773,113.0710 + 修武县|35.2293,113.4543 + 解放区|35.2462,113.2372 + 中站区|35.2428,113.1894 + 沁阳市|35.0935,112.9571 + 济源市|35.0728,112.6093 + 马村区|35.2619,113.3294 + 山阳区|35.2202,113.2606 + 孟州市|34.9136,112.7977 + + city + 焦作|35.2214,113.2485 + + + areas + + 通许县|34.4867,114.4738 + 杞县|34.5559,114.7894 + 开封县|34.7260,114.4521 + 尉氏县|34.4173,114.1995 + 兰考县|34.8284,114.8276 + 禹王台区|34.7835,114.3546 + 金明区|34.8239,114.3300 + 龙亭区|34.8062,114.3612 + 顺河回族区|34.8022,114.3671 + 鼓楼区|32.0723,118.7766 + + city + 开封|34.8029,114.3139 + + + areas + + 西平县|33.3939,114.0280 + 驿城区|32.9795,114.0002 + 平舆县|32.9680,114.6258 + 上蔡县|33.2686,114.2708 + 确山县|32.8081,114.0329 + 正阳县|32.6116,114.3992 + 汝南县|33.0131,114.3686 + 泌阳县|32.7298,113.3336 + 遂平县|33.1520,114.0196 + 新蔡县|32.7553,114.9921 + + city + 驻马店|33.0175,114.0294 + + + areas + + 范县|35.8575,115.5106 + 台前县|35.9750,115.8781 + 濮阳县|35.7178,115.0356 + 华龙区|35.7837,115.0807 + 南乐县|36.0761,115.2112 + 清丰县|35.8912,115.1106 + + city + 濮阳|35.7675,115.0359 + + + areas + + 魏都区|34.0518,113.8373 + 许昌县|34.1316,113.8293 + 鄢陵县|34.1079,114.1840 + 襄城县|33.8569,113.5131 + 禹州市|34.1464,113.4944 + 长葛市|34.2230,113.7746 + + city + 许昌|34.0417,113.8588 + + + areas + + 安阳县|36.2188,114.2382 + 汤阴县|35.9277,114.3636 + 滑县|35.5811,114.5258 + 内黄县|35.9527,114.9059 + 文峰区|36.0968,114.3632 + 北关区|36.1148,114.3614 + 殷都区|36.1156,114.3100 + 龙安区|36.0817,114.3074 + 林州市|36.0887,113.8256 + + city + 安阳|36.1036,114.3996 + + + areas + + 淮滨县|32.4795,115.4263 + 息县|32.3489,114.7466 + 商城县|31.8043,115.4134 + 新县|31.6497,114.8858 + 光山县|32.0157,114.9253 + 罗山县|32.2090,114.5196 + 平桥区|32.1073,114.1320 + 浉河区|32.1224,114.0651 + 潢川县|32.1375,115.0577 + 固始县|32.1744,115.6612 + + city + 信阳|32.1531,114.0992 + + + areas + + 舞阳县|33.4436,113.6157 + 源汇区|33.5511,113.9267 + 郾城区|33.5933,114.0130 + 召陵区|33.5925,114.1003 + 临颍县|33.8152,113.9410 + + city + 漯河|33.5877,114.0232 + + + areas + + 郏县|33.9774,113.2192 + 鲁山县|33.7448,112.9144 + 叶县|33.6326,113.3639 + 宝丰县|33.8746,113.0612 + 湛河区|33.7072,113.2824 + 石龙区|33.9050,112.9053 + 卫东区|33.7403,113.3416 + 新华区|33.7436,113.3007 + 汝州市|34.1729,112.8509 + 舞钢市|33.2994,113.5317 + + city + 平顶山|33.7720,113.1989 + + + areas + + 登封市|34.4597,113.0567 + 巩义市|34.7541,113.0284 + 中牟县|34.7251,113.9827 + 惠济区|34.8735,113.6233 + 中原区|34.7542,113.6197 + 荥阳市|34.7938,113.3899 + 新密市|34.5458,113.3968 + 新郑市|34.4022,113.7480 + 上街区|34.8088,113.3154 + 金水区|34.8059,113.6671 + 管城回族区|34.7596,113.6839 + 二七区|34.7310,113.6465 + + city + 郑州|34.7534,113.6313 + + + areas + + 封丘县|35.0468,114.4252 + 长垣县|35.2061,114.6754 + 原阳县|35.0713,113.9465 + 延津县|35.1478,114.2116 + 获嘉县|35.2658,113.6635 + 新乡县|35.1965,113.8117 + 卫辉市|35.4041,114.0711 + 辉县市|35.4678,113.8119 + 卫滨区|35.3085,113.8722 + 红旗区|35.3098,113.8816 + 牧野区|35.3209,113.9151 + 凤泉区|35.3778,113.9124 + + city + 新乡|35.3089,113.9333 + + + areas + + 浚县|35.6818,114.5573 + 淇滨区|35.7469,114.3053 + 鹤山区|35.9604,114.1698 + 淇县|35.6136,114.2042 + 山城区|35.9033,114.1910 + + city + 鹤壁|35.7526,114.3040 + + + areas + + 沈丘县|33.4155,115.1050 + 郸城县|33.6508,115.1835 + 西华县|33.7732,114.5363 + 商水县|33.5488,114.6180 + 川汇区|33.6530,114.6570 + 扶沟县|34.0659,114.4013 + 鹿邑县|33.8658,115.4910 + 淮阳县|33.7372,114.8927 + 太康县|34.0701,114.8441 + 项城市|33.4731,114.8821 + + city + 周口|33.6319,114.7034 + + + state + 河南|34.5113,101.5563 + + + cities + + + areas + + 毕节市|27.4085,105.3333 + 黔西县|27.0504,106.1208 + 大方县|27.2312,105.6945 + 纳雍县|26.8085,105.2838 + 威宁|26.8627,104.2851 + 赫章县|27.1354,104.6381 + 织金县|26.6481,105.7921 + 金沙县|27.4485,106.2751 + + city + 毕节地|27.3209,105.2911 + + + areas + + 惠水县|26.1390,106.6631 + 龙里县|26.4589,106.9863 + 都匀市|26.2661,107.5250 + 荔波县|25.4175,107.8937 + 福泉市|26.6928,107.5271 + 瓮安县|27.0836,107.4776 + 贵定县|26.5907,107.2410 + 平塘县|25.8282,107.3294 + 独山县|25.8282,107.5515 + 长顺县|26.0283,106.4588 + 罗甸县|25.4310,106.7582 + 三都|25.9919,107.8811 + + city + 黔南|26.2645,107.5232 + + + areas + + 钟山区|26.5817,104.8509 + 水城县|26.5523,104.9642 + 六枝特区|26.2077,105.4866 + 盘县|25.7156,104.4781 + + city + 六盘水|26.5990,104.8367 + + + areas + + 岑巩县|27.1799,108.8221 + 天柱县|26.9157,109.2142 + 锦屏县|26.6826,109.2069 + 黎平县|26.2349,109.1437 + 台江县|26.6748,108.3266 + 剑河县|26.7344,108.4478 + 凯里市|26.5737,107.9868 + 黄平县|26.9112,107.9229 + 施秉县|27.0395,108.1305 + 三穗县|26.9586,108.6818 + 镇远县|27.0548,108.4362 + 丹寨县|26.2044,107.7952 + 雷山县|26.3841,108.0841 + 从江县|25.7598,108.9118 + 麻江县|26.4968,107.5959 + 榕江县|25.9376,108.5290 + + city + 黔东南|26.5839,107.9853 + + + areas + + 清镇市|26.5620,106.4770 + 小河区|26.4969,106.7009 + 开阳县|27.0633,106.9714 + 乌当区|26.6353,106.7586 + 白云区|26.6842,106.6296 + 云岩区|26.6106,106.7322 + 花溪区|26.4161,106.6767 + 南明区|26.5741,106.7206 + 修文县|26.8447,106.5987 + 息烽县|27.0962,106.7469 + + city + 贵阳|26.6527,106.6368 + + + areas + + 遵义县|27.5421,106.8364 + 汇川区|27.7560,106.9389 + 红花岗区|27.6508,106.9002 + 仁怀市|27.7982,106.4080 + 习水县|28.33337,106.2102 + 赤水市|28.5966,105.7039 + 务川县|28.5691,107.9053 + 凤冈县|27.9604,107.7234 + 湄潭县|27.7545,107.4721 + 余庆县|27.2316,107.8946 + 桐梓县|28.1392,106.8315 + 绥阳县|27.9530,107.1971 + 正安县|28.5558,107.4505 + 道真县|28.8689,107.6190 + + city + 遵义|27.7317,106.9336 + + + areas + + 印江|28.4082,106.3265 + 玉屏|28.4815,107.5919 + 江口县|27.7288,108.7786 + 铜仁市|27.6749,109.1685 + 德江县|28.2645,108.0947 + 石阡县|27.4907,108.1699 + 思南县|27.8488,108.1494 + 万山特区|27.5293,109.2696 + 沿河|40.0466,116.7184 + 松桃|28.1733,109.2174 + + city + 铜仁地|27.5460,108.6662 + + + areas + + 安龙县|25.1040,105.4498 + 贞丰县|25.3913,105.6569 + 晴隆县|25.8408,105.2255 + 册亨县|24.9897,105.8182 + 望谟县|25.1844,106.1060 + 兴仁县|25.4408,105.1929 + 普安县|25.7900,104.9597 + 兴义市|25.0981,104.9019 + + city + 黔西南|25.0951,104.9005 + + + areas + + 紫云|25.7573,106.0907 + 关岭|25.5830,105.6421 + 镇宁|26.0612,105.7797 + 普定县|26.3075,105.7493 + 平坝县|26.4087,106.2914 + 西秀区|26.2516,105.9717 + + city + 安顺|26.2599,105.9526 + + + state + 贵州|26.6042,106.7136 + + + cities + + + areas + + 东湖区|28.6911,115.9057 + 西湖区|28.6619,115.8833 + 青云谱区|28.6271,115.9322 + 湾里区|28.7204,115.7374 + 进贤县|28.3826,116.2490 + 安义县|28.8507,115.5557 + 新建县|28.6987,115.8217 + 青山湖区|28.6877,115.9684 + 南昌县|28.5514,115.9506 + + city + 南昌|28.6876,115.8645 + + + areas + + 安源区|27.6218,113.8780 + 芦溪县|27.6366,114.0360 + 上栗县|27.8863,113.8019 + 莲花县|27.1334,113.9677 + 湘东区|27.6467,113.7407 + + city + 萍乡|27.6289,113.8607 + + + areas + + 乐平市|28.9680,117.1354 + 浮梁县|29.3576,117.2216 + 珠山区|29.3059,117.2092 + 昌江区|29.2788,117.1902 + + city + 景德镇|29.2743,117.1849 + + + areas + + 安福县|27.3989,114.6260 + 万安县|26.4639,114.7927 + 遂川县|26.3194,114.5270 + 泰和县|26.7956,114.9154 + 永丰县|27.3244,115.4482 + 新干县|27.7458,115.3935 + 峡江县|27.5892,115.3228 + 吉水县|27.2354,115.1420 + 青原区|27.0876,115.0212 + 吉安县|27.0450,114.9148 + 井冈山市|26.7537,114.2960 + 永新县|26.9213,114.2494 + 吉州区|27.1507,115.0011 + + city + 吉安|27.1197,115.0002 + + + areas + + 彭泽县|29.9021,116.5556 + 德安县|29.3192,115.7626 + 星子县|29.4545,116.0515 + 修水县|29.0310,114.5534 + 永修县|29.0272,115.8155 + 九江县|29.6148,115.9177 + 武宁县|29.2623,115.1070 + 庐山区|29.6775,115.9957 + 浔阳区|29.7334,115.9965 + 湖口县|29.7450,116.2268 + 都昌县|29.2788,116.2106 + 瑞昌市|29.6829,115.6874 + + city + 九江|29.7113,116.0079 + + + areas + + 分宜县|27.8207,114.6983 + 渝水区|27.8066,114.9510 + + city + 新余|27.8235,114.9236 + + + areas + + 贵溪市|28.2988,117.2516 + 余江县|28.2155,116.8249 + 月湖区|28.2448,117.0436 + + city + 鹰潭|28.2658,117.0757 + + + areas + + 广昌县|26.8430,116.3322 + 南城县|27.5747,116.6441 + 临川区|27.9407,116.3163 + 南丰县|27.2249,116.5316 + 黎川县|27.2884,116.9140 + 乐安县|27.4341,115.8375 + 崇仁县|27.7705,116.0677 + 金溪县|27.9254,116.7612 + 宜黄县|27.5606,116.2428 + 东乡县|28.2535,116.6098 + 资溪县|27.7115,117.0675 + + city + 抚州|27.9536,116.3646 + + + areas + + 章贡区|25.8233,114.9274 + 会昌县|25.6066,115.7924 + 于都县|25.9579,115.4219 + 兴国县|26.3435,115.3696 + 宁都县|26.4761,116.0159 + 全南县|24.7480,114.5367 + 石城县|26.3326,116.3608 + 寻乌县|24.9694,115.6532 + 安远县|25.1427,115.4003 + 崇义县|25.6873,114.3144 + 定南县|24.7911,115.0339 + 龙南县|24.9167,114.7964 + 信丰县|25.3920,114.9293 + 赣县|25.8663,115.0183 + 上犹县|25.7965,114.5441 + 大余县|25.4078,114.3683 + 南康市|25.8329,114.7125 + 瑞金市|25.8918,116.0335 + + city + 赣州|25.8371,114.9412 + + + areas + + 德兴市|28.9527,117.5853 + 婺源县|29.2540,117.8683 + 万年县|28.7003,117.0649 + 横峰县|28.4135,117.6028 + 弋阳县|28.3835,117.4547 + 玉山县|28.6876,118.2513 + 铅山县|28.3216,117.7158 + 上饶县|28.4549,117.9161 + 广丰县|28.4426,118.1977 + 信州区|28.4362,117.9710 + 余干县|28.7077,116.7022 + 鄱阳县|29.0112,116.7099 + + city + 上饶|28.4608,117.9500 + + + areas + + 宜丰县|28.3996,114.8102 + 靖安县|28.8671,115.3692 + 铜鼓县|28.5281,114.3771 + 丰城市|28.4652,115.7776 + 袁州区|27.8038,114.4342 + 奉新县|28.6937,115.4069 + 万载县|28.1120,114.4520 + 上高县|28.2392,114.9313 + 樟树市|28.0621,115.5525 + 高安市|28.4229,115.3821 + + city + 宜春|27.8200,114.4226 + + + state + 江西|27.7572,115.6760 + + + cities + + + areas + + 昭平县|24.1751,110.8179 + 八步区|24.4174,111.5585 + 富川瑶族自治县|24.8202,111.2840 + 钟山县|24.5320,111.3093 + + city + 贺州|24.4094,111.5730 + + + areas + + 万秀区|23.4788,111.3268 + 蝶山区|23.5456,111.3114 + 岑溪市|22.9246,111.0013 + 苍梧县|23.4214,111.2539 + 长洲区|23.4914,111.2811 + 蒙山县|24.1998,110.5313 + 藤县|23.3808,110.9214 + + city + 梧州|23.4828,111.2856 + + + areas + + 南丹县|24.9814,107.5487 + 金城江区|24.6957,108.0436 + 凤山县|24.5533,107.0486 + 天峨县|25.0053,107.1801 + 罗城仫佬族自治县|24.7830,108.9112 + 东兰县|24.5167,107.3807 + 都安瑶族自治县|23.9374,108.1120 + 大化瑶族自治县|23.7427,108.0045 + 环江毛南族自治县|24.8321,108.2647 + 巴马瑶族自治县|24.1474,107.2660 + 宜州市|24.4910,108.6430 + + city + 河池|24.6988,108.0918 + + + areas + + 乐业县|24.7921,106.5680 + 田林县|24.3004,106.2350 + 那坡县|23.3936,105.8390 + 凌云县|24.3538,106.5680 + 德保县|23.3290,106.6220 + 靖西县|23.1401,106.4241 + 田东县|23.6031,107.1325 + 平果县|23.3350,107.5964 + 田阳县|23.7419,106.9220 + 右江区|23.9068,106.6255 + 西林县|24.4956,105.1003 + 隆林各族自治县|24.7768,105.3503 + + city + 百色|23.9078,106.6249 + + + areas + + 忻城县|24.0718,108.6723 + 象州县|23.9798,109.7117 + 兴宾区|23.7333,109.2411 + 武宣县|23.6003,109.6696 + 金秀瑶族自治县|24.1364,110.1959 + 合山市|23.8123,108.8926 + + city + 来宾|23.7582,109.2288 + + + areas + + 港北区|23.1170,109.5798 + 港南区|23.0808,109.6065 + 覃塘区|23.1334,109.4591 + 桂平市|23.3999,110.0855 + 平南县|23.5454,110.3986 + + city + 贵港|23.1189,109.6041 + + + areas + + 北流市|22.7141,110.3608 + 兴业县|22.7421,109.8817 + 博白县|22.2787,109.9828 + 陆川县|22.3273,110.2705 + 容县|22.8636,110.5643 + 玉州区|22.6344,110.1577 + + city + 玉林|22.6606,110.1874 + + + areas + + 钦北区|22.1768,108.5797 + 灵山县|22.4225,109.2974 + 浦北县|22.2778,109.5634 + 钦南区|21.9442,108.6634 + + city + 钦州|21.9853,108.6608 + + + areas + + 海城区|21.4811,109.1240 + 铁山港区|21.5352,109.4280 + 银海区|21.4543,109.1457 + 合浦县|21.6671,109.2136 + + city + 北海|21.4869,109.1266 + + + areas + + 城中区|24.3457,109.4526 + 鱼峰区|24.2878,109.4537 + 柳南区|24.3416,109.3924 + 柳北区|24.3679,109.4084 + 柳江县|24.2609,109.3331 + 柳城县|24.6563,109.2512 + 鹿寨县|24.4788,109.7583 + 融安县|25.2304,109.4042 + 融水苗族自治县|25.0719,109.2629 + 三江侗族自治县|25.7888,109.6144 + + city + 柳州|24.3315,109.4219 + + + areas + + 灌阳县|25.4951,111.16732 + 龙胜各族自治县|25.8041,110.0179 + 兴安县|25.6176,110.6779 + 永福县|24.9856,109.9897 + 荔蒲县|24.4941,110.4015 + 恭城瑶族自治县|24.8372,110.8348 + 资源县|26.0486,110.6590 + 平乐县|24.6395,110.6496 + 象山区|25.2679,110.2875 + 叠彩区|25.3201,110.3083 + 秀峰区|25.2876,110.2954 + 临桂县|25.3062,110.0714 + 阳朔县|24.7845,110.5031 + 雁山区|25.0664,110.3156 + 七星区|25.2582,110.3242 + 全州县|25.9343,111.0796 + 灵川县|25.34154,110.3320 + + city + 桂林|25.2798,110.2964 + + + areas + + 横县|22.6586,109.2680 + 宾阳县|23.2236,108.8168 + 上林县|23.4383,108.6115 + 兴宁区|22.8605,108.3748 + 江南区|22.7872,108.2798 + 青秀区|22.7927,108.5033 + 良庆区|22.7620,108.3273 + 西乡塘区|22.8396,108.3200 + 武鸣县|23.1645,108.2811 + 邕宁区|22.7646,108.4937 + 马山县|23.7138,108.1835 + 隆安县|23.1715,107.7026 + + city + 南宁|22.7751,108.3180 + + + areas + + 防城区|21.7754,108.3598 + 港口区|21.6496,108.3866 + 上思县|22.1599,107.9900 + 东兴市|21.5539,107.9783 + + city + 防城港|21.6934,108.3611 + + + areas + + 大新县|22.8362,107.2077 + 龙州县|22.3483,106.8611 + 凭祥市|22.1003,106.7730 + 天等县|23.0875,107.1501 + 江洲区|22.4114,107.3597 + 宁明县|22.1460,107.0832 + 扶绥县|22.6410,107.9105 + + city + 崇左|22.4154,107.3573 + + + state + 广西|23.5522,108.9242 + + + cities + + + areas + + 杨凌区|34.2779,108.0908 + 秦都区|34.3353,108.7128 + 旬邑县|35.1178,108.3401 + 淳化县|34.8049,108.5870 + 乾县|34.5339,108.2457 + 泾阳县|34.5334,108.8489 + 三原县|34.6232,108.9468 + 渭城区|34.3681,108.7437 + 永寿县|34.6980,108.1486 + 礼泉县|34.4873,108.4315 + 武功县|34.2662,108.2067 + 长武县|35.2115,107.8052 + 彬县|35.0415,108.0876 + 兴平市|34.3055,108.4967 + + city + 咸阳|34.3355,108.7157 + + + areas + + 印台区|35.1208,109.1062 + 王益区|35.0754,109.0823 + 宜君县|35.4046,109.1234 + 耀州区|34.9159,108.9865 + + city + 铜川|34.9029,108.9515 + + + areas + + 山阳县|33.5380,109.8884 + 商南县|33.5374,110.8879 + 丹凤县|33.7015,110.3337 + 洛南县|34.0970,110.1547 + 商州区|33.8688,109.9475 + 柞水县|33.6919,109.1207 + 镇安县|33.4291,109.1591 + + city + 商洛|33.8765,109.9468 + + + areas + + 横山县|37.9647,109.2996 + 靖边县|37.6050,108.8022 + 定边县|37.6004,107.6078 + 绥德县|37.5089,110.2695 + 吴堡县|37.4584,110.7461 + 榆阳区|38.2823,109.7278 + 神木县|38.8485,110.5053 + 府谷县|39.0337,111.0742 + 米脂县|37.7609,110.1903 + 佳县|38.0256,110.4978 + 子洲县|37.6170,110.0416 + 清涧县|37.0947,110.1276 + + city + 榆林|38.2908,109.7411 + + + areas + + 临渭区|34.5039,109.4987 + 华县|34.5186,109.7783 + 潼关县|34.5503,110.2530 + 大荔县|34.8017,109.9486 + 白水县|35.1830,109.5975 + 蒲城县|34.9612,109.5929 + 韩城市|35.4824,110.4489 + 富平县|34.7573,109.1866 + 华阴市|34.5717,110.0986 + 澄城县|35.1965,109.9386 + 合阳县|35.2437,110.1556 + + city + 渭南|34.5023,109.4839 + + + areas + + 略阳县|33.3331,106.1631 + 宁强县|32.8353,106.2637 + 勉县|33.1599,106.6795 + 西乡县|32.9893,107.7730 + 洋县|33.2288,107.5521 + 城固县|33.1623,107.3403 + 南郑县|33.0055,106.9426 + 汉台区|33.0741,107.0383 + 留坝县|33.6239,106.9271 + 镇巴县|35.5428,107.9014 + 佛坪县|33.5.07,107.9969 + + city + 汉中|33.0815,107.0454 + + + areas + + 汉阴县|32.8991,108.5151 + 石泉县|33.0445,108.2548 + 宁陕县|33.3162,108.3208 + 紫阳县|32.5259,108.5407 + 白河县|32.8148,110.1191 + 旬阳县|32.8399,109.3717 + 汉滨区|32.7011,109.0335 + 镇坪县|31.8896,109.5332 + 岚皋县|32.3128,108.9088 + 平利县|32.3948,109.3683 + + city + 安康|32.6905,109.0359 + + + areas + + 延川县|36.8840,110.2002 + 延长县|36.5853,110.0188 + 黄龙县|35.5901,109.8467 + 黄陵县|35.5850,109.2695 + 洛川县|35.7682,109.4387 + 宜川县|36.0565,110.1754 + 甘泉县|36.2827,109.3578 + 富县|35.9934,109.3863 + 志丹县|36.8280,108.7750 + 吴起县|36.9329,108.1824 + 子长县|37.1488,109.6817 + 安塞县|36.8700,109.3353 + 宝塔区|36.5971,109.4996 + + city + 延安|36.5910,109.4963 + + + areas + + 太白县|34.0640,107.3256 + 凤县|33.9181,106.5285 + 千阳县|34.6486,107.1388 + 麟游县|34.6838,107.7999 + 陈仓区|34.3608,107.3938 + 凤翔县|34.5274,107.4071 + 渭滨区|34.3778,107.1566 + 金台区|34.3963,107.1377 + 眉县|34.2803,107.7563 + 陇县|34.8987,106.8708 + 岐山县|34.4496,107.6274 + 扶风县|34.3814,107.9066 + + city + 宝鸡|34.3677,107.2438 + + + areas + + 高陵县|34.5137,109.0737 + 户县|34.1147,108.6113 + 长安区|34.1634,108.9134 + 临潼区|34.3729,109.2206 + 周至县|34.1695,108.2285 + 蓝田县|34.1576,109.3298 + 雁塔区|34.2288,108.9552 + 阎良区|34.6683,109.2326 + 碑林区|34.2366,108.9407 + 莲湖区|34.2731,108.9466 + 灞桥区|34.2789,109.0709 + 未央区|34.2994,108.9535 + 新城区|34.2729,108.9671 + + city + 西安|34.3474,108.9463 + + + state + 陕西|35.8600,109.5037 + + + cities + + + areas + + 吉县|36.1036,110.6881 + 霍州市|36.5746,111.7615 + 蒲县|36.4179,111.1029 + 侯马市|35.6253,111.3785 + 尧都区|36.0894,111.5841 + 汾西县|36.6588,111.5701 + 翼城县|35.7445,111.7247 + 隰县|36.6991,110.9470 + 永和县|36.7658,110.6383 + 乡宁县|35.9764,110.8537 + 大宁县|36.4714,110.7592 + 浮山县|35.9743,111.8559 + 曲沃县|35.6473,111.4820 + 古县|36.2724,111.9270 + 安泽县|36.1535,112.2567 + 襄汾县|35.8820,111.4484 + 洪洞县|36.2595,111.6815 + + city + 临汾|36.0940,111.5261 + + + areas + + 榆次区|37.7058,112.7139 + 和顺县|37.3347,113.5763 + 昔阳县|37.6185,113.7137 + 榆社县|37.0765,112.9818 + 左权县|37.0885,113.3857 + 祁县|37.3639,112.3415 + 平遥县|37.1954,112.1820 + 寿阳县|37.9011,113.1830 + 太谷县|37.4274,112.5576 + 灵石县|36.8535,111.7854 + 介休市|37.0328,111.9232 + + city + 晋中|37.6933,112.7385 + + + areas + + 怀仁县|39.8335,113.1067 + 朔城区|39.3254,112.4395 + 右玉县|39.9951,112.4735 + 应县|39.5599,113.1974 + 山阴县|39.5324,112.8221 + 平鲁区|39.5183,112.2948 + + city + 朔州|39.3378,112.4381 + + + areas + + 平陆县|34.8404,111.2013 + 夏县|35.1475,111.2267 + 新绛县|35.6224,111.2311 + 稷山县|35.6102,110.9895 + 垣曲县|35.3033,111.6768 + 绛县|35.4974,111.5752 + 临猗县|35.1509,110.7804 + 盐湖区|35.0213,111.0045 + 闻喜县|35.3628,111.2311 + 万荣县|35.4211,110.8443 + 芮城县|34.6993,110.7010 + 永济市|34.8728,110.4543 + 河津市|35.6021,110.7184 + + city + 运城|35.0325,110.0133 + + + areas + + 沁水县|35.6964,112.1930 + 阳城县|35.4922,112.4213 + 高平市|35.8044,112.9299 + 泽州县|35.5065,112.9501 + 陵川县|35.7814,113.2870 + 城区|35.4906,112.8577 + + city + 晋城|35.4906,112.8577 + + + areas + + 城区|37.8623,113.5870 + 平定县|37.7930,113.6644 + 盂县|38.0920,113.4188 + 矿区|37.8744,113.5618 + + city + 阳泉|37.8623,113.5870 + + + areas + + 原平市|38.7364,112.7174 + 神池县|39.0968,112.2171 + 偏关县|39.4421,111.5151 + 保德县|39.0285,111.0927 + 定襄县|38.4793,112.9637 + 五台县|38.7342,113.2618 + 代县|39.0727,112.9665 + 繁峙县|39.1952,113.2718 + 河曲县|39.3907,111.1448 + 岢岚县|38.7103,111.5794 + 五寨县|38.9170,111.8534 + 忻府区|38.4099,112.7528 + 宁武县|39.0077,112.3109 + 静乐县|38.3653,111.9451 + + city + 忻州|38.4223,112.7408 + + + areas + + 大同县|40.0461,113.6186 + 新荣区|40.2620,113.1465 + 南郊区|40.0117,113.1559 + 城区|40.0825,113.3064 + 矿区|37.8744,113.5618 + 天镇县|40.4263,114.0971 + 阳高县|40.3726,113.7605 + 灵丘县|39.4487,114.2405 + 广灵县|39.7659,114.2891 + 左云县|40.0196,112.7091 + 浑源县|39.7044,113.6973 + + city + 大同|40.0825,113.3064 + + + areas + + 黎城县|36.5085,113.3936 + 壶关县|36.1214,113.2139 + 长子县|36.1280,112.8845 + 武乡县|36.8434,112.8704 + 沁县|36.7622,112.7055 + 沁源县|36.5063,112.3440 + 潞城市|36.3398,113.2355 + 屯留县|36.3215,112.8986 + 平顺县|36.2059,113.4425 + 长治县|36.0594,113.0577 + 襄垣县|36.5420,113.0594 + 城区 + 郊区 + + city + 长治|36.2015,113.1230 + + + areas + + 杏花岭区|37.9003,112.5769 + 尖草坪区|37.9461,112.4935 + 万柏林区|37.8650,112.5221 + 晋源区|37.7211,112.4842 + 清徐县|37.6132,112.3654 + 阳曲县|38.0646,112.6793 + 娄烦县|38.0730,111.8040 + 古交市|37.9132,112.1823 + 迎泽区|37.8695,112.5698 + 小店区|37.7423,112.5720 + + city + 太原|37.8768,112.5570 + + + areas + + 石楼县|37.0043,110.8412 + 岚县|38.2851,111.6785 + 柳林县|37.4353,110.8957 + 临县|37.9573,110.9984 + 方山县|37.9010,111.2503 + 中阳县|37.3628,111.1861 + 交口县|36.9878,111.1876 + 孝义市|37.1510,111.7856 + 汾阳市|37.2711,111.7943 + 文水县|37.4441,112.0351 + 离石区|37.5235,111.1573 + 兴县|38.4687,111.1339 + 交城县|37.5574,112.1613 + + city + 吕梁|37.5254,111.1480 + + + state + 山西|37.8665,112.5154 + + + cities + + + areas + + 河南|34.5113,101.5563 + 泽库县|35.0417,101.47325 + 尖扎县|35.9441,102.0375 + 同仁县|35.5224,102.0259 + + city + 黄南|35.5228,102.0076 + + + areas + + 乐都县|36.5078,102.4297 + 互助|36.3033,102.5572 + 平安县|36.4064,102.0039 + 民和|36.3265,102.8372 + 化隆|36.5060,102.1047 + 循化|35.8549,102.4921 + + city + 海东地|36.5081,102.1105 + + + areas + + 班玛县|32.9383,100.7440 + 甘德县|33.9749,99.9073 + 达日县|33.7549,99.6581 + 久治县|33.4351,101.4894 + 玛沁县|34.4831,100.2461 + 玛多县|34.9208,98.2159 + + city + 果洛|34.4772,100.2513 + + + areas + + 湟中县|36.5066,101.5782 + 湟源县|36.6885,101.2629 + 城北区|36.6564,101.77 + 大通|36.9327,101.6920 + 城西区|36.6345,101.7722 + 城中区|36.5928,101.7765 + 城东区|36.6055,101.8097 + + city + 西宁|36.6234,101.7842 + + + areas + + 刚察县|37.3273,100.1534 + 海晏县|36.9027,101.0016 + 祁连县|38.1828,100.2596 + 门源|37.3823,101.6287 + + city + 海北|36.9605,100.8798 + + + areas + + 玉树县|32.9226,96.6721 + 称多县|33.3742,97.1151 + 杂多县|32.8990,95.3074 + 囊谦县|32.2092,96.4870 + 治多县|33.8580,95.6198 + 曲麻莱县|34.1322,95.8037 + + city + 玉树|32.9226,96.6721 + + + areas + + 贵南县|35.5925,100.7540 + 贵德县|36.0459,101.4401 + 兴海县|35.5947,99.9946 + 同德县|35.2600,100.5851 + 共和县|36.2887,100.6267 + + city + 海南|39.2962,106.9253 + + + areas + + 天峻县|37.3070,99.0293 + 都兰县|36.3095,98.1019 + 格尔木市|36.4085,94.9097 + 乌兰县|36.9356,98.4865 + 德令哈市|37.3753,97.3674 + + city + 海西|37.3737,97.3426 + + + state + 青海|36.6270,101.7865 + + + cities + + + areas + + 大武口区|39.0246,106.3746 + 惠农区|39.2452,106.7877 + 平罗县|38.9193,106.5296 + + city + 石嘴山|38.9897,106.3907 + + + areas + + 原州区|36.0093,106.2943 + 彭阳县|35.8554,106.6446 + 泾源县|35.5044,106.3370 + 隆德县|35.6239,106.1298 + 西吉县|35.9701,105.7354 + + city + 固原|36.0216,106.2491 + + + areas + + 海原县|36.5710,105.6501 + 中宁县|37.4974,105.6917 + 沙坡头区|37.5218,105.1966 + + city + 中卫|37.5060,105.2033 + + + areas + + 贺兰县|38.5604,106.3563 + 灵武市|38.1088,106.3464 + 金凤区|38.4789,106.2494 + 永宁县|38.2831,106.2597 + 兴庆区|38.4796,106.2949 + 西夏区|38.5016,106.1630 + + city + 银川|38.4923,106.2389 + + + areas + + 青铜峡市|38.0275,106.0851 + 同心县|36.9864,105.9210 + 盐池县|37.7892,107.4142 + 利通区|37.9909,106.2189 + + city + 吴忠|38.0038,106.2051 + + + state + 宁夏|38.4768,106.2652 + + + cities + + + areas + + 西固区|36.0941,103.6346 + 安宁区|36.1098,103.7253 + 城关区|36.0631,103.8318 + 七里河区|36.0721,103.7921 + 皋兰县|36.3381,103.9539 + 榆中县|35.8490,104.1191 + 红古区|36.3519,102.8657 + 永登县|36.7420,103.2671 + + city + 兰州|36.0673,103.8406 + + + areas + + 金川区|38.5259,102.2006 + 永昌县|38.2530,101.9794 + + city + 金昌|38.5257 + + + areas + + 碌曲县|34.5973,102.4934 + 玛曲县|34.0034,102.0788 + 夏河县|35.2081,102.5281 + 卓尼县|34.5949,103.5137 + 临潭县|34.6986,103.3601 + 迭部县|34.0619,103.2281 + 舟曲县|33.7909,104.3780 + 合作市|35.0059,102.9174 + + city + 甘南藏族|34.9889,102.9176 + + + areas + + 静宁县|35.5284,105.7388 + 庄浪县|35.2081,106.0432 + 崆峒区|35.5488,106.6811 + 华亭县|35.2236,106.6600 + 崇信县|35.3086,107.0417 + 灵台县|35.0715,107.6277 + 泾川县|35.3385,107.3742 + + city + 平凉|35.5492,106.6717 + + + areas + + city + 嘉峪关|39.7782,98.2965 + + + areas + + 秦安县|34.8649,105.6822 + 清水县|34.7554,106.1439 + 甘谷县|34.7380,105.3421 + 武山县|34.7276,104.8973 + 北道区|34.5657,105.8954 + 秦城区|34.5766,105.6980 + 张家川|34.9986,105.2753 + + city + 天水|34.5871,105.7312 + + + areas + + 景泰县|37.1874,104.0695 + 会宁县|35.6986,105.0599 + 白银区|36.5407,104.1788 + 靖远县|36.5710,104.36935 + 平川区|36.7334,104.8316 + + city + 白银|36.5508,104.1441 + + + areas + + 凉州区|37.9340,102.6485 + 民勤县|38.6305,103.1000 + 古浪县|37.4758,102.9042 + 天祝|36.9775,103.1483 + + city + 武威|37.9340,102.6445 + + + areas + + 肃南裕固族|37.9653,102.5601 + 民乐县|38.4368,100.8196 + 山丹县|38.7902,101.0952 + 高台县|39.3838,99.8258 + 临泽县|39.1584,100.1710 + 甘州区|38.9355,100.4845 + + city + 张掖|38.9321,100.4562 + + + areas + + 华池县|36.4675,107.9965 + 合水县|35.8254,108.0259 + 西峰区|35.7368,107.6575 + 宁县|35.5079,107.9348 + 正宁县|35.34980,108.3664 + 镇原县|35.6831,107.2071 + 庆城县|36.0215,107.8888 + 环县|36.5745,107.3148 + + city + 庆阳|35.7160,107.6493 + + + areas + + 安定区|35.5853,104.6174 + 陇西县|35.0102,104.6411 + 通渭县|35.2171,105.2485 + 临洮县|35.4007,103.8661 + 渭源县|35.1419,104.2216 + 漳县|34.8542,104.4782 + 岷县|34.4444,104.0433 + + city + 定西|35.5860,104.6266 + + + areas + + 积石山|35.7190,102.9033 + 东乡族|35.6694,103.3959 + 和政县|35.4313,103.3579 + 广河县|35.4872,103.5757 + 永靖县|35.9480,103.3222 + 康乐县|35.3758,103.7153 + 临夏县|35.4974,103.0021 + 临夏市|35.6102,103.2497 + + city + 临夏回族|35.5884,103.1923 + + + areas + + 敦煌市|40.1483,94.6683 + 阿克塞|39.6398,94.3466 + 玉门市|40.2976,97.0519 + 瓜州县|40.5263,95.7888 + 肃北|40.6765,96.5325 + 肃州区|39.7512,98.5144 + 金塔县|39.9920,98.9091 + + city + 酒泉|39.7386,98.5004 + + + areas + + 两当县|33.9152,106.3113 + 礼县|34.1947,105.1850 + 徽县|33.7751,106.0942 + 文县|32.9497,104.6899 + 宕昌县|34.0536,104.3999 + 康县|33.3356,105.6149 + 西和县|34.0165,105.3080 + 武都区|33.3976,104.9332 + 成县|33.7567,105.7486 + + city + 陇南|33.3944,104.9345 + + + state + 甘肃|36.0654,103.8328 + + + cities + + + areas + + 普兰|30.2990,81.1839 + 措勤|31.0221,85.1591 + 改则|32.3103,84.0696 + 革吉|32.4024,81.1575 + 日土|33.3934,79.7197 + 噶尔|32.5060,80.1024 + 札达|31.4848,79.8096 + + city + 阿里地|30.4066,81.1521 + + + areas + + 当雄|30.4780,91.1077 + 尼木|29.4376,90.1712 + 城关区|29.6583,91.1443 + 林周|29.9004,91.2685 + 达孜|29.6753,91.3563 + 墨竹工卡|29.8395,91.7372 + 曲水|29.3590,90.7501 + 堆龙德庆|29.6518,91.0099 + + city + 拉萨|29.6500,91.1210 + + + areas + + 曲松|29.0686,92.2087 + 措美|28.4441,91.4400 + 洛扎|28.3918,90.8664 + 加查|29.1460,92.6004 + 扎囊|29.2511,91.3437 + 贡嘎|29.2955,90.9906 + 桑日|29.2651,92.0222 + 琼结|29.0309,91.6902 + 浪卡子|28.9740,90.4046 + 隆子|28.4125,92.4683 + 错那|27.9968,91.9636 + 乃东|29.2131 + + city + 山南地|29.2312,91.7821 + + + areas + + 昂仁|29.9560,86.6291 + 拉孜|29.1799,87.8584 + 萨迦|28.8548,88.3475 + 定日|28.4777,86.9999 + 江孜|28.9106,89.6690 + 南木林|29.8148,89.3800 + 日喀则市|29.2681,88.9560 + 聂拉木|28.5998,86.0674 + 萨嘎|29.4021,85.0835 + 亚东|27.8150,89.0813 + 吉隆|28.8668,85.3063 + 定结|28.2375,87.9137 + 仲巴|30.4844,83.6625 + 白朗|28.8200,83.1044 + 谢通门|29.9149,88.0823 + 仁布|29.2242,89.9762 + 岗巴|28.3167,88.5718 + 康马|28.4433,89.6553 + + city + 日喀则地|29.2692,88.8839 + + + areas + + 尼玛|31.7907,87.2433 + 那曲|31.4760,92.0599 + 比如|31.4837,93.6878 + 嘉黎|30.6471,93.2387 + 安多|32.2712,91.6889 + 聂荣|32.1139,92.3097 + 索|32.6287,87.4561 + 申扎|30.9364,88.7163 + 巴青|31.9244,94.0599 + 班戈|31.3982,90.0162 + + city + 那曲地| + + + areas + + 芒康|29.6203,98.6207 + 边坝|30.8918,94.5998 + 左贡|29.5625,97.8082 + 八宿|30.0590,96.9244 + 昌都|31.4484,97.2440 + 江达|31.8137,98.0363 + 类乌齐|31.4405,96.4050 + 贡觉|30.7466,98.4961 + 察雅|30.5890,97.8438 + 丁青|31.6816,95.3118 + 洛隆|30.7351,95.9169 + + city + 昌都地|29.7456,98.9243 + + + areas + + 墨脱|29.3309,95.3396 + 米林|29.2222,94.2195 + 工布江达|29.8915,93.2525 + 林芝|29.6424,94.9677 + 波密|29.8652,95.7740 + 察隅|28.6675,97.4733 + 朗|29.6319,93.1550 + + city + 林芝地|29.6629,94.3671 + + + state + 西藏|29.6531,91.1240 + + + cities + + + areas + + 临河区|40.7726,107.3932 + 五原县|41.0948,108.2737 + 磴口县|40.3365,107.0151 + 乌拉特前旗|40.7423,108.6588 + 乌拉特中旗|41.5732,108.5330 + 乌拉特后旗|41.0900,107.0813 + 杭锦后旗|40.8922,107.1575 + + city + 巴彦淖尔|40.7494,107.3941 + + + areas + + 多伦县|42.2089,116.4922 + 二连浩特市|43.6493,111.9587 + 苏尼特左旗|43.8652,113.6738 + 苏尼特右旗|42.7530,112.6639 + 锡林浩特市|43.9391,116.0926 + 阿巴嘎旗|44.0290,114.9567 + 东乌珠穆沁旗|45.5156,116.9786 + 西乌珠穆沁旗|44.5938,117.6156 + 正蓝旗|42.2473,115.9989 + 正镶白旗|42.2929,115.0373 + 镶黄旗|42.2382,113.8540 + 太仆寺旗|41.8831,115.2895 + + city + 锡林郭勒盟|43.9395,116.0541 + + + areas + + 科尔沁右翼前旗|46.3340,121.2215 + 阿尔山市|47.1827,119.9504 + 乌兰浩特市|46.0784,122.0997 + 突泉县|45.3887,121.6006 + 科尔沁右翼中旗|45.0664,121.4834 + 扎赉特旗|46.7289,122.9062 + + city + 兴安盟|46.0884,122.0445 + + + areas + + 化德县|41.9110,114.0173 + 商都县|41.5677,113.5838 + 四子王旗|41.5394,111.7129 + 察哈尔右翼后旗|41.4418,113.1987 + 丰镇市|40.4414,113.1171 + 凉城县|40.5373,112.5104 + 兴和县|40.8776,113.8405 + 集宁区|40.9964,113.1305 + 卓资县|40.9003,112.5842 + 察哈尔右翼中旗|41.2832,112.6420 + 察哈尔右翼前旗|41.0298,113.3269 + + city + 乌兰察布|40.9999,113.1402 + + + areas + + 达拉特旗|40.4064,110.0393 + 东胜区|39.8270,109.9679 + 乌审旗|38.6100,108.8241 + 伊金霍洛旗|39.5701,109.7547 + 鄂托克旗|39.0960,107.9840 + 杭锦旗|39.8397,108.7413 + 准格尔旗|39.8706,111.2462 + 鄂托克前旗|38.1881,107.4840 + + city + 鄂尔多斯|39.6146,109.7873 + + + areas + + 乌达区|39.5115,106.7326 + 海南区|39.4469,106.8980 + 海勃湾区|39.6979,106.8290 + + city + 乌海|39.6601,106.8018 + + + areas + + 达尔罕茂明安联合旗|41.7044,110.4391 + 昆都仑区|40.6476,109.8451 + 东河区|40.5827,110.0495 + 九原区|40.6158,109.9737 + 白云矿区|40.9205,109.9529 + 固阳县|41.0402,110.0671 + 石拐区|40.6783,110.2786 + 青山区|40.6517,109.9088 + 土默特右旗|40.5751,110.5306 + + city + 包头|40.6636,109.8467 + + + areas + + 清水河县|39.91478,111.6929 + 和林格尔县|40.3847,111.8272 + 托克托县|40.2831,111.2007 + 土默特左旗|40.7353,111.1701 + 赛罕区|40.7981,111.7081 + 武川县|41.1025,111.4576 + 新城区|40.8641,111.6700 + 回民区|40.8138,111.6294 + 玉泉区|40.7589,111.6820 + + city + 呼和浩特|40.8474,111.7585 + + + areas + + 根河市|50.7862,121.5269 + 新巴尔虎右旗|48.6775,116.8301 + 新巴尔虎左旗|48.2238,118.2765 + 陈巴尔虎旗|49.3344,119.4307 + 鄂温克族自治旗|49.1531,119.7617 + 额尔古纳市|50.2487,120.1862 + 扎兰屯市|48.0197,122.7440 + 牙克石市|49.2919,120.7180 + 满洲里市|49.6027,117.3847 + 莫力达瓦达斡尔族|49.1048,124.4744 + 鄂伦春自治旗|50.5979,123.7321 + 海拉尔区|49.2194,119.7421 + 阿荣旗|48.1319,123.4658 + + city + 呼伦贝尔|49.2179,119.7722 + + + areas + + 科尔沁左翼中旗|44.0575,122.4991 + 科尔沁区|43.6285,122.2626 + 开鲁县|43.6064,121.3252 + 科尔沁左翼后旗|43.1960,122.6973 + 奈曼旗|42.8729,120.6644 + 库伦旗|42.7413,121.8171 + 霍林郭勒市|45.5375,119.6700 + 扎鲁特旗|44.5620,120.9182 + + city + 通辽|43.6583,122.2512 + + + areas + + 额济纳旗|41.9606,101.0619 + 阿拉善右旗|39.2213,101.6735 + 阿拉善左旗|38.8391,105.6728 + + city + 阿拉善盟|38.8578,105.7353 + + + areas + + 林西县|43.6231,118.0622 + 克什克腾旗|43.2718,117.5508 + 翁牛特旗|42.9407,119.0131 + 喀喇沁旗|41.9333,118.7091 + 松山区|42.2935,118.9394 + 阿鲁科尔沁旗|43.8780,120.0721 + 巴林左旗|43.9771,119.3860 + 巴林右旗|43.5401,118.6710 + 宁城县|41.5999,119.3496 + 敖汉旗|42.2965,119.9282 + 元宝山区|42.0452,119.2950 + 红山区|42.2716,118.9658 + + city + 赤峰|42.2645,118.8954 + + + state + 内蒙古|40.8230,111.7718 + + + cities + + + areas + + 新源|41.0925,111.4686 + 昭苏|43.1634,81.1373 + 霍城|44.0622,80.8853 + 巩留|43.4885,82.2382 + 伊宁|43.9829,81.5339 + 察布查尔|43.8467,81.1577 + 伊宁市|43.9154,81.2837 + 奎屯市|44.4326,84.9083 + 尼勒克|43.8048,82.5185 + 特克斯|43.2242,81.8424 + + city + 伊犁|43.9228,81.3306 + + + areas + + 独山子区|44.3345,84.8933 + 白碱滩区|45.6930,85.1386 + 克拉玛依区|45.6084,84.8743 + 乌尔禾区|46.0952,85.7001 + + city + 克拉玛依|45.6084,84.8743 + + + areas + + 巴里坤|43.6063,93.0165 + 哈密市|42.8329,93.5211 + 伊吾|43.2606,94.7038 + + city + 哈密地|42.8422,93.5181 + + + areas + + city + 石河子|44.3124,86.0855 + + + areas + + 托克逊|42.7978,88.6603 + 鄯善|42.8749,90.2199 + 吐鲁番市|42.9484,89.1924 + + city + 吐鲁番地|42.9723,90.6822 + + + areas + + city + 阿拉尔|40.6156,81.2917 + + + areas + + 阿勒泰市|47.8327,88.1390 + 布尔津|47.7060,86.8695 + 福海|47.1182,87.4931 + 哈巴河|48.0668,86.34256 + 青河|46.6852,90.3819 + 吉木乃|47.4489,85.8820 + 富蕴|46.9998,89.5318 + + city + 阿勒泰地|47.0943,87.3320 + + + areas + + 乌鲁木齐|43.8328,87.6233 + 天山区|43.8014,87.6400 + 沙依巴克区|43.8072,87.6044 + 新市区|43.8497,87.58074 + 水磨沟区|43.8382,87.6490 + 头屯河区|43.8828,87.4347 + 达坂城区|43.3700,88.3174 + 东山区|47.3451,130.3239 + + city + 乌鲁木齐|43.8328,87.6233 + + + areas + + 和布克赛尔|43.8257,87.6043 + 乌苏市|44.4414,84.6851 + 塔城市|46.7572,82.9936 + 沙湾|44.3320,85.6262 + 额敏|46.5307,83.6345 + 裕民|46.2075,82.9885 + 托里|45.9427,83.6127 + + city + 塔城地|46.7510,82.9870 + + + areas + + 昌吉市|44.0203,87.2739 + 呼图壁|44.1977,86.9053 + 玛纳斯|44.3098,86.2208 + 阜康市|44.1630,87.9938 + 米泉市|43.9912,87.2528 + 木垒|43.8352,90.2879 + 奇台|44.0277,89.6005 + 吉木萨尔|44.0067,89.1871 + + city + 昌吉|44.0203,87.2739 + + + areas + + 阿合奇|40.9430,78.4527 + 阿克陶|39.1540,75.9538 + 阿图什市|39.7220,76.1748 + 乌恰|39.7252,75.2648 + + city + 克孜勒|39.6142,75.9426 + + + areas + + city + 图木舒克|39.8892,79.1981 + + + areas + + 乌什|41.2207,79.2310 + 拜城|41.8028,81.8800 + 柯坪|40.5142,79.0533 + 阿瓦提|40.6505,80.3795 + 库车|41.7232,82.9686 + 温宿|41.2829,80.2457 + 新和|41.5541,82.6157 + 沙雅|41.2277,82.7885 + 阿克苏市|41.1737,80.2698 + + city + 阿克苏地|41.1460,80.2465 + + + areas + + city + 五家渠|44.3688,87.5654 + + + areas + + 博湖|41.9863,86.6389 + 尉犁|41.3500,86.2671 + 若羌|39.0297,88.1738 + 库尔勒市|41.7326,86.1800 + 轮台|41.7838,84.2583 + 和静|42.3288,86.3894 + 和硕|42.2743,86.8704 + 且末|38.1513,85.5362 + 焉耆|42.0677,86.5776 + + city + 巴音郭楞|41.7702,86.1515 + + + areas + + 于田|36.8631,81.6837 + 民丰|37.0703,82.7023 + 策勒|37.0042,80.8166 + 洛浦|37.0797,80.1953 + 皮山|37.6272,78.2895 + 墨玉|37.2832,79.7357 + 和田|36.5785,79.9078 + 和田市|37.1180,79.9196 + + city + 和田地| + + + areas + + 精河|44.6065,82.9006 + 温泉|44.8050,80.8636 + 博乐市|44.8598,82.0575 + + city + 博尔塔拉|44.9121,82.0730 + + + areas + + 伽师|39.4939,76.7303 + 岳普湖|39.2393,76.7844 + 叶城|37.8891,77.4200 + 麦盖提|38.9111,77.6591 + 疏勒|39.4073,76.0544 + 英吉沙|38.9356,76.1820 + 泽普|38.1979,77.2773 + 莎车|38.4202,77.2528 + 塔什库尔干|37.7830,75.2360 + 巴楚|39.7909,78.5556 + 喀什市|39.4736,76.0003 + 疏附|39.3812,75.8694 + + city + 喀什地|39.4791,75.9966 + + + state + 新疆|43.7994,87.6335 + + + cities + + + areas + + city + 新竹|24.8029,121.0027 + + + areas + + city + 基隆|25.1080,121.7443 + + + areas + + city + 高雄|22.6327,120.3289 + + + areas + + city + 台北|30.5964,114.2941 + + + areas + + city + 台南|38.9658,121.3605 + + + areas + + city + 嘉义|23.4595,120.3151 + + + areas + + city + 台中|26.0929,119.3370 + + + areas + + city + 宜兰|26.0836,119.3192 + + + areas + + city + 屏东|26.1070,119.3084 + + + areas + + city + 桃园|26.0767,119.3372 + + + areas + + city + 台东|26.0942,119.3325 + + + areas + + city + 苗栗|30.6068,114.3026 + + + areas + + city + 金门|30.6058,114.2987 + + + areas + + city + 花莲|30.6059,114.2892 + + + areas + + city + 云林|30.6038,114.2821 + + + areas + + city + 连江|26.2037,119.5460 + + + areas + + city + 澎湖|26.0381,119.2684 + + + areas + + city + 南投|23.9001,120.7049 + + + areas + + city + 彰化|24.0723,120.5692 + + + state + 台湾| + + + cities + + + areas + + city + 油尖旺|22.3091,114.1768 + + + areas + + city + 黄大仙|22.3419,114.2076 + + + areas + + city + 深水埗|22.3349,114.1721 + + + areas + + city + 观塘|22.3168,114.2370 + + + areas + + city + 九龙城|22.3291,114.1969 + + + areas + + city + 湾仔|22.2803,114.1842 + + + areas + + city + 葵青|22.3394,114.1209 + + + areas + + city + 离岛|22.2247,114.0307 + + + areas + + city + 中西|22.2854,114.1487 + + + areas + + city + 荃湾|22.3782,114.1268 + + + areas + + city + 元朗|22.4491,114.0462 + + + areas + + city + 沙田|22.3860,114.2008 + + + areas + + city + 西贡|22.3828,114.2838 + + + areas + + city + 屯门|22.3936,113.9877 + + + areas + + city + 大埔|22.4817,114.3162 + + + state + 香港|22.2810,114.1719 + + + cities + + + areas + + city + 花地玛堂|22.2130,114.0415 + + + areas + + city + 圣安多尼堂|22.2882,114.1486 + + + areas + + city + 大堂|22.3408,114.1611 + + + areas + + city + 望德堂|22.2021,113.5601 + + + areas + + city + 风顺堂|22.1928,113.5461 + + + areas + + city + 嘉模堂|22.1610,113.5670 + + + areas + + city + 圣方济各堂|22.2070,113.5598 + + + state + 澳门|22.1929,113.5494 + + + diff --git a/Pods/BAPickView/BAPickView/BAPickView/BAPickView_Config.h b/Pods/BAPickView/BAPickView/BAPickView/BAPickView_Config.h new file mode 100644 index 0000000..8ad66be --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/BAPickView_Config.h @@ -0,0 +1,165 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#ifndef BAPickView_Config_h +#define BAPickView_Config_h + +CG_INLINE UIColor * +BAKit_Color_RGBA(u_char r,u_char g, u_char b, u_char a) { + return [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]; +} + +#define BAKit_Color_Translucent [UIColor colorWithRed:0.3f green:0.3f blue:0.3f alpha:0.5f] +#define BAKit_Color_White [UIColor whiteColor] +#define BAKit_Color_Clear [UIColor clearColor] +#define BAKit_Color_Black [UIColor blackColor] +#define BAKit_Color_gray11 BAKit_Color_RGBA(248, 248, 248, 1.0) + + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +#define BAKit_BaseScreenWidth 320.0f +#define BAKit_BaseScreenHeight 568.0f + + +/*! 屏幕适配(5S标准屏幕:320 * 568) */ +// iPhone 7 屏幕:375 * 667 +//376/320 = +//667/568 = +#define BAKit_ScaleXAndWidth BAKit_SCREEN_WIDTH/BAKit_BaseScreenWidth +#define BAKit_ScaleYAndHeight BAKit_SCREEN_HEIGHT/BAKit_BaseScreenHeight + +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) + +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) + +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) + +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA),class_getInstanceMethod([self class], methodB)); + + +/*! 获取sharedApplication */ +#define BAKit_SharedApplication [UIApplication sharedApplication] + +#pragma mark - weak / strong +#define BAKit_WeakSelf @BAKit_Weakify(self); +#define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; +#endif +#endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; +#endif +#endif +#endif + + +#endif /* BAPickView_Config_h */ diff --git a/Pods/BAPickView/BAPickView/BAPickView/BAPickView_OC.h b/Pods/BAPickView/BAPickView/BAPickView/BAPickView_OC.h new file mode 100644 index 0000000..b30fc52 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/BAPickView_OC.h @@ -0,0 +1,112 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#ifndef BAPickView_OC_h +#define BAPickView_OC_h + +#import "BAKit_PickerView.h" +#import "BAPickView_Config.h" +#import "NSDate+BAKit.h" +#import "UIView+BARectCorner.h" +#import "NSDateFormatter+BAKit.h" +#import "UIView+BAAnimation.h" + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BAPickView + + 最新更新时间:2017-06-03 【倒叙】
+ 最新Version:【Version:1.0.3】
+ 更新内容:
+ 1.0.3.1、可以自由设置 pickView 居中或者在底部显示,还可以自由定制 toolbar 居中或者在底部显示
+ 1.0.3.2、可以自由设置 pickView 字体、字体颜色等内容,注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改
+ + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.2】
+ 更新内容:
+ 1.0.2.1、新增进出场动画,缩放、上下左右展示、消失动画
+ 1.0.2.2、修复 isTouchEdgeHide 失效的 bug
+ + 最新更新时间:2017-05-22 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增年周选择器,如:2017年,第21周
+ + 最新更新时间:2017-05-16 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、城市选择器,三级联动,可返回省市县和精确的经纬度
+ 1.0.0.2、可以自定义 array 显示,性别选择等【目前只支持单行数据】
+ 1.0.0.3、日期选择器:年月日,可以完全自定义 NSDateFormatter
+ 1.0.0.4、日期选择器:年月,可以完全自定义 NSDateFormatter
+ 1.0.0.5、横竖屏适配完美
+ 1.0.0.6、可以自定义按钮颜色、背景颜色等
+ 1.0.0.7、理论完全兼容现有所有 iOS 系统版本
+ +*/ + +#endif /* BAPickView_OC_h */ diff --git a/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.h b/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.h new file mode 100755 index 0000000..2524921 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.h @@ -0,0 +1,276 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + + +#define BAKit_Current_Calendar [NSCalendar currentCalendar] +#define BAKit_Current_Date [NSDate date] + +@interface NSDate (BAKit) + +@property (nonatomic, readonly) NSInteger year; +@property (nonatomic, readonly) NSInteger month; +@property (nonatomic, readonly) NSInteger day; +@property (nonatomic, readonly) NSInteger nearestHour; +@property (nonatomic, readonly) NSInteger hour; +@property (nonatomic, readonly) NSInteger minute; +@property (nonatomic, readonly) NSInteger second; +@property (nonatomic, readonly) NSInteger nanosecond; +@property (nonatomic, readonly) NSInteger weekday; +//PRC 中国 +@property (nonatomic, readonly) NSInteger weekdayPRC; +@property (nonatomic, readonly) NSInteger weekdayOrdinal; +@property (nonatomic, readonly) NSInteger weekOfMonth; +@property (nonatomic, readonly) NSInteger weekOfYear; +@property (nonatomic, readonly) NSInteger yearForWeekOfYear; +@property (nonatomic, readonly) NSInteger quarter; + +/** + 确定每个月是否为闰月 + */ +@property (nonatomic, readonly) BOOL isLeapMonth; + +/** + 确定每个月是否为闰年 + */ +@property (nonatomic, readonly) BOOL isLeapYear; + +/** + 是否是今天 + */ +@property (nonatomic, readonly) BOOL isToday; + +/** + 是否是昨天 + */ +@property (nonatomic, readonly) BOOL isYesterday; +@property (nonatomic, readonly) BOOL isTomorrow; +@property (nonatomic, readonly) BOOL isThisWeek; +@property (nonatomic, readonly) BOOL isNextWeek; +@property (nonatomic, readonly) BOOL isLastWeek; +@property (nonatomic, readonly) BOOL isThisMonth; +@property (nonatomic, readonly) BOOL isThisYear; +@property (nonatomic, readonly) BOOL isNextYear; +@property (nonatomic, readonly) BOOL isLastYear; +@property (nonatomic, readonly) BOOL isInFuture; +@property (nonatomic, readonly) BOOL isInPast; + +@property (nonatomic, readonly) BOOL isTypicallyWorkday; +@property (nonatomic, readonly) BOOL isTypicallyWeekend; + + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSDate,自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ +- (NSString *)ba_dateFormattedWithDate; + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSString 类型的 date,如:@"2017-04-25 11:18:01",自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ ++ (NSString *)ba_dateCreated_at:(NSString *)date; + +/*! + * 获得一个比当前时间大n年的时间,格式为 yyyy-MM-dd + */ ++ (NSString *)ba_dateAfterYears:(NSInteger)count; + +/*! + * 返回一个只有年月日的时间 + */ +- (NSDate *)ba_dateWithYMD; + +- (NSDate *)ba_dateWithYM; + +/*! + * 获得与当前时间的差距 + */ +- (NSDateComponents *)ba_dateDeltaWithNow; + +/** + 距离当前的时间间隔描述 + + @return 时间间隔描述 + */ +- (NSString *)ba_dateTimeIntervalDescription; + +/** + 精确到分钟的日期描述 + + @return 日期描述 + */ +- (NSString *)ba_dateMinuteDescription; + +/** + 标准时间日期描述 + + @return 标准时间日期描述 + */ +- (NSString *)ba_dateFormattedTime; + +/** + 当前日期 距离 1970 时间间隔毫秒 + + @return 当前日期 距离 1970 时间间隔毫秒 + */ +- (double)ba_dateTimeIntervalSince1970InMilliSecond; + +/** + 距离 时间间隔毫秒 后的日期 + + @param timeIntervalInMilliSecond 时间间隔毫秒 + @return 距离 时间间隔毫秒 后的日期 + */ ++ (NSDate *)ba_dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond; + +/** + 时间间隔格式化 + + @param time 时间间隔 + @return 时间格式化 + */ ++ (NSString *)ba_dateFormattedTimeFromTimeInterval:(long long)time; + +#pragma mark UTC +//UTC世界统一时间 +- (NSNumber *)ba_dateGetUtcTimeIntervalSince1970; +- (NSNumber *)ba_dateGetUtcTimeIntervalIntSince1970; +- (NSString *)ba_dateTimeIntervalStringSince1970; + +#pragma mark - 距离当前日期最近的日期 ++ (NSDate *)ba_dateTomorrow; ++ (NSDate *)ba_dateYesterday; ++ (NSDate *)ba_dateWithDaysFromNow:(NSInteger)days; ++ (NSDate *)ba_dateWithDaysBeforeNow:(NSInteger)days; ++ (NSDate *)ba_dateWithHoursFromNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithHoursBeforeNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithMinutesFromNow:(NSInteger)dMinutes; ++ (NSDate *)ba_dateWithMinutesBeforeNow:(NSInteger)dMinutes; + +#pragma mark - 比较日期 +- (BOOL)ba_dateIsEqualToDateIgnoringTime:(NSDate *)aDate; +- (BOOL)ba_dateIsSameWeekAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameMonthAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameYearAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsEarlierThanDate:(NSDate *)aDate; +- (BOOL)ba_dateIsLaterThanDate:(NSDate *)aDate; + +#pragma mark - 调整日期 +- (NSDate *)ba_dateByAddingDays:(NSInteger)dDays; +- (NSDate *)ba_dateBySubtractingDays:(NSInteger)dDays; +- (NSDate *)ba_dateByAddingHours:(NSInteger)dHours; +- (NSDate *)ba_dateBySubtractingHours:(NSInteger)dHours; +- (NSDate *)ba_dateByAddingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateBySubtractingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateAtStartOfDay; +- (NSDateComponents *)ba_dateComponentsWithOffsetFromDate:(NSDate *)aDate; + +#pragma mark - 时间间隔 +- (NSInteger)ba_dateMinutesAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateMinutesBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDistanceInDaysToDate:(NSDate *)anotherDate; +/** + 多少天之后 + */ +- (NSDate *)ba_dateGetAfterYear:(int)year OrMonth:(int)month OrDay:(int)day; + +#pragma mark - 一年有多少周 ++ (NSString *)ba_dateGetWeekInyearOrMouth:(BOOL)inYear WithDate:(NSDate *)date; +// 2015、2009、004、1998 这四年是 53 周(目前已知),其余均是52周 ++ (NSInteger)ba_dateGetWeekNumbersOfYear:(NSInteger)year; + +@end + +/** + * 中国农历 + */ + +@interface NSDate (LunarCalendar) + +/** + * 例如 : 2016丙申年四月初一 + */ + +- (NSInteger)lunarShortYear; // 农历年份,数字表示 2016 + +- (NSString *)lunarLongYear; // 农历年份,干支表示 丙申年 + +- (NSInteger)lunarShortMonth; // 农历月份,数字表示 4 + +- (NSString *)lunarLongMonth; // 农历月份,汉字表示 四月 + +- (NSInteger)lunarShortDay; // 农历日期,数字表示 1 + +- (NSString *)lunarLongDay; // 农历日期,汉字表示 初一 + +- (NSString *)lunarSolarTerms;// 农历节气 (立春 雨水 惊蛰 春分...) + +/** 传入阳历的年月日返回当天的农历节气 */ ++ (NSString *)getLunarSolarTermsWithYear:(int)iYear Month:(int)iMonth Day:(int)iDay; + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.m b/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.m new file mode 100755 index 0000000..c40299e --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/NSDate+BAKit.m @@ -0,0 +1,1059 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import "NSDate+BAKit.h" +#import "NSDateFormatter+BAKit.h" + +#define k_MINUTE 60 +#define k_HOUR 3600 +#define k_DAY 86400 +#define k_WEEK 604800 +#define k_YEAR 31556926 + +#define BAKi_DATE_COMPONENTS (NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal) + +@implementation NSDate (BAKit) + +- (NSInteger)year +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:self] year]; +} + +- (NSInteger)month +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitMonth fromDate:self] month]; +} + +- (NSInteger)day +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:self] day]; +} + +- (NSInteger)nearestHour +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + k_MINUTE * 30; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + NSDateComponents *components = [BAKit_Current_Calendar components:NSCalendarUnitHour fromDate:newDate]; + return components.hour; +} + +- (NSInteger)hour +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitHour fromDate:self] hour]; +} + +- (NSInteger)minute +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitMinute fromDate:self] minute]; +} + +- (NSInteger)second +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitSecond fromDate:self] second]; +} + +- (NSInteger)nanosecond +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitSecond fromDate:self] nanosecond]; +} + +- (NSInteger)weekday +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekday fromDate:self] weekday]; +} + +- (NSInteger)weekdayPRC +{ + return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierRepublicOfChina] + components:NSCalendarUnitWeekday fromDate:self] + weekday]; +} + +- (NSInteger)weekdayOrdinal +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekdayOrdinal fromDate:self] weekdayOrdinal]; +} + +- (NSInteger)weekOfMonth +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekOfMonth fromDate:self] weekOfMonth]; +} + +- (NSInteger)weekOfYear +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitWeekOfYear fromDate:self] weekOfYear]; +} + +- (NSInteger)yearForWeekOfYear +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitYearForWeekOfYear fromDate:self] yearForWeekOfYear]; +} + +- (NSInteger)quarter +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitQuarter fromDate:self] quarter]; +} + +- (BOOL)isLeapMonth +{ + return [[[NSCalendar currentCalendar] components:NSCalendarUnitQuarter fromDate:self] isLeapMonth]; +} + +- (BOOL)isLeapYear +{ + NSUInteger year = self.year; + return ((year % 400 == 0) || ((year % 100 != 0) && (year % 4 == 0))); +} + +- (BOOL)isToday +{ + if (fabs(self.timeIntervalSinceNow) >= 60 * 60 * 24) return NO; + return [NSDate new].day == self.day; +} + +- (BOOL)isYesterday +{ + NSDate *added = [self dateByAddingDays:1]; + return [added isToday]; +} + +- (BOOL)isTomorrow +{ + return [self ba_dateIsEqualToDateIgnoringTime:BAKit_Current_Date]; +} + +- (BOOL)isThisWeek +{ + return [self ba_dateIsSameWeekAsDate:BAKit_Current_Date]; +} + +- (BOOL)isNextWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + k_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self ba_dateIsSameWeekAsDate:newDate]; +} + +- (BOOL)isLastWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - k_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self ba_dateIsSameWeekAsDate:newDate]; +} + +- (BOOL)isThisMonth +{ + return [self ba_dateIsSameMonthAsDate:BAKit_Current_Date]; +} + +- (BOOL)isThisYear +{ + return [self ba_dateIsSameYearAsDate:BAKit_Current_Date]; +} + +- (BOOL)isNextYear +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year + 1)); +} + +- (BOOL)isLastYear +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year - 1)); +} + +- (BOOL)isInFuture +{ + return [self ba_dateIsLaterThanDate:BAKit_Current_Date]; +} + +- (BOOL)isInPast +{ + return [self ba_dateIsEarlierThanDate:BAKit_Current_Date]; +} + +- (BOOL)isTypicallyWorkday +{ + NSDateComponents *components = [BAKit_Current_Calendar components:NSCalendarUnitWeekday fromDate:self]; + if ((components.weekday == 1) || + (components.weekday == 7)) + { + return YES; + } + return NO; +} + +- (BOOL)isTypicallyWeekend +{ + return !self.isTypicallyWorkday; +} + +#pragma mark - 格式化日期描述 +- (NSString *)ba_dateFormattedWithDate +{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + + [dateFormatter setDateFormat:@"yyyy-MM-dd"]; + NSString *theDay = [dateFormatter stringFromDate:self];//日期的年月日 + NSString *currentDay = [dateFormatter stringFromDate:BAKit_Current_Date];//当前年月日 + + // NSLog(@"当前时间3: %@", self); + + NSInteger timeInterval = -[self timeIntervalSinceNow]; + + // NSLog(@"当前时间4: %ld", (long)timeInterval); + + if (timeInterval < 60) + { + return @"刚刚"; + } + else if + (timeInterval < 3600) + { + // 1小时内 + return [NSString stringWithFormat:@"%zd分钟前", timeInterval / 60]; + } + else if (timeInterval < 21600) + { + // 6小时内 + return [NSString stringWithFormat:@"%zd小时内", timeInterval / 3600]; + } + else if ([theDay isEqualToString:currentDay]) + { + // 当天 + [dateFormatter setDateFormat:@"HH:mm"]; + return [NSString stringWithFormat:@"%@", [dateFormatter stringFromDate:self]]; + } + else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) + { + // 昨天 + [dateFormatter setDateFormat:@"HH:mm"]; + return [NSString stringWithFormat:@"昨天 %@", [dateFormatter stringFromDate:self]]; + } + else + { + // 以前 + [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; + return [dateFormatter stringFromDate:self]; + } +} + ++ (NSString *)ba_dateCreated_at:(NSString *)date +{ + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + + formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; + + if (date.length == 16 ) + { + formatter.dateFormat = @"yyyy-MM-dd HH:mm"; + } + + formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; + // 获得发布的具体时间 + NSDate *createDate = [formatter dateFromString:date]; + + // 判断是否为今年 + if (createDate) + { + if (createDate.isThisYear) + { + // 今天 + NSDateComponents *cmps = [createDate ba_dateDeltaWithNow]; + if (cmps.hour >= 1) + { + // 至少是1小时前发的 + return [NSString stringWithFormat:@"%ld小时前", cmps.hour]; + } + else if (cmps.minute >= 1) + { + // 1~59分钟之前发的 + return [NSString stringWithFormat:@"%ld分钟前", cmps.minute]; + } + else + { + // 1分钟内发的 + return @"刚刚"; + } + } + else if (createDate.isYesterday) + { + // 昨天 + formatter.dateFormat = @"昨天 HH:mm"; + return [formatter stringFromDate:createDate]; + } + else + { + // 至少是前天 + formatter.dateFormat = @"MM-dd HH:mm"; + return [formatter stringFromDate:createDate]; + } + } + else + { + // 非今年 + formatter.dateFormat = @"yyyy-MM-dd"; + return [formatter stringFromDate:createDate]; + } +} + ++ (NSString *)ba_dateAfterYears:(NSInteger)count +{ + NSDate *date = BAKit_Current_Date; + NSTimeInterval time = count * 365 * 24 * 60 * 60; + date = [date dateByAddingTimeInterval:time]; + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.locale = [NSLocale localeWithLocaleIdentifier:@"China"]; + formatter.dateFormat = @"yyyy-MM-dd"; + NSString *selfStr = [formatter stringFromDate:date]; + return selfStr; +} + +- (NSDate *)ba_dateWithYMD +{ + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM-dd"; + NSString *selfStr = [formatter stringFromDate:self]; + return [formatter dateFromString:selfStr]; +} + +- (NSDate *)ba_dateWithYM +{ + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM"; + NSString *selfStr = [formatter stringFromDate:self]; + return [formatter dateFromString:selfStr]; +} + +- (NSDateComponents *)ba_dateDeltaWithNow +{ + NSCalendar *calendar = [NSCalendar currentCalendar]; + int unit = NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute; + return [calendar components:unit fromDate:self toDate:BAKit_Current_Date options:0]; +} + +/** + 距离当前的时间间隔描述 + + @return 时间间隔描述 + */ +- (NSString *)ba_dateTimeIntervalDescription +{ + NSTimeInterval timeInterval = -[self timeIntervalSinceNow]; + if (timeInterval < 60) { + return NSLocalizedString(@"NSDateCategory.text1", @""); + } else if (timeInterval < 3600) { + return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text2", @""), timeInterval / 60]; + } else if (timeInterval < 86400) { + return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text3", @""), timeInterval / 3600]; + } else if (timeInterval < 2592000) {//30天内 + return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text4", @""), timeInterval / 86400]; + } else if (timeInterval < 31536000) {//30天至1年内 + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text5", @"")]; + return [dateFormatter stringFromDate:self]; + } else { + return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text6", @""), timeInterval / 31536000]; + } +} + +/** + 精确到分钟的日期描述 + + @return 日期描述 + */ +- (NSString *)ba_dateMinuteDescription +{ + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:@"yyyy-MM-dd"]; + + NSString *theDay = [dateFormatter stringFromDate:self];//日期的年月日 + NSString *currentDay = [dateFormatter stringFromDate:BAKit_Current_Date];//当前年月日 + if ([theDay isEqualToString:currentDay]) {//当天 + [dateFormatter setDateFormat:@"ah:mm"]; + return [dateFormatter stringFromDate:self]; + } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) {//昨天 + [dateFormatter setDateFormat:@"ah:mm"]; + return [NSString stringWithFormat:NSLocalizedString(@"NSDateCategory.text7", @'"'), [dateFormatter stringFromDate:self]]; + } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] < 86400 * 7) {//间隔一周内 + [dateFormatter setDateFormat:@"EEEE ah:mm"]; + return [dateFormatter stringFromDate:self]; + } else {//以前 + [dateFormatter setDateFormat:@"yyyy-MM-dd ah:mm"]; + return [dateFormatter stringFromDate:self]; + } +} + +/** + 标准时间日期描述 + + @return 标准时间日期描述 + */ +- (NSString *)ba_dateFormattedTime +{ + NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; + [formatter setDateFormat:@"YYYY-MM-dd"]; + NSString * dateNow = [formatter stringFromDate:BAKit_Current_Date]; + NSDateComponents *components = [[NSDateComponents alloc] init]; + [components setDay:[[dateNow substringWithRange:NSMakeRange(8,2)] intValue]]; + [components setMonth:[[dateNow substringWithRange:NSMakeRange(5,2)] intValue]]; + [components setYear:[[dateNow substringWithRange:NSMakeRange(0,4)] intValue]]; + NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDate *date = [gregorian dateFromComponents:components]; //今天 0点时间 + + NSInteger hour = [self ba_dateHoursAfterDate:date]; + NSDateFormatter *dateFormatter = nil; + NSString *ret = @""; + + //hasAMPM==TURE为12小时制,否则为24小时制 + NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; + NSRange containsA = [formatStringForHours rangeOfString:@"a"]; + BOOL hasAMPM = containsA.location != NSNotFound; + + if (!hasAMPM) { //24小时制 + if (hour <= 24 && hour >= 0) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:@"HH:mm"]; + }else if (hour < 0 && hour >= -24) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text8", @"")]; + }else { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:@"yyyy-MM-dd HH:mm"]; + } + }else { + if (hour >= 0 && hour <= 6) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text9", @"")]; + }else if (hour > 6 && hour <=11 ) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text10", @"")]; + }else if (hour > 11 && hour <= 17) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text11", @"")]; + }else if (hour > 17 && hour <= 24) { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text12", @"")]; + }else if (hour < 0 && hour >= -24){ + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:NSLocalizedString(@"NSDateCategory.text13", @"")]; + }else { + dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:@"yyyy-MM-dd HH:mm"]; + } + } + + ret = [dateFormatter stringFromDate:self]; + return ret; +} + +/** + 当前日期 距离 1970 时间间隔毫秒 + + @return 当前日期 距离 1970 时间间隔毫秒 + */ +- (double)ba_dateTimeIntervalSince1970InMilliSecond +{ + double ret; + ret = [self timeIntervalSince1970] * 1000; + + return ret; +} + +/** + 距离 时间间隔毫秒 后的日期 + + @param timeIntervalInMilliSecond 时间间隔毫秒 + @return 距离 时间间隔毫秒 后的日期 + */ ++ (NSDate *)ba_dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond +{ + NSDate *ret = nil; + double timeInterval = timeIntervalInMilliSecond; + // judge if the argument is in secconds(for former data structure). + if(timeIntervalInMilliSecond > 140000000000) + { + timeInterval = timeIntervalInMilliSecond / 1000; + } + ret = [NSDate dateWithTimeIntervalSince1970:timeInterval]; + + return ret; +} + +/** + 时间间隔格式化 + + @param time 时间间隔 + @return 时间格式化 + */ ++ (NSString *)ba_dateFormattedTimeFromTimeInterval:(long long)time +{ + return [[NSDate ba_dateWithTimeIntervalInMilliSecondSince1970:time] ba_dateFormattedTime]; +} + +#pragma mark UTC +//UTC世界统一时间 +- (NSNumber *)ba_dateGetUtcTimeIntervalSince1970 { + return [NSNumber numberWithDouble:[self timeIntervalSince1970]]; +} + +- (NSNumber *)ba_dateGetUtcTimeIntervalIntSince1970 { + return [NSNumber numberWithInt:(int)[self timeIntervalSince1970]]; +} + +- (NSString *)ba_dateTimeIntervalStringSince1970 { + return [NSString stringWithFormat:@"%f", [self timeIntervalSince1970]]; +} + +#pragma mark - 距离当前日期最近的日期 ++ (NSDate *)ba_dateTomorrow +{ + return [NSDate ba_dateWithDaysFromNow:1]; +} + ++ (NSDate *)ba_dateYesterday +{ + return [NSDate ba_dateWithDaysBeforeNow:1]; +} + ++ (NSDate *)ba_dateWithDaysFromNow:(NSInteger)days +{ + // Thanks, Jim Morrison + return [BAKit_Current_Date dateByAddingDays:days]; +} + ++ (NSDate *)ba_dateWithDaysBeforeNow:(NSInteger)days +{ + // Thanks, Jim Morrison + return [BAKit_Current_Date ba_dateBySubtractingDays:days]; +} + ++ (NSDate *)ba_dateWithHoursFromNow:(NSInteger)dHours +{ + NSTimeInterval aTimeInterval = [BAKit_Current_Date timeIntervalSinceReferenceDate] + k_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *)ba_dateWithHoursBeforeNow:(NSInteger)dHours +{ + NSTimeInterval aTimeInterval = [BAKit_Current_Date timeIntervalSinceReferenceDate] - k_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *)ba_dateWithMinutesFromNow:(NSInteger)dMinutes +{ + NSTimeInterval aTimeInterval = [BAKit_Current_Date timeIntervalSinceReferenceDate] + k_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *)ba_dateWithMinutesBeforeNow:(NSInteger)dMinutes; +{ + NSTimeInterval aTimeInterval = [BAKit_Current_Date timeIntervalSinceReferenceDate] - k_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *)dateByAddingDays:(NSInteger)days +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + 86400 * days; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +#pragma mark - 比较日期 +- (BOOL)ba_dateIsEqualToDateIgnoringTime:(NSDate *)aDate +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:aDate]; + return ((components1.year == components2.year) && + (components1.month == components2.month) && + (components1.day == components2.day)); +} + +// This hard codes the assumption that a week is 7 days +- (BOOL)ba_dateIsSameWeekAsDate:(NSDate *)aDate +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:aDate]; + + // Must be same week. 12/31 and 1/1 will both be week "1" if they are in the same week + if (components1.weekOfYear != components2.weekOfYear) return NO; + + // Must have a time interval under 1 week. Thanks @aclark + return (fabs([self timeIntervalSinceDate:aDate]) < k_WEEK); +} + +- (BOOL)ba_dateIsSameMonthAsDate :(NSDate *)aDate +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:aDate]; + return ((components1.month == components2.month) && + (components1.year == components2.year)); +} + +- (BOOL)ba_dateIsSameYearAsDate:(NSDate *)aDate +{ + NSDateComponents *components1 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [BAKit_Current_Calendar components:NSCalendarUnitYear fromDate:aDate]; + return (components1.year == components2.year); +} + +- (BOOL)ba_dateIsEarlierThanDate:(NSDate *)aDate +{ + return ([self compare:aDate] == NSOrderedAscending); +} + +- (BOOL)ba_dateIsLaterThanDate:(NSDate *)aDate +{ + return ([self compare:aDate] == NSOrderedDescending); +} + +#pragma mark - 调整日期 +- (NSDate *)ba_dateByAddingDays:(NSInteger)dDays +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_DAY * dDays; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *)ba_dateBySubtractingDays:(NSInteger)dDays +{ + return [self ba_dateByAddingDays:(dDays * -1)]; +} + +- (NSDate *)ba_dateByAddingHours:(NSInteger)dHours +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *)ba_dateBySubtractingHours:(NSInteger)dHours +{ + return [self ba_dateByAddingHours:(dHours * -1)]; +} + +- (NSDate *)ba_dateByAddingMinutes:(NSInteger)dMinutes +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + k_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *)ba_dateBySubtractingMinutes:(NSInteger)dMinutes +{ + return [self ba_dateByAddingMinutes: (dMinutes * -1)]; +} + +- (NSDate *)ba_dateAtStartOfDay +{ + NSDateComponents *components = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:self]; + components.hour = 0; + components.minute = 0; + components.second = 0; + return [BAKit_Current_Calendar dateFromComponents:components]; +} + +- (NSDateComponents *)ba_dateComponentsWithOffsetFromDate:(NSDate *)aDate +{ + NSDateComponents *dTime = [BAKit_Current_Calendar components:BAKi_DATE_COMPONENTS fromDate:aDate toDate:self options:0]; + return dTime; +} + +#pragma mark - 时间间隔 +- (NSInteger)ba_dateMinutesAfterDate:(NSDate *)aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / k_MINUTE); +} + +- (NSInteger)ba_dateMinutesBeforeDate:(NSDate *)aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / k_MINUTE); +} + +- (NSInteger)ba_dateHoursAfterDate:(NSDate *)aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / k_HOUR); +} + +- (NSInteger)ba_dateHoursBeforeDate:(NSDate *)aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / k_HOUR); +} + +- (NSInteger)ba_dateDaysAfterDate:(NSDate *)aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / k_DAY); +} + +- (NSInteger)ba_dateDaysBeforeDate:(NSDate *)aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / k_DAY); +} + +- (NSInteger)ba_dateDistanceInDaysToDate:(NSDate *)anotherDate +{ + NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay fromDate:self toDate:anotherDate options:0]; + return components.day; +} + +- (NSDate *)ba_dateGetAfterYear:(int)year OrMonth:(int)month OrDay:(int)day{ + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *comps = nil; + comps = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[NSDate date]]; + + NSDateComponents *adcomps = [[NSDateComponents alloc] init]; + + [adcomps setYear:year]; + [adcomps setMonth:month]; + [adcomps setDay:day]; + + NSDate *newdate = [calendar dateByAddingComponents:adcomps toDate:self options:0]; + return newdate; +} + + +#pragma mark - 一年有多少周 +//#pragma mark WEEKDAY +//- (int)ba_dateGetWeekdayNumber +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} +// +//- (int)ba_dateGetWeekdayNumberPRC +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierRepublicOfChina] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} +// +//- (int)ba_dateGetWeekdayNumberWithCalendarIdentifier:(NSString *)identifier +//{ +// return (int)[[[[NSCalendar alloc] initWithCalendarIdentifier:identifier] +// components:NSCalendarUnitWeekday fromDate:self] +// weekday]; +//} + ++ (NSString *)ba_dateGetWeekInyearOrMouth:(BOOL)inYear WithDate:(NSDate *)date +{ + NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + // 通过已定义的日历对象,获取某个时间点的NSDateComponents表示,并设置需要表示哪些信息(NSYearCalendarUnit, NSMonthCalendarUnit, NSDayCalendarUnit等) + + //设置每年及每月第一周必须包含的最少天数,比如:设定第一周最少包括3天,则value传入3 周四在哪一年 本周算那一年的 + [greCalendar setMinimumDaysInFirstWeek:3]; + + NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitWeekOfYear | NSCalendarUnitWeekOfMonth fromDate:date]; + + if (inYear) { + return [NSString stringWithFormat:@"第%li周",(long)dateComponents.weekOfYear]; + }else{ + return [NSString stringWithFormat:@"第%li周",(long)dateComponents.weekOfMonth]; + } +} + ++ (NSInteger)ba_dateGetWeekNumbersOfYear:(NSInteger)year +{ + NSString *dateString = [NSString stringWithFormat:@"%ld-12-31",(long)year]; + NSDateFormatter *format = [NSDateFormatter ba_dateFormatterWithFormatString:@"yyyy-MM-dd" timezoneName:@"Asia/Shanghai"]; + NSDate *lastDay = [format dateFromString:dateString];//本年最后一天 + + NSString *lastDayWeek = [NSDate ba_dateGetWeekInyearOrMouth:YES WithDate:lastDay];//本年最后一天是第几周 + + NSInteger maxNum; + if ([lastDayWeek rangeOfString:@"1"].location != NSNotFound) {//如果是下一年第一周 看上一周是多少周 + NSString *beforeWeek = [NSDate ba_dateGetWeekInyearOrMouth:YES WithDate:[lastDay ba_dateGetAfterYear:0 OrMonth:0 OrDay:-7]]; + NSString *sub = [beforeWeek substringFromIndex:1]; + sub = [sub substringToIndex:sub.length - 1]; + maxNum = [sub floatValue]; + }else{ + NSString *sub = [lastDayWeek substringFromIndex:1]; + sub = [sub substringToIndex:sub.length - 1]; + maxNum = [sub floatValue]; + } + return maxNum; +} + +@end + +typedef NS_ENUM(NSUInteger, LunarCalendarDateComponent) { + LunarCalendarDateComponentShortYear, + LunarCalendarDateComponentLongYear, + LunarCalendarDateComponentShortMonth, + LunarCalendarDateComponentLongMonth, + LunarCalendarDateComponentShortDay, + LunarCalendarDateComponentLongDay, +}; + +@implementation NSDate (LunarCalendar) + +/** + * 农历年份,数字表示 2016 + */ +- (NSInteger)lunarShortYear +{ + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortYear]; +} + +/** + * 农历月份,数字表示 4 + */ +- (NSInteger)lunarShortMonth +{ + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortMonth]; +} + +/** + * 农历日期,数字表示 1 + */ +- (NSInteger)lunarShortDay +{ + return [self shortLunarCalendarWithComponentType:LunarCalendarDateComponentShortDay]; +} + + +/** + * 农历年份,干支表示 丙申年 + */ +- (NSString *)lunarLongYear +{ + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongYear]; +} +/** + * 农历月份,汉字表示 四月 + */ + +- (NSString *)lunarLongMonth +{ + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongMonth]; +} +/** + * 农历日期,汉字表示 初一 + */ +- (NSString *)lunarLongDay +{ + return [self longLunarCalendarWithComponentType:LunarCalendarDateComponentLongDay]; +} + +- (NSInteger)shortLunarCalendarWithComponentType:(LunarCalendarDateComponent)component +{ + + + static NSCalendar *lunarCalendar = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lunarCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierChinese]; + + }); + + unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; + + NSDateComponents *localeComp = [lunarCalendar components:unitFlags fromDate:self]; + + switch (component) { + case LunarCalendarDateComponentShortYear: + return localeComp.year; + case LunarCalendarDateComponentShortMonth: + return localeComp.month; + case LunarCalendarDateComponentShortDay: + return localeComp.day; + default: + break; + } + return 0; +} + +- (NSString *)longLunarCalendarWithComponentType:(LunarCalendarDateComponent)component{ + + NSArray *lunarYears = [NSArray arrayWithObjects: + @"甲子", @"乙丑", @"丙寅", @"丁卯", @"戊辰", @"己巳", @"庚午", @"辛未", @"壬申", @"癸酉", + @"甲戌", @"乙亥", @"丙子", @"丁丑", @"戊寅", @"己卯", @"庚辰", @"辛己", @"壬午", @"癸未", + @"甲申", @"乙酉", @"丙戌", @"丁亥", @"戊子", @"己丑", @"庚寅", @"辛卯", @"壬辰", @"癸巳", + @"甲午", @"乙未", @"丙申", @"丁酉", @"戊戌", @"己亥", @"庚子", @"辛丑", @"壬寅", @"癸丑", + @"甲辰", @"乙巳", @"丙午", @"丁未", @"戊申", @"己酉", @"庚戌", @"辛亥", @"壬子", @"癸丑", + @"甲寅", @"乙卯", @"丙辰", @"丁巳", @"戊午", @"己未", @"庚申", @"辛酉", @"壬戌", @"癸亥", nil]; + + NSArray *lunarMonths=[NSArray arrayWithObjects: + @"正月", @"二月", @"三月", @"四月", @"五月", @"六月", + @"七月", @"八月", @"九月", @"十月", @"冬月", @"腊月", nil]; + + + NSArray *lunarDays=[NSArray arrayWithObjects: + @"初一", @"初二", @"初三", @"初四", @"初五", @"初六", @"初七", @"初八", @"初九", @"初十", + @"十一", @"十二", @"十三", @"十四", @"十五", @"十六", @"十七", @"十八", @"十九", @"二十", + @"廿一", @"廿二", @"廿三", @"廿四", @"廿五", @"廿六", @"廿七", @"廿八", @"廿九", @"三十", nil]; + + switch (component) { + case LunarCalendarDateComponentLongYear: + return [lunarYears objectAtIndex:(self.lunarShortYear-1)%lunarYears.count]; + case LunarCalendarDateComponentLongMonth: + return [lunarMonths objectAtIndex:(self.lunarShortMonth-1)%lunarMonths.count]; + case LunarCalendarDateComponentLongDay: + return [lunarDays objectAtIndex:(self.lunarShortDay-1)%lunarDays.count]; + default: + break; + } + + return nil; +} + +/** + * 农历节气 (立春 雨水 惊蛰 春分...) + */ +- (NSString *)lunarSolarTerms { + + unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; + + NSDateComponents *localeComp = [[NSCalendar currentCalendar] components:unitFlags fromDate:self]; + + return [NSDate getLunarSolarTermsWithYear:(int)localeComp.year Month:(int)localeComp.month Day:(int)localeComp.day]; +} + ++ (NSString *)getLunarSolarTermsWithYear:(int)iYear Month:(int)iMonth Day:(int)iDay { + + NSArray *lunarDays=[NSArray arrayWithObjects: + @"小寒", @"大寒", @"立春", @"雨水", @"惊蛰", @"春分", + @"清明", @"谷雨", @"立夏", @"小满", @"芒种", @"夏至", + @"小暑", @"大暑", @"立秋", @"处暑", @"白露", @"秋分", + @"寒露", @"霜降", @"立冬", @"小雪", @"大雪", @"冬至", nil]; + + int array_index = (iYear - StartYear)*12+iMonth -1 ; + int64_t flag = gLunarHolDay[array_index]; + int64_t day; + if(iDay <15) + day= 15 - ((flag>>4)&0x0f); + else + day = ((flag)&0x0f)+15; + int index = -1; + if(iDay == day){ + index = (iMonth-1) *2 + (iDay>15? 1: 0); + } + if ( index >= 0 && index < [lunarDays count] ) { + return [lunarDays objectAtIndex:index]; + } else { + return @""; + } +} + +static int const StartYear = 2001; +//static int const EndYear = 2050; +static int64_t gLunarHolDay[]= +{ + + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2001 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2002 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2003 + 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2004 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2005 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2006 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X69, 0X78, 0X87, //2007 + 0X96, 0XB4, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2008 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2009 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2010 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X78, 0X87, //2011 + 0X96, 0XB4, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2012 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2013 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2014 + 0X95, 0XB4, 0X96, 0XA5, 0X96, 0X97, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2015 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2016 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2017 + 0XA5, 0XB4, 0XA6, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2018 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2019 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2020 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2021 + 0XA5, 0XB4, 0XA5, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2022 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X79, 0X77, 0X87, //2023 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2024 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2025 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2026 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2027 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2028 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2029 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2030 + 0XA5, 0XB4, 0X96, 0XA5, 0X96, 0X96, 0X88, 0X78, 0X78, 0X78, 0X87, 0X87, //2031 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2032 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X86, //2033 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X78, 0X88, 0X78, 0X87, 0X87, //2034 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2035 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2036 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X86, //2037 + 0XA5, 0XB3, 0XA5, 0XA5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2038 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2039 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X96, //2040 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2041 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X88, 0X88, 0X88, 0X78, 0X87, 0X87, //2042 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2043 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X88, 0X87, 0X96, //2044 + 0XA5, 0XC3, 0XA5, 0XB4, 0XA5, 0XA6, 0X87, 0X88, 0X87, 0X78, 0X87, 0X86, //2045 + 0XA5, 0XB3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X88, 0X78, 0X87, 0X87, //2046 + 0XA5, 0XB4, 0X96, 0XA5, 0XA6, 0X96, 0X88, 0X88, 0X78, 0X78, 0X87, 0X87, //2047 + 0X95, 0XB4, 0XA5, 0XB4, 0XA5, 0XA5, 0X97, 0X87, 0X87, 0X88, 0X86, 0X96, //2048 + 0XA4, 0XC3, 0XA5, 0XA5, 0XA5, 0XA6, 0X97, 0X87, 0X87, 0X78, 0X87, 0X86, //2049 + 0XA5, 0XC3, 0XA5, 0XB5, 0XA6, 0XA6, 0X87, 0X88, 0X78, 0X78, 0X87, 0X87 //2050 +}; + + + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.h b/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.h new file mode 100644 index 0000000..313a141 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.h @@ -0,0 +1,120 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +@interface NSDateFormatter (BAKit) + ++ (id)ba_dateFormatter; + ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString; + ++ (id)ba_dateFormatterWithFormatString:(NSString *)fmtString timezoneName:(NSString *)timezoneName; ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString dateStyle:(NSDateFormatterStyle)dateStyle; +/** + 格式化:yyyy-MM-dd HH:mm:ss + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMDHMS; + +/** + 格式化:yyyy-MM-dd, EEE, HH:mm:ss + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMDEHMS; + +/** + 格式化:yyyy-MM-dd + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYMD; + +/** + 格式化:yyyy-MM + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYM; + +/** + 格式化:yyyy + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithYY; + +/** + 格式化:HM + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithHM; + +/** + 格式化:HMS + + @return NSDateFormatter + */ ++ (id)ba_setupDateFormatterWithHMS; + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.m b/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.m new file mode 100644 index 0000000..ef5f738 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.m @@ -0,0 +1,161 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +//iOS-NSDateFormatter格式说明: +//G: 公元时代,例如AD公元 +//yy: 年的后2位 +//yyyy: 完整年 +//MM: 月,显示为1-12 +//MMM: 月,显示为英文月份简写,如 Jan +//MMMM: 月,显示为英文月份全称,如 Janualy +//dd: 日,2位数表示,如02 +//d: 日,1-2位显示,如 2 +//EEE: 简写星期几,如Sun +//EEEE: 全写星期几,如Sunday +//aa: 上下午,AM/PM +//H: 时,24小时制,0-23 +//K:时,12小时制,0-11 +//m: 分,1-2位 +//mm: 分,2位 +//s: 秒,1-2位 +//ss: 秒,2位 +//S: 毫秒 +//Z:GMT + + +#import "NSDateFormatter+BAKit.h" + +@implementation NSDateFormatter (BAKit) + ++ (id)ba_dateFormatter +{ + return [[self alloc] init]; +} + ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString +{ + if (dateFormatString == nil || ![dateFormatString isKindOfClass:[NSString class]] || [dateFormatString isEqualToString:@""]) + { + return nil; + } + + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + dateFormatter.dateFormat = dateFormatString; + + return dateFormatter; +} + ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString timezoneName:(NSString *)timezoneName +{ + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:dateFormatString]; + + if (timezoneName != nil && [timezoneName isKindOfClass:[NSString class]] && ![timezoneName isEqualToString:@""]) { + dateFormatter.timeZone = [NSTimeZone timeZoneWithName:timezoneName]; + } + return dateFormatter; +} + ++ (id)ba_dateFormatterWithFormatString:(NSString *)dateFormatString dateStyle:(NSDateFormatterStyle)dateStyle +{ + + NSDateFormatter *dateFormatter = [NSDateFormatter ba_dateFormatterWithFormatString:dateFormatString]; + + dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US"]; + dateFormatter.dateStyle = dateStyle; + + return dateFormatter; +} + ++ (id)ba_setupDateFormatterWithYMDHMS +{ + return [self ba_dateFormatterWithFormatString:@"yyyy-MM-dd HH:mm:ss"]; +} + ++ (id)ba_setupDateFormatterWithYMDEHMS +{ + return [self ba_dateFormatterWithFormatString:@"yyyy-MM-dd, EEE, HH:mm:ss"]; +} + ++ (id)ba_setupDateFormatterWithYMD +{ + return [self ba_dateFormatterWithFormatString:@"yyyy-MM-dd"]; +} + ++ (id)ba_setupDateFormatterWithYM +{ + return [self ba_dateFormatterWithFormatString:@"yyyy-MM"]; +} + ++ (id)ba_setupDateFormatterWithYY +{ + return [self ba_dateFormatterWithFormatString:@"yyyy"]; +} + ++ (id)ba_setupDateFormatterWithHM +{ + return [self ba_dateFormatterWithFormatString:@"HH:mm"]; +} + ++ (id)ba_setupDateFormatterWithHMS +{ + return [self ba_dateFormatterWithFormatString:@"HH:mm:ss"]; +} + + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.h b/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.h new file mode 100644 index 0000000..12cdc77 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.h @@ -0,0 +1,200 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + +#import +#import + +typedef NS_ENUM(NSUInteger, BAAnimationPositionType) { + BAAnimationPositionTypeTop, + BAAnimationPositionTypeBottom, + BAAnimationPositionTypeLeft, + BAAnimationPositionTypeRitht, +}; + +@interface UIView (BAAnimation) + +/*! + * 缩放显示动画 + * + * @param duration 持续时间,默认:1.0f + * @param scaleRatio 缩放比率,默认:1.6f + * @param finishBlock 缩放完成回调 + */ +- (void)ba_animation_scaleShowWithDuration:(CGFloat)duration + ratio:(CGFloat)scaleRatio + finishBlock:(void(^)())finishBlock; + +/*! + * 缩放消失动画 + * + * @param duration 持续时间,默认:1.0f + * @param scaleRatio 缩放比率,默认:1.6f + * @param finishBlock 缩放完成回调 + */ +- (void)ba_animation_scaleDismissWithDuration:(CGFloat)duration + ratio:(CGFloat)scaleRatio + finishBlock:(void(^)())finishBlock; + +/*! + * 透明度动画 + * + * @param duration 持续时间,默认:1.5f + * @param startAlpha 开始的 alpha,默认:0.2f + * @param finishAlpha 结束的 alpha,默认:1.0f + */ +- (void)ba_animation_alphaWithDuration:(CGFloat)duration + startAlpha:(CGFloat)startAlpha + finishAlpha:(CGFloat)finishAlpha; + +/*! + * 转场动画 + * + * @param duration 持续时间,默认:1.5f + * @param startOptions 开始转场动画样式 + * @param finishOptions 结束转场动画样式 + * @param finishBlock 转场结束回调 + */ +- (void)ba_animation_transitionWithDuration:(CGFloat)duration + startOptions:(UIViewAnimationOptions)startOptions + finishOptions:(UIViewAnimationOptions)finishOptions + finishBlock:(void(^)())finishBlock; + +/*! + * 改变 frame 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalFrame 原始 frame + * @param newFrame 更改后的 frame + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changFrameWithDuration:(CGFloat)duration + originalFrame:(CGRect)originalFrame + newFrame:(CGRect)newFrame + finishBlock:(void(^)())finishBlock; + +/*! + * 改变 Bounds 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalBounds 原始 Bounds + * @param newBounds 更改后的 Bounds + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changBoundsWithDuration:(CGFloat)duration + originalBounds:(CGRect)originalBounds + newBounds:(CGRect)newBounds + finishBlock:(void(^)())finishBlock; + +/*! + * 改变 Center 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalCenter 原始 Center + * @param newCenter 更改后的 Center + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changCenterWithDuration:(CGFloat)duration + originalCenter:(CGPoint)originalCenter + newCenter:(CGPoint)newCenter + finishBlock:(void(^)())finishBlock; + +/*! + * 弹簧动画 + * + * @param duration 持续时间,默认:1.5f + * @param damping 弹性比率 + * @param initialSpringVelocity 初始弹簧速度 + * @param startOptions 开始动画样式 + * @param finishOptions 开始动画样式 + * @param startBlock 开始动画回调 + * @param finishBlock 结束动画回调 + */ +- (void)ba_animation_springWithDuration:(CGFloat)duration + damping:(CGFloat)damping + initialSpringVelocity:(CGFloat)initialSpringVelocity + startOptions:(UIViewAnimationOptions)startOptions + finishOptions:(UIViewAnimationOptions)finishOptions + startBlock:(void(^)())startBlock + finishBlock:(void(^)())finishBlock; + +/** + view 出现动画 + + @param positionType 位置类型 + @param duration duration 默认:1.0f + @param finishBlock finishBlock + */ +- (void)ba_animation_showFromPositionType:(BAAnimationPositionType)positionType + duration:(CGFloat)duration + finishBlock:(void(^)())finishBlock; + +/** + view 消失动画 + + @param positionType 位置类型 + @param duration duration 默认:1.0f + @param finishBlock finishBlock + */ +- (void)ba_animation_dismissFromPositionType:(BAAnimationPositionType)positionType + duration:(CGFloat)duration + finishBlock:(void(^)())finishBlock; + +@end + + diff --git a/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.m b/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.m new file mode 100644 index 0000000..39ca854 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/UIView+BAAnimation.m @@ -0,0 +1,445 @@ +// +// UIView+BAAnimation.m +// BAAnimation +// +// Created by 博爱 on 2016/12/19. +// Copyright © 2016年 DS-Team. All rights reserved. +// + +#import "UIView+BAAnimation.h" + +@implementation UIView (BAAnimation) + +/*! + * 缩放显示动画 + * + * @param duration 持续时间,默认:1.0f + * @param scaleRatio 缩放比率,默认:1.6f + * @param finishBlock 缩放完成回调 + */ +- (void)ba_animation_scaleShowWithDuration:(CGFloat)duration + ratio:(CGFloat)scaleRatio + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.0f; + } + if (!scaleRatio) + { + scaleRatio = 1.6f; + } + + self.transform = CGAffineTransformScale(self.transform, 0.01f, 0.01f); + + [UIView animateWithDuration:duration animations:^{ + self.transform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); + } completion:^(BOOL finished) { + [UIView animateWithDuration:duration animations:^{ + self.transform = CGAffineTransformIdentity; +// self.transform = CGAffineTransformMakeScale(1.0f, 1.0f); + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/*! + * 缩放消失动画 + * + * @param duration 持续时间,默认:1.0f + * @param scaleRatio 缩放比率,默认:1.6f + * @param finishBlock 缩放完成回调 + */ +- (void)ba_animation_scaleDismissWithDuration:(CGFloat)duration + ratio:(CGFloat)scaleRatio + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.0f; + } + if (!scaleRatio) + { + scaleRatio = 1.6f; + } + + [UIView animateWithDuration:duration animations:^{ + self.transform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); + } completion:^(BOOL finished) { + [UIView animateWithDuration:duration animations:^{ + self.transform = CGAffineTransformMakeScale(0.0001f, 0.0001f); + } completion:^(BOOL finished) { + if (finishBlock) { + finishBlock(); + } + }]; + }]; +} + +/*! + * 透明度动画 + * + * @param duration 持续时间,默认:1.5f + * @param startAlpha 开始的 alpha,默认:0.2f + * @param finishAlpha 结束的 alpha,默认:1.0f + */ +- (void)ba_animation_alphaWithDuration:(CGFloat)duration + startAlpha:(CGFloat)startAlpha + finishAlpha:(CGFloat)finishAlpha +{ + if (!duration) + { + duration = 1.5f; + } + if (!startAlpha) + { + startAlpha = 0.2f; + } + if (!finishAlpha) + { + finishAlpha = 1.0f; + } + [UIView animateWithDuration:duration animations:^{ + self.alpha = startAlpha; + } completion:^(BOOL finished) { + [UIView animateWithDuration:duration animations:^{ + self.alpha = finishAlpha; + }]; + }]; +} + +/*! + * 转场动画 + * + * @param duration 持续时间,默认:1.5f + * @param startOptions 开始转场动画样式 + * @param finishOptions 结束转场动画样式 + * @param finishBlock 转场结束回调 + */ +- (void)ba_animation_transitionWithDuration:(CGFloat)duration + startOptions:(UIViewAnimationOptions)startOptions + finishOptions:(UIViewAnimationOptions)finishOptions + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.5f; + } + [UIView transitionWithView:self duration:duration options:startOptions animations:^{ + + } completion:^(BOOL finished) { + [UIView transitionWithView:self duration:duration options:finishOptions animations:^{ + + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/*! + * 改变 frame 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalFrame 原始 frame + * @param newFrame 更改后的 frame + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changFrameWithDuration:(CGFloat)duration + originalFrame:(CGRect)originalFrame + newFrame:(CGRect)newFrame + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.5f; + } + [UIView animateWithDuration:1.0f animations:^{ + self.frame = newFrame; + } completion:^(BOOL finished) { + [UIView animateWithDuration:1.0f animations:^{ + self.frame = originalFrame; + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/*! + * 改变 Bounds 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalBounds 原始 Bounds + * @param newBounds 更改后的 Bounds + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changBoundsWithDuration:(CGFloat)duration + originalBounds:(CGRect)originalBounds + newBounds:(CGRect)newBounds + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.5f; + } + [UIView animateWithDuration:duration animations:^{ + self.bounds = newBounds; + } completion:^(BOOL finished) { + [UIView animateWithDuration:1.0f animations:^{ + self.bounds = originalBounds; + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/*! + * 改变 Center 动画 + * + * @param duration 持续时间,默认:1.5f + * @param originalCenter 原始 Center + * @param newCenter 更改后的 Center + * @param finishBlock 结束回调 + */ +- (void)ba_animation_changCenterWithDuration:(CGFloat)duration + originalCenter:(CGPoint)originalCenter + newCenter:(CGPoint)newCenter + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.5f; + } + [UIView animateWithDuration:0.5f animations:^{ + self.center = newCenter; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.5f animations:^{ + self.center = originalCenter; + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/*! + * 弹簧动画 + * + * @param duration 持续时间,默认:1.5f + * @param damping 弹性比率,默认:1.0f + * @param initialSpringVelocity 初始弹簧速度,默认:3.0f + * @param startOptions 开始动画样式 + * @param finishOptions 开始动画样式 + * @param startBlock 开始动画回调 + * @param finishBlock 结束动画回调 + */ +- (void)ba_animation_springWithDuration:(CGFloat)duration + damping:(CGFloat)damping + initialSpringVelocity:(CGFloat)initialSpringVelocity + startOptions:(UIViewAnimationOptions)startOptions + finishOptions:(UIViewAnimationOptions)finishOptions + startBlock:(void(^)())startBlock + finishBlock:(void(^)())finishBlock +{ + if (!duration) + { + duration = 1.5f; + } + if (!damping) + { + damping = 1.0f; + } + if (!initialSpringVelocity) + { + initialSpringVelocity = 3.0f; + } + [UIView animateWithDuration:duration delay:0.f usingSpringWithDamping:damping initialSpringVelocity:initialSpringVelocity options:startOptions animations:^{ + if (startBlock) + { + startBlock(); + } + } completion:^(BOOL finished) { + [UIView animateWithDuration:duration delay:0.f usingSpringWithDamping:damping initialSpringVelocity:initialSpringVelocity options:finishOptions animations:^{ + } completion:^(BOOL finished) { + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +/** + view 出现动画 + + @param positionType 位置类型 + @param duration duration 默认:1.0f + @param finishBlock finishBlock + */ +- (void)ba_animation_showFromPositionType:(BAAnimationPositionType)positionType + duration:(CGFloat)duration + finishBlock:(void(^)())finishBlock +{ + CGPoint min_center = self.center; + CGPoint min_center2 = self.center; + CGRect min_frame = self.frame; + CGSize min_screen_size = [UIScreen mainScreen].bounds.size; + + switch (positionType) { + case BAAnimationPositionTypeTop: + { + // From + min_center.y = -min_frame.size.height; + self.center = min_center; + + // TO +// min_center.y = (min_screen_size.height - min_frame.size.height) * 0.5; + min_center.y = min_center2.y; + } + break; + case BAAnimationPositionTypeBottom: + { + // From + min_center.y = min_screen_size.height + min_frame.size.height; + self.center = min_center; + + // TO +// min_center.y = (min_screen_size.height - min_frame.size.height) * 0.5; + min_center.y = min_center2.y; + } + break; + case BAAnimationPositionTypeLeft: + { + // From + min_center.x = - min_center.x - min_screen_size.width * 0.5; + self.center = min_center; + + // TO +// min_center.x = (min_screen_size.width - min_frame.size.width) * 0.5; + min_center.x = min_center2.x; + } + break; + case BAAnimationPositionTypeRitht: + { + // From + min_center.x = min_screen_size.width + min_frame.size.width; + self.center = min_center; + + // TO +// min_center.x = (min_screen_size.width - min_frame.size.width) * 0.5; + min_center.x = min_center2.x; + } + break; + + default: + break; + } + if (!duration) + { + duration = 1.5f; + } + [UIView animateWithDuration:duration animations:^{ +// self.alpha = 0.3f; + self.center = min_center; + } completion:^(BOOL finished) { + [UIView animateWithDuration:0.f animations:^{ +// self.alpha = 1.0f; + if (finishBlock) + { + finishBlock(); + } + }]; + }]; +} + +- (void)ba_view_showFromScreenBottom +{ + CGRect frame = self.frame; + + // frame.origin.x = 0; + frame.origin.y = [UIScreen mainScreen].bounds.size.height; + self.frame = frame; + + // TO POS + frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height; + + [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ + self.frame = frame; + } completion:^(BOOL finished) { + + }]; +} + +/** + view 消失动画 + + @param positionType 位置类型 + @param duration duration 默认:1.0f + @param finishBlock finishBlock + */ +- (void)ba_animation_dismissFromPositionType:(BAAnimationPositionType)positionType + duration:(CGFloat)duration + finishBlock:(void(^)())finishBlock +{ + CGPoint min_center = self.center; + CGRect min_frame = self.frame; + CGSize min_screen_size = [UIScreen mainScreen].bounds.size; + + switch (positionType) { + case BAAnimationPositionTypeTop: + { + min_center.y = - min_frame.size.height * 0.5; + } + break; + case BAAnimationPositionTypeBottom: + { + min_center.y = min_screen_size.height + min_frame.size.height * 0.5; + } + break; + case BAAnimationPositionTypeLeft: + { + min_center.x = - min_center.x - min_screen_size.width * 0.5; + } + break; + case BAAnimationPositionTypeRitht: + { + min_center.x = min_screen_size.width + min_frame.size.width; + } + break; + + default: + break; + } + if (!duration) + { + duration = 1.5f; + } + [UIView animateWithDuration:duration animations:^{ + + } completion:^(BOOL finished) { + [UIView animateWithDuration:duration animations:^{ + self.center = min_center; + } completion:^(BOOL finished) { + if (finishBlock) { + finishBlock(); + } + }]; + }]; +} + + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.h b/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.h new file mode 100644 index 0000000..d84caad --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.h @@ -0,0 +1,135 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +typedef NS_ENUM(NSInteger, BAViewRectCornerType) { + /*! + * 设置下左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeft = 0, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRight, + /*! + * 设置上左角 圆角半径 + */ + BAViewRectCornerTypeTopLeft, + /*! + * 设置下右角 圆角半径 + */ + BAViewRectCornerTypeTopRight, + /*! + * 设置下左、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndBottomRight, + /*! + * 设置上左、上右角 圆角半径 + */ + BAViewRectCornerTypeTopLeftAndTopRight, + /*! + * 设置下左、上左角 圆角半径 + */ + BAViewRectCornerTypeBottomLeftAndTopLeft, + /*! + * 设置下右、上右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRight, + /*! + * 设置上左、上右、下右角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft, + /*! + * 设置下右、上右、下左角 圆角半径 + */ + BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft, + /*! + * 设置全部四个角 圆角半径 + */ + BAViewRectCornerTypeAllCorners +}; + +@interface UIView (BARectCorner) + +/*! + * 设置 viewRectCornerType 样式, + * 注意:BAViewRectCornerType 必须要先设置 viewCornerRadius,才能有效,否则设置无效, + */ +@property (nonatomic, assign) BAViewRectCornerType viewRectCornerType; + +/*! + * 设置 button 圆角,如果要全部设置四个角的圆角,可以直接用这个方法,必须要在设置 frame 之后 + */ +@property (nonatomic, assign) CGFloat viewCornerRadius; + +/** + 快速切圆角 + + @param type 圆角样式 + @param viewCornerRadius 圆角角度 + */ +- (void)ba_view_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius; + +@end diff --git a/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.m b/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.m new file mode 100644 index 0000000..6ab3550 --- /dev/null +++ b/Pods/BAPickView/BAPickView/BAPickView/UIView+BARectCorner.m @@ -0,0 +1,127 @@ +// +// UIView+BARectCorner.m +// BAButton +// +// Created by boai on 2017/5/19. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "UIView+BARectCorner.h" +#import +#import "BAPickView_Config.h" + +@implementation UIView (BARectCorner) + +- (void)ba_view_setBAViewRectCornerType:(BAViewRectCornerType)type viewCornerRadius:(CGFloat)viewCornerRadius +{ + self.viewCornerRadius = viewCornerRadius; + self.viewRectCornerType = type; +} + +#pragma mark - view 的 角半径,默认 CGSizeMake(0, 0) +- (void)setupButtonCornerType +{ + UIRectCorner corners; + CGSize cornerRadii; + + cornerRadii = CGSizeMake(self.viewCornerRadius, self.viewCornerRadius); + if (self.viewCornerRadius == 0) + { + cornerRadii = CGSizeMake(0, 0); + } + + switch (self.viewRectCornerType) + { + case BAViewRectCornerTypeBottomLeft: + { + corners = UIRectCornerBottomLeft; + } + break; + case BAViewRectCornerTypeBottomRight: + { + corners = UIRectCornerBottomRight; + } + break; + case BAViewRectCornerTypeTopLeft: + { + corners = UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeTopRight: + { + corners = UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomLeftAndBottomRight: + { + corners = UIRectCornerBottomLeft | UIRectCornerBottomRight; + } + break; + case BAViewRectCornerTypeTopLeftAndTopRight: + { + corners = UIRectCornerTopLeft | UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomLeftAndTopLeft: + { + corners = UIRectCornerBottomLeft | UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRight: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRightAndTopLeft: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerTopLeft; + } + break; + case BAViewRectCornerTypeBottomRightAndTopRightAndBottomLeft: + { + corners = UIRectCornerBottomRight | UIRectCornerTopRight | UIRectCornerBottomLeft; + } + break; + case BAViewRectCornerTypeAllCorners: + { + corners = UIRectCornerAllCorners; + } + break; + + default: + break; + } + + UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds + byRoundingCorners:corners + cornerRadii:cornerRadii]; + CAShapeLayer *maskLayer = [CAShapeLayer layer]; + maskLayer.frame = self.bounds; + maskLayer.path = maskPath.CGPath; + self.layer.mask = maskLayer; +} + +#pragma mark - setter / getter + +- (void)setViewRectCornerType:(BAViewRectCornerType)viewRectCornerType +{ + BAKit_Objc_setObj(@selector(viewRectCornerType), @(viewRectCornerType)); + [self setupButtonCornerType]; +} + +- (BAViewRectCornerType)viewRectCornerType +{ + return [BAKit_Objc_getObj integerValue]; +} + +- (void)setViewCornerRadius:(CGFloat)viewCornerRadius +{ + BAKit_Objc_setObj(@selector(viewCornerRadius), @(viewCornerRadius)); +} + +- (CGFloat)viewCornerRadius +{ + return [BAKit_Objc_getObj integerValue]; +} + +@end diff --git a/Pods/BAPickView/LICENSE b/Pods/BAPickView/LICENSE new file mode 100644 index 0000000..421b3c2 --- /dev/null +++ b/Pods/BAPickView/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/BAPickView/README.md b/Pods/BAPickView/README.md new file mode 100644 index 0000000..17de9b1 --- /dev/null +++ b/Pods/BAPickView/README.md @@ -0,0 +1,714 @@ +# BAPickView +[![BAHome Team Name](https://img.shields.io/badge/Team-BAHome-brightgreen.svg?style=flat)](https://github.com/BAHome "BAHome Team") +![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) +![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg) +![](https://img.shields.io/cocoapods/v/BAPickView.svg?style=flat) ![](https://img.shields.io/cocoapods/dt/BAPickView.svg +) [![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123) + +## 1、功能及简介 +* 1、城市选择器,三级联动,可返回省市县和精确的经纬度
+* 2、可以自定义 array 显示,性别选择等【目前只支持单行数据】 +* 3、日期选择器:年月日,可以完全自定义 NSDateFormatter +* 4、日期选择器:年月,可以完全自定义 NSDateFormatter +* 5、日期选择器:年周,如:2017年,第21周 +* 6、横竖屏适配完美 +* 7、可以自定义按钮颜色、背景颜色等 +* 8、新增各种展示、消失动画,如:缩放、上下左右展示、消失动画等 +* 9、可以自由设置 pickView 居中或者在底部显示,还可以自由定制 toolbar 居中或者在底部显示
+* 10、可以自由设置 pickView 字体、字体颜色等内容,注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改
+ +## 2、图片示例 +![BAPickView.gif](https://github.com/BAHome/BAPickView/blob/master/Images/BAPickView.gif) + +## 3、安装、导入示例和源码地址 +* 1、pod 导入【最新版本:![](https://img.shields.io/cocoapods/v/BAPickView.svg?style=flat)】:
+ `pod 'BAPickView'`
+如果发现 `pod search BAPickView` 搜索出来的不是最新版本,需要在终端执行 cd 转换文件路径命令退回到 desktop,然后执行 `pod setup` 命令更新本地spec缓存(可能需要几分钟),然后再搜索就可以了。
+具体步骤: + - pod setup : 初始化 + - pod repo update : 更新仓库 + - pod search BAPickView +* 2、文件夹拖入:下载demo,把 BAPickView 文件夹拖入项目即可,
+* 3、导入头文件:
+` #import "BAPickView_OC.h" `
+* 4、项目源码地址:
+ OC 版 :[https://github.com/BAHome/BAPickView](https://github.com/BAHome/BAPickView)
+ +## 4、BAPickView 的类结构及 demo 示例 +![BAPickView1.png](https://github.com/BAHome/BAPickView/blob/master/Images/BAPickView1.png) + +### BAPickView_OC.h +``` +#ifndef BAPickView_OC_h +#define BAPickView_OC_h + +#import "BAKit_PickerView.h" +#import "BAPickView_Config.h" +#import "NSDate+BAKit.h" +#import "UIView+BARectCorner.h" +#import "NSDateFormatter+BAKit.h" +#import "UIView+BAAnimation.h" + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BAPickView + + 最新更新时间:2017-06-03 【倒叙】
+ 最新Version:【Version:1.0.3】
+ 更新内容:
+ 1.0.3.1、可以自由设置 pickView 居中或者在底部显示,还可以自由定制 toolbar 居中或者在底部显示
+ 1.0.3.2、可以自由设置 pickView 字体、字体颜色等内容,注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改
+ + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.2】
+ 更新内容:
+ 1.0.2.1、新增进出场动画,缩放、上下左右展示、消失动画
+ 1.0.2.2、修复 isTouchEdgeHide 失效的 bug
+ + 最新更新时间:2017-05-22 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增年周选择器,如:2017年,第21周
+ + 最新更新时间:2017-05-16 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、城市选择器,三级联动,可返回省市县和精确的经纬度
+ 1.0.0.2、可以自定义 array 显示,性别选择等【目前只支持单行数据】
+ 1.0.0.3、日期选择器:年月日,可以完全自定义 NSDateFormatter
+ 1.0.0.4、日期选择器:年月,可以完全自定义 NSDateFormatter
+ 1.0.0.5、横竖屏适配完美
+ 1.0.0.6、可以自定义按钮颜色、背景颜色等
+ 1.0.0.7、理论完全兼容现有所有 iOS 系统版本
+ +*/ + +#endif /* BAPickView_OC_h */ +``` + +### BAKit_PickerView.h +``` +#import +#import + +@class BAKit_CityModel; + +/** + 选择器样式,默认为:BAKit_PickerViewTypeCity + + - BAKit_PickerViewTypeCity: 城市选择器 + - BAKit_PickerViewTypeArray: 普通数组自定义数据 + - BAKit_PickerViewTypeDate: 日期选择器:年月日,可以完全自定义 NSDateFormatter + - BAKit_PickerViewTypeDateYM: 日期选择器:年月,可以完全自定义 NSDateFormatter + - BAKit_PickerViewTypeDateWeek: 日期选择器:年周,如:2017年,第21周 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewType) { + BAKit_PickerViewTypeCity = 0, + BAKit_PickerViewTypeArray, + BAKit_PickerViewTypeDate, + BAKit_PickerViewTypeDateYM, + BAKit_PickerViewTypeDateWeek +}; + +/** + 日期选择器样式下返回的数据格式,默认为:BAKit_PickerViewDateTypeYMD + + - BAKit_PickerViewDateTypeYY: 如:2017 + - BAKit_PickerViewDateTypeYM: 如:2017-03 + - BAKit_PickerViewDateTypeYMD: 如:20172017-03-01 + - BAKit_PickerViewDateTypeYMDHMS: 如:2017-03-01 18:20:12 + - BAKit_PickerViewDateTypeYMDEHMS: 如:2017-03-01,周二, 18:20:12 + - BAKit_PickerViewDateTypeHM: 如:18:20 + - BAKit_PickerViewDateTypeHMS: 如:18:20:12 + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewDateType) { + BAKit_PickerViewDateTypeYY = 0, + BAKit_PickerViewDateTypeYM, + BAKit_PickerViewDateTypeYMD, + BAKit_PickerViewDateTypeYMDHMS, + BAKit_PickerViewDateTypeYMDEHMS, + BAKit_PickerViewDateTypeHM, + BAKit_PickerViewDateTypeHMS +}; + +/** + 设置日期选择器的样式,具体的显示顺序取决于设备的本地化设置。默认为:BAKit_PickerViewDateModeDate + + - BAKit_PickerViewDateModeTime: 显示时、分、AM/PM标志(可选) + - BAKit_PickerViewDateModeDate: 显示年、月、日 + - BAKit_PickerViewDateModeDateAndTime: 显示日期的月、日、星期,时间的时、分、AM/PM标志(可选) + - BAKit_PickerViewDateModeCountDownTimer: 显示时、分。应用程序必须实现一个计数器(NSTimer对象),让倒计时中的时间不断减少。 + */ +typedef NS_ENUM(NSInteger, BAKit_PickerViewDateMode) { + BAKit_PickerViewDateModeTime, + /*! 选择此样式后,dateType 默认为:BAKit_PickerViewDateTypeYMD */ + BAKit_PickerViewDateModeDate, + /*! 选择此样式后,dateType 默认为:ba_setupDateFormatterWithYMDEHMS */ + BAKit_PickerViewDateModeDateAndTime, + BAKit_PickerViewDateModeCountDownTimer +}; + +typedef NS_ENUM(NSUInteger, BAKit_PickerViewAnimationType) { + BAKit_PickerViewAnimationTypeScale = 0, + BAKit_PickerViewAnimationTypeTop, + BAKit_PickerViewAnimationTypeBottom, + BAKit_PickerViewAnimationTypeLeft, + BAKit_PickerViewAnimationTypeRight +}; + +/** + 设置取消和确定按钮相对pickerView的位置 + + - BAKit_PickerViewPositionTypeNormal: 默认PickerView在屏幕的底部 + - BAKit_PickerViewPositionTypeBottom: 设置pickerView在屏幕的中心 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewPositionType) { + BAKit_PickerViewPositionTypeNormal = 0, + BAKit_PickerViewPositionTypeCenter, +}; + +/** + 设置取消和确定按钮相对pickerView的位置 + + - BAKit_PickerViewButtonPositionTypeNormal: 默认“取消”和“确定”button在pickerView的顶部 + - BAKit_PickerViewButtonPositionTypeBottom: 设置“取消”和“确定”button在pickerView的底部 + + */ +typedef NS_ENUM(NSUInteger, BAKit_PickerViewButtonPositionType) { + BAKit_PickerViewButtonPositionTypeNormal = 0, + BAKit_PickerViewButtonPositionTypeBottom, +}; + +/** + 城市选择器的返回值 + + @param model BAKit_CityModel + */ +typedef void (^BAKit_PickerViewBlock)(BAKit_CityModel *model); + +/** + 普通数组自定义数据返回,日期选择器返回值 + + @param resultString resultString + */ +typedef void (^BAKit_PickerViewResultBlock)(NSString *resultString); + +@interface BAKit_PickerView : UIView + +#pragma mark - 自定义样式 +@property (nonatomic, copy) BAKit_PickerViewBlock block; +@property (nonatomic, copy) BAKit_PickerViewResultBlock resultBlock; + +/*! 是否开启边缘触摸隐藏 默认:YES */ +@property (nonatomic, assign) BOOL isTouchEdgeHide; + +/** + 动画样式 + */ +@property(nonatomic, assign) BAKit_PickerViewAnimationType animationType; + +/** + 选择器样式,默认为城市选择器 + */ +@property(nonatomic, assign) BAKit_PickerViewType pickerViewType; +@property(nonatomic, assign) BAKit_PickerViewDateType dateType; +@property(nonatomic, assign) BAKit_PickerViewDateMode dateMode; +@property(nonatomic, assign) BAKit_PickerViewButtonPositionType buttonPositionType; +@property(nonatomic, assign) BAKit_PickerViewPositionType pickerViewPositionType; + +/** + 自定义 NSDateFormatter,返回的日期格式,注意:如果同时设置 BAKit_PickerViewDateType 和 customDateFormatter,以 customDateFormatter 为主 + */ +@property(nonatomic, strong) NSDateFormatter *customDateFormatter; + +/** + 自定义数据的数组,如:@[@"男", @"女"] + */ +@property(nonatomic, strong) NSArray *dataArray; + +/** + toolBar 背景颜色,默认:白色 + */ +@property(nonatomic, strong) UIColor *backgroundColor_toolBar; + +/** + pickView 背景颜色,默认:白色 + */ +@property(nonatomic, strong) UIColor *backgroundColor_pickView; + +/** + cancleButton title颜色,默认:黑色 + */ +@property(nonatomic, strong) UIColor *buttonTitleColor_cancle; + +/** + sureButton title颜色,默认:黑色 + */ +@property(nonatomic, strong) UIColor *buttonTitleColor_sure; + +/** + pickView 字体,默认:[UIFont boldSystemFontOfSize:17],注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改 + */ +@property(nonatomic, strong) UIFont *ba_pickViewFont; + +/** + pickView 字体颜色,默认:[UIColor blackColor],注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改 + */ +@property(nonatomic, strong) UIColor *ba_pickViewTextColor; + + +#pragma mark - custom method + +/** + 快速创建一个 pickerView + + @param pickerViewType type 类型 + @param configuration 可以设置 BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatPickerViewWithType:(BAKit_PickerViewType)pickerViewType + configuration:(void (^)(BAKit_PickerView *tempView))configuration + block:(BAKit_PickerViewResultBlock)block; + +/** + 快速创建一个 城市选择器 + + @param configuration 可以设置BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatCityPickerViewWithConfiguration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewBlock)block; + +/** + 快速创建一个 自定义单列 pickerView + + @param dataArray 数组 + @param configuration 可以设置BAKit_PickerView 的自定义内容 + @param block 回调 + */ ++ (void)ba_creatCustomPickerViewWithDataArray:(NSArray *)dataArray + configuration:(void (^)(BAKit_PickerView *tempView)) configuration + block:(BAKit_PickerViewResultBlock)block; +/** + 显示 pick + */ +- (void)ba_pickViewShow; + +/** + 隐藏 pick + */ +- (void)ba_pickViewHidden; + +@end + +@interface BAKit_CityModel : NSObject + +/** + 省 + */ +@property (nonatomic, copy) NSString *province; + +/** + 市 + */ +@property (nonatomic, copy) NSString *city; + +/** + 区 + */ +@property (nonatomic, copy) NSString *area; + +/** + 经纬度 + */ +@property (nonatomic, assign) CLLocationCoordinate2D coordie; + +@end +``` + +### NSDate+BAKit.h +``` +#import + + +#define BAKit_Current_Calendar [NSCalendar currentCalendar] +#define BAKit_Current_Date [NSDate date] + +@interface NSDate (BAKit) + +@property (nonatomic, readonly) NSInteger year; +@property (nonatomic, readonly) NSInteger month; +@property (nonatomic, readonly) NSInteger day; +@property (nonatomic, readonly) NSInteger nearestHour; +@property (nonatomic, readonly) NSInteger hour; +@property (nonatomic, readonly) NSInteger minute; +@property (nonatomic, readonly) NSInteger second; +@property (nonatomic, readonly) NSInteger nanosecond; +@property (nonatomic, readonly) NSInteger weekday; +//PRC 中国 +@property (nonatomic, readonly) NSInteger weekdayPRC; +@property (nonatomic, readonly) NSInteger weekdayOrdinal; +@property (nonatomic, readonly) NSInteger weekOfMonth; +@property (nonatomic, readonly) NSInteger weekOfYear; +@property (nonatomic, readonly) NSInteger yearForWeekOfYear; +@property (nonatomic, readonly) NSInteger quarter; + +/** + 确定每个月是否为闰月 + */ +@property (nonatomic, readonly) BOOL isLeapMonth; + +/** + 确定每个月是否为闰年 + */ +@property (nonatomic, readonly) BOOL isLeapYear; + +/** + 是否是今天 + */ +@property (nonatomic, readonly) BOOL isToday; + +/** + 是否是昨天 + */ +@property (nonatomic, readonly) BOOL isYesterday; +@property (nonatomic, readonly) BOOL isTomorrow; +@property (nonatomic, readonly) BOOL isThisWeek; +@property (nonatomic, readonly) BOOL isNextWeek; +@property (nonatomic, readonly) BOOL isLastWeek; +@property (nonatomic, readonly) BOOL isThisMonth; +@property (nonatomic, readonly) BOOL isThisYear; +@property (nonatomic, readonly) BOOL isNextYear; +@property (nonatomic, readonly) BOOL isLastYear; +@property (nonatomic, readonly) BOOL isInFuture; +@property (nonatomic, readonly) BOOL isInPast; + +@property (nonatomic, readonly) BOOL isTypicallyWorkday; +@property (nonatomic, readonly) BOOL isTypicallyWeekend; + + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSDate,自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ +- (NSString *)ba_dateFormattedWithDate; + +/*! + * 计算上报时间差: 几分钟前,几天前,传入 NSString 类型的 date,如:@"2017-04-25 11:18:01",自动解析 + * + * @return 计算上报时间差: 几分钟前,几天前 + */ ++ (NSString *)ba_dateCreated_at:(NSString *)date; + +/*! + * 获得一个比当前时间大n年的时间,格式为 yyyy-MM-dd + */ ++ (NSString *)ba_dateAfterYears:(NSInteger)count; + +/*! + * 返回一个只有年月日的时间 + */ +- (NSDate *)ba_dateWithYMD; + +- (NSDate *)ba_dateWithYM; + +/*! + * 获得与当前时间的差距 + */ +- (NSDateComponents *)ba_dateDeltaWithNow; + +/** + 距离当前的时间间隔描述 + + @return 时间间隔描述 + */ +- (NSString *)ba_dateTimeIntervalDescription; + +/** + 精确到分钟的日期描述 + + @return 日期描述 + */ +- (NSString *)ba_dateMinuteDescription; + +/** + 标准时间日期描述 + + @return 标准时间日期描述 + */ +- (NSString *)ba_dateFormattedTime; + +/** + 当前日期 距离 1970 时间间隔毫秒 + + @return 当前日期 距离 1970 时间间隔毫秒 + */ +- (double)ba_dateTimeIntervalSince1970InMilliSecond; + +/** + 距离 时间间隔毫秒 后的日期 + + @param timeIntervalInMilliSecond 时间间隔毫秒 + @return 距离 时间间隔毫秒 后的日期 + */ ++ (NSDate *)ba_dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond; + +/** + 时间间隔格式化 + + @param time 时间间隔 + @return 时间格式化 + */ ++ (NSString *)ba_dateFormattedTimeFromTimeInterval:(long long)time; + +#pragma mark UTC +//UTC世界统一时间 +- (NSNumber *)ba_dateGetUtcTimeIntervalSince1970; +- (NSNumber *)ba_dateGetUtcTimeIntervalIntSince1970; +- (NSString *)ba_dateTimeIntervalStringSince1970; + +#pragma mark - 距离当前日期最近的日期 ++ (NSDate *)ba_dateTomorrow; ++ (NSDate *)ba_dateYesterday; ++ (NSDate *)ba_dateWithDaysFromNow:(NSInteger)days; ++ (NSDate *)ba_dateWithDaysBeforeNow:(NSInteger)days; ++ (NSDate *)ba_dateWithHoursFromNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithHoursBeforeNow:(NSInteger)dHours; ++ (NSDate *)ba_dateWithMinutesFromNow:(NSInteger)dMinutes; ++ (NSDate *)ba_dateWithMinutesBeforeNow:(NSInteger)dMinutes; + +#pragma mark - 比较日期 +- (BOOL)ba_dateIsEqualToDateIgnoringTime:(NSDate *)aDate; +- (BOOL)ba_dateIsSameWeekAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameMonthAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsSameYearAsDate:(NSDate *)aDate; +- (BOOL)ba_dateIsEarlierThanDate:(NSDate *)aDate; +- (BOOL)ba_dateIsLaterThanDate:(NSDate *)aDate; + +#pragma mark - 调整日期 +- (NSDate *)ba_dateByAddingDays:(NSInteger)dDays; +- (NSDate *)ba_dateBySubtractingDays:(NSInteger)dDays; +- (NSDate *)ba_dateByAddingHours:(NSInteger)dHours; +- (NSDate *)ba_dateBySubtractingHours:(NSInteger)dHours; +- (NSDate *)ba_dateByAddingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateBySubtractingMinutes:(NSInteger)dMinutes; +- (NSDate *)ba_dateAtStartOfDay; +- (NSDateComponents *)ba_dateComponentsWithOffsetFromDate:(NSDate *)aDate; + +#pragma mark - 时间间隔 +- (NSInteger)ba_dateMinutesAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateMinutesBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateHoursBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysAfterDate:(NSDate *)aDate; +- (NSInteger)ba_dateDaysBeforeDate:(NSDate *)aDate; +- (NSInteger)ba_dateDistanceInDaysToDate:(NSDate *)anotherDate; +/** + 多少天之后 + */ +- (NSDate *)ba_dateGetAfterYear:(int)year OrMonth:(int)month OrDay:(int)day; + +#pragma mark - 一年有多少周 ++ (NSString *)ba_dateGetWeekInyearOrMouth:(BOOL)inYear WithDate:(NSDate *)date; +// 2015、2009、004、1998 这四年是 53 周(目前已知),其余均是52周 ++ (NSInteger)ba_dateGetWeekNumbersOfYear:(NSInteger)year; + +@end + +/** + * 中国农历 + */ + +@interface NSDate (LunarCalendar) + +/** + * 例如 : 2016丙申年四月初一 + */ + +- (NSInteger)lunarShortYear; // 农历年份,数字表示 2016 + +- (NSString *)lunarLongYear; // 农历年份,干支表示 丙申年 + +- (NSInteger)lunarShortMonth; // 农历月份,数字表示 4 + +- (NSString *)lunarLongMonth; // 农历月份,汉字表示 四月 + +- (NSInteger)lunarShortDay; // 农历日期,数字表示 1 + +- (NSString *)lunarLongDay; // 农历日期,汉字表示 初一 + +- (NSString *)lunarSolarTerms;// 农历节气 (立春 雨水 惊蛰 春分...) + +/** 传入阳历的年月日返回当天的农历节气 */ ++ (NSString *)getLunarSolarTermsWithYear:(int)iYear Month:(int)iMonth Day:(int)iDay; + +@end +``` +### demo 示例 +``` +- (void)pickView1 +{ + BAKit_WeakSelf + [BAKit_PickerView ba_creatCityPickerViewWithConfiguration:^(BAKit_PickerView *tempView) { + BAKit_StrongSelf + // 设置“取消“和”确定“ button 在 pickerView 的底部 + tempView.buttonPositionType = BAKit_PickerViewButtonPositionTypeBottom; + // 设置 pickerView 在屏幕中的位置 + tempView.pickerViewPositionType = BAKit_PickerViewPositionTypeCenter; + // 是否开启边缘触摸隐藏 默认:YES + tempView.isTouchEdgeHide = NO; + // 动画样式 + tempView.animationType = BAKit_PickerViewAnimationTypeBottom; + /** + pickView 字体,默认:[UIFont boldSystemFontOfSize:17] + */ + tempView.ba_pickViewFont = [UIFont systemFontOfSize:17]; + /** + pickView 字体颜色,默认:[UIColor blackColor] + */ + tempView.ba_pickViewTextColor = [UIColor orangeColor]; + + self.pickView = tempView; + } block:^(BAKit_CityModel *model) { + BAKit_StrongSelf + // 返回 BAKit_CityModel,包含省市县 和 详细的经纬度 + NSString *msg = [NSString stringWithFormat:@"%@%@%@\n纬度:%f\n经度:%f", model.province, model.city, model.area, model.coordie.latitude, model.coordie.longitude]; + NSLog(@"%@", msg); + BAKit_ShowAlertWithMsg_ios8(msg); + }]; +} + +- (void)pickView2 +{ + NSArray *array = @[@"男", @"女"]; + + BAKit_WeakSelf + [BAKit_PickerView ba_creatCustomPickerViewWithDataArray:array configuration:^(BAKit_PickerView *tempView) { + BAKit_StrongSelf + // 可以自由定制 toolBar 和 pickView 的背景颜色 + tempView.backgroundColor_toolBar = [UIColor cyanColor]; + tempView.backgroundColor_pickView = [UIColor greenColor]; + tempView.animationType = BAKit_PickerViewAnimationTypeTop; + tempView.pickerViewPositionType = BAKit_PickerViewPositionTypeCenter; + self.pickView = tempView; + } block:^(NSString *resultString) { + BAKit_StrongSelf + BAKit_ShowAlertWithMsg_ios8(resultString); + }]; +} + +- (void)pickView3 +{ + BAKit_WeakSelf + [BAKit_PickerView ba_creatPickerViewWithType:BAKit_PickerViewTypeDate configuration:^(BAKit_PickerView *tempView) { + BAKit_StrongSelf + + // 可以自由定制 NSDateFormatter + tempView.dateMode = BAKit_PickerViewDateModeDate; + tempView.dateType = BAKit_PickerViewDateTypeYMD; +// NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; +// formatter.dateFormat = @"yyyy年MM月dd日"; +// tempView.customDateFormatter = formatter; + // 可以自由定制按钮颜色 + tempView.buttonTitleColor_sure = [UIColor redColor]; + tempView.buttonTitleColor_cancle = [UIColor greenColor]; + tempView.animationType = BAKit_PickerViewAnimationTypeLeft; + + self.pickView = tempView; + + } block:^(NSString *resultString) { + BAKit_StrongSelf + BAKit_ShowAlertWithMsg_ios8(resultString); + }]; +} + +- (void)pickView4 +{ + BAKit_WeakSelf + [BAKit_PickerView ba_creatPickerViewWithType:BAKit_PickerViewTypeDateYM configuration:^(BAKit_PickerView *tempView) { + BAKit_StrongSelf + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + formatter.dateFormat = @"yyyy-MM"; + tempView.customDateFormatter = formatter; + tempView.animationType = BAKit_PickerViewAnimationTypeRight; + self.pickView = tempView; + } block:^(NSString *resultString) { + BAKit_StrongSelf + BAKit_ShowAlertWithMsg_ios8(resultString); + }]; +} + +- (void)pickView5 +{ + BAKit_WeakSelf + [BAKit_PickerView ba_creatPickerViewWithType:BAKit_PickerViewTypeDateWeek configuration:^(BAKit_PickerView *tempView) { + + BAKit_StrongSelf + self.pickView = tempView; + } block:^(NSString *resultString) { + BAKit_StrongSelf + BAKit_ShowAlertWithMsg_ios8(resultString); + }]; +} + +其他示例可下载demo查看源码! +``` + +## 5、更新记录:【倒叙】 + 欢迎使用 [【BAHome】](https://github.com/BAHome) 系列开源代码 ! + 如有更多需求,请前往:[【https://github.com/BAHome】](https://github.com/BAHome) + + 最新更新时间:2017-06-03 【倒叙】
+ 最新Version:【Version:1.0.3】
+ 更新内容:
+ 1.0.3.1、可以自由设置 pickView 居中或者在底部显示,还可以自由定制 toolbar 居中或者在底部显示
+ 1.0.3.2、可以自由设置 pickView 字体、字体颜色等内容,注意:日期选择器暂时不能修改字体,有可能被苹果审核不通过,如有特殊需求,可通过 runtime 修改
+ + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.2】
+ 更新内容:
+ 1.0.2.1、新增进出场动画,缩放、上下左右展示、消失动画
+ 1.0.2.2、修复 isTouchEdgeHide 失效的 bug
+ + 最新更新时间:2017-05-22 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增年周选择器,如:2017年,第21周
+ + 最新更新时间:2017-05-16 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、城市选择器,三级联动,可返回省市县和精确的经纬度
+ 1.0.0.2、可以自定义 array 显示,性别选择等【目前只支持单行数据】
+ 1.0.0.3、日期选择器:年月日,可以完全自定义 NSDateFormatter
+ 1.0.0.4、日期选择器:年月,可以完全自定义 NSDateFormatter
+ 1.0.0.5、横竖屏适配完美
+ 1.0.0.6、可以自定义按钮颜色、背景颜色等
+ 1.0.0.7、理论完全兼容现有所有 iOS 系统版本
+ +## 6、bug 反馈 和 联系方式 +> 1、开发中遇到 bug,希望小伙伴儿们能够及时反馈与我们 BAHome 团队,我们必定会认真对待每一个问题!
+ +> 2、联系方式
+QQ群:479663605 【注意:此群为 2 元 付费群,介意的小伙伴儿勿扰!】
+博爱QQ:137361770
+博爱微博:[![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123)
+ +## 7、开发环境 和 支持版本 +> 开发使用 Xcode Version 8.3.2 (8E2002) ,理论上支持所有 iOS 版本,如有版本适配问题,请及时反馈!多谢合作! + +## 8、感谢 +> 感谢 BAHome 团队成员倾力合作,后期会推出一系列 常用 UI 控件的封装,大家有需求得也可以在 issue 提出,如果合理,我们会尽快推出新版本!
+ +> BAHome 的发展离不开小伙伴儿的信任与推广,再次感谢各位小伙伴儿的支持! + diff --git a/Pods/BATextView/BATextView/BATextView/BATextView.h b/Pods/BATextView/BATextView/BATextView/BATextView.h new file mode 100644 index 0000000..fad86e8 --- /dev/null +++ b/Pods/BATextView/BATextView/BATextView/BATextView.h @@ -0,0 +1,169 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#ifndef BATextView_h +#define BATextView_h + +#import "UITextView+BAKit.h" + +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) + +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) + +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) + +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA),class_getInstanceMethod([self class], methodB)); + +#pragma mark - NotiCenter +#define BAKit_NotiCenter [NSNotificationCenter defaultCenter] + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +#pragma mark - weak / strong +#define BAKit_WeakSelf @BAKit_Weakify(self); +#define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; +#endif +#endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; +#endif +#endif +#endif + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BATextView + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:1.0.1】 + 更新内容: + 1.0.1.1、优化注释 + + 最新更新时间:2017-05-27 【倒叙】 + 最新Version:【Version:1.0.0】 + 更新内容: + 1.0.0.1、可以自定义 placeholder的(字体、颜色)、文字(字体、颜色) + 1.0.0.2、可以自定义 输入文字的(字体、颜色)、文字(字体、颜色) + 1.0.0.3、可以自动布局,自适应高度,实时监测输入文字的最大高度 + 1.0.0.4、可以实时监测输入文字的最大个数,可以限制最大输入文字字数 + 1.0.0.5、用分类整理,无需改动源码即可实现各种自定义功能 + +*/ + +#endif /* BATextView_h */ diff --git a/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.h b/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.h new file mode 100644 index 0000000..582eaf3 --- /dev/null +++ b/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.h @@ -0,0 +1,157 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#import + +/** + 实时监测 TextView 输入文字,并返回当前文字最大高度,以便做自适应高度 + + @param current_textViewHeight 当前文字的最大高度 + */ +typedef void (^BAKit_TextView_HeightDidChangedBlock)(CGFloat current_textViewHeight); + +/** + 实时监测 TextView 输入文字,并返回当前文字字符个数 + + @param current_wordNumber 当前文字的字符个数 + */ +typedef void (^BAKit_TextView_WordDidChangedBlock)(NSInteger current_wordNumber); + +@interface UITextView (BAKit) + +/** + placeholder:文字 + */ +@property(nonatomic, strong) NSString *ba_placeholder; + +/** + placeholder:文字颜色 + */ +@property(nonatomic, strong) UIColor *ba_placeholderColor; + +/** + placeholder:文字字体 + */ +@property(nonatomic, strong) UIFont *ba_placeholderFont; + +/** + 文字字体,注意:一定要用 ba_textFont 设置,用系统的 self.font 设置无效 + */ +@property(nonatomic, strong) UIFont *ba_textFont; + +/** + 文字颜色,注意:一定要用 ba_textColor 设置,用系统的 self.textColor 设置无效 + */ +@property(nonatomic, strong) UIColor *ba_textColor; + +/** + 最大高度,如果需要随文字改变高度的时候使用 + */ +@property (nonatomic, assign) CGFloat ba_maxHeight; + +/** + 最小高度,如果需要随文字改变高度的时候使用 + */ +@property (nonatomic, assign) CGFloat ba_minHeight; + +/** + 实时监测 TextView 输入文字,并返回当前文字最大高度,以便做自适应高度 + */ +@property(nonatomic, copy) BAKit_TextView_HeightDidChangedBlock ba_textView_HeightDidChangedBlock; + +/** + 最大字数限制 + */ +@property (nonatomic, assign) NSInteger ba_maxWordLimitNumber; + +/** + 实时监测 TextView 输入文字,并返回当前文字字符个数 + */ +@property(nonatomic, copy) BAKit_TextView_WordDidChangedBlock ba_textView_WordDidChangedBlock; + + +/** + 是否为空 + + @return YES,NO + */ +- (BOOL)ba_textView_isEmpty; + +/** + 快速设定自动布局 + + @param maxHeight 最大高度 + @param minHeight 最小高度 + @param block BAKit_TextView_HeightDidChangedBlock + */ +- (void)ba_textView_autoLayoutWithMaxHeight:(CGFloat)maxHeight + minHeight:(CGFloat)minHeight + block:(BAKit_TextView_HeightDidChangedBlock)block; + +/** + 快速设定最大字数限制返回当前字数 + + @param limitNumber 最大字数限制 + @param block BAKit_TextView_WordDidChangedBlock + */ +- (void)ba_textView_wordLimitWithMaxWordLimitNumber:(NSInteger)limitNumber + block:(BAKit_TextView_WordDidChangedBlock)block; + +@end diff --git a/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.m b/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.m new file mode 100644 index 0000000..d8e4050 --- /dev/null +++ b/Pods/BATextView/BATextView/BATextView/UITextView+BAKit.m @@ -0,0 +1,346 @@ +// +// UITextView+BAKit.m +// BAQMUIDemo +// +// Created by boai on 2017/5/31. +// Copyright © 2017年 boaihome. All rights reserved. +// + +#import "UITextView+BAKit.h" +#import + +#import "BATextView.h" + +@interface UITextView () + +/** + 存储最后一次改变高度后的值 + */ +@property(nonatomic, assign) CGFloat ba_lastHeight; + +@end + +@implementation UITextView (BAKit) + ++ (void)load +{ + BAKit_Objc_exchangeMethodAToB(NSSelectorFromString(@"dealloc"), + @selector(ba_textView_dealloc)); +} + +#pragma mark - custom method +- (BOOL)ba_textView_isEmpty +{ + return (self == nil || self.text == nil || self.text.length <= 0 || [self.text isEqualToString:@""] || [self.text isEqualToString:self.ba_placeholder]); +} + +- (void)ba_textView_addNoti +{ + [self ba_removeNoti]; + + [BAKit_NotiCenter addObserver:self selector:@selector(handleDidBeginEditingNotificationAction:) name:UITextViewTextDidBeginEditingNotification object:nil]; + [BAKit_NotiCenter addObserver:self selector:@selector(handleDidEndEditingNotificationAction:) name:UITextViewTextDidEndEditingNotification object:nil]; + +// // 这些属性改变时,都要作出一定的改变,尽管已经监听了TextDidChange的通知,也要监听text属性,因为通知监听不到setText: +// NSArray *propertys = @[@"frame", @"bounds", @"font", @"text", @"textAlignment", @"textContainerInset"]; +// +// // 监听属性 +// for (NSString *property in propertys) +// { +// [self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:nil]; +// } +} + +#pragma mark - 通知事件处理 +- (void)handleDidBeginEditingNotificationAction:(NSNotification *)notification +{ + if ([self.text isEqualToString:self.ba_placeholder] && [self isFirstResponder]) + { +// NSLog(@"%s,开始编辑", __func__); + self.text = @""; + self.font = self.ba_textFont; + self.textColor = self.ba_textColor; + } +} + +- (void)handleDidEndEditingNotificationAction:(NSNotification *)notification +{ + if ([self ba_textView_isEmpty]) + { +// NSLog(@"%s,结束编辑", __func__); + self.text = self.ba_placeholder; + self.font = self.ba_placeholderFont; + self.textColor = self.ba_placeholderColor; + } +} + +- (void)handleTextDidChangeNotificationAction:(NSNotification *)notification +{ + UITextView *textView = notification.object; + + if (self.ba_maxWordLimitNumber && [self isFirstResponder]) + { + NSString *toBeString = textView.text; + // 键盘输入模式 + NSString *lang = [[UIApplication sharedApplication] textInputMode].primaryLanguage; + if ([lang isEqualToString:@"zh-Hans"]) + { + // 简体中文输入,包括简体拼音,健体五笔,简体手写 + UITextRange *selectedRange = [textView markedTextRange]; + // 获取高亮部分 + UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0]; + // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 + if (!position) + { + if (toBeString.length >= self.ba_maxWordLimitNumber) + { + textView.text = [toBeString substringToIndex:self.ba_maxWordLimitNumber]; + } + } + // 有高亮选择的字符串,则暂不对文字进行统计和限制 + else + { + + } + } + // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况 + else + { + if (toBeString.length >= self.ba_maxWordLimitNumber) + { + textView.text = [toBeString substringToIndex:self.ba_maxWordLimitNumber]; + } + } +// NSLog(@"内容:%@,\n字数:%lu", textView.text, (unsigned long)textView.text.length); + + if (self.ba_textView_WordDidChangedBlock) + { + self.ba_textView_WordDidChangedBlock(textView.text.length); + } + } + + // 计算高度,extern double ceil(double); 如果参数是小数,则求最小的整数但不小于本身. + CGFloat current_textHeight = ceil([self sizeThatFits:CGSizeMake(self.bounds.size.width, CGFLOAT_MAX)].height); + + if (current_textHeight != self.ba_lastHeight) + { + CGFloat current_textViewHeight = current_textHeight >= self.ba_maxHeight ? self.ba_maxHeight : current_textHeight; + + if (current_textViewHeight >= self.ba_minHeight) + { + // 改变 textView 的高度 + CGRect new_frame = self.frame; + if (current_textViewHeight > self.ba_maxHeight) + { + current_textViewHeight = self.ba_maxHeight; + } + + new_frame.size.height = current_textViewHeight; + self.frame = new_frame; + + if (self.ba_textView_HeightDidChangedBlock) + { + self.ba_textView_HeightDidChangedBlock(current_textViewHeight); + } + self.ba_lastHeight = current_textViewHeight; + [self ba_scrollToBottomAnimated:NO]; + } + } +} + +/** + 快速设定自动布局 + + @param maxHeight 最大高度 + @param minHeight 最小高度 + @param block BAKit_TextView_HeightDidChangedBlock + */ +- (void)ba_textView_autoLayoutWithMaxHeight:(CGFloat)maxHeight + minHeight:(CGFloat)minHeight + block:(BAKit_TextView_HeightDidChangedBlock)block +{ + self.ba_maxHeight = maxHeight; + self.ba_minHeight = minHeight; + self.ba_textView_HeightDidChangedBlock = block; +} + +/** + 快速设定最大字数限制返回当前字数 + + @param limitNumber 最大字数限制 + @param block BAKit_TextView_WordDidChangedBlock + */ +- (void)ba_textView_wordLimitWithMaxWordLimitNumber:(NSInteger)limitNumber + block:(BAKit_TextView_WordDidChangedBlock)block +{ + self.ba_maxWordLimitNumber = limitNumber; + self.ba_textView_WordDidChangedBlock = block; +} + +- (void)ba_scrollToBottomAnimated:(BOOL)animated +{ + CGPoint off = self.contentOffset; + off.y = self.contentSize.height - self.bounds.size.height + self.contentInset.bottom; + [self setContentOffset:off animated:animated]; +} + +- (void)ba_textView_dealloc +{ + [self ba_removeNoti]; +} + +- (void)ba_removeNoti +{ + [BAKit_NotiCenter removeObserver:self name:UITextViewTextDidBeginEditingNotification object:nil]; + [BAKit_NotiCenter removeObserver:self name:UITextViewTextDidEndEditingNotification object:nil]; + [BAKit_NotiCenter removeObserver:self name:UITextViewTextDidChangeNotification object:nil]; +} + +- (void)ba_textView_default +{ + if (!self.ba_maxHeight) + { + self.ba_maxHeight = CGFLOAT_MAX; + } + if (!self.ba_textFont) + { + self.ba_textFont = [UIFont systemFontOfSize:15]; + } + if (!self.ba_textColor) + { + self.ba_textColor = [UIColor blackColor]; + } +// self.textContainerInset = UIEdgeInsetsMake(5, 0, 5, 15); + [self ba_textView_addNoti]; +} + +#pragma mark - setter / getter +- (void)setBa_placeholder:(NSString *)ba_placeholder +{ + BAKit_Objc_setObj(@selector(ba_placeholder), ba_placeholder); + self.text = self.ba_placeholder; + [self ba_textView_default]; +} + +- (NSString *)ba_placeholder +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_placeholderColor:(UIColor *)ba_placeholderColor +{ + BAKit_Objc_setObj(@selector(ba_placeholderColor), ba_placeholderColor); + self.textColor = self.ba_placeholderColor; + [self ba_textView_default]; +} + +- (UIColor *)ba_placeholderColor +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_placeholderFont:(UIFont *)ba_placeholderFont +{ + BAKit_Objc_setObj(@selector(ba_placeholderFont), ba_placeholderFont); + self.font = self.ba_placeholderFont; + [self ba_textView_default]; +} + +- (UIFont *)ba_placeholderFont +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_maxHeight:(CGFloat)ba_maxHeight +{ + BAKit_Objc_setObj(@selector(ba_maxHeight), @(ba_maxHeight)); + [self ba_textView_default]; +} + +- (CGFloat)ba_maxHeight +{ + return [BAKit_Objc_getObj floatValue]; +} + +- (void)setBa_minHeight:(CGFloat)ba_minHeight +{ + BAKit_Objc_setObj(@selector(ba_minHeight), @(ba_minHeight)); + [self ba_textView_default]; +} + +- (CGFloat)ba_minHeight +{ + return [BAKit_Objc_getObj floatValue]; +} + +- (void)setBa_lastHeight:(CGFloat)ba_lastHeight +{ + BAKit_Objc_setObj(@selector(ba_lastHeight), @(ba_lastHeight)); +} + +- (CGFloat)ba_lastHeight +{ + return [BAKit_Objc_getObj floatValue]; +} + +- (void)setBa_textView_HeightDidChangedBlock:(BAKit_TextView_HeightDidChangedBlock)ba_textView_HeightDidChangedBlock +{ + BAKit_Objc_setObjCOPY(@selector(ba_textView_HeightDidChangedBlock), ba_textView_HeightDidChangedBlock); + [self ba_textView_default]; + // 监听文字改变 + [BAKit_NotiCenter addObserver:self selector:@selector(handleTextDidChangeNotificationAction:) name:UITextViewTextDidChangeNotification object:nil]; +} + +- (BAKit_TextView_HeightDidChangedBlock)ba_textView_HeightDidChangedBlock +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_textFont:(UIFont *)ba_textFont +{ + BAKit_Objc_setObj(@selector(ba_textFont), ba_textFont); + self.font = self.ba_textFont; + [self ba_textView_default]; +} + +- (UIFont *)ba_textFont +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_textColor:(UIColor *)ba_textColor +{ + BAKit_Objc_setObj(@selector(ba_textColor), ba_textColor); + self.textColor = ba_textColor; + [self ba_textView_default]; +} + +- (UIColor *)ba_textColor +{ + return BAKit_Objc_getObj; +} + +- (void)setBa_maxWordLimitNumber:(NSInteger)ba_maxWordLimitNumber +{ + BAKit_Objc_setObj(@selector(ba_maxWordLimitNumber), @(ba_maxWordLimitNumber)); +} + +- (NSInteger)ba_maxWordLimitNumber +{ + return [BAKit_Objc_getObj integerValue]; +} + +- (void)setBa_textView_WordDidChangedBlock:(BAKit_TextView_WordDidChangedBlock)ba_textView_WordDidChangedBlock +{ + BAKit_Objc_setObjCOPY(@selector(ba_textView_WordDidChangedBlock), ba_textView_WordDidChangedBlock); + [self ba_textView_default]; + // 监听文字改变 + [BAKit_NotiCenter addObserver:self selector:@selector(handleTextDidChangeNotificationAction:) name:UITextViewTextDidChangeNotification object:nil]; +} + +- (BAKit_TextView_WordDidChangedBlock)ba_textView_WordDidChangedBlock +{ + return BAKit_Objc_getObj; +} + +@end diff --git a/Pods/BATextView/LICENSE b/Pods/BATextView/LICENSE new file mode 100644 index 0000000..eddc4a8 --- /dev/null +++ b/Pods/BATextView/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2017 boai + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Pods/BATextView/README.md b/Pods/BATextView/README.md new file mode 100755 index 0000000..abdcd77 --- /dev/null +++ b/Pods/BATextView/README.md @@ -0,0 +1,373 @@ +# BATextView +[![BAHome Team Name](https://img.shields.io/badge/Team-BAHome-brightgreen.svg?style=flat)](https://github.com/BAHome "BAHome Team") +![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) +![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg) +![](https://img.shields.io/cocoapods/v/BATextView.svg?style=flat) ![](https://img.shields.io/cocoapods/dt/BATextView.svg +) [![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123) + +## 1、功能及简介 +* 1、可以自定义 placeholder的(字体、颜色)、文字(字体、颜色)
+* 2、可以自定义 输入文字的(字体、颜色)、文字(字体、颜色) +* 3、可以自动布局,自适应高度,实时监测输入文字的最大高度 +* 4、可以实时监测输入文字的最大个数,可以限制最大输入文字字数 +* 5、用分类整理,无需改动源码即可实现各种自定义功能 + +## 2、图片示例 +![BATextView](https://github.com/BAHome/BATextView/blob/master/Images/BATextView.gif) + +## 3、安装、导入示例和源码地址 +* 1、pod 导入【最新版本:![](https://img.shields.io/cocoapods/v/BATextView.svg?style=flat)】:
+ `pod 'BATextView'`
+如果发现 `pod search BATextView` 搜索出来的不是最新版本,需要在终端执行 cd 转换文件路径命令退回到 desktop,然后执行 `pod setup` 命令更新本地spec缓存(可能需要几分钟),然后再搜索就可以了。
+具体步骤: + - pod setup : 初始化 + - pod repo update : 更新仓库 + - pod search BATextView +* 2、文件夹拖入:下载demo,把 BATextView 文件夹拖入项目即可,
+* 3、导入头文件:
+` #import "BATextView.h" `
+* 4、项目源码地址:
+ OC 版 :[https://github.com/BAHome/BATextView](https://github.com/BAHome/BATextView)
+ +## 4、BATextView 的类结构及 demo 示例 +![BATextView](https://github.com/BAHome/BATextView/blob/master/Images/BATextView.png) + +### BATextView.h +``` +#ifndef BATextView_h +#define BATextView_h + +#import "UITextView+BAKit.h" + +#define BAKit_Objc_setObj(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) + +#define BAKit_Objc_setObjCOPY(key, value) objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY) + +#define BAKit_Objc_getObj objc_getAssociatedObject(self, _cmd) + +#define BAKit_Objc_exchangeMethodAToB(methodA,methodB) method_exchangeImplementations(class_getInstanceMethod([self class], methodA),class_getInstanceMethod([self class], methodB)); + +#pragma mark - NotiCenter +#define BAKit_NotiCenter [NSNotificationCenter defaultCenter] + +/*! + * 获取屏幕宽度和高度 + */ +#define BAKit_SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) + +#define BAKit_SCREEN_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width) + +#pragma mark - weak / strong +#define BAKit_WeakSelf @BAKit_Weakify(self); +#define BAKit_StrongSelf @BAKit_Strongify(self); + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题 + * 调用方式: `@BAKit_Weakify`实现弱引用转换,`@BAKit_Strongify`实现强引用转换 + * + * 示例: + * @BAKit_Weakify + * [obj block:^{ + * @strongify_self + * self.property = something; + * }]; + */ +#ifndef BAKit_Weakify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object; +#else +#define BAKit_Weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object; +#endif +#endif +#endif + +/*! + * 强弱引用转换,用于解决代码块(block)与强引用对象之间的循环引用问题 + * 调用方式: `@BAKit_Weakify(object)`实现弱引用转换,`@BAKit_Strongify(object)`实现强引用转换 + * + * 示例: + * @BAKit_Weakify(object) + * [obj block:^{ + * @BAKit_Strongify(object) + * strong_object = something; + * }]; + */ +#ifndef BAKit_Strongify +#if DEBUG +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object; +#endif +#else +#if __has_feature(objc_arc) +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object; +#else +#define BAKit_Strongify(object) try{} @finally{} __typeof__(object) object = block##_##object; +#endif +#endif +#endif + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + + 项目源码地址: + OC 版 :https://github.com/BAHome/BATextView + + 最新更新时间:2017-06-01 【倒叙】 + 最新Version:【Version:1.0.1】 + 更新内容: + 1.0.1.1、优化注释 + + 最新更新时间:2017-05-27 【倒叙】 + 最新Version:【Version:1.0.0】 + 更新内容: + 1.0.0.1、可以自定义 placeholder的(字体、颜色)、文字(字体、颜色) + 1.0.0.2、可以自定义 输入文字的(字体、颜色)、文字(字体、颜色) + 1.0.0.3、可以自动布局,自适应高度,实时监测输入文字的最大高度 + 1.0.0.4、可以实时监测输入文字的最大个数,可以限制最大输入文字字数 + 1.0.0.5、用分类整理,无需改动源码即可实现各种自定义功能 + + +*/ + +#endif /* BATextView_h */ +``` + +### UITextView+BAKit.h +``` +#import + +/** + 实时监测 TextView 输入文字,并返回当前文字最大高度,以便做自适应高度 + + @param current_textViewHeight 当前文字的最大高度 + */ +typedef void (^BAKit_TextView_HeightDidChangedBlock)(CGFloat current_textViewHeight); + +/** + 实时监测 TextView 输入文字,并返回当前文字字符个数 + + @param current_wordNumber 当前文字的字符个数 + */ +typedef void (^BAKit_TextView_WordDidChangedBlock)(NSInteger current_wordNumber); + +@interface UITextView (BAKit) + +/** + placeholder:文字 + */ +@property(nonatomic, strong) NSString *ba_placeholder; + +/** + placeholder:文字颜色 + */ +@property(nonatomic, strong) UIColor *ba_placeholderColor; + +/** + placeholder:文字字体 + */ +@property(nonatomic, strong) UIFont *ba_placeholderFont; + +/** + 文字字体,注意:一定要用 ba_textFont 设置,用系统的 self.font 设置无效 + */ +@property(nonatomic, strong) UIFont *ba_textFont; + +/** + 文字颜色,注意:一定要用 ba_textColor 设置,用系统的 self.textColor 设置无效 + */ +@property(nonatomic, strong) UIColor *ba_textColor; + +/** + 最大高度,如果需要随文字改变高度的时候使用 + */ +@property (nonatomic, assign) CGFloat ba_maxHeight; + +/** + 最小高度,如果需要随文字改变高度的时候使用 + */ +@property (nonatomic, assign) CGFloat ba_minHeight; + +/** + 实时监测 TextView 输入文字,并返回当前文字最大高度,以便做自适应高度 + */ +@property(nonatomic, copy) BAKit_TextView_HeightDidChangedBlock ba_textView_HeightDidChangedBlock; + +/** + 最大字数限制 + */ +@property (nonatomic, assign) NSInteger ba_maxWordLimitNumber; + +/** + 实时监测 TextView 输入文字,并返回当前文字字符个数 + */ +@property(nonatomic, copy) BAKit_TextView_WordDidChangedBlock ba_textView_WordDidChangedBlock; + + +/** + 是否为空 + + @return YES,NO + */ +- (BOOL)ba_textView_isEmpty; + +/** + 快速设定自动布局 + + @param maxHeight 最大高度 + @param minHeight 最小高度 + @param block BAKit_TextView_HeightDidChangedBlock + */ +- (void)ba_textView_autoLayoutWithMaxHeight:(CGFloat)maxHeight + minHeight:(CGFloat)minHeight + block:(BAKit_TextView_HeightDidChangedBlock)block; + +/** + 快速设定最大字数限制返回当前字数 + + @param limitNumber 最大字数限制 + @param block BAKit_TextView_WordDidChangedBlock + */ +- (void)ba_textView_wordLimitWithMaxWordLimitNumber:(NSInteger)limitNumber + block:(BAKit_TextView_WordDidChangedBlock)block; + +@end +``` + +### demo 示例 +``` +// 示例1: +- (UITextView *)textView1 +{ + if (!_textView1) + { + _textView1 = [UITextView new]; + _textView1.backgroundColor = BAKit_Color_Gray_11; + /** + 文字字体,注意:一定要用 ba_textFont 设置,用系统的 self.font 设置无效 + */ + _textView1.ba_textFont = [UIFont systemFontOfSize:13]; + /** + 文字颜色,注意:一定要用 ba_textColor 设置,用系统的 self.textColor 设置无效 + */ + _textView1.ba_textColor = [UIColor purpleColor]; + + _textView1.backgroundColor = BAKit_Color_Gray_11; + // 自定义 placeholder + _textView1.ba_placeholder = @"这里是 placeholder !"; + // 自定义 placeholder 颜色 + _textView1.ba_placeholderColor = [UIColor greenColor]; + // 自定义 placeholder 字体 + _textView1.ba_placeholderFont = [UIFont systemFontOfSize:16]; + + [self.view addSubview:_textView1]; + } + return _textView1; +} + +// 示例2: +- (UITextView *)textView +{ + if (!_textView) + { + _textView = [UITextView new]; + _textView.userInteractionEnabled = YES; + /** + 文字字体,注意:一定要用 ba_textFont 设置,用系统的 self.font 设置无效 + */ + _textView.ba_textFont = [UIFont systemFontOfSize:13]; + /** + 文字颜色,注意:一定要用 ba_textColor 设置,用系统的 self.textColor 设置无效 + */ + _textView.ba_textColor = [UIColor redColor]; + + _textView.backgroundColor = BAKit_Color_Gray_11; + // 自定义 placeholder + _textView.ba_placeholder = @"这里是 placeholder !"; + // 自定义 placeholder 颜色 + _textView.ba_placeholderColor = [UIColor orangeColor]; + // 自定义 placeholder 字体 + _textView.ba_placeholderFont = [UIFont systemFontOfSize:25]; + + /** + 快速设定自动布局 + + @param maxHeight 最大高度 + @param minHeight 最小高度 + @param block BAKit_TextView_HeightDidChangedBlock + */ + BAKit_WeakSelf + [_textView ba_textView_autoLayoutWithMaxHeight:100 minHeight:60 block:^(CGFloat current_textViewHeight) { + BAKit_StrongSelf + self.textView_Height = current_textViewHeight; + [self.view setNeedsLayout]; + }]; + + /** + 快速设定最大字数限制返回当前字数 + + @param limitNumber 最大字数限制 + @param block BAKit_TextView_WordDidChangedBlock + */ + [_textView ba_textView_wordLimitWithMaxWordLimitNumber:60 block:^(NSInteger current_wordNumber) { + BAKit_StrongSelf + dispatch_async(dispatch_get_main_queue(), ^{ + self.label3.text = [NSString stringWithFormat:@"%ld/%ld", (long)current_wordNumber, (long)self.textView.ba_maxWordLimitNumber]; + [self.view setNeedsLayout]; + }); + }]; + [self.view addSubview:self.textView]; + } + return _textView; +} + +其他示例可下载demo查看源码! +``` + +## 5、更新记录:【倒叙】 + 欢迎使用 [【BAHome】](https://github.com/BAHome) 系列开源代码 ! + 如有更多需求,请前往:[【https://github.com/BAHome】](https://github.com/BAHome) + + 最新更新时间:2017-06-01 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、优化注释
+ + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、可以自定义 placeholder的(字体、颜色)、文字(字体、颜色)
+ 1.0.0.2、可以自定义 输入文字的(字体、颜色)、文字(字体、颜色)
+ 1.0.0.3、可以自动布局,自适应高度,实时监测输入文字的最大高度
+ 1.0.0.4、可以实时监测输入文字的最大个数,可以限制最大输入文字字数
+ 1.0.0.5、用分类整理,无需改动源码即可实现各种自定义功能
+ +## 6、bug 反馈 和 联系方式 +> 1、开发中遇到 bug,希望小伙伴儿们能够及时反馈与我们 BAHome 团队,我们必定会认真对待每一个问题!
+ +> 2、联系方式
+QQ群:479663605 【注意:此群为 2 元 付费群,介意的小伙伴儿勿扰!】
+博爱QQ:137361770
+博爱微博:[![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123)
+ +## 7、开发环境 和 支持版本 +> 开发使用 Xcode Version 8.3.2 (8E2002) ,理论上支持所有 iOS 版本,如有版本适配问题,请及时反馈!多谢合作! + +## 8、感谢 +> 感谢 BAHome 团队成员倾力合作,后期会推出一系列 常用 UI 控件的封装,大家有需求得也可以在 issue 提出,如果合理,我们会尽快推出新版本!
+ +> BAHome 的发展离不开小伙伴儿的信任与推广,再次感谢各位小伙伴儿的支持! + diff --git a/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.h b/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.h new file mode 100644 index 0000000..edefb96 --- /dev/null +++ b/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.h @@ -0,0 +1,23 @@ +// +// BAKit_DeviceModel.h +// BATouchID +// +// Created by boai on 2017/5/24. +// Copyright © 2017年 boai. All rights reserved. +// + +#import + +@interface BAKit_DeviceModel : NSObject + +/* + 获取设备描述 + */ ++ (NSString *)ba_deviceGetCurrentDeviceModelDescription; + +/* + 由获取到的设备描述,来匹配设备型号 + */ ++ (NSString *)ba_deviceGetCurrentDeviceModel; + +@end diff --git a/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.m b/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.m new file mode 100644 index 0000000..f160c37 --- /dev/null +++ b/Pods/BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.m @@ -0,0 +1,117 @@ +// +// BAKit_DeviceModel.m +// BATouchID +// +// Created by boai on 2017/5/24. +// Copyright © 2017年 boai. All rights reserved. +// + +#import "BAKit_DeviceModel.h" +#import + +@implementation BAKit_DeviceModel + ++ (NSString *)ba_deviceGetCurrentDeviceModelDescription +{ + int mib[2]; + size_t len; + char *machine; + + mib[0] = CTL_HW; + mib[1] = HW_MACHINE; + sysctl(mib, 2, NULL, &len, NULL, 0); + machine = malloc(len); + sysctl(mib, 2, machine, &len, NULL, 0); + + NSString *platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; + free(machine); + return platform; +} + ++ (NSString *)ba_deviceGetCurrentDeviceModel +{ + NSString *platform = [BAKit_DeviceModel ba_deviceGetCurrentDeviceModelDescription]; + + if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; + if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; + if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS"; + + if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4"; + if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; + + if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; + if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5"; + + if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c"; + if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c"; + + if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s"; + if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s"; + + if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus"; + if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6"; + + if ([platform isEqualToString:@"iPhone8,1"]) return @"iPhone 6S"; + if ([platform isEqualToString:@"iPhone8,2"]) return @"iPhone 6S Plus"; + + if ([platform isEqualToString:@"iPhone9,1"]) return @"iPhone 7 A1660"; + if ([platform isEqualToString:@"iPhone9,2"]) return @"iPhone 7 Plus A1661"; + if ([platform isEqualToString:@"iPhone9,3"]) return @"iPhone 7 A1778"; + if ([platform isEqualToString:@"iPhone9,4"]) return @"iPhone 7 Plus A1784"; + + if ([platform isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G"; + if ([platform isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G"; + if ([platform isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G"; + if ([platform isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G"; + if ([platform isEqualToString:@"iPod5,1"]) return @"iPod Touch 5G"; + + if ([platform isEqualToString:@"iPad1,1"]) return @"iPad 1G"; + + if ([platform isEqualToString:@"iPad2,1"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,2"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,3"]) return @"iPad 2"; + if ([platform isEqualToString:@"iPad2,4"]) return @"iPad 2"; + + if ([platform isEqualToString:@"iPad2,5"]) return @"iPad Mini 1G"; + if ([platform isEqualToString:@"iPad2,6"]) return @"iPad Mini 1G"; + if ([platform isEqualToString:@"iPad2,7"]) return @"iPad Mini 1G"; + + if ([platform isEqualToString:@"iPad3,1"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,2"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,3"]) return @"iPad 3"; + if ([platform isEqualToString:@"iPad3,4"]) return @"iPad 4"; + if ([platform isEqualToString:@"iPad3,5"]) return @"iPad 4"; + if ([platform isEqualToString:@"iPad3,6"]) return @"iPad 4"; + + if ([platform isEqualToString:@"iPad4,1"]) return @"iPad Air"; + if ([platform isEqualToString:@"iPad4,2"]) return @"iPad Air"; + if ([platform isEqualToString:@"iPad4,3"]) return @"iPad Air"; + + if ([platform isEqualToString:@"iPad4,4"]) return @"iPad Mini 2G "; + if ([platform isEqualToString:@"iPad4,5"]) return @"iPad Mini 2G "; + if ([platform isEqualToString:@"iPad4,6"]) return @"iPad Mini 2G "; + + if ([platform isEqualToString:@"iPad4,7"]) return @"iPad Mini 3 "; + if ([platform isEqualToString:@"iPad4,8"]) return @"iPad Mini 3 "; + if ([platform isEqualToString:@"iPad4,9"]) return @"iPad Mini 3 "; + + if ([platform isEqualToString:@"iPad5,1"]) return @"iPad Mini 4 WiFi "; + if ([platform isEqualToString:@"iPad5,2"]) return @"iPad Mini 4 WiFi+Cellular "; + + if ([platform isEqualToString:@"iPad5,3"]) return @"iPad Air2 "; + if ([platform isEqualToString:@"iPad5,4"]) return @"iPad Air2 "; + + if ([platform isEqualToString:@"iPad6,7"]) return @"iPad Pro WiFi 12.7-inch"; + if ([platform isEqualToString:@"iPad6,8"]) return @"iPad Pro WiFi+Cellular 12.7-inch"; + + if ([platform isEqualToString:@"iPad6,3"]) return @"iPad Pro WiFi 9.7-inch"; + if ([platform isEqualToString:@"iPad6,4"]) return @"iPad Pro WiFi+Cellular 9.7-inch"; + + if ([platform isEqualToString:@"i386"]) return @"iPhone Simulator"; + if ([platform isEqualToString:@"x86_64"]) return @"iPhone Simulator"; + return platform; +} + +@end diff --git a/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.h b/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.h new file mode 100644 index 0000000..7ee7e2d --- /dev/null +++ b/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.h @@ -0,0 +1,119 @@ +// +// BAKit_TouchID.h +// BAKit_TouchID +// +// Created by boai on 2017/5/22. +// Copyright © 2017年 boaihome.com. All rights reserved. +// + +#import +#import +#import + + +// 操作系统版本号 +#define IOS_VERSION ([[[UIDevice currentDevice] systemVersion] floatValue]) + +/** + * TouchID 状态 + */ +typedef NS_ENUM(NSUInteger, BAKit_TouchIDType){ + + /** + * 当前设备不支持TouchID + */ + BAKit_TouchIDTypeNotSupport = 0, + /** + * TouchID 验证成功 + */ + BAKit_TouchIDTypeSuccess, + /** + * TouchID 验证失败 + */ + BAKit_TouchIDTypeFail, + /** + * TouchID 被用户手动取消 + */ + BAKit_TouchIDTypeUserCancel, + /** + * 用户不使用TouchID,选择手动输入密码 + */ + BAKit_TouchIDTypeInputPassword, + /** + * TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等) + */ + BAKit_TouchIDTypeSystemCancel, + /** + * TouchID 无法启动,因为用户没有设置密码 + */ + BAKit_TouchIDTypePasswordNotSet, + /** + * TouchID 无法启动,因为用户没有设置TouchID + */ + BAKit_TouchIDTypeTouchIDNotSet, + /** + * TouchID 无效 + */ + BAKit_TouchIDTypeTouchIDNotAvailable, + /** + * TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码) + */ + BAKit_TouchIDTypeTouchIDLockout, + /** + * 当前软件被挂起并取消了授权 (如App进入了后台等) + */ + BAKit_TouchIDTypeAppCancel, + /** + * 当前软件被挂起并取消了授权 (LAContext对象无效) + */ + BAKit_TouchIDTypeInvalidContext, + /** + * 系统版本不支持TouchID (必须高于iOS 8.0才能使用) + */ + BAKit_TouchIDTypeVersionNotSupport +}; + +/** + 指纹解锁 回调 + + @param touchIDType 返回的类型,BAKit_TouchIDType + @param error error + @param errorMessage errorMessage + */ +typedef void (^BAKit_TouchID_Block)(BAKit_TouchIDType touchIDType, NSError *error, NSString *errorMessage); + +/** + 判断是否支持指纹解锁 回调 + + @param isSupport 是否支持 + @param context context + @param policy policy + @param error error + */ +typedef void (^BAKit_TouchIDVerifyIsSupport_Block)(BOOL isSupport, LAContext *context, NSInteger policy, NSError *error); + +@interface BAKit_TouchID : NSObject + +/** + 指纹解锁 + + @param content 提示文本 + @param cancelButtonTitle 取消按钮显示内容(此参数只有iOS10以上才能生效),默认(nil):取消 + @param otherButtonTitle 密码登录按钮显示内容,默认(nil):输入密码(nil) + @param enabled 默认:NO,输入密码按钮,使用系统解锁;YES:自己操作点击密码登录 + @param BAKit_TouchIDTypeBlock 返回状态码和错误,可以自行单独处理 + */ ++ (void)ba_touchIDWithContent:(NSString *)content + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitle:(NSString *)otherButtonTitle + enabled:(BOOL)enabled + BAKit_TouchIDTypeBlock:(BAKit_TouchID_Block)BAKit_TouchIDTypeBlock; + +/** + 判断是否支持指纹解锁 + + @param block block + */ ++ (void)ba_touchIDVerifyIsSupportWithBlock:(BAKit_TouchIDVerifyIsSupport_Block)block; + +@end diff --git a/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.m b/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.m new file mode 100644 index 0000000..5368cd3 --- /dev/null +++ b/Pods/BATouchID/BATouchID/BATouchID/BAKit_TouchID.m @@ -0,0 +1,187 @@ +// +// BAKit_TouchID.m +// BAKit_TouchID +// +// Created by boai on 2017/5/22. +// Copyright © 2017年 boaihome.com. All rights reserved. +// + +#import "BAKit_TouchID.h" +#import "BAKit_DeviceModel.h" + +@implementation BAKit_TouchID + +/** + 指纹解锁 + + @param content 提示文本 + @param cancelButtonTitle 取消按钮显示内容(此参数只有iOS10以上才能生效),默认(nil):取消 + @param otherButtonTitle 密码登录按钮显示内容,默认(nil):输入密码(nil) + @param enabled 默认:NO,输入密码按钮,使用系统解锁;YES:自己操作点击密码登录 + @param BAKit_TouchIDTypeBlock 返回状态码和错误,可以自行单独处理 + */ ++ (void)ba_touchIDWithContent:(NSString *)content + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitle:(NSString *)otherButtonTitle + enabled:(BOOL)enabled + BAKit_TouchIDTypeBlock:(BAKit_TouchID_Block)BAKit_TouchIDTypeBlock +{ + [BAKit_TouchID ba_touchIDVerifyIsSupportWithBlock:^(BOOL isSupport, LAContext *context, NSInteger policy, NSError *error) { + + context.localizedFallbackTitle = otherButtonTitle; + NSInteger policy2; + if (enabled) + { + policy2 = LAPolicyDeviceOwnerAuthenticationWithBiometrics; + } + else + { + policy2 = LAPolicyDeviceOwnerAuthentication; + } + + if (isSupport) + { + // 支持指纹验证 + [context evaluatePolicy:policy2 localizedReason:content reply:^(BOOL success, NSError * _Nullable error) { + if (success) + { + dispatch_sync(dispatch_get_main_queue(), ^{ + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeSuccess, error, nil); + }); + + return ; + } + else if (error) + { + NSString *msg = @""; + switch (error.code) { + case LAErrorAuthenticationFailed: + { + msg = @"TouchID 验证失败"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeFail, error, msg); + } + break; + case LAErrorUserCancel: + { + msg = @"TouchID 被用户手动取消"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeUserCancel, error, msg); + } + break; + case LAErrorUserFallback: + { + msg = @"用户不使用TouchID,选择手动输入密码"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeInputPassword, error, msg); + } + break; + case LAErrorSystemCancel: + { + msg = @"TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等)"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeSystemCancel, error, msg); + } + break; + case LAErrorPasscodeNotSet: + { + msg = @"TouchID 无法启动,因为用户没有设置密码"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypePasswordNotSet, error, msg); + } + break; + case LAErrorTouchIDNotEnrolled: + { + msg = @"TouchID 无法启动,因为用户没有设置 TouchID"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeTouchIDNotSet, error, msg); + } + break; + case LAErrorTouchIDNotAvailable: + { + msg = @"TouchID 无效"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeTouchIDNotAvailable, error, msg); + } + break; + + if (IOS_VERSION >= 9.0) + { + case LAErrorTouchIDLockout: + { + msg = @"TouchID 被锁定(连续多次验证 TouchID 失败,系统需要用户手动输入密码)"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeTouchIDLockout, error, msg); + if (enabled) + { + [context evaluatePolicy:policy localizedReason:content reply:^(BOOL success, NSError * _Nullable error) {}]; + } + } + break; + case LAErrorAppCancel: + { + msg = @"当前软件被挂起并取消了授权 (如App进入了后台等)"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeAppCancel, error, msg); + if (enabled) + { + [context evaluatePolicy:policy localizedReason:content reply:^(BOOL success, NSError * _Nullable error) {}]; + } + } + break; + case LAErrorInvalidContext: + { + msg = @"当前软件被挂起并取消了授权 (LAContext对象无效)"; + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeInvalidContext, error, msg); + if (enabled) + { + [context evaluatePolicy:policy localizedReason:content reply:^(BOOL success, NSError * _Nullable error) {}]; + } + } + break; + } + + default: + { + msg = @"TouchID 验证失败"; + if (enabled) + { + [context evaluatePolicy:policy localizedReason:content reply:^(BOOL success, NSError * _Nullable error) {}]; + } + } + break; + } + NSLog(@"%@", msg); + } + }]; + } + else + { + NSString *msg = @""; + msg = [NSString stringWithFormat:@"此设备不支持Touch ID\n设备操作系统:%@\n设备系统版本号:%@\n设备型号:%@", [[UIDevice currentDevice] systemVersion], [[UIDevice currentDevice] systemName], [BAKit_DeviceModel ba_deviceGetCurrentDeviceModel]]; + + BAKit_TouchIDTypeBlock(BAKit_TouchIDTypeNotSupport, nil, msg); + } + }]; +} + +/** + 判断是否支持指纹解锁 + + @param block block + */ ++ (void)ba_touchIDVerifyIsSupportWithBlock:(BAKit_TouchIDVerifyIsSupport_Block)block +{ + LAContext *context = [LAContext new]; + context.maxBiometryFailures = @(3); // 接收的最大的错误次数 + + NSInteger policy; + if (IOS_VERSION < 9.0 && IOS_VERSION >= 8.0) + { + policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics; + } + else + { + policy = LAPolicyDeviceOwnerAuthentication; + } + + // 错误对象 + NSError *error = nil; + + // 首先使用 canEvaluatePolicy 判断设备支持状态 + BOOL isSupport = [context canEvaluatePolicy:policy error:&error]; + block(isSupport, context, policy, error); +} + +@end diff --git a/Pods/BATouchID/BATouchID/BATouchID/BATouchID.h b/Pods/BATouchID/BATouchID/BATouchID/BATouchID.h new file mode 100644 index 0000000..9c7cac2 --- /dev/null +++ b/Pods/BATouchID/BATouchID/BATouchID/BATouchID.h @@ -0,0 +1,113 @@ + +/*! + * @header BAKit.h + * BABaseProject + * + * @brief BAKit + * + * @author 博爱 + * @copyright Copyright © 2016年 博爱. All rights reserved. + * @version V1.0 + */ + +// _ooOoo_ +// o8888888o +// 88" . "88 +// (| -_- |) +// O\ = /O +// ____/`---'\____ +// . ' \\| |// `. +// / \\||| : |||// \ +// / _||||| -:- |||||- \ +// | | \\\ - /// | | +// | \_| ''\---/'' | | +// \ .-\__ `-` ___/-. / +// ___`. .' /--.--\ `. . __ +// ."" '< `.___\_<|>_/___.' >'"". +// | | : `- \`.;`\ _ /`;.`/ - ` : | | +// \ \ `-. \_ __\ /__ _/ .-` / / +// ======`-.____`-.___\_____/___.-`____.-'====== +// `=---=' +// +// ............................................. +// 佛祖镇楼 BUG辟易 +// 佛曰: +// 写字楼里写字间,写字间里程序员; +// 程序人员写程序,又拿程序换酒钱。 +// 酒醒只在网上坐,酒醉还来网下眠; +// 酒醉酒醒日复日,网上网下年复年。 +// 但愿老死电脑间,不愿鞠躬老板前; +// 奔驰宝马贵者趣,公交自行程序员。 +// 别人笑我忒疯癫,我笑自己命太贱; +// 不见满街漂亮妹,哪个归得程序员? + +/* + + ********************************************************************************* + * + * 在使用BAKit的过程中如果出现bug请及时以以下任意一种方式联系我,我会及时修复bug + * + * QQ : 可以添加ios开发技术群 479663605 在这里找到我(博爱1616【137361770】) + * 微博 : 博爱1616 + * Email : 137361770@qq.com + * GitHub : https://github.com/boai + * 博客 : http://boaihome.com + + ********************************************************************************* + + */ + + +#ifndef BATouchID_h +#define BATouchID_h + +#import "BAKit_TouchID.h" + + +/*! view 用 BAKit_ShowAlertWithMsg */ +#define BAKit_ShowAlertWithMsg(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示" message:(msg) delegate:nil cancelButtonTitle:@"确 定" otherButtonTitles:nil] show]; + +/*! VC 用 BAKit_ShowAlertWithMsg */ +#define BAKit_ShowAlertWithMsg_ios8(msg) UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:msg preferredStyle:UIAlertControllerStyleAlert];\ +UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确 定" style:UIAlertActionStyleDefault handler:nil];\ +[alert addAction:sureAction];\ +[self presentViewController:alert animated:YES completion:nil]; + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 项目源码地址: + OC 版 :https://github.com/BAHome/BATouchID + + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增 单独判断是否支持指纹识别的方法
+ 1.0.1.2、demo 新增手势密码设置、验证、修改、重置等方法
+ 1.0.1.3、demo 新增手势密码和指纹识别的逻辑处理,具体使用中可参照demo 中的逻辑处理方式
+ + 最新更新时间:2017-05-24 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、新增 Touch ID 的 详细封装
+ 1.0.0.2、可以自定义 描述文字、取消按钮、第二个按钮等、详细的错误状态返回
+ 1.0.0.3、demo 中增加了支付宝指纹登录逻辑,详见 demo + 1.0.0.4、进入后台 10秒 后再次打开APP 会自动判断指纹登录,详见 demo + 1.0.0.5、本地存储开启指纹登录开关,会自动判断指纹登录,详见 demo + 1.0.0.6、本地密码登录后自动判断是否支持指纹登录,会自动判断指纹登录,详见 demo + +*/ + +#endif /* BATouchID_h */ + + + + + + + + + + diff --git a/Pods/BATouchID/LICENSE b/Pods/BATouchID/LICENSE new file mode 100644 index 0000000..421b3c2 --- /dev/null +++ b/Pods/BATouchID/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Pods/BATouchID/README.md b/Pods/BATouchID/README.md new file mode 100755 index 0000000..82720a9 --- /dev/null +++ b/Pods/BATouchID/README.md @@ -0,0 +1,327 @@ +# BATouchID +[![BAHome Team Name](https://img.shields.io/badge/Team-BAHome-brightgreen.svg?style=flat)](https://github.com/BAHome "BAHome Team") +![](https://img.shields.io/badge/platform-iOS-red.svg) ![](https://img.shields.io/badge/language-Objective--C-orange.svg) +![](https://img.shields.io/badge/license-MIT%20License-brightgreen.svg) +![](https://img.shields.io/cocoapods/v/BATouchID.svg?style=flat) ![](https://img.shields.io/cocoapods/dt/BATouchID.svg +) [![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123) + +## 1、功能及简介 +* 1、支付宝 指纹登录 touchID 封装
+* 2、可以自定义 描述文字、取消按钮、第二个按钮等、详细的错误状态返回 +* 3、demo 中增加了支付宝指纹登录逻辑,详见 demo +* 4、进入后台 10秒 后再次打开APP 会自动判断指纹登录,详见 demo +* 5、本地存储开启指纹登录开关,会自动判断指纹登录,详见 demo +* 6、本地密码登录后自动判断是否支持指纹登录,会自动判断指纹登录,详见 demo +* 7、新增 单独判断是否支持指纹识别的方法
+* 8、demo 新增手势密码设置、验证、修改、重置等方法
+* 9、demo 新增手势密码和指纹识别的逻辑处理,具体使用中可参照demo 中的逻辑处理方式
+ + +## 2、图片示例 +![支付宝指纹登录流程图](https://github.com/BAHome/BATouchID/blob/master/Images/支付宝指纹登录流程图.png) + +## 3、安装、导入示例和源码地址 +* 1、pod 导入【最新版本:version 1.0.1】:
+ `pod 'BATouchID'`
+如果发现 `pod search BATouchID` 搜索出来的不是最新版本,需要在终端执行 cd 转换文件路径命令退回到 desktop,然后执行 `pod setup` 命令更新本地spec缓存(可能需要几分钟),然后再搜索就可以了。
+具体步骤: + - pod setup : 初始化 + - pod repo update : 更新仓库 + - pod search BATouchID +* 2、文件夹拖入:下载demo,把 BATouchID 文件夹拖入项目即可,
+* 3、导入头文件:
+` #import "BATouchID.h" `
+* 4、项目源码地址:
+ OC 版 :[https://github.com/BAHome/BATouchID](https://github.com/BAHome/BATouchID)
+ +## 4、BATouchID 的类结构及 demo 示例 +![BATouchID](https://github.com/BAHome/BATouchID/blob/master/Images/BATouchID.png) + +### BATouchID.h +``` +#ifndef BATouchID_h +#define BATouchID_h + +#import "UIButton+BAKit.h" + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 欢迎使用 BAHome 系列开源代码 ! + 如有更多需求,请前往:https://github.com/BAHome + +#ifndef BATouchID_h +#define BATouchID_h + +#import "BAKit_TouchID.h" +#import "BAKit_DeviceModel.h" + +/*! view 用 BAKit_ShowAlertWithMsg */ +#define BAKit_ShowAlertWithMsg(msg) [[[UIAlertView alloc] initWithTitle:@"温馨提示" message:(msg) delegate:nil cancelButtonTitle:@"确 定" otherButtonTitles:nil] show]; + +/*! VC 用 BAKit_ShowAlertWithMsg */ +#define BAKit_ShowAlertWithMsg_ios8(msg) UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"温馨提示" message:msg preferredStyle:UIAlertControllerStyleAlert];\ +UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确 定" style:UIAlertActionStyleDefault handler:nil];\ +[alert addAction:sureAction];\ +[self presentViewController:alert animated:YES completion:nil]; + +/*! + ********************************************************************************* + ************************************ 更新说明 ************************************ + ********************************************************************************* + + 项目源码地址: + OC 版 :https://github.com/BAHome/BATouchID + + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增 单独判断是否支持指纹识别的方法
+ 1.0.1.2、demo 新增手势密码设置、验证、修改、重置等方法
+ 1.0.1.3、demo 新增手势密码和指纹识别的逻辑处理,具体使用中可参照demo 中的逻辑处理方式
+ + 最新更新时间:2017-05-24 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、新增 Touch ID de 详细封装
+ 1.0.0.2、可以自定义 描述文字、取消按钮、第二个按钮等、详细的错误状态返回
+ 1.0.0.3、demo 中增加了支付宝指纹登录逻辑,详见 demo + 1.0.0.4、新增获取设备详细信息的封装,详见:BAKit_DeviceModel + +*/ + +#endif /* BATouchID_h */ + +``` + +### BAKit_TouchID.h +``` +#import +#import +#import + + +// 操作系统版本号 +#define IOS_VERSION ([[[UIDevice currentDevice] systemVersion] floatValue]) + +/** + * TouchID 状态 + */ +typedef NS_ENUM(NSUInteger, BAKit_TouchIDType){ + + /** + * 当前设备不支持TouchID + */ + BAKit_TouchIDTypeNotSupport = 0, + /** + * TouchID 验证成功 + */ + BAKit_TouchIDTypeSuccess, + /** + * TouchID 验证失败 + */ + BAKit_TouchIDTypeFail, + /** + * TouchID 被用户手动取消 + */ + BAKit_TouchIDTypeUserCancel, + /** + * 用户不使用TouchID,选择手动输入密码 + */ + BAKit_TouchIDTypeInputPassword, + /** + * TouchID 被系统取消 (如遇到来电,锁屏,按了Home键等) + */ + BAKit_TouchIDTypeSystemCancel, + /** + * TouchID 无法启动,因为用户没有设置密码 + */ + BAKit_TouchIDTypePasswordNotSet, + /** + * TouchID 无法启动,因为用户没有设置TouchID + */ + BAKit_TouchIDTypeTouchIDNotSet, + /** + * TouchID 无效 + */ + BAKit_TouchIDTypeTouchIDNotAvailable, + /** + * TouchID 被锁定(连续多次验证TouchID失败,系统需要用户手动输入密码) + */ + BAKit_TouchIDTypeTouchIDLockout, + /** + * 当前软件被挂起并取消了授权 (如App进入了后台等) + */ + BAKit_TouchIDTypeAppCancel, + /** + * 当前软件被挂起并取消了授权 (LAContext对象无效) + */ + BAKit_TouchIDTypeInvalidContext, + /** + * 系统版本不支持TouchID (必须高于iOS 8.0才能使用) + */ + BAKit_TouchIDTypeVersionNotSupport +}; + +/** + 指纹解锁 回调 + + @param touchIDType 返回的类型,BAKit_TouchIDType + @param error error + @param errorMessage errorMessage + */ +typedef void (^BAKit_TouchID_Block)(BAKit_TouchIDType touchIDType, NSError *error, NSString *errorMessage); + +/** + 判断是否支持指纹解锁 回调 + + @param isSupport 是否支持 + @param context context + @param policy policy + @param error error + */ +typedef void (^BAKit_TouchIDVerifyIsSupport_Block)(BOOL isSupport, LAContext *context, NSInteger policy, NSError *error); + +@interface BAKit_TouchID : NSObject + +/** + 指纹解锁 + + @param content 提示文本 + @param cancelButtonTitle 取消按钮显示内容(此参数只有iOS10以上才能生效),默认(nil):取消 + @param otherButtonTitle 密码登录按钮显示内容,默认(nil):输入密码(nil) + @param enabled 默认:NO,输入密码按钮,使用系统解锁;YES:自己操作点击密码登录 + @param BAKit_TouchIDTypeBlock 返回状态码和错误,可以自行单独处理 + */ ++ (void)ba_touchIDWithContent:(NSString *)content + cancelButtonTitle:(NSString *)cancelButtonTitle + otherButtonTitle:(NSString *)otherButtonTitle + enabled:(BOOL)enabled + BAKit_TouchIDTypeBlock:(BAKit_TouchID_Block)BAKit_TouchIDTypeBlock; + +/** + 判断是否支持指纹解锁 + + @param block block + */ ++ (void)ba_touchIDVerifyIsSupportWithBlock:(BAKit_TouchIDVerifyIsSupport_Block)block; + +@end +``` + +### BAKit_DeviceModel.h +``` +#import + +@interface BAKit_DeviceModel : NSObject + +/* + 获取设备描述 + */ ++ (NSString *)ba_deviceGetCurrentDeviceModelDescription; + +/* + 由获取到的设备描述,来匹配设备型号 + */ ++ (NSString *)ba_deviceGetCurrentDeviceModel; + +@end +``` +### demo 示例 +``` +// 示例1:登录验证,是否开启指纹登录 +- (void)checkIsSupportTouchID +{ + [BAKit_TouchID ba_touchIDVerifyIsSupportWithBlock:^(BOOL isSupport, LAContext *context, NSInteger policy, NSError *error) { + if (isSupport) + { + id isShow = [kUserDefaults objectForKey:kIsOpenTouchID]; + if ([isShow intValue] == 0) + { + [kUserDefaults setObject:[NSNumber numberWithBool:YES] forKey:kIsOpenTouchID]; + [self presentViewController:[BATouchIDLoginVC new] animated:YES completion:nil]; + } + } + else + { + BAKit_ShowAlertWithMsg_ios8(@"设备不支持 touch ID!"); + } + }]; +} + +// 示例2:指纹识别 +- (void)test +{ + /** + 指纹解锁 + + @param content 提示文本 + @param cancelButtonTitle 取消按钮显示内容(此参数只有iOS10以上才能生效),默认(nil):取消 + @param otherButtonTitle 密码登录按钮显示内容,默认(nil):输入密码(nil) + @param enabled 默认:NO,输入密码按钮,使用系统解锁;YES:自己操作点击密码登录 + @param BAKit_TouchIDTypeBlock 返回状态码和错误,可以自行单独处理 + */ + [BAKit_TouchID ba_touchIDWithContent:@"此操作需要认证您的身份" cancelButtonTitle:nil otherButtonTitle:nil enabled:YES BAKit_TouchIDTypeBlock:^(BAKit_TouchIDType touchIDType, NSError *error, NSString *errorMessage) { + + if (errorMessage && touchIDType != BAKit_TouchIDTypeTouchIDLockout && touchIDType != BAKit_TouchIDTypeInputPassword) + { + NSString *msg = errorMessage; + BAKit_ShowAlertWithMsg_ios8(msg); + } + + if (touchIDType == BAKit_TouchIDTypeSuccess) + { + BAKit_ShowAlertWithMsg(@"指纹验证成功!"); + [self ba_backToPreVC:nil]; + } + if (touchIDType == BAKit_TouchIDTypeInputPassword) + { + NSLog(@"请跳转到自己的密码登录界面,如:手势解锁等!"); + + dispatch_async(dispatch_get_main_queue(), ^{ + [self ba_verifyPwd]; + }); + } + }]; +} + +其他示例可下载demo查看源码! +``` + +## 5、更新记录:【倒叙】 + 欢迎使用 [【BAHome】](https://github.com/BAHome) 系列开源代码 ! + 如有更多需求,请前往:[【https://github.com/BAHome】](https://github.com/BAHome) + + 最新更新时间:2017-05-27 【倒叙】
+ 最新Version:【Version:1.0.1】
+ 更新内容:
+ 1.0.1.1、新增 单独判断是否支持指纹识别的方法
+ 1.0.1.2、demo 新增手势密码设置、验证、修改、重置等方法
+ 1.0.1.3、demo 新增手势密码和指纹识别的逻辑处理,具体使用中可参照demo 中的逻辑处理方式
+ + 最新更新时间:2017-05-24 【倒叙】
+ 最新Version:【Version:1.0.0】
+ 更新内容:
+ 1.0.0.1、新增 Touch ID de 详细封装
+ 1.0.0.2、可以自定义 描述文字、取消按钮、第二个按钮等、详细的错误状态返回
+ 1.0.0.3、demo 中增加了支付宝指纹登录逻辑,详见 demo + 1.0.0.4、新增获取设备详细信息的封装,详见:BAKit_DeviceModel + +## 6、bug 反馈 和 联系方式 +> 1、开发中遇到 bug,希望小伙伴儿们能够及时反馈与我们 BAHome 团队,我们必定会认真对待每一个问题!
+ +> 2、联系方式
+QQ群:479663605 【注意:此群为 2 元 付费群,介意的小伙伴儿勿扰!】
+博爱QQ:137361770
+博爱微博:[![](https://img.shields.io/badge/微博-博爱1616-red.svg)](http://weibo.com/538298123)
+ +## 7、开发环境 和 支持版本 +> 开发使用 Xcode Version 8.3.2 (8E2002) ,理论上支持所有 iOS 版本,如有版本适配问题,请及时反馈!多谢合作! + +## 8、感谢 +> 感谢 BAHome 团队成员倾力合作,后期会推出一系列 常用 UI 控件的封装,大家有需求得也可以在 issue 提出,如果合理,我们会尽快推出新版本!
+ +> BAHome 的发展离不开小伙伴儿的信任与推广,再次感谢各位小伙伴儿的支持! + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/BaiduMapAPI_Base b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/BaiduMapAPI_Base new file mode 100644 index 0000000..53f2706 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/BaiduMapAPI_Base differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKBaseComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKBaseComponent.h new file mode 100644 index 0000000..25abeef --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKBaseComponent.h @@ -0,0 +1,13 @@ +// +// BaseComponent.h +// BaseComponent +// +// Created by baidu on 14-3-17. +// Copyright (c) 2014年 baidu. All rights reserved. +// + +#import "BMKGeneralDelegate.h" +#import "BMKMapManager.h" +#import "BMKTypes.h" +#import "BMKUserLocation.h" +#import "BMKVersion.h" diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKGeneralDelegate.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKGeneralDelegate.h new file mode 100644 index 0000000..b56dde1 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKGeneralDelegate.h @@ -0,0 +1,24 @@ +// +// BMKGeneralDelegate.h +// BMapKit +// +// Copyright 2011 Baidu Inc. All rights reserved. +// + +#import + +///通知Delegate +@protocol BMKGeneralDelegate +@optional +/** + *返回网络错误 + *@param iError 错误号 + */ +- (void)onGetNetworkState:(int)iError; + +/** + *返回授权验证错误 + *@param iError 错误号 : 为0时验证通过,具体参加BMKPermissionCheckResultCode + */ +- (void)onGetPermissionState:(int)iError; +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKMapManager.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKMapManager.h new file mode 100644 index 0000000..3cb4514 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKMapManager.h @@ -0,0 +1,76 @@ +/* + * BMKMapManager.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKGeneralDelegate.h" +#import +#import "BMKTypes.h" + +enum EN_PERMISSION_STATUS +{ + E_PERMISSION_OK = 0, // 授权验证通过 + E_PERMISSION_SERVER_ERROR = -200, //服务端数据错误,无法解析服务端返回数据 + E_PERMISSION_NETWORK_ERROR = -300, //无法建立与服务端的连接 + +}; + +//地图模块枚举 +typedef enum { + BMKMapModuleTile = 0, //瓦片图模块 +}BMKMapModule; + +///主引擎类 +@interface BMKMapManager : NSObject + +/** + *百度地图SDK所有接口均支持百度坐标(BD09LL)和国测局坐标(GCJ02),用此方法设置您使用的坐标类型. + *默认是BD09LL(BMK_COORDTYPE_BD09LL)坐标. + *如果需要使用GCJ02坐标,需要设置CoordinateType为:BMK_COORDTYPE_COMMON. + */ ++ (BOOL)setCoordinateTypeUsedInBaiduMapSDK:(BMK_COORD_TYPE) coorType; + +/** + *获取百度地图SDK当前使用的经纬度类型 + *@return 经纬度类型 + */ ++ (BMK_COORD_TYPE)getCoordinateTypeUsedInBaiduMapSDK; + +/** + *是否开启打印某模块的log,默认不打印log + *debug时,建议打开,有利于调试程序;release时建议关闭 + *@param enable 是否开启 + *@param mapModule 地图模块 + */ ++ (void)logEnable:(BOOL) enable module:(BMKMapModule) mapModule; + +/** +*启动引擎 +*@param key 申请的有效key +*@param delegate +*/ +-(BOOL)start:(NSString*)key generalDelegate:(id)delegate; + +/** + *获取所有在线服务消耗的发送流量,单位:字节 + */ +-(int)getTotalSendFlaxLength; + +/** + *获取所有在线服务消耗的接收流量,单位:字节 + */ +-(int)getTotalRecvFlaxLength; + +/** +*停止引擎 +*/ +-(BOOL)stop; + + + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKTypes.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKTypes.h new file mode 100644 index 0000000..09f1f17 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKTypes.h @@ -0,0 +1,186 @@ +// +// BMKType.h +// MapPlatform +// +// Created by BaiduMapAPI on 13-3-26. +// Copyright (c) 2013年 baidu. All rights reserved. +// + +#import +#import + +#import +typedef enum +{ + BMK_COORDTYPE_GPS = 0, ///GPS设备采集的原始GPS坐标(WGS-84) + BMK_COORDTYPE_COMMON, ///GCJ坐标,google地图、soso地图、aliyun地图、mapabc地图和amap地图所用坐标 + BMK_COORDTYPE_BD09LL, ///bd09ll 百度经纬度坐标 +} BMK_COORD_TYPE; +enum { + BMKMapTypeNone = 0, ///< 空白地图 + BMKMapTypeStandard = 1, ///< 标准地图 + BMKMapTypeSatellite = 2, ///< 卫星地图 +}; +typedef NSUInteger BMKMapType; + +typedef enum { + BMKErrorOk = 0, ///< 正确,无错误 + BMKErrorConnect = 2, ///< 网络连接错误 + BMKErrorData = 3, ///< 数据错误 + BMKErrorRouteAddr = 4, ///<起点或终点选择(有歧义) + BMKErrorResultNotFound = 100, ///< 搜索结果未找到 + BMKErrorLocationFailed = 200, ///< 定位失败 + BMKErrorPermissionCheckFailure = 300, ///< 百度地图API授权Key验证失败 + BMKErrorParse = 310 ///< 数据解析失败 +}BMKErrorCode; +//鉴权结果状态码 +typedef enum { + E_PERMISSIONCHECK_CONNECT_ERROR = -300,//链接服务器错误 + E_PERMISSIONCHECK_DATA_ERROR = -200,//服务返回数据异常 + E_PERMISSIONCHECK_OK = 0, // 授权验证通过 + E_PERMISSIONCHECK_KEY_ERROR = 101, //ak不存在 + E_PERMISSIONCHECK_MCODE_ERROR = 102, //mcode签名值不正确 + E_PERMISSIONCHECK_UID_KEY_ERROR = 200, // APP不存在,AK有误请检查再重试 + E_PERMISSIONCHECK_KEY_FORBIDEN= 201, // APP被用户自己禁用,请在控制台解禁 + /* + *更多鉴权状态码请参考: + *http://developer.baidu.com/map/index.php?title=lbscloud/api/appendix + */ +}BMKPermissionCheckResultCode; +//检索结果状态码 +typedef enum{ + BMK_SEARCH_NO_ERROR = 0,///<检索结果正常返回 + BMK_SEARCH_AMBIGUOUS_KEYWORD,///<检索词有岐义 + BMK_SEARCH_AMBIGUOUS_ROURE_ADDR,///<检索地址有岐义 + BMK_SEARCH_NOT_SUPPORT_BUS,///<该城市不支持公交搜索 + BMK_SEARCH_NOT_SUPPORT_BUS_2CITY,///<不支持跨城市公交 + BMK_SEARCH_RESULT_NOT_FOUND,///<没有找到检索结果 + BMK_SEARCH_ST_EN_TOO_NEAR,///<起终点太近 + BMK_SEARCH_KEY_ERROR,/// +#import +#import "BMKBaseComponent.h" +@class CLLocation; +@class CLHeading; +@interface BMKUserLocation : NSObject + +/// 位置更新状态,如果正在更新位置信息,则该值为YES +@property (readonly, nonatomic, getter=isUpdating) BOOL updating; + +/// 位置信息,尚未定位成功,则该值为nil +@property (readonly, nonatomic,strong) CLLocation *location; + +/// heading信息,尚未定位成功,则该值为nil +@property (readonly, nonatomic, strong) CLHeading *heading; + +/// 定位标注点要显示的标题信息 +@property (strong, nonatomic) NSString *title; + +/// 定位标注点要显示的子标题信息. +@property (strong, nonatomic) NSString *subtitle; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKVersion.h new file mode 100644 index 0000000..4bbd5e3 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKVersion.h @@ -0,0 +1,1057 @@ +// +// BMKVersion.h +// BMapKit +// +// Copyright 2011 Baidu Inc. All rights reserved. +// + +#import + + +/*****更新日志:***** + V0.1.0: 测试版 + 支持地图浏览,基础操作 + 支持POI搜索 + 支持路线搜索 + 支持地理编码功能 + -------------------- + V1.0.0:正式发布版 + 地图浏览,操作,多点触摸,动画 + 标注,覆盖物 + POI、路线搜索 + 地理编码、反地理编码 + 定位图层 + -------------------- + V1.1.0: + 离线地图支持 + -------------------- + V1.1.1: + 增加suggestionSearch接口 + 可以动态更改annotation title + fix小内存泄露问题 + -------------------- + V1.2.1: + 增加busLineSearch接口 + 修复定位圈范围内不能拖动地图的bug + + -------------------- + V2.0.0 + + 新增: + 全新的3D矢量地图渲染 + BMKMapView设定地图旋转俯视角度:rotation、overlooking + BMKMapView设定指南针显示位置:compassPosition + BMKMapView控制生命周期:viewWillAppear、viewWillDisappear + 地图标注可点,BMKMapViewDelegate新增接口回调接口onClickedMapPoi + BMKAnnotationView设置annotation是否启用3D模式:enabled3D + overlay绘制方式改变,采用opengl绘制: + BMKOverlayView使用opengl渲染接口:glRender子类重载此函数实现gl绘制 + 基本opengl线绘制:renderLinesWithPoints + 基本opengl面绘制:renderRegionWithPointsl + 全新的矢量离线地图数据: + BMKOfflineMap下载离线地图:start + BMKOfflineMap更新离线地图:update + BMKOfflineMap暂停下载或更新:pasue + 获得热点城市列表:getHotCityList + 获得支持离线数据的城市:getOfflineCityList + 根据城市名查询城市信息:searchCity + 更新: + BMKMapView的缩放级别zoomLevel更新为float型,实现无级缩放 + 更新地图类型枚举: + enum { BMKMapTypeStandard = 1, ///< 标准地图 + BMKMapTypeTrafficOn = 2, ///< 实时路况 + BMKMapTypeSatellite = 4, ///< 卫星地图 + BMKMapTypeTrafficAndSatellite = 8, ///< 同时打开实时路况和卫星地图 + }; + + + -------------------- + v2.0.1 + 新增: + § MapView增加事件监听 + BMKMapviewDelegate中- mapView: onClickedMapBlank:方法监听地图单击事件 + BMKMapviewDelegate中- mapView: onDoubleClick:方法监听地图双击事件 + BMKMapviewDelegate中- mapView: onLongClick:方法监听地图长按事件 + § 地图截图功能 + BMKmapview中 -(UIImage*) takeSnapshot; + § 路径规划增加途经点 + BMKSearch中- (BOOL)drivingSearch: startNode: endCity: endNode: throughWayPoints: + § suggestion搜索支持按城市搜索 + 优化: + § 全面支持iPad + § 优化添加海量annotation逻辑 + § BMKOfflineMap中: + - (BOOL)pasue:(int)cityID; + 改为 + - (BOOL)pause:(int)cityID + § BMKMapview中: + @property (nonatomic) CGPoint compassPositon; + 改为 + @property (nonatomic) CGPoint compassPosition; + § BMKRouteAddrResult结构添加属性: + @synthesize wayPointPoiList; + @synthesize wayPointCityList; + § BMKPlanNode中添加属性: + @synthesize cityName; 添加城市属性 + § BMKSuggestionresult结构添加属性: + @synthesize districtList; 返回区域列表 + 修复: + § 修复与第三方类库冲突的问题 + 修复与gzip、Reachability、png、jpeg、json、xml、sqlite等第三方类库冲突问题 + + + -------------------- + v2.0.2 + 新增: + 1.全新的key验证体系 + + 2.增加短串分享接口 + 1)在BMKType中新增数据结构:BMK_SHARE_URL_TYPE(分享串数据类型) + 2)在BMKSearch中新增接口-(BOOL)poiDetailShareUrl:(NSString*) uid; 发起poi短串搜索 + 3)在BMKSearch中新增接口-(BOOL)reverseGeoShareUrl:(CLLocationCoordinate2D)coor + poiName:(NSString*)name + poiAddress:(NSString*)address; 发起反geo短串搜索 + 4)在BMKSearchDelegate中新增接口-(void)onGetShareUrl:(NSString*) url + withType:(BMK_SHARE_URL_TYPE) urlType + errorCode:(int)error; 返回短串分享url + 3.比例尺控件 + 1)在BMKMapview中新增属性@property (nonatomic) BOOL showMapScaleBar;比例尺是否显示 + 2)在BMKMapview中新增属性@property (nonatomic) CGPoint mapScaleBarPosition;比例尺显示位置 + + 4.定位罗盘效果 + 1)在BMKMapview中新增数据结构:BMKUserTrackingMode(定位模式) + 2)在BMKMapview中新增属性@property (nonattomic) BMKUserTrackingMode userTrackingMode; 设定定位模式 + + 5.驾车避让拥堵策略 + 1)在BMKSearch中新增驾车检索策略常量BMKCarTrafficFIRST = 60,///<驾车检索策略常量:躲避拥堵 + + 6.路径查询增加时间、打车费用结果 + 1)在BMKSearch中新增类:BMKTime(此类代表一个时间段,每个属性都是一个时间段。) + 2)在BMKTransitRoutePlan中新增属性@property (nonatomic) float price; 白天打车估价,单位(元) + 3)在BMKTransitRoutePlan中新增属性@property (nonatomic, retain) BMKTime* time; 方案所用时间 + 4)在BMKRoutePlan中新增属性@property (nonatomic, retain) BMKTime* time; 方案预计的行驶时间 + + 优化: + 1)对在BMKMapview中的接口- (void)removeAnnotations:(NSArray *)annotations;(移除一组标注)进行了优化 + + 修复: + 1)修复离线地图――支持离线包的城市列表中省份下无子城市的问题 + 2)修复前台数据请求后退至后台opengl继续渲染,应用Crash的问题 + + -------------------- + v2.1.0 + 新增: + 1.全面接入LBS.云V2.0,全面开放LBS.云检索能力 + 1)在BMKCloudSearchInfo中新增类BMKBaseCloudSearchInfo,BMKCloudSearchInfo,BMKCloudLocalSearchInfo,BMKCloudNearbySearchInfo,BMKCloudBoundSearchInfo,BMKCloudDetailSearchInfo来存储云检索参数 + 2)在BMKCloudPOIList中新增类BMKCloudPOIList来存储云检索结果 + 3)在BMKCloudSearch中新增数据结构:BMKCloudSearchType(云检索类型) + 4)在BMKCloudSearch中新增接口- (BOOL)localSearchWithSearchInfo:;发起本地云检索 + 5)在BMKCloudSearch中新增接口- (BOOL) nearbySearchWithSearchInfo:;发起周边云检索 + 6)在BMKCloudSearch中新增接口- (BOOL) boundSearchWithSearchInfo:;发起矩形云检索 + 7)在BMKCloudSearch中新增接口- (BOOL) detailSearchWithSearchInfo:;发起详情云检索 + 8)在BMKCloudSearch中新增接口- (void)onGetCloudPoiResult: searchType: errorCode:;返回云检索列表结果 + 9)在BMKCloudSearch中新增接口- (void) onGetCloudPoiDetailResult: searchType: errorCode:;返回云检索详情结果 + 2.增加图片图层BMKGroundOverlay、BMKGroundOverlayView + 1)在BMKGroundOverlay中新增属性@property (nonatomic,assign) CLLocationCoordinate2D pt;两种绘制GroundOverlay的方式之一:绘制的位置地理坐标,与anchor配对使用 + 2)在BMKGroundOverlay中新增属性@property (nonatomic,assign) CGPoint anchor;用位置绘制时图片的锚点,图片左上角为(0.0f,0.0f),向右向下为正 + 3)在BMKGroundOverlay中新增属性@property (nonatomic,assign) BMKCoordinateBounds bound;两种绘制GroundOverlay的方式之二:绘制的地理区域范围,图片在此区域内合理缩放 + 4)在BMKGroundOverlay中新增属性@property(nonatomic, strong) UIImage *icon;绘制图片 + 5)在BMKGroundOverlay中新增接口+(BMKGroundOverlay*)groundOverlayWithPosition:zoomLevel:anchor:icon:;根据指定经纬度坐标生成一个groundOverlay + 6)在BMKGroundOverlay中新增接口+(BMKGroundOverlay*) groundOverlayWithBounds:icon:;根据指定区域生成一个groundOverlay + 3.增加自定义泡泡 + 1)在BMKActionPaopaoView中新增接口- (id)initWithCustomView:(UIView*)customView;泡泡显示View自定义 + 4.增加地图中心点映射屏幕点 + 1)在BMKMapView中新增接口- (void)setMapCenterToScreenPt:;设置地图中心点在地图中的屏幕坐标位置 + 5.增加以手势触摸点中心为基准旋转缩放底图功能和控制开关 + 1)在BMKMapView中新增属性@property(nonatomic, getter=isChangeWithTouchPointCenterEnabled) BOOL ChangeWithTouchPointCenterEnabled;设定地图View能否支持以手势中心点为轴进行旋转和缩放(默认以屏幕中心点为旋转和缩放中心) + 6.增加同时改变地图俯角,旋转角度,缩放比例,中心点接口 + 1)新增类BMKMapStatus来表示地图状态参数 + 2)在BMKMapView中新增接口- (void)setMapStatus:;设置地图状态 + 3)在BMKMapView中新增接口- (void)setMapStatus: withAnimation:;设置地图状态(指定是否需要动画效果) + 4)在BMKMapView中新增接口- (void)setMapStatus: withAnimation: withAnimationTime:;设置地图状态(指定是否需要动画效果+指定动画时间) + 5)在BMKMapView中新增接口- (BMKMapStatus*)getMapStatus;获取地图状态 + 7.增加地图状态改变实时通知 + 1)在BMKMapView中新增接口- (void)mapStatusDidChanged:;地图状态改变完成后会调用此接口 + + 优化: + 1.点击Annotation置顶 + 1)在BMKMapView中新增属性@property (nonatomic, assign) BOOL isSelectedAnnotationViewFront;设定是否总让选中的annotaion置于最前面 + 2.定位脱离MapView + 1)在BMKUserLocation中新增接口-(void)startUserLocationService;打开定位服务 + 2)在BMKUserLocation中新增接口-(void)stopUserLocationService;关闭定位服务 + 3)在BMKUserLocation中新增接口- (void)viewDidGetLocatingUser:;开启定位后,会自动调用此接口返回当前位置的经纬度 + 3.定位图层样式自定义灵活性优化 + 1)新增类BMKLocationViewDisplayParam来存储定位图层自定义参数 + 2)在BMKMapView中新增接口- (void)updateLocationViewWithParam:;动态定制定位图层样式 + + 修复: + 1)修复点击annotation回调长按监听接口- (void)mapview: onLongClick:的问题 + 2)修复TransitRoutePlan中Content属性为空的问题 + 3)修复缩放底图,接口- (void)mapView: regionDidChangeAnimated:不回调的问题 + 4)修复从其他页面返回原页面泡泡被压盖的问题 + 5)解决WiFi无网络信号时首次加载卡屏的问题 + + -------------------- + v2.1.1 + 新增: + 1.新增调启百度地图导航的接口(百度地图导航和Web端导航) + 在BMKNavigation中新增类枚举类型的数据结构BMK_NAVI_TYPE来定义调起导航的两种类型:BMK_NAVI_TYPE_NATIVE(调起客户端导航)和BMK_NAVI_TYPE_WEB(调起web导航) + 在BMKNavigation中新增类NaviPara来管理调起导航时传入的参数 + 在类NaviPara中新增属性@property (nonatomic, retain) BMKPlanNode* startPoint;定义导航的起点 + 在类NaviPara中新增属性@property (nonatomic, retain) BMKPlanNode* endPoint;定义导航的终点 + 在类NaviPara中新增属性@property (nonatomic, assign) BMK_NAVI_TYPE naviType;定义导航的类型 + 在类NaviPara中新增属性@property (nonatomic, retain) NSString* appScheme;定义应用返回scheme + 在类NaviPara中新增属性@property (nonatomic, retain) NSString* appName;定义应用名称 + 在BMKNavigation中新增接口+ (void)openBaiduMapNavigation:;根据传入的参数调启导航 + + 2.几何图形绘制中,增加弧线绘制方法 + 在BMKArcline中新增接口+ (BMKArcline *)arclineWithPoints:;根据指定坐标点生成一段圆弧 + 在BMKArcline中新增接口+ (BMKArcline *)arclineWithCoordinates:;根据指定经纬度生成一段圆弧 + 在类BMKArclineView中新增属性@property (nonatomic, readonly) BMKArcline *arcline;来定义该View对应的圆弧数据对象 + 在BMKArclineView中新增接口- (id)initWithArcline:;根据指定的弧线生成一个圆弧View + + 3.几何图形绘制中,扩增凹多边形绘制能力 + + 4.新增Key验证返回值 + 在BMKMapManager中新增枚举数据类型EN_PERMISSION_STATUS类来定义key验证错误码 + 服务端具体返回的错误码请参见http://developer.baidu.com/map/lbs-appendix.htm#.appendix2 + + 5.新增公交换乘查询中的结果字段 + 在类BMKLine中新增属性@property (nonatomic) int zonePrice;定义路段价格 + 在类BMKLine中新增属性@property (nonatomic) int totalPrice;定义线路总价格 + 在类BMKLine中新增属性@property (nonatomic) int time;定义线路耗时,单位:秒 + 在类BMKRoute中新增属性@property (nonatomic) int time;定义此路段的消耗时间,单位:秒 + + 优化: + 优化Key鉴权认证策略 + 优化几何图形绘制中,折线段绘制末端圆滑 + 提升添加、删除几何图形覆盖物的效率 + 修复: + 修复iOS7系统下,定位图层拖图时卡顿的bug + 修复POI检索结果中,结果页索引始终为0的bug + 修复驾车线路规划中,最后一个节点提示信息有误的bug + -------------------- + v2.2.0 + 新增: + 1. 新增地图多实例能力,开发者可在同一个页面上构建多张相互独立的地图,各地图上的覆盖物互不干扰; + 2. 新增检索多实例能力,开发者可并行发起多个检索来满足自己实际的业务需求 + 由于新增检索多实例能力,因此需要在BMKSearchDelegate的回调中增加searcher参数来表明是哪个检索对象发起的检 索。所以应用检索多实例时需要将检索结果和searcher来进行一一对应。示例如下: + - (void)onGetPoiResult:(BMKSearch*)searcher result:(NSArray*)poiResultListsearchType:(int)type errorCode:(int)error{ + if(searcher==_search){ + NSLog(@"这是_search 对应的POI搜索结果"); + }else if(searcher==_search2){ + NSLog(@"这是_search2对应的POI搜索结果"); + } + } + 3. 新增地图最大、最小缩放等级的控制方法 + 在类BMKMapView中新增属性@property (nonatomic) float minZoomLevel;来设定地图的自定义最小比例尺级别 + 在类BMKMapView中新增属性@property (nonatomic) float maxZoomLevel;来设定地图的自定义最大比例尺级别 + 4. 新增地图操作的手势控制开关 + 在类BMKMapView中新增属性@property(nonatomic, getter=isZoomEnabledWithTap) BOOL zoomEnabledWithTap;来设定地图View能否支持用户单指双击放大地图,双指单击缩小地图 + 在类BMKMapView中新增属性@property(nonatomic, getter=isOverlookEnabled) BOOL overlookEnabled;来设定地图View能否支持俯仰角 + 在类BMKMapView中新增属性@property(nonatomic, getter=isRotateEnabled) BOOL rotateEnabled;来设定地图View能否支持旋转 + + + 修复: + 1. 修复遗留zip库冲突问题 + 2. 解决Documents下的非用户数据上传iCloud的问题 + 3. 修复BMKMapViewDelegate中regionDidChangeAnimated / regionWillChangeAnimated图区变化问题 + -------------------- + v2.2.1 + 修复: + 1. 修复v2.2.0版本覆盖安装后,地图无法正常显示的问题 + 2. 修复地图高级别下,道路名称不显示的问题 + 3. 修复BMKMapManage的stop方法不可用的问题 + 4. 修复setMapStatus中设置地图等级异常的问题 + 5. 修复地图中心点偏移时,拖动地图覆盖物异常的问题 + 6. 修复BMKMapView中手势控制相关的enable属性获取不正确的问题 + 7. 修复与XML库冲突的问题 + -------------------- + v2.3.0 + 新增: + 可根据开发者的实际需求,下载满足需求的定制功能开发包 + 1. 基础地图:包括基本矢量地图、卫星图、实时路况图、离线地图及各种地图覆盖物,此外还包括各种与地图相关的操作和事件监听 + 2. 检索功能:包括POI检索、公交信息查询、路线规划、正向/反向地理编码、在线建议查询、短串分享等功能 + 针对检索业务设计了全新更易用、学习成本更低的程序功能接口 + 3. LBS云检索:提供周边、区域、城市内、详情多种方式检索用户存储在LBS云内的自有数据 + 4. 定位功能:提供便捷的接口,帮助用户快捷获取当前位置信息 + 实现全面升级优化,定位功能可脱离地图单独使用 + 5. 计算工具:包括测距(两点之间地理距离)、坐标转换、调起百度地图导航等功能 + -------------------- + v2.4.0 + 新增: + 基础地图 + 1. 开放热力图绘制能力,帮助用户绘制自有数据热力图; + 在文件BMKHeatMap.h中新增类BMKHeatMapNode来表示热力图数据的单个数据节点 + 在类BMKHeatMapNode中新增属性@property (nonatomic) CLLocationCoordinate2D pt;定义点的位置坐标 + 在类BMKHeatMapNode中新增属性@property (nonatomic) double intensity;定义点的强度权值 + 在BMKHeatMap中新增类BMKHeatMap来存储热力图的绘制数据和自定义热力图的显示样式 + 在类BMKHeatMap中新增属性@property (nonatomic, assign) int mRadius; 设置热力图的柔化半径 + 在类BMKHeatMap中新增属性@property (nonatomic, retain) BMKGradient* mGradient; 设置热力图的渐变色 + 在类BMKHeatMap中新增属性@property (nonatomic, assign) double mOpacity; 设置热力图的透明度 + 在类BMKHeatMap中新增属性@property (nonatomic, retain) NSMutableArray* mData; 设置热力图数据 + 在类BMKMapView中新增方法- (void)addHeatMap:;来添加热力图 + 在类BMKMapView中新增方法- (void)removeHeatMap;来删除热力图 + + 检索功能 + 1. 开放POI的Place详情信息检索能力; + 在BMKPoiSearchOption.h文件中新增poi详情检索信息类BMKPoiDetailSearchOption + 在类 BMKPoiDetailSearchOption中新增属性@property (nonatomic, retain) NSString* poiUid; poi的uid + 在BMKPoiSearchType.h文件中新增poi详情检索结果类BMKPoiDetailResult + 在类BMKPoiSearch中新增方法- (BOOL)poiDetailSearch:;来根据poi uid 发起poi详情检索 + 在BMKPoiSearchDelegate中新增回调- (void)onGetPoiDetailResult: result: errorCode:;来返回POI详情搜索结果 + + 定位功能 + 1. 新增定位多实例,满足开发者在多个页面分别使用定位的需求; + 优化: + 1. 高级别地图下做平移操作时,标注覆盖物移动流畅性优化; + 修复: + 1. 修复相邻地形图图层拼接时,接缝过大的问题; + 2. 修复检索内存泄露的问题; + 3. 修复定位图层内存泄露的问题; + -------------------- + v2.4.1 + 优化: + 1. 优化底图相关的内存使用问题; + + -------------------- + v2.5.0 + 使用Xcode6创建工程时注意事项如下: + 在info.plist中添加:Bundle display name (Xcode6新建的项目没有此配置,若没有会造成manager start failed) + 【 新 增 】 + 1. 新增对arm64 CPU架构的适配; + 基础地图 + 1. 新增对iPhone6、iPhone6 plus的屏幕适配; + 定位功能 + 1. 新增对iOS8定位的适配; + 在使用SDK为您提供的定位功能时,注意事项如下: + 需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): + NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述 + NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述 + 【 修 复 】 + 修复Tabber控制器中使用定位弹出框异常的问题; + 修复scrollenable=no,仍可以移动地图的问题; + 修复多边形在特定坐标下显示异常问题; + 修复定位时间戳错误的问题; + 修复autolayout时,BMKMapView横屏时无法自动扩展的问题; + 修复从B页返回到A页后,在A页的viewWillAppear方法中setCenterCoordinate无效的问题; + + -------------------- + v2.6.0 + 注意:新版本开发包头文件中部分接口和枚举类型有变更,请确保使用最新版本的头文件。 + 【 变 更 】 + 定位功能 + 1、修改BMKLocationServiceDelegate: + - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation; //修改用户位置更新后的回调 + + 【 新 增 】 + 基础地图 + 1. 地图类型修改为:enum { + BMKMapTypeStandard = 1, ///<标准地图 + BMKMapTypeSatellite = 2, ///<卫星地图 + }; + typedefNSUIntegerBMKMapType; + 2. 在类BMKMapView中新增: + 属性:baiduHeatMapEnabled,设定地图是否打开百度城市热力图图层(百度自有数据) + 接口:- isSurpportBaiduHeatMap,判断当前图区是否支持百度热力图 + 属性:buildingsEnabled ,设定地图是否现实3D楼块效果 + 属性:trafficEnabled, 设定地图是否打开路况图层 + 接口:- (void)showAnnotations: animated:,设置地图使显示区域显示所有annotations + 接口:+(void)willBackGround,当应用即将后台时调用,停止一切调用opengl相关的操作 + 接口:+(void)didForeGround,当应用恢复前台状态时调用 + 3. 在类BMKMapViewDelegate中新增接口: + - (void)mapViewDidFinishLoading: 地图初始化完毕时会调用 + - (void)mapView: onDrawMapFrame: 地图渲染每一帧画面过程中(地图更新)会调用 + 4. 在BMKGroundOverlay.h中新增透明度设置属性: alpha + 5. 新增虚线绘制样式polyline/polygon的边框/circle的边框均可设定为虚线样式并指定颜色,自定义overlay也可在glrender中实现。 + 新增资源: + 在mapapi.bundle的images文件夹中增加lineDashTexture.png,用于生成虚线纹理 + 新增属性: + 在BMKOverlayGLBaseView.h中,@propertyBOOLlineDash;// 是否为虚线样式 + 在BMKOverlayView.h中新增方法: + -(void)renderLinesWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount + strokeColor:(UIColor *)strokeColor + lineWidth:(CGFloat)lineWidth + looped:(BOOL)looped + lineDash:(BOOL)lineDash; + 注:该方法再BMKPolylineView/BMKPolygonView/BMKCircleView绘制中会自动调用,用户自定义view也可以调用这个方法实线虚线样式。 + 6. 新增自定义纹理绘制线:polyline/polygon的边框/circle的边框均可设定指定纹理,自定义overlay也可在glrender中实现。 + 在BMKOverlayView.h中新增属性: + @property (nonatomic, readonly) GLuintstrokeTextureID;//关联的纹理对象ID + 在BMKOverlayView.h中新增方法: + -(GLuint)loadStrokeTextureImage:(UIImage *)textureImage; + + 定位功能 + 1、在BMKLocationService新增接口: + +setLocationDistanceFilter: //设置定位的最小更新距离(米) + +getCurrentLocationDistanceFilter //获取定位的最小更新距离(米) + +setLocationDesiredAccuracy: //设置定位精准度 + +getCurrentLocationDesiredAccuracy //获取定位精准度 + + 【 优 化 】 + 1. SDK配置使用ARC; + 2. 更新鉴权错误码; + + 【 修 复 】 + 1. 修复定位服务中,开启定位和停止定位没有成对使用造成的问题; + 2. 修复使用circleWithCenterCoordinate:radius:画圆时半径误差偏大的问题; + 3. 修复在6plus上标注显示过小的问题; + 4. 修复annotation拖拽结束后向下偏移的问题; + + + -------------------- + v2.7.0 + 自当前版本起,百度地图iOS SDK推出 .framework形式的开发包。此种类型的开发包配置简单、使用方便,欢迎开发者选用! + 【 新 增 】 +  基础地图 + 1. 增加地图缩放等级到20级(10米); + 2. 新增地理坐标与OpenGL坐标转换接口: + BMKMapView新增接口: + - (CGPoint)glPointForMapPoint:(BMKMapPoint)mapPoint;//将BMKMapPoint转换为opengles可 以直接使用的坐标 + - (CGPoint *)glPointsForMapPoints:(BMKMapPoint *)mapPoints count:(NSUInteger)count;// 批量将BMKMapPoint转换为opengles可以直接使用的坐标 + 3. 开放区域截图能力: + BMKMapView新增接口: + - (UIImage*)takeSnapshot:(CGRect)rect;// 获得地图区域区域截图 + +  检索功能 + 1. 开放驾车线路规划,返回多条线路的能力; + BMKDrivingRouteResult中,routes数组有多条数据,支持检索结果为多条线路 + 2. 驾车线路规划结果中,新增路况信息字段: + BMKDrivingRoutePlanOption新增属性: + ///驾车检索获取路线每一个step的路况,默认使用BMK_DRIVING_REQUEST_TRAFFICE_TYPE_NONE + @property (nonatomic) BMKDrivingRequestTrafficType drivingRequestTrafficType; + BMKDrivingStep新增属性: + ///路段是否有路况信息 + @property (nonatomic) BOOL hasTrafficsInfo; + ///路段的路况信息,成员为NSNumber。0:无数据;1:畅通;2:缓慢;3:拥堵 + @property (nonatomic, strong) NSArray* traffics; + 3.废弃接口: + 2.7.0开始,BMKDrivingRouteLine中,废弃属性:isSupportTraffic + +  计算工具 + 1. 新增点与圆、多边形位置关系判断方法: + 工具类(BMKGeometry.h)中新增接口: + //判断点是否在圆内 + UIKIT_EXTERN BOOL BMKCircleContainsPoint(BMKMapPoint point, BMKMapPoint center, double radius); + UIKIT_EXTERN BOOL BMKCircleContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D center, double radius); + //判断点是否在多边形内 + UIKIT_EXTERN BOOL BMKPolygonContainsPoint(BMKMapPoint point, BMKMapPoint *polygon, NSUInteger count); + UIKIT_EXTERN BOOL BMKPolygonContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D *polygon, NSUInteger count); + 2. 新增获取折线外某点到这线上距离最近的点: + 工具类(BMKGeometry.h)中新增接口: + UIKIT_EXTERN BMKMapPoint BMKGetNearestMapPointFromPolyline(BMKMapPoint point, BMKMapPoint* polyline, NSUInteger count); + 3、新增计算地理矩形区域的面积 + 工具类(BMKGeometry.h)中新增接口: + UIKIT_EXTERN double BMKAreaBetweenCoordinates(CLLocationCoordinate2D leftTop, CLLocationCoordinate2D rightBottom); + + 【 优 化 】 + 1. 减少首次启动SDK时的数据流量; + 2. 减少协议优化升级; + 3. 优化Annotation拖拽方法(长按后开始拖拽); + + 【 修 复 】 + 1. 修复在线地图和离线地图穿插使用时,地图内存不释放的bug; + 2. 修复云检索过程中偶现崩溃的bug; + 3. 修复地图在autolayout布局下无效的bug; + 4. 修复BMKAnnotationView重叠的bug; + + + -------------------- + v2.8.0 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。 + + 【 新 增 】 +  周边雷达 + 利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能。 + 新增周边雷达管理类:BMKRadarManager + 新增周边雷达protocol:BMKRadarManagerDelegate + 1.提供单次位置信息上传功能; + - (BOOL)uploadInfoRequest:(BMKRadarUploadInfo*) info; + 2.提供位置信息连续自动上传功能; + - (void)startAutoUpload:(NSTimeInterval) interval;//启动自动上传用户位置信息 + - (void)stopAutoUpload;//停止自动上传用户位置信息 + 3.提供周边位置信息检索功能; + - (BOOL)getRadarNearbySearchRequest:(BMKRadarNearbySearchOption*) option; + 4.提供清除我的位置信息功能 + - (BOOL)clearMyInfoRequest; + +  基础地图 + 1.新增折线多段颜色绘制能力; + 1)BMKPolyline中新增接口: + ///纹理索引数组 + @property (nonatomic, strong) NSArray *textureIndex; + //分段纹理绘制,根据指定坐标点生成一段折线 + + (BMKPolyline *)polylineWithPoints:(BMKMapPoint *)points count:(NSUInteger)count textureIndex:(NSArray*) textureIndex; + //根据指定坐标点生成一段折线 + + (BMKPolyline *)polylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count textureIndex:(NSArray*) textureIndex; + 2)BMKPolylineView新增接口 + /// 是否分段纹理绘制(突出显示) + @property (nonatomic, assign) BOOL isFocus; + 2.可以修改BMKPolyline、BMKPolygon、BMKCircle、BMKArcline的端点数据了 + 3.新增地图强制刷新功能: + BMKMapView新增接口: + - (void)mapForceRefresh;//强制刷新mapview + +  检索功能 + 1.在线建议检索结果开放POI经纬度及UID信息; + BMKSuggestionResult新增接口: + ///poiId列表,成员是NSString + @property (nonatomic, strong) NSArray* poiIdList; + ///pt列表,成员是:封装成NSValue的CLLocationCoordinate2D + @property (nonatomic, strong) NSArray* ptList; + 2.更新检索状态码 + BMKSearchErrorCode中新增: + BMK_SEARCH_NETWOKR_ERROR,///网络连接错误 + BMK_SEARCH_NETWOKR_TIMEOUT,///网络连接超时 + BMK_SEARCH_PERMISSION_UNFINISHED,///还未完成鉴权,请在鉴权通过后重试 + +  计算工具 + 1.新增调启百度地图客户端功能; + 1)调起百度地图客户端 – poi调起 + 新增调起百度地图poi管理类:BMKOpenPoi + //调起百度地图poi详情页面 + + (BMKOpenErrorCode)openBaiduMapPoiDetailPage:(BMKOpenPoiDetailOption *) option; + //调起百度地图poi周边检索页面 + + (BMKOpenErrorCode)openBaiduMapPoiNearbySearch:(BMKOpenPoiNearbyOption *) option; + 2)调起百度地图客户端 – 路线调起 + 新增调起百度地图路线管理类类:BMKOpenRoute + //调起百度地图步行路线页面 + + (BMKOpenErrorCode)openBaiduMapWalkingRoute:(BMKOpenWalkingRouteOption *) option; + //调起百度地图公交路线页面 + + (BMKOpenErrorCode)openBaiduMapTransitRoute:(BMKOpenTransitRouteOption *) option; + //调起百度地图驾车路线检索页面 + + (BMKOpenErrorCode)openBaiduMapDrivingRoute:(BMKOpenDrivingRouteOption *) option; + 2.新增本地收藏夹功能; + 新增收藏点信息类:BMKFavPoiInfo + 新增收藏点管理类:BMKFavPoiManager + 新增接口: + //添加一个poi点 + - (NSInteger)addFavPoi:(BMKFavPoiInfo*) favPoiInfo; + //获取一个收藏点信息 + - (BMKFavPoiInfo*)getFavPoi:(NSString*) favId; + //获取所有收藏点信息 + - (NSArray*)getAllFavPois; + //更新一个收藏点 + - (BOOL)updateFavPoi:(NSString*) favIdfavPoiInfo:(BMKFavPoiInfo*) favPoiInfo; + //删除一个收藏点 + - (BOOL)deleteFavPoi:(NSString*) favId; + //清空所有收藏点 + - (BOOL)clearAllFavPois; + + 【 修 复 】 + 1、修复setMinLevel、setMaxLevel生效的是整型的问题; + 2、修复setRegion精准度不高的问题; + 3、修复POI检索结果,pageNum不正确的问题; + 4、修复定位结果海拔始终为0的问题; + 5、修复反地理编码检索在特定情况下,收不到回调的问题; + + + -------------------- + v2.8.1 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自V2.8.1后,百度地图iOS SDK将不再提供 .a形式的开发包。 + + 【 修 复 】 + 修复了升级IOS 9 beta 3系统后闪退的问题 + + 【 提 示 】 + 1、由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用。 + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + 2、如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。 + LSApplicationQueriesSchemes + + baidumap + + + + -------------------- + v2.9.0 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【 新版提示 】 + 1.自v2.9.0起,将启用新的地图资源服务,旧地图离线包在新版上不可使用;同时官方不再支持地图离线包下载,所以v2.9.0起,去掉“手动离线导入接口”,SDK离线下载接口维持不变。 + 2.自v2.9.0起,iOS SDK采用分包形式,旧包无法与新包同时混用,请将之前所有旧包(包含bundle资源)并全部替换为新包。 + 3.自v2.9.0起,iOS SDK使用新的矢量地图样式,地图显示更加清新,和百度地图客户端保持一致 + + 【 新 增 / 废 弃 】 +  基础地图 + 1.适配iOS 9和 iPhone 6s + 2.新增点聚合功能开源 + 增加点聚合功能,并在demo中开放源代码,具体请参考demo + 3.支持线绘制功能扩展:支持纹理图片平铺绘制,缩放,分段颜色设置 + BMKOverlayGLBasicView新增属性: + /// 是否纹理图片平铺绘制,默认NO + @property (assign, nonatomic) BOOL tileTexture; + /// 纹理图片是否缩放(tileTexture为YES时生效),默认NO + @property (assign, nonatomic) BOOL keepScale; + BMKOverlayView新增属性: + /// 使用分段颜色绘制时,必须设置(内容必须为UIColor) + @property (nonatomic, strong) NSArray *colors; + 4.支持底图标注控制 + BMKMapView 新增属性: + ///设定地图是否显示底图poi标注,默认YES + @property(nonatomic, assign) BOOL showMapPoi; + 5.新增TileOverlay图层,分为离线、在线tileOverlay绘制(使用方法请参考demo)。 + 新增类: BMKTileLayer、BMKURLTileLayer、BMKSyncTileLayer、BMKTileLayerView + 6.BMKMapStatus新增只读属性:visibleMapRect + 7.BMKOfflineMap废弃扫描导入离线包接口,不再支持离线包导入 + 废弃接口: + - (BOOL)scan:(BOOL)deleteFailedr __deprecated_msg("废弃方法(空实现),自2.9.0起废弃,不支持扫描导入离线包"); + 8.更新离线城市BMKOLUpdateElement status状态 + +  检索功能 + 反geo检索结果新增商圈 + BMKReverseGeoCodeResult新增属性: + ///商圈名称 + @property (nonatomic, strong) NSString* businessCircle; + +  定位功能 + 废弃接口(空实现): + + (void)setLocationDistanceFilter:(CLLocationDistance) distanceFilter __deprecated_msg("废弃方法 (空实现),使用distanceFilter属性替换"); + + (CLLocationDistance)getCurrentLocationDistanceFilter __deprecated_msg("废弃方法(空实现),使用distanceFilter属性替换"); + + (void)setLocationDesiredAccuracy:(CLLocationAccuracy) desiredAccuracy __deprecated_msg("废弃方法(空实现),使用desiredAccuracy属性替换"); + + (CLLocationAccuracy)getCurrentLocationDesiredAccuracy __deprecated_msg("废弃方法(空实现),使用desiredAccuracy属性替换"); + 新增属性: + /// 设定定位的最小更新距离。默认为kCLDistanceFilterNone + @property(nonatomic, assign) CLLocationDistance distanceFilter; + /// 设定定位精度。默认为kCLLocationAccuracyBest。 + @property(nonatomic, assign) CLLocationAccuracy desiredAccuracy; + /// 设定最小更新角度。默认为1度,设定为kCLHeadingFilterNone会提示任何角度改变。 + @property(nonatomic, assign) CLLocationDegrees headingFilter; + /// 指定定位是否会被系统自动暂停。默认为YES。只在iOS 6.0之后起作用。 + @property(nonatomic, assign) BOOL pausesLocationUpdatesAutomatically; + ///指定定位:是否允许后台定位更新。默认为NO。只在iOS 9.0之后起作用。设为YES时,Info.plist中 UIBackgroundModes 必须包含 "location" + @property(nonatomic, assign) BOOL allowsBackgroundLocationUpdates; + + 【 修 复 】 + 1、修复不加载@3x图片的问题; + 2、修复公交路线规划,换乘方案内容缺失的问题; + 3、修复iOS 8.2系统版本以前,AnnotationView 中加入约束会卡住的问题; + 4、修复使用xcode 7编译时SDK产生的编译警告; + 5、修复BMKMapView在特定的使用条件下crash的问题 + + + -------------------- + v2.9.1 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【新版提示】 + 1.自V2.9.0起,将启用新的地图资源服务,旧地图离线包在新版上不可使用;同时官方不再支持地图离线包下载,所以V2.9.0起,去掉“手动离线导入接口”,SDK离线下载接口维持不变。 + 2.自V2.9.0起,iOS SDK采用分包形式,旧包无法与新包同时混用,请将之前所有旧包(包含bundle资源)并全部替换为新包。 + 3.自V2.9.0起,iOS SDK使用新的矢量地图样式,地图显示更加清新,和百度地图客户端保持一致 + + + 【 新 增 】 +  检索功能 + 1、新增类:BMKPoiAddressInfo(POI门址信息类) + 2、BMKPoiResult新增接口: + ///是否返回的有门址信息列表 + @property (nonatomic, assign) BOOL isHavePoiAddressInfoList; + ///门址信息列表,成员是BMKPoiAddrsInfo(当进行的是poi城市检索,且检索关键字是具体的门址信息(如在北京搜"上地十街10号")时,会返回此信息) + @property (nonatomic, strong) NSArray* poiAddressInfoList; + + 【 修 复 】 + 1、修复iOS9后台定位问题; + 2、修复sug检索特殊case引起的crash的问题; + 3、修复自定义AnnotationView,启用3D效果后(enabled3D=YES)点击标注没有响应的问题; + 4、修复获取离线地图包大小信息时,包大小错误的问题。 + + + -------------------- + v2.10.0 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【 新版提示 】 + 1.自v2.9.0起,将启用新的地图资源服务,旧地图离线包在新版上不可使用;同时官方不再支持地图离线包下载,所以v2.9.0起,去掉“手动离线导入接口”,SDK离线下载接口维持不变。 + 2.自v2.9.0起,iOS SDK采用分包形式,旧包无法与新包同时混用,请将之前所有旧包(包含bundle资源)并全部替换为新包。 + 3.自v2.9.0起,iOS SDK使用新的矢量地图样式,地图显示更加清新,和百度地图客户端保持一致 + + 【 新 增 / 废 弃 】 +  基础地图 + 1、新增3D-Touch的回调 + BMKMapView 新增属性: + /// 设定地图是否回调force touch事件,默认为NO,仅适用于支持3D Touch的情况,开启后会回调 - mapview:onForceTouch:force:maximumPossibleForce: + @property(nonatomic) BOOL forceTouchEnabled; + BMKMapViewDelegate 新增: + - (void)mapview:(BMKMapView *)mapView onForceTouch:(CLLocationCoordinate2D)coordinate force:(CGFloat)force maximumPossibleForce:(CGFloat)maximumPossibleForce; + 2、新增个性化地图模板,支持黑夜模式、清新蓝等风格地图 + BMKMapView 新增方法: + + (void)customMapStyle:(NSString*) customMapStyleJsonFilePath; + 3、新增设置地图边界区域的方法: + BMKMapView 新增属性: + ///地图预留边界,默认:UIEdgeInsetsZero。设置后,会根据mapPadding调整logo、比例尺、指南针的位置,以及targetScreenPt(BMKMapStatus.targetScreenPt) + @property (nonatomic) UIEdgeInsets mapPadding; + 4、开放显示21级地图,但不支持卫星图、热力图、交通路况图层的21级地图。 + 5、BMKMapType新增BMKMapTypeNone类型:不加载百度地图瓦片,显示为空白地图。和瓦片图功能配合使用,减少加载数据 + 6、新增限制地图的显示范围的方法 + BMKMapView 新增属性: + @property (nonatomic) BMKCoordinateRegion limitMapRegion; + 7、支持自定义百度logo位置,共支持6个位置,使用枚举类型控制显示的位置 + BMKMapView 新增属性: + @property (nonatomic) BMKLogoPosition logoPosition; + 8、新增禁用所有手势功能 + BMKMapView 新增属性: + @property(nonatomic) BOOL gesturesEnabled; + 9、新增获取指南针大小的方法,并支持更换指南针图片 + BMKMapView 新增属性、方法: + @property (nonatomic, readonly) CGSize compassSize; + - (void)setCompassImage:(UIImage *)image; + 10、新增获取比例尺大小的方法 + BMKMapView 新增属性: + /// 比例尺的宽高 + @property (nonatomic, readonly) CGSize mapScaleBarSize; + 11、增加自定义定位精度圈的填充颜色和边框 + BMKLocationViewDisplayParam 新增属性: + ///精度圈 填充颜色 + @property (nonatomic, strong) UIColor *accuracyCircleFillColor; + ///精度圈 边框颜色 + @property (nonatomic, strong) UIColor *accuracyCircleStrokeColor; + 12、新增获取矩形范围内所有marker点的方法 + BMKMapView 新增方法: + - (NSArray *)annotationsInCoordinateBounds:(BMKCoordinateBounds) bounds; + 13、BMKMapView废弃接口: + +(void)willBackGround;//逻辑由地图SDK控制 + +(void)didForeGround;//逻辑由地图SDK控制 + +  检索功能 + 1、新增骑行规划检索 + BMKRouteSearch 新增骑行路线检索方法: + - (BOOL)ridingSearch:(BMKRidingRoutePlanOption*) ridingRoutePlanOption; + BMKRouteSearchDelegate 新增返回骑行检索结果回调: + - (void)onGetRidingRouteResult:(BMKRouteSearch*)searcher result:(BMKRidingRouteResult*)result errorCode:(BMKSearchErrorCode)error; + 新增类: + BMKRidingRoutePlanOption 骑行查询基础信息类 + BMKRidingRouteResult 骑行路线结果类 + 2、新增行政区边界数据检索 + 新增类: + BMKDistrictSearch 行政区域搜索服务类 + BMKDistrictSearchDelegate 行政区域搜索结果Delegate + BMKDistrictSearchOption 行政区域检索信息类 + BMKDistrictResult 行政区域检索结果类 + 3、新增驾车、公交、骑行、步行路径规划短串分享检索 + BMKShareURLSearch 新增获取路线规划短串分享方法: + - (BOOL)requestRoutePlanShareURL:(BMKRoutePlanShareURLOption *)routePlanShareUrlSearchOption; + BMKShareURLSearchDelegate 新增返回路线规划分享url结果回调: + - (void)onGetRoutePlanShareURLResult:(BMKShareURLSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error; + +  计算工具 + 支持调起百度地图客户端骑行、步行导航功能(百度地图App 8.8 以上版本支持) + BMKNavigation 新增方法: + //调起百度地图客户端骑行导航页面 + + (BMKOpenErrorCode)openBaiduMapRideNavigation:(BMKNaviPara*)para; + //调起百度地图客户端步行导航页面 + + (BMKOpenErrorCode)openBaiduMapWalkNavigation:(BMKNaviPara*)para; + + 【 修 复 】 + 1、修复只使用检索时,首次鉴权失败(网络问题),再次发起鉴权无效的问题 + 2、修复使用地图前使用离线地图,首次安装应用地图白屏的问题 + 3、修复拖拽地图时,点击到标注,会触发didSelectAnnotationView:的回调,不回调regionDidChangeAnimated的问题 + 4、修复BMKTransitStep 里的stepType中地铁和公交未做区分的问题 + + + -------------------- + -------------------- + v2.10.2 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【 新版提示 】 + 1.自v2.9.0起,将启用新的地图资源服务,旧地图离线包在新版上不可使用;同时官方不再支持地图离线包下载,所以v2.9.0起,去掉“手动离线导入接口”,SDK离线下载接口维持不变。 + 2.自v2.9.0起,iOS SDK采用分包形式,旧包无法与新包同时混用,请将之前所有旧包(包含bundle资源)并全部替换为新包。 + 3.自v2.9.0起,iOS SDK使用新的矢量地图样式,地图显示更加清新,和百度地图客户端保持一致 + + 【 新 增 】 +  基础地图 + 1、新增个性化地图道路文字颜色设置(包括高速及国道、城市主路、普通道路) + + 【 变 更 】 +  检索功能 + 1、行政区边界数据检索:为兼容不连续的行政区,行政区边界数据检索结果(BMKDistrictResult),行政区边界坐标点变更为: + /// 行政区边界直角地理坐标点数据(NSString数组,字符串数据格式为: @"x,y;x,y") + @property (nonatomic, strong) NSArray *paths; + 原接口作废 + + 【 优 化 】 + 1、优化瓦片图性能:支持同时下载多张瓦片图、优化下载中断的重加载机制 + + 【 修 复 】 + 1、修复sug检索某些特殊case,city、district为空的情况 + 2、修复同步瓦片图内存问题 + 3、修复在iOS6运行crash的问题 + 4、修复 CVHttpResponse::ReadData 极其偶现的crash + 5、修复某些case下,点击polyline不会回调的问题 + 6、修复调起客户端驾车导航后,关闭导航后,不会弹出“是否返回原应用”提示的问题 + + -------------------- + v3.0.0 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【 新版提示 】 + 1.自v3.0.0起,iOS SDK全面支持ipv6网络 + + 【 新 增 】 +  基础地图 + 1、新增室内地图功能 + 新增室内地图信息类:BMKBaseIndoorMapInfo + BMKMapView新增接口: + /// 设定地图是否显示室内图(包含室内图标注),默认不显示 + @property (nonatomic, assign) BOOL baseIndoorMapEnabled; + /// 设定室内图标注是否显示,默认YES,仅当显示室内图(baseIndoorMapEnabled为YES)时生效 + @property (nonatomic, assign) BOOL showIndoorMapPoi; + // 设置室内图楼层 + - (BMKSwitchIndoorFloorError)switchBaseIndoorMapFloor:(NSString*)strFloor withID:(NSString*)strID; + // 获取当前聚焦的室内图信息 + - (BMKBaseIndoorMapInfo*)getFocusedBaseIndoorMapInfo; + BMKMapViewDelegate新增接口: + //地图进入/移出室内图会调用此接口 + - (void)mapview:(BMKMapView *)mapView baseIndoorMapWithIn:(BOOL)flag baseIndoorMapInfo:(BMKBaseIndoorMapInfo *)info; + 2、普通地图与个性化地图切换可以自由切换,BMKMapView新增接口: + + (void)enableCustomMapStyle:(BOOL) enable; + 3、个性化地图配置json文件出错时,打印log提示 + 4、设置mapPadding时可控制地图中心是否跟着移动,BMKMapView新增接口: + @property (nonatomic) BOOL updateTargetScreenPtWhenMapPaddingChanged; + 5、BMKMapPoi中新增属性: + ///点标注的uid,可能为空 + @property (nonatomic,strong) NSString* uid; + +  检索功能 + 1、新增室内POI检索 + 新增室内POI检索参数信息类:BMKPoiIndoorSearchOption + 新增室内POI搜索结果类:BMKPoiIndoorResult + 新增室内POI信息类:BMKPoiIndoorInfo + BMKPoiSearch新增接口: + //poi室内检索 + - (BOOL)poiIndoorSearch:(BMKPoiIndoorSearchOption*)option; + BMKPoiSearchDelegate新增接口: + //返回POI室内搜索结果 +- (void)onGetPoiIndoorResult:(BMKPoiSearch*)searcher result:(BMKPoiIndoorResult*)poiIndoorResult errorCode:(BMKSearchErrorCode)errorCode; + 2、驾车路线规划结果新增3个属性:打车费用信息、拥堵米数、红路灯个数,BMKDrivingRouteLine新增接口: + ///路线红绿灯个数 + @property (nonatomic, assign) NSInteger lightNum; + ///路线拥堵米数,发起请求时需设置参数 drivingRequestTrafficType = BMK_DRIVING_REQUEST_TRAFFICE_TYPE_PATH_AND_TRAFFICE 才有值 + @property (nonatomic, assign) NSInteger congestionMetres; + ///路线预估打车费(元),负数表示无打车费信息 + @property (nonatomic, assign) NSInteger taxiFares; + 3、busline检索新增参考票价和上下线行信息,BMKBusLineResult新增接口: + ///公交线路方向 + @property (nonatomic, strong) NSString* busLineDirection; + ///起步票价 + @property (nonatomic, assign) CGFloat basicPrice; + ///全程票价 + @property (nonatomic, assign) CGFloat totalPrice; + 4、poi检索结果新增是否有全景信息,BMKPoiInfo新增接口: + @property (nonatomic, assign) BOOL panoFlag; + +  计算工具 + 新增调起百度地图客户端全景功能 + 新增调起百度地图全景类:BMKOpenPanorama + 新增调起百度地图全景参数类:BMKOpenPanoramaOption + 新增调起百度地图全景delegate:BMKOpenPanoramaDelegate + + + 【 修 复 】 + 1、修复反复添加移除离线瓦片图时偶现的crash问题 + 2、修复上传AppStore时提示访问私有api:-setOverlayGeometryDelegate:的问题 + 3、修复地图网络解析时偶现的crash问题 + + + -------------------- +v3.1.0 + + 注:百度地图iOS SDK向广大开发者提供了配置更简单的 .framework形式的开发包,请开发者选择此种类型的开发包使用。自v2.9.0起,百度地图iOS SDK将不再提供 .a形式的开发包。 + 自v2.9.0起,采用分包的形式提供 .framework包,请广大开发者使用时确保各分包的版本保持一致。其中BaiduMapAPI_Base.framework为基础包,使用SDK任何功能都需导入,其他分包可按需导入。 + + 【 新 增 】 +  基础地图 + 1、开放高清4K地图显示(无需设置) + 2、瓦片图新增异步加载方法: + 新增异步加载类:BMKAsyncTileLayer + 3、新增地图渲染完成回调方法: + - (void)mapViewDidFinishRendering:(BMKMapView *)mapView; + 4、新增定位显示类型:BMKUserTrackingModeHeading(在普通定位模式的基础上显示方向) + +  检索功能 + 1、新增室内路径规划 + BMKRouteSearch新增发起室内路径规划接口: + - (BOOL)indoorRoutePlanSearch:(BMKIndoorRoutePlanOption*) indoorRoutePlanOption; + BMKRouteSearchDelegate新增室内路径规划结果回调: + - (void)onGetIndoorRouteResult:(BMKRouteSearch*)searcher result:(BMKIndoorRouteResult*)result errorCode:(BMKSearchErrorCode)error; + 新增室内路径规划检索参数类:BMKIndoorRoutePlanOption + 新增室内路径规划检索结果类:BMKIndoorRouteResult + 2、增加新的公共交通线路规划(支持同城和跨城) + BMKRouteSearch增加新的公共交通线路规划接口: + - (BOOL)massTransitSearch:(BMKMassTransitRoutePlanOption*)routePlanOption; + BMKRouteSearchDelegate增加新的公共交通线路规划结果回调: + - (void)onGetMassTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKMassTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error; + 增加新的公共交通线路规划检索参数类:BMKMassTransitRoutePlanOption + 增加新的公共交通线路规划检索结果类:BMKMassTransitRouteResult + +  LBS云检索 + 1、新增云RGC检索功能 + BMKCloudSearch新增发起云RGC检索接口: + - (BOOL)cloudReverseGeoCodeSearch:(BMKCloudReverseGeoCodeSearchInfo*)searchInfo; + BMKCloudSearchDelegate新增云RGC检索结果回调: + - (void)onGetCloudReverseGeoCodeResult:(BMKCloudReverseGeoCodeResult*)cloudRGCResult searchType:(BMKCloudSearchType) type errorCode:(NSInteger) errorCode; + 新增云RGC检索参数类:BMKCloudReverseGeoCodeSearchInfo + 新增云RGC检索结果类:BMKCloudReverseGeoCodeResult + + 【 优 化 】 + 1、优化Marker加载性能:添加Marker和加载大量Marker时,性能大幅提高。 + 2、优化地图内存 + + 【 修 复 】 + 1、长按地图某区域,OnLongClick会被不停调用的问题 + 2、绘制弧线,特殊case提示画弧失败的问题 + 3、一次点击事件,点击地图空白处回调和点击覆盖物回调都会调用的问题 + + + -------------------- + v3.2.0 + + 注:自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下)。 + + 【 新版提示 】 + 1、自v3.2.0起,全面支持HTTPS + 2、自v3.2.0起,地图引擎全面升级,主要升级特征有: + 渲染架构技术升级,OpenGL ES从1.0升级到2.0 + 地图数据加载升级,加载性能大幅提升 + + 【 新 增 】 +  检索功能 + 1、建议检索支持港澳台;建议检索可控制只返回指定城市的检索结果 + BMKSuggestionSearchOption新增属性: + ///是否只返回指定城市检索结果(默认:NO)(提示:海外区域暂不支持设置cityLimit) + @property (nonatomic, assign) BOOL cityLimit; + 2、反地址编码结果BMKReverseGeoCodeResult新增属性: + ///结合当前位置POI的语义化结果描述 + @property (nonatomic, strong) NSString* sematicDescription; + + 【 优 化 】 + 1、建议检索和反地址编码检索服务升级,提供更加优质的服务 + + 【 修 复 】 + 1、修复国外定位偏移的问题 + 2、修复特殊情况下,移除BMKGroundOverlay时的问题 + + + -------------------- + v3.2.1 + + 注:自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下)。 + + 【 新版提示 】 + 1、自v3.2.0起,全面支持HTTPS + 2、自v3.2.0起,地图引擎全面升级,主要升级特征有: + 渲染架构技术升级,OpenGL ES从1.0升级到2.0 + 地图数据加载升级,加载性能大幅提升 + + 【 修 复 】 + 修复下载离线地图时,delegate方法返回state错误问题 + + + -------------------- + v3.3.0 + + +注:自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下)。 + + 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //下载最新地图SDK + + 【 新 增 】 + [ 基 础 地 图 ] + 3D地图下,增加显示天空效果,无需设置 + + [ 工 具 ] + 1.全面支持GCJ02坐标输入/输出,全局设置方法如下: + [BMKMapManager setCoordinateTypeUsedInBaiduMapSDK:BMK_COORDTYPE_COMMON];//默认为BD09LL坐标,且此方法仅在国内生效,国外均为WGS84坐标 + + 2. 新增调启步行AR导航接口:openBaiduMapwalkARNavigation + + [ LBS云] + 云检索中,keywords 改为非必填项 + + 【 优 化 】 + 优化个性化地图元素分类 + + 【 修 复 】 + 少部分地铁线及室内图无法显示问题(v3.2.0引入的问题)。 + 未下载全国离线基础包时,离线状态下全国(球)地图显示异常。 + + -------------------- + v3.3.1 + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //下载最新地图SDK + + 【 新 增 】 + [ 检 索 ] + 逆地理编码返回结果新增2个属性:cityCode(城市编码) 和adCode(行政区域编码) + + 【 优 化 】 + 1.增加重试机制,优化鉴权时长 + 2.解决Xcode8.3编译时出现大量warning的问题 + 3.swift Demo:swift语言升级为 swift v3.1,优化升级swift Demo。 + + -------------------- + v3.3.2 + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + + + + *********************/ +/** + *获取当前地图API的版本号 + *return 返回当前API的版本号 + */ +UIKIT_STATIC_INLINE NSString* BMKGetMapApiVersion() +{ + return @"3.3.2"; +} + +/** + *获取当前地图API base组件 的版本号 + *当前base组件版本 : 3.3.2 + *return 返回当前API base组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiBaseComponentVersion(); + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/readme.txt new file mode 100644 index 0000000..7f57562 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/readme.txt @@ -0,0 +1,51 @@ + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/BaiduMapAPI_Cloud b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/BaiduMapAPI_Cloud new file mode 100644 index 0000000..61f640e Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/BaiduMapAPI_Cloud differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudPOIList.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudPOIList.h new file mode 100644 index 0000000..041416f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudPOIList.h @@ -0,0 +1,129 @@ +/* + * BMKCloudPOIList.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import + +/// 云检索结果列表类 +@interface BMKCloudPOIList : NSObject { + NSInteger _status; + NSInteger _total; + NSInteger _size; + NSInteger _pageNum; + NSArray *_POIs; + +} +///搜索状态 +@property (nonatomic, assign) NSInteger status; +///结果总数 +@property (nonatomic, assign) NSInteger total; +///当前页返回数量 +@property (nonatomic, assign) NSInteger size; +///页数 +@property (nonatomic, assign) NSInteger pageNum; +///POI结果列表 +@property (nonatomic, strong) NSArray *POIs; + +@end + + +/// 云检索结果信息类 +@interface BMKCloudPOIInfo : NSObject { + int _uid; + int _geotableId; + NSString *_title; + NSString *_address; + NSString *_province; + NSString *_city; + NSString *_district; + float _latitude; + float _longitude; + NSString *_tags; + float _distance; + float _weight; + NSMutableDictionary *_customDict; + int _creattime; + int _modifytime; + int _type; + + +} +///poi数据id +@property (nonatomic, assign) int uid; +///所属table的id +@property (nonatomic, assign) int geotableId; +///poi名称 +@property (nonatomic, strong) NSString *title; +///poi地址 +@property (nonatomic, strong) NSString *address; +///poi所属省 +@property (nonatomic, strong) NSString *province; +///poi所属城市 +@property (nonatomic, strong) NSString *city; +///poi所属区县 +@property (nonatomic, strong) NSString *district; +///poi所处位置的纬度 +@property (nonatomic, assign) float latitude; +///poi所处位置的经度 +@property (nonatomic, assign) float longitude; +///poi标签 +@property (nonatomic, strong) NSString *tags; +///poi距离 +@property (nonatomic, assign) float distance; +///权重 +@property (nonatomic, assign) float weight; +///自定义列 +@property (nonatomic, strong) NSMutableDictionary *customDict; +///创建时间 +@property (nonatomic, assign) int creattime; +///修改时间 +@property (nonatomic, assign) int modifytime; +///类型 +@property (nonatomic, assign) int type; +///处于位置点的方向 +@property (nonatomic, strong) NSString *direction; +@end + +/// 云检索结果百度地图POI信息类 +@interface BMKCloudMapPOIInfo : NSObject + +///poi名称 +@property (nonatomic, strong) NSString *name; +///poi uid +@property (nonatomic, strong) NSString *uid; +///POI坐标 +@property (nonatomic, assign) CLLocationCoordinate2D pt; +///poi地址 +@property (nonatomic, strong) NSString *address; +///poi标签 +@property (nonatomic, strong) NSString *tags; +///poi距离 +@property (nonatomic, assign) CGFloat distance; +///处于位置点的方向 +@property (nonatomic, strong) NSString* direction; +@end + +/// 云RGC检索结果类 +@interface BMKCloudReverseGeoCodeResult : NSObject + +///层次化地址信息 +@property (nonatomic, strong) BMKAddressComponent* addressDetail; +///地址名称 +@property (nonatomic, strong) NSString* address; +///地址坐标 +@property (nonatomic) CLLocationCoordinate2D location; +///用户定义位置描述 +@property (nonatomic, strong) NSString* customLocationDescription; +///推荐的位置描述(结合poiList和customPoiList计算推荐结果) +@property (nonatomic, strong) NSString* recommendedLocationDescription; +///地址周边百度地图POI信息,成员类型为BMKCloudMapPOIInfo +@property (nonatomic, strong) NSArray* poiList; +///地址周边POI信息,成员类型为BMKCloudPOIInfo +@property (nonatomic, strong) NSArray* customPoiList; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearch.h new file mode 100644 index 0000000..7c8ad21 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearch.h @@ -0,0 +1,111 @@ +/* + * BMKCloudSearch.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKCloudSearchInfo.h" +#import "BMKCloudPOIList.h" + +@protocol BMKCloudSearchDelegate; +/// 云检索类型 +typedef enum +{ + BMK_NONE_SEARCH = 0, + BMK_CLOUD_LOCAL_SEARCH = 1,///<本地云检索 + BMK_CLOUD_NEARBY_SEARCH = 2,///<周边云检索 + BMK_CLOUD_BOUND_SEARCH = 3,///<区域云检索 + BMK_CLOUD_DETAIL_SEARCH = 4,/// delegate; +/** + *本地云检索 + *异步函数,返回结果在BMKCloudSearchDelegate的onGetCloudPoiResult通知 + *@param searchInfo 搜索参数 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)localSearchWithSearchInfo:(BMKCloudLocalSearchInfo *)searchInfo; +/** + *周边云检索 + *异步函数,返回结果在BMKCloudSearchDelegate的onGetCloudPoiResult通知 + *@param searchInfo 搜索参数 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)nearbySearchWithSearchInfo:(BMKCloudNearbySearchInfo *)searchInfo; +/** + *矩形云检索 + *异步函数,返回结果在BMKCloudSearchDelegate的onGetCloudPoiResult通知 + *@param searchInfo 搜索参数 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)boundSearchWithSearchInfo:(BMKCloudBoundSearchInfo *)searchInfo; + +/** + *详情云检索 + *异步函数,返回结果在BMKCloudSearchDelegate的onGetCloudPoiDetailResult通知 + *@param searchInfo 搜索参数 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)detailSearchWithSearchInfo:(BMKCloudDetailSearchInfo *)searchInfo; + +/** + *云RGC检索:根据地理坐标获取地址信息 + *异步函数,返回结果在BMKCloudSearchDelegate的onGetCloudReverseGeoCodeResult通知 + *@param searchInfo 云RGC检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)cloudReverseGeoCodeSearch:(BMKCloudReverseGeoCodeSearchInfo*)searchInfo; + +@end + +///云检索delegate,用于获取云检索结果 +@protocol BMKCloudSearchDelegate +@optional +/** + *返回云检索POI列表结果 + *@param poiResultList 云检索结果列表,成员类型为BMKCloudPOIList + *@param type 返回结果类型: BMK_CLOUD_LOCAL_SEARCH,BMK_CLOUD_NEARBY_SEARCH,BMK_CLOUD_BOUND_SEARCH + *@param error 错误号,@see BMKCloudErrorCode + */ +- (void)onGetCloudPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error; + +/** + *返回云检索POI详情 + *@param poiDetailResult 类型为BMKCloudPOIInfo + *@param type 返回结果类型: BMK_CLOUD_DETAIL_SEARCH + *@param error 错误号,@see BMKCloudErrorCode + */ +- (void)onGetCloudPoiDetailResult:(BMKCloudPOIInfo*)poiDetailResult searchType:(int)type errorCode:(int)error; + +/** + *返回云RGC检索结果 + *@param cloudRGCResult 搜索结果 + *@param type 返回结果类型: BMK_CLOUD_RGC_SEARCH + *@param error 错误号,@see BMKCloudErrorCode + */ +- (void)onGetCloudReverseGeoCodeResult:(BMKCloudReverseGeoCodeResult*)cloudRGCResult searchType:(BMKCloudSearchType) type errorCode:(NSInteger) errorCode; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchComponent.h new file mode 100644 index 0000000..9333add --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchComponent.h @@ -0,0 +1,13 @@ +// +// LBSSearchComponent.h +// LBSSearchComponent +// +// Created by baidu on 14-3-10. +// Copyright (c) 2014年 baidu. All rights reserved. +// + +#import "BMKCloudVersion.h" +#import "BMKCloudPOIList.h" +#import "BMKCloudSearch.h" +#import "BMKCloudSearchInfo.h" + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchInfo.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchInfo.h new file mode 100644 index 0000000..a74dafe --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchInfo.h @@ -0,0 +1,113 @@ +/* + * BMKCloudSearchInfo.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import +#import + +/// 云检索基础信息类,所有类型云检索的基类 +@interface BMKBaseCloudSearchInfo : NSObject +{ + NSString *_ak; + NSString *_sn; + int _geoTableId; +} +///access_key(必须),最大长度50 +@property (nonatomic, strong) NSString *ak; +///用户的权限签名,(可选),最大长度50 +@property (nonatomic, strong) NSString *sn; +///geo table 表主键(必须) +@property (nonatomic, assign) int geoTableId; + +@end + +/// 本地,周边,矩形云检索基础信息类 +@interface BMKCloudSearchInfo : BMKBaseCloudSearchInfo { + NSString *_keyword; + NSString *_tags; + NSString *_sortby; + NSString *_filter; + NSInteger _pageIndex; + NSInteger _pageSize; + +} +///检索关键字,可选。最长45个字符 +@property (nonatomic, strong) NSString *keyword; +///标签,可选,空格分隔的多字符串,最长45个字符,样例:美食 小吃 +@property (nonatomic, strong) NSString *tags; +/** + * 排序字段,可选: sortby={keyname}:1 升序;sortby={keyname}:-1 降序。 + * 以下keyname为系统预定义的: + * 1.distance 距离排序 + * 2.weight 权重排序 + * 默认为按weight排序 + * 如果需要自定义排序则指定排序字段 + * 样例:按照价格由便宜到贵排序sortby=price:1 + */ +///排序字段,可选: sortby={keyname}:1 升序;sortby={keyname}:-1 降序 +@property (nonatomic, strong) NSString *sortby; +/** + * 过滤条件,可选 + * '|'竖线分隔的多个key-value对 + * key为筛选字段的名称(存储服务中定义) + * value可以是整形或者浮点数的一个区间:格式为“small,big”逗号分隔的2个数字 + * 样例:筛选价格为9.99到19.99并且生产时间为2013年的项:price:9.99,19.99|time:2012,2012 + */ +///过滤条件,可选:'|'竖线分隔的多个key-value对,price:9.99,19.99|time:2012,2012 +@property (nonatomic, strong) NSString *filter; + +///分页索引,可选,默认为0 +@property (nonatomic, assign) NSInteger pageIndex; +///分页数量,可选,默认为10,最多为50 +@property (nonatomic, assign) NSInteger pageSize; + + +@end +///本地云检索参数信息类 +@interface BMKCloudLocalSearchInfo : BMKCloudSearchInfo { + NSString *_region; +} +///区域名称(市或区的名字,如北京市,海淀区),必选, 必须最长25个字符 +@property (nonatomic, strong) NSString *region; +@end + +///周边云检索参数信息类 +@interface BMKCloudNearbySearchInfo : BMKCloudSearchInfo { + NSString *_location; + int _radius; +} +///检索的中心点,逗号分隔的经纬度(116.4321,38.76623),string(25) +@property (nonatomic, strong) NSString *location; +///周边检索半径 +@property (nonatomic, assign) int radius; +@end + +///矩形云检索参数信息类 +@interface BMKCloudBoundSearchInfo : BMKCloudSearchInfo { + NSString *_bounds; +} +///矩形区域,左下角和右上角的经纬度坐标点。2个点用;号分隔(116.30,36.20;117.30,37.20),string(25) +@property (nonatomic, strong) NSString *bounds; +@end + +///详情云检索参数信息类 +@interface BMKCloudDetailSearchInfo : BMKBaseCloudSearchInfo { + NSString *_uid; +} +///uid为poi点的id值 +@property (nonatomic, strong) NSString *uid; +@end + +///云RGC检索参数信息类 +@interface BMKCloudReverseGeoCodeSearchInfo : NSObject + +///geo table 表主键(必须) +@property (nonatomic, assign) NSInteger geoTableId; +///经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D reverseGeoPoint; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudVersion.h new file mode 100644 index 0000000..234d9ff --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudVersion.h @@ -0,0 +1,32 @@ +// +// BMKCloudVersion.h +// LBSSearchComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKCloudVersion_h +#define BMKCloudVersion_h + +#import + +/** + *重要: + *base组件的版本和cloud组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API cloud组件 的版本号 + *当前cloud组件版本 : 3.3.2 + *return 返回当前API cloud组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiCloudComponentVersion(); + +/** + *检查cloud组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckCloudComponentIsLegal(); + +#endif /* BMKCloudVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/readme.txt new file mode 100644 index 0000000..ac295f1 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/readme.txt @@ -0,0 +1,52 @@ +LBS云检索:包括LBS云检索(周边、区域、城市内、详情); + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/BaiduMapAPI_Location b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/BaiduMapAPI_Location new file mode 100644 index 0000000..05f1177 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/BaiduMapAPI_Location differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationComponent.h new file mode 100644 index 0000000..ad5f1de --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationComponent.h @@ -0,0 +1,10 @@ +// +// BMKLocationComponent.h +// LocationComponent +// +// Created by Baidu on 3/31/14. +// Copyright (c) 2014 baidu. All rights reserved. +// + +#import "BMKLocationService.h" +#import "BMKLocationVersion.h" diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationService.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationService.h new file mode 100644 index 0000000..899acd0 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationService.h @@ -0,0 +1,110 @@ +// +// BMKLocationService.h +// LocationComponent +// +// Created by Baidu on 3/28/14. +// Copyright (c) 2014 baidu. All rights reserved. +// + +#import +#import +@class CLLocation; +/// 定位服务Delegate,调用startUserLocationService定位成功后,用此Delegate来获取定位数据 +@protocol BMKLocationServiceDelegate +@optional +/** + *在将要启动定位时,会调用此函数 + */ +- (void)willStartLocatingUser; + +/** + *在停止定位后,会调用此函数 + */ +- (void)didStopLocatingUser; + +/** + *用户方向更新后,会调用此函数 + *@param userLocation 新的用户位置 + */ +- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation; + +/** + *用户位置更新后,会调用此函数 + *@param userLocation 新的用户位置 + */ +- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation; + +/** + *定位失败后,会调用此函数 + *@param error 错误号 + */ +- (void)didFailToLocateUserWithError:(NSError *)error; +@end + +@interface BMKLocationService : NSObject + +/// 当前用户位置,返回坐标类型为当前设置的坐标类型 +@property (nonatomic, readonly) BMKUserLocation *userLocation; + +/// 定位服务Delegate,调用startUserLocationService定位成功后,用此Delegate来获取定位数据 +@property (nonatomic, weak) id delegate; + +/** + *打开定位服务 + *需要在info.plist文件中添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription): + *NSLocationWhenInUseUsageDescription 允许在前台使用时获取GPS的描述 + *NSLocationAlwaysUsageDescription 允许永远可获取GPS的描述 + */ +-(void)startUserLocationService; +/** + *关闭定位服务 + */ +-(void)stopUserLocationService; + +#pragma mark - 定位参数,具体含义可参考CLLocationManager相关属性的注释 + +/// 设定定位的最小更新距离。默认为kCLDistanceFilterNone +@property(nonatomic, assign) CLLocationDistance distanceFilter; + +/// 设定定位精度。默认为kCLLocationAccuracyBest。 +@property(nonatomic, assign) CLLocationAccuracy desiredAccuracy; + +/// 设定最小更新角度。默认为1度,设定为kCLHeadingFilterNone会提示任何角度改变。 +@property(nonatomic, assign) CLLocationDegrees headingFilter; + +/// 指定定位是否会被系统自动暂停。默认为YES。只在iOS 6.0之后起作用。 +@property(nonatomic, assign) BOOL pausesLocationUpdatesAutomatically; + +///指定定位:是否允许后台定位更新。默认为NO。只在iOS 9.0之后起作用。设为YES时,Info.plist中 UIBackgroundModes 必须包含 "location" +@property(nonatomic, assign) BOOL allowsBackgroundLocationUpdates; + + +#pragma mark - 废弃接口 +/** + * 2.9.0起废弃(使用distanceFilter属性替换),空实现 + * + *在打开定位服务前设置 + *指定定位的最小更新距离(米),默认:kCLDistanceFilterNone + */ ++ (void)setLocationDistanceFilter:(CLLocationDistance) distanceFilter __deprecated_msg("废弃方法(空实现),使用distanceFilter属性替换"); +/** + * 2.9.0起废弃(使用distanceFilter属性替换),空实现 + * + *获取当前 定位的最小更新距离(米) + */ ++ (CLLocationDistance)getCurrentLocationDistanceFilter __deprecated_msg("废弃方法(空实现),使用distanceFilter属性替换"); +/** + * 2.9.0起废弃(使用desiredAccuracy属性替换),空实现 + * + *在打开定位服务前设置 + *设置定位精确度,默认:kCLLocationAccuracyBest + */ ++ (void)setLocationDesiredAccuracy:(CLLocationAccuracy) desiredAccuracy __deprecated_msg("废弃方法(空实现),使用desiredAccuracy属性替换"); +/** + * 2.9.0起废弃(使用desiredAccuracy属性替换),空实现 + * + *获取当前 定位精确度 + */ ++ (CLLocationAccuracy)getCurrentLocationDesiredAccuracy __deprecated_msg("废弃方法(空实现),使用desiredAccuracy属性替换"); + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationVersion.h new file mode 100644 index 0000000..6b0b6f6 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationVersion.h @@ -0,0 +1,32 @@ +// +// BMKLocationVersion.h +// LocationComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKLocationVersion_h +#define BMKLocationVersion_h + +#import + +/** + *重要: + *location组件的版本和base组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API location组件 的版本号 + *当前location组件版本 : 3.3.2 + *return 返回当前API location组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiLocationComponentVersion(); + +/** + *检查location组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckLocationComponentIsLegal(); + +#endif /* BMKLocationVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/readme.txt new file mode 100644 index 0000000..12ae8ba --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/readme.txt @@ -0,0 +1,52 @@ +定位功能:获取当前位置信息; + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/BaiduMapAPI_Map b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/BaiduMapAPI_Map new file mode 100644 index 0000000..e915d4e Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/BaiduMapAPI_Map differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKActionPaopaoView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKActionPaopaoView.h new file mode 100644 index 0000000..0bb27f7 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKActionPaopaoView.h @@ -0,0 +1,21 @@ +/* + * BMKActionPaopaoView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +/// 该类用于定义一个PaopaoView +@interface BMKActionPaopaoView : UIView + +/** + *初始化并返回一个BMKActionPaopaoView + *@param customView 自定义View,customView=nil时返回默认的PaopaoView + *@return 初始化成功则返回BMKActionPaopaoView,否则返回nil + */ +- (id)initWithCustomView:(UIView*)customView; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotation.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotation.h new file mode 100644 index 0000000..4106f5b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotation.h @@ -0,0 +1,38 @@ +// +// BMKAnnotation.h +// BMapKit +// +// Copyright 2011 Baidu Inc. All rights reserved. +// + +#import +#import +#import + +/// 该类为标注点的protocol,提供了标注类的基本信息函数 +@protocol BMKAnnotation + +///标注view中心坐标. +@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; + +@optional + +/** + *获取annotation标题 + *@return 返回annotation的标题信息 + */ +- (NSString *)title; + +/** + *获取annotation副标题 + *@return 返回annotation的副标题信息 + */ +- (NSString *)subtitle; + +/** + *设置标注的坐标,在拖拽时会被调用. + *@param newCoordinate 新的坐标值 + */ +- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotationView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotationView.h new file mode 100644 index 0000000..1c169c0 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotationView.h @@ -0,0 +1,110 @@ +/* + * BMKAnnotationView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKActionPaopaoView.h" + +#if __IPHONE_3_2 <= __IPHONE_OS_VERSION_MAX_ALLOWED + +enum { + BMKAnnotationViewDragStateNone = 0, ///< 静止状态. + BMKAnnotationViewDragStateStarting, ///< 开始拖动 + BMKAnnotationViewDragStateDragging, ///< 拖动中 + BMKAnnotationViewDragStateCanceling, ///< 取消拖动 + BMKAnnotationViewDragStateEnding ///< 拖动结束 +}; + +typedef NSUInteger BMKAnnotationViewDragState; + +#endif + + + +@class BMKAnnotationViewInternal; +@protocol BMKAnnotation; +@class BMKMapView; +@class BMKMapViewInternal; +///标注view +@interface BMKAnnotationView : UIView +{ +@private + BMKAnnotationViewInternal *_internal; + BOOL _enabled3D; + CGPoint _originPt; + CGPoint startPoint; +} + +/** + *初始化并返回一个annotation view + *@param annotation 关联的annotation对象 + *@param reuseIdentifier 如果要重用view,传入一个字符串,否则设为nil,建议重用view + *@return 初始化成功则返回annotation view,否则返回nil + */ +- (id)initWithAnnotation:(id )annotation reuseIdentifier:(NSString *)reuseIdentifier; + + +///复用标志 +@property (nonatomic, readonly) NSString *reuseIdentifier; +///paopaoView +@property (nonatomic, strong)BMKActionPaopaoView* paopaoView; + +/** + *当view从reuse队列里取出时被调用 + *默认不做任何事 + */ +- (void)prepareForReuse; + +///关联的annotation +@property (nonatomic, strong) id annotation; + +///annotation view显示的图像 +@property (nonatomic, strong) UIImage *image; + +///默认情况下, annotation view的中心位于annotation的坐标位置,可以设置centerOffset改变view的位置,正的偏移使view朝右下方移动,负的朝左上方,单位是像素 +@property (nonatomic) CGPoint centerOffset; + +///默认情况下, 弹出的气泡位于view正中上方,可以设置calloutOffset改变view的位置,正的偏移使view朝右下方移动,负的朝左上方,单位是像素 +@property (nonatomic) CGPoint calloutOffset; + +///默认情况下,标注没有3D效果,可以设置enabled3D改变使用3D效果,使得标注在地图旋转和俯视时跟随旋转、俯视 +@property (nonatomic) BOOL enabled3D; + +///默认为YES,当为NO时view忽略触摸事件 +@property (nonatomic, getter=isEnabled) BOOL enabled; + +///默认为NO,当view被点中时被设为YES,用户不要直接设置这个属性.若设置,需要在设置后调用BMKMapView的- (void)mapForceRefresh; 方法刷新地图 +@property (nonatomic, getter=isSelected) BOOL selected; + +/** + *设定view的选中状态 + *该方法被BMKMapView调用 + *@param selected 如果view需要显示为选中状态,该值为YES + *@param animated 如果需要动画效果,该值为YES,暂不支持 + */ +- (void)setSelected:(BOOL)selected animated:(BOOL)animated; + +///当为YES时,view被选中时会弹出气泡,annotation必须实现了title这个方法 +@property (nonatomic) BOOL canShowCallout; + +///显示在气泡左侧的view(使用默认气泡时,view的width最大值为32,height最大值为41,大于则使用最大值) +@property (strong, nonatomic) UIView *leftCalloutAccessoryView; + +///显示在气泡右侧的view(使用默认气泡时,view的width最大值为32,height最大值为41,大于则使用最大值) +@property (strong, nonatomic) UIView *rightCalloutAccessoryView; + +///当设为YES并实现了setCoordinate:方法时,支持将view在地图上拖动, ios 3.2以后支持 +@property (nonatomic, getter=isDraggable) BOOL draggable __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2); + +///当前view的拖动状态, ios 3.2以后支持 +@property (nonatomic) BMKAnnotationViewDragState dragState __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2); + + +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArcline.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArcline.h new file mode 100644 index 0000000..f247f48 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArcline.h @@ -0,0 +1,48 @@ +/* + * BMKArcline.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKMultiPoint.h" +#import "BMKOverlay.h" + +/// 此类用于定义一段圆弧 +@interface BMKArcline : BMKMultiPoint +{ + BMKMapRect _boundingMapRect; + bool isYouArc; +} + +/** + *根据指定坐标点生成一段圆弧 + *@param points 指定的直角坐标点数组(需传入3个点) + *@return 新生成的圆弧对象 + */ ++ (BMKArcline *)arclineWithPoints:(BMKMapPoint *)points; + +/** + *根据指定经纬度生成一段圆弧 + *@param coords 指定的经纬度坐标点数组(需传入3个点) + *@return 新生成的圆弧对象 + */ ++ (BMKArcline *)arclineWithCoordinates:(CLLocationCoordinate2D *)coords; + +/** + *重新设置圆弧坐标 + *@param points 指定的直角坐标点数组(需传入3个点) + *@return 是否设置成功 + */ +- (BOOL)setArclineWithPoints:(BMKMapPoint *)points; + +/** + *重新设置圆弧坐标 + *@param coords 指定的经纬度坐标点数组(需传入3个点) + *@param count 坐标点的个数 + *@return 是否设置成功 + */ +- (BOOL)setArclineWithCoordinates:(CLLocationCoordinate2D *)coords; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArclineView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArclineView.h new file mode 100644 index 0000000..980bac1 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArclineView.h @@ -0,0 +1,27 @@ +/* + * BMKArclineView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import + +#import "BMKArcline.h" +#import "BMKOverlayGLBasicView.h" + +/// 此类用于定义一个圆弧View +@interface BMKArclineView : BMKOverlayGLBasicView + +/** + *根据指定的弧线生成一个圆弧View + *@param arcline 指定的弧线数据对象 + *@return 新生成的弧线View + */ +- (id)initWithArcline:(BMKArcline *)arcline; + +/// 该View对应的圆弧数据对象 +@property (nonatomic, readonly) BMKArcline *arcline; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKBaseIndoorMapInfo.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKBaseIndoorMapInfo.h new file mode 100644 index 0000000..a7f11c2 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKBaseIndoorMapInfo.h @@ -0,0 +1,28 @@ +// +// BMKBaseIndoorMapInfo.h +// MapComponent +// +// Created by wzy on 16/4/2. +// Copyright © 2016年 baidu. All rights reserved. +// + +#ifndef BMKBaseIndoorMapInfo_h +#define BMKBaseIndoorMapInfo_h + +#import +#import +#import + +///此类表示室内图基础信息 +@interface BMKBaseIndoorMapInfo : NSObject + +/// 室内ID +@property (nonatomic, strong) NSString* strID; +/// 当前楼层 +@property (nonatomic, strong) NSString* strFloor; +/// 所有楼层信息 +@property (nonatomic, strong) NSMutableArray* arrStrFloors; + +@end + +#endif /* BMKBaseIndoorMapInfo_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircle.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircle.h new file mode 100644 index 0000000..4371db9 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircle.h @@ -0,0 +1,61 @@ +/* + * BMKCircle.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKShape.h" +#import "BMKMultiPoint.h" +#import "BMKOverlay.h" + +/// 该类用于定义一个圆 +@interface BMKCircle : BMKMultiPoint { +@package + BOOL _invalidate; + CLLocationCoordinate2D _coordinate; + CLLocationDistance _radius; + BMKMapRect _boundingMapRect; +} + +/** + *根据中心点和半径生成圆 + *@param coord 中心点的经纬度坐标 + *@param radius 半径,单位:米 + *@return 新生成的圆 + */ ++ (BMKCircle *)circleWithCenterCoordinate:(CLLocationCoordinate2D)coord + radius:(CLLocationDistance)radius; + +/** + *根据指定的直角坐标矩形生成圆,半径由较长的那条边决定,radius = MAX(width, height)/2 + *@param mapRect 指定的直角坐标矩形 + *@return 新生成的圆 + */ ++ (BMKCircle *)circleWithMapRect:(BMKMapRect)mapRect; + +/// 中心点坐标 +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; + +/// 半径,单位:米 +@property (nonatomic, assign) CLLocationDistance radius; + +/// 该圆的外接矩形 +@property (nonatomic, readonly) BMKMapRect boundingMapRect; + +/** + *设置圆的中心点和半径 + *@param coord 中心点的经纬度坐标 + *@param radius 半径,单位:米 + *@return 是否设置成功 + */ +- (BOOL)setCircleWithCenterCoordinate:(CLLocationCoordinate2D)coord radius:(CLLocationDistance)radius; +/** + *根据指定的直角坐标矩形设置圆,半径由较长的那条边决定,radius = MAX(width, height)/2 + *@param mapRect 指定的直角坐标矩形 + *@return 是否设置成功 + */ +- (BOOL)setCircleWithMapRect:(BMKMapRect)mapRect; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircleView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircleView.h new file mode 100644 index 0000000..0fdcd2e --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircleView.h @@ -0,0 +1,27 @@ +/* + * BMKCircleView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import + +#import "BMKCircle.h" +#import "BMKOverlayGLBasicView.h" + +/// 该类用于定义圆对应的View +@interface BMKCircleView : BMKOverlayGLBasicView + +/** + *根据指定圆生成对应的View + *@param circle 指定的圆 + *@return 生成的View + */ +- (id)initWithCircle:(BMKCircle *)circle; + +/// 该View对应的圆 +@property (nonatomic, readonly) BMKCircle *circle; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGradient.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGradient.h new file mode 100644 index 0000000..0a04382 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGradient.h @@ -0,0 +1,26 @@ +/* + * BMKGradient.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import +#import +///此类表示热力图渐变色 +@interface BMKGradient : NSObject{ + +} +///渐变色用到的所有颜色数组,数组成员类型为UIColor +@property (nonatomic,strong) NSArray* mColors; +///每一个颜色的起始点数组,,数组成员类型为 [0,1]的double值, given as a percentage of the maximum intensity,个数和mColors的个数必须相同,数组内元素必须时递增的 +@property (nonatomic,strong) NSArray* mStartPoints; + +//渐变色的初始化方法,使用默认colorMapSize1000进行初始化 +- (id)initWithColors:(NSArray*)colors startPoints:(NSArray*)startPoints; +@end + + + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlay.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlay.h new file mode 100644 index 0000000..bc6e058 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlay.h @@ -0,0 +1,65 @@ +/* + * BMKGroundOverlay.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import "BMKMultiPoint.h" +#import "BMKOverlay.h" +/// 该类用于定义一个图片图层 +@interface BMKGroundOverlay : BMKMultiPoint +{ + @public + float zoomLevel; + CLLocationCoordinate2D _pt; + BMKCoordinateBounds _bound; + CGPoint _anchor; + UIImage* _icon; + int iconID; + BOOL isCenterPt; + int left; + int bottom; + int width; + int height; +} +/// 两种绘制GroundOverlay的方式之一:绘制的位置地理坐标,与anchor配对使用 +@property (nonatomic,assign) CLLocationCoordinate2D pt; + +/// 用位置绘制时图片的锚点,图片左上角为(0.0f,0.0f),向右向下为正 +/// 使用groundOverlayWithPosition初始化时生效 +@property (nonatomic,assign) CGPoint anchor; + +/// 两种绘制GroundOverlay的方式之二:绘制的地理区域范围,图片在此区域内合理缩放 +@property (nonatomic,assign) BMKCoordinateBounds bound; + +/// 绘制图片 +@property(nonatomic, strong) UIImage *icon; + +///图片纹理透明度,最终透明度 = 纹理透明度 * alpha,取值范围为[0.0f, 1.0f],默认为1.0f +@property(nonatomic) GLfloat alpha; + +/** + *根据指定经纬度坐标生成一个groundOverlay + *@param position 指定的经纬度坐标 + *@param zoomLevel 不损失精度绘制原始图片的地图等级 + *@param anchor 绘制图片的锚点 + *@param icon 绘制使用的图片 + *@return 新生成的groundOverlay对象 + */ ++ (BMKGroundOverlay *)groundOverlayWithPosition:(CLLocationCoordinate2D)position + zoomLevel:(CGFloat)zoomLevel + anchor:(CGPoint)anchor + icon:(UIImage*)icon; + +/** + *根据指定区域生成一个groundOverlay + *@param bounds 指定的经纬度区域 + *@param icon 绘制使用的图片 + *@return 新生成的groundOverlay对象 + */ ++ (BMKGroundOverlay *)groundOverlayWithBounds:(BMKCoordinateBounds)bounds + icon:(UIImage*)icon; + + +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlayView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlayView.h new file mode 100644 index 0000000..ef9ba97 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlayView.h @@ -0,0 +1,28 @@ +/* + * BMKGroundOverlayView.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ + +#import + +#import "BMKGroundOverlay.h" +#import "BMKOverlayPathView.h" + +/// 该类用于定义一个BMKGroundOverlayView +@interface BMKGroundOverlayView : BMKOverlayView + +/** + *根据指定的groundOverlay生成一个View + *@param groundOverlay 指定的groundOverlay数据对象 + *@return 新生成的View + */ +- (id)initWithGroundOverlay:(BMKGroundOverlay *)groundOverlay; + +/// 该View对应的ground数据对象 +@property (nonatomic, readonly) BMKGroundOverlay *groundOverlay; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKHeatMap.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKHeatMap.h new file mode 100644 index 0000000..8c434ef --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKHeatMap.h @@ -0,0 +1,48 @@ +/* + * BMKHeatMap.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import +#import +#import +#import "BMKGradient.h" +///热力图节点信息 +@interface BMKHeatMapNode : NSObject{ + double _intensity; + CLLocationCoordinate2D _pt; +} + +///点的强度权值 +@property (nonatomic) double intensity; +///点的位置坐标 +@property (nonatomic) CLLocationCoordinate2D pt; + +@end + + + +///热力图的绘制数据和显示样式类 +@interface BMKHeatMap : NSObject +{ + int _mRadius; //Heatmap point radius + BMKGradient* _mGradient;//Gradient of the color map + double _mOpacity;//Opacity of the overall heatmap overlay [0...1] + NSMutableArray* _mData; + +} +///设置热力图点半径,默认为12ps +@property (nonatomic, assign) int mRadius; +///设置热力图渐变,有默认值 DEFAULT_GRADIENT +@property (nonatomic, strong) BMKGradient* mGradient; +///设置热力图层透明度,默认 0.6 +@property (nonatomic, assign) double mOpacity; +///用户传入的热力图数据,数组,成员类型为BMKHeatMapNode +@property (nonatomic, strong) NSMutableArray* mData; + +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKLocationViewDisplayParam.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKLocationViewDisplayParam.h new file mode 100644 index 0000000..5902a91 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKLocationViewDisplayParam.h @@ -0,0 +1,33 @@ +/* + * BMKLocationViewDisplayParam.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import +#import + + +///此类表示定位图层自定义样式参数 +@interface BMKLocationViewDisplayParam : NSObject + +///定位图标X轴偏移量(屏幕坐标) +@property (nonatomic, assign) CGFloat locationViewOffsetX; +///定位图标Y轴偏移量(屏幕坐标) +@property (nonatomic, assign) CGFloat locationViewOffsetY; +///精度圈是否显示,默认YES +@property (nonatomic, assign) BOOL isAccuracyCircleShow; +///精度圈 填充颜色 +@property (nonatomic, strong) UIColor *accuracyCircleFillColor; +///精度圈 边框颜色 +@property (nonatomic, strong) UIColor *accuracyCircleStrokeColor; +///跟随态旋转角度是否生效,默认YES +@property (nonatomic, assign) BOOL isRotateAngleValid; +///定位图标名称,需要将该图片放到 mapapi.bundle/images 目录下 +@property (nonatomic, strong) NSString* locationViewImgName; + +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapComponent.h new file mode 100644 index 0000000..5d2b2dc --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapComponent.h @@ -0,0 +1,39 @@ +/* + * BMKMapComponent.h + * BMKMapComponent + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import "BMKMapVersion.h" + +#import "BMKAnnotation.h" +#import "BMKAnnotationView.h" + +#import "BMKMapView.h" +#import "BMKBaseIndoorMapInfo.h" +#import "BMKOfflineMap.h" +#import "BMKOfflineMapType.h" + +#import "BMKOverlay.h" +#import "BMKShape.h" +#import "BMKPointAnnotation.h" +#import "BMKPinAnnotationView.h" +#import "BMKMultiPoint.h" +#import "BMKArcline.h" +#import "BMKPolyline.h" +#import "BMKPolygon.h" +#import "BMKCircle.h" +#import "BMKOverlayView.h" +#import "BMKOverlayPathView.h" +#import "BMKOverlayGLBasicView.h" +#import "BMKPolygonView.h" +#import "BMKPolylineView.h" +#import "BMKCircleView.h" +#import "BMKArclineView.h" +#import "BMKGroundOverlay.h" +#import "BMKGroundOverlayView.h" +#import "BMKGradient.h" +#import "BMKTileLayer.h" +#import "BMKTileLayerView.h" + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapStatus.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapStatus.h new file mode 100644 index 0000000..16338b0 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapStatus.h @@ -0,0 +1,40 @@ +/* + * BMKMapStatus.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import +#import +//#import + +///此类表示地图状态信息 +@interface BMKMapStatus : NSObject +{ + float _fLevel; // 缩放比例,3-19级 + float _fRotation; // 旋转角度 + float _fOverlooking; // 俯视角度 + + CGPoint _targetScreenPt;//屏幕坐标(中心点) + CLLocationCoordinate2D _targetGeoPt;//地理坐标(中心点) +} +///缩放级别:[3~19] +@property (nonatomic, assign) float fLevel; +///旋转角度 +@property (nonatomic, assign) float fRotation; +///俯视角度:[-45~0] +@property (nonatomic, assign) float fOverlooking; +///屏幕中心点坐标:在屏幕内,超过无效 +@property (nonatomic) CGPoint targetScreenPt; +///地理中心点坐标:经纬度 +@property (nonatomic) CLLocationCoordinate2D targetGeoPt; +///当前地图范围,采用直角坐标系表示,向右向下增长 +@property (nonatomic, assign, readonly) BMKMapRect visibleMapRect; + +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapVersion.h new file mode 100644 index 0000000..b739c5f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapVersion.h @@ -0,0 +1,32 @@ +// +// BMKMapVersion.h +// MapComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKMapVersion_h +#define BMKMapVersion_h + +#import + +/** + *重要: + *map组件的版本和base组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API map组件 的版本号 + *当前map组件版本 : 3.3.2 + *return 返回当前API map组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiMapComponentVersion(); + +/** + *检查map组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckMapComponentIsLegal(); + +#endif /* BMKMapVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapView.h new file mode 100644 index 0000000..d23a64d --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapView.h @@ -0,0 +1,726 @@ +/* + * BMKMapView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import +#import "BMKAnnotation.h" +#import "BMKAnnotationView.h" +#import "BMKOverlayView.h" +#import "UIKit/UIKit.h" +#import "BMKMapStatus.h" +#import "BMKLocationViewDisplayParam.h" +#import "BMKHeatMap.h" +#import "BMKBaseIndoorMapInfo.h" + +@protocol BMKMapViewDelegate; + +///点击地图标注返回数据结构 +@interface BMKMapPoi : NSObject +///点标注的名称 +@property (nonatomic,strong) NSString* text; +///点标注的经纬度坐标 +@property (nonatomic,assign) CLLocationCoordinate2D pt; +///点标注的uid,可能为空 +@property (nonatomic,strong) NSString* uid; +@end + +typedef enum { + BMKUserTrackingModeNone = 0, /// 普通定位模式 + BMKUserTrackingModeHeading, /// 定位方向模式 + BMKUserTrackingModeFollow, /// 定位跟随模式 + BMKUserTrackingModeFollowWithHeading, /// 定位罗盘模式 +} BMKUserTrackingMode; + +///枚举:logo位置 +typedef enum { + BMKLogoPositionLeftBottom = 0, /// 地图左下方 + BMKLogoPositionLeftTop, /// 地图左上方 + BMKLogoPositionCenterBottom, /// 地图中下方 + BMKLogoPositionCenterTop, /// 地图中上方 + BMKLogoPositionRightBottom, /// 地图右下方 + BMKLogoPositionRightTop, /// 地图右上方 +} BMKLogoPosition; + +///枚举:室内图切换楼层结果 +typedef enum { + BMKSwitchIndoorFloorSuccess = 0, /// 切换楼层成功 + BMKSwitchIndoorFloorFailed, /// 切换楼层失败 + BMKSwitchIndoorFloorNotFocused, /// 地图还未聚焦到传入的室内图 + BMKSwitchIndoorFloorNotExist, /// 当前室内图不存在该楼层 +} BMKSwitchIndoorFloorError; + +///地图View类,使用此View可以显示地图窗口,并且对地图进行相关的操作 +@interface BMKMapView : UIView + +/// 地图View的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/// 当前地图类型,可设定为标准地图、卫星地图 +@property (nonatomic) BMKMapType mapType; + +/// 当前地图的经纬度范围,设定的该范围可能会被调整为适合地图窗口显示的范围 +@property (nonatomic) BMKCoordinateRegion region; + +/// 限制地图的显示范围(地图状态改变时,该范围不会在地图显示范围外。设置成功后,会调整地图显示该范围) +@property (nonatomic) BMKCoordinateRegion limitMapRegion; + +/// 指南针的位置,设定坐标以BMKMapView左上角为原点,向右向下增长 +@property (nonatomic) CGPoint compassPosition; +/// 指南针的宽高 +@property (nonatomic, readonly) CGSize compassSize; + +/// 当前地图的中心点,改变该值时,地图的比例尺级别不会发生变化 +@property (nonatomic) CLLocationCoordinate2D centerCoordinate; + +/// 地图比例尺级别,在手机上当前可使用的级别为3-21级 +@property (nonatomic) float zoomLevel; +/// 地图的自定义最小比例尺级别 +@property (nonatomic) float minZoomLevel; +/// 地图的自定义最大比例尺级别 +@property (nonatomic) float maxZoomLevel; + +/// 地图旋转角度,在手机上当前可使用的范围为-180~180度 +@property (nonatomic) int rotation; + +/// 地图俯视角度,在手机上当前可使用的范围为-45~0度 +@property (nonatomic) int overlooking; +///设定地图是否现显示3D楼块效果 +@property(nonatomic, getter=isBuildingsEnabled) BOOL buildingsEnabled; +///设定地图是否显示底图poi标注(不包含室内图标注),默认YES +@property(nonatomic, assign) BOOL showMapPoi; +///设定地图是否打开路况图层 +@property(nonatomic, getter=isTrafficEnabled) BOOL trafficEnabled; +///设定地图是否打开百度城市热力图图层(百度自有数据),注:地图层级大于11时,可显示热力图 +@property(nonatomic, getter=isBaiduHeatMapEnabled) BOOL baiduHeatMapEnabled; + +///设定地图View能否支持所有手势操作 +@property(nonatomic) BOOL gesturesEnabled; +///设定地图View能否支持用户多点缩放(双指) +@property(nonatomic, getter=isZoomEnabled) BOOL zoomEnabled; +///设定地图View能否支持用户缩放(双击或双指单击) +@property(nonatomic, getter=isZoomEnabledWithTap) BOOL zoomEnabledWithTap; +///设定地图View能否支持用户移动地图 +@property(nonatomic, getter=isScrollEnabled) BOOL scrollEnabled; +///设定地图View能否支持俯仰角 +@property(nonatomic, getter=isOverlookEnabled) BOOL overlookEnabled; +///设定地图View能否支持旋转 +@property(nonatomic, getter=isRotateEnabled) BOOL rotateEnabled; + +/// 设定地图是否回调force touch事件,默认为NO,仅适用于支持3D Touch的情况,开启后会回调 - mapview:onForceTouch:force:maximumPossibleForce: +@property(nonatomic) BOOL forceTouchEnabled; + +/// 设定是否显式比例尺 +@property (nonatomic) BOOL showMapScaleBar; + +/// 比例尺的位置,设定坐标以BMKMapView左上角为原点,向右向下增长 +@property (nonatomic) CGPoint mapScaleBarPosition; + +/// 比例尺的宽高 +@property (nonatomic, readonly) CGSize mapScaleBarSize; + +/// logo位置,默认BMKLogoPositionLeftBottom +@property (nonatomic) BMKLogoPosition logoPosition; + +///当前地图范围,采用直角坐标系表示,向右向下增长 +@property (nonatomic) BMKMapRect visibleMapRect; + +/** + *地图预留边界,默认:UIEdgeInsetsZero。 + *注:设置后,会根据mapPadding调整logo、比例尺、指南针的位置。 + * 当updateTargetScreenPtWhenMapPaddingChanged==YES时,地图中心(屏幕坐标:BMKMapStatus.targetScreenPt)跟着改变 + */ +@property (nonatomic) UIEdgeInsets mapPadding; +///设置mapPadding时,地图中心(屏幕坐标:BMKMapStatus.targetScreenPt)是否跟着改变,默认YES +@property (nonatomic) BOOL updateTargetScreenPtWhenMapPaddingChanged; + +///设定地图View能否支持以手势中心点为轴进行旋转和缩放 +@property(nonatomic, getter=isChangeWithTouchPointCenterEnabled) BOOL ChangeWithTouchPointCenterEnabled; + +/** + *设置自定义地图样式 + *注:必须在BMKMapView对象初始化之前调用 + *@param customMapStyleJsonFilePath 自定义样式文件所在路径,包含文件名 + */ ++ (void)customMapStyle:(NSString*) customMapStyleJsonFilePath; +/** + * 自定义地图样式开关,影响所有BMKMapView对象 + *@param enable 自定义地图样式是否生效 + */ ++ (void)enableCustomMapStyle:(BOOL) enable; + +/** + * 2.10.0起废弃,空实现,逻辑由地图SDK控制 + * + *当应用即将后台时调用,停止一切调用opengl相关的操作。 + */ ++(void)willBackGround __deprecated_msg("废弃方法(空实现),逻辑由地图SDK控制"); +/** + * 2.10.0起废弃,空实现,逻辑由地图SDK控制 + * + *当应用恢复前台状态时调用。 + */ ++(void)didForeGround __deprecated_msg("废弃方法(空实现),逻辑由地图SDK控制"); +/** + *当mapview即将被显式的时候调用,恢复之前存储的mapview状态。 + */ +-(void)viewWillAppear; + +/** + *当mapview即将被隐藏的时候调用,存储当前mapview的状态。 + */ +-(void)viewWillDisappear; + +/** + *强制刷新mapview + */ +- (void)mapForceRefresh; + +/** + *放大一级比例尺 + *@return 是否成功 + */ +- (BOOL)zoomIn; + +/** + *缩小一级比例尺 + *@return 是否成功 + */ +- (BOOL)zoomOut; + +/** + *根据当前地图View的窗口大小调整传入的region,返回适合当前地图窗口显示的region,调整过程会保证中心点不改变 + *@param region 待调整的经纬度范围 + *@return 调整后适合当前地图窗口显示的经纬度范围 + */ +- (BMKCoordinateRegion)regionThatFits:(BMKCoordinateRegion)region; + +/** + *设定当前地图的显示范围 + *@param region 要设定的地图范围,用经纬度的方式表示 + *@param animated 是否采用动画效果 + */ +- (void)setRegion:(BMKCoordinateRegion)region animated:(BOOL)animated; + +/** + *设定地图中心点坐标 + *@param coordinate 要设定的地图中心点坐标,用经纬度表示 + *@param animated 是否采用动画效果 + */ +- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated; + +/** + *获得地图当前可视区域截图 + *@return 返回view范围内的截取的UIImage + */ +-(UIImage*) takeSnapshot; + +/** + *获得地图区域区域截图 + *@return 返回指定区域的截取的UIImage + */ +-(UIImage*) takeSnapshot:(CGRect)rect; + +/** + *设置罗盘的图片 + *@param image 设置的图片 +*/ +- (void)setCompassImage:(UIImage *)image; + +/** + *设定当前地图的显示范围,采用直角坐标系表示 + *@param mapRect 要设定的地图范围,用直角坐标系表示 + *@param animate 是否采用动画效果 + */ +- (void)setVisibleMapRect:(BMKMapRect)mapRect animated:(BOOL)animate; + +/** + *根据当前地图View的窗口大小调整传入的mapRect,返回适合当前地图窗口显示的mapRect,调整过程会保证中心点不改变 + *@param mapRect 待调整的地理范围,采用直角坐标系表示 + *@return 调整后适合当前地图窗口显示的地理范围,采用直角坐标系 + */ +- (BMKMapRect)mapRectThatFits:(BMKMapRect)mapRect; + +/** + *设定地图的显示范围,并使mapRect四周保留insets指定的边界区域 + *@param mapRect 要设定的地图范围,用直角坐标系表示 + *@param insets 指定的四周边界大小 + *@param animate 是否采用动画效果 + */ +- (void)setVisibleMapRect:(BMKMapRect)mapRect edgePadding:(UIEdgeInsets)insets animated:(BOOL)animate; + +/** + *根据当前地图View的窗口大小调整传入的mapRect,返回适合当前地图窗口显示的mapRect,并且在该mapRect四周保留insets指定的边界区域 + *@param mapRect 待调整的地理范围,采用直角坐标系表示 + ×@param insets mapRect四周要预留的边界大小 + *@return 调整后适合当前地图窗口显示的地理范围,采用直角坐标系 + */ +- (BMKMapRect)mapRectThatFits:(BMKMapRect)mapRect edgePadding:(UIEdgeInsets)insets; + +/** + *将经纬度坐标转换为View坐标 + *@param coordinate 待转换的经纬度坐标 + *@param view 指定相对的View + *@return 转换后的View坐标 + */ +- (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view; + +/** + *将View坐标转换成经纬度坐标 + *@param point 待转换的View坐标 + *@param view point坐标所在的view + *@return 转换后的经纬度坐标 + */ +- (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view; + +/** + *将经纬度矩形区域转换为View矩形区域 + *@param region 待转换的经纬度矩形 + *@param view 指定相对的View + *@return 转换后的View矩形区域 + */ +- (CGRect)convertRegion:(BMKCoordinateRegion)region toRectToView:(UIView *)view; + +/** + *将View矩形区域转换成经纬度矩形区域 + *@param rect 待转换的View矩形区域 + *@param view rect坐标所在的view + *@return 转换后的经纬度矩形区域 + */ +- (BMKCoordinateRegion)convertRect:(CGRect)rect toRegionFromView:(UIView *)view; + +/** + *将直角地理坐标矩形区域转换为View矩形区域 + *@param mapRect 待转换的直角地理坐标矩形 + *@param view 指定相对的View + *@return 转换后的View矩形区域 + */ +- (CGRect)convertMapRect:(BMKMapRect)mapRect toRectToView:(UIView *)view; + +/** + *将View矩形区域转换成直角地理坐标矩形区域 + *@param rect 待转换的View矩形区域 + *@param view rect坐标所在的view + *@return 转换后的直角地理坐标矩形区域 + */ +- (BMKMapRect)convertRect:(CGRect)rect toMapRectFromView:(UIView *)view; + +/** + *将BMKMapPoint转换为opengles可以直接使用的坐标 + @param mapPoint BMKMapPoint坐标 + @return opengles 直接支持的坐标 + */ +- (CGPoint)glPointForMapPoint:(BMKMapPoint)mapPoint; + +/** + *批量将BMKMapPoint转换为opengles可以直接使用的坐标 + @param mapPoints BMKMapPoint坐标数据指针 + @param count 个数,count不能大于数组长度 + @return opengles 直接支持的坐标数据指针(需要调用者手动释放) + */ +- (CGPoint *)glPointsForMapPoints:(BMKMapPoint *)mapPoints count:(NSUInteger)count; + +/** + * 设置地图中心点在地图中的屏幕坐标位置 + * @param ptInScreen 要设定的地图中心点位置,为屏幕坐标,设置的中心点不能超过屏幕范围,否则无效 + */ +- (void)setMapCenterToScreenPt:(CGPoint)ptInScreen; + +/** + * 获取地图状态 + *@return 返回地图状态信息 + */ +- (BMKMapStatus*)getMapStatus; + +/** + * 设置地图状态 + * @param [in] mapStatus 地图状态信息 + */ +- (void)setMapStatus:(BMKMapStatus*)mapStatus; + +/** + * 设置地图状态 + * @param [in] mapStatus 地图状态信息 + * @param [in] bAnimation 是否需要动画效果,true:需要做动画 + */ +- (void)setMapStatus:(BMKMapStatus*)mapStatus withAnimation:(BOOL)bAnimation; + +/** + * 设置地图状态 + * @param [in] mapStatus 地图状态信息 + * @param [in] bAnimation 是否需要动画效果,true:需要做动画 + * @param [in] ulDuration 指定动画时间,单位:ms + */ +- (void)setMapStatus:(BMKMapStatus*)mapStatus withAnimation:(BOOL)bAnimation withAnimationTime:(int)ulDuration; + +/** + * 判断当前图区是否支持百度热力图(百度自有数据) + * @return 支持返回YES,否则返回NO + */ +- (BOOL)isSurpportBaiduHeatMap; + +@end + +@interface BMKMapView (IndoorMapAPI) + +/// 设定地图是否显示室内图(包含室内图标注),默认不显示 +@property (nonatomic, assign) BOOL baseIndoorMapEnabled; + +/// 设定室内图标注是否显示,默认YES,仅当显示室内图(baseIndoorMapEnabled为YES)时生效 +@property (nonatomic, assign) BOOL showIndoorMapPoi; + +/** + * 设置室内图楼层 + * @param strFloor 楼层 + * @param strID 室内图ID + * @return 切换结果 + */ +- (BMKSwitchIndoorFloorError)switchBaseIndoorMapFloor:(NSString*)strFloor withID:(NSString*)strID; + +/** + * 获取当前聚焦的室内图信息 + * @return 当前聚焦的室内图信息。没有聚焦的室内图,返回nil + */ +- (BMKBaseIndoorMapInfo*)getFocusedBaseIndoorMapInfo; + +@end + +@interface BMKMapView (LocationViewAPI) + +/// 设定是否显示定位图层 +@property (nonatomic) BOOL showsUserLocation; + +/// 设定定位模式,取值为:BMKUserTrackingMode +@property (nonatomic) BMKUserTrackingMode userTrackingMode; + +/// 返回定位坐标点是否在当前地图可视区域内 +@property (nonatomic, readonly, getter=isUserLocationVisible) BOOL userLocationVisible; + +/** + *动态定制我的位置样式 + * @param [in] locationViewDisplayParam 样式参数 + */ +- (void)updateLocationViewWithParam:(BMKLocationViewDisplayParam*)locationViewDisplayParam; + +/** + *动态更新我的位置数据 + * @param [in] userLocation 定位数据 + */ +-(void)updateLocationData:(BMKUserLocation*)userLocation; +@end + +@interface BMKMapView (AnnotationAPI) + +/// 当前地图View的已经添加的标注数组 +@property (nonatomic, readonly) NSArray *annotations; + +//设定是否总让选中的annotaion置于最前面 +@property (nonatomic, assign) BOOL isSelectedAnnotationViewFront; + +/** + *向地图窗口添加标注,需要实现BMKMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View + *@param annotation 要添加的标注 + */ +- (void)addAnnotation:(id )annotation; + +/** + *向地图窗口添加一组标注,需要实现BMKMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View + *@param annotations 要添加的标注数组 + */ +- (void)addAnnotations:(NSArray *)annotations; + +/** + *移除标注 + *@param annotation 要移除的标注 + */ +- (void)removeAnnotation:(id )annotation; + +/** + *移除一组标注 + *@param annotation 要移除的标注数组 + */ +- (void)removeAnnotations:(NSArray *)annotations; + +/** + *查找指定标注对应的View,如果该标注尚未显示,返回nil + *@param annotation 指定的标注 + *@return 指定标注对应的View + */ +- (BMKAnnotationView *)viewForAnnotation:(id )annotation; + +/** + *根据指定标识查找一个可被复用的标注View,一般在delegate中使用,用此函数来代替新申请一个View + *@param identifier 指定标识 + *@return 返回可被复用的标注View + */ +- (BMKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier; + +/** + *选中指定的标注,本版暂不支持animate效果 + *@param annotation 指定的标注 + *@param animated 本版暂不支持 + */ +- (void)selectAnnotation:(id )annotation animated:(BOOL)animated; + +/** + *取消指定的标注的选中状态,本版暂不支持animate效果 + *@param annotation 指定的标注 + *@param animated 本版暂不支持 + */ +- (void)deselectAnnotation:(id )annotation animated:(BOOL)animated; + +/** + *设置地图使显示区域显示所有annotations,如果数组中只有一个则直接设置地图中心为annotation的位置 + *@param annotations 指定的标注 + *@param animated 是否启动动画 + */ +- (void)showAnnotations:(NSArray *)annotations animated:(BOOL)animated; + +/** + *获取矩形区域内的所有annotations + *@param bounds 矩形区域(经纬度) + *@return 该矩形区域内的所有annotations + */ +- (NSArray *)annotationsInCoordinateBounds:(BMKCoordinateBounds) bounds; + +@end +///地图View类(和Overlay操作相关的接口) +@interface BMKMapView (OverlaysAPI) + +/** + *向地图窗口添加Overlay,需要实现BMKMapViewDelegate的-mapView:viewForOverlay:函数来生成标注对应的View + *@param overlay 要添加的overlay + */ +- (void)addOverlay:(id )overlay; + +/** + *向地图窗口添加一组Overlay,需要实现BMKMapViewDelegate的-mapView:viewForOverlay:函数来生成标注对应的View + *@param overlays 要添加的overlay数组 + */ +- (void)addOverlays:(NSArray *)overlays; + +/** + *移除Overlay + *@param overlay 要移除的overlay + */ +- (void)removeOverlay:(id )overlay; + +/** + *移除一组Overlay + *@param overlays 要移除的overlay数组 + */ +- (void)removeOverlays:(NSArray *)overlays; + +/** + *在指定的索引处添加一个Overlay + *@param overlay 要添加的overlay + *@param index 指定的索引 + */ +- (void)insertOverlay:(id )overlay atIndex:(NSUInteger)index; + +/** + *在交换指定索引处的Overlay + *@param index1 索引1 + *@param index2 索引2 + */ +- (void)exchangeOverlayAtIndex:(NSUInteger)index1 withOverlayAtIndex:(NSUInteger)index2; + +/** + *在指定的Overlay之上插入一个overlay + *@param overlay 带添加的Overlay + *@param sibling 用于指定相对位置的Overlay + */ +- (void)insertOverlay:(id )overlay aboveOverlay:(id )sibling; + +/** + *在指定的Overlay之下插入一个overlay + *@param overlay 带添加的Overlay + *@param sibling 用于指定相对位置的Overlay + */ +- (void)insertOverlay:(id )overlay belowOverlay:(id )sibling; + +/// 当前mapView中已经添加的Overlay数组 +@property (nonatomic, readonly) NSArray *overlays; + +/** + *查找指定overlay对应的View,如果该View尚未创建,返回nil + *@param overlay 指定的overlay + *@return 指定overlay对应的View + */ +- (BMKOverlayView *)viewForOverlay:(id )overlay; + +@end +@interface BMKMapView (HeatMapAPI) + +/** + *添加热力图 + * @param [BMKHeatMap*] heatMap 热力图绘制和显示数据 + */ +- (void)addHeatMap:(BMKHeatMap*)heatMap; + +/** + *移除热力图 + */ +- (void)removeHeatMap; + +@end + +/// MapView的Delegate,mapView通过此类来通知用户对应的事件 +@protocol BMKMapViewDelegate +@optional + +/** + *地图初始化完毕时会调用此接口 + *@param mapview 地图View + */ +- (void)mapViewDidFinishLoading:(BMKMapView *)mapView; + +/** + *地图渲染完毕后会调用此接口 + *@param mapview 地图View + */ +- (void)mapViewDidFinishRendering:(BMKMapView *)mapView; + +/** + *地图渲染每一帧画面过程中,以及每次需要重绘地图时(例如添加覆盖物)都会调用此接口 + *@param mapview 地图View + *@param status 此时地图的状态 + */ +- (void)mapView:(BMKMapView *)mapView onDrawMapFrame:(BMKMapStatus*)status; + +/** + *地图区域即将改变时会调用此接口 + *@param mapview 地图View + *@param animated 是否动画 + */ +- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)animated; + +/** + *地图区域改变完成后会调用此接口 + *@param mapview 地图View + *@param animated 是否动画 + */ +- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated; + +/** + *根据anntation生成对应的View + *@param mapView 地图View + *@param annotation 指定的标注 + *@return 生成的标注View + */ +- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id )annotation; + +/** + *当mapView新添加annotation views时,调用此接口 + *@param mapView 地图View + *@param views 新添加的annotation views + */ +- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views; + +/** + *当选中一个annotation views时,调用此接口 + *@param mapView 地图View + *@param views 选中的annotation views + */ +- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view; + +/** + *当取消选中一个annotation views时,调用此接口 + *@param mapView 地图View + *@param views 取消选中的annotation views + */ +- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view; + +/** + *拖动annotation view时,若view的状态发生变化,会调用此函数。ios3.2以后支持 + *@param mapView 地图View + *@param view annotation view + *@param newState 新状态 + *@param oldState 旧状态 + */ +- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState + fromOldState:(BMKAnnotationViewDragState)oldState; + +/** + *当点击annotation view弹出的泡泡时,调用此接口 + *@param mapView 地图View + *@param view 泡泡所属的annotation view + */ +- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view; + +/** + *根据overlay生成对应的View + *@param mapView 地图View + *@param overlay 指定的overlay + *@return 生成的覆盖物View + */ +- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id )overlay; + +/** + *当mapView新添加overlay views时,调用此接口 + *@param mapView 地图View + *@param overlayViews 新添加的overlay views + */ +- (void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews; + +/** + *点中覆盖物后会回调此接口,目前只支持点中BMKPolylineView时回调 + *@param mapview 地图View + *@param overlayView 覆盖物view信息 + */ +- (void)mapView:(BMKMapView *)mapView onClickedBMKOverlayView:(BMKOverlayView *)overlayView; + +/** + *点中底图标注后会回调此接口 + *@param mapview 地图View + *@param mapPoi 标注点信息 + */ +- (void)mapView:(BMKMapView *)mapView onClickedMapPoi:(BMKMapPoi*)mapPoi; + +/** + *点中底图空白处会回调此接口 + *@param mapview 地图View + *@param coordinate 空白处坐标点的经纬度 + */ +- (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate; + +/** + *双击地图时会回调此接口 + *@param mapview 地图View + *@param coordinate 返回双击处坐标点的经纬度 + */ +- (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate; + +/** + *长按地图时会回调此接口 + *@param mapview 地图View + *@param coordinate 返回长按事件坐标点的经纬度 + */ +- (void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate; + +/** + *3DTouch 按地图时会回调此接口(仅在支持3D Touch,且fouchTouchEnabled属性为YES时,会回调此接口) + *@param mapview 地图View + *@param coordinate 触摸点的经纬度 + *@param force 触摸该点的力度(参考UITouch的force属性) + *@param maximumPossibleForce 当前输入机制下的最大可能力度(参考UITouch的maximumPossibleForce属性) + */ +- (void)mapview:(BMKMapView *)mapView onForceTouch:(CLLocationCoordinate2D)coordinate force:(CGFloat)force maximumPossibleForce:(CGFloat)maximumPossibleForce; + +/** + *地图状态改变完成后会调用此接口 + *@param mapview 地图View + */ +- (void)mapStatusDidChanged:(BMKMapView *)mapView; + +/** + *地图进入/移出室内图会调用此接口 + *@param mapview 地图View + *@param flag YES:进入室内图; NO:移出室内图 + *@param info 室内图信息 + */ +- (void)mapview:(BMKMapView *)mapView baseIndoorMapWithIn:(BOOL)flag baseIndoorMapInfo:(BMKBaseIndoorMapInfo *)info; + +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMultiPoint.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMultiPoint.h new file mode 100644 index 0000000..ec27735 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMultiPoint.h @@ -0,0 +1,35 @@ +/* + * BMKMultiPoint.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import +#import "BMKShape.h" + +/// 该类定义多个点,是个由多个点组成的虚基类, 不能直接实例化对象, 要使用其子类BMKPolyline,BMKPolygon来实例化 +@interface BMKMultiPoint : BMKShape { +@package + BMKMapPoint *_points; + NSUInteger _pointCount; + + BMKMapRect _boundingRect; +} + +/// 坐标点数组 +@property (nonatomic, readonly) BMKMapPoint *points; + +/// 坐标点的个数 +@property (nonatomic, readonly) NSUInteger pointCount; + +/** + *将内部的直角坐标数据转换为经纬度坐标点数据,并拷贝到指定的数组中 + *@param coords 经纬度坐标数组,转换后的坐标将存储到该数组中,该数组长度必须大于等于要拷贝的坐标点的个数(range.length) + *@param range 指定要拷贝的数据段 + */ +- (void)getCoordinates:(CLLocationCoordinate2D *)coords range:(NSRange)range; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMap.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMap.h new file mode 100644 index 0000000..ba89c93 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMap.h @@ -0,0 +1,114 @@ +/* + * BMKOfflineMap.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKOfflineMapType.h" + + +@protocol BMKOfflineMapDelegate; + +///离线地图事件类型 +enum { + TYPE_OFFLINE_UPDATE = 0, ///<下载或更新 + TYPE_OFFLINE_ZIPCNT = 1, ///<检测到的压缩包个数 + TYPE_OFFLINE_UNZIP = 2, ///<当前解压的离线包 + TYPE_OFFLINE_ERRZIP = 3, ///<错误的离线包 + TYPE_OFFLINE_NEWVER = 4, ///<有新版本 + TYPE_OFFLINE_UNZIPFINISH = 5, ///<扫描完毕 + TYPE_OFFLINE_ADD = 6 ///<新增离线包 +}; + +///离线地图服务 +@interface BMKOfflineMap : NSObject + +@property (nonatomic, weak) id delegate; + + + +/** + *自2.9.0起废弃,不支持扫描导入离线包 + *扫描离线地图压缩包,异步函数 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)scan:(BOOL)deleteFailedr __deprecated_msg("废弃方法(空实现),自2.9.0起废弃,不支持扫描导入离线包"); + +/** + *启动下载指定城市id的离线地图 + *@param cityID 指定的城市id + *@return 成功返回YES,否则返回NO + */ +- (BOOL)start:(int)cityID; + +/** + *启动更新指定城市id的离线地图 + *@param cityID 指定的城市id + *@return 成功返回YES,否则返回NO + */ +- (BOOL)update:(int)cityID; + +/** + *暂停下载指定城市id的离线地图 + *@param cityID 指定的城市id + *@return 成功返回YES,否则返回NO + */ +- (BOOL)pause:(int)cityID; + +/** + *删除下载指定城市id的离线地图 + *@param cityID 指定的城市id + *@return 成功返回YES,否则返回NO + */ +- (BOOL)remove:(int)cityID; + +/** + *返回热门城市列表 + *@return 热门城市列表,用户需要显示释放该数组,数组元素为BMKOLSearchRecord + */ +- (NSArray*)getHotCityList; + +/** + *返回所有支持离线地图的城市列表 + *@return 支持离线地图的城市列表,用户需要显示释放该数组,数组元素为BMKOLSearchRecord + */ +- (NSArray*)getOfflineCityList; + +/** + *根据城市名搜索该城市离线地图记录 + *@param cityName 城市名 + *@return 该城市离线地图记录,用户需要显示释放该数组,数组元素为BMKOLSearchRecord + */ +- (NSArray*)searchCity:(NSString*)cityName; + +/** + *返回各城市离线地图更新信息 + *@return 各城市离线地图更新信息,用户需要显示释放该数组,数组元素为BMKOLUpdateElement + */ +- (NSArray*)getAllUpdateInfo; + +/** + *返回指定城市id离线地图更新信息 + *@param cityID 指定的城市id + *@return 指定城市id离线地图更新信息 + */ +- (BMKOLUpdateElement*)getUpdateInfo:(int)cityID; + +@end + + +///离线地图delegate,用于获取通知 +@protocol BMKOfflineMapDelegate +/** + *返回通知结果 + *@param type 事件类型: TYPE_OFFLINE_UPDATE,TYPE_OFFLINE_ZIPCNT,TYPE_OFFLINE_UNZIP, TYPE_OFFLINE_ERRZIP, TYPE_VER_UPDATE, TYPE_OFFLINE_UNZIPFINISH, TYPE_OFFLINE_ADD + *@param state 事件状态,当type为TYPE_OFFLINE_UPDATE时,表示正在下载或更新城市id为state的离线包,当type为TYPE_OFFLINE_ZIPCNT时,表示检测到state个离线压缩包,当type为TYPE_OFFLINE_ADD时,表示新安装的离线地图数目,当type为TYPE_OFFLINE_UNZIP时,表示正在解压第state个离线包,当type为TYPE_OFFLINE_ERRZIP时,表示有state个错误包,当type为TYPE_VER_UPDATE时,表示id为state的城市离线包有更新,当type为TYPE_OFFLINE_UNZIPFINISH时,表示扫瞄完成,成功导入state个离线包 + */ +- (void)onGetOfflineMapState:(int)type withState:(int)state; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMapType.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMapType.h new file mode 100644 index 0000000..2ce1b0c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMapType.h @@ -0,0 +1,66 @@ +/* + * BMKOffineMapType.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import + +///离线地图搜索城市记录结构 +@interface BMKOLSearchRecord : NSObject +{ + NSString* _cityName; + int _size; + int _cityID; + int _cityType; + NSArray* _childCities; +} +///城市名称 +@property (nonatomic, strong) NSString* cityName; +///数据包总大小 +@property (nonatomic) int size; +///城市ID +@property (nonatomic) int cityID; +///城市类型 0:全国;1:省份;2:城市;如果是省份,可以通过childCities得到子城市列表 +@property (nonatomic) int cityType; +///子城市列表 +@property (nonatomic, strong) NSArray* childCities; + + +@end + + +///离线地图更新信息 +@interface BMKOLUpdateElement : NSObject +{ + NSString* _cityName; + int _cityID; + int _size; + int _serversize; + BOOL _update; + int _ratio; + int _status; + CLLocationCoordinate2D _pt; +} +///城市名称 +@property (nonatomic, strong) NSString* cityName; +///城市ID +@property (nonatomic) int cityID; +///已下载数据大小,单位:字节 +@property (nonatomic) int size; +///服务端数据大小,当update为YES时有效,单位:字节 +@property (nonatomic) int serversize; +///下载比率,100为下载完成,下载完成后会自动导入,status为4时离线包导入完成 +@property (nonatomic) int ratio; +///下载状态, -1:未定义 1:正在下载 2:等待下载 3:已暂停 4:完成 5:校验失败 6:网络异常 7:读写异常 8:Wifi网络异常 9:离线包数据格式异常,需重新下载离线包 10:离线包导入中 +@property (nonatomic) int status; +///更新状态,离线包是否有更新(有更新需重新下载) +@property (nonatomic) BOOL update; +///城市中心点 +@property (nonatomic) CLLocationCoordinate2D pt; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlay.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlay.h new file mode 100644 index 0000000..588b9b0 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlay.h @@ -0,0 +1,32 @@ +/* + * BMKOverlay.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKAnnotation.h" +#import + +/// 该类是地图覆盖物的基类,所有地图的覆盖物需要继承自此类 +@protocol BMKOverlay +@required + +/// 返回区域中心坐标. +@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; + +/// 返回区域外接矩形 +@property (nonatomic, readonly) BMKMapRect boundingMapRect; + +@optional +/** + *判断指定的矩形是否与本Overlay相交,用于更精确的控制overlay view的显示. + *默认使用BMKMapRectIntersectsRect([overlay boundingRect], mapRect)代替. + *@param mapRect 指定的BMKMapRect + *@return 如果相交返回YES,否则返回NO + */ +- (BOOL)intersectsMapRect:(BMKMapRect)mapRect; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayGLBasicView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayGLBasicView.h new file mode 100644 index 0000000..359aec2 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayGLBasicView.h @@ -0,0 +1,34 @@ +/* +* BMKOverlayGLBasicView.h +* BMapKit +* +* Copyright 2011 Baidu Inc. All rights reserved. +* +*/ + +#import +#import "BMKOverlayView.h" + +/// 该类定义了一个用opengl绘制的OverlayView的基类,如果需要用gdi进行绘制请继承于BMKOverlayPathView类 +@interface BMKOverlayGLBasicView : BMKOverlayView { + +} + +/// 填充颜色 +/// 注:请使用 - (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 初始化UIColor,使用[UIColor ***Color]初始化时,个别case转换成RGB后会有问题 +@property (strong, nonatomic) UIColor *fillColor; +/// 画笔颜色 +/// 注:请使用 - (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 初始化UIColor,使用[UIColor ***Color]初始化时,个别case转换成RGB后会有问题 +@property (strong, nonatomic) UIColor *strokeColor; +/// 画笔宽度,默认为0 +@property (nonatomic) CGFloat lineWidth; +/// path对象 +@property CGPathRef path; +/// 是否为虚线样式,默认NO +@property (nonatomic) BOOL lineDash; +/// 是否纹理图片平铺绘制,默认NO +@property (assign, nonatomic) BOOL tileTexture; +/// 纹理图片是否缩放(tileTexture为YES时生效),默认NO +@property (assign, nonatomic) BOOL keepScale; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayPathView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayPathView.h new file mode 100644 index 0000000..3a6cf07 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayPathView.h @@ -0,0 +1,88 @@ +/* +* BMKOverlayPathView.h +* BMapKit +* +* Copyright 2011 Baidu Inc. All rights reserved. +* +*/ + +#import +#import "BMKOverlayView.h" + +/// 该类定义了一个基本的OverlayView +@interface BMKOverlayPathView : BMKOverlayView { +@package + UIColor *_fillColor; + UIColor *_strokeColor; + + CGFloat _lineWidth; + CGLineJoin _lineJoin; + CGLineCap _lineCap; + CGFloat _miterLimit; + CGFloat _lineDashPhase; + NSArray *_lineDashPattern; + + CGPathRef _path; +} + +/// 填充颜色 +@property (strong) UIColor *fillColor; +/// 画笔颜色 +@property (strong) UIColor *strokeColor; + +/// 画笔宽度,默认为0 +@property CGFloat lineWidth; +/// LineJoin,默认为kCGLineJoinRound +@property CGLineJoin lineJoin; +/// LineCap,默认为kCGLineCapRound +@property CGLineCap lineCap; +/// miterLimit,在样式为kCGLineJoinMiter时有效,默认为10 +@property CGFloat miterLimit; +/// lineDashPhase, 默认为0 +@property CGFloat lineDashPhase; +/// lineDashPattern,一个NSNumbers的数组,默认为nil +@property (copy) NSArray *lineDashPattern; + +/** + *生成要绘制的path,子类需要重写此函数,并且对path属性赋值:self.path = newPath; + */ +- (void)createPath; +/// path对象 +@property CGPathRef path; + +/** + *刷新path,调用该函数将会使已经缓存的path失效,将会重新调用createPath来生成新的path对象 + */ +- (void)invalidatePath; + + +/** + *应用画笔属性 + *@param context CGContext对象 + *@param zoomScale 当前的zoomScale + */ +- (void)applyStrokePropertiesToContext:(CGContextRef)context + atZoomScale:(BMKZoomScale)zoomScale; + +/** + *应用画刷属性 + *@param context CGContext对象 + *@param zoomScale 当前的zoomScale + */ +- (void)applyFillPropertiesToContext:(CGContextRef)context + atZoomScale:(BMKZoomScale)zoomScale; +/** + *绘制path + *@param path 要绘制的CGPath + *@param context CGContext对象 + */ +- (void)strokePath:(CGPathRef)path inContext:(CGContextRef)context; + +/** + *填充path + *@param path 要绘制的CGPath + *@param context CGContext对象 + */ +- (void)fillPath:(CGPathRef)path inContext:(CGContextRef)context; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayView.h new file mode 100644 index 0000000..c0c71d5 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayView.h @@ -0,0 +1,207 @@ +/* + * BMKOverlayView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import +#import "BMKOverlay.h" + +/// 该类是地图覆盖物View的基类,提供绘制overlay的接口但本身并无实现,所有地图覆盖物View需要继承自此类 +@interface BMKOverlayView : UIView +{ +@package + + + id _overlay; + BMKMapRect _boundingMapRect; + CGAffineTransform _mapTransform; + id _geometryDelegate; + id _canDrawCache; + BOOL keepScale; + CFTimeInterval _lastTile; + CFRunLoopTimerRef _scheduledScaleTimer; + + struct { + unsigned int keepAlive:1; + unsigned int levelCrossFade:1; + unsigned int drawingDisabled:1; + unsigned int usesTiledLayer:1; + } _flags; +//@private +// int geometrylayerID; +} +/// 设置该overlay的GeometryDelegate +- (void)setOverlayGeometryDelegate:(id)delegate; + +/** + *初始化并返回一个overlay view + *@param overlay 关联的overlay对象 + *@return 初始化成功则返回overlay view,否则返回nil + */ +- (id)initWithOverlay:(id )overlay; + +///关联的overlay对象 +@property (nonatomic, readonly) id overlay; + +/** + *将直角坐标转为overlay view坐标 + *@param mapPoint 直角坐标 + *@return 对应的view坐标 + */ +- (CGPoint)pointForMapPoint:(BMKMapPoint)mapPoint; + +/** + *将overlay view坐标转为直角坐标 + *@param point view坐标 + *@return 对应的直角坐标 + */ +- (BMKMapPoint)mapPointForPoint:(CGPoint)point; + +/** + *将二维地图投影矩形转为overlay view矩形 + *@param mapRect 二维地图投影矩形 + *@return 对应的view矩形 + */ +- (CGRect)rectForMapRect:(BMKMapRect)mapRect; + +/** + *将overlay view区域转为二维地图投影区域 + *@param rect 指定的view矩形 + *@return 对应的二维地图投影矩形 + */ +- (BMKMapRect)mapRectForRect:(CGRect)rect; + +/** + *判断ovlerlay view是否准备绘制内容 + *默认返回YES,如果用户设为NO,当需要绘制内容时要显示调用setNeedsDisplayInMapRect:zoomScale:方法 + *@param mapRect 需要更新的地图矩形区域 + *@param zoomScale 当前的缩放因子 + *@return 如果view准备好绘制内容,返回YES,否则返回NO + */ +- (BOOL)canDrawMapRect:(BMKMapRect)mapRect zoomScale:(BMKZoomScale)zoomScale; + +/** + *绘制overlay view内容 + *该方法默认不做任何事,子类需要重载该方法来绘制view的内容 + *@param mapRect 需要更新的地图矩形区域 + *@param zoomScale 当前的缩放因子 + *@param context 使用的graphics context + */ +- (void)drawMapRect:(BMKMapRect)mapRect zoomScale:(BMKZoomScale)zoomScale inContext:(CGContextRef)context; + +/** + *使view在给定矩形的区域无效,系统将重绘该区域 + *@param mapRect 需要更新的区域 + */ +- (void)setNeedsDisplayInMapRect:(BMKMapRect)mapRect; + +/** + *使用OpenGLES 绘制线 + @param points 直角坐标点 + @param pointCount 点个数 + @param strokeColor 线颜色 + @param lineWidth OpenGLES支持线宽尺寸 + @param looped 是否闭合, 如polyline会设置NO, polygon会设置YES. + */ +- (void)renderLinesWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount strokeColor:(UIColor *)strokeColor lineWidth:(CGFloat)lineWidth looped:(BOOL)looped; +/** + *使用OpenGLES 绘制线 + @param points 直角坐标点 + @param pointCount 点个数 + @param strokeColor 线颜色 + @param lineWidth OpenGLES支持线宽尺寸 + @param looped 是否闭合, 如polyline会设置NO, polygon会设置YES. + @param lineDash 是否虚线样式 + */ +- (void)renderLinesWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount strokeColor:(UIColor *)strokeColor lineWidth:(CGFloat)lineWidth looped:(BOOL)looped lineDash:(BOOL)lineDash; + +/** + *使用OpenGLES 按指定纹理绘制线 + @param points 直角坐标点 + @param pointCount 点个数 + @param lineWidth OpenGLES支持线宽尺寸 + @param textureID 纹理ID,使用- (void)loadStrokeTextureImage:(UIImage *)textureImage;加载 + @param looped 是否闭合, 如polyline会设置NO, polygon会设置YES. + */ +- (void)renderTexturedLinesWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount lineWidth:(CGFloat)lineWidth textureID:(GLuint)textureID looped:(BOOL)looped; + +/** + *使用OpenGLES 按指定纹理绘制线 + @param points 直角坐标点 + @param pointCount 点个数 + @param lineWidth OpenGLES支持线宽尺寸 + @param textureID 纹理ID,使用- (void)loadStrokeTextureImage:(UIImage *)textureImage;加载 + @param looped 是否闭合, 如polyline会设置NO, polygon会设置YES. + @param tileTexture 是否纹理图片平铺绘制 + @param keepScale 纹理图片是否缩放(tileTexture为YES时生效) + */ +- (void)renderTexturedLinesWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount lineWidth:(CGFloat)lineWidth textureID:(GLuint)textureID strokeColor:(UIColor *)strokeColor looped:(BOOL)looped tileTexture:(BOOL) tileTexture keepScale:(BOOL) keepScale; + +/** + *使用OpenGLES 分段纹理绘制线 + @param partPt 分段直角坐标点 + @param lineWidth OpenGLES支持线宽尺寸 + @param textureIndexs 分段纹理索引,使用- (void)loadStrokeTextureImage:(UIImage *)textureImage;加载 + @param isFoucs 是否使用分段纹理绘制 + */ +-(void)renderTexturedLinesWithPartPoints:(NSArray*)partPt lineWidth:(CGFloat)lineWidth textureIndexs:(NSArray*)textureIndexs isFocus:(BOOL) isFoucs; + +/** + *使用OpenGLES 分段纹理绘制线/分段颜色绘制线 + @param partPt 分段直角坐标点 + @param lineWidth OpenGLES支持线宽尺寸 + @param textureIndexs 分段纹理索引,使用- (BOOL)loadStrokeTextureImages:(UIImage *)textureImage;加载 + @param isFoucs 是否使用分段纹理绘制 + @param tileTexture 是否纹理图片平铺绘制 + @param keepScale 纹理图片是否缩放(tileTexture为YES时生效) + */ +-(void)renderTexturedLinesWithPartPoints:(NSArray*)partPt lineWidth:(CGFloat)lineWidth textureIndexs:(NSArray*)textureIndexs isFocus:(BOOL) isFoucs tileTexture:(BOOL) tileTexture keepScale:(BOOL) keepScale; + +/** + *使用OpenGLES 绘制区域 + @param points 直角坐标点 + @param pointCount 点个数 + @param fillColor 填充颜色 + @param usingTriangleFan YES对应GL_TRIANGLE_FAN, NO对应GL_TRIANGLES + */ +- (void)renderRegionWithPoints:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount fillColor:(UIColor *)fillColor usingTriangleFan:(BOOL)usingTriangleFan; +/** + *使用OpenGLES 绘制区域(支持凹多边形) + @param points 直角坐标点 + @param pointCount 点个数 + @param fillColor 填充颜色 + @param usingTriangleFan YES对应GL_TRIANGLE_FAN, NO对应GL_TRIANGLES + */ +- (void)renderATRegionWithPoint:(BMKMapPoint *)points pointCount:(NSUInteger)pointCount fillColor:(UIColor *)fillColor usingTriangleFan:(BOOL)usingTriangleFan; + +/** + *绘制函数(子类需要重载来实现) + */ +- (void)glRender; + +///关联的纹理对象ID +@property (nonatomic, readonly) GLuint strokeTextureID; + +/** + *加载纹理图片 + @param textureImage 图片对象,opengl要求图片宽高必须是2的n次幂,如果图片对象为nil,则清空原有纹理 + @return openGL纹理ID, 若纹理加载失败返回0 + */ +- (GLuint)loadStrokeTextureImage:(UIImage *)textureImage; + +/** + *加载分段纹理绘制 所需的纹理图片 + @param textureImages 必须UIImage数组,opengl要求图片宽高必须是2的n次幂,否则,返回NO,无法分段纹理绘制 + @return 是否成功 + */ +- (BOOL)loadStrokeTextureImages:(NSArray *)textureImages; + +/// 使用分段颜色绘制时,必须设置(内容必须为UIColor) +/// 注:请使用 - (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 初始化UIColor。使用[UIColor ***Color]初始化时,个别case转换成RGB后会有问题 +@property (nonatomic, strong) NSArray *colors; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPinAnnotationView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPinAnnotationView.h new file mode 100644 index 0000000..153190c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPinAnnotationView.h @@ -0,0 +1,31 @@ +/* + * BMKPinAnnotationView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKAnnotationView.h" +enum { + BMKPinAnnotationColorRed = 0, + BMKPinAnnotationColorGreen, + BMKPinAnnotationColorPurple +}; +typedef NSUInteger BMKPinAnnotationColor; + +///提供类似大头针效果的annotation view +@interface BMKPinAnnotationView : BMKAnnotationView +{ +@private + BMKPinAnnotationColor _pinColor; + BOOL _animatesDrop; +} +///大头针的颜色,有BMKPinAnnotationColorRed, BMKPinAnnotationColorGreen, BMKPinAnnotationColorPurple三种 +@property (nonatomic) BMKPinAnnotationColor pinColor; +///动画效果 +@property (nonatomic) BOOL animatesDrop; + + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPointAnnotation.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPointAnnotation.h new file mode 100644 index 0000000..7804709 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPointAnnotation.h @@ -0,0 +1,22 @@ +/* + * BMKPointAnnotation.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + + +#import +#import "BMKShape.h" +#import + +///表示一个点的annotation +@interface BMKPointAnnotation : BMKShape { + @package + CLLocationCoordinate2D _coordinate; +} +///该点的坐标 +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygon.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygon.h new file mode 100644 index 0000000..93d840b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygon.h @@ -0,0 +1,48 @@ +/* + * BMKPolygon.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import + +#import "BMKMultiPoint.h" +#import "BMKOverlay.h" + +/// 此类用于定义一个多边形区域 +@interface BMKPolygon : BMKMultiPoint +/** + *根据多个点生成多边形 + *@param points 直角坐标点数组,这些点将被拷贝到生成的多边形对象中 + *@param count 点的个数 + *@return 新生成的多边形对象 + */ ++ (BMKPolygon *)polygonWithPoints:(BMKMapPoint *)points count:(NSUInteger)count; + +/** + *根据多个点生成多边形 + *@param coords 经纬度坐标点数组,这些点将被拷贝到生成的多边形对象中 + *@param count 点的个数 + *@return 新生成的多边形对象 + */ ++ (BMKPolygon *)polygonWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count; + +/** + *重新设置多边形顶点 + *@param points 指定的直角坐标点数组 + *@param count 坐标点的个数 + *@return 是否设置成功 + */ +- (BOOL)setPolygonWithPoints:(BMKMapPoint *)points count:(NSInteger) count; + +/** + *重新设置多边形顶点 + *@param coords 指定的经纬度坐标点数组 + *@param count 坐标点的个数 + *@return 是否设置成功 + */ +- (BOOL)setPolygonWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger) count; + + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygonView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygonView.h new file mode 100644 index 0000000..0151d91 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygonView.h @@ -0,0 +1,27 @@ +/* + * BMKPolygonView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import + +#import "BMKPolygon.h" +#import "BMKOverlayGLBasicView.h" + +/// 此类用于定义一个多边形View +@interface BMKPolygonView : BMKOverlayGLBasicView + +/** + *根据指定的多边形生成一个多边形View + *@param polygon 指定的多边形数据对象 + *@return 新生成的多边形View + */ +- (id)initWithPolygon:(BMKPolygon *)polygon; + +/// 该View对应的多边形数据 +@property (nonatomic, readonly) BMKPolygon *polygon; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolyline.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolyline.h new file mode 100644 index 0000000..1c57e55 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolyline.h @@ -0,0 +1,97 @@ +/* + * BMKPolyline.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKMultiPoint.h" +#import "BMKOverlay.h" + +/// 此类用于定义一段折线 +@interface BMKPolyline : BMKMultiPoint + +/** + *根据指定坐标点生成一段折线 + *@param points 指定的直角坐标点数组 + *@param count 坐标点的个数 + *@return 新生成的折线对象 + */ ++ (BMKPolyline *)polylineWithPoints:(BMKMapPoint *)points count:(NSUInteger)count; + +/** + *根据指定坐标点生成一段折线 + *@param coords 指定的经纬度坐标点数组 + *@param count 坐标点的个数 + *@return 新生成的折线对象 + */ ++ (BMKPolyline *)polylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count; + +/** + *重新设置折线坐标点 + *@param points 指定的直角坐标点数组 + *@param count 坐标点的个数 + *@return 是否设置成功 + */ +- (BOOL)setPolylineWithPoints:(BMKMapPoint *)points count:(NSInteger) count; + +/** + *重新设置折线坐标点 + *@param coords 指定的经纬度坐标点数组 + *@param count 坐标点的个数 + *@return 是否设置成功 + */ +- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger) count; + + +#pragma mark - 以下方法和属性只适用于分段纹理绘制和分段颜色绘制 + +///纹理索引数组(颜色索引数组) +@property (nonatomic, strong) NSArray *textureIndex; + +/** + *分段纹理绘制/分段颜色绘制,根据指定坐标点生成一段折线 + * + *分段纹理绘制:其对应的BMKPolylineView必须使用 - (BOOL)loadStrokeTextureImages:(NSArray *)textureImages; 加载纹理图片;否则使用默认的灰色纹理绘制 + *分段颜色绘制:其对应的BMKPolylineView必须设置colors属性 + * + *@param points 指定的直角坐标点数组 + *@param count 坐标点的个数 + *@param textureIndex 纹理索引数组(颜色索引数组),成员为NSNumber,且为非负数,负数按0处理 + *@return 新生成的折线对象 + */ ++ (BMKPolyline *)polylineWithPoints:(BMKMapPoint *)points count:(NSUInteger)count textureIndex:(NSArray*) textureIndex; + +/** + *根据指定坐标点生成一段折线 + * + *分段纹理绘制:其对应的BMKPolylineView必须使用 - (BOOL)loadStrokeTextureImages:(NSArray *)textureImages; 加载纹理图片;否则使用默认的灰色纹理绘制 + *分段颜色绘制:其对应的BMKPolylineView必须设置colors属性 + * + *@param coords 指定的经纬度坐标点数组 + *@param count 坐标点的个数 + *@param textureIndex 纹理索引数组(颜色索引数组),成员为NSNumber,且为非负数,负数按0处理 + *@return 新生成的折线对象 + */ ++ (BMKPolyline *)polylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count textureIndex:(NSArray*) textureIndex; + +/** + *重新设置折线坐标点 和 纹理索引 + *@param points 指定的直角坐标点数组 + *@param count 坐标点的个数 + *@param textureIndex 纹理索引数组(颜色索引数组),成员为NSNumber,且为非负数,负数按0处理 + *@return 是否设置成功 + */ +- (BOOL)setPolylineWithPoints:(BMKMapPoint *)points count:(NSInteger) count textureIndex:(NSArray*) textureIndex; + +/** + *重新设置折线坐标点 + *@param coords 指定的经纬度坐标点数组 + *@param count 坐标点的个数 + *@param textureIndex 纹理索引数组(颜色索引数组),成员为NSNumber,且为非负数,负数按0处理 + *@return 是否设置成功 + */ +- (BOOL)setPolylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSInteger) count textureIndex:(NSArray*) textureIndex; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolylineView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolylineView.h new file mode 100644 index 0000000..cc898fb --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolylineView.h @@ -0,0 +1,33 @@ +/* + * BMKPolylineView.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import + +#import "BMKPolyline.h" +#import "BMKOverlayGLBasicView.h" + +/// 此类用于定义一个折线View +@interface BMKPolylineView : BMKOverlayGLBasicView + +/** + *根据指定的折线生成一个折线View + *@param polyline 指定的折线数据对象 + *@return 新生成的折线View + */ +- (id)initWithPolyline:(BMKPolyline *)polyline; + +/// 该View对应的折线数据对象 +@property (nonatomic, readonly) BMKPolyline *polyline; + + +#pragma mark - 以下方法和属性只适用于分段纹理绘制/分段颜色绘制 + +/// 是否分段纹理/分段颜色绘制(突出显示),默认YES,YES:使用分段纹理绘制 NO:使用默认的灰色纹理绘制 +@property (nonatomic, assign) BOOL isFocus; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKShape.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKShape.h new file mode 100644 index 0000000..81d1be3 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKShape.h @@ -0,0 +1,21 @@ +/* + * BMKShape.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import"BMKAnnotation.h" + +/// 该类为一个抽象类,定义了基于BMKAnnotation的BMKShape类的基本属性和行为,不能直接使用,必须子类化之后才能使用 +@interface BMKShape : NSObject { +} + +/// 要显示的标题 +@property (copy) NSString *title; +/// 要显示的副标题 +@property (copy) NSString *subtitle; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayer.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayer.h new file mode 100644 index 0000000..0b13476 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayer.h @@ -0,0 +1,84 @@ +// +// BMKTileLayer.h +// MapComponent +// +// Created by wzy on 15/8/7. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKTileLayer_h +#define BMKTileLayer_h +#import "BMKOverlay.h" + +/** + @brief 该类是覆盖在球面墨卡托投影上的图片tiles的数据源,是抽象类,不能直接使用该类添加瓦片图,需要使用其子类(BMKURLTileLayer或BMKSyncTileLayer) + *瓦片图片是jpeg或者png格式,size为256x256 + */ +@interface BMKTileLayer : NSObject + +/// tileLayer的可见最小Zoom值,默认3 +@property (nonatomic, assign) NSInteger minZoom; + +/// tileLayer的可见最大Zoom值,默认21,且不能小于minZoom +@property (nonatomic, assign) NSInteger maxZoom; + +/// tileOverlay的可渲染区域,默认世界范围 +@property (nonatomic) BMKMapRect visibleMapRect; + +@end + +/** + @brief 通过提供url模板的方法,提供数据源。不应该继承该类,且必须通过 initWithURLTemplate: 来初始化 + *瓦片图片是jpeg或者png格式,size为256x256 + */ +@interface BMKURLTileLayer : BMKTileLayer + +/// 同initWithURLTemplate:中的URLTemplate +@property (readonly) NSString *URLTemplate; + +/*! + @brief 根据指定的URLTemplate生成tileOverlay + @param URLTemplate是一个包含"{x}","{y}","{z}"的字符串,"{x}","{y}"表示tile的坐标,"{z}"表示当tile显示的级别。"{x}","{y}","{z}"会被tile的坐标值所替换,并生成用来加载tile图片数据的URL 。例如: http://server/path?x={x}&y={y}&z={z}。 + @return 以指定的URLTemplate字符串生成tileOverlay + */ +- (id)initWithURLTemplate:(NSString *)URLTemplate; + +/** + @brief 清除当前瓦片图层缓存图片 + */ +- (BOOL)cleanTileDataCache; + +@end + +/** + @brief 通过同步方法获取瓦片数据,是一个抽象类,需要通过继承该类,并重载 tileForX:y:zoom: 方法 + *瓦片图片是jpeg或者png格式,size为256x256 + */ +@interface BMKSyncTileLayer : BMKTileLayer + +/** + @brief 通过同步方法获取瓦片数据,子类必须实现该方法 + 这个方法会在多个线程中调用,需要考虑线程安全 + @param (x, y, zoom)瓦片坐标 + @return (x, y, zoom)所对应瓦片的UIImage对象 +*/ +- (UIImage *)tileForX:(NSInteger)x y:(NSInteger)y zoom:(NSInteger)zoom; + +@end + +/** + @brief 通过异步方法获取瓦片数据,是一个抽象类,需要通过继承该类,并重载 loadTileForX:y:zoom:result: 方法 + *瓦片图片是jpeg或者png格式,size为256x256 + */ +@interface BMKAsyncTileLayer : BMKTileLayer + +/** + @brief 通过异步方法获取瓦片数据,子类必须实现该方法 + @param (x, y, zoom)瓦片坐标 + @return result 用来传入瓦片数据或加载瓦片失败的error访问的回调block + */ +- (void)loadTileForX:(NSInteger)x y:(NSInteger)y zoom:(NSInteger)zoom result:(void (^)(UIImage *tileImage, NSError *error))result; + +@end + +#endif /* BMKTileLayer_h */ \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayerView.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayerView.h new file mode 100644 index 0000000..b4a8992 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayerView.h @@ -0,0 +1,30 @@ +// +// BMKTileLayerView.h +// MapComponent +// +// Created by wzy on 15/8/7. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKTileLayerView_h +#define BMKTileLayerView_h + +#import "BMKOverlayView.h" +#import "BMKTileLayer.h" + +/// 该类用于定义一个BMKTileLayerView +@interface BMKTileLayerView : BMKOverlayView + +/** + *@brief 根据指定的tileLayer生成将tiles显示在地图上的View + *@param tileLayer 制定了覆盖图片,以及图片的覆盖区域 + *@return 以tileLayer新生成View + */ +- (id)initWithTileLayer:(BMKTileLayer*) tileLayer; + +/// 该View对应的tileLayer数据对象 +@property (nonatomic, readonly) BMKTileLayer *tileLayer; + +@end + +#endif /* BMKTileLayerView_h */ \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/CustomIndex b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/CustomIndex new file mode 100644 index 0000000..d3840ba --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/CustomIndex @@ -0,0 +1 @@ +{"land":[8,72,73,74,75,76,77,78,79,2000,2001,2003,2004,2005,2006,2763,20434,20435,20436,20437,61194],"green":[1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1569,1550,1551,1552,1553,1554,1555,1556,2529,2530,2531,2532,2533,2534,2535,2536,2537,2538,2539,2540,2541,2542,2543,2544,2545,2546,2547,2548,2549,2550,2551,2552,2553,2554,2555,2556,2557,2558,20119,20120,20121,20122,20123,20124,20586,20587,20588,20589,20902,60006,60007,60290,61844,61845,61846,61847,61848,61849,61850,61851,61875,61876,61877,61878,61879,61880,61881,61882,61883,61884,61885,61886,61887,61888,61889,61890,61891,61892,61893,61894,61942,61943,61944,61945,61946,61947,61948,61949,61950,61951,61971,61972,61973,61974],"water":[1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1535,2395,2403,2509,2510,2511,2512,2513,2514,2515,2516,2517,2518,2519,2520,2521,2522,2523,2524,2525,2526,2527,2528,20582,20583,20584,20585,20752,20754,20756,20758,20760,20900,20901,21196,21197,21198,21199,21200,21208,21209,60001,60002,60003,60004,60005,60050,60051,60212],"building":[1605,1606,1607,1608,1609,2420,2765,2766,2767,2825,20590,20660,20763,20764,61735,61736,61737,61738,61739,61740,61838,61839,61840,61841,61842,61843,61895,61896,61897,61898,61899,61900,61901,61902,61903,61904,61905,61906,61907,61908,61909,61910,61911,61912,61913,61914,61915,61916,61917,61918,61965,61966,61967,61968,61969,61970],"manmade":[1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1549,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,2388,2389,2390,2391,2392,2929,2930,2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,20591,20592,20593,20594,20595,20596,20597,20598,20653,20753,20755,20757,20759,20761,20765,20891,20892,20893,20894,20903,20904,20905,20906,20907,20908,20909,60052,60053,60054,60055,60056,60057,60058,60059,60060,60061,60062,60063,60064,60065,60066,60067,60068,60069,60070,60071,60072,60073,60074,60075,60076,60077,60078,60079,60080,60081,60082,60083,60084,60085,60086,60087,60088,60089,60090,60091,60092,60093,60094,60095,60096,60097,60098,60099,60100,60101,60102,60103,60104,60105,60106,60107,60108,60109,60110,60111,60112,60113,60114,60115,60116,60117,60118,60119,60120,60121,60122,60123,60124,60125,60126,60127,60128,60129,60130,60131,60132,60133,60134,60135,60136,60137,60138,60139,60140,60145,60146,60147,60148,60149,60150,60151,60152,60153,60154,60155,60161,60172,60173,60174,60175,60176,60177,60178,60179,60180,60181,60182,60183,60184,60185,60186,60216,60237,60295,60297,60420,60863,60938,60948,60954,60956,60958,60960,60962,60964,60966,60968,60970,60972,60974,60976,60978,60980,60982,60984,60986,60988,60990,60992,60994,60996,60998,61000,61002,61004,61006,61008,61010,61012,61014,61016,61018,61020,61022,61024,61026,61028,61030,61032,61034,61036,61038,61040,61042,61044,61046,61048,61050,61052,61054,61056,61058,61060,61062,61064,61066,61068,61070,61072,61074,61076,61078,61080,61082,61084,61086,61088,61090,61092,61094,61096,61098,61100,61102,61104,61106,61174,61176,61178,61196,61266,61267,61268,61269,61270,61283,61822,61953,62023,62025,62027,62146,62147,62148,62149,62150,62151,62205,62439,62443,69986,69996,69999,70029,70031,70033,70035,70037,70039,70041,70043,70045,70047,70049,70051,70053,70055,70057,70059,70061,70103,70105,70107,70109,70111,70113,70115,70117,70119,70121,70123,70125,70127,70129,70131,70133,70135,70137,70139,70141,70143,70145,70147,70149,70151,70153,70155,70157,70159,70161,70163,70165,70167,70169,70171,70173,70175,70177,70179,70181,70183,70185,70187,70189,70191,70193,70195,70197,70199,70201,70203,70205,70207,70209,70211,70213,70215,70218,70220,70222,70224,70226,70228,70230,70232,70234,70236,70238,70240,70242,70244,70246,70248,70250,70252,70254,70257,70258,70260,70262,70264,70266,70268,70306,70308,70310,70312,70314,70316,70318,70320,70322,70324,70326,70328,70330,70332,70334,70336,70338,70340,70342,70344,70346,70348,70350,70352,70354,70356,70358,70360,70362,70364,70366,70368,70370,70372,70374,70376,70378,70380,70382,70384,70386,70388,70390,70392,70394,70396,70398,70400,70402,70404,70406,70408,70410,70412,70414,70416,70418,70420,70422,70424,70426,70428,70430,70432,70434,70436,70438,70440,70442,70444,70446,70448,70450,70452,70454,70456,70458,70460,70462,70464,70466,70468,70470,70472,70474,70533,70604,70606,70698,70700,70702,70704,70706,70708,70710,70712,70714,70716,70718,70720,70722,70724,70726,70728,70730,70732,70734,70736,70738,70740,70742,70744,70927,70930,70934,70937,70945,70949,70952,500001],"boundary":[6,56,57,58,59,60,61,62,64,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2393,2394,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,60287,60288,60289],"highway":[60559,60560,60561,60562,60563,60574,60575,60576,60577,60578,60584,60585,60586,60587,60588,60589,60590,60591,60592,60593,60594,60595,60596,60597,60598,60604,60605,60606,60607,60608,60609,60610,60611,60612,60613,60679,60680,60681,60682,60683,60694,60695,60696,60697,60698,60704,60705,60706,60707,60708,60709,60710,60711,60712,60713,60714,60715,60716,60717,60718,60724,60725,60726,60727,60728,60729,60730,60731,60732,60733,60799,60800,60801,60802,60803,60814,60815,60816,60817,60818,60824,60825,60826,60827,60828,60829,60830,60831,60832,60833,60834,60835,60836,60837,60838,60844,60845,60846,60847,60848,60849,60850,60851,60852,60853,60875,60876,60877,60878,60879,60880,60882,60883,60886,60887,60902,60903,60904,60905,60906,60907,60909,60910,60913,60914,61198,61201,61204,61207,61723,61725,61745,62202,62433,62434,62435],"arterial":[60524,60525,60526,60527,60528,60534,60535,60536,60537,60538,60544,60545,60546,60547,60548,60564,60565,60566,60567,60568,60579,60580,60581,60582,60583,60644,60645,60646,60647,60648,60654,60655,60656,60657,60658,60664,60665,60666,60667,60668,60684,60685,60686,60687,60688,60699,60700,60701,60702,60703,60764,60765,60766,60767,60768,60774,60775,60776,60777,60778,60784,60785,60786,60787,60788,60804,60805,60806,60807,60808,60819,60820,60821,60822,60823,60881,60884,60885,60891,60892,60908,60911,60912,60918,60919,61197,61199,61200,61202,61203,61205,61206,61248,62436],"local":[60499,60500,60501,60502,60503,60504,60505,60506,60507,60508,60509,60510,60511,60512,60513,60529,60530,60531,60532,60533,60539,60540,60541,60542,60543,60549,60550,60551,60552,60553,60619,60620,60621,60622,60623,60624,60625,60626,60627,60628,60629,60630,60631,60632,60633,60649,60650,60651,60652,60653,60659,60660,60661,60662,60663,60669,60670,60671,60672,60673,60739,60740,60741,60742,60743,60744,60745,60746,60747,60748,60749,60750,60751,60752,60753,60769,60770,60771,60772,60773,60779,60780,60781,60782,60783,60789,60790,60791,60792,60793,60889,60890,60894,60895,60896,60916,60917,60921,60922,60923,61229,61231,61726,61727,61728,61729,61730,61731,61732,61733,61734,61746,61747,61748,61749,61750,61751,61752,61753,61754,62437],"railway":[1801,1802,1803,1804,1805,1811,1812,1813,1814,1815,1817,1818,1819,1820,1821,1822,1823,1824,1825,20400,20402,20403,20404,20405,20406,70216,70517,70518,70519,70520],"subway":[1808,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20087,20088,20089,20090,20091,20092,20097,20098,20099,20101,20102,20103,20104,20105,20154,20157,20159,20283,20284,20285,20286,20287,20290,20304,20305,20306,20311,20312,20313,20537,20911,21205,21206,21207,21210,60156,60157,60158,60159,60160,60162,60163,60164,60165,60166,60167,60168,60169,60170,60171,60187,60188,60189,60190,60191,60192,60193,60194,60195,60196,60197,60236,60294,60296,60419,60862,60937,60947,60953,60955,60957,60959,60961,60963,60965,60967,60969,60971,60973,60975,60977,60979,60981,60983,60985,60987,60989,60991,60993,60995,60997,60999,61001,61003,61005,61007,61009,61011,61013,61015,61017,61019,61021,61023,61025,61027,61029,61031,61033,61035,61037,61039,61041,61043,61045,61047,61049,61051,61053,61055,61057,61059,61061,61063,61065,61067,61069,61071,61073,61075,61077,61079,61081,61083,61085,61087,61089,61091,61093,61095,61097,61099,61101,61103,61105,61173,61175,61177,61952,62024,62026,62028,62204,62438,69985,69997,69998,70028,70030,70032,70034,70036,70038,70040,70042,70044,70046,70048,70050,70052,70054,70056,70058,70060,70102,70104,70106,70108,70110,70112,70114,70116,70118,70120,70122,70124,70126,70128,70130,70132,70134,70136,70138,70140,70142,70144,70146,70148,70150,70152,70154,70156,70158,70160,70162,70164,70166,70168,70170,70172,70174,70176,70178,70180,70182,70184,70186,70188,70190,70192,70194,70196,70198,70200,70202,70204,70206,70208,70210,70212,70214,70217,70219,70221,70223,70225,70227,70229,70231,70233,70235,70237,70239,70241,70243,70245,70247,70249,70251,70253,70255,70256,70259,70261,70263,70265,70267,70269,70270,70271,70272,70273,70274,70305,70307,70309,70311,70313,70315,70317,70319,70321,70323,70325,70327,70329,70331,70333,70335,70337,70339,70341,70343,70345,70347,70349,70351,70353,70355,70357,70359,70361,70363,70365,70367,70369,70371,70373,70375,70377,70379,70381,70383,70385,70387,70389,70391,70393,70395,70397,70399,70401,70403,70405,70407,70409,70411,70413,70415,70417,70419,70421,70423,70425,70427,70429,70431,70433,70435,70437,70439,70441,70443,70445,70447,70449,70451,70453,70455,70457,70459,70461,70463,70465,70467,70469,70471,70473,70532,70603,70605,70697,70699,70701,70703,70705,70707,70709,70711,70713,70715,70717,70719,70721,70723,70725,70727,70729,70731,70733,70735,70737,70739,70741,70743,70749,70750,70751,70752,70753,70754,70755,70756,70757,70758,70759,70760,70761,70762,70763,70764,70765,70766,70767,70768,70769,70770,70771,70772,70773,70774,70775,70776,70777,70778,70779,70780,70781,70782,70783,70784,70785,70786,70787,70788,70789,70790,70791,70792,70793,70794,70795,70796,70797,70798,70799,70800,70801,70802,70803,70804,70805,70806,70807,70808,70809,70810,70811,70812,70813,70814,70815,70816,70817,70818,70819,70820,70821,70822,70823,70824,70825,70826,70827,70828,70829,70830,70831,70832,70833,70834,70835,70836,70837,70838,70839,70840,70841,70842,70843,70844,70845,70846,70847,70848,70849,70850,70851,70852,70853,70854,70855,70856,70857,70858,70859,70860,70861,70862,70863,70864,70865,70866,70867,70868,70869,70870,70871,70926,70928,70929,70931,70933,70935,70936,70938,70944,70946,70948,70950,70951,70953,500000],"districtlabel":[29,30,31,32,33,34,35,1602,2396,2397,2398,2399,2400,2401,2402,2404,2405],"roadlabel":[2596,2597,2598,2599,2600],"highwaylabel":[60814,60815,60816,60817,60818,60834,60835,60836,60837,60838,60844,60845,60846,60847,60848,60849,60850,60851,60852,60853],"arteriallabel":[60764,60766,60768,60774,60776,60778,60784,60786,60799,60800,60801,60802,60803,60804,60806,60819,60820,60821,60822,60823],"locallabel":[60629,60739,60741,60744,60746,60749,60751,60769,60771,60779,60781,60783],"poilabel":[0]} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVDirectory.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVDirectory.cfg new file mode 100644 index 0000000..de8385c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVDirectory.cfg @@ -0,0 +1 @@ +{"cities":[{"bb":-16777216,"bl":-16777216,"br":16777216,"bt":16777216,"c":[],"cl":0,"dom":1,"frc":1,"h":"qqgl","i":1,"its":1,"l":4,"n":"ȫ","p":"quanqiugailue","s":106979658,"v":434,"x":12128434,"y":4040943},{"4k":1,"bb":4757504,"bl":12849152,"br":13082624,"bt":4994048,"c":[],"cl":2,"dom":1,"frc":1,"h":"bj","i":131,"its":1,"l":12,"n":"","p":"beijing_131","s":69152442,"v":443,"x":12959247,"y":4825323},{"4k":1,"bb":3568640,"bl":13454336,"br":13582336,"bt":3724288,"c":[],"cl":2,"dom":1,"frc":1,"h":"sh","i":289,"its":1,"l":12,"n":"Ϻ","p":"shanghai_289","s":61844271,"v":443,"x":13523376,"y":3641154},{"4k":1,"bb":4631552,"bl":12992512,"br":13145088,"bt":4876288,"c":[],"cl":2,"dom":1,"frc":1,"h":"tj","i":332,"its":1,"l":12,"n":"","p":"tianjin_332","s":35781861,"v":443,"x":13049152,"y":4712625},{"4k":1,"bb":3249152,"bl":11720704,"br":12268544,"bt":3768320,"c":[],"cl":2,"dom":1,"frc":1,"h":"cq","i":132,"its":1,"l":12,"n":"","p":"chongqing_132","s":90845589,"v":443,"x":11862153,"y":3426984},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3676160,"bl":12990464,"br":13124608,"bt":3812352,"c":[],"cl":2,"dom":1,"frc":1,"h":"hf","i":127,"its":1,"l":12,"n":"Ϸ","p":"hefei_127","s":13158816,"v":443,"x":13050653,"y":3717732},{"4k":0,"bb":3453952,"bl":12887040,"br":13108224,"bt":3646464,"c":[],"cl":2,"dom":1,"frc":1,"h":"aq","i":130,"its":0,"l":13,"n":"","p":"anqing_130","s":8900222,"v":443,"x":13031629,"y":3550022},{"4k":0,"bb":3833856,"bl":12995584,"br":13145088,"bt":3939328,"c":[],"cl":2,"dom":1,"frc":1,"h":"bb","i":126,"its":0,"l":13,"n":"","p":"bengbu_126","s":3688754,"v":443,"x":13068586,"y":3861452},{"4k":0,"bb":3602432,"bl":13028352,"br":13193216,"bt":3748864,"c":[],"cl":2,"dom":1,"frc":1,"h":"ch","i":251,"its":0,"l":13,"n":"","p":"chaohu_251","s":7246694,"v":443,"x":13124245,"y":3692063},{"4k":0,"bb":3426304,"bl":12985344,"br":13151232,"bt":3592192,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":299,"its":0,"l":14,"n":"","p":"chizhou_299","s":3873964,"v":443,"x":13079942,"y":3568097},{"4k":0,"bb":3721216,"bl":13042688,"br":13274112,"bt":3901440,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":189,"its":0,"l":13,"n":"","p":"chuzhou_189","s":9299643,"v":443,"x":13171827,"y":3780782},{"4k":0,"bb":3793920,"bl":12788736,"br":12985344,"bt":3950592,"c":[],"cl":2,"dom":1,"frc":1,"h":"fy","i":128,"its":0,"l":13,"n":"","p":"fuyang_128","s":6606294,"v":443,"x":12893223,"y":3858087},{"4k":0,"bb":3853312,"bl":12862464,"br":13006848,"bt":4015104,"c":[],"cl":2,"dom":1,"frc":1,"h":"bz","i":188,"its":0,"l":13,"n":"","p":"bozhou_188","s":5090638,"v":443,"x":12889289,"y":3984735},{"4k":0,"bb":3908608,"bl":12957696,"br":13032448,"bt":4039680,"c":[],"cl":2,"dom":0,"frc":1,"h":"hb","i":253,"its":0,"l":13,"n":"","p":"huaibei_253","s":2242736,"v":443,"x":13002800,"y":3999428},{"4k":0,"bb":3790848,"bl":12953600,"br":13049856,"bt":3873792,"c":[],"cl":2,"dom":1,"frc":1,"h":"hn","i":250,"its":0,"l":13,"n":"","p":"huainan_250","s":2422626,"v":443,"x":13025208,"y":3823291},{"4k":0,"bb":3404800,"bl":13046784,"br":13237248,"bt":3549184,"c":[],"cl":2,"dom":1,"frc":1,"h":"hs","i":252,"its":0,"l":13,"n":"ɽ","p":"huangshan_252","s":4042449,"v":443,"x":13174304,"y":3446430},{"4k":0,"bb":3611648,"bl":12843008,"br":13053952,"bt":3828736,"c":[],"cl":2,"dom":1,"frc":1,"h":"la","i":298,"its":0,"l":13,"n":"","p":"luan_298","s":8997595,"v":443,"x":12972123,"y":3706631},{"4k":0,"bb":3648512,"bl":13177856,"br":13236224,"bt":3713024,"c":[],"cl":2,"dom":1,"frc":1,"h":"mas","i":358,"its":0,"l":13,"n":"ɽ","p":"maanshan_358","s":2399374,"v":443,"x":13192978,"y":3698259},{"4k":0,"bb":3908608,"bl":12931072,"br":13158400,"bt":4092928,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":370,"its":0,"l":13,"n":"","p":"suzhou_370","s":5650665,"v":443,"x":13021233,"y":3958277},{"4k":0,"bb":3534848,"bl":13052928,"br":13155328,"bt":3629056,"c":[],"cl":2,"dom":1,"frc":1,"h":"tl","i":337,"its":0,"l":14,"n":"ͭ","p":"tongling_337","s":1387299,"v":443,"x":13115671,"y":3604196},{"4k":0,"bb":3564544,"bl":13132800,"br":13218816,"bt":3680256,"c":[],"cl":2,"dom":1,"frc":1,"h":"wh","i":129,"its":0,"l":12,"n":"ߺ","p":"wuhu_129","s":5284372,"v":443,"x":13179438,"y":3655140},{"4k":0,"bb":3475456,"bl":13132800,"br":13320192,"bt":3651584,"c":[],"cl":2,"dom":1,"frc":1,"h":"xc","i":190,"its":0,"l":13,"n":"","p":"xuancheng_190","s":5867479,"v":443,"x":13221024,"y":3603637}],"cl":1,"dom":1,"frc":1,"h":"","i":5,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":2883584,"bl":13178880,"br":13419520,"bt":3060736,"c":[],"cl":2,"dom":1,"frc":1,"h":"fz","i":300,"its":1,"l":12,"n":"","p":"fuzhou_300","s":16951855,"v":443,"x":13280899,"y":2990069},{"4k":0,"bb":2781184,"bl":12897280,"br":13109248,"bt":2985984,"c":[],"cl":2,"dom":1,"frc":1,"h":"ly","i":193,"its":0,"l":13,"n":"","p":"longyan_193","s":6415326,"v":443,"x":13027156,"y":2867451},{"4k":0,"bb":3011584,"bl":13025280,"br":13279232,"bt":3269632,"c":[],"cl":2,"dom":1,"frc":1,"h":"np","i":133,"its":0,"l":13,"n":"ƽ","p":"nanping_133","s":6679632,"v":443,"x":13156359,"y":3060182},{"4k":0,"bb":3016704,"bl":13197312,"br":13443072,"bt":3189760,"c":[],"cl":2,"dom":1,"frc":1,"h":"nd","i":192,"its":0,"l":14,"n":"","p":"ningde_192","s":6782258,"v":443,"x":13306479,"y":3063299},{"4k":0,"bb":2850816,"bl":13186048,"br":13328384,"bt":2951168,"c":[],"cl":2,"dom":1,"frc":1,"h":"pt","i":195,"its":1,"l":13,"n":"","p":"putian_195","s":3563357,"v":443,"x":13248747,"y":2913812},{"4k":1,"bb":2772992,"bl":13088768,"br":13255680,"bt":2972672,"c":[],"cl":2,"dom":1,"frc":1,"h":"qz","i":134,"its":1,"l":12,"n":"Ȫ","p":"quanzhou_134","s":17531748,"v":443,"x":13201907,"y":2846933},{"4k":0,"bb":2916352,"bl":12955648,"br":13211648,"bt":3121152,"c":[],"cl":2,"dom":1,"frc":1,"h":"sm","i":254,"its":1,"l":14,"n":"","p":"sanming_254","s":6541815,"v":443,"x":13096406,"y":3013437},{"4k":1,"bb":2782208,"bl":13123584,"br":13188096,"bt":2847744,"c":[],"cl":2,"dom":1,"frc":1,"h":"xm","i":194,"its":1,"l":12,"n":"","p":"xiamen_194","s":7743635,"v":443,"x":13146519,"y":2794850},{"4k":0,"bb":2681856,"bl":13014016,"br":13164544,"bt":2882560,"c":[],"cl":2,"dom":1,"frc":1,"h":"zz","i":255,"its":0,"l":12,"n":"","p":"zhangzhou_255","s":7126977,"v":443,"x":13097306,"y":2798911}],"cl":1,"dom":1,"frc":1,"h":"","i":6,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4216832,"bl":11421696,"br":11642880,"bt":4419584,"c":[],"cl":2,"dom":1,"frc":1,"h":"lz","i":36,"its":0,"l":12,"n":"","p":"lanzhou_36","s":8163542,"v":443,"x":11559619,"y":4284497},{"4k":0,"bb":4195328,"bl":11528192,"br":11748352,"bt":4503552,"c":[],"cl":2,"dom":1,"frc":1,"h":"by","i":35,"its":0,"l":13,"n":"","p":"baiyin_35","s":3546058,"v":443,"x":11593403,"y":4350997},{"4k":0,"bb":4021248,"bl":11517952,"br":11761664,"bt":4282368,"c":[],"cl":2,"dom":1,"frc":1,"h":"dx","i":136,"its":0,"l":13,"n":"","p":"dingxi_136","s":5311622,"v":443,"x":11647780,"y":4218809},{"4k":0,"bb":3886080,"bl":11216896,"br":11663360,"bt":4220928,"c":[],"cl":2,"dom":1,"frc":1,"h":"gnzzzz","i":247,"its":0,"l":14,"n":"ϲ","p":"gannanzangzuzizhi_247","s":4183732,"v":443,"x":11456859,"y":4137657},{"4k":0,"bb":4785152,"bl":10891264,"br":10969088,"bt":4836352,"c":[],"cl":2,"dom":1,"frc":1,"h":"jyg","i":33,"its":0,"l":13,"n":"","p":"jiayuguan_33","s":617584,"v":443,"x":10942391,"y":4806167},{"4k":0,"bb":4556800,"bl":11290624,"br":11438080,"bt":4696064,"c":[],"cl":2,"dom":1,"frc":1,"h":"jc","i":34,"its":0,"l":13,"n":"","p":"jinchang_34","s":1089403,"v":443,"x":11376391,"y":4627122},{"4k":0,"bb":4568064,"bl":10277888,"br":11155456,"bt":5253120,"c":[],"cl":2,"dom":1,"frc":1,"h":"jq","i":37,"its":0,"l":13,"n":"Ȫ","p":"jiuquan_37","s":5792715,"v":443,"x":10965137,"y":4800459},{"4k":0,"bb":4131840,"bl":11430912,"br":11563008,"bt":4305920,"c":[],"cl":2,"dom":1,"frc":1,"h":"lxhzzz","i":182,"its":0,"l":13,"n":"Ļ","p":"linxiahuizuzizhi_182","s":2589848,"v":443,"x":11490222,"y":4221634},{"4k":0,"bb":3818496,"bl":11580416,"br":11866112,"bt":4077568,"c":[],"cl":2,"dom":1,"frc":1,"h":"ln","i":256,"its":0,"l":14,"n":"¤","p":"longnan_256","s":5702272,"v":443,"x":11680713,"y":3925616},{"4k":0,"bb":4123648,"bl":11726848,"br":12008448,"bt":4242432,"c":[],"cl":2,"dom":1,"frc":1,"h":"pl","i":359,"its":0,"l":13,"n":"ƽ","p":"pingliang_359","s":4340120,"v":443,"x":11874773,"y":4213703},{"4k":0,"bb":4171776,"bl":11840512,"br":12103680,"bt":4436992,"c":[],"cl":2,"dom":1,"frc":1,"h":"qy","i":135,"its":0,"l":13,"n":"","p":"qingyang_135","s":6487911,"v":443,"x":11982430,"y":4240415},{"4k":0,"bb":4015104,"bl":11641856,"br":11880448,"bt":4164608,"c":[],"cl":2,"dom":1,"frc":1,"h":"ts","i":196,"its":0,"l":13,"n":"ˮ","p":"tianshui_196","s":4663281,"v":443,"x":11770086,"y":4083435},{"4k":0,"bb":4379648,"bl":11335680,"br":11601920,"bt":4761600,"c":[],"cl":2,"dom":1,"frc":1,"h":"ww","i":118,"its":0,"l":13,"n":"","p":"wuwei_118","s":3659392,"v":443,"x":11426460,"y":4543603},{"4k":0,"bb":4498432,"bl":10841088,"br":11379712,"bt":4823040,"c":[],"cl":2,"dom":1,"frc":1,"h":"zy","i":117,"its":0,"l":13,"n":"Ҵ","p":"zhangye_117","s":3804120,"v":443,"x":11182856,"y":4684860}],"cl":1,"dom":1,"frc":1,"h":"","i":7,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":2556928,"bl":12574720,"br":12698624,"bt":2728960,"c":[],"cl":2,"dom":1,"frc":1,"h":"gz","i":257,"its":1,"l":12,"n":"","p":"guangzhou_257","s":42496967,"v":443,"x":12609501,"y":2631394},{"4k":0,"bb":2666496,"bl":12954624,"br":13048832,"bt":2765824,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":201,"its":0,"l":13,"n":"","p":"chaozhou_201","s":2802636,"v":443,"x":12983270,"y":2695083},{"4k":1,"bb":2574336,"bl":12637184,"br":12721152,"bt":2633728,"c":[],"cl":2,"dom":1,"frc":1,"h":"dg","i":119,"its":1,"l":12,"n":"ݸ","p":"dongguan_119","s":29873868,"v":443,"x":12663623,"y":2618335},{"4k":0,"bb":2302976,"bl":12954624,"br":13057024,"bt":2381824,"c":[],"cl":2,"dom":0,"frc":1,"h":"dsq","i":120,"its":0,"l":13,"n":"ɳȺ","p":"dongshaqun_120","s":432139,"v":427,"x":12991306,"y":2333156},{"4k":1,"bb":2572288,"bl":12511232,"br":12623872,"bt":2684928,"c":[],"cl":2,"dom":1,"frc":1,"h":"fs","i":138,"its":1,"l":13,"n":"ɽ","p":"foshan_138","s":30580754,"v":443,"x":12593536,"y":2618504},{"4k":0,"bb":2634752,"bl":12718080,"br":12869632,"bt":2832384,"c":[],"cl":2,"dom":1,"frc":1,"h":"hy","i":200,"its":0,"l":12,"n":"Դ","p":"heyuan_200","s":6186912,"v":443,"x":12769274,"y":2705589},{"4k":1,"bb":2540544,"bl":12669952,"br":12850176,"bt":2732032,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":301,"its":0,"l":12,"n":"","p":"huizhou_301","s":14242236,"v":443,"x":12737682,"y":2629201},{"4k":0,"bb":2428928,"bl":12468224,"br":12609536,"bt":2598912,"c":[],"cl":2,"dom":1,"frc":1,"h":"jm","i":302,"its":0,"l":13,"n":"","p":"jiangmen_302","s":8332351,"v":443,"x":12589095,"y":2565316},{"4k":0,"bb":2596864,"bl":12870656,"br":12985344,"bt":2709504,"c":[],"cl":2,"dom":1,"frc":1,"h":"jy","i":259,"its":0,"l":13,"n":"","p":"jieyang_259","s":4497481,"v":443,"x":12955416,"y":2682139},{"4k":0,"bb":2416640,"bl":12281856,"br":12434432,"bt":2580480,"c":[],"cl":2,"dom":1,"frc":1,"h":"mm","i":139,"its":0,"l":13,"n":"ï","p":"maoming_139","s":6766607,"v":443,"x":12349003,"y":2455917},{"4k":0,"bb":2660352,"bl":12836864,"br":13019136,"bt":2850816,"c":[],"cl":2,"dom":1,"frc":1,"h":"mz","i":141,"its":0,"l":13,"n":"÷","p":"meizhou_141","s":7155681,"v":443,"x":12927581,"y":2771573},{"4k":0,"bb":2670592,"bl":12460032,"br":12682240,"bt":2883584,"c":[],"cl":2,"dom":1,"frc":1,"h":"qy","i":197,"its":0,"l":13,"n":"Զ","p":"qingyuan_197","s":7349626,"v":443,"x":12586210,"y":2698142},{"4k":0,"bb":2620416,"bl":12941312,"br":13066240,"bt":2694144,"c":[],"cl":2,"dom":1,"frc":1,"h":"st","i":303,"its":0,"l":13,"n":"ͷ","p":"shantou_303","s":4200545,"v":443,"x":12989872,"y":2658431},{"4k":0,"bb":2569216,"bl":12792832,"br":12940288,"bt":2673664,"c":[],"cl":2,"dom":1,"frc":1,"h":"sw","i":339,"its":0,"l":14,"n":"β","p":"shanwei_339","s":3078503,"v":443,"x":12844383,"y":2590120},{"4k":0,"bb":2722816,"bl":12563456,"br":12774400,"bt":2922496,"c":[],"cl":2,"dom":1,"frc":1,"h":"sg","i":137,"its":0,"l":13,"n":"ع","p":"shaoguan_137","s":7220623,"v":443,"x":12646452,"y":2835071},{"4k":1,"bb":2523136,"bl":12654592,"br":12764160,"bt":2598912,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":340,"its":1,"l":12,"n":"","p":"shenzhen_340","s":37223433,"v":443,"x":12697742,"y":2560988},{"4k":0,"bb":2432000,"bl":12388352,"br":12510208,"bt":2577408,"c":[],"cl":2,"dom":1,"frc":1,"h":"yj","i":199,"its":0,"l":14,"n":"","p":"yangjiang_199","s":4422830,"v":443,"x":12466699,"y":2479199},{"4k":0,"bb":2540544,"bl":12362752,"br":12527616,"bt":2655232,"c":[],"cl":2,"dom":1,"frc":1,"h":"yf","i":258,"its":0,"l":13,"n":"Ƹ","p":"yunfu_258","s":3734120,"v":443,"x":12473614,"y":2605661},{"4k":0,"bb":2265088,"bl":12204032,"br":12366848,"bt":2487296,"c":[],"cl":2,"dom":1,"frc":1,"h":"zj","i":198,"its":0,"l":13,"n":"տ","p":"zhanjiang_198","s":8080537,"v":443,"x":12286021,"y":2409271},{"4k":0,"bb":2587648,"bl":12397568,"br":12567552,"bt":2785280,"c":[],"cl":2,"dom":1,"frc":1,"h":"zq","i":338,"its":0,"l":13,"n":"","p":"zhaoqing_338","s":6292984,"v":443,"x":12520436,"y":2621545},{"4k":1,"bb":2516992,"bl":12597248,"br":12657664,"bt":2589696,"c":[],"cl":2,"dom":1,"frc":1,"h":"zs","i":187,"its":1,"l":12,"n":"ɽ","p":"zhongshan_187","s":12591955,"v":443,"x":12623659,"y":2557831},{"4k":1,"bb":2468864,"bl":12585984,"br":12737536,"bt":2550784,"c":[],"cl":2,"dom":1,"frc":1,"h":"zh","i":140,"its":1,"l":13,"n":"麣","p":"zhuhai_140","s":8300237,"v":443,"x":12644164,"y":2528395}],"cl":1,"dom":1,"frc":1,"h":"","i":8,"its":0,"l":12,"n":"㶫ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":0,"bb":2766848,"bl":12203008,"br":12412928,"bt":3028992,"c":[],"cl":2,"dom":1,"frc":1,"h":"gl","i":142,"its":0,"l":12,"n":"","p":"guilin_142","s":9050584,"v":443,"x":12278277,"y":2891750},{"4k":0,"bb":2597888,"bl":11627520,"br":12011520,"bt":2871296,"c":[],"cl":2,"dom":1,"frc":1,"h":"bs","i":203,"its":0,"l":13,"n":"ɫ","p":"baise_203","s":8833776,"v":443,"x":11869566,"y":2724709},{"4k":0,"bb":2361344,"bl":12116992,"br":12223488,"bt":2487296,"c":[],"cl":2,"dom":1,"frc":1,"h":"bh","i":295,"its":0,"l":13,"n":"","p":"beihai_295","s":2929948,"v":443,"x":12148051,"y":2434246},{"4k":0,"bb":2447360,"bl":11863040,"br":12036096,"bt":2659328,"c":[],"cl":2,"dom":0,"frc":1,"h":"cz","i":144,"its":0,"l":14,"n":"","p":"chongzuo_144","s":4293137,"v":443,"x":11952674,"y":2540952},{"4k":0,"bb":2573312,"bl":12156928,"br":12320768,"bt":2742272,"c":[],"cl":2,"dom":1,"frc":1,"h":"gg","i":341,"its":0,"l":13,"n":"","p":"guigang_341","s":4582080,"v":443,"x":12201371,"y":2629300},{"4k":0,"bb":2434048,"bl":11965440,"br":12091392,"bt":2541568,"c":[],"cl":2,"dom":0,"frc":1,"h":"fcg","i":204,"its":0,"l":15,"n":"Ǹ","p":"fangchenggang_204","s":2483220,"v":443,"x":12062759,"y":2458820},{"4k":0,"bb":2681856,"bl":11864064,"br":12152832,"bt":2933760,"c":[],"cl":2,"dom":0,"frc":1,"h":"hc","i":143,"its":0,"l":14,"n":"ӳ","p":"hechi_143","s":8657320,"v":443,"x":12032866,"y":2820782},{"4k":0,"bb":2694144,"bl":12309504,"br":12476416,"bt":2877440,"c":[],"cl":2,"dom":0,"frc":1,"h":"hz","i":260,"its":0,"l":14,"n":"","p":"hezhou_260","s":3087896,"v":443,"x":12420393,"y":2785558},{"4k":0,"bb":2648064,"bl":12069888,"br":12297216,"bt":2793472,"c":[],"cl":2,"dom":0,"frc":1,"h":"lb","i":202,"its":0,"l":14,"n":"","p":"laibin_202","s":3988238,"v":443,"x":12159448,"y":2706201},{"4k":0,"bb":2724864,"bl":12088320,"br":12266496,"bt":2988032,"c":[],"cl":2,"dom":1,"frc":1,"h":"lz","i":305,"its":0,"l":12,"n":"","p":"liuzhou_305","s":7070375,"v":443,"x":12180931,"y":2776093},{"4k":1,"bb":2520064,"bl":11948032,"br":12204032,"bt":2741248,"c":[],"cl":2,"dom":1,"frc":1,"h":"nn","i":261,"its":1,"l":12,"n":"","p":"nanning_261","s":23933672,"v":443,"x":12064168,"y":2593869},{"4k":0,"bb":2436096,"bl":12043264,"br":12231680,"bt":2578432,"c":[],"cl":2,"dom":1,"frc":1,"h":"qz","i":145,"its":0,"l":13,"n":"","p":"qinzhou_145","s":4654444,"v":443,"x":12096190,"y":2493771},{"4k":0,"bb":2568192,"bl":12281856,"br":12432384,"bt":2786304,"c":[],"cl":2,"dom":1,"frc":1,"h":"wz","i":304,"its":0,"l":13,"n":"","p":"wuzhou_304","s":4529060,"v":443,"x":12388396,"y":2673339},{"4k":0,"bb":2452480,"bl":12194816,"br":12346368,"bt":2631680,"c":[],"cl":2,"dom":1,"frc":1,"h":"yl","i":361,"its":0,"l":14,"n":"","p":"yulin_361","s":6256769,"v":443,"x":12264306,"y":2572258}],"cl":1,"dom":1,"frc":1,"h":"","i":9,"its":0,"l":12,"n":"׳","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3003392,"bl":11813888,"br":11943936,"bt":3149824,"c":[],"cl":2,"dom":1,"frc":1,"h":"gy","i":146,"its":1,"l":12,"n":"","p":"guiyang_146","s":12010097,"v":443,"x":11870882,"y":3060846},{"4k":0,"bb":2900992,"bl":11716608,"br":11865088,"bt":3058688,"c":[],"cl":2,"dom":1,"frc":1,"h":"as","i":263,"its":0,"l":13,"n":"˳","p":"anshun_263","s":3927257,"v":443,"x":11794711,"y":3012219},{"4k":0,"bb":3024896,"bl":11533312,"br":11882496,"bt":3202048,"c":[],"cl":2,"dom":0,"frc":1,"h":"bjd","i":206,"its":0,"l":14,"n":"Ͻڵ","p":"bijiedi_206","s":9120149,"v":443,"x":11721033,"y":3142281},{"4k":0,"bb":2896896,"bl":11612160,"br":11769856,"bt":3095552,"c":[],"cl":2,"dom":1,"frc":1,"h":"lps","i":147,"its":0,"l":13,"n":"ˮ","p":"liupanshui_147","s":4115933,"v":443,"x":11670590,"y":3054083},{"4k":0,"bb":2894848,"bl":11944960,"br":12200960,"bt":3171328,"c":[],"cl":2,"dom":1,"frc":1,"h":"qdnmzdzzz","i":342,"its":0,"l":11,"n":"ǭ嶱","p":"qiandongnanmiaozudongzuzizhi_342","s":7922286,"v":443,"x":12021445,"y":3053001},{"4k":0,"bb":2865152,"bl":11824128,"br":12057600,"bt":3165184,"c":[],"cl":2,"dom":0,"frc":1,"h":"qnbyzmzzz","i":306,"its":0,"l":11,"n":"ǭϲ","p":"qiannanbuyizumiaozuzizhi_306","s":7904880,"v":443,"x":11970165,"y":3012314},{"4k":0,"bb":2810880,"bl":11636736,"br":11859968,"bt":3003392,"c":[],"cl":2,"dom":0,"frc":1,"h":"qxnbyzmzzz","i":343,"its":0,"l":11,"n":"ǭϲ","p":"qianxinanbuyizumiaozuzizhi_343","s":5564973,"v":443,"x":11678750,"y":2869250},{"4k":0,"bb":3119104,"bl":11995136,"br":12187648,"bt":3366912,"c":[],"cl":2,"dom":0,"frc":1,"h":"trd","i":205,"its":0,"l":14,"n":"ͭʵ","p":"tongrendi_205","s":6817188,"v":443,"x":12155781,"y":3195893},{"4k":0,"bb":3121152,"bl":11756544,"br":12047360,"bt":3384320,"c":[],"cl":2,"dom":1,"frc":1,"h":"zy","i":262,"its":0,"l":13,"n":"","p":"zunyi_262","s":10905159,"v":443,"x":11903929,"y":3195131}],"cl":1,"dom":1,"frc":1,"h":"","i":10,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":2202624,"bl":12253184,"br":12325888,"bt":2280448,"c":[],"cl":2,"dom":1,"frc":1,"h":"hk","i":125,"its":0,"l":13,"n":"","p":"haikou_125","s":5254065,"v":443,"x":12282523,"y":2262686},{"4k":0,"bb":397312,"bl":12086272,"br":13144064,"bt":2288640,"c":[],"cl":2,"dom":0,"frc":1,"h":"hnszxxjxzd","i":296,"its":0,"l":13,"n":"ʡֱϽؼλ","p":"hainanshengzhixiaxianjixingzhengdan_296","s":27428558,"v":443,"x":12204337,"y":2170840},{"4k":0,"bb":2037760,"bl":12126208,"br":12225536,"bt":2098176,"c":[],"cl":2,"dom":1,"frc":1,"h":"sy","i":121,"its":0,"l":12,"n":"","p":"sanya_121","s":1979206,"v":443,"x":12191644,"y":2054296}],"cl":1,"dom":1,"frc":1,"h":"","i":11,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4474880,"bl":12637184,"br":12857344,"bt":4662272,"c":[],"cl":2,"dom":1,"frc":1,"h":"sjz","i":150,"its":1,"l":12,"n":"ʯׯ","p":"shijiazhuang_150","s":23147053,"v":443,"x":12748538,"y":4559724},{"4k":0,"bb":4586496,"bl":12664832,"br":12951552,"bt":4832256,"c":[],"cl":2,"dom":1,"frc":1,"h":"bd","i":307,"its":0,"l":13,"n":"","p":"baoding_307","s":16420615,"v":443,"x":12854318,"y":4677432},{"4k":0,"bb":4478976,"bl":12879872,"br":13131776,"bt":4687872,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":149,"its":0,"l":13,"n":"","p":"cangzhou_149","s":8851012,"v":443,"x":13007297,"y":4596606},{"4k":0,"bb":4866048,"bl":12903424,"br":13276160,"bt":5226496,"c":[],"cl":2,"dom":1,"frc":1,"h":"cd","i":207,"its":0,"l":14,"n":"е","p":"chengde_207","s":10190169,"v":443,"x":13130309,"y":4981756},{"4k":0,"bb":4282368,"bl":12631040,"br":12857344,"bt":4417536,"c":[],"cl":2,"dom":1,"frc":1,"h":"hd","i":151,"its":0,"l":13,"n":"","p":"handan_151","s":8060648,"v":443,"x":12746200,"y":4360331},{"4k":0,"bb":4421632,"bl":12823552,"br":12977152,"bt":4605952,"c":[],"cl":2,"dom":1,"frc":1,"h":"hs","i":208,"its":0,"l":13,"n":"ˮ","p":"hengshui_208","s":5616051,"v":443,"x":12877237,"y":4517087},{"4k":0,"bb":4620288,"bl":12925952,"br":13054976,"bt":4853760,"c":[],"cl":2,"dom":1,"frc":1,"h":"lf","i":191,"its":0,"l":13,"n":"ȷ","p":"langfang_191","s":6967694,"v":443,"x":12992591,"y":4769913},{"4k":1,"bb":4756480,"bl":13199360,"br":13344768,"bt":4928512,"c":[],"cl":2,"dom":1,"frc":1,"h":"qhd","i":148,"its":0,"l":12,"n":"ػʵ","p":"qinhuangdao_148","s":12894123,"v":443,"x":13314638,"y":4829708},{"4k":0,"bb":4680704,"bl":13081600,"br":13298688,"bt":4907008,"c":[],"cl":2,"dom":1,"frc":1,"h":"ts","i":265,"its":1,"l":13,"n":"ɽ","p":"tangshan_265","s":18289183,"v":443,"x":13156663,"y":4785770},{"4k":0,"bb":4379648,"bl":12663808,"br":12898304,"bt":4527104,"c":[],"cl":2,"dom":1,"frc":1,"h":"xt","i":266,"its":0,"l":13,"n":"̨","p":"xingtai_266","s":7047856,"v":443,"x":12747474,"y":4423807},{"4k":0,"bb":4774912,"bl":12670976,"br":12965888,"bt":5155840,"c":[],"cl":2,"dom":1,"frc":1,"h":"zjk","i":264,"its":0,"l":13,"n":"żҿ","p":"zhangjiakou_264","s":9573829,"v":443,"x":12790099,"y":4959124}],"cl":1,"dom":1,"frc":1,"h":"","i":12,"its":0,"l":12,"n":"ӱʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":5445632,"bl":13991936,"br":14499840,"bt":5859328,"c":[],"cl":2,"dom":1,"frc":1,"h":"heb","i":48,"its":1,"l":12,"n":"","p":"haerbin_48","s":27827108,"v":443,"x":14086779,"y":5718675},{"4k":0,"bb":5651456,"bl":13776896,"br":14004224,"bt":5990400,"c":[],"cl":2,"dom":1,"frc":1,"h":"dq","i":50,"its":0,"l":12,"n":"","p":"daqing_50","s":7115903,"v":443,"x":13927447,"y":5844942},{"4k":0,"bb":6571008,"bl":13490176,"br":14142464,"bt":7054336,"c":[],"cl":2,"dom":1,"frc":1,"h":"dxald","i":38,"its":0,"l":10,"n":"˰","p":"daxinganlingdi_38","s":4997030,"v":443,"x":13870692,"y":6757751},{"4k":0,"bb":5920768,"bl":14435328,"br":14753792,"bt":6134784,"c":[],"cl":2,"dom":1,"frc":1,"h":"hg","i":43,"its":0,"l":13,"n":"׸","p":"hegang_43","s":2899943,"v":443,"x":14505602,"y":5968657},{"4k":0,"bb":6006784,"bl":13887488,"br":14420992,"bt":6590464,"c":[],"cl":2,"dom":1,"frc":1,"h":"hh","i":39,"its":0,"l":14,"n":"ں","p":"heihe_39","s":8126071,"v":443,"x":14197287,"y":6456725},{"4k":0,"bb":5569536,"bl":14516224,"br":14912512,"bt":5849088,"c":[],"cl":2,"dom":1,"frc":1,"h":"jx","i":46,"its":0,"l":13,"n":"","p":"jixi_46","s":4099610,"v":443,"x":14580357,"y":5638357},{"4k":0,"bb":5741568,"bl":14416896,"br":15040512,"bt":6154240,"c":[],"cl":2,"dom":1,"frc":1,"h":"jms","i":42,"its":0,"l":12,"n":"ľ˹","p":"jiamusi_42","s":7734115,"v":443,"x":14508101,"y":5879000},{"4k":0,"bb":5348352,"bl":14274560,"br":14620672,"bt":5748736,"c":[],"cl":2,"dom":1,"frc":1,"h":"mdj","i":49,"its":0,"l":13,"n":"ĵ","p":"mudanjiang_49","s":5511489,"v":443,"x":14431502,"y":5522040},{"4k":0,"bb":5785600,"bl":13626368,"br":14102528,"bt":6233088,"c":[],"cl":2,"dom":1,"frc":1,"h":"qqhe","i":41,"its":0,"l":13,"n":"","p":"qiqihaer_41","s":10868386,"v":443,"x":13795365,"y":5969317},{"4k":0,"bb":5684224,"bl":14483456,"br":14688256,"bt":5805056,"c":[],"cl":2,"dom":1,"frc":1,"h":"qth","i":47,"its":0,"l":14,"n":"̨","p":"qitaihe_47","s":1288050,"v":443,"x":14584082,"y":5713696},{"4k":0,"bb":5715968,"bl":14545920,"br":14956544,"bt":6005760,"c":[],"cl":2,"dom":1,"frc":1,"h":"sys","i":45,"its":0,"l":13,"n":"˫Ѽɽ","p":"shuangyashan_45","s":3183152,"v":443,"x":14601428,"y":5854242},{"4k":0,"bb":5670912,"bl":13900800,"br":14312448,"bt":6092800,"c":[],"cl":2,"dom":1,"frc":1,"h":"sh","i":44,"its":0,"l":13,"n":"绯","p":"suihua_44","s":8546525,"v":443,"x":14135004,"y":5855176},{"4k":0,"bb":5827584,"bl":14208000,"br":14559232,"bt":6319104,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":40,"its":0,"l":14,"n":"","p":"yichun_40","s":3550152,"v":443,"x":14343343,"y":6030683}],"cl":1,"dom":1,"frc":1,"h":"","i":13,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4039680,"bl":12548096,"br":12717056,"bt":4139008,"c":[],"cl":2,"dom":1,"frc":1,"h":"zz","i":268,"its":1,"l":12,"n":"֣","p":"zhengzhou_268","s":25326454,"v":443,"x":12649567,"y":4105840},{"4k":0,"bb":4166656,"bl":12649472,"br":12802048,"bt":4327424,"c":[],"cl":2,"dom":1,"frc":1,"h":"ay","i":267,"its":0,"l":12,"n":"","p":"anyang_267","s":5907301,"v":443,"x":12735044,"y":4289481},{"4k":0,"bb":4199424,"bl":12690432,"br":12776448,"bt":4283392,"c":[],"cl":2,"dom":1,"frc":1,"h":"hb","i":215,"its":0,"l":13,"n":"ױ","p":"hebi_215","s":1863555,"v":443,"x":12724387,"y":4241836},{"4k":0,"bb":4125696,"bl":12472320,"br":12554240,"bt":4177920,"c":[],"cl":2,"dom":0,"frc":1,"h":"jy","i":1277,"its":0,"l":13,"n":"Դ","p":"jiyuan_1277","s":1475878,"v":443,"x":12535733,"y":4149037},{"4k":0,"bb":4114432,"bl":12531712,"br":12652544,"bt":4207616,"c":[],"cl":2,"dom":1,"frc":1,"h":"jz","i":211,"its":0,"l":13,"n":"","p":"jiaozuo_211","s":3602514,"v":443,"x":12606908,"y":4169150},{"4k":0,"bb":4031488,"bl":12677120,"br":12832768,"bt":4143104,"c":[],"cl":2,"dom":1,"frc":1,"h":"kf","i":210,"its":0,"l":13,"n":"","p":"kaifeng_210","s":4687021,"v":443,"x":12725504,"y":4112520},{"4k":0,"bb":3926016,"bl":12631040,"br":12724224,"bt":4003840,"c":[],"cl":2,"dom":0,"frc":1,"h":"lh","i":344,"its":0,"l":13,"n":"","p":"luohe_344","s":2257089,"v":443,"x":12693146,"y":3949717},{"4k":1,"bb":3946496,"bl":12371968,"br":12578816,"bt":4150272,"c":[],"cl":2,"dom":1,"frc":1,"h":"ly","i":153,"its":0,"l":12,"n":"","p":"luoyang_153","s":21785286,"v":443,"x":12519129,"y":4088448},{"4k":0,"bb":3775488,"bl":12354560,"br":12670976,"bt":3979264,"c":[],"cl":2,"dom":1,"frc":1,"h":"ny","i":309,"its":0,"l":13,"n":"","p":"nanyang_309","s":14737414,"v":443,"x":12527475,"y":3871405},{"4k":0,"bb":3889152,"bl":12495872,"br":12656640,"bt":4051968,"c":[],"cl":2,"dom":1,"frc":1,"h":"pds","i":213,"its":0,"l":13,"n":"ƽɽ","p":"pingdingshan_213","s":5961878,"v":443,"x":12601567,"y":3974311},{"4k":0,"bb":4184064,"bl":12787712,"br":12926976,"bt":4305920,"c":[],"cl":2,"dom":1,"frc":1,"h":"py","i":209,"its":0,"l":12,"n":"","p":"puyang_209","s":3258727,"v":443,"x":12805878,"y":4243481},{"4k":0,"bb":3945472,"bl":12285952,"br":12472320,"bt":4152320,"c":[],"cl":2,"dom":1,"frc":1,"h":"smx","i":212,"its":0,"l":13,"n":"Ͽ","p":"sanmenxia_212","s":4052520,"v":443,"x":12379622,"y":4109213},{"4k":0,"bb":3965952,"bl":12782592,"br":12986368,"bt":4121600,"c":[],"cl":2,"dom":1,"frc":1,"h":"sq","i":154,"its":0,"l":13,"n":"","p":"shangqiu_154","s":6841470,"v":443,"x":12875663,"y":4061012},{"4k":0,"bb":4122624,"bl":12621824,"br":12805120,"bt":4254720,"c":[],"cl":2,"dom":1,"frc":1,"h":"xx","i":152,"its":0,"l":13,"n":"","p":"xinxiang_152","s":5815425,"v":443,"x":12683159,"y":4180929},{"4k":0,"bb":3660800,"bl":12658688,"br":12908544,"bt":3828736,"c":[],"cl":2,"dom":1,"frc":1,"h":"xy","i":214,"its":0,"l":13,"n":"","p":"xinyang_214","s":12944933,"v":443,"x":12698936,"y":3757298},{"4k":0,"bb":3963904,"bl":12587008,"br":12728320,"bt":4060160,"c":[],"cl":2,"dom":1,"frc":1,"h":"xc","i":155,"its":0,"l":13,"n":"","p":"xuchang_155","s":4130441,"v":443,"x":12674841,"y":4010266},{"4k":0,"bb":3878912,"bl":12700672,"br":12875776,"bt":4050944,"c":[],"cl":2,"dom":1,"frc":1,"h":"zk","i":308,"its":0,"l":13,"n":"ܿ","p":"zhoukou_308","s":7507646,"v":443,"x":12764507,"y":3954547},{"4k":0,"bb":3776512,"bl":12590080,"br":12827648,"bt":3943424,"c":[],"cl":2,"dom":0,"frc":1,"h":"zmd","i":269,"its":0,"l":13,"n":"פ","p":"zhumadian_269","s":7739736,"v":443,"x":12693783,"y":3874182}],"cl":1,"dom":1,"frc":1,"h":"","i":14,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3210240,"bl":12456960,"br":12721152,"bt":3313664,"c":[],"cl":2,"dom":1,"frc":1,"h":"cs","i":158,"its":1,"l":12,"n":"ɳ","p":"changsha_158","s":24928169,"v":443,"x":12573153,"y":3258105},{"4k":0,"bb":2844672,"bl":12493824,"br":12718080,"bt":3085312,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":275,"its":0,"l":13,"n":"","p":"chenzhou_275","s":6967584,"v":443,"x":12581589,"y":2952699},{"4k":0,"bb":3279872,"bl":12300288,"br":12503040,"bt":3499008,"c":[],"cl":2,"dom":1,"frc":1,"h":"cd","i":219,"its":0,"l":12,"n":"","p":"changde_219","s":9065293,"v":443,"x":12435078,"y":3359518},{"4k":0,"bb":2994176,"bl":12417024,"br":12611584,"bt":3163136,"c":[],"cl":2,"dom":1,"frc":1,"h":"hy","i":159,"its":0,"l":13,"n":"","p":"hengyang_159","s":10285920,"v":443,"x":12532306,"y":3091415},{"4k":0,"bb":2963456,"bl":12110848,"br":12369920,"bt":3358720,"c":[],"cl":2,"dom":1,"frc":1,"h":"hh","i":363,"its":0,"l":13,"n":"","p":"huaihua_363","s":9564243,"v":443,"x":12245816,"y":3173822},{"4k":0,"bb":3129344,"bl":12331008,"br":12527616,"bt":3259392,"c":[],"cl":2,"dom":1,"frc":1,"h":"ld","i":221,"its":0,"l":13,"n":"¦","p":"loudi_221","s":5301527,"v":443,"x":12468039,"y":3191559},{"4k":0,"bb":2975744,"bl":12225536,"br":12479488,"bt":3187712,"c":[],"cl":2,"dom":1,"frc":1,"h":"sy","i":273,"its":0,"l":13,"n":"","p":"shaoyang_273","s":9938079,"v":443,"x":12409368,"y":3134396},{"4k":0,"bb":3145728,"bl":12468224,"br":12591104,"bt":3238912,"c":[],"cl":2,"dom":0,"frc":1,"h":"xt","i":313,"its":0,"l":13,"n":"̶","p":"xiangtan_313","s":4685126,"v":443,"x":12573737,"y":3208160},{"4k":0,"bb":3193856,"bl":12154880,"br":12290048,"bt":3436544,"c":[],"cl":2,"dom":0,"frc":1,"h":"xxtjzmzzz","i":274,"its":0,"l":14,"n":"","p":"xiangxitujiazumiaozuzizhi_274","s":4740425,"v":443,"x":12216945,"y":3268607},{"4k":0,"bb":3225600,"bl":12325888,"br":12574720,"bt":3422208,"c":[],"cl":2,"dom":0,"frc":1,"h":"yy","i":272,"its":0,"l":13,"n":"","p":"yiyang_272","s":5977967,"v":443,"x":12508180,"y":3299125},{"4k":0,"bb":2812928,"bl":12351488,"br":12520448,"bt":3088384,"c":[],"cl":2,"dom":1,"frc":1,"h":"yz","i":314,"its":0,"l":13,"n":"","p":"yongzhou_314","s":7952675,"v":443,"x":12425479,"y":3032799},{"4k":0,"bb":3281920,"bl":12503040,"br":12708864,"bt":3464192,"c":[],"cl":2,"dom":1,"frc":1,"h":"yy","i":220,"its":0,"l":13,"n":"","p":"yueyang_220","s":9238679,"v":443,"x":12594306,"y":3400824},{"4k":0,"bb":3338240,"bl":12211200,"br":12395520,"bt":3457024,"c":[],"cl":2,"dom":1,"frc":1,"h":"zjj","i":312,"its":0,"l":13,"n":"żҽ","p":"zhangjiajie_312","s":3340101,"v":443,"x":12299343,"y":3370210},{"4k":0,"bb":2985984,"bl":12575744,"br":12703744,"bt":3233792,"c":[],"cl":2,"dom":1,"frc":1,"h":"zz","i":222,"its":0,"l":13,"n":"","p":"zhuzhou_222","s":7329673,"v":443,"x":12594871,"y":3207895}],"cl":1,"dom":1,"frc":1,"h":"","i":15,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3477504,"bl":12657664,"br":12812288,"bt":3658752,"c":[],"cl":2,"dom":1,"frc":1,"h":"wh","i":218,"its":1,"l":12,"n":"人","p":"wuhan_218","s":28705679,"v":443,"x":12725273,"y":3558756},{"4k":0,"bb":3484672,"bl":12746752,"br":12813312,"bt":3562496,"c":[],"cl":2,"dom":1,"frc":1,"h":"ez","i":122,"its":0,"l":14,"n":"","p":"ezhou_122","s":1878012,"v":443,"x":12790921,"y":3532802},{"4k":0,"bb":3368960,"bl":12063744,"br":12317696,"bt":3662848,"c":[],"cl":2,"dom":1,"frc":1,"h":"estjzmzzz","i":373,"its":0,"l":14,"n":"ʩ","p":"enshitujiazumiaozuzizhi_373","s":7879921,"v":443,"x":12189033,"y":3517581},{"4k":0,"bb":3446784,"bl":12735488,"br":12930048,"bt":3690496,"c":[],"cl":2,"dom":1,"frc":1,"h":"hg","i":271,"its":0,"l":14,"n":"Ƹ","p":"huanggang_271","s":11946052,"v":443,"x":12788396,"y":3540883},{"4k":0,"bb":3419136,"bl":12749824,"br":12860416,"bt":3525632,"c":[],"cl":2,"dom":1,"frc":1,"h":"hs","i":311,"its":0,"l":13,"n":"ʯ","p":"huangshi_311","s":3551321,"v":443,"x":12806938,"y":3508277},{"4k":0,"bb":3490816,"bl":12238848,"br":12672000,"bt":3723264,"c":[],"cl":2,"dom":0,"frc":1,"h":"hbszxxjxzd","i":345,"its":0,"l":13,"n":"ʡֱϽؼλ","p":"hubeishengzhixiaxianjixingzhengdan_345","s":5388376,"v":443,"x":12455557,"y":3607403},{"4k":0,"bb":3531776,"bl":12452864,"br":12635136,"bt":3690496,"c":[],"cl":2,"dom":1,"frc":1,"h":"jm","i":217,"its":0,"l":13,"n":"","p":"jingmen_217","s":6337019,"v":443,"x":12490833,"y":3615941},{"4k":0,"bb":3408896,"bl":12384256,"br":12701696,"bt":3567616,"c":[],"cl":2,"dom":1,"frc":1,"h":"jz","i":157,"its":0,"l":12,"n":"","p":"jingzhou_157","s":7883985,"v":443,"x":12495301,"y":3525648},{"4k":0,"bb":3676160,"bl":12182528,"br":12423168,"bt":3908608,"c":[],"cl":2,"dom":1,"frc":1,"h":"sy","i":216,"its":0,"l":13,"n":"ʮ","p":"shiyan_216","s":8510263,"v":443,"x":12334839,"y":3823705},{"4k":0,"bb":3652608,"bl":12549120,"br":12706816,"bt":3798016,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":371,"its":0,"l":13,"n":"","p":"suizhou_371","s":5741716,"v":443,"x":12622550,"y":3700859},{"4k":0,"bb":3640320,"bl":12331008,"br":12594176,"bt":3823616,"c":[],"cl":2,"dom":1,"frc":1,"h":"xf","i":156,"its":0,"l":12,"n":"","p":"xiangfan_156","s":10727197,"v":443,"x":12482289,"y":3742391},{"4k":0,"bb":3358720,"bl":12639232,"br":12800000,"bt":3521536,"c":[],"cl":2,"dom":1,"frc":1,"h":"xn","i":362,"its":0,"l":13,"n":"","p":"xianning_362","s":5411687,"v":443,"x":12727180,"y":3462453},{"4k":0,"bb":3530752,"bl":12614656,"br":12758016,"bt":3722240,"c":[],"cl":2,"dom":1,"frc":1,"h":"xg","i":310,"its":0,"l":13,"n":"Т","p":"xiaogan_310","s":6523012,"v":443,"x":12681984,"y":3601589},{"4k":0,"bb":3475456,"bl":12273664,"br":12478464,"bt":3686400,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":270,"its":0,"l":13,"n":"˲","p":"yichang_270","s":10163155,"v":443,"x":12389211,"y":3571525}],"cl":1,"dom":1,"frc":1,"h":"","i":16,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":5322752,"bl":13864960,"br":14149632,"bt":5632000,"c":[],"cl":2,"dom":1,"frc":1,"h":"cc","i":53,"its":1,"l":12,"n":"","p":"changchun_53","s":25943191,"v":443,"x":13951841,"y":5408059},{"4k":0,"bb":5471232,"bl":13541376,"br":13846528,"bt":5799936,"c":[],"cl":2,"dom":1,"frc":1,"h":"bc","i":51,"its":0,"l":13,"n":"׳","p":"baicheng_51","s":5816489,"v":443,"x":13675225,"y":5689688},{"4k":0,"bb":5038080,"bl":14040064,"br":14285824,"bt":5257216,"c":[],"cl":2,"dom":0,"frc":1,"h":"bs","i":57,"its":0,"l":13,"n":"ɽ","p":"baishan_57","s":3734197,"v":443,"x":14074329,"y":5124097},{"4k":0,"bb":5217280,"bl":13987840,"br":14252032,"bt":5537792,"c":[],"cl":2,"dom":1,"frc":1,"h":"jl","i":55,"its":0,"l":12,"n":"","p":"jilin_55","s":8160825,"v":443,"x":14088310,"y":5411378},{"4k":0,"bb":5177344,"bl":13897728,"br":14010368,"bt":5319680,"c":[],"cl":2,"dom":1,"frc":1,"h":"ly","i":183,"its":0,"l":13,"n":"Դ","p":"liaoyuan_183","s":2381679,"v":443,"x":13931797,"y":5266538},{"4k":0,"bb":5256192,"bl":13726720,"br":14003200,"bt":5460992,"c":[],"cl":2,"dom":1,"frc":1,"h":"sp","i":56,"its":0,"l":12,"n":"ƽ","p":"siping_56","s":5636687,"v":443,"x":13843452,"y":5308675},{"4k":0,"bb":5434368,"bl":13705216,"br":14049280,"bt":5678080,"c":[],"cl":2,"dom":1,"frc":1,"h":"sy","i":52,"its":0,"l":13,"n":"ԭ","p":"songyuan_52","s":6251789,"v":443,"x":13896307,"y":5614195},{"4k":0,"bb":4964352,"bl":13944832,"br":14111744,"bt":5286912,"c":[],"cl":2,"dom":1,"frc":1,"h":"th","i":165,"its":0,"l":13,"n":"ͨ","p":"tonghua_165","s":5132125,"v":443,"x":14020453,"y":5092491},{"4k":0,"bb":5132288,"bl":14190592,"br":14619648,"bt":5516288,"c":[],"cl":2,"dom":1,"frc":1,"h":"ybcxzzz","i":54,"its":0,"l":11,"n":"ӱ߳","p":"yanbianchaoxianzuzizhi_54","s":7416502,"v":443,"x":14417767,"y":5266979}],"cl":1,"dom":1,"frc":1,"h":"","i":17,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3640320,"bl":13176832,"br":13275136,"bt":3822592,"c":[],"cl":2,"dom":1,"frc":1,"h":"nj","i":315,"its":1,"l":12,"n":"Ͼ","p":"nanjing_315","s":31021399,"v":443,"x":13225203,"y":3748900},{"4k":1,"bb":3630080,"bl":13262848,"br":13382656,"bt":3749888,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":348,"its":1,"l":12,"n":"","p":"changzhou_348","s":21076657,"v":443,"x":13356064,"y":3716504},{"4k":1,"bb":3834880,"bl":13160448,"br":13320192,"bt":4018176,"c":[],"cl":2,"dom":1,"frc":1,"h":"ha","i":162,"its":0,"l":12,"n":"","p":"huaian_162","s":15149142,"v":443,"x":13249618,"y":3953531},{"4k":0,"bb":4001792,"bl":13181952,"br":13342720,"bt":4157440,"c":[],"cl":2,"dom":1,"frc":1,"h":"lyg","i":347,"its":0,"l":12,"n":"Ƹ","p":"lianyungang_347","s":7569698,"v":443,"x":13272582,"y":4085419},{"4k":1,"bb":3690496,"bl":13381632,"br":13582336,"bt":3834880,"c":[],"cl":2,"dom":1,"frc":1,"h":"nt","i":161,"its":1,"l":12,"n":"ͨ","p":"nantong_161","s":23002386,"v":443,"x":13458552,"y":3738896},{"4k":0,"bb":3890176,"bl":13129728,"br":13267968,"bt":4062208,"c":[],"cl":2,"dom":1,"frc":1,"h":"sq","i":277,"its":0,"l":13,"n":"Ǩ","p":"suqian_277","s":8300561,"v":443,"x":13167242,"y":4000369},{"4k":1,"bb":3579904,"bl":13349888,"br":13513728,"bt":3745792,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":224,"its":1,"l":12,"n":"","p":"suzhou_224","s":38519157,"v":443,"x":13424106,"y":3650006},{"4k":0,"bb":3731456,"bl":13319168,"br":13421568,"bt":3902464,"c":[],"cl":2,"dom":1,"frc":1,"h":"tz","i":276,"its":0,"l":13,"n":"̩","p":"taizhou_276","s":8975160,"v":443,"x":13350650,"y":3800790},{"4k":1,"bb":3625984,"bl":13304832,"br":13426688,"bt":3739648,"c":[],"cl":2,"dom":1,"frc":1,"h":"wx","i":317,"its":1,"l":12,"n":"","p":"wuxi_317","s":26508436,"v":443,"x":13392937,"y":3684628},{"4k":1,"bb":3966976,"bl":12953600,"br":13211648,"bt":4132864,"c":[],"cl":2,"dom":1,"frc":1,"h":"xz","i":316,"its":0,"l":12,"n":"","p":"xuzhou_316","s":21928988,"v":443,"x":13057066,"y":4032807},{"4k":0,"bb":3816448,"bl":13298688,"br":13470720,"bt":4078592,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":223,"its":0,"l":12,"n":"γ","p":"yancheng_223","s":14111778,"v":443,"x":13377206,"y":3918849},{"4k":1,"bb":3769344,"bl":13249536,"br":13349888,"bt":3928064,"c":[],"cl":2,"dom":1,"frc":1,"h":"yz","i":346,"its":0,"l":13,"n":"","p":"yangzhou_346","s":14635676,"v":443,"x":13293904,"y":3792830},{"4k":1,"bb":3691520,"bl":13244416,"br":13358080,"bt":3783680,"c":[],"cl":2,"dom":1,"frc":1,"h":"zj","i":160,"its":0,"l":13,"n":"","p":"zhenjiang_160","s":10919920,"v":443,"x":13298752,"y":3767387}],"cl":1,"dom":1,"frc":1,"h":"","i":18,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3249152,"bl":12851200,"br":12977152,"bt":3378176,"c":[],"cl":2,"dom":1,"frc":1,"h":"nc","i":163,"its":1,"l":12,"n":"ϲ","p":"nanchang_163","s":11595843,"v":443,"x":12898192,"y":3315314},{"4k":0,"bb":3041280,"bl":12867584,"br":13059072,"bt":3292160,"c":[],"cl":2,"dom":1,"frc":1,"h":"fz","i":226,"its":0,"l":13,"n":"","p":"fuzhou_226","s":6814220,"v":443,"x":12954062,"y":3222988},{"4k":0,"bb":2795520,"bl":12681216,"br":12986368,"bt":3123200,"c":[],"cl":2,"dom":1,"frc":1,"h":"gz","i":365,"its":0,"l":13,"n":"","p":"ganzhou_365","s":13635821,"v":443,"x":12795194,"y":2959921},{"4k":0,"bb":2976768,"bl":12672000,"br":12907520,"bt":3225600,"c":[],"cl":2,"dom":1,"frc":1,"h":"ja","i":318,"its":0,"l":13,"n":"","p":"jian_318","s":9404151,"v":443,"x":12801910,"y":3118785},{"4k":0,"bb":3319808,"bl":13020160,"br":13105152,"bt":3474432,"c":[],"cl":2,"dom":1,"frc":1,"h":"jdz","i":225,"its":0,"l":12,"n":"","p":"jingdezhen_225","s":2561100,"v":443,"x":13045112,"y":3389524},{"4k":0,"bb":3315712,"bl":12684288,"br":13015040,"bt":3492864,"c":[],"cl":2,"dom":1,"frc":1,"h":"jj","i":349,"its":0,"l":13,"n":"Ž","p":"jiujiang_349","s":9351996,"v":443,"x":12914091,"y":3445125},{"4k":0,"bb":3098624,"bl":12643328,"br":12722176,"bt":3230720,"c":[],"cl":2,"dom":1,"frc":1,"h":"px","i":350,"its":0,"l":13,"n":"Ƽ","p":"pingxiang_350","s":2611022,"v":443,"x":12675065,"y":3182257},{"4k":0,"bb":3204096,"bl":12939264,"br":13191168,"bt":3444736,"c":[],"cl":2,"dom":1,"frc":1,"h":"sr","i":364,"its":0,"l":13,"n":"","p":"shangrao_364","s":10424586,"v":443,"x":13130280,"y":3286655},{"4k":0,"bb":3170304,"bl":12744704,"br":12848128,"bt":3244032,"c":[],"cl":2,"dom":1,"frc":1,"h":"xy","i":164,"its":0,"l":13,"n":"","p":"xinyu_164","s":2314045,"v":443,"x":12793382,"y":3206619},{"4k":0,"bb":3172352,"bl":12678144,"br":12931072,"bt":3368960,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":278,"its":0,"l":13,"n":"˴","p":"yichun_278","s":9226537,"v":443,"x":12737614,"y":3206242},{"4k":0,"bb":3209216,"bl":12990464,"br":13078528,"bt":3308544,"c":[],"cl":2,"dom":0,"frc":1,"h":"yt","i":279,"its":0,"l":13,"n":"ӥ̶","p":"yingtan_279","s":2057057,"v":443,"x":13032956,"y":3262116}],"cl":1,"dom":1,"frc":1,"h":"","i":19,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":5013504,"bl":13628416,"br":13784064,"bt":5291008,"c":[],"cl":2,"dom":1,"frc":1,"h":"sy","i":58,"its":1,"l":12,"n":"","p":"shenyang_58","s":28363169,"v":443,"x":13741315,"y":5103986},{"4k":0,"bb":4838400,"bl":13601792,"br":13778944,"bt":5069824,"c":[],"cl":2,"dom":1,"frc":1,"h":"as","i":320,"its":0,"l":13,"n":"ɽ","p":"anshan_320","s":5982424,"v":443,"x":13692591,"y":5000938},{"4k":0,"bb":4957184,"bl":13758464,"br":14004224,"bt":5069824,"c":[],"cl":2,"dom":1,"frc":1,"h":"bx","i":227,"its":0,"l":12,"n":"Ϫ","p":"benxi_227","s":3983882,"v":443,"x":13778549,"y":5028203},{"4k":0,"bb":4925440,"bl":13230080,"br":13504512,"bt":5190656,"c":[],"cl":2,"dom":1,"frc":1,"h":"cy","i":280,"its":0,"l":13,"n":"","p":"chaoyang_280","s":6448668,"v":443,"x":13409390,"y":5069570},{"4k":1,"bb":4648960,"bl":13461504,"br":13753344,"bt":4869120,"c":[],"cl":2,"dom":1,"frc":1,"h":"dl","i":167,"its":1,"l":12,"n":"","p":"dalian_167","s":28463882,"v":443,"x":13538978,"y":4683029},{"4k":0,"bb":4793344,"bl":13734912,"br":13996032,"bt":5008384,"c":[],"cl":2,"dom":1,"frc":1,"h":"dd","i":282,"its":0,"l":12,"n":"","p":"dandong_282","s":5955834,"v":443,"x":13847372,"y":4857436},{"4k":0,"bb":5019648,"bl":13767680,"br":13970432,"bt":5204992,"c":[],"cl":2,"dom":1,"frc":1,"h":"fs","i":184,"its":0,"l":12,"n":"˳","p":"fushun_184","s":4302789,"v":443,"x":13799757,"y":5115277},{"4k":0,"bb":5087232,"bl":13471744,"br":13690880,"bt":5260288,"c":[],"cl":2,"dom":1,"frc":1,"h":"fx","i":59,"its":0,"l":14,"n":"","p":"fuxin_59","s":4017874,"v":443,"x":13545115,"y":5136296},{"4k":0,"bb":4832256,"bl":13271040,"br":13481984,"bt":5015552,"c":[],"cl":2,"dom":1,"frc":1,"h":"hld","i":319,"its":0,"l":13,"n":"«","p":"huludao_319","s":5042360,"v":443,"x":13452371,"y":4942605},{"4k":0,"bb":4944896,"bl":13438976,"br":13648896,"bt":5152768,"c":[],"cl":2,"dom":1,"frc":1,"h":"jz","i":166,"its":0,"l":13,"n":"","p":"jinzhou_166","s":4780252,"v":443,"x":13484681,"y":4998877},{"4k":0,"bb":4941824,"bl":13646848,"br":13770752,"bt":5075968,"c":[],"cl":2,"dom":1,"frc":1,"h":"ly","i":351,"its":1,"l":14,"n":"","p":"liaoyang_351","s":3616077,"v":443,"x":13712505,"y":5024558},{"4k":0,"bb":4931584,"bl":13522944,"br":13629440,"bt":5052416,"c":[],"cl":2,"dom":1,"frc":1,"h":"pj","i":228,"its":0,"l":13,"n":"̽","p":"panjin_228","s":5195087,"v":443,"x":13589726,"y":5002567},{"4k":0,"bb":5130240,"bl":13743104,"br":13928448,"bt":5358592,"c":[],"cl":2,"dom":0,"frc":1,"h":"tl","i":60,"its":0,"l":13,"n":"","p":"tieling_60","s":5941933,"v":443,"x":13786935,"y":5175882},{"4k":0,"bb":4827136,"bl":13565952,"br":13694976,"bt":4976640,"c":[],"cl":2,"dom":1,"frc":1,"h":"yk","i":281,"its":0,"l":13,"n":"Ӫ","p":"yingkou_281","s":4158012,"v":443,"x":13608007,"y":4936054}],"cl":1,"dom":1,"frc":1,"h":"","i":20,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4779008,"bl":12303360,"br":12503040,"bt":5042176,"c":[],"cl":2,"dom":1,"frc":1,"h":"hhht","i":321,"its":1,"l":12,"n":"ͺ","p":"huhehaote_321","s":9296994,"v":443,"x":12440951,"y":4961799},{"4k":0,"bb":4469760,"bl":10817536,"br":11897856,"bt":5253120,"c":[],"cl":2,"dom":1,"frc":1,"h":"als","i":230,"its":0,"l":14,"n":"","p":"alashan_230","s":7638841,"v":443,"x":11770534,"y":4674264},{"4k":1,"bb":4874240,"bl":12162048,"br":12407808,"bt":5243904,"c":[],"cl":2,"dom":1,"frc":1,"h":"bt","i":229,"its":0,"l":12,"n":"ͷ","p":"baotou_229","s":9812465,"v":443,"x":12228223,"y":4934685},{"4k":0,"bb":4862976,"bl":11711488,"br":12235776,"bt":5202944,"c":[],"cl":2,"dom":1,"frc":1,"h":"byne","i":169,"its":0,"l":12,"n":"׶","p":"bayannaoer_169","s":8894741,"v":443,"x":11955189,"y":4947297},{"4k":0,"bb":5026816,"bl":12954624,"br":13469696,"bt":5630976,"c":[],"cl":2,"dom":1,"frc":1,"h":"cf","i":297,"its":0,"l":12,"n":"","p":"chifeng_297","s":13115679,"v":443,"x":13235547,"y":5171651},{"4k":0,"bb":4499456,"bl":11852800,"br":12409856,"bt":4968448,"c":[],"cl":2,"dom":1,"frc":1,"h":"eeds","i":283,"its":0,"l":12,"n":"˹","p":"eerduosi_283","s":11680444,"v":443,"x":12221783,"y":4782542},{"4k":0,"bb":5926912,"bl":12861440,"br":14035968,"bt":7012352,"c":[],"cl":2,"dom":1,"frc":1,"h":"hlbe","i":61,"its":0,"l":12,"n":"ױ","p":"hulunbeier_61","s":16140034,"v":443,"x":13333126,"y":6279265},{"4k":0,"bb":5169152,"bl":13274112,"br":13773824,"bt":5700608,"c":[],"cl":2,"dom":1,"frc":1,"h":"tl","i":64,"its":0,"l":12,"n":"ͨ","p":"tongliao_64","s":7599414,"v":443,"x":13611422,"y":5377940},{"4k":0,"bb":4700160,"bl":11866112,"br":11932672,"bt":4826112,"c":[],"cl":2,"dom":1,"frc":1,"h":"wh","i":123,"its":0,"l":13,"n":"ں","p":"wuhai_123","s":1125745,"v":443,"x":11888982,"y":4789144},{"4k":0,"bb":4861952,"bl":12282880,"br":12782592,"bt":5342208,"c":[],"cl":2,"dom":1,"frc":1,"h":"wlcb","i":168,"its":0,"l":12,"n":"첼","p":"wulanchabu_168","s":8024963,"v":443,"x":12594855,"y":4984080},{"4k":0,"bb":5069824,"bl":12374016,"br":13373440,"bt":5875712,"c":[],"cl":2,"dom":1,"frc":1,"h":"xlgl","i":63,"its":0,"l":11,"n":"ֹ","p":"xilinguole_63","s":9231491,"v":443,"x":12919227,"y":5426157},{"4k":0,"bb":5475328,"bl":13300736,"br":13765632,"bt":6020096,"c":[],"cl":2,"dom":0,"frc":1,"h":"xa","i":62,"its":0,"l":11,"n":"˰","p":"xingan_62","s":6085341,"v":443,"x":13589292,"y":5762674}],"cl":1,"dom":1,"frc":1,"h":"","i":21,"its":0,"l":12,"n":"ɹ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4481024,"bl":11782144,"br":11897856,"bt":4677632,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":360,"its":0,"l":12,"n":"","p":"yinchuan_360","s":7210671,"v":443,"x":11826597,"y":4622375},{"4k":0,"bb":4171776,"bl":11724800,"br":11908096,"bt":4363264,"c":[],"cl":2,"dom":1,"frc":1,"h":"gy","i":246,"its":0,"l":13,"n":"ԭ","p":"guyuan_246","s":3536198,"v":443,"x":11827732,"y":4278232},{"4k":0,"bb":4640768,"bl":11798528,"br":11911168,"bt":4752384,"c":[],"cl":2,"dom":1,"frc":1,"h":"szs","i":335,"its":0,"l":13,"n":"ʯɽ","p":"shizuishan_335","s":1898404,"v":443,"x":11841713,"y":4698079},{"4k":0,"bb":4354048,"bl":11755520,"br":11985920,"bt":4591616,"c":[],"cl":2,"dom":1,"frc":1,"h":"wz","i":322,"its":0,"l":14,"n":"","p":"wuzhong_322","s":3770258,"v":443,"x":11822833,"y":4553416},{"4k":0,"bb":4292608,"bl":11610112,"br":11820032,"bt":4519936,"c":[],"cl":2,"dom":1,"frc":1,"h":"zw","i":181,"its":0,"l":14,"n":"","p":"zhongwei_181","s":2838162,"v":443,"x":11711309,"y":4483610}],"cl":1,"dom":1,"frc":1,"h":"","i":22,"its":0,"l":12,"n":"Ļ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4306944,"bl":11233280,"br":11345920,"bt":4470784,"c":[],"cl":2,"dom":1,"frc":1,"h":"xn","i":66,"its":0,"l":12,"n":"","p":"xining_66","s":4808649,"v":443,"x":11330696,"y":4361026},{"4k":0,"bb":3808256,"bl":10796032,"br":11331584,"bt":4219904,"c":[],"cl":2,"dom":0,"frc":1,"h":"glzzzz","i":72,"its":0,"l":11,"n":"","p":"guoluozangzuzizhi_72","s":11958655,"v":443,"x":11160049,"y":4068648},{"4k":0,"bb":4376576,"bl":10919936,"br":11427840,"bt":4708352,"c":[],"cl":2,"dom":1,"frc":1,"h":"hbzzzz","i":67,"its":0,"l":11,"n":"","p":"haibeizangzuzizhi_67","s":7070659,"v":443,"x":11233081,"y":4407700},{"4k":0,"bb":4200448,"bl":11318272,"br":11474944,"bt":4434944,"c":[],"cl":2,"dom":1,"frc":1,"h":"hdd","i":69,"its":0,"l":11,"n":"","p":"haidongdi_69","s":3981388,"v":443,"x":11367014,"y":4345117},{"4k":0,"bb":4090880,"bl":11013120,"br":11333632,"bt":4447232,"c":[],"cl":2,"dom":0,"frc":1,"h":"hnzzzz","i":68,"its":0,"l":11,"n":"ϲ","p":"hainanzangzuzizhi_68","s":9253674,"v":443,"x":11201876,"y":4315366},{"4k":0,"bb":3834880,"bl":9978880,"br":11109376,"bt":4727808,"c":[],"cl":2,"dom":1,"frc":1,"h":"hxmgzzzzz","i":65,"its":0,"l":11,"n":"ɹ","p":"haiximengguzuzangzuzizhi_65","s":38650147,"v":443,"x":10839989,"y":4466394},{"4k":0,"bb":4014080,"bl":11208704,"br":11406336,"bt":4299776,"c":[],"cl":2,"dom":0,"frc":1,"h":"hnzzzz","i":70,"its":0,"l":11,"n":"ϲ","p":"huangnanzangzuzizhi_70","s":4650554,"v":443,"x":11357143,"y":4210539},{"4k":0,"bb":3688448,"bl":9953280,"br":10886144,"bt":4315136,"c":[],"cl":2,"dom":0,"frc":1,"h":"yszzzz","i":71,"its":0,"l":14,"n":"","p":"yushuzangzuzizhi_71","s":11173441,"v":443,"x":10799563,"y":3873278}],"cl":1,"dom":1,"frc":1,"h":"","i":23,"its":0,"l":12,"n":"ຣʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4279296,"bl":12938240,"br":13109248,"bt":4489216,"c":[],"cl":2,"dom":1,"frc":1,"h":"jn","i":288,"its":1,"l":12,"n":"","p":"jinan_288","s":16838138,"v":443,"x":13024668,"y":4367676},{"4k":0,"bb":4370432,"bl":13053952,"br":13179904,"bt":4597760,"c":[],"cl":2,"dom":1,"frc":1,"h":"bz","i":235,"its":0,"l":12,"n":"","p":"binzhou_235","s":6487840,"v":443,"x":13133505,"y":4467148},{"4k":0,"bb":4331520,"bl":12887040,"br":13092864,"bt":4555776,"c":[],"cl":2,"dom":1,"frc":1,"h":"dz","i":372,"its":0,"l":12,"n":"","p":"dezhou_372","s":8660838,"v":443,"x":12953925,"y":4474579},{"4k":0,"bb":4405248,"bl":13148160,"br":13286400,"bt":4577280,"c":[],"cl":2,"dom":1,"frc":1,"h":"dy","i":174,"its":0,"l":12,"n":"Ӫ","p":"dongying_174","s":4988634,"v":443,"x":13211657,"y":4474396},{"4k":0,"bb":4078592,"bl":12782592,"br":12960768,"bt":4257792,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":353,"its":0,"l":13,"n":"","p":"heze_353","s":7802806,"v":443,"x":12856115,"y":4171574},{"4k":0,"bb":4065280,"bl":12898304,"br":13091840,"bt":4274176,"c":[],"cl":2,"dom":1,"frc":1,"h":"jn","i":286,"its":0,"l":13,"n":"","p":"jining_286","s":9574696,"v":443,"x":12979309,"y":4196147},{"4k":0,"bb":4274176,"bl":13061120,"br":13133824,"bt":4353024,"c":[],"cl":2,"dom":1,"frc":1,"h":"lw","i":124,"its":0,"l":13,"n":"","p":"laiwu_124","s":2079976,"v":443,"x":13100578,"y":4305364},{"4k":0,"bb":4245504,"bl":12833792,"br":12975104,"bt":4417536,"c":[],"cl":2,"dom":1,"frc":1,"h":"lc","i":366,"its":0,"l":12,"n":"ij","p":"liaocheng_366","s":6510388,"v":443,"x":12912298,"y":4338843},{"4k":1,"bb":4056064,"bl":13071360,"br":13271040,"bt":4304896,"c":[],"cl":2,"dom":1,"frc":1,"h":"ly","i":234,"its":0,"l":12,"n":"","p":"linyi_234","s":21283578,"v":443,"x":13176250,"y":4154108},{"4k":1,"bb":4210688,"bl":13304832,"br":13516800,"bt":4434944,"c":[],"cl":2,"dom":1,"frc":1,"h":"qd","i":236,"its":1,"l":12,"n":"ൺ","p":"qingdao_236","s":27085613,"v":443,"x":13401836,"y":4285189},{"4k":0,"bb":4133888,"bl":13203456,"br":13353984,"bt":4282368,"c":[],"cl":2,"dom":1,"frc":1,"h":"rz","i":173,"its":0,"l":12,"n":"","p":"rizhao_173","s":4828499,"v":443,"x":13306565,"y":4196491},{"4k":0,"bb":4225024,"bl":12918784,"br":13136896,"bt":4341760,"c":[],"cl":2,"dom":1,"frc":1,"h":"ta","i":325,"its":0,"l":13,"n":"̩","p":"taian_325","s":6803379,"v":443,"x":13035086,"y":4303515},{"4k":1,"bb":4236288,"bl":13155328,"br":13361152,"bt":4460544,"c":[],"cl":2,"dom":1,"frc":1,"h":"wf","i":287,"its":0,"l":12,"n":"Ϋ","p":"weifang_287","s":20995519,"v":443,"x":13265880,"y":4373425},{"4k":1,"bb":4368384,"bl":13490176,"br":13663232,"bt":4499456,"c":[],"cl":2,"dom":1,"frc":1,"h":"wh","i":175,"its":0,"l":13,"n":"","p":"weihai_175","s":9357958,"v":443,"x":13595391,"y":4485484},{"4k":1,"bb":4353024,"bl":13308928,"br":13574144,"bt":4619264,"c":[],"cl":2,"dom":1,"frc":1,"h":"yt","i":326,"its":1,"l":12,"n":"̨","p":"yantai_326","s":19575665,"v":443,"x":13520355,"y":4478575},{"4k":0,"bb":4067328,"bl":13003776,"br":13118464,"bt":4184064,"c":[],"cl":2,"dom":1,"frc":1,"h":"zz","i":172,"its":0,"l":13,"n":"ׯ","p":"zaozhuang_172","s":4137626,"v":443,"x":13061296,"y":4114535},{"4k":0,"bb":4264960,"bl":13085696,"br":13195264,"bt":4454400,"c":[],"cl":2,"dom":1,"frc":1,"h":"zb","i":354,"its":0,"l":12,"n":"Ͳ","p":"zibo_354","s":6365432,"v":443,"x":13142661,"y":4388086}],"cl":1,"dom":1,"frc":1,"h":"","i":24,"its":0,"l":12,"n":"ɽʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":4476928,"bl":12413952,"br":12598272,"bt":4614144,"c":[],"cl":2,"dom":1,"frc":1,"h":"ty","i":176,"its":1,"l":12,"n":"̫ԭ","p":"taiyuan_176","s":8745952,"v":443,"x":12529931,"y":4535569},{"4k":0,"bb":4251648,"bl":12466176,"br":12662784,"bt":4431872,"c":[],"cl":2,"dom":1,"frc":1,"h":"cz","i":356,"its":0,"l":12,"n":"","p":"changzhi_356","s":5625388,"v":443,"x":12592912,"y":4302899},{"4k":0,"bb":4702208,"bl":12532736,"br":12753920,"bt":4947968,"c":[],"cl":2,"dom":1,"frc":1,"h":"dt","i":355,"its":0,"l":12,"n":"ͬ","p":"datong_355","s":5776393,"v":443,"x":12613353,"y":4850173},{"4k":0,"bb":4166656,"bl":12461056,"br":12650496,"bt":4285440,"c":[],"cl":2,"dom":1,"frc":1,"h":"jc","i":290,"its":0,"l":13,"n":"","p":"jincheng_290","s":4068413,"v":443,"x":12563313,"y":4206695},{"4k":0,"bb":4364288,"bl":12402688,"br":12707840,"bt":4567040,"c":[],"cl":2,"dom":1,"frc":1,"h":"jz","i":238,"its":0,"l":13,"n":"","p":"jinzhong_238","s":6172798,"v":443,"x":12552450,"y":4509743},{"4k":0,"bb":4192256,"bl":12286976,"br":12532736,"bt":4405248,"c":[],"cl":2,"dom":1,"frc":1,"h":"lf","i":368,"its":0,"l":13,"n":"ٷ","p":"linfen_368","s":7428827,"v":443,"x":12415097,"y":4288128},{"4k":0,"bb":4376576,"bl":12286976,"br":12506112,"bt":4657152,"c":[],"cl":2,"dom":1,"frc":1,"h":"ll","i":327,"its":0,"l":14,"n":"","p":"lvliang_327","s":6392069,"v":443,"x":12373327,"y":4486172},{"4k":0,"bb":4707328,"bl":12456960,"br":12644352,"bt":4883456,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":237,"its":0,"l":13,"n":"˷","p":"shuozhou_237","s":3484028,"v":443,"x":12516820,"y":4742727},{"4k":0,"bb":4572160,"bl":12350464,"br":12688384,"bt":4791296,"c":[],"cl":2,"dom":1,"frc":1,"h":"xz","i":367,"its":0,"l":12,"n":"","p":"xinzhou_367","s":7582784,"v":443,"x":12550385,"y":4612464},{"4k":0,"bb":4505600,"bl":12570624,"br":12696576,"bt":4628480,"c":[],"cl":2,"dom":1,"frc":1,"h":"yq","i":357,"its":0,"l":13,"n":"Ȫ","p":"yangquan_357","s":1943196,"v":443,"x":12644594,"y":4533526},{"4k":0,"bb":4083712,"bl":12269568,"br":12478464,"bt":4252672,"c":[],"cl":2,"dom":1,"frc":1,"h":"yc","i":328,"its":0,"l":13,"n":"˳","p":"yuncheng_328","s":6149907,"v":443,"x":12358087,"y":4143555}],"cl":1,"dom":1,"frc":1,"h":"","i":25,"its":0,"l":12,"n":"ɽʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3963904,"bl":11981824,"br":12226560,"bt":4106240,"c":[],"cl":2,"dom":1,"frc":1,"h":"xa","i":233,"its":1,"l":12,"n":"","p":"xian_233","s":19768928,"v":443,"x":12128454,"y":4040988},{"4k":0,"bb":3701760,"bl":12025856,"br":12269568,"bt":3984384,"c":[],"cl":2,"dom":1,"frc":1,"h":"ak","i":324,"its":0,"l":13,"n":"","p":"ankang_324","s":6444051,"v":443,"x":12137954,"y":3831013},{"4k":0,"bb":3948544,"bl":11834368,"br":12029952,"bt":4154368,"c":[],"cl":2,"dom":1,"frc":1,"h":"bj","i":171,"its":0,"l":12,"n":"","p":"baoji_171","s":5500413,"v":443,"x":11938466,"y":4053945},{"4k":0,"bb":3760128,"bl":11743232,"br":12055552,"bt":3989504,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":352,"its":0,"l":13,"n":"","p":"hanzhong_352","s":6682721,"v":443,"x":11914640,"y":3881567},{"4k":0,"bb":3885056,"bl":12087296,"br":12361728,"bt":4064256,"c":[],"cl":2,"dom":1,"frc":1,"h":"sl","i":285,"its":0,"l":13,"n":"","p":"shangluo_285","s":5335580,"v":443,"x":12239364,"y":3988197},{"4k":0,"bb":4113408,"bl":12087296,"br":12190720,"bt":4219904,"c":[],"cl":2,"dom":1,"frc":1,"h":"tc","i":232,"its":0,"l":13,"n":"ͭ","p":"tongchuan_232","s":1955348,"v":443,"x":12128563,"y":4126025},{"4k":0,"bb":4032512,"bl":12130304,"br":12313600,"bt":4256768,"c":[],"cl":2,"dom":1,"frc":1,"h":"wn","i":170,"its":0,"l":13,"n":"μ","p":"weinan_170","s":5966079,"v":443,"x":12191480,"y":4072478},{"4k":1,"bb":4031488,"bl":11983872,"br":12154880,"bt":4214784,"c":[],"cl":2,"dom":0,"frc":1,"h":"xy","i":323,"its":0,"l":13,"n":"","p":"xianyang_323","s":9490418,"v":443,"x":12102309,"y":4049630},{"4k":0,"bb":4186112,"bl":11984896,"br":12308480,"bt":4484096,"c":[],"cl":2,"dom":1,"frc":1,"h":"ya","i":284,"its":0,"l":13,"n":"Ӱ","p":"yanan_284","s":9106137,"v":443,"x":12189211,"y":4356543},{"4k":0,"bb":4388864,"bl":11940864,"br":12385280,"bt":4780032,"c":[],"cl":2,"dom":1,"frc":1,"h":"yl","i":231,"its":0,"l":12,"n":"","p":"yulin_231","s":13582145,"v":443,"x":12216466,"y":4593876}],"cl":1,"dom":1,"frc":1,"h":"","i":26,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3493888,"bl":11468800,"br":11677696,"bt":3667968,"c":[],"cl":2,"dom":1,"frc":1,"h":"cd","i":75,"its":1,"l":12,"n":"ɶ","p":"chengdu_75","s":45254735,"v":443,"x":11585284,"y":3567299},{"4k":0,"bb":3558400,"bl":11191296,"br":11627520,"bt":4047872,"c":[],"cl":2,"dom":0,"frc":1,"h":"abzzqzzz","i":185,"its":0,"l":15,"n":"ӲǼ","p":"abazangzuqiangzuzizhi_185","s":7102224,"v":443,"x":11380447,"y":3728135},{"4k":0,"bb":3643392,"bl":11841536,"br":11997184,"bt":3838976,"c":[],"cl":2,"dom":1,"frc":1,"h":"bz","i":239,"its":0,"l":14,"n":"","p":"bazhong_239","s":5008528,"v":443,"x":11883644,"y":3723601},{"4k":0,"bb":3523584,"bl":11874304,"br":12085248,"bt":3785728,"c":[],"cl":2,"dom":0,"frc":1,"h":"dz","i":369,"its":0,"l":14,"n":"","p":"dazhou_369","s":6564909,"v":443,"x":11964137,"y":3638270},{"4k":0,"bb":3549184,"bl":11554816,"br":11709440,"bt":3702784,"c":[],"cl":2,"dom":1,"frc":1,"h":"dy","i":74,"its":0,"l":13,"n":"","p":"deyang_74","s":5519214,"v":443,"x":11622361,"y":3627752},{"4k":0,"bb":3223552,"bl":10838016,"br":11411456,"bt":4032512,"c":[],"cl":2,"dom":0,"frc":1,"h":"gzzzzz","i":73,"its":0,"l":15,"n":"β","p":"ganzizangzuzizhi_73","s":12172659,"v":443,"x":11351269,"y":3489052},{"4k":0,"bb":3484672,"bl":11794432,"br":11947008,"bt":3593216,"c":[],"cl":2,"dom":1,"frc":1,"h":"ga","i":241,"its":0,"l":13,"n":"㰲","p":"guangan_241","s":4387229,"v":443,"x":11871214,"y":3541176},{"4k":0,"bb":3679232,"bl":11645952,"br":11886592,"bt":3864576,"c":[],"cl":2,"dom":1,"frc":1,"h":"gy","i":329,"its":0,"l":13,"n":"Ԫ","p":"guangyuan_329","s":5954146,"v":443,"x":11783826,"y":3798100},{"4k":0,"bb":3281920,"bl":11456512,"br":11607040,"bt":3474432,"c":[],"cl":2,"dom":1,"frc":1,"h":"ls","i":79,"its":0,"l":13,"n":"ɽ","p":"leshan_79","s":5958387,"v":443,"x":11551963,"y":3425607},{"4k":0,"bb":2985984,"bl":11139072,"br":11565056,"bt":3394560,"c":[],"cl":2,"dom":1,"frc":1,"h":"lsyzzz","i":80,"its":0,"l":14,"n":"ɽ","p":"liangshanyizuzizhi_80","s":10954878,"v":443,"x":11385209,"y":3214652},{"4k":0,"bb":3186688,"bl":11705344,"br":11843584,"bt":3397632,"c":[],"cl":2,"dom":1,"frc":1,"h":"lz","i":331,"its":0,"l":14,"n":"","p":"luzhou_331","s":6593357,"v":443,"x":11738667,"y":3339250},{"4k":0,"bb":3405824,"bl":11449344,"br":11634688,"bt":3529728,"c":[],"cl":2,"dom":1,"frc":1,"h":"ms","i":77,"its":0,"l":13,"n":"üɽ","p":"meishan_77","s":6018178,"v":443,"x":11561223,"y":3492386},{"4k":0,"bb":3572736,"bl":11549696,"br":11770880,"bt":3878912,"c":[],"cl":2,"dom":1,"frc":1,"h":"my","i":240,"its":0,"l":12,"n":"","p":"mianyang_240","s":10000441,"v":443,"x":11653672,"y":3671857},{"4k":0,"bb":3540992,"bl":11738112,"br":11909120,"bt":3722240,"c":[],"cl":2,"dom":1,"frc":1,"h":"nc","i":291,"its":0,"l":13,"n":"ϳ","p":"nanchong_291","s":7168803,"v":443,"x":11813044,"y":3590306},{"4k":0,"bb":3378176,"bl":11608064,"br":11739136,"bt":3488768,"c":[],"cl":2,"dom":1,"frc":1,"h":"nj","i":248,"its":0,"l":13,"n":"ڽ","p":"neijiang_248","s":5209746,"v":443,"x":11695912,"y":3429133},{"4k":0,"bb":2990080,"bl":11258880,"br":11383808,"bt":3147776,"c":[],"cl":2,"dom":1,"frc":1,"h":"pzh","i":81,"its":0,"l":14,"n":"֦","p":"panzhihua_81","s":2294330,"v":443,"x":11324127,"y":3052807},{"4k":0,"bb":3505152,"bl":11695104,"br":11801600,"bt":3633152,"c":[],"cl":2,"dom":1,"frc":1,"h":"sn","i":330,"its":0,"l":12,"n":"","p":"suining_330","s":3956497,"v":443,"x":11755372,"y":3551098},{"4k":0,"bb":3336192,"bl":11347968,"br":11510784,"bt":3603456,"c":[],"cl":2,"dom":1,"frc":1,"h":"ya","i":76,"its":0,"l":13,"n":"Ű","p":"yaan_76","s":3181628,"v":443,"x":11468242,"y":3480229},{"4k":0,"bb":3209216,"bl":11534336,"br":11729920,"bt":3389440,"c":[],"cl":2,"dom":1,"frc":1,"h":"yb","i":186,"its":0,"l":13,"n":"˱","p":"yibin_186","s":6197878,"v":443,"x":11649662,"y":3324141},{"4k":0,"bb":3345408,"bl":11583488,"br":11719680,"bt":3436544,"c":[],"cl":2,"dom":1,"frc":1,"h":"zg","i":78,"its":0,"l":13,"n":"Թ","p":"zigong_78","s":4082725,"v":443,"x":11664727,"y":3398547},{"4k":0,"bb":3440640,"bl":11598848,"br":11773952,"bt":3565568,"c":[],"cl":2,"dom":1,"frc":1,"h":"zy","i":242,"its":0,"l":13,"n":"","p":"ziyang_242","s":6640665,"v":443,"x":11647963,"y":3499239}],"cl":1,"dom":1,"frc":1,"h":"","i":27,"its":0,"l":12,"n":"Ĵʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":0,"bb":3385344,"bl":9991168,"br":10311680,"bt":3618816,"c":[],"cl":2,"dom":1,"frc":1,"h":"ls","i":100,"its":0,"l":13,"n":"","p":"lasa_100","s":2862993,"v":443,"x":10143660,"y":3437317},{"4k":0,"bb":3440640,"bl":8727552,"br":9611264,"bt":4257792,"c":[],"cl":2,"dom":1,"frc":1,"h":"ald","i":103,"its":0,"l":11,"n":"","p":"alidi_103","s":7036394,"v":443,"x":9033918,"y":3534102},{"4k":0,"bb":3283968,"bl":10419200,"br":11034624,"bt":3819520,"c":[],"cl":2,"dom":0,"frc":1,"h":"cdd","i":99,"its":0,"l":15,"n":"","p":"changdudi_99","s":5867294,"v":443,"x":10818907,"y":3629222},{"4k":0,"bb":3173376,"bl":10259456,"br":10994688,"bt":3569664,"c":[],"cl":2,"dom":1,"frc":1,"h":"lzd","i":98,"its":0,"l":11,"n":"֥","p":"linzhidi_98","s":3147891,"v":443,"x":10505019,"y":3438953},{"4k":0,"bb":3474432,"bl":9467904,"br":10578944,"bt":4342784,"c":[],"cl":2,"dom":0,"frc":1,"h":"nqd","i":101,"its":0,"l":14,"n":"","p":"naqudi_101","s":11738338,"v":443,"x":10248183,"y":3672219},{"4k":0,"bb":3085312,"bl":10027008,"br":10505216,"bt":3461120,"c":[],"cl":2,"dom":0,"frc":1,"h":"snd","i":97,"its":0,"l":11,"n":"ɽϵ","p":"shannandi_97","s":3572372,"v":443,"x":10217258,"y":3384056},{"4k":0,"bb":3130368,"bl":9144320,"br":10058752,"bt":3716096,"c":[],"cl":2,"dom":0,"frc":1,"h":"rkzd","i":102,"its":0,"l":14,"n":"տ","p":"rikazedi_102","s":8276766,"v":443,"x":9895063,"y":3389320}],"cl":1,"dom":1,"frc":1,"h":"","i":28,"its":0,"l":12,"n":"","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":5270528,"bl":9661440,"br":9906176,"bt":5593088,"c":[],"cl":2,"dom":1,"frc":1,"h":"wlmq","i":92,"its":1,"l":12,"n":"³ľ","p":"wulumuqi_92","s":7677822,"v":443,"x":9754269,"y":5409691},{"4k":0,"bb":4761600,"bl":8686592,"br":9362432,"bt":5230592,"c":[],"cl":2,"dom":0,"frc":1,"h":"aksd","i":85,"its":0,"l":12,"n":"յ","p":"akesudi_85","s":5550873,"v":443,"x":8935353,"y":5009764},{"4k":0,"bb":5592064,"bl":9521152,"br":10139648,"bt":6274048,"c":[],"cl":2,"dom":1,"frc":1,"h":"altd","i":96,"its":0,"l":13,"n":"̩","p":"aletaidi_96","s":5261930,"v":443,"x":9812684,"y":6050051},{"4k":0,"bb":4226048,"bl":9181184,"br":10450944,"bt":5369856,"c":[],"cl":2,"dom":1,"frc":1,"h":"byglmgzz","i":86,"its":0,"l":11,"n":"ɹ","p":"bayinguolengmengguzizhi_86","s":8924366,"v":443,"x":9590454,"y":5097890},{"4k":0,"bb":5436416,"bl":8893440,"br":9330688,"bt":5653504,"c":[],"cl":2,"dom":1,"frc":1,"h":"betlmgzz","i":88,"its":0,"l":11,"n":"ɹ","p":"boertalamengguzizhi_88","s":1938832,"v":443,"x":9136431,"y":5577250},{"4k":0,"bb":5298176,"bl":9527296,"br":10196992,"bt":5668864,"c":[],"cl":2,"dom":1,"frc":1,"h":"cjhzzz","i":93,"its":0,"l":13,"n":"","p":"changjihuizuzizhi_93","s":4916991,"v":443,"x":9719947,"y":5438089},{"4k":0,"bb":4947968,"bl":10149888,"br":10731520,"bt":5606400,"c":[],"cl":2,"dom":1,"frc":1,"h":"hmd","i":91,"its":0,"l":13,"n":"ܵ","p":"hamidi_91","s":3753660,"v":443,"x":10411021,"y":5255998},{"4k":0,"bb":4049920,"bl":8616960,"br":9454592,"bt":4787200,"c":[],"cl":2,"dom":0,"frc":1,"h":"htd","i":82,"its":0,"l":13,"n":"","p":"hetiandi_82","s":4859903,"v":443,"x":8897738,"y":4429897},{"4k":0,"bb":4200448,"bl":8289280,"br":8892416,"bt":4877312,"c":[],"cl":2,"dom":1,"frc":1,"h":"ksd","i":83,"its":0,"l":12,"n":"ʲ","p":"kashidi_83","s":7775267,"v":443,"x":8459955,"y":4762725},{"4k":0,"bb":5452800,"bl":9412608,"br":9578496,"bt":5784576,"c":[],"cl":2,"dom":1,"frc":1,"h":"klmy","i":95,"its":0,"l":13,"n":"","p":"kelamayi_95","s":1589154,"v":443,"x":9450656,"y":5683314},{"4k":0,"bb":4504576,"bl":8181760,"br":8781824,"bt":5044224,"c":[],"cl":2,"dom":0,"frc":1,"h":"kzlskekzzz","i":84,"its":0,"l":11,"n":"տ¶","p":"kezilesukeerkezizizhi_84","s":2886557,"v":443,"x":8479646,"y":4797955},{"4k":0,"bb":5356544,"bl":9156608,"br":9723904,"bt":5950464,"c":[],"cl":2,"dom":1,"frc":1,"h":"tcd","i":94,"its":0,"l":12,"n":"ǵ","p":"tachengdi_94","s":7783869,"v":443,"x":9238182,"y":5870117},{"4k":0,"bb":5012480,"bl":9713664,"br":10233856,"bt":5381120,"c":[],"cl":2,"dom":1,"frc":1,"h":"tlfd","i":89,"its":0,"l":13,"n":"³","p":"tulufandi_89","s":2572224,"v":443,"x":9929357,"y":5276094},{"4k":0,"bb":4783104,"bl":8756224,"br":9765888,"bt":5529600,"c":[],"cl":2,"dom":0,"frc":1,"h":"xjwwezzqzxxjxzd","i":87,"its":0,"l":13,"n":"½ֱϽؼλ","p":"xinjiangweiwuerzizhiquzhixiaxianjixingzhengdan_87","s":1721746,"v":443,"x":9260975,"y":5156288},{"4k":0,"bb":5171200,"bl":8924160,"br":9491456,"bt":5567488,"c":[],"cl":2,"dom":1,"frc":1,"h":"ylhskzz","i":90,"its":0,"l":11,"n":"","p":"yilihasakezizhi_90","s":4895655,"v":443,"x":9053790,"y":5423584}],"cl":1,"dom":1,"frc":1,"h":"","i":29,"its":0,"l":12,"n":"½ά","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":2783232,"bl":11373568,"br":11542528,"bt":3048448,"c":[],"cl":2,"dom":1,"frc":1,"h":"km","i":104,"its":1,"l":12,"n":"","p":"kunming_104","s":24417098,"v":443,"x":11435821,"y":2862927},{"4k":0,"bb":2750464,"bl":10919936,"br":11139072,"bt":2963456,"c":[],"cl":2,"dom":1,"frc":1,"h":"bs","i":112,"its":0,"l":13,"n":"ɽ","p":"baoshan_112","s":5442583,"v":443,"x":11039493,"y":2871929},{"4k":0,"bb":2762752,"bl":11212800,"br":11409408,"bt":3043328,"c":[],"cl":2,"dom":1,"frc":1,"h":"cxyzzz","i":105,"its":0,"l":13,"n":"","p":"chuxiongyizuzizhi_105","s":9746491,"v":443,"x":11302848,"y":2863778},{"4k":0,"bb":2816000,"bl":11005952,"br":11249664,"bt":3067904,"c":[],"cl":2,"dom":1,"frc":1,"h":"dlbzzz","i":111,"its":0,"l":14,"n":"","p":"dalibaizuzizhi_111","s":8417989,"v":443,"x":11162596,"y":2932491},{"4k":0,"bb":2716672,"bl":10857472,"br":10991616,"bt":2899968,"c":[],"cl":2,"dom":0,"frc":1,"h":"dhdzjpzzz","i":116,"its":0,"l":14,"n":"º徰","p":"dehongdaizujingpozuzizhi_116","s":2997453,"v":443,"x":10975266,"y":2789038},{"4k":0,"bb":3087360,"bl":10976256,"br":11167744,"bt":3387392,"c":[],"cl":2,"dom":1,"frc":1,"h":"dqzzzz","i":115,"its":0,"l":14,"n":"","p":"diqingzangzuzizhi_115","s":3259958,"v":443,"x":11099728,"y":3206834},{"4k":0,"bb":2548736,"bl":11332608,"br":11610112,"bt":2830336,"c":[],"cl":2,"dom":1,"frc":1,"h":"hhhnzyzzz","i":107,"its":0,"l":11,"n":"ӹ","p":"honghehanizuyizuzizhi_107","s":8798248,"v":443,"x":11508573,"y":2659713},{"4k":0,"bb":2978816,"bl":11063296,"br":11301888,"bt":3220480,"c":[],"cl":2,"dom":1,"frc":1,"h":"lj","i":114,"its":0,"l":13,"n":"","p":"lijiang_114","s":4535977,"v":443,"x":11158143,"y":3086669},{"4k":0,"bb":2624512,"bl":10984448,"br":11194368,"bt":2863104,"c":[],"cl":2,"dom":1,"frc":1,"h":"lc","i":110,"its":0,"l":14,"n":"ٲ","p":"lincang_110","s":6633324,"v":443,"x":11141636,"y":2721816},{"4k":0,"bb":2924544,"bl":10924032,"br":11094016,"bt":3279872,"c":[],"cl":2,"dom":0,"frc":1,"h":"njlszzz","i":113,"its":0,"l":14,"n":"ŭ","p":"nujianglisuzuzizhi_113","s":1849582,"v":443,"x":11005519,"y":2958484},{"4k":0,"bb":2498560,"bl":11038720,"br":11392000,"bt":2837504,"c":[],"cl":2,"dom":1,"frc":1,"h":"pe","i":108,"its":0,"l":14,"n":"ն","p":"puer_108","s":10501691,"v":443,"x":11240814,"y":2589148},{"4k":0,"bb":2778112,"bl":11471872,"br":11670528,"bt":3111936,"c":[],"cl":2,"dom":1,"frc":1,"h":"qj","i":249,"its":0,"l":12,"n":"","p":"qujing_249","s":8624952,"v":443,"x":11555387,"y":2918272},{"4k":0,"bb":2577408,"bl":11530240,"br":11823104,"bt":2792448,"c":[],"cl":2,"dom":0,"frc":1,"h":"wszzmzzz","i":177,"its":0,"l":14,"n":"ɽ׳","p":"wenshanzhuangzumiaozuzizhi_177","s":7263943,"v":443,"x":11606072,"y":2660262},{"4k":0,"bb":2393088,"bl":11125760,"br":11338752,"bt":2567168,"c":[],"cl":2,"dom":1,"frc":1,"h":"xsbndzzz","i":109,"its":0,"l":14,"n":"˫ɴ","p":"xishuangbannadaizuzizhi_109","s":3432080,"v":443,"x":11221599,"y":2496994},{"4k":0,"bb":2653184,"bl":11274240,"br":11484160,"bt":2852864,"c":[],"cl":2,"dom":1,"frc":1,"h":"yx","i":106,"its":0,"l":13,"n":"Ϫ","p":"yuxi_106","s":7001400,"v":443,"x":11416289,"y":2779266},{"4k":0,"bb":3046400,"bl":11452416,"br":11724800,"bt":3313664,"c":[],"cl":2,"dom":1,"frc":1,"h":"zt","i":336,"its":0,"l":13,"n":"ͨ","p":"zhaotong_336","s":7749517,"v":443,"x":11546551,"y":3146717}],"cl":1,"dom":1,"frc":1,"h":"","i":30,"its":0,"l":12,"n":"ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"bb":5217424,"bl":13988219,"br":14251713,"bt":5536780,"c":[{"4k":1,"bb":3379200,"bl":13174784,"br":13440000,"bt":3556352,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":179,"its":1,"l":12,"n":"","p":"hangzhou_179","s":36146001,"v":443,"x":13376654,"y":3517776},{"4k":0,"bb":3529728,"bl":13274112,"br":13414400,"bt":3635200,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":294,"its":0,"l":12,"n":"","p":"huzhou_294","s":6937491,"v":443,"x":13368987,"y":3597484},{"4k":1,"bb":3513344,"bl":13391872,"br":13531136,"bt":3615744,"c":[],"cl":2,"dom":1,"frc":1,"h":"jx","i":334,"its":1,"l":13,"n":"","p":"jiaxing_334","s":13200892,"v":443,"x":13443316,"y":3578520},{"4k":0,"bb":3294208,"bl":13273088,"br":13447168,"bt":3442688,"c":[],"cl":2,"dom":1,"frc":1,"h":"jh","i":333,"its":1,"l":12,"n":"","p":"jinhua_333","s":11204757,"v":443,"x":13319970,"y":3365440},{"4k":0,"bb":3259392,"bl":13138944,"br":13287424,"bt":3419136,"c":[],"cl":2,"dom":1,"frc":1,"h":"qz","i":243,"its":0,"l":12,"n":"","p":"quzhou_243","s":4982817,"v":443,"x":13233890,"y":3347356},{"4k":0,"bb":3155968,"bl":13213696,"br":13408256,"bt":3349504,"c":[],"cl":2,"dom":1,"frc":1,"h":"ls","i":292,"its":0,"l":13,"n":"ˮ","p":"lishui_292","s":6218565,"v":443,"x":13350636,"y":3288181},{"4k":1,"bb":3335168,"bl":13456384,"br":13617152,"bt":3540992,"c":[],"cl":2,"dom":1,"frc":1,"h":"nb","i":180,"its":1,"l":12,"n":"","p":"ningbo_180","s":24443293,"v":443,"x":13531775,"y":3466674},{"4k":0,"bb":3383296,"bl":13345792,"br":13496320,"bt":3519488,"c":[],"cl":2,"dom":1,"frc":1,"h":"sx","i":293,"its":0,"l":13,"n":"","p":"shaoxing_293","s":9676484,"v":443,"x":13423604,"y":3483319},{"4k":0,"bb":3228672,"bl":13390848,"br":13580288,"bt":3398656,"c":[],"cl":2,"dom":1,"frc":1,"h":"tz","i":244,"its":1,"l":13,"n":"̨","p":"taizhou_244","s":9953782,"v":443,"x":13517359,"y":3312057},{"4k":1,"bb":3105792,"bl":13317120,"br":13512704,"bt":3306496,"c":[],"cl":2,"dom":1,"frc":1,"h":"wz","i":178,"its":1,"l":12,"n":"","p":"wenzhou_178","s":20162700,"v":443,"x":13437061,"y":3228867},{"4k":0,"bb":3424256,"bl":13528064,"br":13692928,"bt":3599360,"c":[],"cl":2,"dom":1,"frc":1,"h":"zs","i":245,"its":0,"l":12,"n":"ɽ","p":"zhoushan_245","s":4008756,"v":443,"x":13604986,"y":3480850}],"cl":1,"dom":1,"frc":1,"h":"","i":31,"its":0,"l":12,"n":"㽭ʡ","p":"","s":102400,"v":443,"x":14116241,"y":5386659},{"4k":0,"bb":2511872,"bl":12670976,"br":12747776,"bt":2564096,"c":[],"cl":2,"dom":1,"frc":2,"gs":64408340,"gv":75,"h":"xgtbxz","i":2912,"its":0,"l":11,"n":"ر","p":"xianggangtebiexingzheng_2912","s":64408340,"v":75,"x":12709499,"y":2529064},{"4k":0,"bb":2507776,"bl":12639232,"br":12648448,"bt":4196352,"c":[],"cl":2,"dom":1,"frc":2,"gs":22632328,"gv":75,"h":"amtbxz","i":2911,"its":0,"l":13,"n":"ر","p":"aomentebiexingzheng_2911","s":22632328,"v":75,"x":12640429,"y":2518425},{"4k":0,"bb":2373632,"bl":13150208,"br":13976576,"bt":3031040,"c":[],"cl":2,"dom":1,"frc":2,"gs":248793070,"gv":13,"h":"twd","i":9000,"its":0,"l":9,"n":"̨ʡ","p":"taiwandi_9000","s":248793070,"v":13,"x":13447711,"y":2742969},{"4k":0,"bb":126976,"bl":11532288,"br":11587584,"bt":162816,"c":[],"cl":2,"dom":1,"frc":2,"gs":29553226,"gv":77,"h":"","i":20001,"its":0,"l":13,"n":"¼","p":"sig_20001","s":29553226,"v":77,"x":11557270,"y":144308},{"4k":0,"bb":2741375,"bl":13685009,"br":17141903,"bt":5673412,"c":[{"4k":0,"bb":4081664,"bl":15209472,"br":15348736,"bt":4219904,"c":[],"cl":2,"dom":1,"frc":2,"gs":44908893,"gv":77,"h":"","i":26001,"its":0,"l":12,"n":"֪","p":"aizhi_26001","s":44908893,"v":77,"x":15289347,"y":4151169},{"4k":0,"bb":4674560,"bl":15532032,"br":15727616,"bt":4929536,"c":[],"cl":2,"dom":1,"frc":2,"gs":20230802,"gv":77,"h":"","i":26002,"its":0,"l":12,"n":"","p":"qiutian_26002","s":20230802,"v":77,"x":15596570,"y":4797992},{"4k":0,"bb":4853760,"bl":15507456,"br":15774720,"bt":5261312,"c":[],"cl":2,"dom":1,"frc":2,"gs":23776689,"gv":77,"h":"","i":26003,"its":0,"l":12,"n":"ɭ","p":"qinsen_26003","s":23776689,"v":77,"x":15690562,"y":4932530},{"4k":0,"bb":4124672,"bl":15554560,"br":15682560,"bt":4290560,"c":[],"cl":2,"dom":1,"frc":2,"gs":38684205,"gv":77,"h":"","i":26004,"its":0,"l":12,"n":"ǧҶ","p":"qianye_26004","s":38684205,"v":77,"x":15574929,"y":4183183},{"4k":0,"bb":3831808,"bl":14693376,"br":14885888,"bt":4050944,"c":[],"cl":2,"dom":1,"frc":2,"gs":24023082,"gv":77,"h":"","i":26005,"its":0,"l":12,"n":"","p":"aiyuan_26005","s":24023082,"v":77,"x":14781678,"y":3978824},{"4k":0,"bb":4173824,"bl":15071232,"br":15261696,"bt":4328448,"c":[],"cl":2,"dom":1,"frc":2,"gs":18321241,"gv":77,"h":"","i":26006,"its":0,"l":12,"n":"","p":"fujin_26006","s":18321241,"v":77,"x":15141644,"y":4262089},{"4k":0,"bb":3870720,"bl":14404608,"br":14606336,"bt":4102144,"c":[],"cl":2,"dom":1,"frc":2,"gs":29376818,"gv":77,"h":"","i":26007,"its":0,"l":12,"n":"","p":"fugang_26007","s":29376818,"v":77,"x":14523978,"y":3978528},{"4k":0,"bb":4374528,"bl":15468544,"br":15702016,"bt":4563968,"c":[],"cl":2,"dom":1,"frc":2,"gs":33908249,"gv":77,"h":"","i":26008,"its":0,"l":12,"n":"","p":"fudao_26008","s":33908249,"v":77,"x":15683728,"y":4435171},{"4k":0,"bb":4142080,"bl":15169536,"br":15355904,"bt":4355072,"c":[],"cl":2,"dom":1,"frc":2,"gs":34760148,"gv":77,"h":"","i":26009,"its":0,"l":12,"n":"᪸","p":"qifu_26009","s":34760148,"v":77,"x":15251237,"y":4242369},{"4k":0,"bb":4274176,"bl":15405056,"br":15560704,"bt":4462592,"c":[],"cl":2,"dom":1,"frc":2,"gs":27580465,"gv":77,"h":"","i":26010,"its":0,"l":12,"n":"Ⱥ","p":"qunma_26010","s":27580465,"v":77,"x":15475282,"y":4343219},{"4k":0,"bb":4007936,"bl":14670848,"br":14860288,"bt":4179968,"c":[],"cl":2,"dom":1,"frc":2,"gs":30773061,"gv":77,"h":"","i":26011,"its":0,"l":12,"n":"㵺","p":"guangdao_26011","s":30773061,"v":77,"x":14745147,"y":4056262},{"4k":0,"bb":5035008,"bl":15509504,"br":16551936,"bt":5679104,"c":[],"cl":2,"dom":1,"frc":2,"gs":53729977,"gv":77,"h":"","i":26012,"its":0,"l":12,"n":"","p":"beihaidao_26012","s":53729977,"v":77,"x":15892027,"y":5334432},{"4k":0,"bb":4023296,"bl":14943232,"br":15086592,"bt":4233216,"c":[],"cl":2,"dom":1,"frc":2,"gs":35825953,"gv":77,"h":"","i":26013,"its":0,"l":12,"n":"","p":"bingku_26013","s":35825953,"v":77,"x":15007567,"y":4152159},{"4k":0,"bb":4235264,"bl":15549440,"br":15685632,"bt":4407296,"c":[],"cl":2,"dom":1,"frc":2,"gs":35356922,"gv":77,"h":"","i":26014,"its":0,"l":12,"n":"ij","p":"cicheng_26014","s":35356922,"v":77,"x":15638462,"y":4370425},{"4k":0,"bb":4269056,"bl":15164416,"br":15293440,"bt":4534272,"c":[],"cl":2,"dom":1,"frc":2,"gs":19339980,"gv":77,"h":"","i":26015,"its":0,"l":12,"n":"ʯ","p":"shichuan_26015","s":19339980,"v":77,"x":15239395,"y":4467921},{"4k":0,"bb":4654080,"bl":15645696,"br":15817728,"bt":4915200,"c":[],"cl":2,"dom":1,"frc":2,"gs":24134319,"gv":77,"h":"","i":26016,"its":0,"l":12,"n":"","p":"yanshou_26016","s":24134319,"v":77,"x":15796631,"y":4792387},{"4k":0,"bb":3998720,"bl":14838784,"br":15002624,"bt":4087808,"c":[],"cl":2,"dom":1,"frc":2,"gs":15008575,"gv":77,"h":"","i":26017,"its":0,"l":12,"n":"㴨","p":"xiangchuan_26017","s":15008575,"v":77,"x":14901228,"y":4049779},{"4k":0,"bb":3094528,"bl":14287872,"br":14624768,"bt":3783680,"c":[],"cl":2,"dom":1,"frc":2,"gs":26839297,"gv":77,"h":"","i":26018,"its":0,"l":12,"n":"¹","p":"luerdao_26018","s":26839297,"v":77,"x":14532688,"y":3686874},{"4k":0,"bb":3872768,"bl":15453184,"br":15572992,"bt":4237312,"c":[],"cl":2,"dom":1,"frc":2,"gs":39669872,"gv":77,"h":"","i":26019,"its":0,"l":12,"n":"δ","p":"shennaichuan_26019","s":39669872,"v":77,"x":15503897,"y":4196088},{"4k":0,"bb":3830784,"bl":14744576,"br":14954496,"bt":4002816,"c":[],"cl":2,"dom":1,"frc":2,"gs":19546849,"gv":77,"h":"","i":26020,"its":0,"l":12,"n":"֪","p":"gaozhi_26020","s":19546849,"v":77,"x":14839770,"y":3932449},{"4k":0,"bb":3748864,"bl":14464000,"br":14621696,"bt":3899392,"c":[],"cl":2,"dom":1,"frc":2,"gs":24084822,"gv":77,"h":"","i":26021,"its":0,"l":12,"n":"ܱ","p":"xiongben_26021","s":24084822,"v":77,"x":14550721,"y":3844707},{"4k":0,"bb":4085760,"bl":15006720,"br":15153152,"bt":4246528,"c":[],"cl":2,"dom":1,"frc":2,"gs":32217460,"gv":77,"h":"","i":26022,"its":0,"l":12,"n":"","p":"jingdu_26022","s":32217460,"v":77,"x":15112040,"y":4135845},{"4k":0,"bb":3965952,"bl":15121408,"br":15251456,"bt":4188160,"c":[],"cl":2,"dom":1,"frc":2,"gs":30862038,"gv":77,"h":"","i":26023,"its":0,"l":12,"n":"","p":"sanzhong_26023","s":30862038,"v":77,"x":15210297,"y":4051543},{"4k":0,"bb":4500480,"bl":15608832,"br":15772672,"bt":4696064,"c":[],"cl":2,"dom":1,"frc":2,"gs":25365109,"gv":77,"h":"","i":26024,"its":0,"l":12,"n":"","p":"gongcheng_26024","s":25365109,"v":77,"x":15733260,"y":4612851},{"4k":0,"bb":3655680,"bl":14547968,"br":14684160,"bt":3852288,"c":[],"cl":2,"dom":1,"frc":2,"gs":20081591,"gv":77,"h":"","i":26025,"its":0,"l":12,"n":"","p":"gongqi_26025","s":20081591,"v":77,"x":14629430,"y":3728920},{"4k":0,"bb":4162560,"bl":15270912,"br":15468544,"bt":4436992,"c":[],"cl":2,"dom":1,"frc":2,"gs":36862095,"gv":77,"h":"","i":26026,"its":0,"l":12,"n":"Ұ","p":"changye_26026","s":36862095,"v":77,"x":15371220,"y":4293561},{"4k":0,"bb":3737600,"bl":14285824,"br":14518272,"bt":4109312,"c":[],"cl":2,"dom":1,"frc":2,"gs":23524273,"gv":77,"h":"","i":26027,"its":0,"l":12,"n":"","p":"changqi_26027","s":23524273,"v":77,"x":14403400,"y":3898797},{"4k":0,"bb":3985408,"bl":15085568,"br":15172608,"bt":4114432,"c":[],"cl":2,"dom":1,"frc":2,"gs":20211604,"gv":77,"h":"","i":26028,"its":0,"l":12,"n":"","p":"nailiang_26028","s":20211604,"v":77,"x":15124903,"y":4049922},{"4k":0,"bb":4353024,"bl":15293440,"br":15582208,"bt":4632576,"c":[],"cl":2,"dom":1,"frc":2,"gs":33059524,"gv":77,"h":"","i":26029,"its":0,"l":12,"n":"","p":"xinxi_26029","s":33059524,"v":77,"x":15434571,"y":4448108},{"4k":0,"bb":3825664,"bl":14559232,"br":14711808,"bt":3972096,"c":[],"cl":2,"dom":1,"frc":2,"gs":19234463,"gv":77,"h":"","i":26030,"its":0,"l":12,"n":"","p":"dafen_26030","s":19234463,"v":77,"x":14681350,"y":3888054},{"4k":0,"bb":4042752,"bl":14833664,"br":14974976,"bt":4197376,"c":[],"cl":2,"dom":1,"frc":2,"gs":23546346,"gv":77,"h":"","i":26031,"its":0,"l":12,"n":"ɽ","p":"gangshan_26031","s":23546346,"v":77,"x":14911926,"y":4072189},{"4k":0,"bb":2739200,"bl":13682688,"br":14621696,"bt":3297280,"c":[],"cl":2,"dom":1,"frc":2,"gs":16027162,"gv":77,"h":"","i":26032,"its":0,"l":12,"n":"","p":"chongshen_26032","s":16027162,"v":77,"x":14227452,"y":3021310},{"4k":0,"bb":4034560,"bl":14997504,"br":15113216,"bt":4151296,"c":[],"cl":2,"dom":1,"frc":2,"gs":40300534,"gv":77,"h":"","i":26033,"its":0,"l":12,"n":"","p":"daban_26033","s":40300534,"v":77,"x":15085509,"y":4094380},{"4k":0,"bb":3864576,"bl":14376960,"br":14534656,"bt":4099072,"c":[],"cl":2,"dom":1,"frc":2,"gs":20707118,"gv":77,"h":"","i":26034,"its":0,"l":12,"n":"","p":"zuohe_26034","s":20707118,"v":77,"x":14458666,"y":3938515},{"4k":0,"bb":4240384,"bl":15440896,"br":15576064,"bt":4317184,"c":[],"cl":2,"dom":1,"frc":2,"gs":31515408,"gv":77,"h":"","i":26035,"its":0,"l":12,"n":"","p":"qiyu_26035","s":31515408,"v":77,"x":15516930,"y":4272797},{"4k":0,"bb":4107264,"bl":15089664,"br":15211520,"bt":4235264,"c":[],"cl":2,"dom":1,"frc":2,"gs":18820902,"gv":77,"h":"","i":26036,"its":0,"l":12,"n":"־","p":"zhihe_26036","s":18820902,"v":77,"x":15156419,"y":4171302},{"4k":0,"bb":4021248,"bl":14656512,"br":14850048,"bt":4449280,"c":[],"cl":2,"dom":1,"frc":2,"gs":21365123,"gv":77,"h":"","i":26037,"its":0,"l":12,"n":"","p":"daogen_26037","s":21365123,"v":77,"x":14757454,"y":4146377},{"4k":0,"bb":3045376,"bl":15301632,"br":15837184,"bt":4254720,"c":[],"cl":2,"dom":1,"frc":2,"gs":49041874,"gv":77,"h":"","i":26038,"its":0,"l":12,"n":"","p":"jinggang_26038","s":49041874,"v":77,"x":15362726,"y":4123477},{"4k":0,"bb":4299776,"bl":15493120,"br":15631360,"bt":4463616,"c":[],"cl":2,"dom":1,"frc":2,"gs":23545178,"gv":77,"h":"","i":26039,"its":0,"l":12,"n":"ľ","p":"limu_26039","s":23545178,"v":77,"x":15563831,"y":4370280},{"4k":0,"bb":3942400,"bl":14878720,"br":15014912,"bt":4052992,"c":[],"cl":2,"dom":1,"frc":2,"gs":16944403,"gv":77,"h":"","i":26040,"its":0,"l":12,"n":"Ե","p":"dedao_26040","s":16944403,"v":77,"x":14980815,"y":3979161},{"4k":0,"bb":4200448,"bl":15466496,"br":15581184,"bt":4261888,"c":[],"cl":2,"dom":1,"frc":2,"gs":87195703,"gv":77,"h":"","i":26041,"its":0,"l":12,"n":"","p":"dongjing_26041","s":87195703,"v":77,"x":15560697,"y":4222468},{"4k":0,"bb":4145152,"bl":14783488,"br":14994432,"bt":4326400,"c":[],"cl":2,"dom":1,"frc":2,"gs":15007068,"gv":77,"h":"","i":26042,"its":0,"l":12,"n":"ȡ","p":"niaoqu_26042","s":15007068,"v":77,"x":14873687,"y":4202080},{"4k":0,"bb":4228096,"bl":15205376,"br":15366144,"bt":4430848,"c":[],"cl":2,"dom":1,"frc":2,"gs":19427520,"gv":77,"h":"","i":26043,"its":0,"l":12,"n":"ɽ","p":"fushan_26043","s":19427520,"v":77,"x":15275375,"y":4343986},{"4k":0,"bb":3927040,"bl":15025152,"br":15144960,"bt":4058112,"c":[],"cl":2,"dom":1,"frc":2,"gs":15653321,"gv":77,"h":"","i":26044,"its":0,"l":12,"n":"͸ɽ","p":"hegeshan_26044","s":15653321,"v":77,"x":15069586,"y":3982324},{"4k":0,"bb":4494336,"bl":15494144,"br":15671296,"bt":4715520,"c":[],"cl":2,"dom":1,"frc":2,"gs":21119214,"gv":77,"h":"","i":26045,"its":0,"l":12,"n":"ɽ","p":"shanxing_26045","s":21119214,"v":77,"x":15559069,"y":4653677},{"4k":0,"bb":3964928,"bl":14548992,"br":14756864,"bt":4114432,"c":[],"cl":2,"dom":1,"frc":2,"gs":23552347,"gv":77,"h":"","i":26046,"its":0,"l":12,"n":"ɽ","p":"shankou_26046","s":23552347,"v":77,"x":14676834,"y":4013027},{"4k":0,"bb":4156416,"bl":15351808,"br":15509504,"bt":4284416,"c":[],"cl":2,"dom":1,"frc":2,"gs":22592804,"gv":77,"h":"","i":26047,"its":0,"l":12,"n":"ɽ","p":"shanli_26047","s":22592804,"v":77,"x":15427698,"y":4216415}],"cl":1,"dom":1,"frc":2,"h":"","i":26000,"its":0,"l":12,"n":"ձ","p":"","s":2905338,"v":12,"x":11556136,"y":152247},{"4k":0,"bb":3886633,"bl":13924194,"br":14576378,"bt":4639352,"c":[{"4k":0,"bb":4099072,"bl":14314496,"br":14397440,"bt":4205568,"c":[],"cl":2,"dom":1,"frc":2,"gs":11536862,"gv":77,"h":"","i":30001,"its":0,"l":12,"n":"ɽ","p":"fushan_30001","s":11536862,"v":77,"x":14355817,"y":4147844},{"4k":0,"bb":4269056,"bl":14159872,"br":14324736,"bt":4446208,"c":[],"cl":2,"dom":1,"frc":2,"gs":13106076,"gv":77,"h":"","i":30002,"its":0,"l":12,"n":"山","p":"zhongqingbeidao_30002","s":13106076,"v":77,"x":14234416,"y":4370430},{"4k":0,"bb":4270080,"bl":13972480,"br":14214144,"bt":4431872,"c":[],"cl":2,"dom":1,"frc":2,"gs":14084613,"gv":77,"h":"","i":30003,"its":0,"l":12,"n":"ϵ","p":"zhongqingnandao_30003","s":14084613,"v":77,"x":14117385,"y":4349846},{"4k":0,"bb":4207616,"bl":14286848,"br":14338048,"bt":4272128,"c":[],"cl":2,"dom":1,"frc":2,"gs":9834240,"gv":77,"h":"","i":30004,"its":0,"l":12,"n":"","p":"daqiu_30004","s":9834240,"v":77,"x":14311019,"y":4243609},{"4k":0,"bb":4298752,"bl":14155776,"br":14215168,"bt":4348928,"c":[],"cl":2,"dom":1,"frc":2,"gs":9778853,"gv":77,"h":"","i":30005,"its":0,"l":12,"n":"","p":"datian_30005","s":9778853,"v":77,"x":14180805,"y":4319068},{"4k":0,"bb":4412416,"bl":14137344,"br":14404608,"bt":4644864,"c":[],"cl":2,"dom":1,"frc":2,"gs":16682225,"gv":77,"h":"","i":30006,"its":0,"l":12,"n":"ԭ","p":"jiangyuandao_30006","s":16682225,"v":77,"x":14376352,"y":4475386},{"4k":0,"bb":4083712,"bl":14004224,"br":14141440,"bt":4228096,"c":[],"cl":2,"dom":1,"frc":2,"gs":9519240,"gv":77,"h":"","i":30007,"its":0,"l":12,"n":"","p":"guanzhou_30007","s":9519240,"v":77,"x":14121709,"y":4157331},{"4k":0,"bb":4378624,"bl":14081024,"br":14231552,"bt":4601856,"c":[],"cl":2,"dom":1,"frc":2,"gs":26759433,"gv":77,"h":"","i":30008,"its":0,"l":12,"n":"ܵ","p":"jingjidao_30008","s":26759433,"v":77,"x":14101778,"y":4448701},{"4k":0,"bb":4195328,"bl":14221312,"br":14577664,"bt":4491264,"c":[],"cl":2,"dom":1,"frc":2,"gs":16785917,"gv":77,"h":"","i":30009,"its":0,"l":12,"n":"б","p":"qingshangbeidao_30009","s":16785917,"v":77,"x":14347993,"y":4342962},{"4k":0,"bb":4073472,"bl":14185472,"br":14385152,"bt":4259840,"c":[],"cl":2,"dom":1,"frc":2,"gs":17175247,"gv":77,"h":"","i":30010,"its":0,"l":12,"n":"ϵ","p":"qingshangnandao_30010","s":17175247,"v":77,"x":14243717,"y":4170539},{"4k":0,"bb":4397056,"bl":13865984,"br":14124032,"bt":4556800,"c":[],"cl":2,"dom":1,"frc":2,"gs":26094360,"gv":77,"h":"","i":30011,"its":0,"l":12,"n":"ʴ","p":"renchuan_30011","s":26094360,"v":77,"x":14102066,"y":4483446},{"4k":0,"bb":3885056,"bl":14006272,"br":14174208,"bt":4042752,"c":[],"cl":2,"dom":1,"frc":2,"gs":10389729,"gv":77,"h":"","i":30012,"its":0,"l":12,"n":"","p":"jizhou_30012","s":10389729,"v":77,"x":14080027,"y":3914603},{"4k":0,"bb":4166656,"bl":14031872,"br":14242816,"bt":4299776,"c":[],"cl":2,"dom":1,"frc":2,"gs":13517705,"gv":77,"h":"","i":30013,"its":0,"l":12,"n":"ȫޱ","p":"quanluobeidao_30013","s":13517705,"v":77,"x":14118494,"y":4233523},{"4k":0,"bb":3964928,"bl":13913088,"br":14242816,"bt":4206592,"c":[],"cl":2,"dom":1,"frc":2,"gs":16221951,"gv":77,"h":"","i":30014,"its":0,"l":12,"n":"ȫϵ","p":"quanluonandao_30014","s":16221951,"v":77,"x":14087426,"y":4085554},{"4k":0,"bb":4328448,"bl":14149632,"br":14179328,"bt":4375552,"c":[],"cl":2,"dom":1,"frc":2,"gs":8164725,"gv":77,"h":"","i":30015,"its":0,"l":12,"n":"","p":"shizong_30015","s":8164725,"v":77,"x":14164418,"y":4350399},{"4k":0,"bb":4378624,"bl":14071808,"br":14226432,"bt":4558848,"c":[],"cl":2,"dom":1,"frc":2,"gs":22362272,"gv":77,"h":"","i":30016,"its":0,"l":12,"n":"׶","p":"shouer_30016","s":22362272,"v":77,"x":14135959,"y":4486784},{"4k":0,"bb":4178944,"bl":14358528,"br":14419968,"bt":4272128,"c":[],"cl":2,"dom":1,"frc":2,"gs":9258735,"gv":77,"h":"","i":30017,"its":0,"l":12,"n":"εɽ","p":"weichuan_30017","s":9258735,"v":77,"x":14401104,"y":4202599}],"cl":1,"dom":1,"frc":2,"h":"","i":30000,"its":0,"l":12,"n":"","p":"","s":2905338,"v":12,"x":11556136,"y":152247},{"4k":0,"bb":621960,"bl":10836572,"br":11759822,"bt":2312901,"c":[{"4k":0,"bb":1602560,"bl":10829824,"br":11357184,"bt":2337792,"c":[],"cl":2,"dom":1,"frc":2,"gs":60000138,"gv":77,"h":"","i":20501,"its":0,"l":11,"n":"̩(,,ؿ̩)","p":"beibu_20501","s":60000138,"v":77,"x":11093538,"y":1970093},{"4k":0,"bb":1550336,"bl":11212800,"br":11782144,"bt":2084864,"c":[],"cl":2,"dom":1,"frc":2,"gs":64889237,"gv":77,"h":"","i":20502,"its":0,"l":11,"n":"̩(׾,߷)","p":"dongbeibu_20502","s":64889237,"v":77,"x":11497607,"y":1817541},{"4k":0,"bb":1282048,"bl":11198464,"br":11511808,"bt":1637376,"c":[],"cl":2,"dom":1,"frc":2,"gs":43027832,"gv":77,"h":"","i":20503,"its":0,"l":11,"n":"̩()","p":"dongbu_20503","s":43027832,"v":77,"x":11355193,"y":1459817},{"4k":0,"bb":1193984,"bl":10932224,"br":11350016,"bt":1774592,"c":[],"cl":2,"dom":1,"frc":2,"gs":78953569,"gv":77,"h":"","i":20504,"its":0,"l":11,"n":"̩в()","p":"zhongbu_20504","s":78953569,"v":77,"x":11141090,"y":1484197},{"4k":0,"bb":615424,"bl":10862592,"br":11385856,"bt":1236992,"c":[],"cl":2,"dom":1,"frc":2,"gs":40065648,"gv":77,"h":"","i":20505,"its":0,"l":11,"n":"̩ϲ(ռ,÷,)","p":"nanbu_20505","s":40065648,"v":77,"x":11123953,"y":926369}],"cl":1,"dom":1,"frc":2,"h":"","i":20500,"its":0,"l":11,"n":"̩","p":"","s":2905338,"v":12,"x":11556136,"y":152247},{"4k":0,"bb":748558,"bl":7590541,"br":10845115,"bt":4207826,"c":[{"4k":0,"bb":1763333,"bl":8087781,"br":8975365,"bt":2484502,"c":[],"cl":2,"dom":1,"frc":2,"gs":129780771,"gv":77,"h":"","i":30085,"its":0,"l":13,"n":"","p":"mengmai_30085","s":129780771,"v":77,"x":8113564,"y":2148839},{"4k":0,"bb":3291564,"bl":8571694,"br":8613439,"bt":3333744,"c":[],"cl":2,"dom":1,"frc":2,"gs":33398100,"gv":77,"h":"","i":30090,"its":0,"l":13,"n":"µ","p":"xindeli_30090","s":33398100,"v":77,"x":8591441,"y":3306577},{"4k":0,"bb":2725761,"bl":8585609,"br":9406599,"bt":3535390,"c":[],"cl":2,"dom":1,"frc":2,"gs":199444284,"gv":77,"h":"","i":30100,"its":0,"l":13,"n":",","p":"agewala_30100","s":199444284,"v":77,"x":8682257,"y":3120938},{"4k":0,"bb":2442868,"bl":9573580,"br":9991033,"bt":3117413,"c":[],"cl":2,"dom":1,"frc":2,"gs":57974668,"gv":77,"h":"","i":30102,"its":0,"l":13,"n":"Ӷ","p":"jiaergeda_30102","s":57974668,"v":77,"x":9835658,"y":2560906},{"4k":0,"bb":1260004,"bl":8207865,"br":8764933,"bt":2082477,"c":[],"cl":2,"dom":1,"frc":2,"gs":121335572,"gv":77,"h":"","i":30081,"its":0,"l":13,"n":"޶","p":"banjialuoer_30081","s":121335572,"v":77,"x":8634707,"y":1457844}],"cl":1,"dom":1,"frc":2,"h":"","i":31080,"its":0,"l":11,"n":"ӡ","p":"","s":2905338,"v":15,"x":9158673,"y":1884721},{"4k":0,"bb":94937,"bl":11092087,"br":13277189,"bt":818344,"c":[{"4k":0,"bb":331070,"bl":11284565,"br":11340796,"bt":366341,"c":[],"cl":2,"dom":1,"frc":2,"gs":18383940,"gv":77,"h":"","i":30108,"its":0,"l":13,"n":"¡","p":"jilongpo_30108","s":18383940,"v":77,"x":11319296,"y":346769},{"4k":0,"bb":328566,"bl":12719510,"br":13276555,"bt":818118,"c":[],"cl":2,"dom":1,"frc":2,"gs":18883255,"gv":77,"h":"","i":30117,"its":0,"l":13,"n":"ɳ,DZ","p":"shyab_30117","s":18883255,"v":77,"x":12928905,"y":668691},{"4k":0,"bb":440464,"bl":11092050,"br":11263337,"bt":729529,"c":[],"cl":2,"dom":1,"frc":2,"gs":15178780,"gv":77,"h":"","i":30106,"its":0,"l":13,"n":"","p":"lankawei_30106","s":15178780,"v":77,"x":11105431,"y":699839},{"4k":0,"bb":232530,"bl":11348260,"br":11410371,"bt":276506,"c":[],"cl":2,"dom":1,"frc":2,"gs":10572798,"gv":77,"h":"","i":30110,"its":0,"l":13,"n":"","p":"maliujia_30110","s":10572798,"v":77,"x":11381705,"y":249050}],"cl":1,"dom":1,"frc":2,"h":"","i":31190,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":12329868,"y":537835},{"4k":0,"bb":3023050,"bl":8912351,"br":9819907,"bt":3539667,"c":[{"4k":0,"bb":3050838,"bl":9337023,"br":9643874,"bt":3265576,"c":[],"cl":2,"dom":1,"frc":2,"gs":23716881,"gv":77,"h":"","i":30121,"its":0,"l":13,"n":"ӵ,̹","p":"jiademandu_30121","s":23716881,"v":77,"x":9497939,"y":3192375},{"4k":0,"bb":3145139,"bl":9208187,"br":9484771,"bt":3397039,"c":[],"cl":2,"dom":1,"frc":2,"gs":19707886,"gv":77,"h":"","i":30125,"its":0,"l":13,"n":"","p":"bokala_30125","s":19707886,"v":77,"x":9349971,"y":3257586}],"cl":1,"dom":1,"frc":2,"h":"","i":31220,"its":0,"l":11,"n":"Ჴ","p":"","s":2905338,"v":15,"x":9403317,"y":3243336},{"4k":0,"bb":-7349207,"bl":12570302,"br":17728416,"bt":-1024040,"c":[{"4k":0,"bb":-4551909,"bl":15677096,"br":18701265,"bt":-3219473,"c":[],"cl":2,"dom":1,"frc":2,"gs":101019520,"gv":77,"h":"","i":30024,"its":0,"l":13,"n":"Ϥ","p":"xini_30024","s":101019520,"v":77,"x":16827992,"y":-3988719},{"4k":0,"bb":-4721252,"bl":15695978,"br":16701689,"bt":-4015830,"c":[],"cl":2,"dom":1,"frc":2,"gs":71954691,"gv":77,"h":"","i":30029,"its":0,"l":13,"n":"ī","p":"moerben_30029","s":71954691,"v":77,"x":16141224,"y":-4522392},{"4k":0,"bb":-3372111,"bl":15272801,"br":17127414,"bt":-1015102,"c":[],"cl":2,"dom":1,"frc":2,"gs":68732535,"gv":77,"h":"","i":30026,"its":0,"l":13,"n":"˹","p":"bulisiban_30026","s":68732535,"v":77,"x":17039546,"y":-3172167}],"cl":1,"dom":1,"frc":2,"h":"","i":31000,"its":0,"l":11,"n":"Ĵ","p":"","s":2905338,"v":15,"x":14982921,"y":-2434195},{"4k":0,"bb":-6878808,"bl":-19907141,"br":19933733,"bt":-3384124,"c":[{"4k":0,"bb":-5078468,"bl":19025372,"br":19874104,"bt":-3835093,"c":[],"cl":2,"dom":1,"frc":2,"gs":32502272,"gv":77,"h":"","i":30126,"its":0,"l":13,"n":"","p":"aokelan_30126","s":32502272,"v":77,"x":19454737,"y":-5027059},{"4k":0,"bb":-6889471,"bl":18257720,"br":19928161,"bt":-4889258,"c":[],"cl":2,"dom":1,"frc":2,"gs":23665507,"gv":77,"h":"","i":30127,"its":0,"l":13,"n":"","p":"jiducheng_30127","s":23665507,"v":77,"x":19218772,"y":-5368773}],"cl":1,"dom":1,"frc":2,"h":"","i":31230,"its":0,"l":13,"n":"","p":"","s":2905338,"v":15,"x":16654394,"y":-5012799},{"4k":0,"bb":507715,"bl":13016544,"br":14093796,"bt":2384744,"c":[{"4k":0,"bb":1158225,"bl":13326474,"br":13941056,"bt":2368785,"c":[],"cl":2,"dom":1,"frc":2,"gs":60766017,"gv":77,"h":"","i":30128,"its":0,"l":13,"n":"","p":"manila_30128","s":60766017,"v":77,"x":13468118,"y":1632398},{"4k":0,"bb":832362,"bl":13016674,"br":14022988,"bt":1551555,"c":[],"cl":2,"dom":1,"frc":2,"gs":29495397,"gv":77,"h":"","i":30130,"its":0,"l":13,"n":"̲,","p":"changtandao_30130","s":29495397,"v":77,"x":13575855,"y":1326706}],"cl":1,"dom":1,"frc":2,"h":"","i":31260,"its":0,"l":11,"n":"ɱ","p":"","s":2905338,"v":15,"x":13586886,"y":1160750},{"4k":0,"bb":445094,"bl":12706011,"br":12843733,"bt":558656,"c":[{"4k":0,"bb":469939,"bl":12700762,"br":12827797,"bt":558017,"c":[],"cl":2,"dom":1,"frc":2,"gs":9260802,"gv":77,"h":"","i":30031,"its":0,"l":13,"n":"˹ͼ,,","p":"sibajaw_30031","s":9260802,"v":77,"x":12796476,"y":547784}],"cl":1,"dom":1,"frc":2,"h":"","i":31020,"its":0,"l":12,"n":"","p":"","s":2905338,"v":15,"x":12802147,"y":540615},{"4k":0,"bb":-1224976,"bl":10572395,"br":15697528,"bt":673208,"c":[{"4k":0,"bb":-982370,"bl":12732305,"br":12880998,"bt":-894387,"c":[],"cl":2,"dom":1,"frc":2,"gs":17558765,"gv":77,"h":"","i":30033,"its":0,"l":12,"n":"嵺,ڲ","p":"balidao_30033","s":17558765,"v":77,"x":12809874,"y":-927265},{"4k":0,"bb":-710980,"bl":11843511,"br":11911315,"bt":-599375,"c":[],"cl":2,"dom":1,"frc":2,"gs":39393282,"gv":77,"h":"","i":30039,"its":0,"l":13,"n":"żӴ","p":"yajiada_30039","s":39393282,"v":77,"x":11896947,"y":-691585}],"cl":1,"dom":1,"frc":2,"h":"","i":31030,"its":0,"l":11,"n":"ӡ","p":"","s":2905338,"v":15,"x":13219171,"y":-217017},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":658095,"bl":8852433,"br":9111264,"bt":1090463,"c":[],"cl":2,"dom":1,"frc":2,"gs":25493405,"gv":77,"h":"","i":30103,"its":0,"l":13,"n":",,","p":"kelunpo_30103","s":25493405,"v":77,"x":8890619,"y":767358}],"cl":1,"dom":1,"frc":2,"h":"","i":31130,"its":0,"l":11,"n":"˹","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":1317907,"bl":11706280,"br":12186087,"bt":2101932,"c":[],"cl":2,"dom":1,"frc":2,"gs":21468034,"gv":77,"h":"","i":30133,"its":0,"l":13,"n":"᭸","p":"xiangang_30133","s":21468034,"v":77,"x":12042233,"y":1796529},{"4k":0,"bb":958153,"bl":11517098,"br":12171347,"bt":1431122,"c":[],"cl":2,"dom":1,"frc":2,"gs":26184376,"gv":77,"h":"","i":30132,"its":0,"l":13,"n":"־","p":"huzhiming_30132","s":26184376,"v":77,"x":11870150,"y":1202133},{"4k":0,"bb":2082477,"bl":11437273,"br":12031479,"bt":2660223,"c":[],"cl":2,"dom":1,"frc":2,"gs":32002852,"gv":77,"h":"","i":30131,"its":0,"l":13,"n":"","p":"xialongwan_30131","s":32002852,"v":77,"x":11921397,"y":2372568}],"cl":1,"dom":1,"frc":2,"h":"","i":32370,"its":0,"l":11,"n":"Խ","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":2565742,"bl":5734677,"br":6279951,"bt":2993928,"c":[],"cl":2,"dom":1,"frc":2,"gs":32093703,"gv":78,"h":"","i":100079,"its":0,"l":13,"n":"ϰ","p":"dibai_100079","s":32093703,"v":78,"x":6152786,"y":2882561}],"cl":1,"dom":1,"frc":2,"h":"","i":70100,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":1152843,"bl":11383775,"br":12023908,"bt":1653830,"c":[],"cl":2,"dom":1,"frc":2,"gs":23150655,"gv":78,"h":"","i":100438,"its":0,"l":13,"n":",","p":"jinbian_100438","s":23150655,"v":78,"x":11560091,"y":1491709}],"cl":1,"dom":1,"frc":2,"h":"","i":70011,"its":0,"l":11,"n":"կ","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":1940239,"bl":11120249,"br":11697836,"bt":2552754,"c":[],"cl":2,"dom":1,"frc":2,"gs":24211254,"gv":78,"h":"","i":100091,"its":0,"l":13,"n":"Ų","p":"langbolana_100091","s":24211254,"v":78,"x":11369690,"y":2244603}],"cl":1,"dom":1,"frc":2,"h":"","i":70012,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":1757128,"bl":10491116,"br":10811391,"bt":2196238,"c":[],"cl":2,"dom":1,"frc":2,"gs":14812565,"gv":78,"h":"","i":100469,"its":0,"l":13,"n":"","p":"yangguang_100469","s":14812565,"v":78,"x":10708483,"y":1892725},{"4k":0,"bb":2104193,"bl":10472499,"br":10794876,"bt":2671634,"c":[],"cl":2,"dom":1,"frc":2,"gs":14996481,"gv":78,"h":"","i":100474,"its":0,"l":13,"n":"Ѹ,","p":"mandele_100474","s":14996481,"v":78,"x":10559710,"y":2396805}],"cl":1,"dom":1,"frc":2,"h":"","i":70014,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":-2320234,"bl":6299325,"br":6429337,"bt":-1150364,"c":[],"cl":2,"dom":1,"frc":2,"gs":12441124,"gv":78,"h":"","i":100403,"its":0,"l":13,"n":"ë˹","p":"maoliqius_100403","s":12441124,"v":78,"x":6401172,"y":-2277220}],"cl":1,"dom":1,"frc":2,"h":"","i":70090,"its":0,"l":11,"n":"ë˹","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":4575316,"bl":-586569,"br":-109476,"bt":5035704,"c":[],"cl":2,"dom":1,"frc":2,"gs":67498868,"gv":77,"h":"","i":36503,"its":0,"l":13,"n":"","p":"madeli_36503","s":67498868,"v":77,"x":-412336,"y":4899206},{"4k":0,"bb":4909844,"bl":25278,"br":369793,"bt":5261694,"c":[],"cl":2,"dom":1,"frc":2,"gs":79605957,"gv":77,"h":"","i":36505,"its":0,"l":13,"n":"","p":"basluona_36505","s":79605957,"v":77,"x":241850,"y":5041306}],"cl":1,"dom":1,"frc":2,"h":"","i":51270,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":5719317,"bl":655634,"br":1170228,"bt":6043511,"c":[],"cl":2,"dom":1,"frc":2,"gs":165562770,"gv":77,"h":"","i":36531,"its":0,"l":13,"n":",,,¬","p":"ruishi_36531","s":165562770,"v":77,"x":952300,"y":5972921}],"cl":1,"dom":1,"frc":2,"h":"","i":50466,"its":0,"l":11,"n":"ʿ","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":6320678,"bl":265366,"br":719027,"bt":6682329,"c":[],"cl":2,"dom":1,"frc":2,"gs":152585529,"gv":77,"h":"","i":36559,"its":0,"l":13,"n":"³","p":"bulusaer_36559","s":152585529,"v":77,"x":484275,"y":6562342}],"cl":1,"dom":1,"frc":2,"h":"","i":50292,"its":0,"l":11,"n":"ʱ","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6660001,"bl":1251168,"br":1655180,"bt":7033702,"c":[],"cl":2,"dom":1,"frc":2,"gs":77553972,"gv":77,"h":"","i":36562,"its":0,"l":13,"n":"","p":"bolin_36562","s":77553972,"v":77,"x":1492160,"y":6860069},{"4k":0,"bb":5951162,"bl":986556,"br":1545396,"bt":6515648,"c":[],"cl":2,"dom":1,"frc":2,"gs":280341398,"gv":77,"h":"","i":36561,"its":0,"l":13,"n":"Ľ","p":"munihei_36561","s":280341398,"v":77,"x":1289237,"y":6096935},{"4k":0,"bb":7040207,"bl":876311,"br":1259318,"bt":7337518,"c":[],"cl":2,"dom":1,"frc":2,"gs":64552731,"gv":77,"h":"","i":36564,"its":0,"l":13,"n":"","p":"hanbao_36564","s":64552731,"v":77,"x":1112302,"y":7051198},{"4k":0,"bb":6340913,"bl":861879,"br":1142154,"bt":6707357,"c":[],"cl":2,"dom":1,"frc":2,"gs":103778020,"gv":77,"h":"","i":36565,"its":0,"l":13,"n":"˸","p":"flkf_36565","s":103778020,"v":77,"x":966498,"y":6432776},{"4k":0,"bb":6456079,"bl":652680,"br":1058479,"bt":6873179,"c":[],"cl":2,"dom":1,"frc":2,"gs":145303378,"gv":77,"h":"","i":36567,"its":0,"l":13,"n":"¡","p":"kelong_36567","s":145303378,"v":77,"x":774813,"y":6576682}],"cl":1,"dom":1,"frc":2,"h":"","i":50664,"its":0,"l":11,"n":"¹","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6087417,"bl":150154,"br":404187,"bt":6286370,"c":[],"cl":2,"dom":1,"frc":2,"gs":122938570,"gv":77,"h":"","i":36590,"its":0,"l":13,"n":",ʥ","p":"bali_36590","s":122938570,"v":77,"x":261855,"y":6218023},{"4k":0,"bb":5243922,"bl":-204435,"br":167437,"bt":5710342,"c":[],"cl":2,"dom":1,"frc":2,"gs":126080714,"gv":77,"h":"","i":36580,"its":0,"l":13,"n":"","p":"boerduo_36580","s":126080714,"v":77,"x":-64128,"y":5565669},{"4k":0,"bb":5181153,"bl":-29409,"br":362388,"bt":5591398,"c":[],"cl":2,"dom":1,"frc":2,"gs":134122609,"gv":77,"h":"","i":36594,"its":0,"l":13,"n":"ͼ¬","p":"tuluzi_36594","s":134122609,"v":77,"x":160715,"y":5374505},{"4k":0,"bb":6398297,"bl":166527,"br":473837,"bt":6604292,"c":[],"cl":2,"dom":1,"frc":2,"gs":101781882,"gv":77,"h":"","i":36595,"its":0,"l":13,"n":"˹,","p":"lansi_36595","s":101781882,"v":77,"x":315050,"y":6487642},{"4k":0,"bb":5279943,"bl":481848,"br":861641,"bt":5618402,"c":[],"cl":2,"dom":1,"frc":2,"gs":136233998,"gv":77,"h":"","i":36599,"its":0,"l":13,"n":",˹,˹,","p":"masai_36599","s":136233998,"v":77,"x":598555,"y":5327805},{"4k":0,"bb":5473546,"bl":416340,"br":800637,"bt":5829493,"c":[],"cl":2,"dom":1,"frc":2,"gs":174509955,"gv":77,"h":"","i":36600,"its":0,"l":13,"n":"ﰺ,ʥٰ","p":"liang_36600","s":174509955,"v":77,"x":538359,"y":5711683}],"cl":1,"dom":1,"frc":2,"h":"","i":49841,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":4952634,"bl":1279873,"br":1701208,"bt":5258050,"c":[],"cl":2,"dom":1,"frc":2,"gs":63912939,"gv":77,"h":"","i":36608,"its":0,"l":13,"n":"","p":"luoma_36608","s":63912939,"v":77,"x":1391234,"y":5115877},{"4k":0,"bb":5383491,"bl":945090,"br":1433287,"bt":5855547,"c":[],"cl":2,"dom":1,"frc":2,"gs":191145989,"gv":77,"h":"","i":36611,"its":0,"l":13,"n":"","p":"milan_36611","s":191145989,"v":77,"x":1022205,"y":5666344},{"4k":0,"bb":5554297,"bl":1153077,"br":1553618,"bt":5928118,"c":[],"cl":2,"dom":1,"frc":2,"gs":157666255,"gv":77,"h":"","i":36612,"its":0,"l":13,"n":"˹","p":"weinisi_36612","s":157666255,"v":77,"x":1371647,"y":5660718},{"4k":0,"bb":5167933,"bl":1090274,"br":1550997,"bt":5488598,"c":[],"cl":2,"dom":1,"frc":2,"gs":80048895,"gv":77,"h":"","i":36614,"its":0,"l":13,"n":"","p":"fololuns_36614","s":80048895,"v":77,"x":1252804,"y":5401149}],"cl":1,"dom":1,"frc":2,"h":"","i":49987,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6780373,"bl":493327,"br":685981,"bt":6995931,"c":[],"cl":2,"dom":1,"frc":2,"gs":108094050,"gv":77,"h":"","i":36634,"its":0,"l":13,"n":"ķ˹ص","p":"amstd_36634","s":108094050,"v":77,"x":544842,"y":6833594},{"4k":0,"bb":6526842,"bl":367091,"br":694807,"bt":6812746,"c":[],"cl":2,"dom":1,"frc":2,"gs":157533433,"gv":77,"h":"","i":36636,"its":0,"l":13,"n":"¹ص,","p":"haiya_36636","s":157533433,"v":77,"x":503390,"y":6751307}],"cl":1,"dom":1,"frc":2,"h":"","i":52386,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6631545,"bl":-56408,"br":42240,"bt":6721679,"c":[],"cl":2,"dom":1,"frc":2,"gs":65072612,"gv":77,"h":"","i":36642,"its":0,"l":13,"n":"׶","p":"lundun_36642","s":65072612,"v":77,"x":-13673,"y":6677885},{"4k":0,"bb":6932003,"bl":-537539,"br":-207556,"bt":7342978,"c":[],"cl":2,"dom":1,"frc":2,"gs":66182699,"gv":77,"h":"","i":36640,"its":0,"l":13,"n":",˹","p":"liwupu_36640","s":66182699,"v":77,"x":-332941,"y":7023768},{"4k":0,"bb":7256097,"bl":-955824,"br":-81040,"bt":8551494,"c":[],"cl":2,"dom":1,"frc":2,"gs":71583638,"gv":77,"h":"","i":36644,"its":0,"l":13,"n":"","p":"aidingbao_36644","s":71583638,"v":77,"x":-354997,"y":7513084}],"cl":1,"dom":1,"frc":2,"h":"","i":51441,"its":0,"l":11,"n":"Ӣ","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6931753,"bl":3724168,"br":4892647,"bt":7870197,"c":[],"cl":2,"dom":1,"frc":2,"gs":151131099,"gv":78,"h":"","i":100286,"its":0,"l":13,"n":"Ī˹","p":"mosok_100286","s":151131099,"v":78,"x":4187560,"y":7474295},{"4k":0,"bb":8270669,"bl":3271387,"br":3433705,"bt":8422707,"c":[],"cl":2,"dom":1,"frc":2,"gs":38416136,"gv":78,"h":"","i":100284,"its":0,"l":13,"n":"ʥ˵ñ","p":"shengbid_100284","s":38416136,"v":78,"x":3376732,"y":8347910},{"4k":0,"bb":5012921,"bl":3615714,"br":19281379,"bt":6927215,"c":[],"cl":2,"dom":1,"frc":2,"gs":201733024,"gv":78,"h":"","i":100274,"its":0,"l":13,"n":"","p":"suoqi_100274","s":201733024,"v":78,"x":4423212,"y":5374449},{"4k":0,"bb":5496311,"bl":3731273,"br":9899629,"bt":8544791,"c":[],"cl":2,"dom":1,"frc":2,"gs":200143941,"gv":78,"h":"","i":100299,"its":0,"l":13,"n":"","p":"xxiboliya_100299","s":200143941,"v":78,"x":9232506,"y":7328182}],"cl":1,"dom":1,"frc":2,"h":"","i":70034,"its":0,"l":11,"n":"˹","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":3823480,"bl":-1921785,"br":-687383,"bt":5154940,"c":[],"cl":2,"dom":1,"frc":2,"gs":89088190,"gv":77,"h":"","i":36649,"its":0,"l":13,"n":"ͼ,˹","p":"boertu_36649","s":89088190,"v":77,"x":-1017732,"y":4655341}],"cl":1,"dom":1,"frc":2,"h":"","i":51933,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":5168321,"bl":2095290,"br":2571989,"bt":5782740,"c":[],"cl":2,"dom":1,"frc":2,"gs":42161386,"gv":78,"h":"","i":100078,"its":0,"l":13,"n":"","p":"beiergld_100078","s":42161386,"v":78,"x":2276394,"y":5557654}],"cl":1,"dom":1,"frc":2,"h":"","i":70031,"its":0,"l":11,"n":"ά","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":3416001,"bl":3772046,"br":4014986,"bt":3929018,"c":[],"cl":2,"dom":1,"frc":2,"gs":39869897,"gv":78,"h":"","i":100390,"its":0,"l":13,"n":"Ү·","p":"yelusaleng_100390","s":39869897,"v":78,"x":3920075,"y":3710266}],"cl":1,"dom":1,"frc":2,"h":"","i":70063,"its":0,"l":11,"n":"ɫ","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":-2200339,"bl":-5921093,"br":-5124854,"bt":-1439846,"c":[],"cl":2,"dom":1,"frc":2,"gs":31502914,"gv":77,"h":"","i":100052,"its":0,"l":13,"n":"","p":"baxiliya_100052","s":31502914,"v":77,"x":-5330278,"y":-1769165},{"4k":0,"bb":-2658447,"bl":-5679281,"br":-4390728,"bt":-1597172,"c":[],"cl":2,"dom":1,"frc":2,"gs":153414929,"gv":77,"h":"","i":100053,"its":0,"l":13,"n":"Լ¬","p":"liyue_100053","s":153414929,"v":77,"x":-4806377,"y":-2604030},{"4k":0,"bb":-1245184,"bl":-8279366,"br":-6282840,"bt":251786,"c":[],"cl":2,"dom":1,"frc":2,"gs":23272303,"gv":77,"h":"","i":100048,"its":0,"l":13,"n":"˹","p":"manaos_100048","s":23272303,"v":77,"x":-6681670,"y":-345013},{"4k":0,"bb":-1283864,"bl":-4601063,"br":-3266773,"bt":101354,"c":[],"cl":2,"dom":1,"frc":2,"gs":45567091,"gv":77,"h":"","i":100049,"its":0,"l":13,"n":",ִ","p":"leixipai_100049","s":45567091,"v":77,"x":-3883188,"y":-893921},{"4k":0,"bb":-2072863,"bl":-5197577,"br":-4154189,"bt":-939492,"c":[],"cl":2,"dom":1,"frc":2,"gs":40646864,"gv":77,"h":"","i":100051,"its":0,"l":13,"n":"߶,","p":"saerwaduo_100051","s":40646864,"v":77,"x":-4286099,"y":-1446949},{"4k":0,"bb":-1202166,"bl":-5390207,"br":-4482736,"bt":-139983,"c":[],"cl":2,"dom":1,"frc":2,"gs":17982869,"gv":77,"h":"","i":100054,"its":0,"l":13,"n":"ʥ·˹","p":"shengluyis_100054","s":17982869,"v":77,"x":-4929612,"y":-280824},{"4k":0,"bb":-2746287,"bl":-6534188,"br":-5658654,"bt":-1932682,"c":[],"cl":2,"dom":1,"frc":2,"gs":19100254,"gv":77,"h":"","i":100056,"its":0,"l":13,"n":"и","p":"nanmatuo_100056","s":19100254,"v":77,"x":-6080352,"y":-2313687},{"4k":0,"bb":-1095617,"bl":-6552485,"br":-5122129,"bt":175390,"c":[],"cl":2,"dom":1,"frc":2,"gs":22234196,"gv":77,"h":"","i":100057,"its":0,"l":13,"n":"","p":"beilun_100057","s":22234196,"v":77,"x":-5397979,"y":-160967},{"4k":0,"bb":-3386924,"bl":-6111202,"br":-5351663,"bt":-2565079,"c":[],"cl":2,"dom":1,"frc":2,"gs":92763528,"gv":77,"h":"","i":100058,"its":0,"l":13,"n":"˹,ٰ,ʥ","p":"fusi_100058","s":92763528,"v":77,"x":-6076462,"y":-2920715},{"4k":0,"bb":-2895769,"bl":-5899723,"br":-4868347,"bt":-2231433,"c":[],"cl":2,"dom":1,"frc":2,"gs":185283458,"gv":77,"h":"","i":100062,"its":0,"l":13,"n":"ʥ","p":"shengbaoluo_100062","s":185283458,"v":77,"x":-5191227,"y":-2681499}],"cl":1,"dom":1,"frc":2,"h":"","i":39797,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":-4993310,"bl":-7071647,"br":-6308905,"bt":-3925852,"c":[],"cl":2,"dom":1,"frc":2,"gs":49474579,"gv":77,"h":"","i":100029,"its":0,"l":13,"n":"ŵ˹˹","p":"bynsals_100029","s":49474579,"v":77,"x":-6500431,"y":-4085300},{"4k":0,"bb":-5766792,"bl":-8038673,"br":-6996167,"bt":-4283215,"c":[],"cl":2,"dom":1,"frc":2,"gs":18629159,"gv":77,"h":"","i":100032,"its":0,"l":13,"n":"ʥ˹-°,","p":"shengkaluod_100032","s":18629159,"v":77,"x":-7938327,"y":-5004144},{"4k":0,"bb":-4140905,"bl":-7341146,"br":-6865129,"bt":-3417874,"c":[],"cl":2,"dom":1,"frc":2,"gs":26561564,"gv":77,"h":"","i":100033,"its":0,"l":13,"n":"ƶ","p":"keerduow_100033","s":26561564,"v":77,"x":-7145542,"y":-3665067},{"4k":0,"bb":-3032125,"bl":-7640428,"br":-6916530,"bt":-2462390,"c":[],"cl":2,"dom":1,"frc":2,"gs":14256853,"gv":77,"h":"","i":100035,"its":0,"l":13,"n":"","p":"kafayat_100035","s":14256853,"v":77,"x":-7344523,"y":-2989169},{"4k":0,"bb":-3846290,"bl":-7851245,"br":-7298726,"bt":-3187135,"c":[],"cl":2,"dom":1,"frc":2,"gs":11237123,"gv":77,"h":"","i":100037,"its":0,"l":13,"n":"ʥ","p":"shenghuan_100037","s":11237123,"v":77,"x":-7629753,"y":-3679897},{"4k":0,"bb":-4489594,"bl":-7856049,"br":-7227361,"bt":-3725391,"c":[],"cl":2,"dom":1,"frc":2,"gs":17329478,"gv":77,"h":"","i":100038,"its":0,"l":13,"n":"Ŷ","p":"menduosa_100038","s":17329478,"v":77,"x":-7664021,"y":-3857163},{"4k":0,"bb":-7338705,"bl":-8172215,"br":-7103219,"bt":-5748690,"c":[],"cl":2,"dom":1,"frc":2,"gs":17799289,"gv":77,"h":"","i":100039,"its":0,"l":13,"n":"¼Ү˹,˹","p":"liaojiages_100039","s":17799289,"v":77,"x":-7604147,"y":-7288688},{"4k":0,"bb":-4064146,"bl":-6987030,"br":-6543829,"bt":-3207298,"c":[],"cl":2,"dom":1,"frc":2,"gs":28295749,"gv":77,"h":"","i":100040,"its":0,"l":13,"n":",ʥ","p":"luosaliao_100040","s":28295749,"v":77,"x":-6751708,"y":-3864370}],"cl":1,"dom":1,"frc":2,"h":"","i":39874,"its":0,"l":11,"n":"͢","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":-4343787,"bl":-12183715,"br":-7759907,"bt":-3015535,"c":[],"cl":2,"dom":1,"frc":2,"gs":63319355,"gv":77,"h":"","i":100004,"its":0,"l":13,"n":"ʥǸ,߶,ǵ¶","p":"shengdiyag_100004","s":63319355,"v":77,"x":-7866890,"y":-3931297},{"4k":0,"bb":-7114124,"bl":-8419712,"br":-7606210,"bt":-6179810,"c":[],"cl":2,"dom":1,"frc":2,"gs":11692074,"gv":77,"h":"","i":100000,"its":0,"l":13,"n":"˹","p":"ptalns_100000","s":11692074,"v":77,"x":-7894539,"y":-6978841},{"4k":0,"bb":-3417690,"bl":-7958830,"br":-7448596,"bt":-1964334,"c":[],"cl":2,"dom":1,"frc":2,"gs":15852116,"gv":77,"h":"","i":100001,"its":0,"l":13,"n":"","p":"yijike_100001","s":15852116,"v":77,"x":-7807554,"y":-2285476},{"4k":0,"bb":-5447784,"bl":-8267695,"br":-7842978,"bt":-4273227,"c":[],"cl":2,"dom":1,"frc":2,"gs":31864770,"gv":77,"h":"","i":100002,"its":0,"l":13,"n":"ظ,,","p":"mengtegang_100002","s":31864770,"v":77,"x":-8119857,"y":-5053202}],"cl":1,"dom":1,"frc":2,"h":"","i":40228,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":99500,"bl":-8702524,"br":-8123553,"bt":638604,"c":[],"cl":2,"dom":1,"frc":2,"gs":48350276,"gv":77,"h":"","i":100009,"its":0,"l":13,"n":",","p":"bogeda_100009","s":48350276,"v":77,"x":-8245758,"y":521475},{"4k":0,"bb":442484,"bl":-8670371,"br":-8220970,"bt":1049279,"c":[],"cl":2,"dom":1,"frc":2,"gs":18549016,"gv":77,"h":"","i":100007,"its":0,"l":13,"n":"","p":"maidelin_100007","s":18549016,"v":77,"x":-8411899,"y":692768},{"4k":0,"bb":757096,"bl":-8446440,"br":-7918356,"bt":1388564,"c":[],"cl":2,"dom":1,"frc":2,"gs":29692223,"gv":77,"h":"","i":100014,"its":0,"l":13,"n":",","p":"balanjiy_100014","s":29692223,"v":77,"x":-8402432,"y":1155351}],"cl":1,"dom":1,"frc":2,"h":"","i":40382,"its":0,"l":11,"n":"ױ","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":1083188,"bl":-7598796,"br":-7274850,"bt":1183968,"c":[],"cl":2,"dom":1,"frc":2,"gs":13171403,"gv":77,"h":"","i":100018,"its":0,"l":13,"n":"˹,,","p":"jialajias_100018","s":13171403,"v":77,"x":-7447762,"y":1165447},{"4k":0,"bb":470200,"bl":-7485386,"br":-6749114,"bt":939889,"c":[],"cl":2,"dom":1,"frc":2,"gs":9185655,"gv":77,"h":"","i":100020,"its":0,"l":13,"n":"߶","p":"boliwaer_100020","s":9185655,"v":77,"x":-7074821,"y":897326},{"4k":0,"bb":821893,"bl":-8167506,"br":-7792977,"bt":1319798,"c":[],"cl":2,"dom":1,"frc":2,"gs":15509494,"gv":77,"h":"","i":100025,"its":0,"l":13,"n":",÷","p":"malakaibo_100025","s":15509494,"v":77,"x":-7983337,"y":1184966}],"cl":1,"dom":1,"frc":2,"h":"","i":39949,"its":0,"l":11,"n":"ί","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":257615,"bl":-6424048,"br":-6005801,"bt":663994,"c":[],"cl":2,"dom":1,"frc":2,"gs":9994426,"gv":77,"h":"","i":100026,"its":0,"l":13,"n":"ﲩ","p":"palamla_100026","s":9994426,"v":77,"x":-6143958,"y":648179}],"cl":1,"dom":1,"frc":2,"h":"","i":39584,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":-3184840,"bl":-7038478,"br":-6029387,"bt":-2139000,"c":[],"cl":2,"dom":1,"frc":2,"gs":30425019,"gv":77,"h":"","i":100027,"its":0,"l":13,"n":"ɭ,","p":"yasongsen_100027","s":30425019,"v":77,"x":-6409340,"y":-2890149}],"cl":1,"dom":1,"frc":2,"h":"","i":40879,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":161796,"bl":-6858961,"br":-6353889,"bt":932461,"c":[],"cl":2,"dom":1,"frc":2,"gs":9743112,"gv":77,"h":"","i":100028,"its":0,"l":13,"n":"ζ,°ķ˹ص","p":"qiaozhidun_100028","s":9743112,"v":77,"x":-6473561,"y":753845}],"cl":1,"dom":1,"frc":2,"h":"","i":40540,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":-1495693,"bl":-8752448,"br":-8174726,"bt":-905974,"c":[],"cl":2,"dom":1,"frc":2,"gs":29611729,"gv":77,"h":"","i":100043,"its":0,"l":13,"n":"","p":"lima_100043","s":29611729,"v":77,"x":-8576456,"y":-1341998},{"4k":0,"bb":-1000387,"bl":-9052867,"br":-8412315,"bt":-331448,"c":[],"cl":2,"dom":1,"frc":2,"gs":17938330,"gv":77,"h":"","i":100041,"its":0,"l":13,"n":"³ϣ","p":"teluxilue_100041","s":17938330,"v":77,"x":-8796771,"y":-899637},{"4k":0,"bb":-1939342,"bl":-8499371,"br":-7871332,"bt":-1327779,"c":[],"cl":2,"dom":1,"frc":2,"gs":17438076,"gv":77,"h":"","i":100042,"its":0,"l":13,"n":"˹,","p":"nasika_100042","s":17438076,"v":77,"x":-8341684,"y":-1659196},{"4k":0,"bb":-1707700,"bl":-8202579,"br":-7589746,"bt":-1088453,"c":[],"cl":2,"dom":1,"frc":2,"gs":13461900,"gv":77,"h":"","i":100044,"its":0,"l":13,"n":"˹,ɶ","p":"kusike_100044","s":13461900,"v":77,"x":-8011530,"y":-1510472},{"4k":0,"bb":-2070237,"bl":-7962263,"br":-7657712,"bt":-1445447,"c":[],"cl":2,"dom":1,"frc":2,"gs":11763164,"gv":77,"h":"","i":100046,"its":0,"l":13,"n":"ŵ,ǿ","p":"punuo_100046","s":11763164,"v":77,"x":-7794882,"y":-1774473}],"cl":1,"dom":1,"frc":2,"h":"","i":40465,"its":0,"l":11,"n":"³","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":331869,"bl":-6064961,"br":-5746416,"bt":636726,"c":[],"cl":2,"dom":1,"frc":2,"gs":10938970,"gv":77,"h":"","i":100064,"its":0,"l":13,"n":"","p":"kayan_100064","s":10938970,"v":77,"x":-5823581,"y":544962}],"cl":1,"dom":1,"frc":2,"h":"","i":40026,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":-553905,"bl":-10191946,"br":-8363313,"bt":150135,"c":[],"cl":2,"dom":1,"frc":2,"gs":42648042,"gv":77,"h":"","i":100070,"its":0,"l":13,"n":",ǻ,,˹","p":"jiduo_100070","s":42648042,"v":77,"x":-8734828,"y":-19945}],"cl":1,"dom":1,"frc":2,"h":"","i":39509,"its":0,"l":11,"n":"϶","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":-4142468,"bl":-7694855,"br":-5920057,"bt":-3476492,"c":[],"cl":2,"dom":1,"frc":2,"gs":8774674,"gv":76,"h":"","i":100065,"its":0,"l":13,"n":"","p":"wulagui_100065","s":2905338,"v":76,"x":-6252270,"y":-4125325},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":-2034088,"bl":-7751968,"br":-7260521,"bt":-1073524,"c":[],"cl":2,"dom":1,"frc":2,"gs":17155050,"gv":77,"h":"","i":100068,"its":0,"l":13,"n":"˹,","p":"labasi_100068","s":17155050,"v":77,"x":-7583104,"y":-1849249},{"4k":0,"bb":-2324717,"bl":-7222353,"br":-6393313,"bt":-1494303,"c":[],"cl":2,"dom":1,"frc":2,"gs":16911289,"gv":77,"h":"","i":100069,"its":0,"l":13,"n":"ʥ³˹","p":"skelusi_100069","s":16911289,"v":77,"x":-7031096,"y":-2002239},{"4k":0,"bb":-2603647,"bl":-7694855,"br":-6849162,"bt":-1771266,"c":[],"cl":2,"dom":1,"frc":2,"gs":26887638,"gv":77,"h":"","i":100066,"its":0,"l":13,"n":"տ,,,ǡ","p":"sukelei_100066","s":26887638,"v":77,"x":-7265001,"y":-2143198}],"cl":1,"dom":1,"frc":2,"h":"","i":40717,"its":0,"l":11,"n":"ά","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":3510816,"bl":-9871803,"br":-9449706,"bt":3862440,"c":[],"cl":2,"dom":1,"frc":2,"gs":52028828,"gv":77,"h":"","i":100158,"its":0,"l":13,"n":"ɸ","p":"mengml_100158","s":52028828,"v":77,"x":-9606973,"y":3788471},{"4k":0,"bb":8233595,"bl":-17032198,"br":-15641574,"bt":9673992,"c":[],"cl":2,"dom":1,"frc":2,"gs":25640568,"gv":77,"h":"","i":100159,"its":0,"l":13,"n":"","p":"ankel_100159","s":25640568,"v":77,"x":-16687004,"y":8638248},{"4k":0,"bb":3929715,"bl":-12783375,"br":-12078112,"bt":4448452,"c":[],"cl":2,"dom":1,"frc":2,"gs":44921065,"gv":77,"h":"","i":100163,"its":0,"l":13,"n":"弪","p":"peij_100163","s":44921065,"v":77,"x":-12407328,"y":4401324},{"4k":0,"bb":3640172,"bl":-12784478,"br":-12101531,"bt":4054404,"c":[],"cl":2,"dom":1,"frc":2,"gs":64281676,"gv":77,"h":"","i":100164,"its":0,"l":13,"n":"˹","p":"feiniks_100164","s":64281676,"v":77,"x":-12480935,"y":3951419},{"4k":0,"bb":3809237,"bl":-13509987,"br":-12704960,"bt":4253172,"c":[],"cl":2,"dom":1,"frc":2,"gs":166554834,"gv":77,"h":"","i":100166,"its":0,"l":13,"n":"ɼ,ʥ","p":"luoshanj_100166","s":166554834,"v":77,"x":-13162970,"y":4011670},{"4k":0,"bb":4238978,"bl":-13700456,"br":-12873689,"bt":4660687,"c":[],"cl":2,"dom":1,"frc":2,"gs":112714012,"gv":77,"h":"","i":100168,"its":0,"l":13,"n":"ɽɽ,ʥ,ʥ³,","p":"jiujinshan_100168","s":112714012,"v":77,"x":-13627815,"y":4521261},{"4k":0,"bb":4661262,"bl":-8609534,"br":-8554389,"bt":4711670,"c":[],"cl":2,"dom":1,"frc":2,"gs":28681804,"gv":77,"h":"","i":100175,"its":0,"l":13,"n":"ʢ","p":"huashengd_100175","s":28681804,"v":77,"x":-8575798,"y":4681298},{"4k":0,"bb":2801950,"bl":-9230887,"br":-8909111,"bt":3192173,"c":[],"cl":2,"dom":1,"frc":2,"gs":57566155,"gv":77,"h":"","i":100176,"its":0,"l":13,"n":"","p":"maiami_100176","s":57566155,"v":77,"x":-8931201,"y":2953341},{"4k":0,"bb":3177325,"bl":-9289813,"br":-8942986,"bt":3613969,"c":[],"cl":2,"dom":1,"frc":2,"gs":78695099,"gv":77,"h":"","i":100177,"its":0,"l":13,"n":"","p":"ankel_100177","s":78695099,"v":77,"x":-9049711,"y":3288548},{"4k":0,"bb":3885153,"bl":-9553847,"br":-9148001,"bt":4158273,"c":[],"cl":2,"dom":1,"frc":2,"gs":99304325,"gv":77,"h":"","i":100180,"its":0,"l":13,"n":"","p":"yateland_100180","s":99304325,"v":77,"x":-9402496,"y":3963923},{"4k":0,"bb":2130540,"bl":-19847757,"br":-17233700,"bt":3278320,"c":[],"cl":2,"dom":1,"frc":2,"gs":23268631,"gv":77,"h":"","i":100183,"its":0,"l":13,"n":",̴ɽ,Ĵ,ï˵","p":"xiaweiyi_100183","s":23268631,"v":77,"x":-17572888,"y":2412836},{"4k":0,"bb":4856915,"bl":-10187860,"br":-9673888,"bt":5224058,"c":[],"cl":2,"dom":1,"frc":2,"gs":107041483,"gv":77,"h":"","i":100185,"its":0,"l":13,"n":"֥Ӹ","p":"zhijiage_100185","s":107041483,"v":77,"x":-9773841,"y":5112691},{"4k":0,"bb":4521075,"bl":-9811180,"br":-9424170,"bt":4851749,"c":[],"cl":2,"dom":1,"frc":2,"gs":66930659,"gv":77,"h":"","i":100187,"its":0,"l":13,"n":"˹","p":"bolisi_100187","s":66930659,"v":77,"x":-9591176,"y":4804753},{"4k":0,"bb":4647911,"bl":-8589369,"br":-8468329,"bt":4804873,"c":[],"cl":2,"dom":1,"frc":2,"gs":44184461,"gv":77,"h":"","i":100197,"its":0,"l":13,"n":"ͶĦ","p":"baerdimo_100197","s":44184461,"v":77,"x":-8528522,"y":4736040},{"4k":0,"bb":5019279,"bl":-7993620,"br":-7784654,"bt":5267269,"c":[],"cl":2,"dom":1,"frc":2,"gs":94533960,"gv":77,"h":"","i":100204,"its":0,"l":13,"n":"ʿ","p":"ankel_100204","s":94533960,"v":77,"x":-7909382,"y":5184839},{"4k":0,"bb":5288269,"bl":-10554918,"br":-10154154,"bt":5799212,"c":[],"cl":2,"dom":1,"frc":2,"gs":71032782,"gv":77,"h":"","i":100211,"its":0,"l":13,"n":"ᰢ˹,ʥ","p":"sbl_100211","s":71032782,"v":77,"x":-10377572,"y":5583517},{"4k":0,"bb":4129629,"bl":-13354093,"br":-12681298,"bt":4779671,"c":[],"cl":2,"dom":1,"frc":2,"gs":30674220,"gv":77,"h":"","i":100219,"its":0,"l":13,"n":"˹ά˹","p":"lasiweijiasi_100219","s":30674220,"v":77,"x":-12829738,"y":4313140},{"4k":0,"bb":4910350,"bl":-8369455,"br":-7999138,"bt":5161766,"c":[],"cl":2,"dom":1,"frc":2,"gs":132536843,"gv":77,"h":"","i":100227,"its":0,"l":13,"n":"ŦԼ","p":"niuyue_100227","s":132536843,"v":77,"x":-8222684,"y":4961265},{"4k":0,"bb":4860710,"bl":-9301582,"br":-8769771,"bt":5285589,"c":[],"cl":2,"dom":1,"frc":2,"gs":58448830,"gv":77,"h":"","i":100234,"its":0,"l":13,"n":"","p":"keliful_100234","s":58448830,"v":77,"x":-9095318,"y":5059601},{"4k":0,"bb":4729810,"bl":-9304385,"br":-8979983,"bt":5002925,"c":[],"cl":2,"dom":1,"frc":2,"gs":48718082,"gv":77,"h":"","i":100235,"its":0,"l":13,"n":"ײ","p":"gelunbu_100235","s":48718082,"v":77,"x":-9239495,"y":4832619},{"4k":0,"bb":3940628,"bl":-11535664,"br":-10486548,"bt":4467121,"c":[],"cl":2,"dom":1,"frc":2,"gs":108728063,"gv":77,"h":"","i":100236,"its":0,"l":13,"n":",ƥȱ","p":"ekelahema_100236","s":108728063,"v":77,"x":-10855607,"y":4202519},{"4k":0,"bb":5469215,"bl":-13816137,"br":-13391692,"bt":5797505,"c":[],"cl":2,"dom":1,"frc":2,"gs":64658606,"gv":77,"h":"","i":100240,"its":0,"l":13,"n":"","p":"botelan_100240","s":64658606,"v":77,"x":-13653084,"y":5680597},{"4k":0,"bb":4792609,"bl":-8573843,"br":-8314248,"bt":5145182,"c":[],"cl":2,"dom":1,"frc":2,"gs":84791584,"gv":77,"h":"","i":100242,"its":0,"l":13,"n":"ѳ","p":"feicheng_100242","s":84791584,"v":77,"x":-8367445,"y":4831358},{"4k":0,"bb":4788273,"bl":-8985012,"br":-8680416,"bt":5174175,"c":[],"cl":2,"dom":1,"frc":2,"gs":63042412,"gv":77,"h":"","i":100243,"its":0,"l":13,"n":"ƥȱ","p":"pizib_100243","s":63042412,"v":77,"x":-8904077,"y":4901345},{"4k":0,"bb":3895244,"bl":-9280128,"br":-8928185,"bt":4177257,"c":[],"cl":2,"dom":1,"frc":2,"gs":57226737,"gv":77,"h":"","i":100245,"its":0,"l":13,"n":"ױ","p":"gelunbiya_100245","s":57226737,"v":77,"x":-9020852,"y":4004777},{"4k":0,"bb":2956921,"bl":-11223169,"br":-10638695,"bt":3480724,"c":[],"cl":2,"dom":1,"frc":2,"gs":61129735,"gv":77,"h":"","i":100251,"its":0,"l":13,"n":"ʥ","p":"shengandongna_100251","s":61129735,"v":77,"x":-10964379,"y":3408555},{"4k":0,"bb":3698957,"bl":-10923035,"br":-10452746,"bt":4014205,"c":[],"cl":2,"dom":1,"frc":2,"gs":80513826,"gv":77,"h":"","i":100255,"its":0,"l":13,"n":"˹","p":"dalas_100255","s":80513826,"v":77,"x":-10775508,"y":3842352},{"4k":0,"bb":3328048,"bl":-10752228,"br":-10396343,"bt":3801191,"c":[],"cl":2,"dom":1,"frc":2,"gs":80587358,"gv":77,"h":"","i":100256,"its":0,"l":13,"n":"˹","p":"xiusidun_100256","s":80587358,"v":77,"x":-10616633,"y":3451388},{"4k":0,"bb":4729591,"bl":-12717558,"br":-12106356,"bt":5176574,"c":[],"cl":2,"dom":1,"frc":2,"gs":39634422,"gv":77,"h":"","i":100258,"its":0,"l":13,"n":"κ","p":"yanhu_100258","s":39634422,"v":77,"x":-12455789,"y":4948960},{"4k":0,"bb":1576485,"bl":16155974,"br":16233655,"bt":2038728,"c":[],"cl":2,"dom":1,"frc":2,"gs":10029995,"gv":77,"h":"","i":100492,"its":0,"l":13,"n":"ൺ","p":"saiban_100492","s":10029995,"v":77,"x":16225099,"y":1698412},{"4k":0,"bb":4334962,"bl":-8725124,"br":-8442489,"bt":4589627,"c":[],"cl":2,"dom":1,"frc":2,"gs":67630912,"gv":77,"h":"","i":100263,"its":0,"l":13,"n":"ʿ","p":"lishiman_100263","s":67630912,"v":77,"x":-8620235,"y":4488468},{"4k":0,"bb":5855399,"bl":-13752763,"br":-13469378,"bt":6068226,"c":[],"cl":2,"dom":1,"frc":2,"gs":47670095,"gv":77,"h":"","i":100270,"its":0,"l":13,"n":"ͼ","p":"xiyatu_100270","s":47670095,"v":77,"x":-13622734,"y":6012120}],"cl":1,"dom":1,"frc":2,"h":"","i":54003,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":6783512,"bl":-12778250,"br":-12459477,"bt":7157957,"c":[],"cl":2,"dom":1,"frc":2,"gs":41632128,"gv":77,"h":"","i":100530,"its":0,"l":13,"n":"ɶ","p":"aidemdun_100530","s":41632128,"v":77,"x":-12633926,"y":7048897},{"4k":0,"bb":6487310,"bl":-12778836,"br":-12459736,"bt":6802511,"c":[],"cl":2,"dom":1,"frc":2,"gs":27320469,"gv":77,"h":"","i":100533,"its":0,"l":13,"n":"","p":"kaerjil_100533","s":27320469,"v":77,"x":-12698484,"y":6591291},{"4k":0,"bb":5345220,"bl":-7390875,"br":-6654999,"bt":5749408,"c":[],"cl":2,"dom":1,"frc":2,"gs":39717908,"gv":77,"h":"","i":100098,"its":0,"l":13,"n":"˹","p":"alfks_100098","s":39717908,"v":77,"x":-7077240,"y":5536082},{"4k":0,"bb":6213505,"bl":-13643260,"br":-12717307,"bt":6883697,"c":[],"cl":2,"dom":1,"frc":2,"gs":41157715,"gv":77,"h":"","i":100106,"its":0,"l":13,"n":"","p":"jiluona_100106","s":41157715,"v":77,"x":-13302379,"y":6393902},{"4k":0,"bb":5848519,"bl":-6613653,"br":-5857767,"bt":6699446,"c":[],"cl":2,"dom":1,"frc":2,"gs":99655809,"gv":77,"h":"","i":100109,"its":0,"l":13,"n":"Ŧ","p":"niufen_100109","s":99655809,"v":77,"x":-5872646,"y":6008366},{"4k":0,"bb":8351248,"bl":-14287579,"br":-12123880,"bt":9503809,"c":[],"cl":2,"dom":1,"frc":2,"gs":59453461,"gv":77,"h":"","i":100110,"its":0,"l":13,"n":"Ƶ","p":"huangdao_100110","s":59453461,"v":77,"x":-12731952,"y":8929360},{"4k":0,"bb":5794257,"bl":-7698926,"br":-7176929,"bt":6084378,"c":[],"cl":2,"dom":1,"frc":2,"gs":94940561,"gv":77,"h":"","i":100094,"its":0,"l":13,"n":"ά","p":"weiduoliya_100094","s":94940561,"v":77,"x":-13733150,"y":6146155},{"4k":0,"bb":6211602,"bl":-10894084,"br":-10586628,"bt":6485660,"c":[],"cl":2,"dom":1,"frc":2,"gs":23405886,"gv":77,"h":"","i":100525,"its":0,"l":13,"n":"Ხ","p":"wennibo_100525","s":23405886,"v":77,"x":-10822082,"y":6388407},{"4k":0,"bb":5578002,"bl":-8357657,"br":-8109343,"bt":5834548,"c":[],"cl":2,"dom":1,"frc":2,"gs":45801436,"gv":77,"h":"","i":100128,"its":0,"l":13,"n":"","p":"mengtele_100128","s":45801436,"v":77,"x":-8206581,"y":5669527},{"4k":0,"bb":5462036,"bl":-8707453,"br":-8265067,"bt":5784444,"c":[],"cl":2,"dom":1,"frc":2,"gs":50371248,"gv":77,"h":"","i":100131,"its":0,"l":13,"n":"̫","p":"wotaihua_100131","s":50371248,"v":77,"x":-8426664,"y":5657404},{"4k":0,"bb":5803610,"bl":-8067810,"br":-7778233,"bt":6075477,"c":[],"cl":2,"dom":1,"frc":2,"gs":24725169,"gv":77,"h":"","i":100132,"its":0,"l":13,"n":"","p":"kuibeik_100132","s":24725169,"v":77,"x":-7927490,"y":5879971},{"4k":0,"bb":5066388,"bl":-9367536,"br":-8427946,"bt":5835646,"c":[],"cl":2,"dom":1,"frc":2,"gs":170031233,"gv":77,"h":"","i":100139,"its":0,"l":13,"n":"׶,ܶ,Ǽ","p":"duolunduo_100139","s":170031233,"v":77,"x":-8836991,"y":5382159},{"4k":0,"bb":6228807,"bl":-13899966,"br":-13443487,"bt":6625256,"c":[],"cl":2,"dom":1,"frc":2,"gs":39932538,"gv":77,"h":"","i":100140,"its":0,"l":13,"n":"¸绪,","p":"wengehua_100140","s":39932538,"v":77,"x":-13705195,"y":6286029}],"cl":1,"dom":1,"frc":2,"h":"","i":54015,"its":0,"l":11,"n":"ô","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":950416,"bl":11371741,"br":12186206,"bt":2662871,"c":[{"4k":0,"bb":2014440,"bl":-11770916,"br":-11105361,"bt":2830844,"c":[],"cl":2,"dom":1,"frc":2,"gs":59708640,"gv":77,"h":"","i":100358,"its":0,"l":13,"n":",Ƕ,ϴ,ɻ","p":"laiang_100358","s":59708640,"v":77,"x":-11317305,"y":2388136},{"4k":0,"bb":2599867,"bl":-13172688,"br":-12181283,"bt":3836634,"c":[],"cl":2,"dom":1,"frc":2,"gs":24141506,"gv":77,"h":"","i":100359,"its":0,"l":13,"n":"ٻ","p":"dihuan_100359","s":24141506,"v":77,"x":-13028807,"y":3807902},{"4k":0,"bb":1624975,"bl":-10487009,"br":-9631969,"bt":2449023,"c":[],"cl":2,"dom":1,"frc":2,"gs":31778233,"gv":77,"h":"","i":100360,"its":0,"l":13,"n":"÷,,","p":"meilida_100360","s":31778233,"v":77,"x":-9859428,"y":2339043},{"4k":0,"bb":2935696,"bl":-12128477,"br":-11507235,"bt":3721369,"c":[],"cl":2,"dom":1,"frc":2,"gs":22563488,"gv":77,"h":"","i":100361,"its":0,"l":13,"n":"","p":"qiwawa_100361","s":22563488,"v":77,"x":-11807686,"y":3308354},{"4k":0,"bb":1753509,"bl":-11378031,"br":-10439204,"bt":2556023,"c":[],"cl":2,"dom":1,"frc":2,"gs":97790742,"gv":77,"h":"","i":100363,"its":0,"l":13,"n":"ī,հ,߹","p":"moxigecity_100363","s":97790742,"v":77,"x":-11035578,"y":2191592},{"4k":0,"bb":2404227,"bl":-11377526,"br":-10814828,"bt":3199223,"c":[],"cl":2,"dom":1,"frc":2,"gs":39487770,"gv":77,"h":"","i":100365,"its":0,"l":13,"n":"ī","p":"mengtelei_100365","s":39487770,"v":77,"x":-11167297,"y":2941606}],"cl":1,"dom":1,"frc":2,"h":"","i":54025,"its":0,"l":11,"n":"ī","p":"","s":2905338,"v":15,"x":11925040,"y":2059946},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":1171110,"bl":-9760342,"br":-9236664,"bt":1677988,"c":[],"cl":2,"dom":1,"frc":2,"gs":19054445,"gv":77,"h":"","i":100147,"its":0,"l":13,"n":"ǹ","p":"managua_100147","s":19054445,"v":77,"x":-9599871,"y":1349751}],"cl":1,"dom":1,"frc":2,"h":"","i":54032,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":2010760,"bl":-7563677,"br":-7263085,"bt":2084246,"c":[],"cl":2,"dom":1,"frc":2,"gs":27225888,"gv":77,"h":"","i":100389,"its":0,"l":13,"n":"ʥ","p":"shenghua_100389","s":27225888,"v":77,"x":-7358957,"y":2078487}],"cl":1,"dom":1,"frc":2,"h":"","i":54028,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":2428732,"bl":-9456857,"br":-8956104,"bt":2644437,"c":[],"cl":2,"dom":1,"frc":2,"gs":16936085,"gv":77,"h":"","i":100463,"its":0,"l":13,"n":"","p":"hawana_100463","s":16936085,"v":77,"x":-9169107,"y":2628837}],"cl":1,"dom":1,"frc":2,"h":"","i":54039,"its":0,"l":11,"n":"Ű","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":802103,"bl":-9270564,"br":-8585898,"bt":1107005,"c":[],"cl":2,"dom":1,"frc":2,"gs":18230810,"gv":77,"h":"","i":100489,"its":0,"l":13,"n":"","p":"banama_100489","s":18230810,"v":77,"x":-8839182,"y":1010608}],"cl":1,"dom":1,"frc":2,"h":"","i":54021,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":2216580,"bl":2665350,"br":4144360,"bt":3697831,"c":[],"cl":2,"dom":1,"frc":2,"gs":51212252,"gv":78,"h":"","i":100344,"its":0,"l":13,"n":"","p":"kailuo_100344","s":51212252,"v":78,"x":3477180,"y":3487670}],"cl":1,"dom":1,"frc":2,"h":"","i":70102,"its":0,"l":11,"n":"","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":-4116590,"bl":1986929,"br":2684526,"bt":-3550264,"c":[],"cl":2,"dom":1,"frc":2,"gs":33707505,"gv":78,"h":"","i":100357,"its":0,"l":13,"n":"ն","p":"kaipudun_100357","s":33707505,"v":78,"x":2050967,"y":-3994616}],"cl":1,"dom":1,"frc":2,"h":"","i":70087,"its":0,"l":11,"n":"Ϸ","p":"","s":2905338,"v":15,"x":8939138,"y":983360},{"4k":0,"bb":655571,"bl":8852423,"br":9114800,"bt":1092989,"c":[{"4k":0,"bb":3164152,"bl":-1469411,"br":-111319,"bt":4264562,"c":[],"cl":2,"dom":1,"frc":2,"gs":50932896,"gv":78,"h":"","i":100382,"its":0,"l":13,"n":"ʲ","p":"malakashi_100382","s":50932896,"v":78,"x":-888494,"y":3692199}],"cl":1,"dom":1,"frc":2,"h":"","i":70052,"its":0,"l":11,"n":"Ħ","p":"","s":2905338,"v":15,"x":8939138,"y":983360}],"dver":522,"fver":3000} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotMap.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotMap.cfg new file mode 100644 index 0000000..c032305 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotMap.cfg @@ -0,0 +1,106 @@ +{ +"ver":3, +"cities": +[ +{"i":131,"n":"北京市","bl": 12893020.92, "bb": 4781550.32, "br": 13022044.92, "bt": 4899310.32}, +{"i":289,"n":"上海市","bl": 13478516.92, "bb": 3608446.32, "br": 13566964.92, "bt": 3672830.32}, +{"i":257,"n":"广州市","bl": 12574260.92, "bb": 2604350.32, "br": 12640436.92, "bt": 2668222.32}, +{"i":340,"n":"深圳市","bl": 12662868.92, "bb": 2556766.32, "br": 12730708.92, "bt": 2599518.32}, +{"i":179,"n":"杭州市","bl": 13351892.92, "bb": 3502942.32, "br": 13423700.92, "bt": 3547614.32}, +{"i":176,"n":"太原市","bl": 12487124.92, "bb": 4508254.32, "br": 12543796.92, "bt": 4560446.32}, +{"i":332,"n":"天津市","bl": 13012180.92, "bb": 4689758.32, "br": 13110484.92, "bt": 4745822.32}, +{"i":288,"n":"济南市","bl": 12993108.92, "bb": 4340606.32, "br": 13087956.92, "bt": 4397694.32}, +{"i":224,"n":"苏州市","bl": 13377780.92, "bb": 3618878.32, "br": 13451572.92, "bt": 3705534.32}, +{"i":194,"n":"厦门市","bl": 13107028.92, "bb": 2778878.32, "br": 13188308.92, "bt": 2834942.32}, +{"i":236,"n":"青岛市","bl": 13366836.92, "bb": 4261630.32, "br": 13419476.92, "bt": 4333950.32}, +{"i":268,"n":"郑州市","bl": 12628724.92, "bb": 4088862.32, "br": 12685300.92, "bt": 4123422.32}, +{"i":75,"n":"成都市","bl": 11550516.92, "bb": 3543262.32, "br": 11622324.92, "bt": 3597790.32}, +{"i":218,"n":"武汉市","bl": 12695220.92, "bb": 3523934.32, "br": 12756148.92, "bt": 3578590.32}, +{"i":315,"n":"南京市","bl": 13197364.92, "bb": 3725150.32, "br": 13256884.92, "bt": 3782494.32}, +{"i":233,"n":"西安市","bl": 12106228.92, "bb": 4019550.32, "br": 12158836.92, "bt": 4062046.32}, +{"i":127,"n":"合肥市","bl": 13033076.92, "bb": 3697886.32, "br": 13082996.92, "bt": 3744606.32}, +{"i":300,"n":"福州市","bl": 13258484.92, "bb": 2964830.32, "br": 13312756.92, "bt": 3016030.32}, +{"i":158,"n":"长沙市","bl": 12562932.92, "bb": 3239966.32, "br": 12607860.92, "bt": 3265502.32}, +{"i":150,"n":"石家庄市","bl": 12724788.92, "bb": 4541342.32, "br": 12774580.92, "bt": 4578718.32}, +{"i":132,"n":"重庆市","bl": 11840820.92, "bb": 3400990.32, "br": 11881012.92, "bt": 3445534.32}, +{"i":104,"n":"昆明市","bl": 11420468.92, "bb": 2843294.32, "br": 11464500.92, "bt": 2877726.32}, +{"i":261,"n":"南宁市","bl":12036148.92,"bb":2564894.32,"br":12082612.92,"bt":2609310.32}, +{"i":163,"n":"南昌市","bl": 12877940.92, "bb": 3291614.32, "br": 12923508.92, "bt": 3328734.32}, +{"i":53,"n":"长春市","bl": 13926516.92, "bb": 5396574.32, "br": 13983348.92, "bt": 5446494.32}, +{"i":146,"n":"贵阳市","bl": 11854964.92, "bb": 3024990.32, "br": 11901300.92, "bt": 3072606.32}, +{"i":180,"n":"宁波市","bl": 13508084.92, "bb": 3449630.32, "br": 13576052.92, "bt": 3491102.32}, +{"i":48,"n":"哈尔滨市","bl": 14051444.92, "bb": 5685534.32, "br": 14123764.92, "bt": 5737886.32}, +{"i":92,"n":"乌鲁木齐市","bl": 9718644.92, "bb": 5391262.32, "br": 9779444.92, "bt": 5444894.32}, +{"i":317,"n":"无锡市","bl": 13362487.810000, "bb": 3664426.860000, "br": 13422487.810000, "bt": 3704426.860000}, +{"i":321,"n":"呼和浩特市","bl": 12400108.610000, "bb": 4938853.060000, "br": 12460108.610000, "bt": 4978853.060000}, +{"i":178,"n":"温州市","bl": 13405366.190000, "bb": 3209086.950000, "br": 13465366.190000, "bt": 3249086.950000}, +{"i":125,"n":"海口市","bl": 12252102.320000, "bb": 2240885.320000, "br": 12312102.320000, "bt": 2280885.320000}, +{"i":316,"n":"徐州市","bl": 13015462.300000, "bb": 4021039.600000, "br": 13075462.300000, "bt": 4061039.600000}, +{"i":119,"n":"东莞市","bl": 12634225.340000, "bb": 2600346.880000, "br": 12694225.340000, "bt": 2640346.880000}, +{"i":347,"n":"连云港市","bl": 13236519.120000, "bb": 4065375.220000, "br": 13296519.120000, "bt": 4105375.220000}, +{"i":138,"n":"佛山市","bl": 12564159.160000, "bb": 2599393.220000, "br": 12624159.160000, "bt": 2639393.220000}, +{"i":307,"n":"保定市","bl": 12826963.350000, "bb": 4658360.500000, "br": 12886963.350000, "bt": 4698360.500000}, +{"i":36,"n":"兰州市","bl": 11527683.250000, "bb": 4264074.360000, "br": 11587683.250000, "bt": 4304074.360000}, +{"i":58,"n":"沈阳市","bl": 13710624.940000, "bb": 5083604.930000, "br": 13770624.940000, "bt": 5123604.930000}, +{"i":134,"n":"泉州市","bl": 13172675.600000, "bb": 2825515.500000, "br": 13232675.600000, "bt": 2865515.500000}, +{"i":167,"n":"大连市","bl": 13505871.310000, "bb": 4667215.520000, "br": 13565871.310000, "bt": 4707215.520000}, +{"i":153,"n":"洛阳市","bl": 12487737.400000, "bb": 4072892.140000, "br": 12547737.400000, "bt": 4112892.140000}, +{"i":160,"n":"镇江市","bl": 13267907.460000, "bb": 3747190.940000, "br": 13327907.460000, "bt": 3787190.940000}, +{"i":162,"n":"淮安市","bl": 13220523.910000, "bb": 3932219.560000, "br": 13280523.910000, "bt": 3972219.560000}, +{"i":349,"n":"九江市","bl": 12883184.520000, "bb": 3426185.890000, "br": 12943184.520000, "bt": 3466185.890000}, +{"i":161,"n":"南通市","bl": 13425756.380000, "bb": 3722375.180000, "br": 13485756.380000, "bt": 3762375.180000}, +{"i":360,"n":"银川市","bl": 11792979.760000, "bb": 4603825.040000, "br": 11852979.760000, "bt": 4643825.040000}, +{"i":142,"n":"桂林市","bl": 12244323.040000, "bb": 2869670.320000, "br": 12304323.040000, "bt": 2909670.320000}, +{"i":149,"n":"沧州市","bl": 12979360.980000, "bb": 4574826.050000, "br": 13039360.980000, "bt": 4614826.050000}, +{"i":191,"n":"廊坊市","bl": 12961526.930000, "bb": 4748788.230000, "br": 13021526.930000, "bt": 4788788.230000}, +{"i":348,"n":"常州市","bl": 13326465.000000, "bb": 3690635.190000, "br": 13386465.000000, "bt": 3730635.190000}, +{"i":187,"n":"中山市","bl": 12596223.350000, "bb": 2540577.370000, "br": 12656223.350000, "bt": 2580577.370000}, +{"i":287,"n":"潍坊市","bl": 13233041.640000, "bb": 4353827.070000, "br": 13293041.640000, "bt": 4393827.070000}, +{"i":305,"n":"柳州市","bl": 12150978.590000, "bb": 2755794.040000, "br": 12210978.590000, "bt": 2795794.040000}, +{"i":308,"n":"周口市","bl": 12733375.120000, "bb": 3934511.680000, "br": 12793375.120000, "bt": 3974511.680000}, +{"i":333,"n":"金华市","bl": 13289808.730000, "bb": 3347777.040000, "br": 13349808.730000, "bt": 3387777.040000}, +{"i":234,"n":"临沂市","bl": 13143777.400000, "bb": 4128945.460000, "br": 13203777.400000, "bt": 4168945.460000}, +{"i":55,"n":"吉林市","bl": 14059253.890000, "bb": 5395759.910000, "br": 14119253.890000, "bt": 5435759.910000}, +{"i":334,"n":"嘉兴市","bl": 13413135.590000, "bb": 3561369.510000, "br": 13473135.590000, "bt": 3601369.510000}, +{"i":301,"n":"惠州市","bl": 12706274.780000, "bb": 2608830.720000, "br": 12766274.780000, "bt": 2648830.720000}, +{"i":66,"n":"西宁市","bl": 11298876.410000, "bb": 4343410.220000, "br": 11358876.410000, "bt": 4383410.220000}, +{"i":326,"n":"烟台市","bl": 13474264.830000, "bb": 4467886.610000, "br": 13534264.830000, "bt": 4507886.610000}, +{"i":265,"n":"唐山市","bl": 13126264.690000, "bb": 4767766.500000, "br": 13186264.690000, "bt": 4807766.500000}, +{"i":244,"n":"台州市","bl": 13488854.290000, "bb": 3292807.610000, "br": 13548854.290000, "bt": 3332807.610000}, +{"i":151,"n":"邯郸市","bl": 12714293.860000, "bb": 4339069.600000, "br": 12774293.860000, "bt": 4379069.600000}, +{"i":293,"n":"绍兴市","bl": 13394438.130000, "bb": 3462292.230000, "br": 13454438.130000, "bt": 3502292.230000}, +{"i":157,"n":"荆州市","bl": 12464843.300000, "bb": 3504596.710000, "br": 12524843.300000, "bt": 3544596.710000}, +{"i":140,"n":"珠海市","bl": 12611851.330000, "bb": 2506069.550000, "br": 12671851.330000, "bt": 2546069.550000}, +{"i":152,"n":"新乡市","bl": 12650840.640000, "bb": 4160790.270000, "br": 12710840.640000, "bt": 4200790.270000}, +{"i":223,"n":"盐城市","bl": 13345056.760000, "bb": 3902107.560000, "br": 13405056.760000, "bt": 3942107.560000}, +{"i":220,"n":"岳阳市","bl": 12565513.920000, "bb": 3382693.340000, "br": 12625513.920000, "bt": 3422693.340000}, +{"i":303,"n":"汕头市","bl": 12964315.300000, "bb": 2641400.920000, "br": 13024315.300000, "bt": 2681400.920000}, +{"i":309,"n":"南阳市","bl": 12498348.170000, "bb": 3853326.130000, "br": 12558348.170000, "bt": 3893326.130000}, +{"i":286,"n":"济宁市","bl": 12950082.650000, "bb": 4173680.010000, "br": 13010082.650000, "bt": 4213680.010000}, +{"i":277,"n":"宿迁市","bl": 13138893.220000, "bb": 3978280.610000, "br": 13198893.220000, "bt": 4018280.610000}, +{"i":346,"n":"扬州市","bl": 13264784.040000, "bb": 3773942.000000, "br": 13324784.040000, "bt": 3813942.000000}, +{"i":302,"n":"江门市","bl": 12557936.300000, "bb": 2544165.550000, "br": 12617936.300000, "bt": 2584165.550000}, +{"i":199,"n":"阳江市","bl": 12435359.340000, "bb": 2460045.770000, "br": 12495359.340000, "bt": 2500045.770000}, +{"i":354,"n":"淄博市","bl": 13112425.710000, "bb": 4366080.450000, "br": 13172425.710000, "bt": 4406080.450000}, +{"i":338,"n":"肇庆市","bl": 12491313.980000, "bb": 2604634.130000, "br": 12551313.980000, "bt": 2644634.130000}, +{"i":365,"n":"赣州市","bl": 12764746.090000, "bb": 2941136.590000, "br": 12824746.090000, "bt": 2981136.590000}, +{"i":266,"n":"邢台市","bl": 12718500.990000, "bb": 4402806.700000, "br": 12778500.990000, "bt": 4442806.700000}, +{"i":159,"n":"衡阳市","bl": 12502909.750000, "bb": 3071248.080000, "br": 12562909.750000, "bt": 3111248.080000}, +{"i":238,"n":"晋中市","bl": 12520130.570000, "bb": 4489828.420000, "br": 12580130.570000, "bt": 4529828.420000}, +{"i":267,"n":"安阳市","bl": 12699723.380000, "bb": 4270388.550000, "br": 12759723.380000, "bt": 4310388.550000}, +{"i":240,"n":"绵阳市","bl": 11625891.880000, "bb": 3655935.190000, "br": 11685891.880000, "bt": 3695935.190000}, +{"i":325,"n":"泰安市","bl": 13004475.870000, "bb": 4281068.220000, "br": 13064475.870000, "bt": 4321068.220000}, +{"i":276,"n":"泰州市","bl": 13319534.730000, "bb": 3782809.030000, "br": 13379534.730000, "bt": 3822809.030000}, +{"i":155,"n":"许昌市","bl": 12642226.900000, "bb": 3988261.730000, "br": 12702226.900000, "bt": 4028261.730000}, +{"i":328,"n":"运城市","bl": 12327360.880000, "bb": 4124403.790000, "br": 12387360.880000, "bt": 4164403.790000}, +{"i":264,"n":"张家口市","bl": 12760056.420000, "bb": 4936342.980000, "br": 12820056.420000, "bt": 4976342.980000}, +{"i":353,"n":"菏泽市","bl": 12823462.270000, "bb": 4154706.020000, "br": 12883462.270000, "bt": 4194706.020000}, +{"i":237,"n":"朔州市","bl": 12491344.520000, "bb": 4722817.090000, "br": 12551344.520000, "bt": 4762817.090000}, +{"i":211,"n":"焦作市","bl": 12572821.050000, "bb": 4150929.200000, "br": 12632821.050000, "bt": 4190929.200000}, +{"i":366,"n":"聊城市","bl": 12881739.700000, "bb": 4317899.460000, "br": 12941739.700000, "bt": 4357899.460000}, +{"i":337,"n":"铜陵市","bl": 13085741.520000, "bb": 3582909.300000, "br": 13145741.520000, "bt": 3622909.300000}, +{"i":368,"n":"临汾市","bl": 12386576.140000, "bb": 4268945.310000, "br": 12446576.140000, "bt": 4308945.310000}, +{"i":198,"n":"湛江市","bl": 12255916.770000, "bb": 2386974.260000, "br": 12315916.770000, "bt": 2426974.260000}, +{"i":213,"n":"平顶山市","bl": 12582730.050000, "bb": 3950697.960000, "br": 12642730.050000, "bt": 3990697.960000} +] +} diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotcity.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotcity.cfg new file mode 100644 index 0000000..94e687f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVHotcity.cfg @@ -0,0 +1 @@ +{"cities":[{"4k":0,"bb":4757504,"bl":12849152,"br":13082624,"bt":4994048,"c":[],"cl":2,"dom":1,"frc":1,"h":"bj","i":131,"its":1,"l":12,"n":"","p":"beijing_131","s":45521986,"v":320,"x":12959247,"y":4825323},{"4k":0,"bb":3568640,"bl":13454336,"br":13582336,"bt":3724288,"c":[],"cl":2,"dom":1,"frc":1,"h":"sh","i":289,"its":1,"l":12,"n":"Ϻ","p":"shanghai_289","s":41108081,"v":320,"x":13523376,"y":3641154},{"4k":0,"bb":2556928,"bl":12574720,"br":12698624,"bt":2728960,"c":[],"cl":2,"dom":1,"frc":1,"h":"gz","i":257,"its":1,"l":12,"n":"","p":"guangzhou_257","s":30107772,"v":320,"x":12609501,"y":2631394},{"4k":0,"bb":3640320,"bl":13176832,"br":13275136,"bt":3822592,"c":[],"cl":2,"dom":1,"frc":1,"h":"nj","i":315,"its":1,"l":12,"n":"Ͼ","p":"nanjing_315","s":21777532,"v":320,"x":13225203,"y":3748900},{"4k":0,"bb":3379200,"bl":13174784,"br":13440000,"bt":3556352,"c":[],"cl":2,"dom":1,"frc":1,"h":"hz","i":179,"its":1,"l":12,"n":"","p":"hangzhou_179","s":23401139,"v":320,"x":13376654,"y":3517776},{"4k":0,"bb":3493888,"bl":11468800,"br":11677696,"bt":3667968,"c":[],"cl":2,"dom":1,"frc":1,"h":"cd","i":75,"its":1,"l":12,"n":"ɶ","p":"chengdu_75","s":28504148,"v":320,"x":11585284,"y":3567299},{"4k":0,"bb":2523136,"bl":12654592,"br":12764160,"bt":2598912,"c":[],"cl":2,"dom":1,"frc":1,"h":"sz","i":340,"its":1,"l":12,"n":"","p":"shenzhen_340","s":28685707,"v":320,"x":12697742,"y":2560988},{"bb":2511872,"bl":12670976,"br":12747776,"bt":2564096,"c":[],"cl":2,"dom":1,"frc":2,"gs":63494441,"gv":75,"h":"xgtbxz","i":2912,"its":0,"l":11,"n":"ر","p":"xianggangtebiexingzheng_2912","s":63494441,"v":75,"x":12709499,"y":2529064},{"bb":2507776,"bl":12639232,"br":12648448,"bt":2522112,"c":[],"cl":2,"dom":1,"frc":2,"gs":22632328,"gv":75,"h":"amtbxz","i":2911,"its":0,"l":13,"n":"ر","p":"aomentebiexingzheng_2911","s":22632328,"v":75,"x":12640429,"y":2518425}],"dver":333,"fver":1} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVSDirectory.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVSDirectory.cfg new file mode 100644 index 0000000..f676ae2 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVSDirectory.cfg @@ -0,0 +1 @@ +{"cities":[{"i":1,"s":6311577},{"i":33,"s":374657},{"i":34,"s":369346},{"i":35,"s":784583},{"i":36,"s":4001430},{"i":37,"s":824859},{"i":38,"s":161574},{"i":39,"s":827221},{"i":40,"s":513938},{"i":41,"s":1989451},{"i":42,"s":1236080},{"i":43,"s":582875},{"i":44,"s":1363207},{"i":45,"s":516660},{"i":46,"s":814087},{"i":47,"s":374346},{"i":48,"s":8298071},{"i":49,"s":1378713},{"i":50,"s":1836166},{"i":51,"s":1027412},{"i":52,"s":1406803},{"i":53,"s":7802022},{"i":54,"s":1552641},{"i":55,"s":2922503},{"i":56,"s":1274608},{"i":57,"s":816095},{"i":58,"s":11305203},{"i":59,"s":1231027},{"i":60,"s":1334879},{"i":61,"s":1591091},{"i":62,"s":731286},{"i":63,"s":794223},{"i":64,"s":1627312},{"i":65,"s":407298},{"i":66,"s":2318949},{"i":67,"s":142942},{"i":68,"s":191525},{"i":69,"s":427116},{"i":70,"s":75934},{"i":71,"s":85734},{"i":72,"s":61945},{"i":73,"s":394522},{"i":74,"s":2644756},{"i":75,"s":22595419},{"i":76,"s":965040},{"i":77,"s":1478931},{"i":78,"s":1031256},{"i":79,"s":2097352},{"i":80,"s":1311645},{"i":81,"s":890966},{"i":82,"s":333718},{"i":83,"s":777662},{"i":84,"s":116498},{"i":85,"s":838583},{"i":86,"s":1083769},{"i":87,"s":714852},{"i":88,"s":335815},{"i":89,"s":354890},{"i":90,"s":1357614},{"i":91,"s":588366},{"i":92,"s":4842337},{"i":93,"s":1187938},{"i":94,"s":506545},{"i":95,"s":536398},{"i":96,"s":349367},{"i":97,"s":111416},{"i":98,"s":172390},{"i":99,"s":96653},{"i":100,"s":840384},{"i":101,"s":77431},{"i":102,"s":214865},{"i":103,"s":51153},{"i":104,"s":9950066},{"i":105,"s":1416121},{"i":106,"s":1672399},{"i":107,"s":1602884},{"i":108,"s":1072131},{"i":109,"s":960604},{"i":110,"s":748693},{"i":111,"s":2050356},{"i":112,"s":1121533},{"i":113,"s":208741},{"i":114,"s":1410196},{"i":115,"s":353429},{"i":116,"s":829689},{"i":117,"s":663653},{"i":118,"s":603348},{"i":119,"s":12755714},{"i":120,"s":964},{"i":121,"s":1426643},{"i":122,"s":550782},{"i":123,"s":568553},{"i":124,"s":880064},{"i":125,"s":3221357},{"i":126,"s":1654577},{"i":127,"s":7394210},{"i":128,"s":2376756},{"i":129,"s":2209133},{"i":130,"s":2843045},{"i":131,"s":29648081},{"i":132,"s":19676006},{"i":133,"s":1954890},{"i":134,"s":6865312},{"i":135,"s":875771},{"i":136,"s":641010},{"i":137,"s":1959547},{"i":138,"s":11728277},{"i":139,"s":2326966},{"i":140,"s":3604823},{"i":141,"s":2461935},{"i":142,"s":3515475},{"i":143,"s":1377538},{"i":144,"s":845095},{"i":145,"s":1137399},{"i":146,"s":4509862},{"i":147,"s":978397},{"i":148,"s":2733643},{"i":149,"s":2940804},{"i":150,"s":8282513},{"i":151,"s":3209391},{"i":152,"s":2881173},{"i":153,"s":4931275},{"i":154,"s":2202765},{"i":155,"s":1938270},{"i":156,"s":3053534},{"i":157,"s":2437574},{"i":158,"s":10162032},{"i":159,"s":2755455},{"i":160,"s":3384868},{"i":161,"s":6557961},{"i":162,"s":3304197},{"i":163,"s":5894980},{"i":164,"s":815941},{"i":165,"s":1207150},{"i":166,"s":1940242},{"i":167,"s":8019474},{"i":168,"s":1159737},{"i":169,"s":1028703},{"i":170,"s":2224879},{"i":171,"s":1764148},{"i":172,"s":2112686},{"i":173,"s":1916988},{"i":174,"s":1981050},{"i":175,"s":3457026},{"i":176,"s":5584262},{"i":177,"s":1157595},{"i":178,"s":8566717},{"i":179,"s":16817914},{"i":180,"s":11010128},{"i":181,"s":554125},{"i":182,"s":424196},{"i":183,"s":651258},{"i":184,"s":1546128},{"i":185,"s":509978},{"i":186,"s":1759763},{"i":187,"s":5544835},{"i":188,"s":1524043},{"i":189,"s":1682502},{"i":190,"s":1593514},{"i":191,"s":3285355},{"i":192,"s":1962302},{"i":193,"s":1987719},{"i":194,"s":7134897},{"i":195,"s":2033135},{"i":196,"s":1034064},{"i":197,"s":2382911},{"i":198,"s":3073835},{"i":199,"s":1443961},{"i":200,"s":1761123},{"i":201,"s":1353539},{"i":202,"s":891193},{"i":203,"s":1460594},{"i":204,"s":741522},{"i":205,"s":1256694},{"i":206,"s":1134183},{"i":207,"s":1865890},{"i":208,"s":2028198},{"i":209,"s":1692170},{"i":210,"s":2113204},{"i":211,"s":1676765},{"i":212,"s":1309868},{"i":213,"s":2255001},{"i":214,"s":2462095},{"i":215,"s":954228},{"i":216,"s":1750067},{"i":217,"s":1391014},{"i":218,"s":14010848},{"i":219,"s":2390757},{"i":220,"s":2692880},{"i":221,"s":1305516},{"i":222,"s":2369082},{"i":223,"s":4992249},{"i":224,"s":18113276},{"i":225,"s":988679},{"i":226,"s":1460234},{"i":227,"s":1107957},{"i":228,"s":1139500},{"i":229,"s":3011889},{"i":230,"s":330500},{"i":231,"s":1936052},{"i":232,"s":454440},{"i":233,"s":12641182},{"i":234,"s":5106224},{"i":235,"s":1830035},{"i":236,"s":10898447},{"i":237,"s":924045},{"i":238,"s":1898538},{"i":239,"s":1149901},{"i":240,"s":3619019},{"i":241,"s":1346873},{"i":242,"s":970164},{"i":243,"s":1958184},{"i":244,"s":5941931},{"i":245,"s":1311427},{"i":246,"s":551868},{"i":247,"s":199815},{"i":248,"s":1033336},{"i":249,"s":2206216},{"i":250,"s":1181949},{"i":251,"s":1638454},{"i":252,"s":1372895},{"i":253,"s":1001030},{"i":254,"s":1776821},{"i":255,"s":3245232},{"i":256,"s":554223},{"i":257,"s":23003567},{"i":258,"s":1102103},{"i":259,"s":2364490},{"i":260,"s":884498},{"i":261,"s":7723677},{"i":262,"s":2626827},{"i":263,"s":1037991},{"i":264,"s":2618021},{"i":265,"s":4997939},{"i":266,"s":2717502},{"i":267,"s":2461329},{"i":268,"s":13105068},{"i":269,"s":2502978},{"i":270,"s":2504317},{"i":271,"s":2492227},{"i":272,"s":1550081},{"i":273,"s":1854134},{"i":274,"s":924350},{"i":275,"s":1654833},{"i":276,"s":4064925},{"i":277,"s":3098400},{"i":278,"s":2256436},{"i":279,"s":656010},{"i":280,"s":1468699},{"i":281,"s":1880239},{"i":282,"s":1625886},{"i":283,"s":1784699},{"i":284,"s":1136246},{"i":285,"s":715547},{"i":286,"s":4220643},{"i":287,"s":6837477},{"i":288,"s":8469972},{"i":289,"s":32715397},{"i":290,"s":1222772},{"i":291,"s":3031438},{"i":292,"s":1870406},{"i":293,"s":5310986},{"i":294,"s":3677074},{"i":295,"s":1600856},{"i":296,"s":2703213},{"i":297,"s":1932482},{"i":298,"s":1793238},{"i":299,"s":888934},{"i":300,"s":8345872},{"i":301,"s":5210250},{"i":302,"s":4155961},{"i":303,"s":3290991},{"i":304,"s":1341341},{"i":305,"s":3108852},{"i":306,"s":1248891},{"i":307,"s":5825971},{"i":308,"s":2394732},{"i":309,"s":4038472},{"i":310,"s":1749123},{"i":311,"s":1295332},{"i":312,"s":833051},{"i":313,"s":1931997},{"i":314,"s":1415182},{"i":315,"s":12814423},{"i":316,"s":6727373},{"i":317,"s":10118742},{"i":318,"s":1926887},{"i":319,"s":1545388},{"i":320,"s":2369965},{"i":321,"s":3760084},{"i":322,"s":724486},{"i":323,"s":2077916},{"i":324,"s":959952},{"i":325,"s":2823025},{"i":326,"s":6219747},{"i":327,"s":1335595},{"i":328,"s":2369617},{"i":329,"s":1584369},{"i":330,"s":1551149},{"i":331,"s":1688147},{"i":332,"s":13147270},{"i":333,"s":6920550},{"i":334,"s":5918167},{"i":335,"s":638858},{"i":336,"s":1065255},{"i":337,"s":707319},{"i":338,"s":2725458},{"i":339,"s":1030030},{"i":340,"s":21386101},{"i":341,"s":1430876},{"i":342,"s":1454867},{"i":343,"s":1040534},{"i":344,"s":1391683},{"i":345,"s":1617952},{"i":346,"s":4714271},{"i":347,"s":3554536},{"i":348,"s":8007707},{"i":349,"s":3096983},{"i":350,"s":975243},{"i":351,"s":1179307},{"i":352,"s":1452857},{"i":353,"s":2610672},{"i":354,"s":4265964},{"i":355,"s":1657013},{"i":356,"s":1898936},{"i":357,"s":866885},{"i":358,"s":1128564},{"i":359,"s":741347},{"i":360,"s":3175491},{"i":361,"s":2067557},{"i":362,"s":1298603},{"i":363,"s":1762962},{"i":364,"s":2630621},{"i":365,"s":3856911},{"i":366,"s":2009723},{"i":367,"s":1262234},{"i":368,"s":2251675},{"i":369,"s":1704042},{"i":370,"s":1668790},{"i":371,"s":976348},{"i":372,"s":2425437},{"i":373,"s":1369455},{"i":1277,"s":571535},{"i":2911,"s":554211},{"i":2912,"s":5020758}],"fver":1,"dver":20150320} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVStreet.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVStreet.cfg new file mode 100644 index 0000000..507e5ed --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVStreet.cfg @@ -0,0 +1 @@ +{"cities":[{"bb":4758298,"bl":12849780,"br":13081648,"bt":4993922,"i":131,"n":"北京市"},{"bb":5014316,"bl":13629240,"br":13783738,"bt":5290030,"i":58,"n":"沈阳市"},{"bb":3626874,"bl":13305727,"br":13426482,"bt":3739356,"i":317,"n":"无锡市"},{"bb":3640320,"bl":12331008,"br":12594176,"bt":3823616,"i":156,"n":"襄樊市"},{"bb":3193856,"bl":12154880,"br":12290048,"bt":3436544,"i":274,"n":"凤凰"},{"bb":3568640,"bl":13454336,"br":13582336,"bt":3724288,"i":289,"n":"上海市"},{"bb":4631552,"bl":12992512,"br":13145088,"bt":4876288,"i":332,"n":"天津市"},{"bb":4648960,"bl":13461504,"br":13753344,"bt":4869120,"i":167,"n":"大连市"},{"bb":2037760,"bl":12126208,"br":12225536,"bt":2098176,"i":121,"n":"三亚市"},{"bb":3385344,"bl":9991168,"br":10311680,"bt":3618816,"i":100,"n":"拉萨市"},{"bb":2202624,"bl":12253184,"br":12325888,"bt":2280448,"i":125,"n":"海口市"},{"bb":2523136,"bl":12654592,"br":12764160,"bt":2598912,"i":340,"n":"深圳市"},{"bb":3579904,"bl":13349888,"br":13513728,"bt":3745792,"i":224,"n":"苏州市"},{"bb":2511872,"bl":12670976,"br":12747776,"bt":2564096,"i":2912,"n":"香港特别行政区"},{"bb":2507776,"bl":12639232,"br":12648448,"bt":2522112,"i":2911,"n":"澳门特别行政区"},{"bb":2556928,"bl":12574720,"br":12698624,"bt":2728960,"i":257,"n":"广州市"},{"bb":4031488,"bl":12677120,"br":12832768,"bt":4143104,"i":210,"n":"开封市"},{"bb":3204096,"bl":12939264,"br":13191168,"bt":3444736,"i":364,"n":"上饶市"},{"bb":4210688,"bl":13304832,"br":13516800,"bt":4434944,"i":236,"n":"青岛市"},{"bb":3966976,"bl":12953600,"br":13211648,"bt":4132864,"i":316,"n":"徐州市"},{"bb":3249152,"bl":12851200,"br":12977152,"bt":3378176,"i":163,"n":"南昌市"},{"bb":5445632,"bl":13991936,"br":14499840,"bt":5859328,"i":48,"n":"哈尔滨市"},{"bb":5322752,"bl":13864960,"br":14149632,"bt":5632000,"i":53,"n":"长春市"},{"bb":3379200,"bl":13174784,"br":13440000,"bt":3556352,"i":179,"n":"杭州市"},{"bb":3640320,"bl":13176832,"br":13275136,"bt":3822592,"i":315,"n":"南京市"},{"bb":3630080,"bl":13262848,"br":13382656,"bt":3749888,"i":348,"n":"常州市"},{"bb":4779008,"bl":12303360,"br":12503040,"bt":5042176,"i":321,"n":"呼和浩特市"},{"bb":4279296,"bl":12938240,"br":13109248,"bt":4489216,"i":288,"n":"济南市"},{"bb":4620288,"bl":12925952,"br":13054976,"bt":4853760,"i":191,"n":"廊坊市"},{"bb":2782208,"bl":13123584,"br":13188096,"bt":2847744,"i":194,"n":"厦门市"},{"bb":4586496,"bl":12664832,"br":12951552,"bt":4832256,"i":307,"n":"保定市"},{"bb":5132288,"bl":14190592,"br":14619648,"bt":5516288,"i":54,"n":"延边朝鲜族自治州"},{"bb":4216832,"bl":11421696,"br":11642880,"bt":4419584,"i":36,"n":"兰州市"},{"bb":4941824,"bl":13646848,"br":13770752,"bt":5075968,"i":351,"n":"辽阳市"},{"bb":4306944,"bl":11233280,"br":11345920,"bt":4470784,"i":66,"n":"西宁市"},{"bb":3676160,"bl":12990464,"br":13124608,"bt":3812352,"i":127,"n":"合肥市"},{"bb":4039680,"bl":12548096,"br":12717056,"bt":4139008,"i":268,"n":"郑州市"},{"bb":4476928,"bl":12413952,"br":12598272,"bt":4614144,"i":176,"n":"太原市"},{"bb":3477504,"bl":12657664,"br":12812288,"bt":3658752,"i":218,"n":"武汉市"},{"bb":3210240,"bl":12456960,"br":12721152,"bt":3313664,"i":158,"n":"长沙市"},{"bb":2520064,"bl":11948032,"br":12204032,"bt":2741248,"i":261,"n":"南宁市"},{"bb":2783232,"bl":11373568,"br":11542528,"bt":3048448,"i":104,"n":"昆明市"},{"bb":3963904,"bl":11981824,"br":12226560,"bt":4106240,"i":233,"n":"西安市"},{"bb":4031488,"bl":11983872,"br":12154880,"bt":4214784,"i":323,"n":"咸阳市"},{"bb":3493888,"bl":11468800,"br":11677696,"bt":3667968,"i":75,"n":"成都市"},{"bb":4481024,"bl":11782144,"br":11897856,"bt":4677632,"i":360,"n":"银川市"},{"bb":3834880,"bl":9978880,"br":11109376,"bt":4727808,"i":65,"n":"海西蒙古族藏族自治州"},{"bb":3690496,"bl":13381632,"br":13582336,"bt":3834880,"i":161,"n":"南通市"},{"bb":4568064,"bl":10277888,"br":11155456,"bt":5253120,"i":37,"n":"酒泉市"},{"bb":4498432,"bl":10841088,"br":11379712,"bt":4823040,"i":117,"n":"张掖市"},{"bb":3688448,"bl":9953280,"br":10886144,"bt":4315136,"i":71,"n":"玉树藏族自治州"},{"bb":4133888,"bl":13203456,"br":13353984,"bt":4282368,"i":173,"n":"日照市"},{"bb":4001792,"bl":13181952,"br":13342720,"bt":4157440,"i":347,"n":"连云港市"},{"bb":4015104,"bl":11641856,"br":11880448,"bt":4164608,"i":196,"n":"天水市"},{"bb":4785152,"bl":10891264,"br":10969088,"bt":4836352,"i":33,"n":"嘉峪关市"},{"bb":4090880,"bl":11013120,"br":11333632,"bt":4447232,"i":68,"n":"海南藏族自治州"},{"bb":4236288,"bl":13155328,"br":13361152,"bt":4460544,"i":287,"n":"潍坊市"},{"bb":3531776,"bl":12452864,"br":12635136,"bt":3690496,"i":217,"n":"荆门市"},{"bb":4379648,"bl":11335680,"br":11601920,"bt":4761600,"i":118,"n":"武威市"},{"bb":4376576,"bl":10919936,"br":11427840,"bt":4708352,"i":67,"n":"海北藏族自治州"},{"bb":3963904,"bl":12587008,"br":12728320,"bt":4060160,"i":155,"n":"许昌市"},{"bb":5169152,"bl":13274112,"br":13773824,"bt":5700608,"i":64,"n":"通辽市"},{"bb":5475328,"bl":13300736,"br":13765632,"bt":6020096,"i":62,"n":"兴安盟"},{"bb":4388864,"bl":11940864,"br":12385280,"bt":4780032,"i":231,"n":"榆林市"},{"bb":5026816,"bl":12954624,"br":13469696,"bt":5630976,"i":297,"n":"赤峰市"},{"bb":4225024,"bl":12918784,"br":13136896,"bt":4341760,"i":325,"n":"泰安市"},{"bb":3946496,"bl":12371968,"br":12578816,"bt":4150272,"i":153,"n":"洛阳市"},{"bb":4505600,"bl":12570624,"br":12696576,"bt":4628480,"i":357,"n":"阳泉市"},{"bb":4376576,"bl":12286976,"br":12506112,"bt":4657152,"i":327,"n":"吕梁市"},{"bb":4192256,"bl":12286976,"br":12532736,"bt":4405248,"i":368,"n":"临汾市"},{"bb":4707328,"bl":12456960,"br":12644352,"bt":4883456,"i":237,"n":"朔州市"},{"bb":4572160,"bl":12350464,"br":12688384,"bt":4791296,"i":367,"n":"忻州市"},{"bb":3315712,"bl":12684288,"br":13015040,"bt":3492864,"i":349,"n":"九江市"},{"bb":4083712,"bl":12269568,"br":12478464,"bt":4252672,"i":328,"n":"运城市"},{"bb":4364288,"bl":12402688,"br":12707840,"bt":4567040,"i":238,"n":"晋中市"},{"bb":4186112,"bl":11984896,"br":12308480,"bt":4484096,"i":284,"n":"延安市"},{"bb":4251648,"bl":12466176,"br":12662784,"bt":4431872,"i":356,"n":"长治市"},{"bb":5471232,"bl":13541376,"br":13846528,"bt":5799936,"i":51,"n":"白城市"},{"bb":4122624,"bl":12621824,"br":12805120,"bt":4254720,"i":152,"n":"新乡市"},{"bb":4964352,"bl":13944832,"br":14111744,"bt":5286912,"i":165,"n":"通化市"},{"bb":4368384,"bl":13490176,"br":13663232,"bt":4499456,"i":175,"n":"威海市"},{"bb":4123648,"bl":11726848,"br":12008448,"bt":4242432,"i":359,"n":"平凉市"},{"bb":4171776,"bl":11840512,"br":12103680,"bt":4436992,"i":135,"n":"庆阳市"},{"bb":5926912,"bl":12861440,"br":14035968,"bt":7012352,"i":61,"n":"呼伦贝尔市"},{"bb":2681856,"bl":13014016,"br":13164544,"bt":2882560,"i":255,"n":"漳州市"},{"bb":4874240,"bl":12162048,"br":12407808,"bt":5243904,"i":229,"n":"包头市"},{"bb":3889152,"bl":12495872,"br":12656640,"bt":4051968,"i":213,"n":"平顶山市"},{"bb":3249152,"bl":11720704,"br":12268544,"bt":3768320,"i":132,"n":"重庆市"},{"bb":3760128,"bl":11743232,"br":12055552,"bt":3989504,"i":352,"n":"汉中市"},{"bb":5434368,"bl":13705216,"br":14049280,"bt":5678080,"i":52,"n":"松原市"},{"bb":4292608,"bl":11610112,"br":11820032,"bt":4519936,"i":181,"n":"中卫市"},{"bb":5348352,"bl":14274560,"br":14620672,"bt":5748736,"i":49,"n":"牡丹江市"},{"bb":3776512,"bl":12590080,"br":12827648,"bt":3943424,"i":269,"n":"驻马店市"},{"bb":2883584,"bl":13178880,"br":13419520,"bt":3060736,"i":300,"n":"福州市"},{"bb":3085312,"bl":10027008,"br":10505216,"bt":3461120,"i":97,"n":"山南地区"},{"bb":3130368,"bl":9144320,"br":10058752,"bt":3716096,"i":102,"n":"日喀则地区"},{"bb":3173376,"bl":10259456,"br":10994688,"bt":3569664,"i":98,"n":"林芝地区"},{"bb":3948544,"bl":11834368,"br":12029952,"bt":4154368,"i":171,"n":"宝鸡市"},{"bb":4114432,"bl":12531712,"br":12652544,"bt":4207616,"i":211,"n":"焦作市"},{"bb":3878912,"bl":12700672,"br":12875776,"bt":4050944,"i":308,"n":"周口市"},{"bb":5217280,"bl":13987840,"br":14252032,"bt":5537792,"i":55,"n":"吉林市"},{"bb":3338240,"bl":12211200,"br":12395520,"bt":3457024,"i":312,"n":"张家界市"},{"bb":3404800,"bl":13046784,"br":13237248,"bt":3549184,"i":252,"n":"黄山市"},{"bb":397312,"bl":12086272,"br":13144064,"bt":2288640,"i":296,"n":"海南省直辖县级行政单位"},{"bb":5741568,"bl":14416896,"br":15040512,"bt":6154240,"i":42,"n":"佳木斯市"},{"bb":4065280,"bl":12898304,"br":13091840,"bt":4274176,"i":286,"n":"济宁市"},{"bb":3319808,"bl":13020160,"br":13105152,"bt":3474432,"i":225,"n":"景德镇市"},{"bb":4499456,"bl":11852800,"br":12409856,"bt":4968448,"i":283,"n":"鄂尔多斯市"},{"bb":4957184,"bl":13758464,"br":14004224,"bt":5069824,"i":227,"n":"本溪市"},{"bb":2850816,"bl":13186048,"br":13328384,"bt":2951168,"i":195,"n":"莆田市"},{"bb":5785600,"bl":13626368,"br":14102528,"bt":6233088,"i":41,"n":"齐齐哈尔市"},{"bb":4353024,"bl":13308928,"br":13574144,"bt":4619264,"i":326,"n":"烟台市"},{"bb":3011584,"bl":13025280,"br":13279232,"bt":3269632,"i":133,"n":"南平市"},{"bb":3155968,"bl":13213696,"br":13408256,"bt":3349504,"i":292,"n":"丽水市"},{"bb":4866048,"bl":12903424,"br":13276160,"bt":5226496,"i":207,"n":"承德市"},{"bb":3660800,"bl":12658688,"br":12908544,"bt":3828736,"i":214,"n":"信阳市"},{"bb":2976768,"bl":12672000,"br":12907520,"bt":3225600,"i":318,"n":"吉安市"},{"bb":3383296,"bl":13345792,"br":13496320,"bt":3519488,"i":293,"n":"绍兴市"},{"bb":2540544,"bl":12669952,"br":12850176,"bt":2732032,"i":301,"n":"惠州市"},{"bb":2572288,"bl":12511232,"br":12623872,"bt":2684928,"i":138,"n":"佛山市"},{"bb":3691520,"bl":13244416,"br":13358080,"bt":3783680,"i":160,"n":"镇江市"},{"bb":5019648,"bl":13767680,"br":13970432,"bt":5204992,"i":184,"n":"抚顺市"},{"bb":4680704,"bl":13081600,"br":13298688,"bt":4907008,"i":265,"n":"唐山市"},{"bb":4474880,"bl":12637184,"br":12857344,"bt":4662272,"i":150,"n":"石家庄市"},{"bb":3834880,"bl":13160448,"br":13320192,"bt":4018176,"i":162,"n":"淮安市"},{"bb":4774912,"bl":12670976,"br":12965888,"bt":5155840,"i":264,"n":"张家口市"},{"bb":3602432,"bl":13028352,"br":13193216,"bt":3748864,"i":251,"n":"巢湖市"},{"bb":3335168,"bl":13456384,"br":13617152,"bt":3540992,"i":180,"n":"宁波市"},{"bb":2574336,"bl":12637184,"br":12721152,"bt":2633728,"i":119,"n":"东莞市"},{"bb":4370432,"bl":13053952,"br":13179904,"bt":4597760,"i":235,"n":"滨州市"},{"bb":3965952,"bl":12782592,"br":12986368,"bt":4121600,"i":154,"n":"商丘市"},{"bb":4756480,"bl":13199360,"br":13344768,"bt":4928512,"i":148,"n":"秦皇岛市"},{"bb":2516992,"bl":12597248,"br":12657664,"bt":2589696,"i":187,"n":"中山市"},{"bb":4166656,"bl":12649472,"br":12802048,"bt":4327424,"i":267,"n":"安阳市"},{"bb":5651456,"bl":13776896,"br":14004224,"bt":5990400,"i":50,"n":"大庆市"},{"bb":3513344,"bl":13391872,"br":13531136,"bt":3615744,"i":334,"n":"嘉兴市"},{"bb":3228672,"bl":13390848,"br":13580288,"bt":3398656,"i":244,"n":"台州市"},{"bb":3890176,"bl":13129728,"br":13267968,"bt":4062208,"i":277,"n":"宿迁市"},{"bb":2569216,"bl":12792832,"br":12940288,"bt":2673664,"i":339,"n":"汕尾市"},{"bb":3769344,"bl":13249536,"br":13349888,"bt":3928064,"i":346,"n":"扬州市"},{"bb":3259392,"bl":13138944,"br":13287424,"bt":3419136,"i":243,"n":"衢州市"},{"bb":2428928,"bl":12468224,"br":12609536,"bt":2598912,"i":302,"n":"江门市"},{"bb":2670592,"bl":12460032,"br":12682240,"bt":2883584,"i":197,"n":"清远市"},{"bb":3816448,"bl":13298688,"br":13470720,"bt":4078592,"i":223,"n":"盐城市"},{"bb":2468864,"bl":12585984,"br":12737536,"bt":2550784,"i":140,"n":"珠海市"},{"bb":4354048,"bl":11755520,"br":11985920,"bt":4591616,"i":322,"n":"吴忠市"},{"bb":4405248,"bl":13148160,"br":13286400,"bt":4577280,"i":174,"n":"东营市"},{"bb":3424256,"bl":13528064,"br":13692928,"bt":3599360,"i":245,"n":"舟山市"},{"bb":3529728,"bl":13274112,"br":13414400,"bt":3635200,"i":294,"n":"湖州市"},{"bb":4931584,"bl":13522944,"br":13629440,"bt":5052416,"i":228,"n":"盘锦市"},{"bb":3652608,"bl":12549120,"br":12706816,"bt":3798016,"i":371,"n":"随州市"},{"bb":4761600,"bl":8686592,"br":9362432,"bt":5230592,"i":85,"n":"阿克苏地区"},{"bb":4944896,"bl":13438976,"br":13648896,"bt":5152768,"i":166,"n":"锦州市"},{"bb":4200448,"bl":8289280,"br":8892416,"bt":4877312,"i":83,"n":"喀什地区"},{"bb":5012480,"bl":9713664,"br":10233856,"bt":5381120,"i":89,"n":"吐鲁番地区"},{"bb":3676160,"bl":12182528,"br":12423168,"bt":3908608,"i":216,"n":"十堰市"},{"bb":4049920,"bl":8616960,"br":9454592,"bt":4787200,"i":82,"n":"和田地区"},{"bb":3419136,"bl":12749824,"br":12860416,"bt":3525632,"i":311,"n":"黄石市"},{"bb":4245504,"bl":12833792,"br":12975104,"bt":4417536,"i":366,"n":"聊城市"},{"bb":3474432,"bl":9467904,"br":10578944,"bt":4342784,"i":101,"n":"那曲地区"},{"bb":6571008,"bl":13490176,"br":14142464,"bt":7054336,"i":38,"n":"大兴安岭地区"},{"bb":4264960,"bl":13085696,"br":13195264,"bt":4454400,"i":354,"n":"淄博市"},{"bb":2620416,"bl":12941312,"br":13066240,"bt":2694144,"i":303,"n":"汕头市"},{"bb":2434048,"bl":11965440,"br":12091392,"bt":2541568,"i":204,"n":"防城港市"},{"bb":3408896,"bl":12384256,"br":12701696,"bt":3567616,"i":157,"n":"荆州市"},{"bb":2361344,"bl":12116992,"br":12223488,"bt":2487296,"i":295,"n":"北海市"},{"bb":3564544,"bl":13132800,"br":13218816,"bt":3680256,"i":129,"n":"芜湖市"},{"bb":3611648,"bl":12843008,"br":13053952,"bt":3828736,"i":298,"n":"六安市"},{"bb":4331520,"bl":12887040,"br":13092864,"bt":4555776,"i":372,"n":"德州市"},{"bb":4925440,"bl":13230080,"br":13504512,"bt":5190656,"i":280,"n":"朝阳市"},{"bb":2436096,"bl":12043264,"br":12231680,"bt":2578432,"i":145,"n":"钦州市"},{"bb":5171200,"bl":8924160,"br":9491456,"bt":5567488,"i":90,"n":"伊犁哈萨克自治州"},{"bb":2452480,"bl":12194816,"br":12346368,"bt":2631680,"i":361,"n":"玉林市"},{"bb":4702208,"bl":12532736,"br":12753920,"bt":4947968,"i":355,"n":"大同市"},{"bb":4827136,"bl":13565952,"br":13694976,"bt":4976640,"i":281,"n":"营口市"},{"bb":5069824,"bl":12374016,"br":13373440,"bt":5875712,"i":63,"n":"锡林郭勒盟"},{"bb":4783104,"bl":8756224,"br":9765888,"bt":5529600,"i":87,"n":"新疆直辖县级行政单位"},{"bb":5452800,"bl":9412608,"br":9578496,"bt":5784576,"i":95,"n":"克拉玛依市"},{"bb":3209216,"bl":12990464,"br":13078528,"bt":3308544,"i":279,"n":"鹰潭市"},{"bb":2596864,"bl":12870656,"br":12985344,"bt":2709504,"i":259,"n":"揭阳市"},{"bb":2265088,"bl":12204032,"br":12366848,"bt":2487296,"i":198,"n":"湛江市"},{"bb":2573312,"bl":12156928,"br":12320768,"bt":2742272,"i":341,"n":"贵港市"},{"bb":2724864,"bl":12088320,"br":12266496,"bt":2988032,"i":305,"n":"柳州市"},{"bb":2447360,"bl":11863040,"br":12036096,"bt":2659328,"i":144,"n":"崇左市"},{"bb":2597888,"bl":11627520,"br":12011520,"bt":2871296,"i":203,"n":"百色市"},{"bb":3484672,"bl":12746752,"br":12813312,"bt":3562496,"i":122,"n":"鄂州市"},{"bb":4793344,"bl":13734912,"br":13996032,"bt":5008384,"i":282,"n":"丹东市"},{"bb":2766848,"bl":12203008,"br":12412928,"bt":3028992,"i":142,"n":"桂林市"},{"bb":3105792,"bl":13317120,"br":13512704,"bt":3306496,"i":178,"n":"温州市"},{"bb":2772992,"bl":13088768,"br":13255680,"bt":2972672,"i":134,"n":"泉州市"},{"bb":3530752,"bl":12614656,"br":12758016,"bt":3722240,"i":310,"n":"孝感市"},{"bb":3446784,"bl":12735488,"br":12930048,"bt":3690496,"i":271,"n":"黄冈市"},{"bb":3358720,"bl":12639232,"br":12800000,"bt":3521536,"i":362,"n":"咸宁市"},{"bb":4861952,"bl":12282880,"br":12782592,"bt":5342208,"i":168,"n":"乌兰察布市"},{"bb":5130240,"bl":13743104,"br":13928448,"bt":5358592,"i":60,"n":"铁岭市"},{"bb":2634752,"bl":12718080,"br":12869632,"bt":2832384,"i":200,"n":"河源市"},{"bb":4469760,"bl":10817536,"br":11897856,"bt":5253120,"i":230,"n":"阿拉善盟"},{"bb":5087232,"bl":13471744,"br":13690880,"bt":5260288,"i":59,"n":"阜新市"},{"bb":4838400,"bl":13601792,"br":13778944,"bt":5069824,"i":320,"n":"鞍山市"},{"bb":2568192,"bl":12281856,"br":12432384,"bt":2786304,"i":304,"n":"梧州市"},{"bb":2694144,"bl":12309504,"br":12476416,"bt":2877440,"i":260,"n":"贺州市"},{"bb":4862976,"bl":11711488,"br":12235776,"bt":5202944,"i":169,"n":"巴彦淖尔市"},{"bb":2432000,"bl":12388352,"br":12510208,"bt":2577408,"i":199,"n":"阳江市"},{"bb":2781184,"bl":12897280,"br":13109248,"bt":2985984,"i":193,"n":"龙岩市"},{"bb":3016704,"bl":13197312,"br":13443072,"bt":3189760,"i":192,"n":"宁德市"},{"bb":2660352,"bl":12836864,"br":13019136,"bt":2850816,"i":141,"n":"梅州市"},{"bb":2540544,"bl":12362752,"br":12527616,"bt":2655232,"i":258,"n":"云浮市"},{"bb":2648064,"bl":12069888,"br":12297216,"bt":2793472,"i":202,"n":"来宾市"},{"bb":2577408,"bl":11530240,"br":11823104,"bt":2792448,"i":177,"n":"文山壮族苗族自治州"},{"bb":3145728,"bl":12468224,"br":12591104,"bt":3238912,"i":313,"n":"湘潭市"},{"bb":2985984,"bl":12575744,"br":12703744,"bt":3233792,"i":222,"n":"株洲市"},{"bb":2778112,"bl":11471872,"br":11670528,"bt":3111936,"i":249,"n":"曲靖市"},{"bb":3193856,"bl":12154880,"br":12290048,"bt":3436544,"i":274,"n":"湘西土家族苗族自治州"},{"bb":2498560,"bl":11038720,"br":11392000,"bt":2837504,"i":108,"n":"普洱市"},{"bb":3225600,"bl":12325888,"br":12574720,"bt":3422208,"i":272,"n":"益阳市"},{"bb":2750464,"bl":10919936,"br":11139072,"bt":2963456,"i":112,"n":"保山市"},{"bb":2548736,"bl":11332608,"br":11610112,"bt":2830336,"i":107,"n":"红河哈尼族彝族自治州"},{"bb":3098624,"bl":12643328,"br":12722176,"bt":3230720,"i":350,"n":"萍乡市"},{"bb":3368960,"bl":12063744,"br":12317696,"bt":3662848,"i":373,"n":"恩施土家族苗族自治州"},{"bb":3279872,"bl":12300288,"br":12503040,"bt":3499008,"i":219,"n":"常德市"},{"bb":2994176,"bl":12417024,"br":12611584,"bt":3163136,"i":159,"n":"衡阳市"},{"bb":3281920,"bl":12503040,"br":12708864,"bt":3464192,"i":220,"n":"岳阳市"},{"bb":4226048,"bl":9181184,"br":10450944,"bt":5369856,"i":86,"n":"巴音郭楞蒙古自治州"},{"bb":5270528,"bl":9661440,"br":9906176,"bt":5593088,"i":92,"n":"乌鲁木齐市"},{"bb":2816000,"bl":11005952,"br":11249664,"bt":3067904,"i":111,"n":"大理白族自治州"},{"bb":2653184,"bl":11274240,"br":11484160,"bt":2852864,"i":106,"n":"玉溪市"},{"bb":2924544,"bl":10924032,"br":11094016,"bt":3279872,"i":113,"n":"怒江傈僳族自治州"},{"bb":2393088,"bl":11125760,"br":11338752,"bt":2567168,"i":109,"n":"西双版纳傣族自治州"},{"bb":2681856,"bl":11864064,"br":12152832,"bt":2933760,"i":143,"n":"河池市"},{"bb":3475456,"bl":12273664,"br":12478464,"bt":3686400,"i":270,"n":"宜昌市"},{"bb":3172352,"bl":12678144,"br":12931072,"bt":3368960,"i":278,"n":"宜春市"},{"bb":3490816,"bl":12238848,"br":12672000,"bt":3723264,"i":345,"n":"湖北省直辖县级行政单位"},{"bb":2416640,"bl":12281856,"br":12434432,"bt":2580480,"i":139,"n":"茂名市"},{"bb":3775488,"bl":12354560,"br":12670976,"bt":3979264,"i":309,"n":"南阳市"},{"bb":3908608,"bl":12957696,"br":13032448,"bt":4039680,"i":253,"n":"淮北市"},{"bb":3833856,"bl":12995584,"br":13145088,"bt":3939328,"i":126,"n":"蚌埠市"},{"bb":4078592,"bl":12782592,"br":12960768,"bt":4257792,"i":353,"n":"菏泽市"},{"bb":4421632,"bl":12823552,"br":12977152,"bt":4605952,"i":208,"n":"衡水市"},{"bb":3648512,"bl":13177856,"br":13236224,"bt":3713024,"i":358,"n":"马鞍山市"},{"bb":2985984,"bl":11139072,"br":11565056,"bt":3394560,"i":80,"n":"凉山彝族自治州"},{"bb":2990080,"bl":11258880,"br":11383808,"bt":3147776,"i":81,"n":"攀枝花市"},{"bb":3294208,"bl":13273088,"br":13447168,"bt":3442688,"i":333,"n":"金华市"},{"bb":3721216,"bl":13042688,"br":13274112,"bt":3901440,"i":189,"n":"滁州市"},{"bb":4379648,"bl":12663808,"br":12898304,"bt":4527104,"i":266,"n":"邢台市"},{"bb":4056064,"bl":13071360,"br":13271040,"bt":4304896,"i":234,"n":"临沂市"},{"bb":3540992,"bl":11738112,"br":11909120,"bt":3722240,"i":291,"n":"南充市"},{"bb":4184064,"bl":12787712,"br":12926976,"bt":4305920,"i":209,"n":"濮阳市"},{"bb":3793920,"bl":12788736,"br":12985344,"bt":3950592,"i":128,"n":"阜阳市"},{"bb":3945472,"bl":12285952,"br":12472320,"bt":4152320,"i":212,"n":"三门峡市"},{"bb":4166656,"bl":12461056,"br":12650496,"bt":4285440,"i":290,"n":"晋城市"},{"bb":3209216,"bl":11534336,"br":11729920,"bt":3389440,"i":186,"n":"宜宾市"},{"bb":3549184,"bl":11554816,"br":11709440,"bt":3702784,"i":74,"n":"德阳市"},{"bb":3186688,"bl":11705344,"br":11843584,"bt":3397632,"i":331,"n":"泸州市"},{"bb":3908608,"bl":12931072,"br":13158400,"bt":4092928,"i":370,"n":"宿州市"},{"bb":4067328,"bl":13003776,"br":13118464,"bt":4184064,"i":172,"n":"枣庄市"},{"bb":3523584,"bl":11874304,"br":12085248,"bt":3785728,"i":369,"n":"达州市"},{"bb":4504576,"bl":8181760,"br":8781824,"bt":5044224,"i":84,"n":"克孜勒苏柯尔克孜自治州"},{"bb":2762752,"bl":11212800,"br":11409408,"bt":3043328,"i":105,"n":"楚雄彝族自治州"},{"bb":3731456,"bl":13319168,"br":13421568,"bt":3902464,"i":276,"n":"泰州市"},{"bb":3453952,"bl":12887040,"br":13108224,"bt":3646464,"i":130,"n":"安庆市"},{"bb":3440640,"bl":11598848,"br":11773952,"bt":3565568,"i":242,"n":"资阳市"},{"bb":3046400,"bl":11452416,"br":11724800,"bt":3313664,"i":336,"n":"昭通市"},{"bb":3345408,"bl":11583488,"br":11719680,"bt":3436544,"i":78,"n":"自贡市"},{"bb":4832256,"bl":13271040,"br":13481984,"bt":5015552,"i":319,"n":"葫芦岛市"},{"bb":3121152,"bl":11756544,"br":12047360,"bt":3384320,"i":262,"n":"遵义市"},{"bb":2978816,"bl":11063296,"br":11301888,"bt":3220480,"i":114,"n":"丽江市"},{"bb":2916352,"bl":12955648,"br":13211648,"bt":3121152,"i":254,"n":"三明市"},{"bb":2722816,"bl":12563456,"br":12774400,"bt":2922496,"i":137,"n":"韶关市"},{"bb":3003392,"bl":11813888,"br":11943936,"bt":3149824,"i":146,"n":"贵阳市"},{"bb":3790848,"bl":12953600,"br":13049856,"bt":3873792,"i":250,"n":"淮南市"},{"bb":2624512,"bl":10984448,"br":11194368,"bt":2863104,"i":110,"n":"临沧市"},{"bb":3172352,"bl":12678144,"br":12931072,"bt":3368960,"i":278,"n":"宜春市"},{"bb":5569536,"bl":14516224,"br":14912512,"bt":5849088,"i":46,"n":"鸡西市"},{"bb":6006784,"bl":13887488,"br":14420992,"bt":6590464,"i":39,"n":"黑河市"},{"bb":5670912,"bl":13900800,"br":14312448,"bt":6092800,"i":44,"n":"绥化市"},{"bb":5920768,"bl":14435328,"br":14753792,"bt":6134784,"i":43,"n":"鹤岗市"},{"bb":5684224,"bl":14483456,"br":14688256,"bt":5805056,"i":47,"n":"七台河市"},{"bb":5715968,"bl":14545920,"br":14956544,"bt":6005760,"i":45,"n":"双鸭山市"},{"bb":5256192,"bl":13726720,"br":14003200,"bt":5460992,"i":56,"n":"四平市"},{"bb":5038080,"bl":14040064,"br":14285824,"bt":5257216,"i":57,"n":"白山市"},{"bb":5177344,"bl":13897728,"br":14010368,"bt":5319680,"i":183,"n":"辽源市"},{"bb":2900992,"bl":11716608,"br":11865088,"bt":3058688,"i":263,"n":"安顺市"},{"bb":3119104,"bl":11995136,"br":12187648,"bt":3366912,"i":205,"n":"铜仁地区"},{"bb":3484672,"bl":11794432,"br":11947008,"bt":3593216,"i":241,"n":"广安市"},{"bb":3679232,"bl":11645952,"br":11886592,"bt":3864576,"i":329,"n":"广元市"},{"bb":3405824,"bl":11449344,"br":11634688,"bt":3529728,"i":77,"n":"眉山市"},{"bb":3572736,"bl":11549696,"br":11770880,"bt":3878912,"i":240,"n":"绵阳市"},{"bb":3281920,"bl":11456512,"br":11607040,"bt":3474432,"i":79,"n":"乐山市"},{"bb":3378176,"bl":11608064,"br":11739136,"bt":3488768,"i":248,"n":"内江市"},{"bb":3505152,"bl":11695104,"br":11801600,"bt":3633152,"i":330,"n":"遂宁市"},{"bb":3558400,"bl":11191296,"br":11627520,"bt":4047872,"i":185,"n":"阿坝藏族羌族自治州"},{"bb":3170304,"bl":12744704,"br":12848128,"bt":3244032,"i":164,"n":"新余市"},{"bb":4021248,"bl":11517952,"br":11761664,"bt":4282368,"i":136,"n":"定西市"},{"bb":2795520,"bl":12681216,"br":12986368,"bt":3123200,"i":365,"n":"赣州市"},{"bb":4556800,"bl":11290624,"br":11438080,"bt":4696064,"i":34,"n":"金昌市"},{"bb":4700160,"bl":11866112,"br":11932672,"bt":4826112,"i":123,"n":"乌海市"},{"bb":4640768,"bl":11798528,"br":11911168,"bt":4752384,"i":335,"n":"石嘴山市"},{"bb":4282368,"bl":12631040,"br":12857344,"bt":4417536,"i":151,"n":"邯郸市"},{"bb":4199424,"bl":12690432,"br":12776448,"bt":4283392,"i":215,"n":"鹤壁市"},{"bb":3926016,"bl":12631040,"br":12724224,"bt":4003840,"i":344,"n":"漯河市"},{"bb":3041280,"bl":12867584,"br":13059072,"bt":3292160,"i":226,"n":"抚州市"},{"bb":2812928,"bl":12351488,"br":12520448,"bt":3088384,"i":314,"n":"永州市"}],"dver":1253,"fver":1100} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVVersion.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVVersion.cfg new file mode 100644 index 0000000..378890c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/DVVersion.cfg @@ -0,0 +1 @@ +{"std": 10, "c": 522, "stg": 11, "assets": [{"path": "mode_1/bus.sty", "version": 54}, {"path": "mode_1/car.sty", "version": 48}, {"path": "mode_1/cycle.sty", "version": 301}, {"path": "mode_1/map.rs", "version": 36}, {"path": "mode_1/map.sty", "version": 496}, {"path": "mode_1/reduct.rs", "version": 12}, {"path": "mode_1/reduct.sty", "version": 323}, {"path": "mode_1/traffic.rs", "version": 291}, {"path": "mode_1/traffic.sty", "version": 1116}, {"path": "mode_2/map.sty", "version": 35}, {"path": "mode_4/map.rs", "version": 9}, {"path": "mode_4/map.sty", "version": 476}], "stc": 1253, "h": 456, "idrresver": 133, "sc": 20160613, "gd": 79, "didr": 1194, "idrcfgver": 1135, "idrs": 14, "d": 522} \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/bus.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/bus.sty new file mode 100644 index 0000000..19f1d25 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/bus.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/car.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/car.sty new file mode 100644 index 0000000..b9cd121 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/car.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/cycle.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/cycle.sty new file mode 100644 index 0000000..f5b3add Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/cycle.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.rs b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.rs new file mode 100644 index 0000000..210bb2b Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.rs differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.sty new file mode 100644 index 0000000..abd7c57 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/map.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.rs b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.rs new file mode 100644 index 0000000..0810b12 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.rs differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.sty new file mode 100644 index 0000000..6cca3a8 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/reduct.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.rs b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.rs new file mode 100644 index 0000000..cf1e317 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.rs differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.sty new file mode 100644 index 0000000..3550f56 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_1/traffic.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_2/map.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_2/map.sty new file mode 100644 index 0000000..277d931 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_2/map.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.rs b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.rs new file mode 100644 index 0000000..940b9aa Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.rs differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.sty new file mode 100644 index 0000000..12c1f79 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/mode_4/map.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/street.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/street.sty new file mode 100644 index 0000000..d821187 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/a/street.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/DVIndoor.cfg b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/DVIndoor.cfg new file mode 100644 index 0000000..d237b8b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/DVIndoor.cfg @@ -0,0 +1,157 @@ +{"citys":[ +{"bb":2521743,"bl":12636529,"br":12644693,"bt":2529413,"i":140,"n":"广东省-珠海市"}, +{"bb":3527130,"bl":12706616,"br":12743019,"bt":3595932,"i":218,"n":"湖北省-武汉市"}, +{"bb":4275086,"bl":13190039,"br":13294707,"bt":4397364,"i":287,"n":"山东省-潍坊市"}, +{"bb":3304221,"bl":12890531,"br":12910477,"bt":3338311,"i":163,"n":"江西省-南昌市"}, +{"bb":3852302,"bl":13336346,"br":13394828,"bt":3935484,"i":223,"n":"江苏省-盐城市"}, +{"bb":4791047,"bl":11891862,"br":11892309,"bt":4791584,"i":123,"n":"内蒙古自治区-乌海市"}, +{"bb":4948459,"bl":12789601,"br":12790946,"bt":4958900,"i":264,"n":"河北省-张家口市"}, +{"bb":3356523,"bl":12876437,"br":12923113,"bt":3447675,"i":349,"n":"江西省-九江市"}, +{"bb":4618696,"bl":11821341,"br":11832385,"bt":4623402,"i":360,"n":"宁夏回族自治区-银川市"}, +{"bb":3052009,"bl":11323053,"br":11323150,"bt":3052163,"i":81,"n":"四川省-攀枝花市"}, +{"bb":3607062,"bl":11596828,"br":11623998,"bt":3628023,"i":74,"n":"四川省-德阳市"}, +{"bb":3669880,"bl":11658160,"br":11662033,"bt":3672163,"i":240,"n":"四川省-绵阳市"}, +{"bb":3550018,"bl":11537534,"br":11607721,"bt":3610240,"i":75,"n":"四川省-成都市"}, +{"bb":3796716,"bl":11780842,"br":11787354,"bt":3798733,"i":329,"n":"四川省-广元市"}, +{"bb":4337790,"bl":12912536,"br":12912855,"bt":4339636,"i":366,"n":"山东省-聊城市"}, +{"bb":2454949,"bl":12348740,"br":12351009,"bt":2455653,"i":139,"n":"广东省-茂名市"}, +{"bb":5405222,"bl":9754780,"br":9754976,"bt":5405378,"i":92,"n":"新疆维吾尔自治区-乌鲁木齐市"}, +{"bb":2433348,"bl":12147231,"br":12147389,"bt":2433497,"i":295,"n":"广西壮族自治区-北海市"}, +{"bb":2628381,"bl":12200925,"br":12201207,"bt":2628900,"i":341,"n":"广西壮族自治区-贵港市"}, +{"bb":2773447,"bl":12180362,"br":12184034,"bt":2776702,"i":305,"n":"广西壮族自治区-柳州市"}, +{"bb":2786227,"bl":12419017,"br":12419137,"bt":2786391,"i":260,"n":"广西壮族自治区-贺州市"}, +{"bb":2491207,"bl":12092552,"br":12093347,"bt":2493227,"i":145,"n":"广西壮族自治区-钦州市"}, +{"bb":2590032,"bl":12053096,"br":12069583,"bt":2600266,"i":261,"n":"广西壮族自治区-南宁市"}, +{"bb":2887725,"bl":12278483,"br":12281780,"bt":2892368,"i":142,"n":"广西壮族自治区-桂林市"}, +{"bb":4955113,"bl":12431309,"br":12439334,"bt":4960956,"i":321,"n":"内蒙古自治区-呼和浩特市"}, +{"bb":6345148,"bl":13072844,"br":13073236,"bt":6345462,"i":61,"n":"内蒙古自治区-呼伦贝尔市"}, +{"bb":4990069,"bl":12592106,"br":12592285,"bt":4990204,"i":168,"n":"内蒙古自治区-乌兰察布市"}, +{"bb":4947775,"bl":11956262,"br":11958446,"bt":4949579,"i":169,"n":"内蒙古自治区-巴彦淖尔市"}, +{"bb":4778002,"bl":12217855,"br":12246820,"bt":4813085,"i":283,"n":"内蒙古自治区-鄂尔多斯市"}, +{"bb":4923267,"bl":12225069,"br":12249286,"bt":4936424,"i":229,"n":"内蒙古自治区-包头市"}, +{"bb":5170734,"bl":13238319,"br":13238738,"bt":5171113,"i":297,"n":"内蒙古自治区-赤峰市"}, +{"bb":5426862,"bl":12922482,"br":12923575,"bt":5428073,"i":63,"n":"内蒙古自治区-锡林郭勒盟"}, +{"bb":5702412,"bl":14091136,"br":14104570,"bt":5715202,"i":48,"n":"黑龙江省-哈尔滨市"}, +{"bb":5845542,"bl":13926100,"br":13926598,"bt":5845973,"i":50,"n":"黑龙江省-大庆市"}, +{"bb":3207014,"bl":11099787,"br":11099850,"bt":3207075,"i":115,"n":"云南省-迪庆藏族自治州"}, +{"bb":4086393,"bl":13267591,"br":13267744,"bt":4086520,"i":347,"n":"江苏省-连云港市"}, +{"bb":3392072,"bl":13048485,"br":13049434,"bt":3392699,"i":225,"n":"江西省-景德镇市"}, +{"bb":3969832,"bl":12562386,"br":12614645,"bt":4028604,"i":213,"n":"河南省-平顶山市"}, +{"bb":4537682,"bl":12741220,"br":12764689,"bt":4575193,"i":150,"n":"河北省-石家庄市"}, +{"bb":3696668,"bl":13192783,"br":13193337,"bt":3700308,"i":358,"n":"安徽省-马鞍山市"}, +{"bb":4796992,"bl":13266340,"br":13332691,"bt":4839496,"i":148,"n":"河北省-秦皇岛市"}, +{"bb":5112739,"bl":13793419,"br":13793793,"bt":5113165,"i":184,"n":"辽宁省-抚顺市"}, +{"bb":2865049,"bl":13027531,"br":13027848,"bt":2865190,"i":193,"n":"福建省-龙岩市"}, +{"bb":3204806,"bl":12795783,"br":12795916,"bt":3204919,"i":164,"n":"江西省-新余市"}, +{"bb":4691272,"bl":13032908,"br":13104173,"bt":4748502,"i":332,"n":"天津市-天津市"}, +{"bb":5167523,"bl":13774211,"br":13787926,"bt":5177785,"i":60,"n":"辽宁省-铁岭市"}, +{"bb":3488881,"bl":13326393,"br":13408164,"bt":3536951,"i":179,"n":"浙江省-杭州市"}, +{"bb":3716512,"bl":13248134,"br":13340225,"bt":3772481,"i":160,"n":"江苏省-镇江市"}, +{"bb":5414532,"bl":14091186,"br":14091560,"bt":5415314,"i":55,"n":"吉林省-吉林市"}, +{"bb":4734300,"bl":13131761,"br":13188308,"bt":4868439,"i":265,"n":"河北省-唐山市"}, +{"bb":4849552,"bl":12613435,"br":12613574,"bt":4849720,"i":355,"n":"山西省-大同市"}, +{"bb":3565809,"bl":12389026,"br":12398900,"bt":3573668,"i":270,"n":"湖北省-宜昌市"}, +{"bb":3574290,"bl":13480966,"br":13561930,"bt":3691836,"i":289,"n":"上海市-上海市"}, +{"bb":3789734,"bl":13286625,"br":13299061,"bt":3844878,"i":346,"n":"江苏省-扬州市"}, +{"bb":3652849,"bl":13214228,"br":13252441,"bt":3786221,"i":315,"n":"江苏省-南京市"}, +{"bb":3478355,"bl":13593355,"br":13617454,"bt":3484936,"i":245,"n":"浙江省-舟山市"}, +{"bb":4305001,"bl":13100634,"br":13100912,"bt":4309273,"i":124,"n":"山东省-莱芜市"}, +{"bb":3238216,"bl":12569902,"br":12649824,"bt":3260551,"i":158,"n":"湖南省-长沙市"}, +{"bb":3203018,"bl":12587468,"br":12597602,"bt":3209218,"i":222,"n":"湖南省-株洲市"}, +{"bb":5077825,"bl":13731260,"br":13749941,"bt":5121310,"i":58,"n":"辽宁省-沈阳市"}, +{"bb":2960635,"bl":12795397,"br":12795614,"bt":2960797,"i":365,"n":"江西省-赣州市"}, +{"bb":2553554,"bl":12669597,"br":12728039,"bt":2589794,"i":340,"n":"广东省-深圳市"}, +{"bb":3861940,"bl":13065126,"br":13065476,"bt":3862133,"i":126,"n":"安徽省-蚌埠市"}, +{"bb":2622645,"bl":12521060,"br":12550046,"bt":2654414,"i":338,"n":"广东省-肇庆市"}, +{"bb":4299423,"bl":12999677,"br":13042334,"bt":4303466,"i":325,"n":"山东省-泰安市"}, +{"bb":3428296,"bl":13385613,"br":13457111,"bt":3495580,"i":293,"n":"浙江省-绍兴市"}, +{"bb":3177635,"bl":13422861,"br":13449765,"bt":3230896,"i":178,"n":"浙江省-温州市"}, +{"bb":2659275,"bl":12993669,"br":12997463,"bt":2661424,"i":303,"n":"广东省-汕头市"}, +{"bb":2590213,"bl":12730639,"br":12743727,"bt":2630014,"i":301,"n":"广东省-惠州市"}, +{"bb":4344009,"bl":13120612,"br":13170322,"bt":4408571,"i":354,"n":"山东省-淄博市"}, +{"bb":4108973,"bl":12730348,"br":12730821,"bt":4109122,"i":210,"n":"河南省-开封市"}, +{"bb":4407670,"bl":12912609,"br":13049791,"bt":4516609,"i":372,"n":"山东省-德州市"}, +{"bb":2582084,"bl":12644732,"br":12714491,"bt":2628446,"i":119,"n":"广东省-东莞市"}, +{"bb":3526128,"bl":12493446,"br":12493744,"bt":3526471,"i":157,"n":"湖北省-荆州市"}, +{"bb":2705455,"bl":12767850,"br":12768696,"bt":2707511,"i":200,"n":"广东省-河源市"}, +{"bb":4799843,"bl":12911156,"br":13037613,"bt":4906211,"i":131,"n":"北京市-北京市"}, +{"bb":2844916,"bl":11409472,"br":11459615,"bt":2870947,"i":104,"n":"云南省-昆明市"}, +{"bb":3763267,"bl":13341471,"br":13361425,"bt":3863271,"i":276,"n":"江苏省-泰州市"}, +{"bb":3509051,"bl":12809000,"br":12813148,"bt":3514024,"i":311,"n":"湖北省-黄石市"}, +{"bb":4112232,"bl":13054210,"br":13059605,"bt":4113572,"i":172,"n":"山东省-枣庄市"}, +{"bb":4079053,"bl":11769417,"br":11789704,"bt":4083410,"i":196,"n":"甘肃省-天水市"}, +{"bb":4050384,"bl":12102827,"br":12108681,"bt":4064914,"i":323,"n":"陕西省-咸阳市"}, +{"bb":4535789,"bl":12923254,"br":13064395,"bt":4654095,"i":149,"n":"河北省-沧州市"}, +{"bb":5415303,"bl":13937779,"br":13959668,"bt":5427313,"i":53,"n":"吉林省-长春市"}, +{"bb":5003079,"bl":13587899,"br":13593683,"bt":5012719,"i":228,"n":"辽宁省-盘锦市"}, +{"bb":4145139,"bl":13169749,"br":13175035,"bt":4152928,"i":234,"n":"山东省-临沂市"}, +{"bb":4998894,"bl":13484894,"br":13489515,"bt":5002871,"i":166,"n":"辽宁省-锦州市"}, +{"bb":3598889,"bl":13404612,"br":13487529,"bt":3735367,"i":224,"n":"江苏省-苏州市"}, +{"bb":2835999,"bl":13199589,"br":13203748,"bt":2855141,"i":134,"n":"福建省-泉州市"}, +{"bb":2653447,"bl":12931872,"br":12932137,"bt":2653679,"i":259,"n":"广东省-揭阳市"}, +{"bb":3666171,"bl":13300965,"br":13356547,"bt":3722289,"i":348,"n":"江苏省-常州市"}, +{"bb":4473807,"bl":13191176,"br":13211172,"bt":4479691,"i":174,"n":"山东省-东营市"}, +{"bb":3601203,"bl":13173484,"br":13181193,"bt":3656532,"i":129,"n":"安徽省-芜湖市"}, +{"bb":4675535,"bl":13528482,"br":13557968,"bt":4710202,"i":167,"n":"辽宁省-大连市"}, +{"bb":3342019,"bl":13298093,"br":13385859,"bt":3412907,"i":333,"n":"浙江省-金华市"}, +{"bb":2565026,"bl":12577247,"br":12589564,"bt":2586470,"i":302,"n":"广东省-江门市"}, +{"bb":4139749,"bl":12949022,"br":13023028,"bt":4215506,"i":286,"n":"山东省-济宁市"}, +{"bb":3047606,"bl":11877369,"br":11890125,"bt":3052161,"i":146,"n":"贵州省-贵阳市"}, +{"bb":3203783,"bl":12734254,"br":12734589,"bt":3204049,"i":278,"n":"江西省-宜春市"}, +{"bb":2587044,"bl":12565652,"br":12612286,"bt":2639815,"i":138,"n":"广东省-佛山市"}, +{"bb":2400116,"bl":12275244,"br":12292804,"bt":2448849,"i":198,"n":"广东省-湛江市"}, +{"bb":2790632,"bl":13140053,"br":13156436,"bt":2814121,"i":194,"n":"福建省-厦门市"}, +{"bb":4258074,"bl":13353843,"br":13417549,"bt":4394804,"i":236,"n":"山东省-青岛市"}, +{"bb":3539934,"bl":12789264,"br":12805639,"bt":3634786,"i":271,"n":"湖北省-黄冈市"}, +{"bb":4518869,"bl":12525445,"br":12539608,"bt":4537742,"i":176,"n":"山西省-太原市"}, +{"bb":3644700,"bl":13338760,"br":13410637,"bt":3731365,"i":317,"n":"江苏省-无锡市"}, +{"bb":4435721,"bl":13587884,"br":13635133,"bt":4487593,"i":175,"n":"山东省-威海市"}, +{"bb":3259492,"bl":13028660,"br":13028853,"bt":3259727,"i":279,"n":"江西省-鹰潭市"}, +{"bb":3601682,"bl":13115815,"br":13118532,"bt":3604902,"i":337,"n":"安徽省-铜陵市"}, +{"bb":3400579,"bl":12591841,"br":12603364,"bt":3403134,"i":220,"n":"湖南省-岳阳市"}, +{"bb":3757653,"bl":12699641,"br":12773601,"bt":3787585,"i":214,"n":"河南省-信阳市"}, +{"bb":2050684,"bl":12180053,"br":12218401,"bt":2068379,"i":121,"n":"海南省-三亚市"}, +{"bb":4357524,"bl":13012985,"br":13049377,"bt":4393720,"i":288,"n":"山东省-济南市"}, +{"bb":4039348,"bl":13043276,"br":13052901,"bt":4045847,"i":316,"n":"江苏省-徐州市"}, +{"bb":4466450,"bl":13136403,"br":13139105,"bt":4467579,"i":235,"n":"山东省-滨州市"}, +{"bb":3749173,"bl":12483347,"br":12494432,"bt":3754156,"i":156,"n":"湖北省-襄阳市"}, +{"bb":4281756,"bl":11535981,"br":11564035,"bt":4290003,"i":36,"n":"甘肃省-兰州市"}, +{"bb":2478665,"bl":12464890,"br":12465233,"bt":2478788,"i":199,"n":"广东省-阳江市"}, +{"bb":2909266,"bl":13247302,"br":13247675,"bt":2909594,"i":195,"n":"福建省-莆田市"}, +{"bb":3285263,"bl":13126494,"br":13133363,"bt":3286223,"i":364,"n":"江西省-上饶市"}, +{"bb":4051723,"bl":11927734,"br":11954843,"bt":4055540,"i":171,"n":"陕西省-宝鸡市"}, +{"bb":4026329,"bl":12122462,"br":12134828,"bt":4056242,"i":233,"n":"陕西省-西安市"}, +{"bb":4935470,"bl":13607896,"br":13608922,"bt":4936668,"i":281,"n":"辽宁省-营口市"}, +{"bb":4675099,"bl":12854566,"br":12869812,"bt":4680394,"i":307,"n":"河北省-保定市"}, +{"bb":4854894,"bl":13844932,"br":13848679,"bt":4858477,"i":282,"n":"辽宁省-丹东市"}, +{"bb":2790081,"bl":13098085,"br":13115201,"bt":2798347,"i":255,"n":"福建省-漳州市"}, +{"bb":3872851,"bl":12530861,"br":12531072,"bt":3873005,"i":309,"n":"河南省-南阳市"}, +{"bb":4193489,"bl":13299086,"br":13307157,"bt":4197734,"i":173,"n":"山东省-日照市"}, +{"bb":3577158,"bl":13412579,"br":13448829,"bt":3580587,"i":334,"n":"浙江省-嘉兴市"}, +{"bb":4361269,"bl":11327803,"br":11330709,"bt":4363317,"i":66,"n":"青海省-西宁市"}, +{"bb":4084958,"bl":12513944,"br":12519996,"bt":4095327,"i":153,"n":"河南省-洛阳市"}, +{"bb":3716524,"bl":13411213,"br":13543891,"bt":3812000,"i":161,"n":"江苏省-南通市"}, +{"bb":2590954,"bl":12598509,"br":12672841,"bt":2672358,"i":257,"n":"广东省-广州市"}, +{"bb":3061300,"bl":13307685,"br":13308083,"bt":3061571,"i":192,"n":"福建省-宁德市"}, +{"bb":3939594,"bl":13250767,"br":13264890,"bt":3952492,"i":162,"n":"江苏省-淮安市"}, +{"bb":3404095,"bl":11826382,"br":12066229,"bt":3587135,"i":132,"n":"重庆市-重庆市"}, +{"bb":3118760,"bl":12800735,"br":12800923,"bt":3118914,"i":318,"n":"江西省-吉安市"}, +{"bb":3882855,"bl":11915124,"br":11915578,"bt":3883524,"i":352,"n":"陕西省-汉中市"}, +{"bb":4101709,"bl":12646756,"br":12666984,"bt":4111212,"i":268,"n":"河南省-郑州市"}, +{"bb":3392926,"bl":13485188,"br":13567655,"bt":3525038,"i":180,"n":"浙江省-宁波市"}, +{"bb":5001428,"bl":13692398,"br":13692509,"bt":5001585,"i":320,"n":"辽宁省-鞍山市"}, +{"bb":3460579,"bl":12722695,"br":12728898,"bt":3466940,"i":362,"n":"湖北省-咸宁市"}, +{"bb":4769904,"bl":12989988,"br":13005513,"bt":4834853,"i":191,"n":"河北省-廊坊市"}, +{"bb":3707453,"bl":13021544,"br":13077331,"bt":3739673,"i":127,"n":"安徽省-合肥市"}, +{"bb":4328254,"bl":12713178,"br":12749295,"bt":4371287,"i":151,"n":"河北省-邯郸市"}, +{"bb":2945711,"bl":13270470,"br":13291558,"bt":2995111,"i":300,"n":"福建省-福州市"}, +{"bb":2251569,"bl":12281702,"br":12298297,"bt":2263763,"i":125,"n":"海南省-海口市"}, +{"bb":2556005,"bl":12600200,"br":12626685,"bt":2577258,"i":187,"n":"广东省-中山市"}, +{"bb":3966715,"bl":13168130,"br":13212300,"bt":3999787,"i":277,"n":"江苏省-宿迁市"}, +{"bb":3183089,"bl":12674161,"br":12674806,"bt":3184398,"i":350,"n":"江西省-萍乡市"}, +{"bb":4928581,"bl":13438927,"br":13455690,"bt":4949446,"i":319,"n":"辽宁省-葫芦岛市"}, +{"bb":4422186,"bl":12742242,"br":12746942,"bt":4424899,"i":266,"n":"河北省-邢台市"}, +{"bb":4408531,"bl":13352522,"br":13538768,"bt":4527984,"i":326,"n":"山东省-烟台市"}, +{"bb":3245675,"bl":13473870,"br":13519294,"bt":3373843,"i":244,"n":"浙江省-台州市"}, +{"bb":2772752,"bl":12928590,"br":12928829,"bt":2772980,"i":141,"n":"广东省-梅州市"} +],"dver":1135,"fver":1000} diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/ResPackIndoorMap.rs b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/ResPackIndoorMap.rs new file mode 100644 index 0000000..15e53ef Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/ResPackIndoorMap.rs differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/baseindoormap.sty b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/baseindoormap.sty new file mode 100644 index 0000000..a5916a6 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/files/cfg/idrres/baseindoormap.sty differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo.png new file mode 100644 index 0000000..94858b8 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo@2x.png new file mode 100644 index 0000000..26cba9a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/baidumap_logo@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed.png new file mode 100644 index 0000000..a1acd6c Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed@2x.png new file mode 100644 index 0000000..5a1d85d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/bnavi_icon_location_fixed@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel.png new file mode 100644 index 0000000..4a24f95 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel@2x.png new file mode 100644 index 0000000..a7046ea Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/direction_wheel@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left.png new file mode 100644 index 0000000..b716dff Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left@2x.png new file mode 100644 index 0000000..8c906f9 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted.png new file mode 100644 index 0000000..eda5faf Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted@2x.png new file mode 100644 index 0000000..57e092e Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_left_highlighted@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right.png new file mode 100644 index 0000000..360d2aa Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right@2x.png new file mode 100644 index 0000000..0a65e7d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted.png new file mode 100644 index 0000000..053b474 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted@2x.png new file mode 100644 index 0000000..47eb881 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_action_paopao_middle_right_highlighted@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone.png new file mode 100644 index 0000000..d17a4d0 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2.png new file mode 100644 index 0000000..60bb66d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2@2x.png new file mode 100644 index 0000000..9421d2f Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone2@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone@2x.png new file mode 100644 index 0000000..dfdd588 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_cellphone@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point.png new file mode 100644 index 0000000..6fdcf66 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point@2x.png new file mode 100644 index 0000000..67e631a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_center_point@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass.png new file mode 100644 index 0000000..196ff22 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass@2x.png new file mode 100644 index 0000000..cbd9d49 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background.png new file mode 100644 index 0000000..7676a11 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background@2x.png new file mode 100644 index 0000000..93c171a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_compass_background@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction.png new file mode 100644 index 0000000..8dc5319 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction@2x.png new file mode 100644 index 0000000..acbb02d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_direction@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_line_nofocus.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_line_nofocus.png new file mode 100644 index 0000000..910f495 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_line_nofocus.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus.png new file mode 100644 index 0000000..faba2fb Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus@2x.png new file mode 100644 index 0000000..7294c56 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_bus@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end.png new file mode 100644 index 0000000..6da923a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end@2x.png new file mode 100644 index 0000000..6ecd890 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_end@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail.png new file mode 100644 index 0000000..71f441e Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail@2x.png new file mode 100644 index 0000000..a19c875 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_rail@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start.png new file mode 100644 index 0000000..3c7c1ae Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start@2x.png new file mode 100644 index 0000000..2ca97b5 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_start@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint.png new file mode 100644 index 0000000..7f61cd0 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint@2x.png new file mode 100644 index 0000000..f7fc472 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_nav_waypoint@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left.png new file mode 100644 index 0000000..a1bdd28 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left@2x.png new file mode 100644 index 0000000..e491f8d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted.png new file mode 100644 index 0000000..b61b647 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted@2x.png new file mode 100644 index 0000000..db276e2 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_left_highlighted@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right.png new file mode 100644 index 0000000..fbf8979 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right@2x.png new file mode 100644 index 0000000..7bacc2e Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted.png new file mode 100644 index 0000000..a3d9d9a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted@2x.png new file mode 100644 index 0000000..4133666 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/icon_paopao_middle_right_highlighted@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/lineDashTexture.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/lineDashTexture.png new file mode 100644 index 0000000..ec2166a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/lineDashTexture.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/line_texture.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/line_texture.png new file mode 100755 index 0000000..e43156a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/line_texture.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green.png new file mode 100644 index 0000000..48e8d83 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green@2x.png new file mode 100644 index 0000000..9ca313a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_green@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple.png new file mode 100644 index 0000000..9145ccd Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple@2x.png new file mode 100644 index 0000000..6657c6f Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_purple@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red.png new file mode 100644 index 0000000..0584407 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red@2x.png b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red@2x.png new file mode 100644 index 0000000..caeb353 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle/images/pin_red@2x.png differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/readme.txt new file mode 100644 index 0000000..efbe35b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/readme.txt @@ -0,0 +1,52 @@ +基础地图:包括基本矢量地图、卫星图、实时路况图和各种地图覆盖物,此外还包括各种与地图相关的操作和事件监听; + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/BaiduMapAPI_Radar b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/BaiduMapAPI_Radar new file mode 100644 index 0000000..e5273cd Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/BaiduMapAPI_Radar differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarComponent.h new file mode 100644 index 0000000..0687b6c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarComponent.h @@ -0,0 +1,17 @@ +// +// BMKRadarComponent.h +// RadarComponent +// +// Created by wzy on 15/4/21. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef RadarComponent_BMKRadarComponent_h +#define RadarComponent_BMKRadarComponent_h + +#import "BMKRadarManager.h" +#import "BMKRadarOption.h" +#import "BMKRadarResult.h" +#import "BMKRadarVersion.h" + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarManager.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarManager.h new file mode 100644 index 0000000..72848ea --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarManager.h @@ -0,0 +1,108 @@ +// +// BMKRadarManager.h +// RadarComponent +// +// Created by wzy on 15/4/22. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef RadarComponent_BMKRadarManager_h +#define RadarComponent_BMKRadarManager_h + +#import "BMKRadarOption.h" +#import "BMKRadarResult.h" + +///雷达delegate +@protocol BMKRadarManagerDelegate + +@optional +/* + *开启自动上传,需实现该回调 + */ +- (BMKRadarUploadInfo*)getRadarAutoUploadInfo; + +/** + *返回雷达 上传结果 + *@param error 错误号,@see BMKRadarErrorCode + */ +- (void)onGetRadarUploadResult:(BMKRadarErrorCode) error; + +/** + *返回雷达 清除我的信息结果 + *@param error 错误号,@see BMKRadarErrorCode + */ +- (void)onGetRadarClearMyInfoResult:(BMKRadarErrorCode) error; + +/** + *返回雷达 查询周边的用户信息结果 + *@param result 结果,类型为@see BMKRadarNearbyResult + *@param error 错误号,@see BMKRadarErrorCode + */ +- (void)onGetRadarNearbySearchResult:(BMKRadarNearbyResult*) result error:(BMKRadarErrorCode) error; + +@end + + +///周边雷达管理类 +@interface BMKRadarManager : NSObject + +/// 上传时用,上传前需设置,不设置自动生成userId;切换用户时,需手动清除原先用户的位置信息 +@property (nonatomic, strong) NSString* userId; + +/** + *获取周边雷达实例,使用引用计数管理该实例内存 + */ ++ (BMKRadarManager*)getRadarManagerInstance; +/** + *release周边雷达实例,使用引用计数管理该实例内存 + */ ++ (void)releaseRadarManagerInstance; + +/** + *添加周边雷达delegate,用于结果回调 + *不需要时,需要使用removeRadarManagerDelegate:移除,否则影响内存释放 + *@param delegate, 添加的id对象 + */ +- (void)addRadarManagerDelegate:(id) delegate; + +/** + *移除周边雷达delegate,取消结果回调 + *@param delegate, 需要移除的id对象 + */ +- (void)removeRadarManagerDelegate:(id) delegate; + +/** + *启动自动上传用户位置信息 + *必须实现回调方法@see getRadarAutoUploadInfo,获取@see BMKRadarUploadInfo + *@param interval 时间间隔,不小于5s(小于强制设为5s) + */ +- (void)startAutoUpload:(NSTimeInterval) interval; + +/** + *停止自动上传用户位置信息 + */ +- (void)stopAutoUpload; + +/** + *单次上传用户位置信息 + *上传时间间隔不小于5s,否则return NO + *返回结果回调:@see onGetRadarUploadResult: + *@param info 位置信息 + */ +- (BOOL)uploadInfoRequest:(BMKRadarUploadInfo*) info; + +/** + *清除我的位置信息 + *返回结果回调:@see onGetRadarClearMyInfoResult: + */ +- (BOOL)clearMyInfoRequest; + +/** + *查询周边的用户信息 + *返回结果回调:@see onGetRadarNearbySearchResult:error: + *@param option 查询参数: 类型为@see BMKRadarNearbySearchOption + */ +- (BOOL)getRadarNearbySearchRequest:(BMKRadarNearbySearchOption*) option; + +@end +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarOption.h new file mode 100644 index 0000000..b5ad8c5 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarOption.h @@ -0,0 +1,61 @@ +// +// BMKRadarOption.h +// RadarComponent +// +// Created by wzy on 15/4/22. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef RadarComponent_BMKRadarOption_h +#define RadarComponent_BMKRadarOption_h + +#import + +///用户信息类 +@interface BMKRadarUploadInfo : NSObject + +///地址坐标,百度经纬度坐标 (必须) +@property (nonatomic, assign) CLLocationCoordinate2D pt; + +///扩展信息,和该用户相关的信息(可选) +@property (nonatomic, strong) NSString* extInfo; + +@end + +typedef enum{ + BMK_RADAR_SORT_TYPE_DISTANCE_FROM_NEAR_TO_FAR = 0,//距离由近及远排序 + BMK_RADAR_SORT_TYPE_DISTANCE_FROM_FAR_TO_NEAR,//距离由远及近排序 + BMK_RADAR_SORT_TYPE_TIME_FROM_PAST_TO_RECENT,//时间由过去到现在排序 + BMK_RADAR_SORT_TYPE_TIME_FROM_RECENT_TO_PAST,//时间由现在到过去排序 +}BMKRadarSortType; + +///时间区间 +@interface BMKDateRange : NSObject + +///起始时间 +@property (nonatomic, strong) NSDate* startDate; +///终止时间 +@property (nonatomic, strong) NSDate* endDate; + +@end + +///查询周边的用户信息参数类 +@interface BMKRadarNearbySearchOption : NSObject + +///地址坐标,百度经纬度坐标 (不设置,默认使用最后一次上传的坐标) +@property (nonatomic, assign) CLLocationCoordinate2D centerPt; +///检索半径,单位米,默认1000 +@property (nonatomic, assign) NSUInteger radius; +///分页索引,可选,默认为0 +@property (nonatomic, assign) NSInteger pageIndex; +///页容量,可选,默认为50 +@property (nonatomic, assign) NSInteger pageCapacity; +///排序类型:默认按距离由近及远排序,BMK_RADAR_SORT_TYPE_DISTANCE_FROM_NEAR_TO_FAR +@property (nonatomic, assign) BMKRadarSortType sortType; +///时间区间,可选,获取该时间区间内的用户信息 +@property (nonatomic, strong) BMKDateRange* dateRange; + + +@end + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarResult.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarResult.h new file mode 100644 index 0000000..99456c2 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarResult.h @@ -0,0 +1,67 @@ +// +// BMKRadarResult.h +// RadarComponent +// +// Created by wzy on 15/4/22. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef RadarComponent_BMKRadarResult_h +#define RadarComponent_BMKRadarResult_h + +#import "BMKRadarOption.h" + +///雷达结果码 +typedef enum { + BMK_RADAR_NO_ERROR = 0,///<成功 + BMK_RADAR_NO_RESULT,///<无结果 + BMK_RADAR_AK_NOT_BIND,/// + +/** + *重要: + *radar组件的版本和base组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API radar组件 的版本号 + *当前radar组件版本 : 3.3.2 + *return 返回当前API radar组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiRadarComponentVersion(); + +/** + *检查radar组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckRadarComponentIsLegal(); + +#endif /* BMKRadarVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/readme.txt new file mode 100644 index 0000000..9b2b78c --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/readme.txt @@ -0,0 +1,52 @@ +周边雷达:包含位置信息上传和检索周边相同应用的用户位置信息功能; + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/BaiduMapAPI_Search b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/BaiduMapAPI_Search new file mode 100644 index 0000000..d5982a7 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/BaiduMapAPI_Search differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearch.h new file mode 100644 index 0000000..f72ed89 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearch.h @@ -0,0 +1,48 @@ +/* + * BMKBusLineSearch.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKPoiSearchType.h" +#import +#import "BMKBusLineSearchOption.h" +#import "BMKRouteSearchType.h" +#import "BMKSearchBase.h" + +@protocol BMKBusLineSearchDelegate; +///busline搜索服务 +@interface BMKBusLineSearch : BMKSearchBase +/// 检索模块的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/** + *公交详情检索 + *异步函数,返回结果在BMKBusLineSearchDelegate的onGetBusDetailResult通知 + *@param busLineSearchOption 公交线路检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)busLineSearch:(BMKBusLineSearchOption*)busLineSearchOption; + + +@end + +///搜索delegate,用于获取搜索结果 +@protocol BMKBusLineSearchDelegate +@optional +/** + *返回busdetail搜索结果 + *@param searcher 搜索对象 + *@param busLineResult 搜索结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetBusDetailResult:(BMKBusLineSearch*)searcher result:(BMKBusLineResult*)busLineResult errorCode:(BMKSearchErrorCode)error; + +@end + + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearchOption.h new file mode 100644 index 0000000..55f0f9b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearchOption.h @@ -0,0 +1,22 @@ +/* + * BMKBusLineSearchOption.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import +/// 公交线路检索信息类 +@interface BMKBusLineSearchOption : NSObject +{ + NSString *_city; + NSString *_busLineUid; +} +///城市名 +@property (nonatomic, strong) NSString *city; +///公交线路的uid +@property (nonatomic, strong) NSString *busLineUid; + +@end + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKDistrictSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKDistrictSearch.h new file mode 100644 index 0000000..4bdc4e9 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKDistrictSearch.h @@ -0,0 +1,74 @@ +// +// BMKDistrictSearch.h +// SearchComponent +// +// Created by wzy on 15/12/14. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKDistrictSearch_h +#define BMKDistrictSearch_h +#import +#import "BMKSearchBase.h" + +/// 行政区域检索信息 +@interface BMKDistrictSearchOption : NSObject + +/// 城市名字(必须) +@property (nonatomic, strong) NSString *city; +/// 区县名字(可选) +@property (nonatomic, strong) NSString *district; + +@end + +#pragma mark - + +/// 行政区域检索结果 +@interface BMKDistrictResult : NSObject + +/// 行政区域编码 +@property (nonatomic, assign) NSInteger code; +/// 行政区域名称 +@property (nonatomic, strong) NSString *name; +/// 行政区域中心点 +@property (nonatomic, assign) CLLocationCoordinate2D center; +/// 行政区边界直角地理坐标点数据(NSString数组,字符串数据格式为: @"x,y;x,y") +@property (nonatomic, strong) NSArray *paths; + +@end + +#pragma mark - + +@protocol BMKDistrictSearchDelegate; + +/// 行政区域搜索服务 +@interface BMKDistrictSearch : BMKSearchBase +/// 检索模块的delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/** + *行政区域检索 + *异步函数,返回结果在BMKDistrictSearchDelegate的onGetDistrictResult通知 + *@param DistrictSearchOption 公交线路检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)districtSearch:(BMKDistrictSearchOption*)districtSearchOption; + +@end + +#pragma mark - + +///搜索delegate,用于获取行政区域搜索结果 +@protocol BMKDistrictSearchDelegate +@optional +/** + *返回行政区域搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结BMKDistrictSearch果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetDistrictResult:(BMKDistrictSearch *)searcher result:(BMKDistrictResult *)result errorCode:(BMKSearchErrorCode)error; + +@end + +#endif /* BMKDistrictSearch_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearch.h new file mode 100644 index 0000000..1197fdf --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearch.h @@ -0,0 +1,60 @@ +/* + * BMKGeocodeSearch.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import "BMKGeocodeSearchOption.h" +#import "BMKGeocodeType.h" +#import "BMKSearchBase.h" + +@protocol BMKGeoCodeSearchDelegate; +///geo搜索服务 +@interface BMKGeoCodeSearch : BMKSearchBase +/// 检索模块的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/** + *根据地址名称获取地理信息 + *异步函数,返回结果在BMKGeoCodeSearchDelegate的onGetAddrResult通知 + *@param geoCodeOption geo检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)geoCode:(BMKGeoCodeSearchOption*)geoCodeOption; +/** + *根据地理坐标获取地址信息 + *异步函数,返回结果在BMKGeoCodeSearchDelegate的onGetAddrResult通知 + *@param reverseGeoCodeOption 反geo检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)reverseGeoCode:(BMKReverseGeoCodeOption*)reverseGeoCodeOption; + + +@end + +///搜索delegate,用于获取搜索结果 +@protocol BMKGeoCodeSearchDelegate +@optional +/** + *返回地址信息搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结BMKGeoCodeSearch果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回反地理编码搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error; + +@end + + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearchOption.h new file mode 100644 index 0000000..233ca17 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearchOption.h @@ -0,0 +1,31 @@ +/* + * BMKGeoCodeSearchOption.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ + +#import +/// geo检索信息类 +@interface BMKGeoCodeSearchOption : NSObject +{ + NSString *_address; + NSString *_city; +} +///地址 +@property (nonatomic, strong) NSString *address; +///城市名 +@property (nonatomic, strong) NSString *city; +@end + +///反geo检索信息类 +@interface BMKReverseGeoCodeOption : NSObject { + CLLocationCoordinate2D _reverseGeoPoint; +} +///经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D reverseGeoPoint; +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeType.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeType.h new file mode 100644 index 0000000..6c313c4 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeType.h @@ -0,0 +1,50 @@ +/* + * BMKGeocodeType.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import + +///反地址编码结果 +@interface BMKReverseGeoCodeResult : NSObject +{ + BMKAddressComponent* _addressDetail; + NSString* _address; + CLLocationCoordinate2D _location; + NSArray* _poiList; +} +///层次化地址信息 +@property (nonatomic, strong) BMKAddressComponent* addressDetail; +///地址名称 +@property (nonatomic, strong) NSString* address; +///商圈名称 +@property (nonatomic, strong) NSString* businessCircle; +///结合当前位置POI的语义化结果描述 +@property (nonatomic, strong) NSString* sematicDescription; +///城市编码 +@property (nonatomic, strong) NSString* cityCode; +///地址坐标 +@property (nonatomic) CLLocationCoordinate2D location; +///地址周边POI信息,成员类型为BMKPoiInfo +@property (nonatomic, strong) NSArray* poiList; + +@end + +///地址编码结果 +@interface BMKGeoCodeResult : NSObject +{ + CLLocationCoordinate2D _location; + NSString* _address; +} +///地理编码位置 +@property (nonatomic) CLLocationCoordinate2D location; +///地理编码地址 +@property (nonatomic,strong) NSString* address; + +@end + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearch.h new file mode 100644 index 0000000..210cbb1 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearch.h @@ -0,0 +1,86 @@ +/* + * BMKPoiSearch.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKPoiSearchType.h" +#import "BMKPoiSearchOption.h" +#import "BMKSearchBase.h" + +@protocol BMKPoiSearchDelegate; +///搜索服务 +@interface BMKPoiSearch : BMKSearchBase +/// 检索模块的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + + +/** + *城市POI检索 + *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiResult通知 + *@param option 城市内搜索的搜索参数类(BMKCitySearchOption) + *@return 成功返回YES,否则返回NO + */ +- (BOOL)poiSearchInCity:(BMKCitySearchOption*)option; + +/** + *根据范围和检索词发起范围检索 + *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiResult通知 + *@param option 范围搜索的搜索参数类(BMKBoundSearchOption) + *@return 成功返回YES,否则返回NO + */ +- (BOOL)poiSearchInbounds:(BMKBoundSearchOption*)option; +/** + *根据中心点、半径和检索词发起周边检索 + *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiResult通知 + *@param option 周边搜索的搜索参数类(BMKNearbySearchOption) + *@param index 页码,如果是第一次发起搜索,填0,根据返回的结果可以去获取第n页的结果,页码从0开始 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)poiSearchNearBy:(BMKNearbySearchOption*)option; +/** + *根据poi uid 发起poi详情检索 + *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiDetailResult通知 + *@param option poi详情检索参数类(BMKPoiDetailSearchOption) + *@return 成功返回YES,否则返回NO + */ +- (BOOL)poiDetailSearch:(BMKPoiDetailSearchOption*)option; +/** + *poi室内检索 + *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiIndoorResult通知 + *@param option poi室内检索参数类(BMKPoiIndoorSearchOption) + *@return 成功返回YES,否则返回NO + */ +- (BOOL)poiIndoorSearch:(BMKPoiIndoorSearchOption*)option; +@end + +///搜索delegate,用于获取搜索结果 +@protocol BMKPoiSearchDelegate +@optional +/** + *返回POI搜索结果 + *@param searcher 搜索对象 + *@param poiResult 搜索结果列表 + *@param errorCode 错误号,@see BMKSearchErrorCode + */ +- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode; + +/** + *返回POI详情搜索结果 + *@param searcher 搜索对象 + *@param poiDetailResult 详情搜索结果 + *@param errorCode 错误号,@see BMKSearchErrorCode + */ +- (void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode; + +/** + *返回POI室内搜索结果 + *@param searcher 搜索对象 + *@param poiIndoorResult 搜索结果列表 + *@param errorCode 错误号,@see BMKSearchErrorCode + */ +- (void)onGetPoiIndoorResult:(BMKPoiSearch*)searcher result:(BMKPoiIndoorResult*)poiIndoorResult errorCode:(BMKSearchErrorCode)errorCode; +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchOption.h new file mode 100644 index 0000000..dff4a78 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchOption.h @@ -0,0 +1,84 @@ +/* + * BMKPoiSearchOption.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ +#import +#import + +typedef enum{ + BMK_POI_SORT_BY_COMPOSITE = 0,//综合排序 + BMK_POI_SORT_BY_DISTANCE,//距离由近到远排序 +}BMKPoiSortType; + +/// 检索基础信息类,所有类型Poi检索的基类 +@interface BMKBasePoiSearchOption : NSObject +{ + NSString *_keyword; + int _pageIndex; + int _pageCapacity; +} +///搜索关键字 +@property (nonatomic, strong) NSString *keyword; +///分页索引,可选,默认为0 +@property (nonatomic, assign) int pageIndex; +///分页数量,可选,默认为10,最多为50 +@property (nonatomic, assign) int pageCapacity; + +@end + +///本地云检索参数信息类 +@interface BMKCitySearchOption : BMKBasePoiSearchOption { + NSString *_city; +} +///区域名称(市或区的名字,如北京市,海淀区),必选, 必须最长25个字符 +@property (nonatomic, strong) NSString *city; +///是否请求门址信息列表,默认为YES +@property (nonatomic, assign) BOOL requestPoiAddressInfoList; +@end + +///周边云检索参数信息类 +@interface BMKNearbySearchOption : BMKBasePoiSearchOption { + CLLocationCoordinate2D _location; + int _radius; +} +///检索的中心点,经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D location; +///周边检索半径 +@property (nonatomic, assign) int radius; +//搜索结果排序规则,可选,默认BMK_POI_SORT_BY_COMPOSITE +@property (nonatomic, assign) BMKPoiSortType sortType; + +@end + +///矩形云检索参数信息类 +@interface BMKBoundSearchOption : BMKBasePoiSearchOption { + CLLocationCoordinate2D _leftBottom; + CLLocationCoordinate2D _rightTop; + +} +///矩形区域,左下角和右上角的经纬度坐标点。 +@property (nonatomic, assign) CLLocationCoordinate2D leftBottom; +@property (nonatomic, assign) CLLocationCoordinate2D rightTop; +@end + +///室内POI检索参数信息类 +@interface BMKPoiIndoorSearchOption : BMKBasePoiSearchOption +/// 室内ID(必须) +@property (nonatomic, strong) NSString *indoorId; +/// 楼层(可选),设置后,会优先获取该楼层的室内POI,然后是其它楼层的 +@property (nonatomic, strong) NSString *floor; +@end + +///poi详情检索信息类 +@interface BMKPoiDetailSearchOption : NSObject { + NSString* _poiUid; +} +///poi的uid,从poi检索返回的BMKPoiResult结构中获取 +@property (nonatomic, strong) NSString* poiUid; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchType.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchType.h new file mode 100644 index 0000000..24a7dce --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchType.h @@ -0,0 +1,239 @@ +/* + * BMKPoiSearchType.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import +enum { + BMKInvalidCoordinate = -1, ///<无效坐标 + BMKCarTrafficFIRST = 60, ///<驾乘检索策略常量:躲避拥堵,若无实时路况,默认按照时间优先策略 + BMKCarTimeFirst = 0, ///<驾乘检索策略常量:时间优先 + BMKCarDisFirst, ///<驾乘检索策略常量:最短距离 + BMKCarFeeFirst, ///<驾乘检索策略常量:较少费用 + BMKBusTimeFirst, ///<公交检索策略常量:时间优先 + BMKBusTransferFirst, ///<公交检索策略常量:最少换乘 + BMKBusWalkFirst, ///<公交检索策略常量:最小步行距离 + BMKBusNoSubway, ///<公交检索策略常量:不含地铁 + BMKTypeCityList = 7, /// delegate; + +/** + *公交路线检索(仅支持市内) + *异步函数,返回结果在BMKRouteSearchDelegate的onGetTransitRouteResult通知 + *@param transitRoutePlanOption 公交换乘信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)transitSearch:(BMKTransitRoutePlanOption*)transitRoutePlanOption; + +/** + *公共交通路线检索(new)(支持市内和跨城) + *异步函数,返回结果在BMKRouteSearchDelegate的onGetMassTransitRouteResult通知 + *注:起终点城市不支持使用cityId + *@param routePlanOption 公共交通检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)massTransitSearch:(BMKMassTransitRoutePlanOption*)routePlanOption; + +/** + *驾乘路线检索 + *异步函数,返回结果在BMKRouteSearchDelegate的onGetDrivingRouteResult通知 + *@param drivingRoutePlanOption 驾车检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)drivingSearch:(BMKDrivingRoutePlanOption*)drivingRoutePlanOption; + +/** + *步行路线检索 + *异步函数,返回结果在BMKRouteSearchDelegate的onGetWalkingRouteResult通知 + *@param walkingRoutePlanOption 步行检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)walkingSearch:(BMKWalkingRoutePlanOption*)walkingRoutePlanOption; + +/** + *骑行路线检索 + *异步函数,返回结果在BMKRouteSearchDelegate的onGetRidingRouteResult通知 + *@param ridingRoutePlanOption 骑行检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)ridingSearch:(BMKRidingRoutePlanOption*) ridingRoutePlanOption; + +/** + *室内路线检索 + *异步函数,返回结果在BMKRouteSearchDelegate的onGetIndoorRouteResult通知 + *@param indoorRoutePlanOption 室内路线检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)indoorRoutePlanSearch:(BMKIndoorRoutePlanOption*) indoorRoutePlanOption; + +@end + +///路线搜索delegate,用于获取路线搜索结果 +@protocol BMKRouteSearchDelegate +@optional +/** + *返回公交搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKTransitRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回公共交通路线检索结果(new) + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKMassTransitRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetMassTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKMassTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回驾乘搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKDrivingRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetDrivingRouteResult:(BMKRouteSearch*)searcher result:(BMKDrivingRouteResult*)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回步行搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKWalkingRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetWalkingRouteResult:(BMKRouteSearch*)searcher result:(BMKWalkingRouteResult*)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回骑行搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKRidingRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetRidingRouteResult:(BMKRouteSearch*)searcher result:(BMKRidingRouteResult*)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回室内路线搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果,类型为BMKIndoorRouteResult + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetIndoorRouteResult:(BMKRouteSearch*)searcher result:(BMKIndoorRouteResult*)result errorCode:(BMKSearchErrorCode)error; +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchOption.h new file mode 100644 index 0000000..6de08f8 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchOption.h @@ -0,0 +1,84 @@ +/* + * BMKPoiSearchOption.h + * BMapKit + * + * Copyright 2013 Baidu Inc. All rights reserved. + * + */ + +#import +#import "BMKRouteSearchType.h" +/// 路线查询基础信息类 +@interface BMKBaseRoutePlanOption : NSObject +{ + BMKPlanNode *_from; + BMKPlanNode *_to; +} +///检索的起点,可通过关键字、坐标两种方式指定。cityName和cityID同时指定时,优先使用cityID +@property (nonatomic, strong) BMKPlanNode *from; +///检索的终点,可通过关键字、坐标两种方式指定。cityName和cityID同时指定时,优先使用cityID +@property (nonatomic, strong) BMKPlanNode *to; +@end +/// 步行查询基础信息类 +@interface BMKWalkingRoutePlanOption : BMKBaseRoutePlanOption +{ + +} +@end +/// 驾车查询基础信息类 +@interface BMKDrivingRoutePlanOption : BMKBaseRoutePlanOption +{ + NSArray* _wayPointsArray; + BMKDrivingPolicy _drivingPolicy; +} +@property (nonatomic, strong) NSArray *wayPointsArray; +///驾车检索策略,默认使用BMK_DRIVING_TIME_FIRST +@property (nonatomic) BMKDrivingPolicy drivingPolicy; + +///驾车检索获取路线每一个step的路况,默认使用BMK_DRIVING_REQUEST_TRAFFICE_TYPE_NONE +@property (nonatomic) BMKDrivingRequestTrafficType drivingRequestTrafficType; + + +@end +/// 公交查询基础信息类 +@interface BMKTransitRoutePlanOption : BMKBaseRoutePlanOption +{ + NSString* _city; + BMKTransitPolicy _transitPolicy; +} +///城市名,用于在哪个城市内进行检索 +@property (nonatomic, strong) NSString *city; +///公交检索策略,默认使用BMK_TRANSIT_TIME_FIRST +@property (nonatomic) BMKTransitPolicy transitPolicy; + +@end + +/// 公共交通路线查询基础信息类(支持市内和跨城)(注:起终点城市不支持cityId) +@interface BMKMassTransitRoutePlanOption : BMKBaseRoutePlanOption + +///分页索引,可选,默认为0(从0开始) +@property (nonatomic, assign) NSUInteger pageIndex; +///分页数量,可选,默认为10,取值范围[1,10] +@property (nonatomic, assign) NSUInteger pageCapacity; +///市内公交换乘策略策略,可选,默认使用BMK_MASS_TRANSIT_INCITY_RECOMMEND +@property (nonatomic, assign) BMKMassTransitIncityPolicy incityPolicy; +///跨城公交换乘策略,可选,默认使用BMK_MASS_TRANSIT_INTERCITY_TIME_FIRST +@property (nonatomic, assign) BMKMassTransitIntercityPolicy intercityPolicy; +///跨城交通方式策略,可选,默认使用BMK_MASS_TRANSIT_INTERCITY_TRANS_TRAIN_FIRST +@property (nonatomic, assign) BMKMassTransitIntercityTransPolicy intercityTransPolicy; + +@end + +/// 骑行查询基础信息类 +@interface BMKRidingRoutePlanOption : BMKBaseRoutePlanOption + +@end + +/// 室内路线规划查询基础信息类 +@interface BMKIndoorRoutePlanOption : NSObject +///检索的起点 +@property (nonatomic, strong) BMKIndoorPlanNode *from; +///检索的终点 +@property (nonatomic, strong) BMKIndoorPlanNode *to; + +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchType.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchType.h new file mode 100644 index 0000000..e055471 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchType.h @@ -0,0 +1,598 @@ +/* + * BMKRouteSearchType.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import +#import "BMKPoiSearchType.h" +#import +///路段类型枚举 +typedef enum +{ + BMK_BUSLINE = 0,///公交 + BMK_SUBWAY = 1,///地铁 + BMK_WAKLING = 2,///步行 +}BMKTransitStepType; + +///交通方式枚举 +typedef enum +{ + BMK_TRANSIT_SUBWAY = 0,///地铁 + BMK_TRANSIT_TRAIN = 1,///火车 + BMK_TRANSIT_PLANE = 2,///飞机 + BMK_TRANSIT_BUSLINE = 3,///公交 + BMK_TRANSIT_DRIVING = 4,///驾车 + BMK_TRANSIT_WAKLING = 5,///步行 + BMK_TRANSIT_COACH = 6,///大巴 +}BMKMassTransitType; + + +///室内路线结点类型 +typedef enum +{ + BMK_INDOOR_STEP_NODE_TYPE_ELEVATOR = 1,///直梯 + BMK_INDOOR_STEP_NODE_TYPE_ESCALATOR = 2,///扶梯 + BMK_INDOOR_STEP_NODE_TYPE_STAIR = 3,///楼梯 + BMK_INDOOR_STEP_NODE_TYPE_SECURITY_CHECK = 4,///安检 +}BMKIndoorStepNodeType; + +typedef enum +{ + BMK_TRANSIT_TIME_FIRST = 3, //较快捷(公交) + BMK_TRANSIT_TRANSFER_FIRST = 4, //少换乘(公交) + BMK_TRANSIT_WALK_FIRST = 5, //少步行(公交) + BMK_TRANSIT_NO_SUBWAY = 6, //不坐地铁 +}BMKTransitPolicy; + +/// 公共交通:市内公交换乘策略 +typedef enum +{ + BMK_MASS_TRANSIT_INCITY_RECOMMEND = 0,//推荐 + BMK_MASS_TRANSIT_INCITY_TRANSFER_FIRST = 1,//少换乘 + BMK_MASS_TRANSIT_INCITY_WALK_FIRST = 2,//少步行 + BMK_MASS_TRANSIT_INCITY_NO_SUBWAY = 3,//不坐地铁 + BMK_MASS_TRANSIT_INCITY_TIME_FIRST = 4,//较快捷 + BMK_MASS_TRANSIT_INCITY_SUBWAY_FIRST = 5,//地铁优先 +}BMKMassTransitIncityPolicy; + +/// 公共交通:跨城公交换乘策略 +typedef enum +{ + BMK_MASS_TRANSIT_INTERCITY_TIME_FIRST = 0,//较快捷 + BMK_MASS_TRANSIT_INTERCITY_START_EARLY = 1,//出发早 + BMK_MASS_TRANSIT_INTERCITY_PRICE_FIRST = 2,//价格低 +}BMKMassTransitIntercityPolicy; + +/// 公共交通:跨城交通方式策略 +typedef enum +{ + BMK_MASS_TRANSIT_INTERCITY_TRANS_TRAIN_FIRST = 0,//火车优先 + BMK_MASS_TRANSIT_INTERCITY_TRANS_PLANE_FIRST = 1,//飞机优先 + BMK_MASS_TRANSIT_INTERCITY_TRANS_BUS_FIRST = 2,//大巴优先 +}BMKMassTransitIntercityTransPolicy; + + +typedef enum +{ + BMK_DRIVING_BLK_FIRST = -1, //躲避拥堵(自驾) + BMK_DRIVING_TIME_FIRST = 0, //最短时间(自驾) + BMK_DRIVING_DIS_FIRST = 1, //最短路程(自驾) + BMK_DRIVING_FEE_FIRST, //少走高速(自驾) + +}BMKDrivingPolicy; + +typedef enum +{ + BMK_DRIVING_REQUEST_TRAFFICE_TYPE_NONE = 0, //不带路况 + BMK_DRIVING_REQUEST_TRAFFICE_TYPE_PATH_AND_TRAFFICE = 1, //道路和路况 +}BMKDrivingRequestTrafficType; + +///打车信息类 +@interface BMKTaxiInfo : NSObject + +///路线打车描述信息 +@property (nonatomic, strong) NSString* desc; +///总路程,单位: 米 +@property (nonatomic) int distance; +///总耗时,单位: 秒 +@property (nonatomic) int duration; +///每千米单价(白天),单位 元 +@property (nonatomic) CGFloat perKMPrice; +///起步价(白天),单位 元 +@property (nonatomic) CGFloat startPrice; +///总价(预估) , 单位: 元 +@property (nonatomic) int totalPrice; + +@end + +///路线换乘方案里的交通工具信息类 +@interface BMKVehicleInfo : NSObject{ + NSString* _uid; + NSString* _title; + int _passStationNum; + int _totalPrice; + int _zonePrice; +} +///该交通路线的标识 +@property (nonatomic, strong) NSString* uid; +///该交通路线的名称 +@property (nonatomic, strong) NSString* title; +///该交通路线的所乘站数 +@property (nonatomic) int passStationNum; +///该交通路线的全程价格 +@property (nonatomic) int totalPrice; +///该交通路线的所乘区间的区间价格 +@property (nonatomic) int zonePrice; +@end + +///此类代表一个时间段,每个属性都是一个时间段。 +@interface BMKTime : NSObject{ + int _dates; + int _hours; + int _minutes; + int _seconds; + +} + +///时间段,单位(天) +@property (nonatomic) int dates; +///时间段,单位(小时) +@property (nonatomic) int hours; +///时间段,单位(分) +@property (nonatomic) int minutes; +///时间段,单位(秒) +@property (nonatomic) int seconds; +@end + +///此类表示路线中的一节点,节点包括:路线起终点,公交站点等 +@interface BMKRouteNode : NSObject{ + NSString* _uid; + NSString* _title; + CLLocationCoordinate2D _location; +} +///该节点uid +@property (nonatomic, strong) NSString* uid; +///该节点的名称 +@property (nonatomic, strong) NSString* title; +///该节点的坐标 +@property (nonatomic) CLLocationCoordinate2D location; +@end +///此类表示公交站点信息 +@interface BMKBusStation : BMKRouteNode +@end + + +///此类表示路线中的一个路段(基类) +@interface BMKRouteStep : NSObject{ + int _distance; + int _duration; + BMKMapPoint* _points; + int _pointsCount; +} +///路段长度 单位: 米 +@property (nonatomic) int distance; +///路段耗时 单位: 秒 +@property (nonatomic) int duration; +///路段所经过的地理坐标集合 +@property (nonatomic) BMKMapPoint* points; +///路段所经过的地理坐标集合内点的个数 +@property (nonatomic) int pointsCount; + +@end + +///此类表示公交线路中的一个路段 +@interface BMKBusStep : BMKRouteStep +@end + +///此类表示公交换乘路线中的一个路段 +@interface BMKTransitStep : BMKRouteStep{ + BMKRouteNode* _entrace; + BMKRouteNode* _exit; + NSString* _instruction; + BMKTransitStepType _stepType; + BMKVehicleInfo* _vehicleInfo; +} +///路段入口信息 +@property (nonatomic, strong) BMKRouteNode* entrace; +///路段出口信息 +@property (nonatomic, strong) BMKRouteNode* exit; +///路段换乘说明 +@property (nonatomic, strong) NSString* instruction; +///路段类型 +@property (nonatomic) BMKTransitStepType stepType; +///当路段为公交路段或地铁路段时,可以获取交通工具信息 +@property (nonatomic, strong) BMKVehicleInfo* vehicleInfo; +@end + +///公共交通方案里的交通工具信息基类类 +@interface BMKBaseVehicleInfo : NSObject + +///该交通路线的名称 +@property (nonatomic, strong) NSString* name; +///出发站 +@property (nonatomic, strong) NSString* departureStation; +///到达站 +@property (nonatomic, strong) NSString* arriveStation; +///出发时间(BMKBusVehicleInfo时departureTime为空) +@property (nonatomic, strong) NSString* departureTime; +///到达时间(BMKBusVehicleInfo时arriveTime为空) +@property (nonatomic, strong) NSString* arriveTime; + +@end + +///公共交通方案里的交通工具信息类- 公交车、地铁 +@interface BMKBusVehicleInfo : BMKBaseVehicleInfo + +///该交通路线的所乘站数 +@property (nonatomic, assign) NSInteger passStationNum; +///始发车发车时间 +@property (nonatomic, strong) NSString* firstTime; +///末班车发车时间 +@property (nonatomic, strong) NSString* lastTime; + +@end +///公共交通方案里的交通工具信息类 - 飞机 +@interface BMKPlaneVehicleInfo : BMKBaseVehicleInfo + +///价格(单位:元) +@property (nonatomic, assign) CGFloat price; +///折扣 +@property (nonatomic, assign) CGFloat discount; +///航空公司 +@property (nonatomic, strong) NSString* airlines; +///订票网址 +@property (nonatomic, strong) NSString* bookingUrl; + +@end +///公共交通方案里的交通工具信息类 - 火车 +@interface BMKTrainVehicleInfo : BMKBaseVehicleInfo + +///价格(单位:元) +@property (nonatomic, assign) CGFloat price; +///订票电话 +@property (nonatomic, strong) NSString* booking; + +@end +///公共交通方案里的交通工具信息类 - 大巴 +@interface BMKCoachVehicleInfo : BMKBaseVehicleInfo + +///价格(单位:元) +@property (nonatomic, assign) CGFloat price; +///订票网址 +@property (nonatomic, strong) NSString* bookingUrl; +///合作方名称 +@property (nonatomic, strong) NSString* providerName; +///合作方官网 +@property (nonatomic, strong) NSString* providerUrl; + +@end + +///此类表示公共交通路线中的路段 +@interface BMKMassTransitStep : NSObject +///steps中是方案还是子路段,YES:steps是BMKMassTransitStep的子路段(A到B需要经过多个steps);NO:steps是多个方案(A到B有多个方案选择) +@property (nonatomic, assign) BOOL isSubStep; +///本BMKMassTransitStep中的有几个方案或几个子路段,成员类型为BMKMassTransitSubStep +@property (nonatomic, strong) NSArray *steps; + +@end + +///此类表示公共交通路线中的一个路段 +@interface BMKMassTransitSubStep : BMKRouteStep + +///路段入口经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D entraceCoor; +///路段出口经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D exitCoor; +///路段说明 +@property (nonatomic, strong) NSString* instructions; +///路段类型 +@property (nonatomic) BMKMassTransitType stepType; +///该路段交通工具信息(当stepType为公交地铁时,BMKBusVehicleInfo对象;stepType为大巴时,BMKCoachVehicleInfo对象;stepType为飞机时,BMKPlaneVehicleInfo对象;stepType为火车时,BMKTrainVehicleInfo对象;其它为nil) +@property (nonatomic, strong) BMKBaseVehicleInfo* vehicleInfo; + +@end + +///此类表示驾车路线中的一个路段 +@interface BMKDrivingStep : BMKRouteStep{ + int _direction; + BMKRouteNode* _entrace; + NSString* _entraceInstruction; + BMKRouteNode* _exit; + NSString* _exitInstruction; + NSString* _instruction; + int _numTurns; +} +///该路段起点方向值 +@property (nonatomic) int direction; +///路段入口信息 +@property (nonatomic, strong) BMKRouteNode* entrace; +///路段入口的指示信息 +@property (nonatomic, strong) NSString* entraceInstruction; +///路段出口信息 +@property (nonatomic, strong) BMKRouteNode* exit; +///路段出口指示信息 +@property (nonatomic, strong) NSString* exitInstruction; +///路段总体指示信息 +@property (nonatomic, strong) NSString* instruction; +///路段需要转弯数 +@property (nonatomic) int numTurns; +///路段是否有路况信息 +@property (nonatomic) BOOL hasTrafficsInfo; +///路段的路况信息,成员为NSNumber。0:无数据;1:畅通;2:缓慢;3:拥堵 +@property (nonatomic, strong) NSArray* traffics; + +@end + +///室内路线结点 +@interface BMKIndoorStepNode : NSObject + +///坐标 +@property (nonatomic, assign) CLLocationCoordinate2D coordinate; +///类型 +@property (nonatomic, assign) BMKIndoorStepNodeType type; +///描述 +@property (nonatomic, strong) NSString* desc; + +@end + +/// 此类表示室内路线的一个路段 +@interface BMKIndoorRouteStep : BMKRouteStep + +///入口信息 +@property (nonatomic, strong) BMKRouteNode* entrace; +///出口信息 +@property (nonatomic, strong) BMKRouteNode* exit; +///路段指示信息 +@property (nonatomic, strong) NSString* instructions; +///建筑物id +@property (nonatomic, strong) NSString* buildingid; +///室内楼层id +@property (nonatomic, strong) NSString* floorid; +///结点数组,成员类型为:BMKIndoorStepNode +@property (nonatomic, strong) NSArray* indoorStepNodes; + +@end + +///此类表示步行路线中的一个路段 +@interface BMKWalkingStep : BMKRouteStep{ + int _direction; + BMKRouteNode* _entrace; + NSString* _entraceInstruction; + BMKRouteNode* _exit; + NSString* _exitInstruction; + NSString* _instruction; +} +///该路段起点方向值 +@property (nonatomic) int direction; +///路段入口信息 +@property (nonatomic, strong) BMKRouteNode* entrace; +///获取该路段入口指示信息 +@property (nonatomic, strong) NSString* entraceInstruction; +///路段出口信息 +@property (nonatomic, strong) BMKRouteNode* exit; +///获取该路段出口指示信息 +@property (nonatomic, strong) NSString* exitInstruction; +///获取该路段指示信息 +@property (nonatomic, strong) NSString* instruction; +@end + +///此类表示骑行路线中的一个路段 +@interface BMKRidingStep : BMKRouteStep + +///该路段起点方向值 +@property (nonatomic) NSInteger direction; +///路段入口信息 +@property (nonatomic, strong) BMKRouteNode* entrace; +///获取该路段入口指示信息 +@property (nonatomic, strong) NSString* entraceInstruction; +///路段出口信息 +@property (nonatomic, strong) BMKRouteNode* exit; +///获取该路段出口指示信息 +@property (nonatomic, strong) NSString* exitInstruction; +///获取该路段指示信息 +@property (nonatomic, strong) NSString* instruction; + +@end + + +///此类表示路线数据结构的基类,表示一条路线,路线可能包括:路线规划中的换乘/驾车/步行路线 +///此类为路线数据结构的基类,一般关注其子类对象即可,无需直接生成该类对象 +@interface BMKRouteLine : NSObject{ + int _distance; + BMKTime* _duration; + BMKRouteNode* _starting; + BMKRouteNode* _terminal; + NSString* _title; + NSArray* _steps; +} +///路线长度 单位: 米 +@property (nonatomic) int distance; +///路线耗时 单位: 秒 +@property (nonatomic, strong) BMKTime* duration; +///路线起点信息 +@property (nonatomic, strong) BMKRouteNode* starting; +///路线终点信息 +@property (nonatomic, strong) BMKRouteNode* terminal; +///路线名称(预留字段,现为空) +@property (nonatomic, strong) NSString* title; +///路线中的所有路段,成员类型为BMKWalkingStep,BMKDrivingStep,BMKTransitStep,BMKRidingStep,BMKIndoorRouteStep,BMKMassTransitStep +@property (nonatomic, strong) NSArray* steps; +@end + +///此类表示一个换乘路线,换乘路线将根据既定策略调配多种交通工具 +@interface BMKTransitRouteLine : BMKRouteLine +@end +///此类表示一条公共交通路线 +@interface BMKMassTransitRouteLine : BMKRouteLine + +///路线花费 +@property (nonatomic, assign) CGFloat price; + +@end +///此类表示一个室内路线 +@interface BMKIndoorRouteLine : BMKRouteLine +@end +///此类表示一条驾车路线 +@interface BMKDrivingRouteLine : BMKRouteLine{ + bool _isSupportTraffic;//从2.7.0开始,废弃 + NSArray* _wayPoints; +} +///该路线所在区域是否含有交通流量信息,从2.7.0开始,废弃 +@property (nonatomic) bool isSupportTraffic; +///路线途经点列表,成员类型为BMKPlanNode +@property (nonatomic, strong) NSArray* wayPoints; +///路线红绿灯个数 +@property (nonatomic, assign) NSInteger lightNum; +///路线拥堵米数,发起请求时需设置参数 drivingRequestTrafficType = BMK_DRIVING_REQUEST_TRAFFICE_TYPE_PATH_AND_TRAFFICE 才有值 +@property (nonatomic, assign) NSInteger congestionMetres; +///路线预估打车费(元),负数表示无打车费信息 +@property (nonatomic, assign) NSInteger taxiFares; + +@end + +///此类表示一条步行路线 +@interface BMKWalkingRouteLine : BMKRouteLine +@end + +///此类表示一条骑行路线 +@interface BMKRidingRouteLine : BMKRouteLine +@end + +///路线搜索地址结果类.当输入的起点或终点有多个地点选择时,或者选定的城市没有此地点,但其它城市有(驾乘或步行),返回该类的实例 +@interface BMKSuggestAddrInfo : NSObject +{ + NSArray* _startPoiList; + NSArray* _endPoiList; + NSArray* _startCityList; + NSArray* _endCityList; + NSArray* _wayPointsPoiList; + NSArray* _wayPointsCityList; +} +///起点POI列表,成员类型为BMKPoiInfo +@property (nonatomic, strong) NSArray* startPoiList; +///起点城市列表,成员类型为BMKCityListInfo,如果输入的地点在本城市没有而在其它城市有,则返回其它城市的信息 +@property (nonatomic, strong) NSArray* startCityList; +///终点POI列表,成员类型为BMKPoiInfo +@property (nonatomic, strong) NSArray* endPoiList; +///终点城市列表,成员类型为BMKCityListInfo,如果输入的地点在本城市没有而在其它城市有,则返回其它城市的信息 +@property (nonatomic, strong) NSArray* endCityList; +///途经点POI列表,成员类型为NSArray +@property (nonatomic, strong) NSArray* wayPointPoiList; +///途经点城市列表,成员类型为NSArray,如果输入的地点在本城市没有而在其它城市有,则返回其它城市的信息 +@property (nonatomic, strong) NSArray* wayPointCityList; +@end + +///此类表示公共交通信息查询结果 +@interface BMKBusLineResult : NSObject{ + NSString* _busCompany; + NSString* _busLineName; + NSString* _uid; + NSString* _startTime; + NSString* _endTime; + int _isMonTicket; + NSArray* _busStations; + NSArray* _busSteps; +} +///公交公司名称 +@property (nonatomic, strong) NSString* busCompany; +///公交线路名称 +@property (nonatomic, strong) NSString* busLineName; +///公交线路方向 +@property (nonatomic, strong) NSString* busLineDirection; +///公交线路uid +@property (nonatomic, strong) NSString* uid; +///公交路线首班车时间 +@property (nonatomic, strong) NSString* startTime; +///公交路线末班车时间 +@property (nonatomic, strong) NSString* endTime; +///公交是线是否有月票 +@property (nonatomic) int isMonTicket; +///起步票价 +@property (nonatomic, assign) CGFloat basicPrice; +///全程票价 +@property (nonatomic, assign) CGFloat totalPrice; +///所有公交站点信息,成员类型为BMKBusStation +@property (nonatomic, strong) NSArray* busStations; +///公交路线分段信息,成员类型为BMKBusStep +@property (nonatomic, strong) NSArray* busSteps; +@end + +///此类表示步行路线结果 +@interface BMKWalkingRouteResult : NSObject{ + BMKTaxiInfo* _taxiInfo; + BMKSuggestAddrInfo* _suggestAddrResult; + NSArray* _routes; +} +///该路线打车信息 +@property (nonatomic, strong) BMKTaxiInfo* taxiInfo; +///返回起点或终点的地址信息结果 +@property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; +///步行结果,现在只返回一条。成员类型为BMKWalkingRouteLine +@property (nonatomic, strong) NSArray* routes; + +@end + +///此类表示驾车路线结果 +@interface BMKDrivingRouteResult : NSObject{ + BMKTaxiInfo* _taxiInfo; + BMKSuggestAddrInfo* _suggestAddrResult; + NSArray* _routes; +} +///该路线打车信息 +@property (nonatomic, strong) BMKTaxiInfo* taxiInfo; +///返回起点或终点的地址信息结果 +@property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; +///驾车结果,支持多路线。成员类型为BMKDrivingRouteLine +@property (nonatomic, strong) NSArray* routes; + +@end + +@interface BMKTransitRouteResult : NSObject{ + BMKTaxiInfo* _taxiInfo; + BMKSuggestAddrInfo* _suggestAddrResult; + NSArray* _routes; +} +///该路线打车信息 +@property (nonatomic, strong) BMKTaxiInfo* taxiInfo; +///返回起点或终点的地址信息结果 +@property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; +///方案数组,成员类型为BMKTransitRouteLine +@property (nonatomic, strong) NSArray* routes; + +@end + +///此类表示公共交通路线结果 +@interface BMKMassTransitRouteResult : NSObject + +///返回起点或终点的地址信息结果 +@property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; +///方案数组,成员类型为BMKMassTransitRouteLine +@property (nonatomic, strong) NSArray* routes; +///总方案数 +@property (nonatomic, assign) NSInteger totalRoutes; +///该路线打车信息(只有起终点是大陆地区且是同城的请求时才返回此字段, 否则此字段为nil) +@property (nonatomic, strong) BMKTaxiInfo* taxiInfo; + +@end + +///此类表示骑行路线结果 +@interface BMKRidingRouteResult : NSObject + +///返回起点或终点的地址信息结果 +@property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; +///骑行路线结果,成员类型为BMKRidingRouteLine +@property (nonatomic, strong) NSArray* routes; + +@end + +/// 此类表示室内路线结果 +@interface BMKIndoorRouteResult : NSObject + +///方案数组,成员类型为BMKIndoorRouteLine +@property (nonatomic, strong) NSArray* routes; + +@end diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchBase.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchBase.h new file mode 100644 index 0000000..c6d42f5 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchBase.h @@ -0,0 +1,18 @@ +// +// BMKSearchBase.h +// SearchComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKSearchBase_h +#define BMKSearchBase_h + +///检索服务基类 +@interface BMKSearchBase : NSObject + +@end + + +#endif /* BMKSearchBase_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchComponent.h new file mode 100644 index 0000000..8cff2ed --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchComponent.h @@ -0,0 +1,25 @@ +// +// BMKSearchComponent.h +// SearchComponent +// +// Created by baidu on 14-3-10. +// Copyright (c) 2014年 baidu. All rights reserved. +// + +#import "BMKSearchVersion.h" +#import "BMKPoiSearchType.h" +#import "BMKGeocodeType.h" +#import "BMKRouteSearchType.h" +#import "BMKPoiSearchOption.h" +#import "BMKPoiSearch.h" +#import "BMKGeocodeSearch.h" +#import "BMKGeocodeSearchOption.h" +#import "BMKShareURLSearch.h" +#import "BMKShareUrlSearchOption.h" +#import "BMKSuggestionSearch.h" +#import "BMKSuggestionSearchOption.h" +#import "BMKBusLineSearch.h" +#import "BMKBusLineSearchOption.h" +#import "BMKRouteSearch.h" +#import "BMKRouteSearchOption.h" +#import "BMKDistrictSearch.h" \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchVersion.h new file mode 100644 index 0000000..f87390f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchVersion.h @@ -0,0 +1,32 @@ +// +// BMKSearchVersion.h +// SearchComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKSearchVersion_h +#define BMKSearchVersion_h + +#import + +/** + *重要: + *base组件的版本和search组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API search组件 的版本号 + *当前search组件版本 : 3.3.2 + *return 返回当前API search组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiSearchComponentVersion(); + +/** + *检查search组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckSearchComponentIsLegal(); + +#endif /* BMKSearchVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareURLSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareURLSearch.h new file mode 100644 index 0000000..c746fe1 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareURLSearch.h @@ -0,0 +1,82 @@ +/* + * BMKShareUrlSearch.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import "BMKShareUrlSearchOption.h" +#import "BMKSearchBase.h" + +///分享URL结果类 +@interface BMKShareURLResult : NSObject +{ + NSString * _url; +} +///返回结果url +@property (nonatomic,strong) NSString* url; +@end + + +@protocol BMKShareURLSearchDelegate; +///短串搜索服务 +@interface BMKShareURLSearch : BMKSearchBase +/// 检索模块的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/** + *获取poi详情短串分享url + *异步函数,返回结果在BMKShareUrlSearchDelegate的onGetPoiDetailShareURLResult通知 + *@param poiDetailShareUrlSearchOption poi详情短串分享检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)requestPoiDetailShareURL:(BMKPoiDetailShareURLOption *) poiDetailShareUrlSearchOption; + +/** + *获取反geo短串分享url + *异步函数,返回结果在BMKShareUrlSearchDelegate的onGetLocationShareURLResult通知 + *@param reverseGeoShareUrlSearchOption 反geo短串分享检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)requestLocationShareURL:(BMKLocationShareURLOption *)reverseGeoShareUrlSearchOption; + +/** + *获取路线规划短串分享url + *异步函数,返回结果在BMKShareUrlSearchDelegate的onGetRoutePlanShareURLResult通知 + *@param routePlanShareUrlSearchOption 取路线规划短串分享检索信息类 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)requestRoutePlanShareURL:(BMKRoutePlanShareURLOption *)routePlanShareUrlSearchOption; + + +@end + +///搜索delegate,用于获取搜索结果 +@protocol BMKShareURLSearchDelegate +@optional +/** + *返回poi详情分享url + *@param searcher 搜索对象 + *@param result 返回结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetPoiDetailShareURLResult:(BMKShareURLSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回位置信息分享url + *@param searcher 搜索对象 + *@param result 返回结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetLocationShareURLResult:(BMKShareURLSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error; + +/** + *返回路线规划分享url + *@param searcher 搜索对象 + *@param result 返回结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetRoutePlanShareURLResult:(BMKShareURLSearch *)searcher result:(BMKShareURLResult *)result errorCode:(BMKSearchErrorCode)error; + +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareUrlSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareUrlSearchOption.h new file mode 100644 index 0000000..bc67806 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareUrlSearchOption.h @@ -0,0 +1,57 @@ +/* + * BMKShareUrlSearchOption.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import +/// poi详情短串分享检索信息类 +@interface BMKPoiDetailShareURLOption : NSObject +{ + NSString *_uid; +} +///poi的uid +@property (nonatomic, strong) NSString *uid; + +@end + +///反geo短串分享检索信息类 +@interface BMKLocationShareURLOption : NSObject { + NSString *_name; + NSString *_snippet; + CLLocationCoordinate2D _location; +} +///名称 +@property (nonatomic, strong) NSString *name; +///通过短URL调起客户端时作为附加信息显示在名称下面 +@property (nonatomic, strong) NSString *snippet; +///经纬度 +@property (nonatomic, assign) CLLocationCoordinate2D location; +@end + + +///路线规划短串分享 +typedef enum { + BMK_ROUTE_PLAN_SHARE_URL_TYPE_DRIVE = 0, //驾车路线规划短串分享 + BMK_ROUTE_PLAN_SHARE_URL_TYPE_WALK = 1, //步行路线规划短串分享 + BMK_ROUTE_PLAN_SHARE_URL_TYPE_RIDE = 2, //骑行路线规划短串分享 + BMK_ROUTE_PLAN_SHARE_URL_TYPE_TRANSIT = 3, //公交路线规划短串分享 +}BMKRoutePlanShareURLType; + +///路线规划短串分享检索信息类 +@interface BMKRoutePlanShareURLOption : NSObject + +///路线规划短串分享类型 +@property (nonatomic, assign) BMKRoutePlanShareURLType routePlanType; +///起点,可通过关键字、坐标两种方式指定,使用关键字时必须指定from.cityID +@property (nonatomic, strong) BMKPlanNode *from; +///终点,可通过关键字、坐标两种方式指定,使用关键字时必须指定to.cityID +@property (nonatomic, strong) BMKPlanNode *to; +///cityID,当进行公交路线规划短串分享且起终点通过关键字指定时,必须指定 +@property (nonatomic, assign) NSUInteger cityID; +///公交路线规划短串分享时使用,分享的是第几条线路 +@property (nonatomic, assign) NSUInteger routeIndex; + +@end \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearch.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearch.h new file mode 100644 index 0000000..441c7a6 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearch.h @@ -0,0 +1,65 @@ +/* + * BMKSuggestionSearch.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import "BMKSuggestionSearchOption.h" +#import +#import "BMKSearchBase.h" + +///Suggestion结果类 +@interface BMKSuggestionResult : BMKSearchBase +{ + NSArray* _keyList; + NSArray* _cityList; + NSArray* _districtList; +} +///key列表,成员是NSString +@property (nonatomic, strong) NSArray* keyList; +///city列表,成员是NSString +@property (nonatomic, strong) NSArray* cityList; +///district列表,成员是NSString +@property (nonatomic, strong) NSArray* districtList; +///poiId列表,成员是NSString +@property (nonatomic, strong) NSArray* poiIdList; +///pt列表,成员是:封装成NSValue的CLLocationCoordinate2D +@property (nonatomic, strong) NSArray* ptList; + +@end + +@protocol BMKSuggestionSearchDelegate; +///sug搜索服务 +@interface BMKSuggestionSearch : BMKSearchBase +/// 检索模块的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 +@property (nonatomic, weak) id delegate; + +/** + *搜索建议检索 + *@param suggestionSearchOption sug检索信息类 + *异步函数,返回结果在BMKSuggestionSearchDelegate的onGetSuggestionResult通知 + *@return 成功返回YES,否则返回NO + */ +- (BOOL)suggestionSearch:(BMKSuggestionSearchOption*)suggestionSearchOption; + +@end + +///搜索delegate,用于获取搜索结果 +@protocol BMKSuggestionSearchDelegate +@optional +/** + *返回suggestion搜索结果 + *@param searcher 搜索对象 + *@param result 搜索结果 + *@param error 错误号,@see BMKSearchErrorCode + */ +- (void)onGetSuggestionResult:(BMKSuggestionSearch*)searcher result:(BMKSuggestionResult*)result errorCode:(BMKSearchErrorCode)error; + + +@end + + + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearchOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearchOption.h new file mode 100644 index 0000000..ff2cfc5 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearchOption.h @@ -0,0 +1,26 @@ +/* + * BMKSuggestionSearchOption.h + * BMapKit + * + * Copyright 2014 Baidu Inc. All rights reserved. + * + */ + +#import +/// sug检索信息类 +@interface BMKSuggestionSearchOption : NSObject +{ + NSString *_keyword; + NSString *_cityname; + +} +///搜索关键字 +@property (nonatomic, strong) NSString *keyword; +///城市名 +@property (nonatomic, strong) NSString *cityname; +///是否只返回指定城市检索结果(默认:NO)(提示:海外区域暂不支持设置cityLimit) +@property (nonatomic, assign) BOOL cityLimit; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/readme.txt new file mode 100644 index 0000000..b2e481f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/readme.txt @@ -0,0 +1,52 @@ +检索功能:包括POI检索,公交信息查询,路线规划,地理编码/反地理编码,在线建议查询,短串分享等; + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/BaiduMapAPI_Utils b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/BaiduMapAPI_Utils new file mode 100644 index 0000000..dda4145 Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/BaiduMapAPI_Utils differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiInfo.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiInfo.h new file mode 100644 index 0000000..7f662ca --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiInfo.h @@ -0,0 +1,36 @@ +// +// BMKFavPoiInfo.h +// UtilsComponent +// +// Created by wzy on 15/4/8. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKFavPoiInfo_h +#define UtilsComponent_BMKFavPoiInfo_h + +#import +#import + +///收藏点信息类 +@interface BMKFavPoiInfo : NSObject + +///数据ID,自动生成 +@property (nonatomic, strong) NSString* favId; +///poi名称(添加或更新时,必须有) +@property (nonatomic, strong) NSString* poiName; +///poi点Uid +@property (nonatomic, strong) NSString* poiUid; +///poi坐标(添加或更新时,必须有) +@property (nonatomic, assign) CLLocationCoordinate2D pt; +///poi地址 +@property (nonatomic, strong) NSString* address; +///城市名称 +@property (nonatomic, strong) NSString* cityName; +///添加或最后修改时间戳 +@property (nonatomic, assign) NSUInteger timeStamp; + + +@end + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiManager.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiManager.h new file mode 100644 index 0000000..ee1a620 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiManager.h @@ -0,0 +1,60 @@ +// +// BMKFavPoiManager.h +// UtilsComponent +// +// Created by wzy on 15/4/9. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKFavPoiManager_h +#define UtilsComponent_BMKFavPoiManager_h + +#import "BMKFavPoiInfo.h" + +///收藏点管理类 +@interface BMKFavPoiManager : NSObject + +/** + * 添加一个poi点 + * @param favPoiInfo 点信息,in/out,输出包含favId和添加时间 + * @return -2:收藏夹已满,-1:名称为空,0:添加失败,1:添加成功 + */ +- (NSInteger)addFavPoi:(BMKFavPoiInfo*) favPoiInfo; + +/** + * 获取一个收藏点信息 + * @param favId 添加时返回的favId,也可通过getAllFavPois获取的信息中BMKFavPoiInfo的属性favId + * @return 收藏点信息,没有返回nil + */ +- (BMKFavPoiInfo*)getFavPoi:(NSString*) favId; + +/** + * 获取所有收藏点信息 + * @return 点信息数组 + */ +- (NSArray*)getAllFavPois; + +/** + * 更新一个收藏点 + * @param favId 添加时返回的favId,也可通过getAllFavPois获取的信息中BMKFavPoiInfo的属性favId + * @param favPoiInfo 点信息,in/out,输出包含修改时间 + * @return 成功返回YES,失败返回NO + */ +- (BOOL)updateFavPoi:(NSString*) favId favPoiInfo:(BMKFavPoiInfo*) favPoiInfo; + +/** + * 删除一个收藏点 + * @param favId 添加时返回的favId,也可通过getAllFavPois获取的信息中BMKFavPoiInfo的属性favId + * @return 成功返回YES,失败返回NO + */ +- (BOOL)deleteFavPoi:(NSString*) favId; + +/** + * 清空所有收藏点 + * @return 成功返回YES,失败返回NO + */ +- (BOOL)clearAllFavPois; + +@end + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKGeometry.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKGeometry.h new file mode 100644 index 0000000..d9be561 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKGeometry.h @@ -0,0 +1,420 @@ +/* BMKGeometry.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ + +#import +#import + + +/** + *构造BMKCoordinateSpan对象 + *@param latitudeDelta 纬度方向的变化量 + *@param longitudeDelta 经度方向的变化量 + *@return 根据指定参数生成的BMKCoordinateSpan对象 + */ +UIKIT_STATIC_INLINE BMKCoordinateSpan BMKCoordinateSpanMake(CLLocationDegrees latitudeDelta, CLLocationDegrees longitudeDelta) +{ + BMKCoordinateSpan span; + span.latitudeDelta = latitudeDelta; + span.longitudeDelta = longitudeDelta; + return span; +} + +/** + *构造BMKCoordinateRegion对象 + *@param centerCoordinate 中心点经纬度坐标 + *@param span 经纬度的范围 + *@return 根据指定参数生成的BMKCoordinateRegion对象 + */ +UIKIT_STATIC_INLINE BMKCoordinateRegion BMKCoordinateRegionMake(CLLocationCoordinate2D centerCoordinate, BMKCoordinateSpan span) +{ + BMKCoordinateRegion region; + region.center = centerCoordinate; + region.span = span; + return region; +} + +/** + *根据中心点和距离生成BMKCoordinateRegion + *@param centerCoordinate 中心点坐标 + *@param latitudinalMeters 纬度方向的距离范围,单位:米 + *@param longitudinalMeters 经度方向的距离范围,单位:米 + *@return 根据中心点和距离生成BMKCoordinateRegion + */ +UIKIT_EXTERN BMKCoordinateRegion BMKCoordinateRegionMakeWithDistance(CLLocationCoordinate2D centerCoordinate, CLLocationDistance latitudinalMeters, CLLocationDistance longitudinalMeters); + +/** + *将经纬度坐标转换为投影后的直角地理坐标 + *@param coordinate 待转换的经纬度坐标 + *@return 转换后的直角地理坐标 + */ +UIKIT_EXTERN BMKMapPoint BMKMapPointForCoordinate(CLLocationCoordinate2D coordinate); + +/** + *将投影后的直角地理坐标转换为经纬度坐标 + *@param mapPoint 投影后的直角地理坐标 + *@return 转换后的经纬度坐标 + */ +UIKIT_EXTERN CLLocationCoordinate2D BMKCoordinateForMapPoint(BMKMapPoint mapPoint); + +/** + *计算在指定纬度下一个BMKMapPoint单位对应的米数 + *@param latitude 指定的纬度 + *@return 在指定纬度下一个BMKMapPoint单位对应的米数 + */ +UIKIT_EXTERN CLLocationDistance BMKMetersPerMapPointAtLatitude(CLLocationDegrees latitude); + +/** + *计算在指定纬度下一米对应的MKMapPoint的单位数 + *@param latitude 指定的纬度 + *@return 在指定纬度下一米对应的MKMapPoint的单位数 + */ +UIKIT_EXTERN double BMKMapPointsPerMeterAtLatitude(CLLocationDegrees latitude); + +/** + *计算指定两点之间的距离 + *@param a 第一个坐标点 + *@param b 第二个坐标点 + *@return 两点之间的距离,单位:米 + */ +UIKIT_EXTERN CLLocationDistance BMKMetersBetweenMapPoints(BMKMapPoint a, BMKMapPoint b); + +/** + *构造BMKMapPoint对象 + *@param x 水平方向的坐标值 + *@param y 垂直方向的坐标值 + *@return 根据指定参数生成的BMKMapPoint对象 + */ +UIKIT_STATIC_INLINE BMKMapPoint BMKMapPointMake(double x, double y) { + return (BMKMapPoint){x, y}; +} + +/** + *构造BMKMapSize对象 + *@param width 宽度 + *@param height 高度 + *@return 根据指定参数生成的BMKMapSize对象 + */ +UIKIT_STATIC_INLINE BMKMapSize BMKMapSizeMake(double width, double height) { + return (BMKMapSize){width, height}; +} + +/** + *构造BMKMapRect对象 + *@param x 矩形左上顶点的x坐标值 + *@param y 矩形左上顶点的y坐标值 + *@param width 矩形宽度 + *@param height 矩形高度 + *@return 根据指定参数生成的BMKMapRect对象 + */ +UIKIT_STATIC_INLINE BMKMapRect BMKMapRectMake(double x, double y, double width, double height) { + return (BMKMapRect){ BMKMapPointMake(x, y), BMKMapSizeMake(width, height)}; +} + +/** + *获取指定矩形的x轴坐标最小值 + *@param rect 指定的矩形 + *@return x轴坐标最小值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMinX(BMKMapRect rect) { + return rect.origin.x; +} + +/** + *获取指定矩形的y轴坐标最小值 + *@param rect 指定的矩形 + *@return y轴坐标最小值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMinY(BMKMapRect rect) { + return rect.origin.y; +} + +/** + *获取指定矩形在x轴中点的坐标值 + *@param rect 指定的矩形 + *@return x轴中点的坐标值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMidX(BMKMapRect rect) { + return rect.origin.x + rect.size.width / 2.0; +} + +/** + *获取指定矩形在y轴中点的坐标值 + *@param rect 指定的矩形 + *@return y轴中点的坐标值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMidY(BMKMapRect rect) { + return rect.origin.y + rect.size.height / 2.0; +} + +/** + *获取指定矩形的x轴坐标最大值 + *@param rect 指定的矩形 + *@return x轴坐标最大值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMaxX(BMKMapRect rect) { + return rect.origin.x + rect.size.width; +} + +/** + *获取指定矩形的y轴坐标最大值 + *@param rect 指定的矩形 + *@return y轴坐标最大值 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetMaxY(BMKMapRect rect) { + return rect.origin.y + rect.size.height; +} + +/** + *获取指定矩形的宽度 + *@param rect 指定的矩形 + *@return 指定矩形的宽度 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetWidth(BMKMapRect rect) { + return rect.size.width; +} + +/** + *获取指定矩形的高度 + *@param rect 指定的矩形 + *@return 指定矩形的高度 + */ +UIKIT_STATIC_INLINE double BMKMapRectGetHeight(BMKMapRect rect) { + return rect.size.height; +} + +/** + *判断两个点是否相等 + *@param point1 第一个点 + *@param point2 第二个点 + *@return 如果两点相等,返回YES,否则返回NO + */ +UIKIT_STATIC_INLINE BOOL BMKMapPointEqualToPoint(BMKMapPoint point1, BMKMapPoint point2) { + return point1.x == point2.x && point1.y == point2.y; +} + +/** + *判断两个矩形范围是否相等 + *@param size1 范围1 + *@param size2 范围2 + *@return 如果相等,返回YES,否则返回NO + */ +UIKIT_STATIC_INLINE BOOL BMKMapSizeEqualToSize(BMKMapSize size1, BMKMapSize size2) { + return size1.width == size2.width && size1.height == size2.height; +} + +/** + *判断两个矩形是否相等 + *@param rect1 矩形1 + *@param rect2 矩形2 + *@return 如果相等,返回YES,否则返回NO + */ +UIKIT_STATIC_INLINE BOOL BMKMapRectEqualToRect(BMKMapRect rect1, BMKMapRect rect2) { + return + BMKMapPointEqualToPoint(rect1.origin, rect2.origin) && + BMKMapSizeEqualToSize(rect1.size, rect2.size); +} + +/** + *判断指定矩形是否为NULL + *@param rect 指定矩形 + *@return 如果矩形为NULL,返回YES,否则返回NO + */ +UIKIT_STATIC_INLINE BOOL BMKMapRectIsNull(BMKMapRect rect) { + return isinf(rect.origin.x) || isinf(rect.origin.y); +} + +/** + *判断一个矩形是否为空矩形 + *@param rect 指定矩形 + *@return 如果矩形为空矩形,返回YES,否则返回NO + */ +UIKIT_STATIC_INLINE BOOL BMKMapRectIsEmpty(BMKMapRect rect) { + return BMKMapRectIsNull(rect) || (rect.size.width == 0.0 && rect.size.height == 0.0); +} + +/** + *将BMKMapPoint格式化为字符串 + *@param point 指定的标点 + *@return 返回转换后的字符串 + */ +UIKIT_STATIC_INLINE NSString *BMKStringFromMapPoint(BMKMapPoint point) { + return [NSString stringWithFormat:@"{%.1f, %.1f}", point.x, point.y]; +} + +/** + *将BMKMapSize格式化为字符串 + *@param size 指定的size + *@return 返回转换后的字符串 + */ +UIKIT_STATIC_INLINE NSString *BMKStringFromMapSize(BMKMapSize size) { + return [NSString stringWithFormat:@"{%.1f, %.1f}", size.width, size.height]; +} + +/** + *将BMKMapRect格式化为字符串 + *@param rect 指定的rect + *@return 返回转换后的字符串 + */ +UIKIT_STATIC_INLINE NSString *BMKStringFromMapRect(BMKMapRect rect) { + return [NSString stringWithFormat:@"{%@, %@}", BMKStringFromMapPoint(rect.origin), BMKStringFromMapSize(rect.size)]; +} + +/** + *计算两个矩形的并集 + *@param rect1 矩形1 + *@param rect2 矩形2 + *@return 两个矩形的并集 + */ +UIKIT_EXTERN BMKMapRect BMKMapRectUnion(BMKMapRect rect1, BMKMapRect rect2); + +/** + *计算两个矩形的交集 + *@param rect1 矩形1 + *@param rect2 矩形2 + *@return 两个矩形的交集 + */ +UIKIT_EXTERN BMKMapRect BMKMapRectIntersection(BMKMapRect rect1, BMKMapRect rect2); + +/** + *将矩形向内缩小dx,dy大小 + *@param rect 指定的矩形 + *@param dx x轴的变化量 + *@param dy y轴的变化量 + *@return 调整后的矩形 + */ +UIKIT_EXTERN BMKMapRect BMKMapRectInset(BMKMapRect rect, double dx, double dy); + +/** + *将矩形原点偏移指定大小 + *@param rect 指定的矩形 + *@param dx x轴的偏移量 + *@param dy y轴的偏移量 + *@return 调整后的矩形 + */ +UIKIT_EXTERN BMKMapRect BMKMapRectOffset(BMKMapRect rect, double dx, double dy); + +/** + *矩形分割,将一个矩形分割为两个矩形 + *@param rect 待分割的矩形 + *@param slice 指针,用来保存分割后被移除的矩形 + *@param remainder 指针,用来保存分割后剩下的矩形 + *@param amount 指定分割的大小,如果设置为负数,则将自动调整为0 + *@param edge 用来指定要从那条边开始分割 + */ +UIKIT_EXTERN void BMKMapRectDivide(BMKMapRect rect, BMKMapRect *slice, BMKMapRect *remainder, double amount, CGRectEdge edge); + +/** + *判断指定点是否在某矩形内 + *@param rect 指定的矩形 + *@param point 指定的点 + *@return 如果包含,返回YES,否则,返回NO + */ +UIKIT_EXTERN BOOL BMKMapRectContainsPoint(BMKMapRect rect, BMKMapPoint point); + +/** + *判断矩形rect1是否包含矩形rect2 + *@param rect1 矩形1 + *@param rect2 矩形2 + *@return 如果包含,返回YES,否则,返回NO + */ +UIKIT_EXTERN BOOL BMKMapRectContainsRect(BMKMapRect rect1, BMKMapRect rect2); + +/** + *判断两矩形是否相交 + *@param rect1 矩形1 + *@param rect2 矩形2 + *@return 如果相交,返回YES,否则,返回NO + */ +UIKIT_EXTERN BOOL BMKMapRectIntersectsRect(BMKMapRect rect1, BMKMapRect rect2); + +/** + *将投影后的直角坐标矩形转换为泳经纬度表示的范围 + *@param rect 待转换的直角坐标矩形 + *@return 转换后的经纬度范围 + */ +UIKIT_EXTERN BMKCoordinateRegion BMKCoordinateRegionForMapRect(BMKMapRect rect); + +/** + *判断指定的直角坐标矩形是否跨越了180度经线 + *@param rect 待判断的矩形 + *@return 如果跨越,返回YES,否则返回NO + */ +UIKIT_EXTERN BOOL BMKMapRectSpans180thMeridian(BMKMapRect rect); + +/** + *对于跨越了180经线的矩形,本函数将世界之外的部分进行分割,并将分割下来的矩形转换到地球对面,例如将-185度经线对应的区域转换到5度经线对应的区域,并将转换后的矩形返回 + *@param rect 待处理的矩形 + *@return 返回转换后的矩形 + */ +UIKIT_EXTERN BMKMapRect BMKMapRectRemainder(BMKMapRect rect); + +/** + *判断点是否在圆内 + *@param point 待判断的平面坐标点 + *@param center 目标圆形的中心点平面坐标 + *@param radius 目标圆形的半径,单位m + *@return 如果在内,返回YES,否则返回NO + */ +UIKIT_EXTERN BOOL BMKCircleContainsPoint(BMKMapPoint point, BMKMapPoint center, double radius); + +/** + *判断点是否在圆内 + *@param point 待判断的经纬度坐标点 + *@param center 目标圆形的中心点经纬度坐标 + *@param radius 目标圆形的半径,单位m + *@return 如果在内,返回YES,否则返回NO + */ +UIKIT_EXTERN BOOL BMKCircleContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D center, double radius); +/** + *判断点是否在多边形内 + *@param point 待判断的平面坐标点 + *@param polygon 目标多边形的顶点数组 + *@param count 目标多边形顶点数组元素个数 + *@return 如果在内,返回YES,否则返回NO + */ +UIKIT_EXTERN BOOL BMKPolygonContainsPoint(BMKMapPoint point, BMKMapPoint *polygon, NSUInteger count); + +/** + *判断点是否在多边形内 + *@param point 待判断的经纬度点 + *@param polygon 目标多边形的顶点数组 + *@param count 目标多边形顶点数组元素个数 + *@return 如果在内,返回YES,否则返回NO + */ +UIKIT_EXTERN BOOL BMKPolygonContainsCoordinate(CLLocationCoordinate2D point, CLLocationCoordinate2D *polygon, NSUInteger count); + +/** + *获取折线外某点到这线上距离最近的点 + *@param point 待判断的经纬度点 + *@param polyline 目标折线的顶点数组 + *@param count 目标折线顶点数组元素个数 + *@return 返回折线上的点(距离point最近) + */ +UIKIT_EXTERN BMKMapPoint BMKGetNearestMapPointFromPolyline(BMKMapPoint point, BMKMapPoint* polyline, NSUInteger count); + +/** + *计算地理矩形区域的面积 + *@param leftTop 左上角经纬度坐标点 + *@param rightBottom 右下角经纬度坐标点 + *@return 返回区域面积,单位:平方米 + */ +UIKIT_EXTERN double BMKAreaBetweenCoordinates(CLLocationCoordinate2D leftTop, CLLocationCoordinate2D rightBottom); + +/** + *坐标转换函数,从原始GPS坐标,mapbar坐标,google坐标,51地图坐标,mapabc坐标转换为百度坐标(51地图坐标需要显出10000) + *@param coordinate 待转换的坐标 + *@param type 待转换的坐标系类型,GPS为原始GPS坐标,COMMON为google坐标,51地图坐标,mapabc坐标 + *@return 返回的NSDictionry中包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标 + */ +UIKIT_EXTERN NSDictionary* BMKConvertBaiduCoorFrom(CLLocationCoordinate2D coordinate,BMK_COORD_TYPE type); +/** + *base64加密后的坐标字典解密函数 + *@param dictionary 带解密的NSDictionry,该NSDictionry中应包含“x”,“y”字段,各自对应经过base64加密之后的x,y坐标 + *@return 解密之后的坐标 + */ +UIKIT_EXTERN CLLocationCoordinate2D BMKCoorDictionaryDecode(NSDictionary* dictionary); + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKNavigation.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKNavigation.h new file mode 100644 index 0000000..5c45d21 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKNavigation.h @@ -0,0 +1,73 @@ +/* + * BMKNavigation.h + * BMapKit + * + * Copyright 2011 Baidu Inc. All rights reserved. + * + */ +#import +#import +//定义调起导航的两种类型 +//注:自2.8.0开始废弃,只支持调起客户端导航,在调起客户端导航时,才会调起web导航 +typedef enum +{ + BMK_NAVI_TYPE_NATIVE = 0,//客户端导航 + BMK_NAVI_TYPE_WEB,//web导航 +} BMK_NAVI_TYPE; + +///此类管理调起导航时传入的参数 +@interface BMKNaviPara : NSObject +{ + BMKPlanNode* _startPoint; + BMKPlanNode* _endPoint; + BMK_NAVI_TYPE _naviType; + NSString* _appScheme; + NSString* _appName; +} +///起点,必须包含经纬度坐标(调起地图客户端时设置起点无效,以“我的位置”为起点) +@property (nonatomic, strong) BMKPlanNode* startPoint; +///终点,必须包含经纬度坐标 +@property (nonatomic, strong) BMKPlanNode* endPoint; +///导航类型 注:自2.8.0开始废弃,只支持调起客户端导航,在调起客户端导航时,才会调起web导航 +@property (nonatomic, assign) BMK_NAVI_TYPE naviType __deprecated_msg("自2.8.0开始废弃"); +///应用返回scheme +@property (nonatomic, strong) NSString* appScheme; +///应用名称 +@property (nonatomic, strong) NSString* appName; +///调起百度地图客户端驾车导航失败后(步行、骑行导航设置该参数无效),是否支持调起web地图,默认:YES +@property (nonatomic, assign) BOOL isSupportWeb; + +@end + +///调起百度地图 -- 导航(驾车、步行、骑行) +@interface BMKNavigation : NSObject + +/** +*调起百度地图客户端驾车导航页面 +*@param para 调起驾车导航时传入得参数 +*/ ++ (BMKOpenErrorCode)openBaiduMapNavigation:(BMKNaviPara*)para; + +/** + *调起百度地图客户端步行导航页面(不支持调起web地图) + *客户端v8.8以后支持 + *@param para 调起步行导航时传入参数 + */ ++ (BMKOpenErrorCode)openBaiduMapWalkNavigation:(BMKNaviPara*)para; + +/** + *调起百度地图客户端骑行导航页面(不支持调起web地图) + *客户端v8.8以后支持 + *@param para 调起骑行导航时传入参数 + */ ++ (BMKOpenErrorCode)openBaiduMapRideNavigation:(BMKNaviPara*)para; +/** + *调起百度地图AR步行导航 + *百度地图客户端v9.7.5以后支持AR步行导航,低于此版本,默认调用步行导航;注:客户端版本低于8.6.9,不支持步行导航。 + *@param para 调起AR步行导航时传入参数 + */ ++ (BMKOpenErrorCode)openBaiduMapwalkARNavigation:(BMKNaviPara*)para; + +@end + + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenOption.h new file mode 100644 index 0000000..d1bc05f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenOption.h @@ -0,0 +1,23 @@ +// +// BMKOpenOption.h +// UtilsComponent +// +// Created by wzy on 15/3/26. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKOpenOption_h +#define UtilsComponent_BMKOpenOption_h + +///调起百度地图参数基类 +@interface BMKOpenOption : NSObject + +///应用返回scheme,用于调起后返回,没有不能返回 +@property (nonatomic, strong) NSString* appScheme; +///调起百度地图客户端失败后,是否支持调起web地图,默认:YES +@property (nonatomic, assign) BOOL isSupportWeb; + +@end + +#endif + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPanorama.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPanorama.h new file mode 100644 index 0000000..dba8a0b --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPanorama.h @@ -0,0 +1,46 @@ +// +// BMKOpenPanorama.h +// UtilsComponent +// +// Created by wzy on 16/5/12. +// Copyright © 2016年 baidu. All rights reserved. +// + +#ifndef BMKOpenPanorama_h +#define BMKOpenPanorama_h + +#import +#import "BMKOpenOption.h" + +@protocol BMKOpenPanoramaDelegate; + +///调起百度地图全景参数类 +@interface BMKOpenPanoramaOption : BMKOpenOption + +///poi的uid +@property (nonatomic, strong) NSString* poiUid; + +@end + +///调起百度地图 -- 全景 +@interface BMKOpenPanorama : NSObject + +@property (nonatomic, weak) id delegate; + +/** + * 调起百度地图全景页面 + * 异步,调起结果在BMKOpenPanoramaDelegate的onGetOpenPanoramaStatus:通知 + *@param option 调起百度地图全景参数类(BMKOpenPanoramaOption) + */ +- (void)openBaiduMapPanorama:(BMKOpenPanoramaOption *) option; + +@end + +///调起百度地图全景delegate,用于获取调起状态 +@protocol BMKOpenPanoramaDelegate + +- (void)onGetOpenPanoramaStatus:(BMKOpenErrorCode) ecode; + +@end + +#endif /* BMKOpenPanorama_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoi.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoi.h new file mode 100644 index 0000000..ea9c67f --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoi.h @@ -0,0 +1,37 @@ +// +// BMKOpenPoi.h +// UtilsComponent +// +// Created by wzy on 15/3/26. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKOpenPoi_h +#define UtilsComponent_BMKOpenPoi_h + +#import "BMKOpenPoiOption.h" +#import + +///调起百度地图 -- poi +///注:从iphone百度地图 8.2.0版本开始支持 +@interface BMKOpenPoi : NSObject + +/** + * 调起百度地图poi详情页面 + * 注:从iphone百度地图 8.2.0版本开始支持 + *@param option poi详情参数类(BMKOpenPoiDetailOption) + *@return 调起结果 + */ ++ (BMKOpenErrorCode)openBaiduMapPoiDetailPage:(BMKOpenPoiDetailOption *) option; + +/** + * 调起百度地图poi周边检索页面 + * 注:从iphone百度地图 8.2.0版本开始支持 + *@param option poi周边参数类(BMKOpenPoiNearbyOption) + *@return 调起结果 + */ ++ (BMKOpenErrorCode)openBaiduMapPoiNearbySearch:(BMKOpenPoiNearbyOption *) option; + +@end + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoiOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoiOption.h new file mode 100644 index 0000000..179e9ed --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoiOption.h @@ -0,0 +1,39 @@ +// +// BMKOpenPoiOption.h +// UtilsComponent +// +// Created by wzy on 15/3/26. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKOpenPoiOption_h +#define UtilsComponent_BMKOpenPoiOption_h + +#import +#import +#import "BMKOpenOption.h" + +///调起百度地图: poi详情参数类 +@interface BMKOpenPoiDetailOption : BMKOpenOption + +///poi的uid +@property (nonatomic, strong) NSString* poiUid; + +@end + + +///调起百度地图: poi周边参数类 +@interface BMKOpenPoiNearbyOption : BMKOpenOption + +///中心点(经纬度) +@property (nonatomic, assign) CLLocationCoordinate2D location; +///半径 +@property (nonatomic, assign) NSUInteger radius; +///关键词 +@property (nonatomic, strong) NSString* keyword; + +@end + + +#endif + diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRoute.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRoute.h new file mode 100644 index 0000000..ea80b58 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRoute.h @@ -0,0 +1,45 @@ +// +// BMKOpenRoute.h +// UtilsComponent +// +// Created by wzy on 15/3/26. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKOpenRoute_h +#define UtilsComponent_BMKOpenRoute_h +#import "BMKOpenRouteOption.h" +#import + +///调起百度地图 -- 路线 +///注:从iphone百度地图 8.2.0版本开始支持 +@interface BMKOpenRoute : NSObject + +/** + * 调起百度地图步行路线页面 + * 注:从iphone百度地图 8.2.0版本开始支持 + *@param option 步行路线参数类(BMKOpenWalkingRouteOption) + *@return 调起结果 + */ ++ (BMKOpenErrorCode)openBaiduMapWalkingRoute:(BMKOpenWalkingRouteOption *) option; + +/** + * 调起百度地图公交路线页面 + * 注:从iphone百度地图 8.2.0版本开始支持 + *@param option 公交路线参数类(BMKOpenTransitRouteOption) + *@return 调起结果 + */ ++ (BMKOpenErrorCode)openBaiduMapTransitRoute:(BMKOpenTransitRouteOption *) option; + +/** + * 调起百度地图驾车路线检索页面 + * 注:从iphone百度地图 8.2.0版本开始支持 + *@param option 驾车路线参数类(BMKOpenDrivingRouteOption) + *@return 调起结果 + */ ++ (BMKOpenErrorCode)openBaiduMapDrivingRoute:(BMKOpenDrivingRouteOption *) option; + +@end + + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRouteOption.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRouteOption.h new file mode 100644 index 0000000..05298ad --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRouteOption.h @@ -0,0 +1,54 @@ +// +// BMKOpenRouteOption.h +// UtilsComponent +// +// Created by wzy on 15/3/26. +// Copyright (c) 2015年 baidu. All rights reserved. +// + +#ifndef UtilsComponent_BMKOpenRouteOption_h +#define UtilsComponent_BMKOpenRouteOption_h + +#import +#import "BMKOpenOption.h" +#import + +typedef enum +{ + BMK_OPEN_TRANSIT_RECOMMAND = 3, //推荐 + BMK_OPEN_TRANSIT_TRANSFER_FIRST, //少换乘 + BMK_OPEN_TRANSIT_WALK_FIRST, //少步行 + BMK_OPEN_TRANSIT_NO_SUBWAY, //不坐地铁 + BMK_OPEN_TRANSIT_TIME_FIRST, //时间短 +}BMKOpenTransitPolicy; + +///此类管理调起百度地图路线时传入的参数 +@interface BMKOpenRouteOption : BMKOpenOption + +///起点 +@property (nonatomic, strong) BMKPlanNode *startPoint; +///终点 +@property (nonatomic, strong) BMKPlanNode *endPoint; + +@end + +///此类管理调起百度地图步行路线时传入的参数 +@interface BMKOpenWalkingRouteOption : BMKOpenRouteOption + +@end + +///此类管理调起百度地图驾车路线时传入的参数 +@interface BMKOpenDrivingRouteOption : BMKOpenRouteOption + +@end + +///此类管理调起百度地图公共交通路线时传入的参数 +@interface BMKOpenTransitRouteOption : BMKOpenRouteOption + +//策略,默认:BMK_OPEN_TRANSIT_RECOMMAND(异常值,强制使用BMK_OPEN_TRANSIT_RECOMMAND) +@property (nonatomic, assign) BMKOpenTransitPolicy openTransitPolicy; + +@end + + +#endif diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsComponent.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsComponent.h new file mode 100644 index 0000000..b4e3850 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsComponent.h @@ -0,0 +1,18 @@ +// +// BMKUtilsComponent.h +// baiduMapSdk +// +// Created by baidu on 14-4-22. +// Copyright (c) 2014年 baidu. All rights reserved. +// + + +#import "BMKGeometry.h" +#import "BMKNavigation.h" +#import "BMKOpenPoi.h" +#import "BMKOpenRoute.h" +#import "BMKOpenPoiOption.h" +#import "BMKOpenRouteOption.h" +#import "BMKFavPoiManager.h" +#import "BMKUtilsVersion.h" +#import "BMKOpenPanorama.h" \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsVersion.h b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsVersion.h new file mode 100644 index 0000000..239c6b7 --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsVersion.h @@ -0,0 +1,33 @@ +// +// BMKUtilsVersion.h +// UtilsComponent +// +// Created by wzy on 15/9/9. +// Copyright © 2015年 baidu. All rights reserved. +// + +#ifndef BMKUtilsVersion_h +#define BMKUtilsVersion_h + +#import + +/** + *重要: + *utils组件的版本和base组件的版本必须一致,否则不能正常使用 + */ + +/** + *获取当前地图API utils组件 的版本号 + *当前utils组件版本 : 3.3.2 + *return 返回当前API utils组件 的版本号 + */ +UIKIT_EXTERN NSString* BMKGetMapApiUtilsComponentVersion(); + +/** + *检查utils组件的版本号是否和base组件的版本号一致 + *return 版本号一致返回YES + */ +UIKIT_EXTERN BOOL BMKCheckUtilsComponentIsLegal(); + + +#endif /* BMKUtilsVersion_h */ diff --git a/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/readme.txt b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/readme.txt new file mode 100644 index 0000000..c52729e --- /dev/null +++ b/Pods/BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/readme.txt @@ -0,0 +1,52 @@ +计算工具:包括测距(两点之间距离)、坐标转换、调起百度地图等功能; + + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + + + 【 新 版 提 示 】 + 【 注 意 】 + 1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) + 添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + + 2、支持CocoaPods导入 + pod setup //更新CocoPods的本地库 + pod search BaiduMapKit //查看最新地图SDK + + 【 新 增 】 + 【 优 化 】 + 1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + \ No newline at end of file diff --git a/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libcrypto.a b/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libcrypto.a new file mode 100644 index 0000000..481302a Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libcrypto.a differ diff --git a/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libssl.a b/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libssl.a new file mode 100644 index 0000000..8a0b78d Binary files /dev/null and b/Pods/BaiduMapKit/BaiduMapKit/thirdlibs/libssl.a differ diff --git a/Pods/BaiduMapKit/LICENSE b/Pods/BaiduMapKit/LICENSE new file mode 100644 index 0000000..c0eab97 --- /dev/null +++ b/Pods/BaiduMapKit/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/Pods/BaiduMapKit/README.md b/Pods/BaiduMapKit/README.md new file mode 100644 index 0000000..6ac51bc --- /dev/null +++ b/Pods/BaiduMapKit/README.md @@ -0,0 +1,54 @@ +# BaiduMapKit + +百度地图 iOS SDK(官方) + + + +-------------------------------------------------------------------------------------- + +iOS 地图 SDK v3.3.2是适用于iOS系统移动设备的矢量地图开发包 + +-------------------------------------------------------------------------------------- + +地图SDK功能介绍(全功能开发包): + +地图:提供地图展示和地图操作功能; + +POI检索:支持周边检索、区域检索和城市内兴趣点检索; + +地理编码:提供经纬度和地址信息相互转化的功能接口; + +线路规划:支持公交、驾车、步行三种方式的线路规划; + +覆盖物图层:支持在地图上添加覆盖物(标注、几何图形、热力图、地形图图层等),展示更丰富的LBS信息; + +定位:获取当前位置信息,并在地图上展示(支持普通、跟随、罗盘三种模式); + +离线地图:使用离线地图可节省用户流量,提供更好的地图展示效果; + +调启百度地图:利用SDK接口,直接在本地打开百度地图客户端或WebApp,实现地图功能; + +周边雷达:利用周边雷达功能,开发者可在App内低成本、快速实现查找周边使用相同App的用户位置的功能; + +LBS云检索:支持查询存储在LBS云内的自有数据; + +特色功能:提供短串分享、Place详情检索、热力图等特色功能,帮助开发者搭建功能更加强大的应用; + + +-------------------------------------------------------------------------------------- + +【 新 版 提 示 】 +【 注 意 】 +1、自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(存放于thirdlib目录下) +添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。 + +2、支持CocoaPods导入 +pod setup //更新CocoPods的本地库 +pod search BaiduMapKit //查看最新地图SDK + +【 新 增 】 +【 优 化 】 +1.修复个性化地图在部分使用场景下,不显示的问题。(受影响版本v3.3.0、v3.3.1) + + + diff --git a/Pods/BlocksKit/BlocksKit/BlocksKit+MessageUI.h b/Pods/BlocksKit/BlocksKit/BlocksKit+MessageUI.h deleted file mode 100644 index c5ca859..0000000 --- a/Pods/BlocksKit/BlocksKit/BlocksKit+MessageUI.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// BlocksKit+MessageUI -// -// The Objective-C block utilities you always wish you had. -// -// Copyright (c) 2011-2012, 2013-2014 Zachary Waldowski -// Copyright (c) 2012-2013 Pandamonia LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -#import -#import diff --git a/Pods/BlocksKit/BlocksKit/BlocksKit+UIKit.h b/Pods/BlocksKit/BlocksKit/BlocksKit+UIKit.h deleted file mode 100644 index 0b19513..0000000 --- a/Pods/BlocksKit/BlocksKit/BlocksKit+UIKit.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// BlocksKit+UIKit -// -// The Objective-C block utilities you always wish you had. -// -// Copyright (c) 2011-2012, 2013-2014 Zachary Waldowski -// Copyright (c) 2012-2013 Pandamonia LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Pods/BlocksKit/BlocksKit/BlocksKit.h b/Pods/BlocksKit/BlocksKit/BlocksKit.h deleted file mode 100644 index c22cbec..0000000 --- a/Pods/BlocksKit/BlocksKit/BlocksKit.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// BlocksKit -// -// The Objective-C block utilities you always wish you had. -// -// Copyright (c) 2011-2012, 2013-2014 Zachary Waldowski -// Copyright (c) 2012-2013 Pandamonia LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. -// - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Pods/BlocksKit/BlocksKit/Core/BKMacros.h b/Pods/BlocksKit/BlocksKit/Core/BKMacros.h deleted file mode 100644 index ae5ff8e..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/BKMacros.h +++ /dev/null @@ -1,97 +0,0 @@ -// -// BKMacros.h -// BlocksKit -// -// Includes code by Michael Ash. . -// - -#import "NSArray+BlocksKit.h" -#import "NSSet+BlocksKit.h" -#import "NSDictionary+BlocksKit.h" -#import "NSIndexSet+BlocksKit.h" - -#ifndef __BLOCKSKIT_MACROS__ -#define __BLOCKSKIT_MACROS__ - -#define __BK_EACH_WRAPPER(...) (^{ __block CFMutableDictionaryRef BK_eachTable = nil; \ - (void)BK_eachTable; \ - __typeof__(__VA_ARGS__) BK_retval = __VA_ARGS__; \ - if(BK_eachTable) \ - CFRelease(BK_eachTable); \ - return BK_retval; \ - }()) - -#define __BK_EACH_WRAPPER_VOID(...) (^{ __block CFMutableDictionaryRef BK_eachTable = nil; \ - (void)BK_eachTable; \ - __VA_ARGS__; \ - if(BK_eachTable) \ - CFRelease(BK_eachTable); \ - }()) - -#define BK_EACH(collection, ...) __BK_EACH_WRAPPER_VOID([collection bk_each:^(id obj) { __VA_ARGS__ }]) -#define BK_MAP(collection, ...) __BK_EACH_WRAPPER([collection bk_map:^id(id obj) { return (__VA_ARGS__); }]) -#define BK_SELECT(collection, ...) __BK_EACH_WRAPPER([collection bk_select: ^BOOL (id obj) { return (__VA_ARGS__) != 0; }]) -#define BK_REJECT(collection, ...) __BK_EACH_WRAPPER([collection bk_select: ^BOOL (id obj) { return (__VA_ARGS__) == 0; }]) -#define BK_MATCH(collection, ...) __BK_EACH_WRAPPER([collection bk_match: ^BOOL (id obj) { return (__VA_ARGS__) != 0; }]) -#define BK_REDUCE(collection, initial, ...) __BK_EACH_WRAPPER([collection bk_reduce: (initial) withBlock: ^id (id a, id b) { return (__VA_ARGS__); }]) - -// BK_APPLY is not wrapped, because we don't guarantee that the order matches the current collection during parallel execution. -#define BK_APPLY(collection, ...) [collection bk_apply:^(id obj) { __VA_ARGS__ }] - -static inline id BKNextHelper(NSArray *array, CFMutableDictionaryRef *eachTablePtr) { - - if (!*eachTablePtr) { - CFDictionaryKeyCallBacks keycb = { - 0, - kCFTypeDictionaryKeyCallBacks.retain, - kCFTypeDictionaryKeyCallBacks.release, - kCFTypeDictionaryKeyCallBacks.copyDescription, - NULL, - NULL - }; - *eachTablePtr = CFDictionaryCreateMutable(NULL, 0, &keycb, &kCFTypeDictionaryValueCallBacks); - } - - NSEnumerator *enumerator = (__bridge id)CFDictionaryGetValue(*eachTablePtr, (__bridge CFArrayRef)array); - if (!enumerator) { - enumerator = [array objectEnumerator]; - CFDictionarySetValue(*eachTablePtr, (__bridge CFArrayRef)array, (__bridge void *)enumerator); - } - return [enumerator nextObject]; -} - -#define BK_NEXT(array) BKNextHelper(array, &BK_eachTable) - -#ifndef EACH -#define EACH BK_EACH -#endif - -#ifndef APPLY -#define APPLY BK_APPLY -#endif - -#ifndef MAP -#define MAP BK_MAP -#endif - -#ifndef SELECT -#define SELECT BK_SELECT -#endif - -#ifndef REJECT -#define REJECT BK_REJECT -#endif - -#ifndef MATCH -#define MATCH BK_MATCH -#endif - -#ifndef REDUCE -#define REDUCE BK_REDUCE -#endif - -#ifndef NEXT -#define NEXT BK_NEXT -#endif - -#endif \ No newline at end of file diff --git a/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.h deleted file mode 100644 index e2296dd..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.h +++ /dev/null @@ -1,213 +0,0 @@ -// -// NSArray+BlocksKit.h -// BlocksKit -// - -#import -#import - -/** Block extensions for NSArray. - - Both inspired by and resembling Smalltalk syntax, these utilities - allows for iteration of an array in a concise way that - saves quite a bit of boilerplate code for filtering or finding - objects or an object. - - Includes code by the following: - -- [Robin Lu](https://github.com/robin) -- [Michael Ash](https://github.com/mikeash) -- [Aleks Nesterow](https://github.com/nesterow) -- [Zach Waldowski](https://github.com/zwaldowski) - - @see NSDictionary(BlocksKit) - @see NSSet(BlocksKit) - */ -@interface NSArray (BlocksKit) - -/** Loops through an array and executes the given block with each object. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_each:(void (^)(id obj))block; - -/** Enumerates through an array concurrently and executes - the given block once for each object. - - Enumeration will occur on appropriate background queues. This - will have a noticeable speed increase, especially on dual-core - devices, but you *must* be aware of the thread safety of the - objects you message from within the block. Be aware that the - order of objects is not necessarily the order each block will - be called in. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_apply:(void (^)(id obj))block; - -/** Loops through an array to find the object matching the block. - - bk_match: is functionally identical to bk_select:, but will stop and return - on the first match. - - @param block A single-argument, `BOOL`-returning code block. - @return Returns the object, if found, or `nil`. - @see bk_select: - */ -- (id)bk_match:(BOOL (^)(id obj))block; - -/** Loops through an array to find the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @return Returns an array of the objects found. - @see bk_match: - */ -- (NSArray *)bk_select:(BOOL (^)(id obj))block; - -/** Loops through an array to find the objects not matching the block. - - This selector performs *literally* the exact same function as bk_select: but in reverse. - - This is useful, as one may expect, for removing objects from an array. - NSArray *new = [computers bk_reject:^BOOL(id obj) { - return ([obj isUgly]); - }]; - - @param block A single-argument, BOOL-returning code block. - @return Returns an array of all objects not found. - */ -- (NSArray *)bk_reject:(BOOL (^)(id obj))block; - -/** Call the block once for each object and create an array of the return values. - - This is sometimes referred to as a transform, mutating one of each object: - NSArray *new = [stringArray bk_map:^id(id obj) { - return [obj stringByAppendingString:@".png"]); - }]; - - @param block A single-argument, object-returning code block. - @return Returns an array of the objects returned by the block. - */ -- (NSArray *)bk_map:(id (^)(id obj))block; - -/** Arbitrarily accumulate objects using a block. - - The concept of this selector is difficult to illustrate in words. The sum can - be any NSObject, including (but not limited to) a string, number, or value. - - For example, you can concentate the strings in an array: - NSString *concentrated = [stringArray bk_reduce:@"" withBlock:^id(id sum, id obj) { - return [sum stringByAppendingString:obj]; - }]; - - You can also do something like summing the lengths of strings in an array: - NSUInteger value = [[[stringArray bk_reduce:nil withBlock:^id(id sum, id obj) { - return @([sum integerValue] + obj.length); - }]] unsignedIntegerValue]; - - @param initial The value of the reduction at its start. - @param block A block that takes the current sum and the next object to return the new sum. - @return An accumulated value. - */ -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block; - -/** - Sometimes we just want to loop an objects list and reduce one property, where - each result is a primitive type. - - For example, say we want to calculate the total age of a list of people. - - Code without using block will be something like: - - NSArray *peoples = @[p1, p2, p3]; - NSInteger totalAge = 0; - for (People *people in peoples) { - totalAge += [people age]; - } - - We can use a block to make it simpler: - - NSArray *peoples = @[p1, p2, p3]; - NSInteger totalAge = [peoples reduceInteger:0 withBlock:^(NSInteger result, id obj, NSInteger index) { - return result + [obj age]; - }]; - - */ -- (NSInteger)bk_reduceInteger:(NSInteger)initial withBlock:(NSInteger(^)(NSInteger result, id obj))block; - -/** - Sometimes we just want to loop an objects list and reduce one property, where - each result is a primitive type. - - For instance, say we want to caculate the total balance from a list of people. - - Code without using a block will be something like: - - NSArray *peoples = @[p1, p2, p3]; - CGFloat totalBalance = 0; - for (People *people in peoples) { - totalBalance += [people balance]; - } - - We can use a block to make it simpler: - - NSArray *peoples = @[p1, p2, p3]; - CGFloat totalBalance = [peoples reduceFloat:.0f WithBlock:^CGFloat(CGFloat result, id obj, NSInteger index) { - return result + [obj balance]; - }]; - - */ - -- (CGFloat)bk_reduceFloat:(CGFloat)inital withBlock:(CGFloat(^)(CGFloat result, id obj))block; - -/** Loops through an array to find whether any object matches the block. - - This method is similar to the Scala list `exists`. It is functionally - identical to bk_match: but returns a `BOOL` instead. It is not recommended - to use bk_any: as a check condition before executing bk_match:, since it would - require two loops through the array. - - For example, you can find if a string in an array starts with a certain letter: - - NSString *letter = @"A"; - BOOL containsLetter = [stringArray bk_any:^(id obj) { - return [obj hasPrefix:@"A"]; - }]; - - @param block A single-argument, BOOL-returning code block. - @return YES for the first time the block returns YES for an object, NO otherwise. - */ -- (BOOL)bk_any:(BOOL (^)(id obj))block; - -/** Loops through an array to find whether no objects match the block. - - This selector performs *literally* the exact same function as bk_all: but in reverse. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns NO for all objects in the array, NO otherwise. - */ -- (BOOL)bk_none:(BOOL (^)(id obj))block; - -/** Loops through an array to find whether all objects match the block. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns YES for all objects in the array, NO otherwise. - */ -- (BOOL)bk_all:(BOOL (^)(id obj))block; - -/** Tests whether every element of this array relates to the corresponding element of another array according to match by block. - - For example, finding if a list of numbers corresponds to their sequenced string values; - NSArray *numbers = @[ @(1), @(2), @(3) ]; - NSArray *letters = @[ @"1", @"2", @"3" ]; - BOOL doesCorrespond = [numbers bk_corresponds:letters withBlock:^(id number, id letter) { - return [[number stringValue] isEqualToString:letter]; - }]; - - @param list An array of objects to compare with. - @param block A two-argument, BOOL-returning code block. - @return Returns a BOOL, true if every element of array relates to corresponding element in another array. - */ -- (BOOL)bk_corresponds:(NSArray *)list withBlock:(BOOL (^)(id obj1, id obj2))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.m deleted file mode 100644 index 5e51b86..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSArray+BlocksKit.m +++ /dev/null @@ -1,156 +0,0 @@ -// -// NSArray+BlocksKit.m -// BlocksKit -// - -#import "NSArray+BlocksKit.h" - -@implementation NSArray (BlocksKit) - -- (void)bk_each:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - block(obj); - }]; -} - -- (void)bk_apply:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - block(obj); - }]; -} - -- (id)bk_match:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSUInteger index = [self indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return block(obj); - }]; - - if (index == NSNotFound) - return nil; - - return self[index]; -} - -- (NSArray *)bk_select:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - return [self objectsAtIndexes:[self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return block(obj); - }]]; -} - -- (NSArray *)bk_reject:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - return [self bk_select:^BOOL(id obj) { - return !block(obj); - }]; -} - -- (NSArray *)bk_map:(id (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count]; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - id value = block(obj) ?: [NSNull null]; - [result addObject:value]; - }]; - - return result; -} - -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block -{ - NSParameterAssert(block != nil); - - __block id result = initial; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - result = block(result, obj); - }]; - - return result; -} - -- (NSInteger)bk_reduceInteger:(NSInteger)initial withBlock:(NSInteger (^)(NSInteger, id))block -{ - NSParameterAssert(block != nil); - - __block NSInteger result = initial; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - result = block(result, obj); - }]; - - return result; -} - -- (CGFloat)bk_reduceFloat:(CGFloat)inital withBlock:(CGFloat (^)(CGFloat, id))block -{ - NSParameterAssert(block != nil); - - __block CGFloat result = inital; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - result = block(result, obj); - }]; - - return result; -} - -- (BOOL)bk_any:(BOOL (^)(id obj))block -{ - return [self bk_match:block] != nil; -} - -- (BOOL)bk_none:(BOOL (^)(id obj))block -{ - return [self bk_match:block] == nil; -} - -- (BOOL)bk_all:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = YES; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if (!block(obj)) { - result = NO; - *stop = YES; - } - }]; - - return result; -} - -- (BOOL)bk_corresponds:(NSArray *)list withBlock:(BOOL (^)(id obj1, id obj2))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = NO; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if (idx < list.count) { - id obj2 = list[idx]; - result = block(obj, obj2); - } else { - result = NO; - } - *stop = !result; - }]; - - return result; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.h deleted file mode 100644 index 6e78b1f..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.h +++ /dev/null @@ -1,110 +0,0 @@ -// -// NSDictionary+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extension for NSDictionary. - - Both inspired by and resembling Smalltalk syntax, this utility - allows iteration of a dictionary in a concise way that - saves quite a bit of boilerplate code. - - Includes code by the following: - -- [Mirko Kiefer](https://github.com/mirkok) -- [Zach Waldowski](https://github.com/zwaldowski) - - @see NSArray(BlocksKit) - @see NSSet(BlocksKit) - */ -@interface NSDictionary (BlocksKit) - -/** Loops through the dictionary and executes the given block using each item. - - @param block A block that performs an action using a key/value pair. - */ -- (void)bk_each:(void (^)(id key, id obj))block; - -/** Enumerates through the dictionary concurrently and executes - the given block once for each pair. - - Enumeration will occur on appropriate background queues; - the system will spawn threads as need for execution. This - will have a noticeable speed increase, especially on dual-core - devices, but you *must* be aware of the thread safety of the - objects you message from within the block. - - @param block A block that performs an action using a key/value pair. - */ -- (void)bk_apply:(void (^)(id key, id obj))block; - -/** Loops through a dictionary to find the first key/value pair matching the block. - - bk_match: is functionally identical to bk_select:, but will stop and return - the value on the first match. - - @param block A BOOL-returning code block for a key/value pair. - @return The value of the first pair found; - */ -- (id)bk_match:(BOOL (^)(id key, id obj))block; - -/** Loops through a dictionary to find the key/value pairs matching the block. - - @param block A BOOL-returning code block for a key/value pair. - @return Returns a dictionary of the objects found. - */ -- (NSDictionary *)bk_select:(BOOL (^)(id key, id obj))block; - -/** Loops through a dictionary to find the key/value pairs not matching the block. - - This selector performs *literally* the exact same function as bk_select: but in reverse. - - This is useful, as one may expect, for filtering objects. - NSDictionary *strings = [userData bk_reject:^BOOL(id key, id value) { - return ([obj isKindOfClass:[NSString class]]); - }]; - - @param block A BOOL-returning code block for a key/value pair. - @return Returns a dictionary of all objects not found. - */ -- (NSDictionary *)bk_reject:(BOOL (^)(id key, id obj))block; - -/** Call the block once for each object and create a dictionary with the same keys - and a new set of values. - - @param block A block that returns a new value for a key/value pair. - @return Returns a dictionary of the objects returned by the block. - */ -- (NSDictionary *)bk_map:(id (^)(id key, id obj))block; - -/** Loops through a dictionary to find whether any key/value pair matches the block. - - This method is similar to the Scala list `exists`. It is functionally - identical to bk_match: but returns a `BOOL` instead. It is not recommended - to use bk_any: as a check condition before executing bk_match:, since it would - require two loops through the dictionary. - - @param block A two-argument, BOOL-returning code block. - @return YES for the first time the block returns YES for a key/value pair, NO otherwise. - */ -- (BOOL)bk_any:(BOOL (^)(id key, id obj))block; - -/** Loops through a dictionary to find whether no key/value pairs match the block. - - This selector performs *literally* the exact same function as bk_all: but in reverse. - - @param block A two-argument, BOOL-returning code block. - @return YES if the block returns NO for all key/value pairs in the dictionary, NO otherwise. - */ -- (BOOL)bk_none:(BOOL (^)(id key, id obj))block; - -/** Loops through a dictionary to find whether all key/value pairs match the block. - - @param block A two-argument, BOOL-returning code block. - @return YES if the block returns YES for all key/value pairs in the dictionary, NO otherwise. - */ -- (BOOL)bk_all:(BOOL (^)(id key, id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.m deleted file mode 100644 index 298546d..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.m +++ /dev/null @@ -1,102 +0,0 @@ -// -// NSDictionary+BlocksKit.m -// BlocksKit -// - -#import "NSDictionary+BlocksKit.h" - -@implementation NSDictionary (BlocksKit) - -- (void)bk_each:(void (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - block(key, obj); - }]; -} - -- (void)bk_apply:(void (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, id obj, BOOL *stop) { - block(key, obj); - }]; -} - -- (id)bk_match:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - return self[[[self keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) { - if (block(key, obj)) { - *stop = YES; - return YES; - } - - return NO; - }] anyObject]]; -} - -- (NSDictionary *)bk_select:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - NSArray *keys = [[self keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) { - return block(key, obj); - }] allObjects]; - - NSArray *objects = [self objectsForKeys:keys notFoundMarker:[NSNull null]]; - return [NSDictionary dictionaryWithObjects:objects forKeys:keys]; -} - -- (NSDictionary *)bk_reject:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - return [self bk_select:^BOOL(id key, id obj) { - return !block(key, obj); - }]; -} - -- (NSDictionary *)bk_map:(id (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - NSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:self.count]; - - [self bk_each:^(id key, id obj) { - id value = block(key, obj) ?: [NSNull null]; - result[key] = value; - }]; - - return result; -} - -- (BOOL)bk_any:(BOOL (^)(id key, id obj))block -{ - return [self bk_match:block] != nil; -} - -- (BOOL)bk_none:(BOOL (^)(id key, id obj))block -{ - return [self bk_match:block] == nil; -} - -- (BOOL)bk_all:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = YES; - - [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - if (!block(key, obj)) { - result = NO; - *stop = YES; - } - }]; - - return result; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.h deleted file mode 100644 index e730851..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.h +++ /dev/null @@ -1,119 +0,0 @@ -// -// NSIndexSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSIndexSet. - - Both inspired by and resembling Smalltalk syntax, these utilities - allows for iteration of an array in a concise way that - saves quite a bit of boilerplate code for filtering or finding - objects or an object. - - Includes code by the following: - -- [Robin Lu](https://github.com/robin) -- [Michael Ash](https://github.com/mikeash) -- [Zach Waldowski](https://github.com/zwaldowski) -- [Kaelin Colclasure] - - @see NSArray(BlocksKit) - @see NSDictionary(BlocksKit) - @see NSSet(BlocksKit) - */ -@interface NSIndexSet (BlocksKit) - -/** Loops through an index set and executes the given block at each index. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_each:(void (^)(NSUInteger index))block; - -/** Enumerates each index in an index set concurrently and executes the - given block once per index. - - Enumeration will occur on appropriate background queues. - Be aware that the block will not necessarily be executed - in order for each index. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_apply:(void (^)(NSUInteger index))block; - -/** Loops through an array and returns the index matching the block. - - @param block A single-argument, `BOOL`-returning code block. - @return Returns the index if found, `NSNotFound` otherwise. - @see bk_select: - */ -- (NSUInteger)bk_match:(BOOL (^)(NSUInteger index))block; - -/** Loops through an index set and returns an all indexes matching the block. - - @param block A single-argument, BOOL-returning code block. - @return Returns an index set of matching indexes found. - @see bk_match: - */ -- (NSIndexSet *)bk_select:(BOOL (^)(NSUInteger index))block; - -/** Loops through an index set and returns an all indexes but the ones matching the block. - - This selector performs *literally* the exact same function as bk_select: but in reverse. - - @param block A single-argument, BOOL-returning code block. - @return Returns an index set of all indexes but those matched. - */ -- (NSIndexSet *)bk_reject:(BOOL (^)(NSUInteger index))block; - -/** Call the block once for each index and create an index set with the new values. - - @param block A block that returns a new index for an index. - @return An index set of the indexes returned by the block. - */ -- (NSIndexSet *)bk_map:(NSUInteger (^)(NSUInteger index))block; - -/** Call the block once for each index and create an array of the return values. - - This method allows transforming indexes into objects: - int values[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }; - NSIndexSet *idxs = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)]; - NSArray *new = [idxs mapIndex:^id(NSUInteger index) { - return [NSNumber numberWithInt:values[index]]); - }]; - - @param block A block that returns an object for an index. - @return Returns an array of the objects returned by the block. - */ -- (NSArray *)bk_mapIndex:(id (^)(NSUInteger index))block; - -/** Loops through an index set to find whether any of the indexes matche the block. - - This method is similar to the Scala list `exists`. It is functionally - identical to bk_match: but returns a `BOOL` instead. It is not recommended - to use bk_any: as a check condition before executing bk_match:, since it would - require two loops through the index set. - - @param block A single-argument, BOOL-returning code block. - @return YES for the first time the block returns YES for an index, NO otherwise. - */ -- (BOOL)bk_any:(BOOL (^)(NSUInteger index))block; - -/** Loops through an index set to find whether all objects match the block. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns YES for all indexes in the array, NO otherwise. - */ -- (BOOL)bk_all:(BOOL (^)(NSUInteger index))block; - -/** Loops through an index set to find whether no objects match the block. - - This selector performs *literally* the exact same function as bk_all: but in reverse. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns NO for all indexes in the array, NO otherwise. - */ -- (BOOL)bk_none:(BOOL (^)(NSUInteger index))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.m deleted file mode 100644 index 14139c8..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.m +++ /dev/null @@ -1,101 +0,0 @@ -// -// NSIndexSet+BlocksKit.m -// BlocksKit -// - -#import "NSIndexSet+BlocksKit.h" - -@implementation NSIndexSet (BlocksKit) - -- (void)bk_each:(void (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - block(idx); - }]; -} - -- (void)bk_apply:(void (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - [self enumerateIndexesWithOptions:NSEnumerationConcurrent usingBlock:^(NSUInteger idx, BOOL *stop) { - block(idx); - }]; -} - -- (NSUInteger)bk_match:(BOOL (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - return [self indexPassingTest:^BOOL(NSUInteger idx, BOOL *stop) { - return block(idx); - }]; -} - -- (NSIndexSet *)bk_select:(BOOL (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - NSIndexSet *list = [self indexesPassingTest:^BOOL(NSUInteger idx, BOOL *stop) { - return block(idx); - }]; - - if (!list.count) return nil; - return list; -} - -- (NSIndexSet *)bk_reject:(BOOL (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - return [self bk_select:^BOOL(NSUInteger idx) { - return !block(idx); - }]; -} - -- (NSIndexSet *)bk_map:(NSUInteger (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - NSMutableIndexSet *list = [NSMutableIndexSet indexSet]; - - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - [list addIndex:block(idx)]; - }]; - - if (!list.count) return nil; - return list; -} - -- (NSArray *)bk_mapIndex:(id (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - NSMutableArray *result = [NSMutableArray arrayWithCapacity:self.count]; - - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - id value = block(idx) ?: [NSNull null]; - [result addObject:value]; - }]; - - return result; -} - -- (BOOL)bk_any:(BOOL (^)(NSUInteger index))block { - return [self bk_match:block] != NSNotFound; -} - -- (BOOL)bk_none:(BOOL (^)(NSUInteger index))block { - return [self bk_match:block] == NSNotFound; -} - -- (BOOL)bk_all:(BOOL (^)(NSUInteger index))block { - NSParameterAssert(block != nil); - - __block BOOL result = YES; - - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - if (!block(idx)) { - result = NO; - *stop = YES; - } - }]; - - return result; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.h deleted file mode 100644 index e4a1bf6..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// NSInvocation+BlocksKit.h -// BlocksKit -// - -#import - -/** BlocksKit extensions for NSInvocation. */ -@interface NSInvocation (BlocksKit) - -/** Generates a forwarding `NSInvocation` instance for a given method call - encapsulated by the given block. - - NSInvocation *invocation = [NSInvocation invocationWithTarget:target block:^(id myObject) { - [myObject someMethodWithArg:42.0]; - }]; - - This returns an invocation with the appropriate target, selector, and arguments - without creating the buffers yourself. It is only recommended to call a method - on the argument to the block only once. More complicated forwarding machinery - can be accomplished by the A2DynamicDelegate family of classes included in - BlocksKit. - - Created by [Jonathan Rentzch](https://github.com/rentzsch) as - `NSInvocation-blocks`. - - @param target The object to "grab" the block invocation from. - @param block A code block. - @return A fully-prepared instance of NSInvocation ready to be invoked. - */ -+ (NSInvocation *)bk_invocationWithTarget:(id)target block:(void (^)(id target))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.m deleted file mode 100644 index 4471ed7..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.m +++ /dev/null @@ -1,48 +0,0 @@ -// -// NSInvocation+BlocksKit.m -// BlocksKit -// - -#import "NSInvocation+BlocksKit.h" - -@interface BKInvocationGrabber : NSProxy - -+ (BKInvocationGrabber *)grabberWithTarget:(id)target; - -@property (nonatomic, strong) id target; -@property (nonatomic, strong) NSInvocation *invocation; - -@end - -@implementation BKInvocationGrabber - -+ (BKInvocationGrabber *)grabberWithTarget:(id)target { - BKInvocationGrabber *instance = [BKInvocationGrabber alloc]; - instance.target = target; - return instance; -} - -- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector { - return [self.target methodSignatureForSelector:selector]; -} - -- (void)forwardInvocation:(NSInvocation*)invocation { - [invocation setTarget:self.target]; - NSParameterAssert(self.invocation == nil); - self.invocation = invocation; -} - -@end - - -@implementation NSInvocation (BlocksKit) - -+ (NSInvocation *)bk_invocationWithTarget:(id)target block:(void (^)(id target))block -{ - NSParameterAssert(block != nil); - BKInvocationGrabber *grabber = [BKInvocationGrabber grabberWithTarget:target]; - block(grabber); - return grabber.invocation; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.h deleted file mode 100644 index 13bec3b..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// NSMutableArray+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSMutableArray. - - These utilities expound upon the BlocksKit additions to the immutable - superclass by allowing certain utilities to work on an instance of the mutable - class, saving memory by not creating an immutable copy of the results. - - Includes code by the following: - - - [Martin Schürrer](https://github.com/MSch) - - [Zach Waldowski](https://github.com/zwaldowski) - - @see NSArray(BlocksKit) - */ -@interface NSMutableArray (BlocksKit) - -/** Filters a mutable array to the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @see bk_reject: - */ -- (void)bk_performSelect:(BOOL (^)(id obj))block; - -/** Filters a mutable array to all objects but the ones matching the block, - the logical inverse to bk_select:. - - @param block A single-argument, BOOL-returning code block. - @see bk_select: - */ -- (void)bk_performReject:(BOOL (^)(id obj))block; - -/** Transform the objects in the array to the results of the block. - - This is sometimes referred to as a transform, mutating one of each object: - [foo bk_performMap:^id(id obj) { - return [dateTransformer dateFromString:obj]; - }]; - - @param block A single-argument, object-returning code block. - @see bk_map: - */ -- (void)bk_performMap:(id (^)(id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.m deleted file mode 100644 index 4bd3013..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.m +++ /dev/null @@ -1,42 +0,0 @@ -// -// NSMutableArray+BlocksKit.m -// BlocksKit -// - -#import "NSMutableArray+BlocksKit.h" - -@implementation NSMutableArray (BlocksKit) - -- (void)bk_performSelect:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - - NSIndexSet *list = [self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return !block(obj); - }]; - - if (!list.count) return; - [self removeObjectsAtIndexes:list]; -} - -- (void)bk_performReject:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - return [self bk_performSelect:^BOOL(id obj) { - return !block(obj); - }]; -} - -- (void)bk_performMap:(id (^)(id obj))block { - NSParameterAssert(block != nil); - - NSMutableArray *new = [self mutableCopy]; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - id value = block(obj) ?: [NSNull null]; - if ([value isEqual:obj]) return; - new[idx] = value; - }]; - - [self setArray:new]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.h deleted file mode 100644 index 19428c1..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// NSMutableDictionary+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSMutableDictionary. - - These utilities expound upon the BlocksKit additions to the immutable - superclass by allowing certain utilities to work on an instance of the mutable - class, saving memory by not creating an immutable copy of the results. - - Includes code by the following: - - - [Martin Schürrer](https://github.com/MSch) - - [Zach Waldowski](https://github.com/zwaldowski) - - @see NSDictionary(BlocksKit) - */ -@interface NSMutableDictionary (BlocksKit) - -/** Filters a mutable dictionary to the key/value pairs matching the block. - - @param block A BOOL-returning code block for a key/value pair. - @see bk_reject: - */ -- (void)bk_performSelect:(BOOL (^)(id key, id obj))block; - -/** Filters a mutable dictionary to the key/value pairs not matching the block, - the logical inverse to bk_select:. - - @param block A BOOL-returning code block for a key/value pair. - @see bk_select: - */ -- (void)bk_performReject:(BOOL (^)(id key, id obj))block; - -/** Transform each value of the dictionary to a new value, as returned by the - block. - - @param block A block that returns a new value for a given key/value pair. - @see bk_map: - */ -- (void)bk_performMap:(id (^)(id key, id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.m deleted file mode 100644 index 9207b00..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// NSMutableDictionary+BlocksKit.m -// BlocksKit -// - -#import "NSMutableDictionary+BlocksKit.h" - -@implementation NSMutableDictionary (BlocksKit) - -- (void)bk_performSelect:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - NSArray *keys = [[self keysOfEntriesWithOptions:NSEnumerationConcurrent passingTest:^BOOL(id key, id obj, BOOL *stop) { - return !block(key, obj); - }] allObjects]; - - [self removeObjectsForKeys:keys]; -} - -- (void)bk_performReject:(BOOL (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - [self bk_performSelect:^BOOL(id key, id obj) { - return !block(key, obj); - }]; -} - -- (void)bk_performMap:(id (^)(id key, id obj))block -{ - NSParameterAssert(block != nil); - - NSMutableDictionary *new = [self mutableCopy]; - - [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { - id value = block(key, obj) ?: [NSNull null]; - if ([value isEqual:obj]) return; - new[key] = value; - }]; - - [self setDictionary:new]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.h deleted file mode 100644 index a9131b0..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// NSMutableIndexSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSMutableIndexSet. - - These utilities expound upon the BlocksKit additions to the immutable - superclass by allowing certain utilities to work on an instance of the mutable - class, saving memory by not creating an immutable copy of the results. - - @see NSIndexSet(BlocksKit) - */ -@interface NSMutableIndexSet (BlocksKit) - -/** Filters a mutable index set to the indexes matching the block. - - @param block A single-argument, BOOL-returning code block. - @see bk_reject: - */ -- (void)bk_performSelect:(BOOL (^)(NSUInteger index))block; - -/** Filters a mutable index set to all indexes but the ones matching the block, - the logical inverse to bk_select:. - - @param block A single-argument, BOOL-returning code block. - @see bk_select: - */ -- (void)bk_performReject:(BOOL (^)(NSUInteger index))block; - -/** Transform each index of the index set to a new index, as returned by the - block. - - @param block A block that returns a new index for a index. - @see bk_map: - */ -- (void)bk_performMap:(NSUInteger (^)(NSUInteger index))block; - - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.m deleted file mode 100644 index ab70130..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// NSMutableIndexSet+BlocksKit.m -// BlocksKit -// - -#import "NSMutableIndexSet+BlocksKit.h" - -@implementation NSMutableIndexSet (BlocksKit) - -- (void)bk_performSelect:(BOOL (^)(NSUInteger index))block -{ - NSParameterAssert(block != nil); - - NSIndexSet *list = [self indexesPassingTest:^BOOL(NSUInteger idx, BOOL *stop) { - return !block(idx); - }]; - - if (!list.count) return; - [self removeIndexes:list]; -} - -- (void)bk_performReject:(BOOL (^)(NSUInteger index))block -{ - NSParameterAssert(block != nil); - return [self bk_performSelect:^BOOL(NSUInteger idx) { - return !block(idx); - }]; -} - -- (void)bk_performMap:(NSUInteger (^)(NSUInteger index))block -{ - NSParameterAssert(block != nil); - - NSMutableIndexSet *new = [self mutableCopy]; - - [self enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { - [new addIndex:block(idx)]; - }]; - - [self removeAllIndexes]; - [self addIndexes:new]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h deleted file mode 100644 index 6cf8fbe..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// NSMutableOrderedSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSMutableOrderedSet. - - These utilities expound upon the BlocksKit additions to the immutable - superclass by allowing certain utilities to work on an instance of the mutable - class, saving memory by not creating an immutable copy of the results. - - Includes code by the following: - - - [Martin Schürrer](https://github.com/MSch) - - [Zach Waldowski](https://github.com/zwaldowski) - - @see NSOrderedSet(BlocksKit) - */ -@interface NSMutableOrderedSet (BlocksKit) - -/** Filters a mutable ordered set to the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @see bk_reject: - */ -- (void)bk_performSelect:(BOOL (^)(id obj))block; - -/** Filters a mutable ordered set to all objects but the ones matching the - block, the logical inverse to bk_select:. - - @param block A single-argument, BOOL-returning code block. - @see bk_select: - */ -- (void)bk_performReject:(BOOL (^)(id obj))block; - -/** Transform the objects in the ordered set to the results of the block. - - This is sometimes referred to as a transform, mutating one of each object: - [foo bk_performMap:^id(id obj) { - return [dateTransformer dateFromString:obj]; - }]; - - @param block A single-argument, object-returning code block. - @see bk_map: - */ -- (void)bk_performMap:(id (^)(id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.m deleted file mode 100644 index 0e2ff77..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// NSMutableOrderedSet+BlocksKit.m -// BlocksKit -// - -#import "NSMutableOrderedSet+BlocksKit.h" - -@implementation NSMutableOrderedSet (BlocksKit) - -- (void)bk_performSelect:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - - NSIndexSet *list = [self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return !block(obj); - }]; - - if (!list.count) return; - [self removeObjectsAtIndexes:list]; -} - -- (void)bk_performReject:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - return [self bk_performSelect:^BOOL(id obj) { - return !block(obj); - }]; -} - -- (void)bk_performMap:(id (^)(id obj))block { - NSParameterAssert(block != nil); - - NSMutableIndexSet *newIndexes = [NSMutableIndexSet indexSet]; - NSMutableArray *newObjects = [NSMutableArray arrayWithCapacity:self.count]; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - id value = block(obj) ?: [NSNull null]; - if ([value isEqual:obj]) return; - [newIndexes addIndex:idx]; - [newObjects addObject:obj]; - }]; - - [self replaceObjectsAtIndexes:newIndexes withObjects:newObjects]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.h deleted file mode 100644 index 2016bc8..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// NSMutableSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSMutableSet. - - These utilities expound upon the BlocksKit additions to the immutable - superclass by allowing certain utilities to work on an instance of the mutable - class, saving memory by not creating an immutable copy of the results. - - Includes code by the following: - - - [Martin Schürrer](https://github.com/MSch) - - [Zach Waldowski](https://github.com/zwaldowski) - - @see NSSet(BlocksKit) - */ -@interface NSMutableSet (BlocksKit) - -/** Filters a mutable set to the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @see bk_reject: - */ -- (void)bk_performSelect:(BOOL (^)(id obj))block; - -/** Filters a mutable set to all objects but the ones matching the block, - the logical inverse to bk_select:. - - @param block A single-argument, BOOL-returning code block. - @see bk_select: - */ -- (void)bk_performReject:(BOOL (^)(id obj))block; - -/** Transform the objects in the set to the results of the block. - - This is sometimes referred to as a transform, mutating one of each object: - [controllers bk_map:^id(id obj) { - return [obj view]; - }]; - - @param block A single-argument, object-returning code block. - @see bk_map: - */ -- (void)bk_performMap:(id (^)(id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.m deleted file mode 100644 index 3ea155d..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.m +++ /dev/null @@ -1,41 +0,0 @@ -// -// NSMutableSet+BlocksKit.m -// BlocksKit -// - -#import "NSMutableSet+BlocksKit.h" - -@implementation NSMutableSet (BlocksKit) - -- (void)bk_performSelect:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - - NSSet *list = [self objectsPassingTest:^BOOL(id obj, BOOL *stop) { - return block(obj); - }]; - - [self setSet:list]; -} - -- (void)bk_performReject:(BOOL (^)(id obj))block { - NSParameterAssert(block != nil); - [self bk_performSelect:^BOOL(id obj) { - return !block(obj); - }]; -} - -- (void)bk_performMap:(id (^)(id obj))block { - NSParameterAssert(block != nil); - - NSMutableSet *new = [NSMutableSet setWithCapacity:self.count]; - - [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { - id value = block(obj); - if (!value) return; - [new addObject:value]; - }]; - - [self setSet:new]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.h b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.h deleted file mode 100644 index af4cf92..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.h +++ /dev/null @@ -1,158 +0,0 @@ -// -// NSObject+BKAssociatedObjects.h -// BlocksKit -// - -#import - -/** Objective-C wrapper for 10.6+ associated object API. - - In Mac OS X Snow Leopard and iOS 3.0, Apple introduced an addition to the - Objective-C Runtime called associated objects. Associated objects allow for the - pairing of a random key and object pair to be saved on an instance. - - In BlocksKit, associated objects allow us to emulate instance variables in the - ategories we use. - - Class methods also exist for each association. These associations are unique to - each class, and exist for the lifetime of the application unless set to `nil`. - Each class is a unique meta-object; the ultimate singleton. - - Created by [Andy Matuschak](https://github.com/andymatuschak) as - `AMAssociatedObjects`. - */ -@interface NSObject (BKAssociatedObjects) - -/** Strongly associates an object with the reciever. - - The associated value is retained as if it were a property - synthesized with `nonatomic` and `retain`. - - Using retained association is strongly recommended for most - Objective-C object derivative of NSObject, particularly - when it is subject to being externally released or is in an - `NSAutoreleasePool`. - - @param value Any object. - @param key A unique key pointer. - */ -- (void)bk_associateValue:(id)value withKey:(const void *)key; - -/** Strongly associates an object with the receiving class. - - @see associateValue:withKey: - @param value Any object. - @param key A unique key pointer. - */ -+ (void)bk_associateValue:(id)value withKey:(const void *)key; - -/** Strongly, thread-safely associates an object with the reciever. - - The associated value is retained as if it were a property - synthesized with `atomic` and `retain`. - - Using retained association is strongly recommended for most - Objective-C object derivative of NSObject, particularly - when it is subject to being externally released or is in an - `NSAutoreleasePool`. - - @see associateValue:withKey: - @param value Any object. - @param key A unique key pointer. - */ -- (void)bk_atomicallyAssociateValue:(id)value withKey:(const void *)key; - -/** Strongly, thread-safely associates an object with the receiving class. - - @see associateValue:withKey: - @param value Any object. - @param key A unique key pointer. - */ -+ (void)bk_atomicallyAssociateValue:(id)value withKey:(const void *)key; - -/** Associates a copy of an object with the reciever. - - The associated value is copied as if it were a property - synthesized with `nonatomic` and `copy`. - - Using copied association is recommended for a block or - otherwise `NSCopying`-compliant instances like NSString. - - @param value Any object, pointer, or value. - @param key A unique key pointer. - */ -- (void)bk_associateCopyOfValue:(id)value withKey:(const void *)key; - -/** Associates a copy of an object with the receiving class. - - @see associateCopyOfValue:withKey: - @param value Any object, pointer, or value. - @param key A unique key pointer. - */ -+ (void)bk_associateCopyOfValue:(id)value withKey:(const void *)key; - -/** Thread-safely associates a copy of an object with the reciever. - - The associated value is copied as if it were a property - synthesized with `atomic` and `copy`. - - Using copied association is recommended for a block or - otherwise `NSCopying`-compliant instances like NSString. - - @see associateCopyOfValue:withKey: - @param value Any object, pointer, or value. - @param key A unique key pointer. - */ -- (void)bk_atomicallyAssociateCopyOfValue:(id)value withKey:(const void *)key; - -/** Thread-safely associates a copy of an object with the receiving class. - - @see associateCopyOfValue:withKey: - @param value Any object, pointer, or value. - @param key A unique key pointer. - */ -+ (void)bk_atomicallyAssociateCopyOfValue:(id)value withKey:(const void *)key; - -/** Weakly associates an object with the reciever. - - A weak association will cause the pointer to be set to zero - or nil upon the disappearance of what it references; - in other words, the associated object is not kept alive. - - @param value Any object. - @param key A unique key pointer. - */ -- (void)bk_weaklyAssociateValue:(__autoreleasing id)value withKey:(const void *)key; - -/** Weakly associates an object with the receiving class. - - @see weaklyAssociateValue:withKey: - @param value Any object. - @param key A unique key pointer. - */ -+ (void)bk_weaklyAssociateValue:(__autoreleasing id)value withKey:(const void *)key; - -/** Returns the associated value for a key on the reciever. - - @param key A unique key pointer. - @return The object associated with the key, or `nil` if not found. - */ -- (id)bk_associatedValueForKey:(const void *)key; - -/** Returns the associated value for a key on the receiving class. - - @see associatedValueForKey: - @param key A unique key pointer. - @return The object associated with the key, or `nil` if not found. - */ -+ (id)bk_associatedValueForKey:(const void *)key; - -/** Returns the reciever to a clean state by removing all - associated objects, releasing them if necessary. */ -- (void)bk_removeAllAssociatedObjects; - -/** Returns the recieving class to a clean state by removing - all associated objects, releasing them if necessary. */ -+ (void)bk_removeAllAssociatedObjects; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.m b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.m deleted file mode 100644 index b58c8e8..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.m +++ /dev/null @@ -1,115 +0,0 @@ -// -// NSObject+BKAssociatedObjects.m -// BlocksKit -// - -#import -#import "NSObject+BKAssociatedObjects.h" - -#pragma mark - Weak support - -@interface _BKWeakAssociatedObject : NSObject - -@property (nonatomic, weak) id value; - -@end - -@implementation _BKWeakAssociatedObject - -@end - -@implementation NSObject (BKAssociatedObjects) - -#pragma mark - Instance Methods - -- (void)bk_associateValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (void)bk_atomicallyAssociateValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); -} - -- (void)bk_associateCopyOfValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -- (void)bk_atomicallyAssociateCopyOfValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY); -} - -- (void)bk_weaklyAssociateValue:(__autoreleasing id)value withKey:(const void *)key -{ - _BKWeakAssociatedObject *assoc = objc_getAssociatedObject(self, key); - if (!assoc) { - assoc = [_BKWeakAssociatedObject new]; - [self bk_associateValue:assoc withKey:key]; - } - assoc.value = value; -} - -- (id)bk_associatedValueForKey:(const void *)key -{ - id value = objc_getAssociatedObject(self, key); - if (value && [value isKindOfClass:[_BKWeakAssociatedObject class]]) { - return [(_BKWeakAssociatedObject *)value value]; - } - return value; -} - -- (void)bk_removeAllAssociatedObjects -{ - objc_removeAssociatedObjects(self); -} - -#pragma mark - Class Methods - -+ (void)bk_associateValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -+ (void)bk_atomicallyAssociateValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); -} - -+ (void)bk_associateCopyOfValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -+ (void)bk_atomicallyAssociateCopyOfValue:(id)value withKey:(const void *)key -{ - objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_COPY); -} - -+ (void)bk_weaklyAssociateValue:(__autoreleasing id)value withKey:(const void *)key -{ - _BKWeakAssociatedObject *assoc = objc_getAssociatedObject(self, key); - if (!assoc) { - assoc = [_BKWeakAssociatedObject new]; - [self bk_associateValue:assoc withKey:key]; - } - assoc.value = value; -} - -+ (id)bk_associatedValueForKey:(const void *)key -{ - id value = objc_getAssociatedObject(self, key); - if (value && [value isKindOfClass:[_BKWeakAssociatedObject class]]) { - return [(_BKWeakAssociatedObject *)value value]; - } - return value; -} - -+ (void)bk_removeAllAssociatedObjects -{ - objc_removeAssociatedObjects(self); -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.h b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.h deleted file mode 100644 index 4be43a3..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.h +++ /dev/null @@ -1,121 +0,0 @@ -// -// NSObject+BKBlockExecution.h -// BlocksKit -// - -#import - -/** Block execution on *any* object. - - This category overhauls the `performSelector:` utilities on - NSObject to instead use blocks. Not only are the blocks performed - extremely speedily, thread-safely, and asynchronously using - Grand Central Dispatch, but each convenience method also returns - a pointer that can be used to cancel the execution before it happens! - - Includes code by the following: - - - [Peter Steinberger](https://github.com/steipete) - - [Zach Waldowski](https://github.com/zwaldowski) - - */ -@interface NSObject (BKBlockExecution) - -/** Executes a block after a given delay on the reciever. - - [array performBlock:^(id obj) { - [obj addObject:self]; - [self release]; - } afterDelay:0.5f]; - - @warning *Important:* Use of the **self** reference in a block will - reference the current implementation context. The block argument, - `obj`, should be used instead. - - @param block A single-argument code block, where `obj` is the reciever. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -- (id)bk_performBlock:(void (^)(id obj))block afterDelay:(NSTimeInterval)delay; - -/** Executes a block after a given delay. - - This class method is functionally identical to its instance method version. It still executes - asynchronously via GCD. However, the current context is not passed so that the block is performed - in a general context. - - Block execution is very useful, particularly for small events that you would like delayed. - - [object performBlock:^{ - [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; - } afterDelay:0.5f]; - - @see performBlock:afterDelay: - @param block A code block. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -+ (id)bk_performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay; - -/** Executes a block in the background after a given delay on the receiver. - - This class method is functionally identical to `- (id)bk_performBlock:afterDelay:`, - except the block will be performed on a background thread instead of the main thread. - - @see performBlock:afterDelay: - @param block A code block. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -- (id)bk_performBlockInBackground:(void (^)(id obj))block afterDelay:(NSTimeInterval)delay; - -/** Executes a block in the background after a given delay. - - This class method is functionally identical to `+ (id)bk_performBlock:afterDelay:`, - except the block will be performed on a background thread instead of the main thread. - - @see performBlock:afterDelay: - @param block A code block. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -+ (id)bk_performBlockInBackground:(void (^)(void))block afterDelay:(NSTimeInterval)delay; - -/** Executes a block in the background after a given delay. - - This class method is functionally identical to `+ (id)bk_performBlock:afterDelay:`, - except the block will be performed on the specified thread instead of the main thread. - - @see performBlock:afterDelay: - @param block A code block. - @param queue A background queue. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -+ (id)bk_performBlock:(void (^)(void))block onQueue:(dispatch_queue_t)queue afterDelay:(NSTimeInterval)delay; - -/** Executes a block in the background after a given delay. - - This class method is functionally identical to `- (id)bk_performBlock:afterDelay:`, - except the block will be performed on the specified thread instead of the main thread. - - @see performBlock:afterDelay: - @param block A code block. - @param queue A background queue. - @param delay A measure in seconds. - @return Returns a pointer to the block that may or may not execute the given block. - */ -- (id)bk_performBlock:(void (^)(id obj))block onQueue:(dispatch_queue_t)queue afterDelay:(NSTimeInterval)delay; - -/** Cancels the potential execution of a block. - - @warning *Important:* It is not recommended to cancel a block executed - with no delay (a delay of 0.0). While it it still possible to catch the block - before GCD has executed it, it has likely already been executed and disposed of. - - @param block A pointer to a containing block, as returned from one of the - `performBlock` selectors. - */ -+ (void)bk_cancelBlock:(id)block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.m b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.m deleted file mode 100644 index d411e25..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.m +++ /dev/null @@ -1,79 +0,0 @@ -// -// NSObject+BKBlockExecution.m -// BlocksKit -// - -#import "NSObject+BKBlockExecution.h" - -#define BKTimeDelay(t) dispatch_time(DISPATCH_TIME_NOW, (uint64_t)(NSEC_PER_SEC * t)) - -@implementation NSObject (BlocksKit) - -- (id)bk_performBlock:(void (^)(id obj))block afterDelay:(NSTimeInterval)delay -{ - return [self bk_performBlock:block onQueue:dispatch_get_main_queue() afterDelay:delay]; -} - -+ (id)bk_performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay -{ - return [NSObject bk_performBlock:block onQueue:dispatch_get_main_queue() afterDelay:delay]; -} - -- (id)bk_performBlockInBackground:(void (^)(id obj))block afterDelay:(NSTimeInterval)delay -{ - return [self bk_performBlock:block onQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) afterDelay:delay]; -} - -+ (id)bk_performBlockInBackground:(void (^)(void))block afterDelay:(NSTimeInterval)delay -{ - return [NSObject bk_performBlock:block onQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) afterDelay:delay]; -} - -- (id)bk_performBlock:(void (^)(id obj))block onQueue:(dispatch_queue_t)queue afterDelay:(NSTimeInterval)delay -{ - NSParameterAssert(block != nil); - - __block BOOL cancelled = NO; - - void (^wrapper)(BOOL) = ^(BOOL cancel) { - if (cancel) { - cancelled = YES; - return; - } - if (!cancelled) block(self); - }; - - dispatch_after(BKTimeDelay(delay), queue, ^{ - wrapper(NO); - }); - - return [wrapper copy]; -} - -+ (id)bk_performBlock:(void (^)(void))block onQueue:(dispatch_queue_t)queue afterDelay:(NSTimeInterval)delay -{ - NSParameterAssert(block != nil); - - __block BOOL cancelled = NO; - - void (^wrapper)(BOOL) = ^(BOOL cancel) { - if (cancel) { - cancelled = YES; - return; - } - if (!cancelled) block(); - }; - - dispatch_after(BKTimeDelay(delay), queue, ^{ wrapper(NO); }); - - return [wrapper copy]; -} - -+ (void)bk_cancelBlock:(id)block -{ - NSParameterAssert(block != nil); - void (^wrapper)(BOOL) = block; - wrapper(YES); -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.h b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.h deleted file mode 100644 index 7ada6c4..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.h +++ /dev/null @@ -1,137 +0,0 @@ -// -// NSObject+BKBlockObservation.h -// BlocksKit -// - -#import - -/** Blocks wrapper for key-value observation. - - In Mac OS X Panther, Apple introduced an API called "key-value - observing." It implements an [observer pattern](http://en.wikipedia.org/wiki/Observer_pattern), - where an object will notify observers of any changes in state. - - NSNotification is a rudimentary form of this design style; - KVO, however, allows for the observation of any change in key-value state. - The API for key-value observation, however, is flawed, ugly, and lengthy. - - Like most of the other block abilities in BlocksKit, observation saves - and a bunch of code and a bunch of potential bugs. - - Includes code by the following: - - - [Andy Matuschak](https://github.com/andymatuschak) - - [Jon Sterling](https://github.com/jonsterling) - - [Zach Waldowski](https://github.com/zwaldowski) - - [Jonathan Wight](https://github.com/schwa) - */ - -@interface NSObject (BlockObservation) - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes a block upon a state change. - - @param keyPath The property to observe, relative to the reciever. - @param task A block with no return argument, and a single parameter: the reciever. - @return Returns a globally unique process identifier for removing - observation with removeObserverWithBlockToken:. - @see addObserverForKeyPath:identifier:options:task: - */ -- (NSString *)bk_addObserverForKeyPath:(NSString *)keyPath task:(void (^)(id target))task; - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes the same block upon - multiple state changes. - - @param keyPaths An array of properties to observe, relative to the reciever. - @param task A block with no return argument and two parameters: the - reciever and the key path of the value change. - @return A unique identifier for removing - observation with removeObserverWithBlockToken:. - @see addObserverForKeyPath:identifier:options:task: - */ -- (NSString *)bk_addObserverForKeyPaths:(NSArray *)keyPaths task:(void (^)(id obj, NSString *keyPath))task; - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes a block upon a state change - with specific options. - - @param keyPath The property to observe, relative to the reciever. - @param options The NSKeyValueObservingOptions to use. - @param task A block with no return argument and two parameters: the - reciever and the change dictionary. - @return Returns a globally unique process identifier for removing - observation with removeObserverWithBlockToken:. - @see addObserverForKeyPath:identifier:options:task: - */ -- (NSString *)bk_addObserverForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSDictionary *change))task; - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes the same block upon - multiple state changes with specific options. - - @param keyPaths An array of properties to observe, relative to the reciever. - @param options The NSKeyValueObservingOptions to use. - @param task A block with no return argument and three parameters: the - reciever, the key path of the value change, and the change dictionary. - @return A unique identifier for removing - observation with removeObserverWithBlockToken:. - @see addObserverForKeyPath:identifier:options:task: - */ -- (NSString *)bk_addObserverForKeyPaths:(NSArray *)keyPaths options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSString *keyPath, NSDictionary *change))task; - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes the block upon a - state change. - - @param keyPath The property to observe, relative to the reciever. - @param token An identifier for the observation block. - @param options The NSKeyValueObservingOptions to use. - @param task A block responding to the reciever and the KVO change. - observation with removeObserverWithBlockToken:. - @see addObserverForKeyPath:task: - */ -- (void)bk_addObserverForKeyPath:(NSString *)keyPath identifier:(NSString *)token options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSDictionary *change))task; - -/** Adds an observer to an object conforming to NSKeyValueObserving. - - Adds a block observer that executes the same block upon - multiple state changes. - - @param keyPaths An array of properties to observe, relative to the reciever. - @param token An identifier for the observation block. - @param options The NSKeyValueObservingOptions to use. - @param task A block responding to the reciever, the key path, and the KVO change. - observation with removeObserversWithIdentifier:. - @see addObserverForKeyPath:task: - */ -- (void)bk_addObserverForKeyPaths:(NSArray *)keyPaths identifier:(NSString *)token options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSString *keyPath, NSDictionary *change))task; - -/** Removes a block observer. - - @param keyPath The property to stop observing, relative to the reciever. - @param token The unique key returned by addObserverForKeyPath:task: - or the identifier given in addObserverForKeyPath:identifier:task:. - @see removeObserversWithIdentifier: - */ -- (void)bk_removeObserverForKeyPath:(NSString *)keyPath identifier:(NSString *)token; - -/** Removes multiple block observers with a certain identifier. - - @param token A unique key returned by addObserverForKeyPath:task: - and addObserverForKeyPaths:task: or the identifier given in - addObserverForKeyPath:identifier:task: and - addObserverForKeyPaths:identifier:task:. - @see removeObserverForKeyPath:identifier: - */ -- (void)bk_removeObserversWithIdentifier:(NSString *)token; - -/** Remove all registered block observers. */ -- (void)bk_removeAllBlockObservers; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.m b/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.m deleted file mode 100644 index fab8c71..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.m +++ /dev/null @@ -1,337 +0,0 @@ -// -// NSObject+BKBlockObservation.m -// BlocksKit -// - -#import -#import -#import "NSArray+BlocksKit.h" -#import "NSDictionary+BlocksKit.h" -#import "NSObject+BKAssociatedObjects.h" -#import "NSObject+BKBlockObservation.h" -#import "NSSet+BlocksKit.h" - -typedef NS_ENUM(int, BKObserverContext) { - BKObserverContextKey, - BKObserverContextKeyWithChange, - BKObserverContextManyKeys, - BKObserverContextManyKeysWithChange -}; - -@interface _BKObserver : NSObject { - BOOL _isObserving; -} - -@property (nonatomic, readonly, unsafe_unretained) id observee; -@property (nonatomic, readonly) NSMutableArray *keyPaths; -@property (nonatomic, readonly) id task; -@property (nonatomic, readonly) BKObserverContext context; - -- (id)initWithObservee:(id)observee keyPaths:(NSArray *)keyPaths context:(BKObserverContext)context task:(id)task; - -@end - -static void *BKObserverBlocksKey = &BKObserverBlocksKey; -static void *BKBlockObservationContext = &BKBlockObservationContext; - -@implementation _BKObserver - -- (id)initWithObservee:(id)observee keyPaths:(NSArray *)keyPaths context:(BKObserverContext)context task:(id)task -{ - if ((self = [super init])) { - _observee = observee; - _keyPaths = [keyPaths mutableCopy]; - _context = context; - _task = [task copy]; - } - return self; -} - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context -{ - if (context != BKBlockObservationContext) return; - - @synchronized(self) { - switch (self.context) { - case BKObserverContextKey: { - void (^task)(id) = self.task; - task(object); - break; - } - case BKObserverContextKeyWithChange: { - void (^task)(id, NSDictionary *) = self.task; - task(object, change); - break; - } - case BKObserverContextManyKeys: { - void (^task)(id, NSString *) = self.task; - task(object, keyPath); - break; - } - case BKObserverContextManyKeysWithChange: { - void (^task)(id, NSString *, NSDictionary *) = self.task; - task(object, keyPath, change); - break; - } - } - } -} - -- (void)startObservingWithOptions:(NSKeyValueObservingOptions)options -{ - @synchronized(self) { - if (_isObserving) return; - - [self.keyPaths bk_each:^(NSString *keyPath) { - [self.observee addObserver:self forKeyPath:keyPath options:options context:BKBlockObservationContext]; - }]; - - _isObserving = YES; - } -} - -- (void)stopObservingKeyPath:(NSString *)keyPath -{ - NSParameterAssert(keyPath); - - @synchronized (self) { - if (!_isObserving) return; - if (![self.keyPaths containsObject:keyPath]) return; - - NSObject *observee = self.observee; - if (!observee) return; - - [self.keyPaths removeObject: keyPath]; - keyPath = [keyPath copy]; - - if (!self.keyPaths.count) { - _task = nil; - _observee = nil; - _keyPaths = nil; - } - - [observee removeObserver:self forKeyPath:keyPath context:BKBlockObservationContext]; - } -} - -- (void)_stopObservingLocked -{ - if (!_isObserving) return; - - _task = nil; - - NSObject *observee = self.observee; - NSArray *keyPaths = [self.keyPaths copy]; - - _observee = nil; - _keyPaths = nil; - - [keyPaths bk_each:^(NSString *keyPath) { - [observee removeObserver:self forKeyPath:keyPath context:BKBlockObservationContext]; - }]; -} - -- (void)stopObserving -{ - if (_observee == nil) return; - - @synchronized (self) { - [self _stopObservingLocked]; - } -} - -- (void)dealloc -{ - if (self.keyPaths) { - [self _stopObservingLocked]; - } -} - -@end - -@implementation NSObject (BlockObservation) - -- (NSString *)bk_addObserverForKeyPath:(NSString *)keyPath task:(void (^)(id target))task -{ - NSString *token = [[NSProcessInfo processInfo] globallyUniqueString]; - [self bk_addObserverForKeyPaths:@[ keyPath ] identifier:token options:0 context:BKObserverContextKey task:task]; - return token; -} - -- (NSString *)bk_addObserverForKeyPaths:(NSArray *)keyPaths task:(void (^)(id obj, NSString *keyPath))task -{ - NSString *token = [[NSProcessInfo processInfo] globallyUniqueString]; - [self bk_addObserverForKeyPaths:keyPaths identifier:token options:0 context:BKObserverContextManyKeys task:task]; - return token; -} - -- (NSString *)bk_addObserverForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSDictionary *change))task -{ - NSString *token = [[NSProcessInfo processInfo] globallyUniqueString]; - [self bk_addObserverForKeyPath:keyPath identifier:token options:options task:task]; - return token; -} - -- (NSString *)bk_addObserverForKeyPaths:(NSArray *)keyPaths options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSString *keyPath, NSDictionary *change))task -{ - NSString *token = [[NSProcessInfo processInfo] globallyUniqueString]; - [self bk_addObserverForKeyPaths:keyPaths identifier:token options:options task:task]; - return token; -} - -- (void)bk_addObserverForKeyPath:(NSString *)keyPath identifier:(NSString *)identifier options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSDictionary *change))task -{ - BKObserverContext context = (options == 0) ? BKObserverContextKey : BKObserverContextKeyWithChange; - [self bk_addObserverForKeyPaths:@[keyPath] identifier:identifier options:options context:context task:task]; -} - -- (void)bk_addObserverForKeyPaths:(NSArray *)keyPaths identifier:(NSString *)identifier options:(NSKeyValueObservingOptions)options task:(void (^)(id obj, NSString *keyPath, NSDictionary *change))task -{ - BKObserverContext context = (options == 0) ? BKObserverContextManyKeys : BKObserverContextManyKeysWithChange; - [self bk_addObserverForKeyPaths:keyPaths identifier:identifier options:options context:context task:task]; -} - -- (void)bk_removeObserverForKeyPath:(NSString *)keyPath identifier:(NSString *)token -{ - NSParameterAssert(keyPath.length); - NSParameterAssert(token.length); - - NSMutableDictionary *dict; - - @synchronized (self) { - dict = [self bk_observerBlocks]; - if (!dict) return; - } - - _BKObserver *observer = dict[token]; - [observer stopObservingKeyPath:keyPath]; - - if (observer.keyPaths.count == 0) { - [dict removeObjectForKey:token]; - } - - if (dict.count == 0) [self bk_setObserverBlocks:nil]; -} - -- (void)bk_removeObserversWithIdentifier:(NSString *)token -{ - NSParameterAssert(token); - - NSMutableDictionary *dict; - - @synchronized (self) { - dict = [self bk_observerBlocks]; - if (!dict) return; - } - - _BKObserver *observer = dict[token]; - [observer stopObserving]; - - [dict removeObjectForKey:token]; - - if (dict.count == 0) [self bk_setObserverBlocks:nil]; -} - -- (void)bk_removeAllBlockObservers -{ - NSDictionary *dict; - - @synchronized (self) { - dict = [[self bk_observerBlocks] copy]; - [self bk_setObserverBlocks:nil]; - } - - [dict.allValues bk_each:^(_BKObserver *trampoline) { - [trampoline stopObserving]; - }]; -} - -#pragma mark - "Private"s - -+ (NSMutableSet *)bk_observedClassesHash -{ - static dispatch_once_t onceToken; - static NSMutableSet *swizzledClasses = nil; - dispatch_once(&onceToken, ^{ - swizzledClasses = [[NSMutableSet alloc] init]; - }); - - return swizzledClasses; -} - -- (void)bk_addObserverForKeyPaths:(NSArray *)keyPaths identifier:(NSString *)identifier options:(NSKeyValueObservingOptions)options context:(BKObserverContext)context task:(id)task -{ - NSParameterAssert(keyPaths.count); - NSParameterAssert(identifier.length); - NSParameterAssert(task); - - Class classToSwizzle = self.class; - NSMutableSet *classes = self.class.bk_observedClassesHash; - @synchronized (classes) { - NSString *className = NSStringFromClass(classToSwizzle); - if (![classes containsObject:className]) { - SEL deallocSelector = sel_registerName("dealloc"); - - __block void (*originalDealloc)(__unsafe_unretained id, SEL) = NULL; - - id newDealloc = ^(__unsafe_unretained id objSelf) { - [objSelf bk_removeAllBlockObservers]; - - if (originalDealloc == NULL) { - struct objc_super superInfo = { - .receiver = objSelf, - .super_class = class_getSuperclass(classToSwizzle) - }; - - void (*msgSend)(struct objc_super *, SEL) = (__typeof__(msgSend))objc_msgSendSuper; - msgSend(&superInfo, deallocSelector); - } else { - originalDealloc(objSelf, deallocSelector); - } - }; - - IMP newDeallocIMP = imp_implementationWithBlock(newDealloc); - - if (!class_addMethod(classToSwizzle, deallocSelector, newDeallocIMP, "v@:")) { - // The class already contains a method implementation. - Method deallocMethod = class_getInstanceMethod(classToSwizzle, deallocSelector); - - // We need to store original implementation before setting new implementation - // in case method is called at the time of setting. - originalDealloc = (void(*)(__unsafe_unretained id, SEL))method_getImplementation(deallocMethod); - - // We need to store original implementation again, in case it just changed. - originalDealloc = (void(*)(__unsafe_unretained id, SEL))method_setImplementation(deallocMethod, newDeallocIMP); - } - - [classes addObject:className]; - } - } - - NSMutableDictionary *dict; - _BKObserver *observer = [[_BKObserver alloc] initWithObservee:self keyPaths:keyPaths context:context task:task]; - [observer startObservingWithOptions:options]; - - @synchronized (self) { - dict = [self bk_observerBlocks]; - - if (dict == nil) { - dict = [NSMutableDictionary dictionary]; - [self bk_setObserverBlocks:dict]; - } - } - - dict[identifier] = observer; -} - -- (void)bk_setObserverBlocks:(NSMutableDictionary *)dict -{ - [self bk_associateValue:dict withKey:BKObserverBlocksKey]; -} - -- (NSMutableDictionary *)bk_observerBlocks -{ - return [self bk_associatedValueForKey:BKObserverBlocksKey]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.h deleted file mode 100644 index 06b5729..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.h +++ /dev/null @@ -1,168 +0,0 @@ -// -// NSOrderedSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSOrderedSet. - - Both inspired by and resembling Smalltalk syntax, these utilities allow for - iteration through an ordered set (also known as a uniqued array) in a concise - way that saves a ton of boilerplate code for filtering or finding objects. - - Includes code by the following: - - - Robin Lu. . 2009. - - Michael Ash. . 2010. BSD. - - Aleks Nesterow. . 2010. BSD. - - Zach Waldowski. . 2011. - - @see NSArray(BlocksKit) - @see NSSet(BlocksKit) - */ -@interface NSOrderedSet (BlocksKit) - -/** Loops through an ordered set and executes the given block with each object. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_each:(void (^)(id obj))block; - -/** Enumerates through an ordered set concurrently and executes the given block - once for each object. - - Enumeration will occur on appropriate background queues. This will have a - noticeable speed increase, especially on multi-core devices, but you *must* - be aware of the thread safety of the objects you message from within the block. - Be aware that the order of objects is not necessarily the order each block will - be called in. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_apply:(void (^)(id obj))block; - -/** Loops through an ordered set to find the object matching the block. - - bk_match: is functionally identical to bk_select:, but will stop and return - on the first match. - - @param block A single-argument, `BOOL`-returning code block. - @return Returns the object, if found, or `nil`. - @see bk_select: - */ -- (id)bk_match:(BOOL (^)(id obj))block; - -/** Loops through an ordered set to find the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @return Returns an ordered set of the objects found. - @see bk_match: - */ -- (NSOrderedSet *)bk_select:(BOOL (^)(id obj))block; - -/** Loops through an ordered set to to find the objects not matching the block. - - This selector performs *literally* the exact same function as bk_select: but in - reverse. - - This is useful, as one may expect, for removing objects from an ordered set to. - NSOrderedSet *new = [computers bk_reject:^BOOL(id obj) { - return ([obj isUgly]); - }]; - - @param block A single-argument, BOOL-returning code block. - @return Returns an ordered set of all objects not found. - */ -- (NSOrderedSet *)bk_reject:(BOOL (^)(id obj))block; - -/** Call the block once for each object and create an ordered set of the return - values. - - This is sometimes referred to as a transform, mutating one of each object: - NSOrderedSet *new = [stringArray bk_map:^id(id obj) { - return [obj stringByAppendingString:@".png"]); - }]; - - @param block A single-argument, object-returning code block. - @return Returns an ordered set of the objects returned by the block. - */ -- (NSOrderedSet *)bk_map:(id (^)(id obj))block; - -/** Arbitrarily accumulate objects using a block. - - The concept of this selector is difficult to illustrate in words. The sum can - be any NSObject, including (but not limited to) a string, number, or value. - - For example, you can concentate the strings in an ordered set: - NSString *concentrated = [stringArray bk_reduce:@"" withBlock:^id(id sum, id obj) { - return [sum stringByAppendingString:obj]; - }]; - - You can also do something like summing the lengths of strings in an ordered set: - NSUInteger value = [[[stringArray bk_reduce:nil withBlock:^id(id sum, id obj) { - return @([sum integerValue] + obj.length); - }]] unsignedIntegerValue]; - - @param initial The value of the reduction at its start. - @param block A block that takes the current sum and the next object to return the new sum. - @return An accumulated value. - */ -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block; - -/** Loops through an ordered set to find whether any object matches the block. - - This method is similar to the Scala list `exists`. It is functionally - identical to bk_match: but returns a `BOOL` instead. It is not recommended - to use bk_any: as a check condition before executing bk_match:, since it would - require two loops through the ordered set. - - For example, you can find if a string in an ordered set starts with a certain - letter: - - NSString *letter = @"A"; - BOOL containsLetter = [stringArray bk_any:^(id obj) { - return [obj hasPrefix:@"A"]; - }]; - - @param block A single-argument, BOOL-returning code block. - @return YES for the first time the block returns YES for an object, NO otherwise. - */ -- (BOOL)bk_any:(BOOL (^)(id obj))block; - -/** Loops through an ordered set to find whether no objects match the block. - - This selector performs *literally* the exact same function as bk_all: but in reverse. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns NO for all objects in the ordered set, NO - otherwise. - */ -- (BOOL)bk_none:(BOOL (^)(id obj))block; - -/** Loops through an ordered set to find whether all objects match the block. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns YES for all objects in the ordered set, NO - otherwise. - */ -- (BOOL)bk_all:(BOOL (^)(id obj))block; - -/** Tests whether every element of this ordered set relates to the corresponding - element of another array according to match by block. - - For example, finding if a list of numbers corresponds to their sequenced string values; - - NSArray *numbers = @[ @(1), @(2), @(3) ]; - NSArray *letters = @[ @"1", @"2", @"3" ]; - BOOL doesCorrespond = [numbers bk_corresponds:letters withBlock:^(id number, id letter) { - return [[number stringValue] isEqualToString:letter]; - }]; - - @param list An array of objects to compare with. - @param block A two-argument, BOOL-returning code block. - @return Returns a BOOL, true if every element of the ordered set relates to - corresponding element in another ordered set. - */ -- (BOOL)bk_corresponds:(NSOrderedSet *)list withBlock:(BOOL (^)(id obj1, id obj2))block; -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.m deleted file mode 100644 index 0464652..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.m +++ /dev/null @@ -1,132 +0,0 @@ -// -// NSOrderedSet+BlocksKit.m -// BlocksKit -// - -#import "NSOrderedSet+BlocksKit.h" - -@implementation NSOrderedSet (BlocksKit) - -- (void)bk_each:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - block(obj); - }]; -} - -- (void)bk_apply:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - block(obj); - }]; -} - -- (id)bk_match:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSUInteger index = [self indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return block(obj); - }]; - - if (index == NSNotFound) return nil; - return self[index]; -} - -- (NSOrderedSet *)bk_select:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSArray *objects = [self objectsAtIndexes:[self indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { - return block(obj); - }]]; - - if (!objects.count) return [[self class] orderedSet]; - return [[self class] orderedSetWithArray:objects]; -} - -- (NSOrderedSet *)bk_reject:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - return [self bk_select:^BOOL(id obj) { - return !block(obj); - }]; -} - -- (NSOrderedSet *)bk_map:(id (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSMutableOrderedSet *result = [NSMutableOrderedSet orderedSetWithCapacity:self.count]; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - id value = block(obj) ?: [NSNull null]; - [result addObject:value]; - }]; - - return result; -} - -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block -{ - NSParameterAssert(block != nil); - - __block id result = initial; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - result = block(result, obj); - }]; - - return result; -} - -- (BOOL)bk_any:(BOOL (^)(id obj))block -{ - return [self bk_match:block] != nil; -} - -- (BOOL)bk_none:(BOOL (^)(id obj))block -{ - return [self bk_match:block] == nil; -} - -- (BOOL)bk_all:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = YES; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if (!block(obj)) { - result = NO; - *stop = YES; - } - }]; - - return result; -} - -- (BOOL)bk_corresponds:(NSOrderedSet *)list withBlock:(BOOL (^)(id obj1, id obj2))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = NO; - - [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if (idx < list.count) { - id obj2 = list[idx]; - result = block(obj, obj2); - } else { - result = NO; - } - *stop = !result; - }]; - - return result; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.h deleted file mode 100644 index f75c33d..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.h +++ /dev/null @@ -1,133 +0,0 @@ -// -// NSSet+BlocksKit.h -// BlocksKit -// - -#import - -/** Block extensions for NSSet. - - Both inspired by and resembling Smalltalk syntax, these utilities allows for - iteration of a set in a logical way that saves quite a bit of boilerplate code - for filtering or finding objects or an object. - - Includes code by the following: - -- [Michael Ash](https://github.com/mikeash) -- [Corey Floyd](https://github.com/coreyfloyd) -- [Aleks Nesterow](https://github.com/nesterow) -- [Zach Waldowski](https://github.com/zwaldowski) - - @see NSArray(BlocksKit) - @see NSDictionary(BlocksKit) - */ -@interface NSSet (BlocksKit) - -/** Loops through a set and executes the given block with each object. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_each:(void (^)(id obj))block; - -/** Enumerates through a set concurrently and executes - the given block once for each object. - - Enumeration will occur on appropriate background queues. This - will have a noticeable speed increase, especially on dual-core - devices, but you *must* be aware of the thread safety of the - objects you message from within the block. - - @param block A single-argument, void-returning code block. - */ -- (void)bk_apply:(void (^)(id obj))block; - -/** Loops through a set to find the object matching the block. - - bk_match: is functionally identical to bk_select:, but will stop and return - on the first match. - - @param block A single-argument, BOOL-returning code block. - @return Returns the object if found, `nil` otherwise. - @see bk_select: - */ -- (id)bk_match:(BOOL (^)(id obj))block; - -/** Loops through a set to find the objects matching the block. - - @param block A single-argument, BOOL-returning code block. - @return Returns a set of the objects found. - @see bk_match: - */ -- (NSSet *)bk_select:(BOOL (^)(id obj))block; - -/** Loops through a set to find the objects not matching the block. - - This selector performs *literally* the exact same function as select, but in reverse. - - This is useful, as one may expect, for removing objects from a set: - NSSet *new = [reusableWebViews bk_reject:^BOOL(id obj) { - return ([obj isLoading]); - }]; - - @param block A single-argument, BOOL-returning code block. - @return Returns an array of all objects not found. - */ -- (NSSet *)bk_reject:(BOOL (^)(id obj))block; - -/** Call the block once for each object and create a set of the return values. - - This is sometimes referred to as a transform, mutating one of each object: - NSSet *new = [mimeTypes bk_map:^id(id obj) { - return [@"x-company-" stringByAppendingString:obj]); - }]; - - @param block A single-argument, object-returning code block. - @return Returns a set of the objects returned by the block. - */ -- (NSSet *)bk_map:(id (^)(id obj))block; - -/** Arbitrarily accumulate objects using a block. - - The concept of this selector is difficult to illustrate in words. The sum can - be any NSObject, including (but not limited to) a string, number, or value. - - You can also do something like summing the count of an item: - NSUInteger numberOfBodyParts = [[bodyList bk_reduce:nil withBlock:^id(id sum, id obj) { - return @([sum integerValue] + obj.numberOfAppendages); - }] unsignedIntegerValue]; - - @param initial The value of the reduction at its start. - @param block A block that takes the current sum and the next object to return the new sum. - @return An accumulated value. - */ -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block; - -/** Loops through a set to find whether any object matches the block. - - This method is similar to the Scala list `exists`. It is functionally - identical to bk_match: but returns a `BOOL` instead. It is not recommended - to use bk_any: as a check condition before executing bk_match:, since it would - require two loops through the array. - - @param block A single-argument, BOOL-returning code block. - @return YES for the first time the block returns YES for an object, NO otherwise. - */ -- (BOOL)bk_any:(BOOL (^)(id obj))block; - -/** Loops through a set to find whether no objects match the block. - - This selector performs *literally* the exact same function as bk_all: but in reverse. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns NO for all objects in the set, NO otherwise. - */ -- (BOOL)bk_none:(BOOL (^)(id obj))block; - -/** Loops through a set to find whether all objects match the block. - - @param block A single-argument, BOOL-returning code block. - @return YES if the block returns YES for all objects in the set, NO otherwise. - */ -- (BOOL)bk_all:(BOOL (^)(id obj))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.m deleted file mode 100644 index cb9d261..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSSet+BlocksKit.m +++ /dev/null @@ -1,113 +0,0 @@ -// -// NSSet+BlocksKit.m -// BlocksKit -// - -#import "NSSet+BlocksKit.h" - -@implementation NSSet (BlocksKit) - -- (void)bk_each:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { - block(obj); - }]; -} - -- (void)bk_apply:(void (^)(id obj))block -{ - NSParameterAssert(block != nil); - - [self enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, BOOL *stop) { - block(obj); - }]; -} - -- (id)bk_match:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - return [[self objectsPassingTest:^BOOL(id obj, BOOL *stop) { - if (block(obj)) { - *stop = YES; - return YES; - } - - return NO; - }] anyObject]; -} - -- (NSSet *)bk_select:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - return [self objectsPassingTest:^BOOL(id obj, BOOL *stop) { - return block(obj); - }]; -} - -- (NSSet *)bk_reject:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - return [self objectsPassingTest:^BOOL(id obj, BOOL *stop) { - return !block(obj); - }]; -} - -- (NSSet *)bk_map:(id (^)(id obj))block -{ - NSParameterAssert(block != nil); - - NSMutableSet *result = [NSMutableSet setWithCapacity:self.count]; - - [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { - id value = block(obj) ?:[NSNull null]; - [result addObject:value]; - }]; - - return result; -} - -- (id)bk_reduce:(id)initial withBlock:(id (^)(id sum, id obj))block -{ - NSParameterAssert(block != nil); - - __block id result = initial; - - [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { - result = block(result, obj); - }]; - - return result; -} - -- (BOOL)bk_any:(BOOL (^)(id obj))block -{ - return [self bk_match:block] != nil; -} - -- (BOOL)bk_none:(BOOL (^)(id obj))block -{ - return [self bk_match:block] == nil; -} - -- (BOOL)bk_all:(BOOL (^)(id obj))block -{ - NSParameterAssert(block != nil); - - __block BOOL result = YES; - - [self enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { - if (!block(obj)) { - result = NO; - *stop = YES; - } - }]; - - return result; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.h b/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.h deleted file mode 100644 index 2183d02..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// NSTimer+BlocksKit.h -// BlocksKit -// - -#import - -/** Simple category on NSTimer to give it blocks capability. - - Created by [Jiva DeVoe](https://github.com/jivadevoe) as `NSTimer-Blocks`. -*/ -@interface NSTimer (BlocksKit) - -/** Creates and returns a block-based NSTimer object and schedules it on the current run loop. - - @param inTimeInterval The number of seconds between firings of the timer. - @param inBlock The block that the NSTimer fires. - @param inRepeats If YES, the timer will repeatedly reschedule itself until invalidated. If NO, the timer will be invalidated after it fires. - @return A new NSTimer object, configured according to the specified parameters. - */ -+ (NSTimer *)bk_scheduledTimerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)(NSTimer *timer))inBlock repeats:(BOOL)inRepeats; - -/** Creates and returns a block-based NSTimer initialized with the specified block. - - You must add the new timer to a run loop, using `-addTimer:forMode:`. Then, - after seconds seconds have elapsed, the timer fires the block. If the timer - is configured to repeat, there is no need to subsequently re-add the timer. - - @param inTimeInterval The number of seconds between firings of the timer. - @param inBlock The block that the NSTimer fires. - @param inRepeats If YES, the timer will repeatedly reschedule itself until invalidated. If NO, the timer will be invalidated after it fires. - @return A new NSTimer object, configured according to the specified parameters. - */ -+ (NSTimer *)bk_timerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)(NSTimer *timer))inBlock repeats:(BOOL)inRepeats; - -@end diff --git a/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.m b/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.m deleted file mode 100644 index ed1ad98..0000000 --- a/Pods/BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.m +++ /dev/null @@ -1,33 +0,0 @@ -// -// NSTimer+BlocksKit.m -// BlocksKit -// - -#import "NSTimer+BlocksKit.h" - -@interface NSTimer (BlocksKitPrivate) - -+ (void)bk_executeBlockFromTimer:(NSTimer *)aTimer; - -@end - -@implementation NSTimer (BlocksKit) - -+ (id)bk_scheduledTimerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)(NSTimer *timer))block repeats:(BOOL)inRepeats -{ - NSParameterAssert(block != nil); - return [self scheduledTimerWithTimeInterval:inTimeInterval target:self selector:@selector(bk_executeBlockFromTimer:) userInfo:[block copy] repeats:inRepeats]; -} - -+ (id)bk_timerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)(NSTimer *timer))block repeats:(BOOL)inRepeats -{ - NSParameterAssert(block != nil); - return [self timerWithTimeInterval:inTimeInterval target:self selector:@selector(bk_executeBlockFromTimer:) userInfo:[block copy] repeats:inRepeats]; -} - -+ (void)bk_executeBlockFromTimer:(NSTimer *)aTimer { - void (^block)(NSTimer *) = [aTimer userInfo]; - if (block) block(aTimer); -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.h deleted file mode 100644 index f54e291..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.h +++ /dev/null @@ -1,98 +0,0 @@ -// -// A2BlockInvocation.h -// BlocksKit -// - -#import - -/// If a block invocation is instiated with an invalid method signature, -/// an `NSInvalidArgumentException` is thrown containing this key in the -/// user info. -extern NSString *const A2IncompatibleMethodSignatureKey; - -/** An `A2BlockInvocation` is an Objective-C block call rendered static, that - is, it is an action turned into an object. `A2BlockInvocation` objects are used - to store and forward closure invocations between objects, primarily by the - `A2DynamicDelegate` system. - - A block invocation object can be repeatedly dispatched with multiple sets of - arguments with the same flexibility as NSInvocation. This design makes - `A2BlockInvocation` extremely useful, because blocks can be used to capture - scope and a block invocation can be used to save it for later. - - Like `NSInvocation`, `A2BlockInvocation` does not support invocations of - methods with variadic arguments or union arguments. - */ -@interface A2BlockInvocation : NSObject - -/** Inspects the given block literal and returns a compatible method signature. - - The returned method signature is suitable for use in the Foundation forwarding - system to link a method call to a block invocation. - - @param block An Objective-C block literal - @return A method signature matching the declared prototype for the block - */ -+ (NSMethodSignature *)methodSignatureForBlock:(id)block; - -/** @name Creating A2BlockInvocation Objects */ - -/** Returns a block invocation object able to construct calls to a given block. - - This method synthesizes a compatible method signature for the given block. - - @param block A block literal - @return An initialized block invocation object - @see methodSignatureForBlock - */ -- (instancetype)initWithBlock:(id)block; - -/** Returns a block invocation object able to construct calls to a given block - using a given Objective-C method signature. - - The method signature given must be compatible with the signature of the block; - that is, equal to the block signature but with a `SEL` (`':'`) as the second - parameter. Passing in an incompatible method signature will raise an exception. - - An example method returning a string for an integer argument would have the - following properties: - - Block type signature of `NSString *(^)(int)` - - Block function definition of `NSString *(*)(id, int)` - - Block signature of `"@@?i"` - - Method signature of `"@:i"` or `"@i"` - - @param block An Objective-C block literal - @param methodSignature An method signature matching the block - @return An initialized block invocation object - */ -- (instancetype)initWithBlock:(id)block methodSignature:(NSMethodSignature *)methodSignature; - -/** @name Getting the Block and Method Signatures */ - -/// The receiver's method signature, reflecting the block with a selector. -/// Appropriate for use in `-methodSignatureForSelector:`. -@property (nonatomic, strong, readonly) NSMethodSignature *methodSignature; - -/// Returns the receiver's block. -@property (nonatomic, copy, readonly) id block; - -/** Calls the receiver's block with the arguments from the given invocation, - providing a buffer containing the block's return value upon return. - - @param inv An instance of NSInvocation with values for its arguments set. - @param returnValue On return, the block's return value, or `nil` for a void - return type. - @param NO if the buffer copies necessary for invocation failed, YES otherwise. - @see invokeWithInvocation:returnValue: - */ -- (BOOL)invokeWithInvocation:(NSInvocation *)inv returnValue:(out NSValue **)returnValue; - -/** Calls the receiver's block with the arguments from the given invocation - and sets the return value on the given invocation. - - @param inv An instance of NSInvocation with values for its arguments set. - @see invokeWithInvocation:returnValue: - */ -- (void)invokeWithInvocation:(NSInvocation *)inv; - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.m deleted file mode 100644 index 82b6812..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.m +++ /dev/null @@ -1,251 +0,0 @@ -// -// A2BlockInvocation.m -// BlocksKit -// - -#import "A2BlockInvocation.h" - -NSString *const A2IncompatibleMethodSignatureKey = @"incompatibleMethodSignature"; - -#ifndef NSFoundationVersionNumber10_8 -#define NSFoundationVersionNumber10_8 945.00 -#endif - -#ifndef NSFoundationVersionNumber_iOS_6_0 -#define NSFoundationVersionNumber_iOS_6_0 993.00 -#endif - -#pragma mark Block Internals - -typedef NS_OPTIONS(int, BKBlockFlags) { - BKBlockFlagsHasCopyDisposeHelpers = (1 << 25), - BKBlockFlagsHasSignature = (1 << 30) -}; - -typedef struct _BKBlock { - __unused Class isa; - BKBlockFlags flags; - __unused int reserved; - void (__unused *invoke)(struct _BKBlock *block, ...); - struct { - unsigned long int reserved; - unsigned long int size; - // requires BKBlockFlagsHasCopyDisposeHelpers - void (*copy)(void *dst, const void *src); - void (*dispose)(const void *); - // requires BKBlockFlagsHasSignature - const char *signature; - const char *layout; - } *descriptor; - // imported variables -} *BKBlockRef; - -@interface A2BlockInvocation () - -@property (nonatomic, readonly) NSMethodSignature *blockSignature; - -@end - -@implementation A2BlockInvocation - -/** Determines if two given signatures (block or method) are compatible. - - A signature is compatible with another signature if their return types and - parameter types are equal, minus the parameter types dedicated to the Obj-C - method reciever and selector or a block literal argument. - - @param signatureA Any signature object reflecting a block or method signature - @param signatureB Any signature object reflecting a block or method signature - @return YES if the given signatures may be used to dispatch for one another - */ -+ (BOOL)isSignature:(NSMethodSignature *)signatureA compatibleWithSignature:(NSMethodSignature *)signatureB __attribute__((pure)) -{ - if (!signatureA || !signatureB) return NO; - if ([signatureA isEqual:signatureB]) return YES; - if (signatureA.methodReturnType[0] != signatureB.methodReturnType[0]) return NO; - - NSMethodSignature *methodSignature = nil, *blockSignature = nil; - if (signatureA.numberOfArguments > signatureB.numberOfArguments) { - methodSignature = signatureA; - blockSignature = signatureB; - } else if (signatureB.numberOfArguments > signatureA.numberOfArguments) { - methodSignature = signatureB; - blockSignature = signatureA; - } else { - return NO; - } - - NSUInteger numberOfArguments = methodSignature.numberOfArguments; - for (NSUInteger i = 2; i < numberOfArguments; i++) { - if ([methodSignature getArgumentTypeAtIndex:i][0] != [blockSignature getArgumentTypeAtIndex:i - 1][0]) - return NO; - } - - return YES; -} - -/** Inspects the given block literal and returns a compatible type signature. - - Unlike a typical method signature, a block type signature has no `self` (`'@'`) - or `_cmd` (`':'`) parameter, but instead just one parameter for the block itself - (`'@?'`). - - @param block An Objective-C block literal - @return A method signature matching the declared prototype for the block - */ -+ (NSMethodSignature *)typeSignatureForBlock:(id)block __attribute__((pure, nonnull(1))) -{ - BKBlockRef layout = (__bridge void *)block; - - if (!(layout->flags & BKBlockFlagsHasSignature)) - return nil; - - void *desc = layout->descriptor; - desc += 2 * sizeof(unsigned long int); - - if (layout->flags & BKBlockFlagsHasCopyDisposeHelpers) - desc += 2 * sizeof(void *); - - if (!desc) - return nil; - - const char *signature = (*(const char **)desc); - - return [NSMethodSignature signatureWithObjCTypes:signature]; -} - -/// Creates a method signature compatible with a given block signature. -+ (NSMethodSignature *)methodSignatureForBlockSignature:(NSMethodSignature *)original -{ - if (!original) return nil; - - if (original.numberOfArguments < 1) { - return nil; - } - - if (original.numberOfArguments >= 2 && strcmp(@encode(SEL), [original getArgumentTypeAtIndex:1]) == 0) { - return original; - } - - // initial capacity is num. arguments - 1 (@? -> @) + 1 (:) + 1 (ret type) - // optimistically assuming most signature components are char[1] - NSMutableString *signature = [[NSMutableString alloc] initWithCapacity:original.numberOfArguments + 1]; - - const char *retTypeStr = original.methodReturnType; - [signature appendFormat:@"%s%s%s", retTypeStr, @encode(id), @encode(SEL)]; - - for (NSUInteger i = 1; i < original.numberOfArguments; i++) { - const char *typeStr = [original getArgumentTypeAtIndex:i]; - NSString *type = [[NSString alloc] initWithBytesNoCopy:(void *)typeStr length:strlen(typeStr) encoding:NSUTF8StringEncoding freeWhenDone:NO]; - [signature appendString:type]; - } - - return [NSMethodSignature signatureWithObjCTypes:signature.UTF8String]; -} - -+ (NSMethodSignature *)methodSignatureForBlock:(id)block -{ - NSMethodSignature *original = [self typeSignatureForBlock:block]; - if (!original) return nil; - return [self methodSignatureForBlockSignature:original]; -} - -- (instancetype)initWithBlock:(id)block methodSignature:(NSMethodSignature *)methodSignature blockSignature:(NSMethodSignature *)blockSignature -{ - self = [super init]; - if (self) { - _block = [block copy]; - _methodSignature = methodSignature; - _blockSignature = blockSignature; - } - return self; -} - -- (instancetype)initWithBlock:(id)block -{ - NSParameterAssert(block); - NSMethodSignature *blockSignature = [[self class] typeSignatureForBlock:block]; - NSMethodSignature *methodSignature = [[self class] methodSignatureForBlockSignature:blockSignature]; - NSAssert(methodSignature, @"Incompatible block: %@", block); - return (self = [self initWithBlock:block methodSignature:methodSignature blockSignature:blockSignature]); -} - -- (instancetype)initWithBlock:(id)block methodSignature:(NSMethodSignature *)methodSignature -{ - NSParameterAssert(block); - NSMethodSignature *blockSignature = [[self class] typeSignatureForBlock:block]; - if (![[self class] isSignature:methodSignature compatibleWithSignature:blockSignature]) { - @throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"Attempted to create block invocation with incompatible signatures" userInfo:@{A2IncompatibleMethodSignatureKey: methodSignature}]; - } - return (self = [self initWithBlock:block methodSignature:methodSignature blockSignature:blockSignature]); -} - -- (BOOL)invokeWithInvocation:(NSInvocation *)outerInv returnValue:(out NSValue **)outReturnValue setOnInvocation:(BOOL)setOnInvocation -{ - NSParameterAssert(outerInv); - - NSMethodSignature *sig = self.methodSignature; - - if (![outerInv.methodSignature isEqual:sig]) { - NSAssert(0, @"Attempted to invoke block invocation with incompatible frame"); - return NO; - } - - NSInvocation *innerInv = [NSInvocation invocationWithMethodSignature:self.blockSignature]; - - void *argBuf = NULL; - - for (NSUInteger i = 2; i < sig.numberOfArguments; i++) { - const char *type = [sig getArgumentTypeAtIndex:i]; - NSUInteger argSize; - NSGetSizeAndAlignment(type, &argSize, NULL); - - if (!(argBuf = reallocf(argBuf, argSize))) { - return NO; - } - - [outerInv getArgument:argBuf atIndex:i]; - [innerInv setArgument:argBuf atIndex:i - 1]; - } - - [innerInv invokeWithTarget:self.block]; - - NSUInteger retSize = sig.methodReturnLength; - if (retSize) { - if (outReturnValue || setOnInvocation) { - if (!(argBuf = reallocf(argBuf, retSize))) { - return NO; - } - - [innerInv getReturnValue:argBuf]; - - if (setOnInvocation) { - [outerInv setReturnValue:argBuf]; - } - - if (outReturnValue) { - *outReturnValue = [NSValue valueWithBytes:argBuf objCType:sig.methodReturnType]; - } - } - } else { - if (outReturnValue) { - *outReturnValue = nil; - } - } - - free(argBuf); - - return YES; -} - -- (void)invokeWithInvocation:(NSInvocation *)inv -{ - [self invokeWithInvocation:inv returnValue:NULL setOnInvocation:YES]; -} - -- (BOOL)invokeWithInvocation:(NSInvocation *)inv returnValue:(out NSValue **)returnValue -{ - return [self invokeWithInvocation:inv returnValue:returnValue setOnInvocation:NO]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.h deleted file mode 100644 index 927d935..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.h +++ /dev/null @@ -1,139 +0,0 @@ -// -// A2DynamicDelegate.h -// BlocksKit -// - -#import -#import -#import - -/** A2DynamicDelegate implements a class's delegate, data source, or other - delegated protocol by associating protocol methods with a block implementation. - - - (IBAction) annoyUser - { - // Create an alert view - UIAlertView *alertView = [[UIAlertView alloc] - initWithTitle:@"Hello World!" - message:@"This alert's delegate is implemented using blocks. That's so cool!" - delegate:nil - cancelButtonTitle:@"Meh." - otherButtonTitles:@"Woo!", nil]; - - // Get the dynamic delegate - A2DynamicDelegate *dd = alertView.bk_dynamicDelegate; - - // Implement -alertViewShouldEnableFirstOtherButton: - [dd implementMethod:@selector(alertViewShouldEnableFirstOtherButton:) withBlock:^(UIAlertView *alertView) { - NSLog(@"Message: %@", alertView.message); - return YES; - }]; - - // Implement -alertView:willDismissWithButtonIndex: - [dd implementMethod:@selector(alertView:willDismissWithButtonIndex:) withBlock:^(UIAlertView *alertView, NSInteger buttonIndex) { - NSLog(@"You pushed button #%d (%@)", buttonIndex, [alertView buttonTitleAtIndex:buttonIndex]); - }]; - - // Set the delegate - alertView.delegate = dd; - - [alertView show]; - } - - A2DynamicDelegate is designed to be 'plug and play'. - */ -@interface A2DynamicDelegate : NSProxy - -/** - * The designated initializer for the A2DynamicDelegate proxy. - * - * An instance of A2DynamicDelegate should generally not be created by the user, - * but instead by calling a method in NSObject(A2DynamicDelegate). Since - * delegates are usually weak references on the part of the delegating object, a - * dynamic delegate would be deallocated immediately after its declaring scope - * ends. NSObject(A2DynamicDelegate) creates a strong reference. - * - * @param protocol A protocol to which the dynamic delegate should conform. - * @return An initialized delegate proxy. - */ -- (id)initWithProtocol:(Protocol *)protocol; - -/** The protocol delegating the dynamic delegate. */ -@property (nonatomic, readonly) Protocol *protocol; - -/** A dictionary of custom handlers to be used by custom responders - in a A2Dynamic(Protocol Name) subclass of A2DynamicDelegate, like - `A2DynamicUIAlertViewDelegate`. */ -@property (nonatomic, strong, readonly) NSMutableDictionary *handlers; - -/** When replacing the delegate using the A2BlockDelegate extensions, the object - responding to classical delegate method implementations. */ -@property (nonatomic, weak, readonly) id realDelegate; - -/** @name Block Instance Method Implementations */ - -/** The block that is to be fired when the specified - selector is called on the reciever. - - @param selector An encoded selector. Must not be NULL. - @return A code block, or nil if no block is assigned. - */ -- (id)blockImplementationForMethod:(SEL)selector; - -/** Assigns the given block to be fired when the specified - selector is called on the reciever. - - [tableView.dynamicDataSource implementMethod:@selector(numberOfSectionsInTableView:) - withBlock:NSInteger^(UITableView *tableView) { - return 2; - }]; - - @warning Starting with A2DynamicDelegate 2.0, a block will - not be checked for a matching signature. A block can have - less parameters than the original selector and will be - ignored, but cannot have more. - - @param selector An encoded selector. Must not be NULL. - @param block A code block with the same signature as selector. - */ -- (void)implementMethod:(SEL)selector withBlock:(id)block; - -/** Disassociates any block so that nothing will be fired - when the specified selector is called on the reciever. - - @param selector An encoded selector. Must not be NULL. - */ -- (void)removeBlockImplementationForMethod:(SEL)selector; - -/** @name Block Class Method Implementations */ - -/** The block that is to be fired when the specified - selector is called on the delegating object's class. - - @param selector An encoded selector. Must not be NULL. - @return A code block, or nil if no block is assigned. - */ -- (id)blockImplementationForClassMethod:(SEL)selector; - -/** Assigns the given block to be fired when the specified - selector is called on the reciever. - - @warning Starting with A2DynamicDelegate 2.0, a block will - not be checked for a matching signature. A block can have - less parameters than the original selector and will be - ignored, but cannot have more. - - @param selector An encoded selector. Must not be NULL. - @param block A code block with the same signature as selector. - */ -- (void)implementClassMethod:(SEL)selector withBlock:(id)block; - -/** Disassociates any blocks so that nothing will be fired - when the specified selector is called on the delegating - object's class. - - @param selector An encoded selector. Must not be NULL. - */ -- (void)removeBlockImplementationForClassMethod:(SEL)selector; - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.m deleted file mode 100644 index cc47523..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.m +++ /dev/null @@ -1,333 +0,0 @@ -// -// A2DynamicDelegate.m -// BlocksKit -// - -#import -#import "A2BlockInvocation.h" -#import "A2DynamicDelegate.h" - -Protocol *a2_dataSourceProtocol(Class cls); -Protocol *a2_delegateProtocol(Class cls); -Protocol *a2_protocolForDelegatingObject(id obj, Protocol *protocol); - -static BOOL selectorsEqual(const void *item1, const void *item2, NSUInteger(*__unused size)(const void __unused *item)) -{ - return sel_isEqual((SEL)item1, (SEL)item2); -} - -static NSString *selectorDescribe(const void *item1) -{ - return NSStringFromSelector((SEL)item1); -} - -@interface NSMapTable (BKAdditions) - -+ (instancetype)bk_selectorsToStrongObjectsMapTable; -- (id)bk_objectForSelector:(SEL)aSEL; -- (void)bk_removeObjectForSelector:(SEL)aSEL; -- (void)bk_setObject:(id)anObject forSelector:(SEL)aSEL; - -@end - -@implementation NSMapTable (BKAdditions) - -+ (instancetype)bk_selectorsToStrongObjectsMapTable -{ - NSPointerFunctions *selectors = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsOpaqueMemory|NSPointerFunctionsOpaquePersonality]; - selectors.isEqualFunction = selectorsEqual; - selectors.descriptionFunction = selectorDescribe; - - NSPointerFunctions *strongObjects = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsStrongMemory|NSPointerFunctionsObjectPersonality]; - - return [[NSMapTable alloc] initWithKeyPointerFunctions:selectors valuePointerFunctions:strongObjects capacity:1]; -} - -- (id)bk_objectForSelector:(SEL)aSEL -{ - void *selAsPtr = aSEL; - return [self objectForKey:(__bridge id)selAsPtr]; -} - -- (void)bk_removeObjectForSelector:(SEL)aSEL -{ - void *selAsPtr = aSEL; - [self removeObjectForKey:(__bridge id)selAsPtr]; -} - -- (void)bk_setObject:(id)anObject forSelector:(SEL)aSEL -{ - void *selAsPtr = aSEL; - [self setObject:anObject forKey:(__bridge id)selAsPtr]; -} - - -@end - -@interface A2DynamicClassDelegate : A2DynamicDelegate - -@property (nonatomic) Class proxiedClass; - -@end - -#pragma mark - - -@interface A2DynamicDelegate () - -@property (nonatomic) A2DynamicClassDelegate *classProxy; -@property (nonatomic, readonly) NSMapTable *invocationsBySelectors; -@property (nonatomic, weak, readwrite) id realDelegate; - -- (BOOL) isClassProxy; - -@end - -@implementation A2DynamicDelegate - -- (A2DynamicClassDelegate *)classProxy -{ - if (!_classProxy) - { - _classProxy = [[A2DynamicClassDelegate alloc] initWithProtocol:self.protocol]; - _classProxy.proxiedClass = object_getClass(self); - } - - return _classProxy; -} - -- (BOOL)isClassProxy -{ - return NO; -} - -- (Class)class -{ - Class myClass = object_getClass(self); - if (myClass == [A2DynamicDelegate class] || [myClass superclass] == [A2DynamicDelegate class]) - return (Class)self.classProxy; - return [super class]; -} - -- (id)initWithProtocol:(Protocol *)protocol -{ - _protocol = protocol; - _handlers = [NSMutableDictionary dictionary]; - _invocationsBySelectors = [NSMapTable bk_selectorsToStrongObjectsMapTable]; - return self; -} - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector -{ - A2BlockInvocation *invocation = nil; - if ((invocation = [self.invocationsBySelectors bk_objectForSelector:aSelector])) - return invocation.methodSignature; - else if ([self.realDelegate methodSignatureForSelector:aSelector]) - return [self.realDelegate methodSignatureForSelector:aSelector]; - else if (class_respondsToSelector(object_getClass(self), aSelector)) - return [object_getClass(self) methodSignatureForSelector:aSelector]; - return [[NSObject class] methodSignatureForSelector:aSelector]; -} - -+ (NSString *)description -{ - return @"A2DynamicDelegate"; -} -- (NSString *)description -{ - return [NSString stringWithFormat:@"", (__bridge void *)self, NSStringFromProtocol(self.protocol)]; -} - -- (void)forwardInvocation:(NSInvocation *)outerInv -{ - SEL selector = outerInv.selector; - A2BlockInvocation *innerInv = nil; - if ((innerInv = [self.invocationsBySelectors bk_objectForSelector:selector])) { - [innerInv invokeWithInvocation:outerInv]; - } else if ([self.realDelegate respondsToSelector:selector]) { - [outerInv invokeWithTarget:self.realDelegate]; - } -} - -#pragma mark - - -- (BOOL)conformsToProtocol:(Protocol *)aProtocol -{ - return protocol_isEqual(aProtocol, self.protocol) || [super conformsToProtocol:aProtocol]; -} -- (BOOL)respondsToSelector:(SEL)selector -{ - return [self.invocationsBySelectors bk_objectForSelector:selector] || class_respondsToSelector(object_getClass(self), selector) || [self.realDelegate respondsToSelector:selector]; -} - -- (void)doesNotRecognizeSelector:(SEL)aSelector -{ - [NSException raise:NSInvalidArgumentException format:@"-[%s %@]: unrecognized selector sent to instance %p", object_getClassName(self), NSStringFromSelector(aSelector), (__bridge void *)self]; -} - -#pragma mark - Block Instance Method Implementations - -- (id)blockImplementationForMethod:(SEL)selector -{ - A2BlockInvocation *invocation = nil; - if ((invocation = [self.invocationsBySelectors bk_objectForSelector:selector])) - return invocation.block; - return NULL; -} - -- (void)implementMethod:(SEL)selector withBlock:(id)block -{ - NSCAssert(selector, @"Attempt to implement or remove NULL selector"); - BOOL isClassMethod = self.isClassProxy; - - if (!block) { - [self.invocationsBySelectors bk_removeObjectForSelector:selector]; - return; - } - - struct objc_method_description methodDescription = protocol_getMethodDescription(self.protocol, selector, YES, !isClassMethod); - if (!methodDescription.name) methodDescription = protocol_getMethodDescription(self.protocol, selector, NO, !isClassMethod); - - A2BlockInvocation *inv = nil; - if (methodDescription.name) { - NSMethodSignature *protoSig = [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; - inv = [[A2BlockInvocation alloc] initWithBlock:block methodSignature:protoSig]; - } else { - inv = [[A2BlockInvocation alloc] initWithBlock:block]; - } - - [self.invocationsBySelectors bk_setObject:inv forSelector:selector]; -} -- (void)removeBlockImplementationForMethod:(SEL)selector __unused -{ - [self implementMethod:selector withBlock:nil]; -} - -#pragma mark - Block Class Method Implementations - -- (id)blockImplementationForClassMethod:(SEL)selector -{ - return [self.classProxy blockImplementationForMethod:selector]; -} - -- (void)implementClassMethod:(SEL)selector withBlock:(id)block -{ - [self.classProxy implementMethod:selector withBlock:block]; -} -- (void)removeBlockImplementationForClassMethod:(SEL)selector __unused -{ - [self.classProxy implementMethod:selector withBlock:nil]; -} - -@end - -#pragma mark - - -@implementation A2DynamicClassDelegate - -- (BOOL)isClassProxy -{ - return YES; -} -- (BOOL)isEqual:(id)object -{ - return [super isEqual:object] || [_proxiedClass isEqual:object]; -} -- (BOOL)respondsToSelector:(SEL)aSelector -{ - return [self.invocationsBySelectors bk_objectForSelector:aSelector] || [_proxiedClass respondsToSelector:aSelector]; -} - -- (Class)class -{ - return self.proxiedClass; -} - -- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector -{ - A2BlockInvocation *invocation = nil; - if ((invocation = [self.invocationsBySelectors bk_objectForSelector:aSelector])) - return invocation.methodSignature; - else if ([_proxiedClass methodSignatureForSelector:aSelector]) - return [_proxiedClass methodSignatureForSelector:aSelector]; - return [[NSObject class] methodSignatureForSelector:aSelector]; -} - -- (NSString *)description -{ - return [_proxiedClass description]; -} - -- (NSUInteger)hash -{ - return [_proxiedClass hash]; -} - -- (void)forwardInvocation:(NSInvocation *)outerInv -{ - SEL selector = outerInv.selector; - A2BlockInvocation *innerInv = nil; - if ((innerInv = [self.invocationsBySelectors bk_objectForSelector:selector])) { - [innerInv invokeWithInvocation:outerInv]; - } else { - [outerInv invokeWithTarget:_proxiedClass]; - } -} - -#pragma mark - Unavailable Methods - -- (id)blockImplementationForClassMethod:(SEL)selector -{ - [self doesNotRecognizeSelector:_cmd]; - return nil; -} - -- (void)implementClassMethod:(SEL)selector withBlock:(id)block -{ - [self doesNotRecognizeSelector:_cmd]; -} -- (void)removeBlockImplementationForClassMethod:(SEL)selector -{ - [self doesNotRecognizeSelector:_cmd]; -} - -@end - -#pragma mark - Helper functions - -static Protocol *a2_classProtocol(Class _cls, NSString *suffix, NSString *description) -{ - Class cls = _cls; - while (cls) { - NSString *className = NSStringFromClass(cls); - NSString *protocolName = [className stringByAppendingString:suffix]; - Protocol *protocol = objc_getProtocol(protocolName.UTF8String); - if (protocol) return protocol; - - cls = class_getSuperclass(cls); - } - - NSCAssert(NO, @"Specify protocol explicitly: could not determine %@ protocol for class %@ (tried <%@>)", description, NSStringFromClass(_cls), [NSStringFromClass(_cls) stringByAppendingString:suffix]); - return nil; -} - -Protocol *a2_dataSourceProtocol(Class cls) -{ - return a2_classProtocol(cls, @"DataSource", @"data source"); -} -Protocol *a2_delegateProtocol(Class cls) -{ - return a2_classProtocol(cls, @"Delegate", @"delegate"); -} -Protocol *a2_protocolForDelegatingObject(id obj, Protocol *protocol) -{ - NSString *protocolName = NSStringFromProtocol(protocol); - if ([protocolName hasSuffix:@"Delegate"]) { - Protocol *p = a2_delegateProtocol([obj class]); - if (p) return p; - } else if ([protocolName hasSuffix:@"DataSource"]) { - Protocol *p = a2_dataSourceProtocol([obj class]); - if (p) return p; - } - - return protocol; -} diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h deleted file mode 100644 index 92e09db..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// NSCache+BlocksKit.h -// BlocksKit -// - -#import - -/** NSCache with block adding of objects - - This category allows you to conditionally add objects to - an instance of NSCache using blocks. Both the normal - delegation pattern and a block callback for NSCache's one - delegate method are allowed. - - These methods emulate Rails caching behavior. - - Created by [Igor Evsukov](https://github.com/evsukov89) and contributed to BlocksKit. - */ - -@interface NSCache (BlocksKit) - -/** Returns the value associated with a given key. If there is no - object for that key, it uses the result of the block, saves - that to the cache, and returns it. - - This mimics the cache behavior of Ruby on Rails. The following code: - - @products = Rails.cache.fetch('products') do - Product.all - end - - becomes: - - NSMutableArray *products = [cache objectForKey:@"products" withGetter:^id{ - return [Product all]; - }]; - - @return The value associated with *key*, or the object returned - by the block if no value is associated with *key*. - @param key An object identifying the value. - @param getterBlock A block used to get an object if there is no - value in the cache. - */ -- (id)bk_objectForKey:(id)key withGetter:(id (^)(void))getterBlock; - -/** Called when an object is about to be evicted from the cache. - - This block callback is an analog for the cache:willEviceObject: - method of NSCacheDelegate. - */ -@property (nonatomic, copy, setter = bk_setWillEvictBlock:) void (^bk_willEvictBlock)(NSCache *cache, id obj); - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.m deleted file mode 100644 index 3f96196..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// NSCache+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "NSCache+BlocksKit.h" -#import "NSObject+A2BlockDelegate.h" - -#pragma mark Custom delegate - -@interface A2DynamicNSCacheDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicNSCacheDelegate - -- (void)cache:(NSCache *)cache willEvictObject:(id)obj -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(cache:willEvictObject:)]) - [realDelegate cache:cache willEvictObject:obj]; - - void (^orig)(NSCache *, id) = [self blockImplementationForMethod:_cmd]; - if (orig) orig(cache, obj); -} - -@end - -#pragma mark Category - -@implementation NSCache (BlocksKit) - -@dynamic bk_willEvictBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ @"bk_willEvictBlock": @"cache:willEvictObject:" }]; - } -} - -#pragma mark Methods - -- (id)bk_objectForKey:(id)key withGetter:(id (^)(void))block -{ - id object = [self objectForKey:key]; - if (object) return object; - - if (block) { - object = block(); - [self setObject:object forKey:key]; - } - - return object; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h deleted file mode 100644 index b6e0c9e..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h +++ /dev/null @@ -1,139 +0,0 @@ -// -// NSURLConnection+BlocksKit.h -// BlocksKit -// - -#import - -/** NSURLConnection with both delegate and block callback support. - - It also adds useful block handlers for tracking upload and download progress. - - Here is a small example: - - (void)downloadImage:(id)sender { - self.downloadButton.enabled = NO; - self.progressView.progress = 0.0f; - NSURL *imageURL = [NSURL URLWithString:@"http://icanhascheezburger.files.wordpress.com/2011/06/funny-pictures-nyan-cat-wannabe1.jpg"]; - NSURLRequest *request = [NSURLRequest requestWithURL:imageURL]; - NSURLConnection *connection = [NSURLConnection connectionWithRequest:request]; - connection.delegate = self; - connection.failureBlock = ^(NSURLConnection *connection, NSError *error) { - [[UIAlertView alertViewWithTitle:@"Download error" message:[error localizedDescription]] show]; - - self.downloadButton.enabled = YES; - self.progressView.progress = 0.0f; - }; - connection.successBlock = ^(NSURLConnection *connection, NSURLResponse *response, NSData *responseData) { - self.imageView.image = [UIImage imageWithData:responseData]; - self.downloadButton.enabled = YES; - }; - connection.downloadBlock = ^(double progress) { - self.progressView.progress = progress; - }; - - [connection start]; - } - - //these methods will be called too! - - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { - NSLog(@"%s",__PRETTY_FUNCTION__); - } - - - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { - NSLog(@"%s",__PRETTY_FUNCTION__); - } - - Created by Igor Evsukov as - [IEURLConnection](https://github.com/evsukov89/IEURLConnection) and contributed - to BlocksKit. -*/ - -@interface NSURLConnection (BlocksKit) - -/** A mutable delegate that implements the NSURLConnectionDelegate protocol. - - This property allows for both use of block callbacks and delegate methods - in an instance of NSURLConnection. It only works on block-backed - NSURLConnection instances. - */ -@property (nonatomic, weak, setter = setDelegate:) id delegate; - -/** The block fired once the connection recieves a response from the server. - - This block corresponds to the connection:didReceiveResponse: method - of NSURLConnectionDataDelegate. */ -@property (nonatomic, copy, setter = bk_setResponseBlock:) void (^bk_responseBlock)(NSURLConnection *connection, NSURLResponse *response); - -/** The block fired upon the failure of the connection. - - This block corresponds to the connection:didFailWithError: - method of NSURLConnectionDelegate. */ -@property (nonatomic, copy, setter = bk_setFailureBlock:) void (^bk_failureBlock)(NSURLConnection *connection, NSError *error); - -/** The block that upon the successful completion of the connection. - - This block corresponds to the connectionDidFinishLoading: - method of NSURLConnectionDelegate. - - @warning If the delegate implements connection:didRecieveData:, then this - block will *not* include the data recieved by the connection and appending - the recieved data to an instance NSMutableData is left up to the user due - to the behavior of frameworks that use NSURLConnection. - */ -@property (nonatomic, copy, setter = bk_setSuccessBlock:) void (^bk_successBlock)(NSURLConnection *connection, NSURLResponse *response, NSData *responseData); - -/** The block fired every time new data is sent to the server, - representing the current percentage of completion. - - This block corresponds to the - connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: - method of NSURLConnectionDelegate. - */ -@property (nonatomic, copy, setter = bk_setUploadBlock:) void (^bk_uploadBlock)(double percent); - -/** The block fired every time new data is recieved from the server, - representing the current percentage of completion. - - This block corresponds to the connection:didRecieveData: - method of NSURLConnectionDelegate. - */ -@property (nonatomic, copy, setter = bk_setDownloadBlock:) void (^bk_downloadBlock)(double percent); - -/** Creates and returns an initialized block-backed URL connection that does not begin to load the data for the URL request. - - @param request The URL request to load. - @return An autoreleased NSURLConnection for the specified URL request. - */ -+ (NSURLConnection *)bk_connectionWithRequest:(NSURLRequest *)request; - -/** Creates, starts, and returns an asynchronous, block-backed URL connection - - @return New and running NSURLConnection with the specified properties. - @param request The URL request to load. - @param success A code block that acts on instances of NSURLResponse and NSData in the event of a successful connection. - @param failure A code block that acts on instances of NSURLResponse and NSError in the event of a failed connection. - */ -+ (NSURLConnection *)bk_startConnectionWithRequest:(NSURLRequest *)request successHandler:(void (^)(NSURLConnection *connection, NSURLResponse *response, NSData *responseData))success failureHandler:(void (^)(NSURLConnection *connection, NSError *error))failure; - -/** Returns an initialized block-backed URL connection. - - @return Newly initialized NSURLConnection with the specified properties. - @param request The URL request to load. - */ -- (id)bk_initWithRequest:(NSURLRequest *)request NS_REPLACES_RECEIVER; - -/** Returns an initialized URL connection with the specified completion handler. - - @return Newly initialized NSURLConnection with the specified properties. - @param request The URL request to load. - @param block A code block that acts on instances of NSURLResponse and NSData in the event of a successful connection. - */ -- (id)bk_initWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLConnection *connection, NSURLResponse *response, NSData *responseData))block NS_REPLACES_RECEIVER; - -/** Causes the connection to begin loading data, if it has not already, with the specified block to be fired on successful completion. - - @param block A code block that acts on instances of NSURLResponse and NSData in the event of a successful connection. - */ -- (void)bk_startWithCompletionBlock:(void (^)(NSURLConnection *connection, NSURLResponse *response, NSData *responseData))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.m deleted file mode 100644 index 301fcd4..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.m +++ /dev/null @@ -1,426 +0,0 @@ -// -// NSURLConnection+BlocksKit.m -// BlocksKit -// - -#import -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" -#import "NSObject+A2DynamicDelegate.h" -#import "NSURLConnection+BlocksKit.h" - -#pragma mark Private - -static const void *BKResponseDataKey = &BKResponseDataKey; -static const void *BKResponseKey = &BKResponseKey; -static const void *BKResponseLengthKey = &BKResponseLengthKey; - -@interface NSURLConnection (BlocksKitPrivate) - -@property (nonatomic, retain, setter = bk_setResponseData:) NSMutableData *bk_responseData; -@property (nonatomic, retain, setter = bk_setResponse:) NSURLResponse *bk_response; -@property (nonatomic, setter = bk_setResponseLength:) NSUInteger bk_responseLength; - -@end - -@implementation NSURLConnection (BlocksKitPrivate) - -- (NSMutableData *)bk_responseData -{ - return objc_getAssociatedObject(self, BKResponseDataKey); -} - -- (void)bk_setResponseData:(NSMutableData *)responseData -{ - objc_setAssociatedObject(self, BKResponseDataKey, responseData, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSURLResponse *)bk_response -{ - return objc_getAssociatedObject(self, BKResponseKey); -} - -- (void)bk_setResponse:(NSURLResponse *)response -{ - objc_setAssociatedObject(self, BKResponseKey, response, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSUInteger)bk_responseLength -{ - return [objc_getAssociatedObject(self, BKResponseLengthKey) unsignedIntegerValue]; -} - -- (void)bk_setResponseLength:(NSUInteger)responseLength -{ - objc_setAssociatedObject(self, BKResponseLengthKey, @(responseLength), OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -@end - -#pragma mark - BKURLConnectionInformalDelegate - iOS 4.3 & Snow Leopard support - -@protocol BKURLConnectionInformalDelegate - -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; -- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; -- (void)connectionDidFinishLoading:(NSURLConnection *)connection; -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; -- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; -- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace; - -@end - -@interface A2DynamicBKURLConnectionInformalDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicBKURLConnectionInformalDelegate - -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveResponse:)]) - [realDelegate connection:connection didReceiveResponse:response]; - - connection.bk_responseLength = 0; - [connection.bk_responseData setLength:0]; - - connection.bk_response = response; - - void (^block)(NSURLConnection *, NSURLResponse *) = [self blockImplementationForMethod:_cmd]; - if (block) block(connection, response); -} - -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data -{ - connection.bk_responseLength += data.length; - - void (^block)(double) = connection.bk_downloadBlock; - if (block && connection.bk_response && connection.bk_response.expectedContentLength != NSURLResponseUnknownLength) - block((double)connection.bk_responseLength / (double)connection.bk_response.expectedContentLength); - - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveData:)]) { - [realDelegate connection:connection didReceiveData:data]; - return; - } - - NSMutableData *responseData = connection.bk_responseData; - if (!responseData) { - responseData = [NSMutableData data]; - connection.bk_responseData = responseData; - } - - [responseData appendData:data]; -} - -- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) - [realDelegate connection:connection didSendBodyData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; - - void (^block)(double) = connection.bk_uploadBlock; - if (block) block((double)totalBytesWritten/(double)totalBytesExpectedToWrite); -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connectionDidFinishLoading:)]) - [realDelegate connectionDidFinishLoading:connection]; - - if (!connection.bk_responseData.length) - connection.bk_responseData = nil; - - void (^block)(NSURLConnection *, NSURLResponse *, NSData *) = connection.bk_successBlock; - if (block) block(connection, connection.bk_response, connection.bk_responseData); -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didFailWithError:)]) - [realDelegate connection:connection didFailWithError:error]; - - connection.bk_responseLength = 0; - [connection.bk_responseData setLength:0]; - - void (^block)(NSURLConnection *, NSError *) = [self blockImplementationForMethod:_cmd]; - if (block) block(connection, error); -} - -- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveAuthenticationChallenge:)]) - [realDelegate connection:connection didReceiveAuthenticationChallenge:challenge]; -} - -- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:canAuthenticateAgainstProtectionSpace:)]) - return [realDelegate connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; - - return NO; -} - -@end - -#pragma mark - NSURLConnectionDelegate - iOS 5.0 & Lion support - -@interface A2DynamicNSURLConnectionDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicNSURLConnectionDelegate - -- (BOOL)conformsToProtocol:(Protocol *)protocol -{ - Protocol *dataDelegateProtocol = objc_getProtocol("NSURLConnectionDataDelegate"); - return (protocol_isEqual(protocol, dataDelegateProtocol) || protocol_isEqual(protocol, self.protocol) || [super conformsToProtocol:protocol]); -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didFailWithError:)]) - [realDelegate connection:connection didFailWithError:error]; - - connection.bk_responseLength = 0; - [connection.bk_responseData setLength:0]; - - void (^block)(NSURLConnection *, NSError *) = [self blockImplementationForMethod:_cmd]; - if (block) block(connection, error); -} - -- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connectionShouldUseCredentialStorage:)]) - return [realDelegate connectionShouldUseCredentialStorage:connection]; - - return YES; -} - -- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:willSendRequestForAuthenticationChallenge:)]) - [realDelegate connection:connection willSendRequestForAuthenticationChallenge:challenge]; -} - -#pragma mark - NSURLConnectionDataDelegate - -- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:willSendRequest:redirectResponse:)]) - return [realDelegate connection:connection willSendRequest:request redirectResponse:response]; - - return request; -} - -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveResponse:)]) - [realDelegate connection:connection didReceiveResponse:response]; - - connection.bk_responseLength = 0; - - if (connection.bk_responseData) - [connection.bk_responseData setLength:0]; - - connection.bk_response = response; - - void (^block)(NSURLConnection *, NSURLResponse *) = [self blockImplementationForMethod:_cmd]; - if (block) block(connection, response); -} - -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data -{ - connection.bk_responseLength += data.length; - - void (^block)(double) = connection.bk_downloadBlock; - if (block && connection.bk_response && connection.bk_response.expectedContentLength != NSURLResponseUnknownLength) - block((double)connection.bk_responseLength / (double)connection.bk_response.expectedContentLength); - - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveData:)]) { - [realDelegate connection:connection didReceiveData:data]; - return; - } - - NSMutableData *responseData = connection.bk_responseData; - if (!responseData) { - responseData = [NSMutableData data]; - connection.bk_responseData = responseData; - } - - [responseData appendData:data]; -} - -- (NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:needNewBodyStream:)]) - return [realDelegate connection:connection needNewBodyStream:request]; - - return nil; -} - -- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:)]) - [realDelegate connection:connection didSendBodyData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite]; - - void (^block)(double) = connection.bk_uploadBlock; - if (block) - block((double)totalBytesWritten/(double)totalBytesExpectedToWrite); -} - -- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:willCacheResponse:)]) - return [realDelegate connection:connection willCacheResponse:cachedResponse]; - - return cachedResponse; -} - -- (void)connectionDidFinishLoading:(NSURLConnection *)connection -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connectionDidFinishLoading:)]) - [realDelegate connectionDidFinishLoading:connection]; - - if (!connection.bk_responseData.length) - connection.bk_responseData = nil; - - void (^block)(NSURLConnection *, NSURLResponse *, NSData *) = connection.bk_successBlock; - if (block) - block(connection, connection.bk_response, connection.bk_responseData); -} - -#pragma mark - Deprecated iOS 4.x authentication methods - -- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:didReceiveAuthenticationChallenge:)]) - [realDelegate connection:connection didReceiveAuthenticationChallenge:challenge]; -} - -- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(connection:canAuthenticateAgainstProtectionSpace:)]) - return [realDelegate connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; - - return NO; -} - -@end - -#pragma mark - Category - -static NSString *const kSuccessBlockKey = @"NSURLConnectionDidFinishLoading"; -static NSString *const kFailureBlockKey = @"NSURLConnectionDidFailWithError"; -static NSString *const kUploadBlockKey = @"NSURLConnectionDidSendData"; -static NSString *const kDownloadBlockKey = @"NSURLConnectionDidRecieveData"; - -@implementation NSURLConnection (BlocksKit) - -@dynamic delegate, bk_responseBlock, bk_failureBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ @"bk_responseBlock": @"connection:didReceiveResponse:", @"bk_failureBlock": @"connection:didFailWithError:" }]; - } -} - -#pragma mark Initializers - -+ (NSURLConnection*)bk_connectionWithRequest:(NSURLRequest *)request -{ - return [[[self class] alloc] bk_initWithRequest:request]; -} - -+ (NSURLConnection *)bk_startConnectionWithRequest:(NSURLRequest *)request successHandler:(void (^)(NSURLConnection *, NSURLResponse *, NSData *))success failureHandler:(void (^)(NSURLConnection *, NSError *))failure -{ - Protocol *delegateProtocol = objc_getProtocol("NSURLConnectionDelegate"); - if (!delegateProtocol) - delegateProtocol = @protocol(BKURLConnectionInformalDelegate); - NSURLConnection *ret = [[self class] alloc]; - A2DynamicDelegate *dd = [ret bk_dynamicDelegateForProtocol:delegateProtocol]; - if (success) - dd.handlers[kSuccessBlockKey] = [success copy]; - if (failure) - [dd implementMethod:@selector(connection:didFailWithError:) withBlock:[failure copy]]; - return [ret initWithRequest:request delegate:dd startImmediately:YES]; -} - -- (id)bk_initWithRequest:(NSURLRequest *)request -{ - return (self = [self bk_initWithRequest:request completionHandler:nil]); -} - -- (id)bk_initWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLConnection *, NSURLResponse *, NSData *))block -{ - Protocol *delegateProtocol = objc_getProtocol("NSURLConnectionDelegate"); - if (!delegateProtocol) - delegateProtocol = @protocol(BKURLConnectionInformalDelegate); - A2DynamicDelegate *dd = [self bk_dynamicDelegateForProtocol:delegateProtocol]; - if (block) - dd.handlers[kSuccessBlockKey] = [block copy]; - return (self = [self initWithRequest:request delegate:dd startImmediately:NO]); -} - -- (void)bk_startWithCompletionBlock:(void (^)(NSURLConnection *, NSURLResponse *, NSData *))block -{ - self.bk_successBlock = block; - [self start]; -} - -#pragma mark Properties - -- (void (^)(NSURLConnection *, NSURLResponse *, NSData *))bk_successBlock { - return [self.bk_dynamicDelegate handlers][kSuccessBlockKey]; -} - -- (void)bk_setSuccessBlock:(void (^)(NSURLConnection *, NSURLResponse *, NSData *))block { - if (block) - [self.bk_dynamicDelegate handlers][kSuccessBlockKey] = [block copy]; - else - [[self.bk_dynamicDelegate handlers] removeObjectForKey:kSuccessBlockKey]; -} - -- (void (^)(double))bk_uploadBlock { - return [self.bk_dynamicDelegate handlers][kUploadBlockKey]; -} - -- (void)bk_setUploadBlock:(void (^)(double))block { - if (block) - [self.bk_dynamicDelegate handlers][kUploadBlockKey] = [block copy]; - else - [[self.bk_dynamicDelegate handlers] removeObjectForKey:kUploadBlockKey]; -} - -- (void (^)(double))bk_downloadBlock { - return [self.bk_dynamicDelegate handlers][kDownloadBlockKey]; -} - -- (void)bk_setDownloadBlock:(void (^)(double))block { - if (block) - [self.bk_dynamicDelegate handlers][kDownloadBlockKey] = [block copy]; - else - [[self.bk_dynamicDelegate handlers] removeObjectForKey:kDownloadBlockKey]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h deleted file mode 100644 index ca76837..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h +++ /dev/null @@ -1,116 +0,0 @@ -// -// NSObject+A2BlockDelegate.h -// BlocksKit -// - -#import - -/** The A2BlockDelegate category extends features provided by A2DynamicDelegate - to create custom block properties in a category on a delegating object and - dynamically map them to delegate (`UIAlertViewDelegate`), data source - (`UITableViewDataSource`), or other delegated protocol - (`NSErrorRecoveryAttempting`) methods. - - A2BlockDelegate also supports replacing the delegate of a given class with an - automatic - though optional - version of these block-based properties, while - still allowing for traditional method-based delegate implementations. - - Simply call one of the methods in the category on a class to add a block - property to that class, preferably during a `+load` method in a category. - - To interplay between classes that support delegation but are extended to have - block properties through delegate replacement extended to have block - properties, one should implement an `A2Dynamic` subclass of - `A2DynamicDelegate`. This behavior is documented in detail in the class - documentation for A2DynamicDelegate, and examples exist in BlocksKit. - */ -@interface NSObject (A2BlockDelegate) - -/** @name Linking Block Properties */ - -/** Synthesizes multiple properties and links them to the appropriate selector - in the data source protocol. - - A2DynamicDelegate assumes a protocol name `FooBarDataSource` for instances of - class `FooBar`. The method will generate appropriate `setHandler:` and - `handler` implementations for each property name and selector name string pair. - - @param selectorsForPropertyNames A dictionary with property names as keys and - selector strings as objects. - */ -+ (void)bk_linkDataSourceMethods:(NSDictionary *)selectorsForPropertyNames; - -/** Synthesizes multiple properties and links them to the appropriate selector - in the delegate protocol. - - A2DynamicDelegate assumes a protocol name `FooBarDelegate` for instances of - class `FooBar`. The method will generate appropriate `setHandler:` and - `handler` implementations for each property name and selector name string pair. - - @param selectorsForPropertyNames A dictionary with property names as keys and - selectors strings as objects. - */ -+ (void)bk_linkDelegateMethods:(NSDictionary *)selectorsForPropertyNames; - -/** Synthesizes multiple properties and links them to the appropriate selector - in the given protocol. - - The method will generate appropriate `setHandler:` and `handler` - implementations for each property name and selector name string pair. - - @param protocol A protocol that declares all of the given selectors. Must not - be NULL. - @param selectorsForPropertyNames A dictionary with property names as keys and - selector strings as objects. - */ -+ (void)bk_linkProtocol:(Protocol *)protocol methods:(NSDictionary *)selectorsForPropertyNames; - -/** @name Delegate replacement properties */ - -/** Registers a dynamic data source replacement using the property name - `dataSource` and the protocol name `FooBarDataSource` for an instance of - `FooBar`. */ -+ (void)bk_registerDynamicDataSource; - -/** Registers a dynamic delegate replacement using the property name `delegate` - and the protocol name `FooBarDelegate` for an instance of `FooBar`. */ -+ (void)bk_registerDynamicDelegate; - -/** Registers a dynamic data source replacement using the given property name - and the protocol name `FooBarDataSource` for an instance of `FooBar`. - - @param dataSourceName The name of the class' data source property. Must not be - nil. - */ -+ (void)bk_registerDynamicDataSourceNamed:(NSString *)dataSourceName; - -/** Registers a dynamic delegate replacement using the given property name and - the protocol name `FooBarDelegate` for an instance of `FooBar`. - - @param delegateName The name of the class' delegate property. Must not be nil. - */ -+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName; - -/** Registers a dynamic protocol implementation replacement - using the given property name and the given protocol. - - @param delegateName The name of the class' delegation protocol property, such - as `safeDelegate`. Must not be nil. - @param protocol A properly encoded protocol. Must not be NULL. - */ -+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName forProtocol:(Protocol *)protocol; - -/** Creates or gets a dynamic delegate, assuring that it is the delegate. - @see bk_dynamicDelegate: - @return A dynamic delegate. - */ -- (id)bk_ensuredDynamicDelegate; - -/** Creates or gets a dynamic protocol implementation, assuring that it is - assigned to the delegate property correspending to that protocol - @see bk_dynamicDelegateForProtocol: - @return A dynamic delegate. - */ -- (id)bk_ensuredDynamicDelegateForProtocol:(Protocol *)protocol; - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.m deleted file mode 100644 index 13515ca..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.m +++ /dev/null @@ -1,363 +0,0 @@ -// -// NSObject+A2BlockDelegate.m -// BlocksKit -// - -#import -#import "NSObject+A2BlockDelegate.h" -#import "NSObject+A2DynamicDelegate.h" - -#pragma mark - Declarations and macros - -extern Protocol *a2_dataSourceProtocol(Class cls); -extern Protocol *a2_delegateProtocol(Class cls); - -#pragma mark - Functions - -static BOOL bk_object_isKindOfClass(id obj, Class testClass) -{ - BOOL isKindOfClass = NO; - Class cls = object_getClass(obj); - while (cls && !isKindOfClass) { - isKindOfClass = (cls == testClass); - cls = class_getSuperclass(cls); - } - - return isKindOfClass; -} - -static Protocol *a2_protocolForDelegatingObject(id obj, Protocol *protocol) -{ - NSString *protocolName = NSStringFromProtocol(protocol); - if ([protocolName hasSuffix:@"Delegate"]) { - Protocol *p = a2_delegateProtocol([obj class]); - if (p) return p; - } else if ([protocolName hasSuffix:@"DataSource"]) { - Protocol *p = a2_dataSourceProtocol([obj class]); - if (p) return p; - } - - return protocol; -} - -static inline BOOL isValidIMP(IMP impl) { -#if defined(__arm64__) - if (impl == NULL || impl == _objc_msgForward) return NO; -#else - if (impl == NULL || impl == _objc_msgForward || impl == (IMP)_objc_msgForward_stret) return NO; -#endif - return YES; -} - -static BOOL addMethodWithIMP(Class cls, SEL oldSel, SEL newSel, IMP newIMP, const char *types, BOOL aggressive) { - if (!class_addMethod(cls, oldSel, newIMP, types)) { - return NO; - } - - // We just ended up implementing a method that doesn't exist - // (-[NSURLConnection setDelegate:]) or overrode a superclass - // version (-[UIImagePickerController setDelegate:]). - IMP parentIMP = NULL; - Class superclass = class_getSuperclass(cls); - while (superclass && !isValidIMP(parentIMP)) { - parentIMP = class_getMethodImplementation(superclass, oldSel); - if (isValidIMP(parentIMP)) { - break; - } else { - parentIMP = NULL; - } - - superclass = class_getSuperclass(superclass); - } - - if (parentIMP) { - if (aggressive) { - return class_addMethod(cls, newSel, parentIMP, types); - } - - class_replaceMethod(cls, newSel, newIMP, types); - class_replaceMethod(cls, oldSel, parentIMP, types); - } - - return YES; -} - -static BOOL swizzleWithIMP(Class cls, SEL oldSel, SEL newSel, IMP newIMP, const char *types, BOOL aggressive) { - Method origMethod = class_getInstanceMethod(cls, oldSel); - - if (addMethodWithIMP(cls, oldSel, newSel, newIMP, types, aggressive)) { - return YES; - } - - // common case, actual swap - BOOL ret = class_addMethod(cls, newSel, newIMP, types); - Method newMethod = class_getInstanceMethod(cls, newSel); - method_exchangeImplementations(origMethod, newMethod); - return ret; -} - -static SEL selectorWithPattern(const char *prefix, const char *key, const char *suffix) { - size_t prefixLength = prefix ? strlen(prefix) : 0; - size_t suffixLength = suffix ? strlen(suffix) : 0; - - char initial = key[0]; - if (prefixLength) initial = (char)toupper(initial); - size_t initialLength = 1; - - const char *rest = key + initialLength; - size_t restLength = strlen(rest); - - char selector[prefixLength + initialLength + restLength + suffixLength + 1]; - memcpy(selector, prefix, prefixLength); - selector[prefixLength] = initial; - memcpy(selector + prefixLength + initialLength, rest, restLength); - memcpy(selector + prefixLength + initialLength + restLength, suffix, suffixLength); - selector[prefixLength + initialLength + restLength + suffixLength] = '\0'; - - return sel_registerName(selector); -} - -static SEL getterForProperty(objc_property_t property, const char *name) -{ - if (property) { - char *getterName = property_copyAttributeValue(property, "G"); - if (getterName) { - SEL getter = sel_getUid(getterName); - free(getterName); - if (getter) return getter; - } - } - - const char *propertyName = property ? property_getName(property) : name; - return sel_registerName(propertyName); -} - -static SEL setterForProperty(objc_property_t property, const char *name) -{ - if (property) { - char *setterName = property_copyAttributeValue(property, "S"); - if (setterName) { - SEL setter = sel_getUid(setterName); - free(setterName); - if (setter) return setter; - } - } - - const char *propertyName = property ? property_getName(property) : name; - return selectorWithPattern("set", propertyName, ":"); -} - -static inline SEL prefixedSelector(SEL original) { - return selectorWithPattern("a2_", sel_getName(original), NULL); -} - -#pragma mark - - -typedef struct { - SEL setter; - SEL a2_setter; - SEL getter; -} A2BlockDelegateInfo; - -static NSUInteger A2BlockDelegateInfoSize(const void *__unused item) { - return sizeof(A2BlockDelegateInfo); -} - -static NSString *A2BlockDelegateInfoDescribe(const void *__unused item) { - if (!item) { return nil; } - const A2BlockDelegateInfo *info = item; - return [NSString stringWithFormat:@"(setter: %s, getter: %s)", sel_getName(info->setter), sel_getName(info->getter)]; -} - -static inline A2DynamicDelegate *getDynamicDelegate(NSObject *delegatingObject, Protocol *protocol, const A2BlockDelegateInfo *info, BOOL ensuring) { - A2DynamicDelegate *dynamicDelegate = [delegatingObject bk_dynamicDelegateForProtocol:a2_protocolForDelegatingObject(delegatingObject, protocol)]; - - if (!info || !info->setter || !info->getter) { - return dynamicDelegate; - } - - if (!info->a2_setter && !info->setter) { return dynamicDelegate; } - - id (*getterDispatch)(id, SEL) = (id (*)(id, SEL)) objc_msgSend; - id originalDelegate = getterDispatch(delegatingObject, info->getter); - - if (bk_object_isKindOfClass(originalDelegate, A2DynamicDelegate.class)) { return dynamicDelegate; } - - void (*setterDispatch)(id, SEL, id) = (void (*)(id, SEL, id)) objc_msgSend; - setterDispatch(delegatingObject, info->a2_setter ?: info->setter, dynamicDelegate); - - return dynamicDelegate; -} - -typedef A2DynamicDelegate *(^A2GetDynamicDelegateBlock)(NSObject *, BOOL); - -@interface A2DynamicDelegate () - -@property (nonatomic, weak, readwrite) id realDelegate; - -@end - -#pragma mark - - -@implementation NSObject (A2BlockDelegate) - -#pragma mark Helpers - -+ (NSMapTable *)bk_delegateInfoByProtocol:(BOOL)createIfNeeded -{ - NSMapTable *delegateInfo = objc_getAssociatedObject(self, _cmd); - if (delegateInfo || !createIfNeeded) { return delegateInfo; } - - NSPointerFunctions *protocols = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsOpaqueMemory|NSPointerFunctionsObjectPointerPersonality]; - NSPointerFunctions *infoStruct = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsMallocMemory|NSPointerFunctionsStructPersonality|NSPointerFunctionsCopyIn]; - infoStruct.sizeFunction = A2BlockDelegateInfoSize; - infoStruct.descriptionFunction = A2BlockDelegateInfoDescribe; - - delegateInfo = [[NSMapTable alloc] initWithKeyPointerFunctions:protocols valuePointerFunctions:infoStruct capacity:0]; - objc_setAssociatedObject(self, _cmd, delegateInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - return delegateInfo; -} - -+ (const A2BlockDelegateInfo *)bk_delegateInfoForProtocol:(Protocol *)protocol -{ - A2BlockDelegateInfo *infoAsPtr = NULL; - Class cls = self; - while ((infoAsPtr == NULL || infoAsPtr->getter == NULL) && cls != nil && cls != NSObject.class) { - NSMapTable *map = [cls bk_delegateInfoByProtocol:NO]; - infoAsPtr = (__bridge void *)[map objectForKey:protocol]; - cls = [cls superclass]; - } - NSCAssert(infoAsPtr != NULL, @"Class %@ not assigned dynamic delegate for protocol %@", NSStringFromClass(self), NSStringFromProtocol(protocol)); - return infoAsPtr; -} - -#pragma mark Linking block properties - -+ (void)bk_linkDataSourceMethods:(NSDictionary *)dictionary -{ - [self bk_linkProtocol:a2_dataSourceProtocol(self) methods:dictionary]; -} - -+ (void)bk_linkDelegateMethods:(NSDictionary *)dictionary -{ - [self bk_linkProtocol:a2_delegateProtocol(self) methods:dictionary]; -} - -+ (void)bk_linkProtocol:(Protocol *)protocol methods:(NSDictionary *)dictionary -{ - [dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *propertyName, NSString *selectorName, BOOL *stop) { - const char *name = propertyName.UTF8String; - objc_property_t property = class_getProperty(self, name); - NSCAssert(property, @"Property \"%@\" does not exist on class %s", propertyName, class_getName(self)); - - char *dynamic = property_copyAttributeValue(property, "D"); - NSCAssert2(dynamic, @"Property \"%@\" on class %s must be backed with \"@dynamic\"", propertyName, class_getName(self)); - free(dynamic); - - char *copy = property_copyAttributeValue(property, "C"); - NSCAssert2(copy, @"Property \"%@\" on class %s must be defined with the \"copy\" attribute", propertyName, class_getName(self)); - free(copy); - - SEL selector = NSSelectorFromString(selectorName); - SEL getter = getterForProperty(property, name); - SEL setter = setterForProperty(property, name); - - if (class_respondsToSelector(self, setter) || class_respondsToSelector(self, getter)) { return; } - - const A2BlockDelegateInfo *info = [self bk_delegateInfoForProtocol:protocol]; - - IMP getterImplementation = imp_implementationWithBlock(^(NSObject *delegatingObject) { - A2DynamicDelegate *delegate = getDynamicDelegate(delegatingObject, protocol, info, NO); - return [delegate blockImplementationForMethod:selector]; - }); - - if (!class_addMethod(self, getter, getterImplementation, "@@:")) { - NSCAssert(NO, @"Could not implement getter for \"%@\" property.", propertyName); - } - - IMP setterImplementation = imp_implementationWithBlock(^(NSObject *delegatingObject, id block) { - A2DynamicDelegate *delegate = getDynamicDelegate(delegatingObject, protocol, info, YES); - [delegate implementMethod:selector withBlock:block]; - }); - - if (!class_addMethod(self, setter, setterImplementation, "v@:@")) { - NSCAssert(NO, @"Could not implement setter for \"%@\" property.", propertyName); - } - }]; -} - -#pragma mark Dynamic Delegate Replacement - -+ (void)bk_registerDynamicDataSource -{ - [self bk_registerDynamicDelegateNamed:@"dataSource" forProtocol:a2_dataSourceProtocol(self)]; -} -+ (void)bk_registerDynamicDelegate -{ - [self bk_registerDynamicDelegateNamed:@"delegate" forProtocol:a2_delegateProtocol(self)]; -} - -+ (void)bk_registerDynamicDataSourceNamed:(NSString *)dataSourceName -{ - [self bk_registerDynamicDelegateNamed:dataSourceName forProtocol:a2_dataSourceProtocol(self)]; -} -+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName -{ - [self bk_registerDynamicDelegateNamed:delegateName forProtocol:a2_delegateProtocol(self)]; -} - -+ (void)bk_registerDynamicDelegateNamed:(NSString *)delegateName forProtocol:(Protocol *)protocol -{ - NSMapTable *propertyMap = [self bk_delegateInfoByProtocol:YES]; - A2BlockDelegateInfo *infoAsPtr = (__bridge void *)[propertyMap objectForKey:protocol]; - if (infoAsPtr != NULL) { return; } - - const char *name = delegateName.UTF8String; - objc_property_t property = class_getProperty(self, name); - SEL setter = setterForProperty(property, name); - SEL a2_setter = prefixedSelector(setter); - SEL getter = getterForProperty(property, name); - - A2BlockDelegateInfo info = { - setter, a2_setter, getter - }; - - [propertyMap setObject:(__bridge id)&info forKey:protocol]; - infoAsPtr = (__bridge void *)[propertyMap objectForKey:protocol]; - - IMP setterImplementation = imp_implementationWithBlock(^(NSObject *delegatingObject, id delegate) { - A2DynamicDelegate *dynamicDelegate = getDynamicDelegate(delegatingObject, protocol, infoAsPtr, YES); - if ([delegate isEqual:dynamicDelegate]) { - delegate = nil; - } - dynamicDelegate.realDelegate = delegate; - }); - - if (!swizzleWithIMP(self, setter, a2_setter, setterImplementation, "v@:@", YES)) { - bzero(infoAsPtr, sizeof(A2BlockDelegateInfo)); - return; - } - - if (![self instancesRespondToSelector:getter]) { - IMP getterImplementation = imp_implementationWithBlock(^(NSObject *delegatingObject) { - return [delegatingObject bk_dynamicDelegateForProtocol:a2_protocolForDelegatingObject(delegatingObject, protocol)]; - }); - - addMethodWithIMP(self, getter, NULL, getterImplementation, "@@:", NO); - } -} - -- (id)bk_ensuredDynamicDelegate -{ - Protocol *protocol = a2_delegateProtocol(self.class); - return [self bk_ensuredDynamicDelegateForProtocol:protocol]; -} - -- (id)bk_ensuredDynamicDelegateForProtocol:(Protocol *)protocol -{ - const A2BlockDelegateInfo *info = [self.class bk_delegateInfoForProtocol:protocol]; - return getDynamicDelegate(self, protocol, info, YES); -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h b/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h deleted file mode 100644 index a99cfdc..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h +++ /dev/null @@ -1,67 +0,0 @@ -// -// NSObject+A2DynamicDelegate.h -// BlocksKit -// - -#import -#import - -/** The A2DynamicDelegate category to NSObject provides the primary interface - by which dynamic delegates are generated for a given object. */ -@interface NSObject (A2DynamicDelegate) - -/** Creates or gets a dynamic data source for the reciever. - - A2DynamicDelegate assumes a protocol name `FooBarDataSource` - for instances of class `FooBar`. The object is given a strong - attachment to the reciever, and is automatically deallocated - when the reciever is released. - - If the user implements a `A2DynamicFooBarDataSource` subclass - of A2DynamicDelegate, its implementation of any method - will be used over the block. If the block needs to be used, - it can be called from within the custom - implementation using blockImplementationForMethod:. - - @see blockImplementationForMethod: - @return A dynamic data source. - */ -- (id)bk_dynamicDataSource; - -/** Creates or gets a dynamic delegate for the reciever. - - A2DynamicDelegate assumes a protocol name `FooBarDelegate` - for instances of class `FooBar`. The object is given a strong - attachment to the reciever, and is automatically deallocated - when the reciever is released. - - If the user implements a `A2DynamicFooBarDelegate` subclass - of A2DynamicDelegate, its implementation of any method - will be used over the block. If the block needs to be used, - it can be called from within the custom - implementation using blockImplementationForMethod:. - - @see blockImplementationForMethod: - @return A dynamic delegate. - */ -- (id)bk_dynamicDelegate; - -/** Creates or gets a dynamic protocol implementation for - the reciever. The designated initializer. - - The object is given a strong attachment to the reciever, - and is automatically deallocated when the reciever is released. - - If the user implements a subclass of A2DynamicDelegate prepended - with `A2Dynamic`, such as `A2DynamicFooProvider`, its - implementation of any method will be used over the block. - If the block needs to be used, it can be called from within the - custom implementation using blockImplementationForMethod:. - - @param protocol A custom protocol. - @return A dynamic protocol implementation. - @see blockImplementationForMethod: - */ -- (id)bk_dynamicDelegateForProtocol:(Protocol *)protocol; - -@end diff --git a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.m b/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.m deleted file mode 100644 index 4ec24c8..0000000 --- a/Pods/BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.m +++ /dev/null @@ -1,88 +0,0 @@ -// -// NSObject+A2DynamicDelegate.m -// BlocksKit -// - -#import -#import "NSObject+A2DynamicDelegate.h" - -extern Protocol *a2_dataSourceProtocol(Class cls); -extern Protocol *a2_delegateProtocol(Class cls); - -static Class a2_dynamicDelegateClass(Class cls, NSString *suffix) -{ - while (cls) { - NSString *className = [NSString stringWithFormat:@"A2Dynamic%@%@", NSStringFromClass(cls), suffix]; - Class ddClass = NSClassFromString(className); - if (ddClass) return ddClass; - - cls = class_getSuperclass(cls); - } - - return [A2DynamicDelegate class]; -} - -static dispatch_queue_t a2_backgroundQueue(void) -{ - static dispatch_once_t onceToken; - static dispatch_queue_t backgroundQueue = nil; - dispatch_once(&onceToken, ^{ - backgroundQueue = dispatch_queue_create("BlocksKit.DynamicDelegate.Queue", DISPATCH_QUEUE_SERIAL); - }); - return backgroundQueue; -} - -@implementation NSObject (A2DynamicDelegate) - -- (id)bk_dynamicDataSource -{ - Protocol *protocol = a2_dataSourceProtocol([self class]); - Class class = a2_dynamicDelegateClass([self class], @"DataSource"); - return [self bk_dynamicDelegateWithClass:class forProtocol:protocol]; -} -- (id)bk_dynamicDelegate -{ - Protocol *protocol = a2_delegateProtocol([self class]); - Class class = a2_dynamicDelegateClass([self class], @"Delegate"); - return [self bk_dynamicDelegateWithClass:class forProtocol:protocol]; -} -- (id)bk_dynamicDelegateForProtocol:(Protocol *)protocol -{ - Class class = [A2DynamicDelegate class]; - NSString *protocolName = NSStringFromProtocol(protocol); - if ([protocolName hasSuffix:@"Delegate"]) { - class = a2_dynamicDelegateClass([self class], @"Delegate"); - } else if ([protocolName hasSuffix:@"DataSource"]) { - class = a2_dynamicDelegateClass([self class], @"DataSource"); - } - - return [self bk_dynamicDelegateWithClass:class forProtocol:protocol]; -} -- (id)bk_dynamicDelegateWithClass:(Class)cls forProtocol:(Protocol *)protocol -{ - /** - * Storing the dynamic delegate as an associated object of the delegating - * object not only allows us to later retrieve the delegate, but it also - * creates a strong relationship to the delegate. Since delegates are weak - * references on the part of the delegating object, a dynamic delegate - * would be deallocated immediately after its declaring scope ends. - * Therefore, this strong relationship is required to ensure that the - * delegate's lifetime is at least as long as that of the delegating object. - **/ - - __block A2DynamicDelegate *dynamicDelegate; - - dispatch_sync(a2_backgroundQueue(), ^{ - dynamicDelegate = objc_getAssociatedObject(self, (__bridge const void *)protocol); - - if (!dynamicDelegate) - { - dynamicDelegate = [[cls alloc] initWithProtocol:protocol]; - objc_setAssociatedObject(self, (__bridge const void *)protocol, dynamicDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - }); - - return dynamicDelegate; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h b/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h deleted file mode 100644 index 3675e60..0000000 --- a/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// MFMailComposeViewController+BlocksKit.h -// BlocksKit -// - -#import - -/** MFMailComposeViewController with block callbacks. - - If you provide a completion handler to an instance of - MFMailComposeViewController but do not implement a delegate callback for - mailComposeController:didFinishWithResult:error:, the mail compose view - controller will automatically be dismissed if it was launched modally. - - Created by [Igor Evsukov](https://github.com/evsukov89) and contributed to - BlocksKit. - - @warning MFMailComposeViewController is only available on a platform with MessageUI. - */ -@interface MFMailComposeViewController (BlocksKit) - -/** The block fired on the dismissal of the mail composition interface. - - This block callback is an analog for the - mailComposeController:didFinishWithResult:error:method - of MFMailComposeViewControllerDelegate. -*/ -@property (nonatomic, copy, setter = bk_setCompletionBlock:) void (^bk_completionBlock)(MFMailComposeViewController *controller, MFMailComposeResult result, NSError *error); - -@end diff --git a/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.m b/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.m deleted file mode 100644 index fdab4b6..0000000 --- a/Pods/BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.m +++ /dev/null @@ -1,70 +0,0 @@ -// -// MFMailComposeViewController+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "MFMailComposeViewController+BlocksKit.h" -#import "NSObject+A2BlockDelegate.h" - -#pragma mark Custom delegate - -@interface A2DynamicMFMailComposeViewControllerDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicMFMailComposeViewControllerDelegate - -- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error -{ - id realDelegate = self.realDelegate; - BOOL shouldDismiss = (realDelegate && [realDelegate respondsToSelector:@selector(mailComposeController:didFinishWithResult:error:)]); - if (shouldDismiss) - [realDelegate mailComposeController:controller didFinishWithResult:result error:error]; - - void (^block)(MFMailComposeViewController *, MFMailComposeResult, NSError *) = [self blockImplementationForMethod:_cmd]; - if (shouldDismiss) { - if (block) block(controller, result, error); - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 - __weak typeof(controller) weakController = controller; - [controller dismissViewControllerAnimated:YES completion:^{ - typeof(&*weakController) strongController = weakController; - if (block) block(strongController, result, error); - }]; -#else -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if ([controller respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) { - __weak typeof(controller) weakController = controller; - [controller dismissViewControllerAnimated:YES completion:^{ - typeof(&*weakController) strongController = weakController; - if (block) block(strongController, result, error); - }]; - } else { -#endif - [controller dismissModalViewControllerAnimated:YES]; - if (block) block(controller, result, error); -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - } -#endif -#endif - } -} - -@end - -#pragma mark Category - -@implementation MFMailComposeViewController (BlocksKit) - -@dynamic bk_completionBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegateNamed:@"mailComposeDelegate"]; - [self bk_linkDelegateMethods:@{ @"bk_completionBlock": @"mailComposeController:didFinishWithResult:error:" }]; - } -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h b/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h deleted file mode 100644 index 6dc97a4..0000000 --- a/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// MFMessageComposeViewController+BlocksKit.h -// BlocksKit -// - -#import - -/** MFMessageComposeViewController with block callback in addition to delegation. - - If you provide a completion handler to an instance of - MFMessageComposeViewController but do not implement a delegate callback for - messageComposeViewController:didFinishWithResult:error:, the message compose - view controller will automatically be dismissed if it was launched modally. - - Created by [Igor Evsukov](https://github.com/evsukov89) and contributed to - BlocksKit. - - @warning MFMessageComposeViewController is only available on a platform with MessageUI. -*/ -@interface MFMessageComposeViewController (BlocksKit) - -/** The block fired on the dismissal of the SMS composition interface. - - This block callback is an analog for the - messageComposeViewController:didFinishWithResult: method - of MFMessageComposeViewControllerDelegate. - */ -@property (nonatomic, copy, setter = bk_setCompletionBlock:) void (^bk_completionBlock)(MFMessageComposeViewController *controller, MessageComposeResult result); - -@end diff --git a/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.m b/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.m deleted file mode 100644 index 5fd4d28..0000000 --- a/Pods/BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.m +++ /dev/null @@ -1,70 +0,0 @@ -// -// MFMessageComposeViewController+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "MFMessageComposeViewController+BlocksKit.h" -#import "NSObject+A2BlockDelegate.h" - -#pragma mark Custom delegate - -@interface A2DynamicMFMessageComposeViewControllerDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicMFMessageComposeViewControllerDelegate - -- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result -{ - id realDelegate = self.realDelegate; - BOOL shouldDismiss = (realDelegate && [realDelegate respondsToSelector:@selector(messageComposeViewController:didFinishWithResult:)]); - if (shouldDismiss) - [realDelegate messageComposeViewController:controller didFinishWithResult:result]; - - void (^block)(MFMessageComposeViewController *, MessageComposeResult) = [self blockImplementationForMethod:_cmd]; - if (shouldDismiss) { - if (block) block(controller, result); - } else { -#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 - __weak typeof(controller) weakController = controller; - [controller dismissViewControllerAnimated:YES completion:^{ - typeof(&*weakController) strongController = weakController; - if (block) block(strongController, result); - }]; -#else -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - if ([controller respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) { - __weak typeof(controller) weakController = controller; - [controller dismissViewControllerAnimated:YES completion:^{ - typeof(&*weakController) strongController = weakController; - if (block) block(strongController, result); - }]; - } else { -#endif - [controller dismissModalViewControllerAnimated:YES]; - if (block) block(controller, result); -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 60000 - } -#endif -#endif - } -} - -@end - -#pragma mark - Category - -@implementation MFMessageComposeViewController (BlocksKit) - -@dynamic bk_completionBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegateNamed:@"messageComposeDelegate"]; - [self bk_linkDelegateMethods:@{ @"bk_completionBlock": @"messageComposeViewController:didFinishWithResult:" }]; - } -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.h deleted file mode 100644 index 599690d..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.h +++ /dev/null @@ -1,128 +0,0 @@ -// -// UIActionSheet+BlocksKit.h -// BlocksKit -// - -#import - -/** UIActionSheet without delegates! - - This set of extensions and convenience classes allows - for an instance of UIActionSheet without the implementation - of a delegate. Any time you instantiate a UIActionSheet - using the methods here, you must add buttons using - addButtonWithTitle:handler: to make sure nothing breaks. - - A typical invocation might go like this: - UIActionSheet *testSheet = [UIActionSheet actionSheetWithTitle:@"Please select one."]; - [testSheet addButtonWithTitle:@"Zip" handler:^{ NSLog(@"Zip!"); }]; - [testSheet addButtonWithTitle:@"Zap" handler:^{ NSLog(@"Zap!"); }]; - [testSheet addButtonWithTitle:@"Zop" handler:^{ NSLog(@"Zop!"); }]; - [testSheet setDestructiveButtonWithTitle:@"No!" handler:^{ NSLog(@"Fine!"); }]; - [testSheet setCancelButtonWithTitle:nil handler:^{ NSLog(@"Never mind, then!"); }]; - [testSheet showInView:self.view]; - - Includes code by the following: - - - [Landon Fuller](http://landonf.bikemonkey.org), "Using Blocks". - - [Peter Steinberger](https://github.com/steipete) - - [Zach Waldowski](https://github.com/zwaldowski) - - @warning UIActionSheet is only available on a platform with UIKit. - */ -@interface UIActionSheet (BlocksKit) - -///----------------------------------- -/// @name Creating action sheets -///----------------------------------- - -/** Creates and returns a new action sheet with only a title and cancel button. - - @param title The header of the action sheet. - @return A newly created action sheet. - */ -+ (id)bk_actionSheetWithTitle:(NSString *)title; - -/** Returns a configured action sheet with only a title and cancel button. - - @param title The header of the action sheet. - @return An instantiated actionSheet. - */ -- (id)bk_initWithTitle:(NSString *)title NS_REPLACES_RECEIVER; - -///----------------------------------- -/// @name Adding buttons -///----------------------------------- - -/** Add a new button with an associated code block. - - @param title The text of the button. - @param block A block of code. - */ -- (NSInteger)bk_addButtonWithTitle:(NSString *)title handler:(void (^)(void))block; - -/** Set the destructive (red) button with an associated code block. - - @warning Because buttons cannot be removed from an action sheet, - be aware that the effects of calling this method are cumulative. - Previously added destructive buttons will become normal buttons. - - @param title The text of the button. - @param block A block of code. - */ -- (NSInteger)bk_setDestructiveButtonWithTitle:(NSString *)title handler:(void (^)(void))block; - -/** Set the title and trigger of the cancel button. - - `block` can be set to `nil`, but this is generally useless as - the cancel button is configured already to do nothing. - - iPhone users will have the button shown regardless; if the title is - set to `nil`, it will automatically be localized. - - @param title The text of the button. - @param block A block of code. - */ -- (NSInteger)bk_setCancelButtonWithTitle:(NSString *)title handler:(void (^)(void))block; - -///----------------------------------- -/// @name Altering actions -///----------------------------------- - -/** Sets the block that is to be fired when a button is pressed. - - @param block A code block, or nil to set no response. - @param index The index of a button already added to the action sheet. -*/ -- (void)bk_setHandler:(void (^)(void))block forButtonAtIndex:(NSInteger)index; - -/** The block that is to be fired when a button is pressed. - - @param index The index of a button already added to the action sheet. - @return A code block, or nil if no block is assigned. - */ -- (void (^)(void))bk_handlerForButtonAtIndex:(NSInteger)index; - -/** The block to be fired when the action sheet is dismissed with the cancel - button and/or action. - - This property performs the same action as setCancelButtonWithTitle:handler: - but with `title` set to nil. Contrary to setCancelButtonWithTitle:handler:, - you can set this property multiple times and multiple cancel buttons will - not be generated. - */ -@property (nonatomic, copy, setter = bk_setCancelBlock:) void (^bk_cancelBlock)(void); - -/** The block to be fired before the action sheet will show. */ -@property (nonatomic, copy, setter = bk_setWillShowBlock:) void (^bk_willShowBlock)(UIActionSheet *actionSheet); - -/** The block to be fired when the action sheet shows. */ -@property (nonatomic, copy, setter = bk_setDidShowBlock:) void (^bk_didShowBlock)(UIActionSheet *actionSheet); - -/** The block to be fired before the action sheet will dismiss. */ -@property (nonatomic, copy, setter = bk_setWillDismissBlock:) void (^bk_willDismissBlock)(UIActionSheet *actionSheet, NSInteger buttonIndex); - -/** The block to be fired after the action sheet dismisses. */ -@property (nonatomic, copy, setter = bk_setDidDismissBlock:) void (^bk_didDismissBlock)(UIActionSheet *actionSheet, NSInteger buttonIndex); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.m deleted file mode 100644 index d2e8575..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.m +++ /dev/null @@ -1,168 +0,0 @@ -// -// UIActionSheet+BlocksKit.m -// BlocksKit -// - -#import "NSObject+A2BlockDelegate.h" -#import "NSObject+A2DynamicDelegate.h" -#import "UIActionSheet+BlocksKit.h" - -#pragma mark Custom delegate - -@interface A2DynamicUIActionSheetDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicUIActionSheetDelegate - -- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(actionSheet:clickedButtonAtIndex:)]) - [realDelegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex]; - - void (^block)(void) = self.handlers[@(buttonIndex)]; - if (block) block(); -} - -- (void)willPresentActionSheet:(UIActionSheet *)actionSheet -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(willPresentActionSheet:)]) - [realDelegate willPresentActionSheet:actionSheet]; - - void (^block)(UIActionSheet *) = [self blockImplementationForMethod:_cmd]; - if (block) block(actionSheet); -} - -- (void)didPresentActionSheet:(UIActionSheet *)actionSheet -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(didPresentActionSheet:)]) - [realDelegate didPresentActionSheet:actionSheet]; - - void (^block)(UIActionSheet *) = [self blockImplementationForMethod:_cmd]; - if (block) block(actionSheet); -} - -- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(actionSheet:willDismissWithButtonIndex:)]) - [realDelegate actionSheet:actionSheet willDismissWithButtonIndex:buttonIndex]; - - void (^block)(UIActionSheet *, NSInteger) = [self blockImplementationForMethod:_cmd]; - if (block) block(actionSheet, buttonIndex); -} - -- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(actionSheet:didDismissWithButtonIndex:)]) - [realDelegate actionSheet:actionSheet didDismissWithButtonIndex:buttonIndex]; - - void (^block)(UIActionSheet *, NSInteger) = [self blockImplementationForMethod:_cmd]; - if (block) block(actionSheet, buttonIndex); -} - -- (void)actionSheetCancel:(UIActionSheet *)actionSheet -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(actionSheetCancel:)]) - [realDelegate actionSheetCancel:actionSheet]; - - void (^block)(void) = actionSheet.bk_cancelBlock; - if (block) block(); -} - -@end - -#pragma mark - Category - -@implementation UIActionSheet (BlocksKit) - -@dynamic bk_willShowBlock, bk_didShowBlock, bk_willDismissBlock, bk_didDismissBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ - @"bk_willShowBlock": @"willPresentActionSheet:", - @"bk_didShowBlock": @"didPresentActionSheet:", - @"bk_willDismissBlock": @"actionSheet:willDismissWithButtonIndex:", - @"bk_didDismissBlock": @"actionSheet:didDismissWithButtonIndex:" - }]; - } -} - -#pragma mark Initializers - -+ (id)bk_actionSheetWithTitle:(NSString *)title { - return [[[self class] alloc] bk_initWithTitle:title]; -} - -- (id)bk_initWithTitle:(NSString *)title { - self = [self initWithTitle:title delegate:self.bk_dynamicDelegate cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; - if (!self) { return nil; } - self.delegate = self.bk_dynamicDelegate; - return self; -} - -#pragma mark Actions - -- (NSInteger)bk_addButtonWithTitle:(NSString *)title handler:(void (^)(void))block { - NSAssert(title.length, @"A button without a title cannot be added to an action sheet."); - NSInteger index = [self addButtonWithTitle:title]; - [self bk_setHandler:block forButtonAtIndex:index]; - return index; -} - -- (NSInteger)bk_setDestructiveButtonWithTitle:(NSString *)title handler:(void (^)(void))block { - NSInteger index = [self bk_addButtonWithTitle:title handler:block]; - self.destructiveButtonIndex = index; - return index; -} - -- (NSInteger)bk_setCancelButtonWithTitle:(NSString *)title handler:(void (^)(void))block { - NSInteger cancelButtonIndex = self.cancelButtonIndex; - - if ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) && !title.length) - title = NSLocalizedString(@"Cancel", nil); - - if (title.length) - cancelButtonIndex = [self addButtonWithTitle:title]; - - [self bk_setHandler:block forButtonAtIndex:cancelButtonIndex]; - self.cancelButtonIndex = cancelButtonIndex; - return cancelButtonIndex; -} - -#pragma mark Properties - -- (void)bk_setHandler:(void (^)(void))block forButtonAtIndex:(NSInteger)index { - A2DynamicUIActionSheetDelegate *delegate = self.bk_ensuredDynamicDelegate; - - if (block) { - delegate.handlers[@(index)] = [block copy]; - } else { - [delegate.handlers removeObjectForKey:@(index)]; - } -} - -- (void (^)(void))bk_handlerForButtonAtIndex:(NSInteger)index -{ - return [self.bk_dynamicDelegate handlers][@(index)]; -} - -- (void (^)(void))bk_cancelBlock -{ - return [self bk_handlerForButtonAtIndex:self.cancelButtonIndex]; -} - -- (void)bk_setCancelBlock:(void (^)(void))block -{ - [self bk_setHandler:block forButtonAtIndex:self.cancelButtonIndex]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.h deleted file mode 100644 index 923706d..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.h +++ /dev/null @@ -1,136 +0,0 @@ -// -// UIAlertView+BlocksKit.h -// BlocksKit -// - -#import - -/** UIAlertView without delegates! - - This set of extensions and convenience classes allows - for an instance of UIAlertView without the implementation - of a delegate. Any time you instantiate a UIAlertView - using the methods here, you must add buttons using - addButtonWithTitle:handler:otherwise nothing will happen. - - A typical invocation will go like this: - UIAlertView *testView = [UIAlertView alertViewWithTitle:@"Application Alert" message:@"This app will explode in 42 seconds."]; - [testView setCancelButtonWithTitle:@"Oh No!" handler:^{ NSLog(@"Boom!"); }]; - [testView show]; - - A more traditional, and more useful, modal dialog looks like so: - UIAlertView *testView = [UIAlertView alertViewWithTitle:@"Very important!" message:@"Do you like chocolate?"]; - [testView addButtonWithTitle:@"Yes" handler:^{ NSLog(@"Yay!"); }]; - [testView addButtonWithTitle:@"No" handler:^{ NSLog(@"We hate you."); }]; - [testView show]; - - Includes code by the following: - - - [Landon Fuller](http://landonf.bikemonkey.org), "Using Blocks". - - [Peter Steinberger](https://github.com/steipete) - - [Zach Waldowski](https://github.com/zwaldowski) - - @warning UIAlertView is only available on a platform with UIKit. - */ -@interface UIAlertView (BlocksKit) - -///----------------------------------- -/// @name Creating alert views -///----------------------------------- - -/** Creates and shows a new alert view with only a title, message, and cancel button. - - @param title The title of the alert view. - @param message The message content of the alert. - @param cancelButtonTitle The title of the cancel button. If both cancelButtonTitle and otherButtonTitles are empty or nil, defaults to a - @param otherButtonTitles Titles of additional buttons to add to the receiver. - @param block A block of code to be fired on the dismissal of the alert view. - - @return The UIAlertView. - */ -+ (UIAlertView*)bk_showAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSArray *)otherButtonTitles handler:(void (^)(UIAlertView *alertView, NSInteger buttonIndex))block; - -/** Creates and returns a new alert view with only a title and cancel button. - - @param title The title of the alert view. - @return A newly created alert view. - */ -+ (id)bk_alertViewWithTitle:(NSString *)title; - -/** Creates and returns a new alert view with only a title, message, and cancel button. - - @param title The title of the alert view. - @param message The message content of the alert. - @return A newly created alert view. - */ -+ (id)bk_alertViewWithTitle:(NSString *)title message:(NSString *)message; - -/** Returns a configured alert view with only a title, message, and cancel button. - - @param title The title of the alert view. - @param message The message content of the alert. - @return An instantiated alert view. - */ -- (id)bk_initWithTitle:(NSString *)title message:(NSString *)message NS_REPLACES_RECEIVER; - -///----------------------------------- -/// @name Adding buttons -///----------------------------------- - -/** Add a new button with an associated code block. - - @param title The text of the button. - @param block A block of code. - */ -- (NSInteger)bk_addButtonWithTitle:(NSString *)title handler:(void (^)(void))block; - -/** Set the title and trigger of the cancel button. - - @param title The text of the button. - @param block A block of code. - */ -- (NSInteger)bk_setCancelButtonWithTitle:(NSString *)title handler:(void (^)(void))block; - -///----------------------------------- -/// @name Altering actions -///----------------------------------- - -/** Sets the block that is to be fired when a button is pressed. - - @param block A code block, or nil to set no response. - @param index The index of a button already added to the action sheet. - */ -- (void)bk_setHandler:(void (^)(void))block forButtonAtIndex:(NSInteger)index; - -/** The block that is to be fired when a button is pressed. - - @param index The index of the button already added to the alert view. - @return A code block, or nil if no block yet assigned. - */ -- (void (^)(void))bk_handlerForButtonAtIndex:(NSInteger)index; - -/** The block to be fired when the action sheet is dismissed with the cancel - button. - - Contrary to setCancelButtonWithTitle:handler:, you can set this - property multiple times but multiple cancel buttons will - not be generated. - */ -@property (nonatomic, copy, setter = bk_setCancelBlock:) void (^bk_cancelBlock)(void); - -/** The block to be fired before the alert view will show. */ -@property (nonatomic, copy, setter = bk_setWillShowBlock:) void (^bk_willShowBlock)(UIAlertView *alertView); - -/** The block to be fired when the alert view shows. */ -@property (nonatomic, copy, setter = bk_setDidShowBlock:) void (^bk_didShowBlock)(UIAlertView *alertView); - -/** The block to be fired before the alert view will dismiss. */ -@property (nonatomic, copy, setter = bk_setWillDismissBlock:) void (^bk_willDismissBlock)(UIAlertView *alertView, NSInteger buttonIndex); - -/** The block to be fired after the alert view dismisses. */ -@property (nonatomic, copy, setter = bk_setDidDismissBlock:) void (^bk_didDismissBlock)(UIAlertView *alertView, NSInteger buttonIndex); - -/** The block to be fired to determine whether the first non-cancel should be enabled */ -@property (nonatomic, copy, setter = bk_SetShouldEnableFirstOtherButtonBlock:) BOOL (^bk_shouldEnableFirstOtherButtonBlock)(UIAlertView *alertView) NS_AVAILABLE_IOS(5_0); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.m deleted file mode 100644 index ac6e1fe..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.m +++ /dev/null @@ -1,225 +0,0 @@ -// -// UIAlertView+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" -#import "NSObject+A2DynamicDelegate.h" -#import "UIAlertView+BlocksKit.h" - -#pragma mark Delegate - -@interface A2DynamicUIAlertViewDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicUIAlertViewDelegate - -- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView -{ - BOOL should = YES; - - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(alertViewShouldEnableFirstOtherButton:)]) - should &= [realDelegate alertViewShouldEnableFirstOtherButton:alertView]; - - BOOL (^block)(UIAlertView *) = [self blockImplementationForMethod:_cmd]; - if (block) - should &= block(alertView); - - return should; -} - -- (void)alertViewCancel:(UIAlertView *)alertView -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(alertViewCancel:)]) - [realDelegate alertViewCancel:alertView]; - - id key = @(alertView.cancelButtonIndex); - void (^cancelBlock)(void) = (self.handlers)[key]; - if (cancelBlock) - cancelBlock(); -} - -- (void)willPresentAlertView:(UIAlertView *)alertView -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(willPresentAlertView:)]) - [realDelegate willPresentAlertView:alertView]; - - void (^block)(UIAlertView *) = [self blockImplementationForMethod:_cmd]; - if (block) - block(alertView); -} - -- (void)didPresentAlertView:(UIAlertView *)alertView -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(didPresentAlertView:)]) - [realDelegate didPresentAlertView:alertView]; - - void (^block)(UIAlertView *) = [self blockImplementationForMethod:_cmd]; - if (block) - block(alertView); -} - -- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) - [realDelegate alertView:alertView willDismissWithButtonIndex:buttonIndex]; - - void (^block)(UIAlertView *, NSInteger) = [self blockImplementationForMethod:_cmd]; - if (block) - block(alertView, buttonIndex); -} - -- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) - [realDelegate alertView:alertView didDismissWithButtonIndex:buttonIndex]; - - void (^block)(UIAlertView *, NSInteger) = [self blockImplementationForMethod:_cmd]; - if (block) - block(alertView, buttonIndex); -} - -- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) - [realDelegate alertView:alertView clickedButtonAtIndex:buttonIndex]; - - void (^block)(UIAlertView *, NSInteger) = [self blockImplementationForMethod:_cmd]; - if (block) - block(alertView, buttonIndex); - - id key = @(buttonIndex); - void (^buttonBlock)(void) = (self.handlers)[key]; - if (buttonBlock) - buttonBlock(); -} - -@end - -#pragma mark - Category - -@implementation UIAlertView (BlocksKit) - -@dynamic bk_willShowBlock, bk_didShowBlock, bk_willDismissBlock, bk_didDismissBlock, bk_shouldEnableFirstOtherButtonBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ - @"bk_willShowBlock": @"willPresentAlertView:", - @"bk_didShowBlock": @"didPresentAlertView:", - @"bk_willDismissBlock": @"alertView:willDismissWithButtonIndex:", - @"bk_didDismissBlock": @"alertView:didDismissWithButtonIndex:", - @"bk_shouldEnableFirstOtherButtonBlock": @"alertViewShouldEnableFirstOtherButton:" - }]; - } -} - -#pragma mark Convenience - -+ (UIAlertView*)bk_showAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSArray *)otherButtonTitles handler:(void (^)(UIAlertView *alertView, NSInteger buttonIndex))block -{ - // If no buttons were specified, cancel button becomes "Dismiss" - if (!cancelButtonTitle.length && !otherButtonTitles.count) - cancelButtonTitle = NSLocalizedString(@"Dismiss", nil); - - UIAlertView *alertView = [[[self class] alloc] initWithTitle:title message:message delegate:self.bk_dynamicDelegate cancelButtonTitle:cancelButtonTitle otherButtonTitles:nil]; - - // Set other buttons - [otherButtonTitles enumerateObjectsUsingBlock:^(NSString *button, NSUInteger idx, BOOL *stop) { - [alertView addButtonWithTitle:button]; - }]; - - // Set `didDismissBlock` - if (block) alertView.bk_didDismissBlock = block; - - // Show alert view - [alertView show]; - - return alertView; -} - -#pragma mark Initializers - -+ (id)bk_alertViewWithTitle:(NSString *)title -{ - return [self bk_alertViewWithTitle:title message:nil]; -} - -+ (id)bk_alertViewWithTitle:(NSString *)title message:(NSString *)message -{ - return [[[self class] alloc] bk_initWithTitle:title message:message]; -} - -- (id)bk_initWithTitle:(NSString *)title message:(NSString *)message -{ - self = [self initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil]; - if (!self) return nil; - - self.delegate = self.bk_dynamicDelegate; - - return self; -} - -#pragma Actions - -- (NSInteger)bk_addButtonWithTitle:(NSString *)title handler:(void (^)(void))block -{ - NSAssert(title.length, @"A button without a title cannot be added to the alert view."); - NSInteger index = [self addButtonWithTitle:title]; - [self bk_setHandler:block forButtonAtIndex:index]; - return index; -} - -- (NSInteger)bk_setCancelButtonWithTitle:(NSString *)title handler:(void (^)(void))block -{ - if (!title.length) - title = NSLocalizedString(@"Cancel", nil); - NSInteger cancelButtonIndex = [self addButtonWithTitle:title]; - self.cancelButtonIndex = cancelButtonIndex; - [self bk_setHandler:block forButtonAtIndex:cancelButtonIndex]; - return cancelButtonIndex; -} - -#pragma mark Properties - -- (void)bk_setHandler:(void (^)(void))block forButtonAtIndex:(NSInteger)index -{ - id key = @(index); - if (block) - [self.bk_dynamicDelegate handlers][key] = [block copy]; - else - [[self.bk_dynamicDelegate handlers] removeObjectForKey:key]; -} - -- (void (^)(void))bk_handlerForButtonAtIndex:(NSInteger)index -{ - return [self.bk_dynamicDelegate handlers][@(index)]; -} - -- (void (^)(void))bk_cancelBlock -{ - return [self bk_handlerForButtonAtIndex:self.cancelButtonIndex]; -} - -- (void)bk_setCancelBlock:(void (^)(void))block -{ - if (block && self.cancelButtonIndex == -1) { - [self bk_setCancelButtonWithTitle:nil handler:block]; - return; - } - - [self bk_setHandler:block forButtonAtIndex:self.cancelButtonIndex]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h deleted file mode 100644 index a070e11..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h +++ /dev/null @@ -1,61 +0,0 @@ -// -// UIBarButtonItem+BlocksKit.h -// BlocksKit -// - -#import - -/** Block event initialization for UIBarButtonItem. - - This set of extensions has near-drop-in replacements - for the standard set of UIBarButton item initializations, - using a block handler instead of a target/selector. - - Includes code by the following: - - - [Kevin O'Neill](https://github.com/kevinoneill) - - [Zach Waldowski](https://github.com/zwaldowski) - - @warning UIBarButtonItem is only available on a platform with UIKit. - */ -@interface UIBarButtonItem (BlocksKit) - -/** Creates and returns a configured item containing the specified system item. - - @return Newly initialized item with the specified properties. - @param systemItem The system item to use as the item representation. One of the constants defined in UIBarButtonSystemItem. - @param action The block that gets fired on the button press. - */ -- (id)bk_initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem handler:(void (^)(id sender))action NS_REPLACES_RECEIVER; - -/** Creates and returns a configured item using the specified image and style. - - @return Newly initialized item with the specified properties. - @param image The item’s image. If nil an image is not displayed. - If this image is too large to fit on the bar, it is scaled to fit - The size of a toolbar and navigation bar image is 20 x 20 points. - @param style The style of the item. One of the constants defined in UIBarButtonItemStyle. - @param action The block that gets fired on the button press. - */ -- (id)bk_initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action NS_REPLACES_RECEIVER; - -/** Creates and returns a configured item using the specified image and style. - - @return Newly initialized item with the specified properties. - @param image The item’s image. If nil an image is not displayed. - @param landscapeImagePhone The image to be used for the item in landscape bars in the UIUserInterfaceIdiomPhone idiom. - @param style The style of the item. One of the constants defined in UIBarButtonItemStyle. - @param action The block that gets fired on the button press. - */ -- (id)bk_initWithImage:(UIImage *)image landscapeImagePhone:(UIImage *)landscapeImagePhone style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action NS_REPLACES_RECEIVER NS_AVAILABLE_IOS(5_0); - -/** Creates and returns a configured item using the specified text and style. - - @return Newly initialized item with the specified properties. - @param title The text displayed on the button item. - @param style The style of the item. One of the constants defined in UIBarButtonItemStyle. - @param action The block that gets fired on the button press. - */ -- (id)bk_initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action NS_REPLACES_RECEIVER; - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.m deleted file mode 100644 index e54bbd3..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.m +++ /dev/null @@ -1,65 +0,0 @@ -// -// UIBarButtonItem+BlocksKit.m -// BlocksKit -// - -#import -#import "UIBarButtonItem+BlocksKit.h" - -static const void *BKBarButtonItemBlockKey = &BKBarButtonItemBlockKey; - -@interface UIBarButtonItem (BlocksKitPrivate) - -- (void)bk_handleAction:(UIBarButtonItem *)sender; - -@end - -@implementation UIBarButtonItem (BlocksKit) - -- (id)bk_initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem handler:(void (^)(id sender))action -{ - self = [self initWithBarButtonSystemItem:systemItem target:self action:@selector(bk_handleAction:)]; - if (!self) return nil; - - objc_setAssociatedObject(self, BKBarButtonItemBlockKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC); - - return self; -} - -- (id)bk_initWithImage:(UIImage *)image style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action -{ - self = [self initWithImage:image style:style target:self action:@selector(bk_handleAction:)]; - if (!self) return nil; - - objc_setAssociatedObject(self, BKBarButtonItemBlockKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC); - - return self; -} - -- (id)bk_initWithImage:(UIImage *)image landscapeImagePhone:(UIImage *)landscapeImagePhone style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action -{ - self = [self initWithImage:image landscapeImagePhone:landscapeImagePhone style:style target:self action:@selector(bk_handleAction:)]; - if (!self) return nil; - - objc_setAssociatedObject(self, BKBarButtonItemBlockKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC); - - return self; -} - -- (id)bk_initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style handler:(void (^)(id sender))action -{ - self = [self initWithTitle:title style:style target:self action:@selector(bk_handleAction:)]; - if (!self) return nil; - - objc_setAssociatedObject(self, BKBarButtonItemBlockKey, action, OBJC_ASSOCIATION_COPY_NONATOMIC); - - return self; -} - -- (void)bk_handleAction:(UIBarButtonItem *)sender -{ - void (^block)(id) = objc_getAssociatedObject(self, BKBarButtonItemBlockKey); - if (block) block(self); -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.h deleted file mode 100644 index 4de0cf3..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.h +++ /dev/null @@ -1,44 +0,0 @@ -// -// UIControl+BlocksKit.h -// BlocksKit -// - -#import - -/** Block control event handling for UIControl. - - Includes code by the following: - - - [Kevin O'Neill](https://github.com/kevinoneill) - - [Zach Waldowski](https://github.com/zwaldowski) - - @warning UIControl is only available on a platform with UIKit. - */ -@interface UIControl (BlocksKit) - -///----------------------------------- -/// @name Block event handling -///----------------------------------- - -/** Adds a block for a particular event to an internal dispatch table. - - @param handler A block representing an action message, with an argument for the sender. - @param controlEvents A bitmask specifying the control events for which the action message is sent. - @see removeEventHandlersForControlEvents: - */ -- (void)bk_addEventHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents; - -/** Removes all blocks for a particular event combination. - @param controlEvents A bitmask specifying the control events for which the block will be removed. - @see addEventHandler:forControlEvents: - */ -- (void)bk_removeEventHandlersForControlEvents:(UIControlEvents)controlEvents; - -/** Checks to see if the control has any blocks for a particular event combination. - @param controlEvents A bitmask specifying the control events for which to check for blocks. - @see addEventHandler:forControlEvents: - @return Returns YES if there are blocks for these control events, NO otherwise. - */ -- (BOOL)bk_hasEventHandlersForControlEvents:(UIControlEvents)controlEvents; - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.m deleted file mode 100644 index 35f34f0..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.m +++ /dev/null @@ -1,111 +0,0 @@ -// -// UIControl+BlocksKit.m -// BlocksKit -// - -#import -#import "UIControl+BlocksKit.h" - -static const void *BKControlHandlersKey = &BKControlHandlersKey; - -#pragma mark Private - -@interface BKControlWrapper : NSObject - -- (id)initWithHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents; - -@property (nonatomic) UIControlEvents controlEvents; -@property (nonatomic, copy) void (^handler)(id sender); - -@end - -@implementation BKControlWrapper - -- (id)initWithHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents -{ - self = [super init]; - if (!self) return nil; - - self.handler = handler; - self.controlEvents = controlEvents; - - return self; -} - -- (id)copyWithZone:(NSZone *)zone -{ - return [[BKControlWrapper alloc] initWithHandler:self.handler forControlEvents:self.controlEvents]; -} - -- (void)invoke:(id)sender -{ - self.handler(sender); -} - -@end - -#pragma mark Category - -@implementation UIControl (BlocksKit) - -- (void)bk_addEventHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents -{ - NSParameterAssert(handler); - - NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey); - if (!events) { - events = [NSMutableDictionary dictionary]; - objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - - NSNumber *key = @(controlEvents); - NSMutableSet *handlers = events[key]; - if (!handlers) { - handlers = [NSMutableSet set]; - events[key] = handlers; - } - - BKControlWrapper *target = [[BKControlWrapper alloc] initWithHandler:handler forControlEvents:controlEvents]; - [handlers addObject:target]; - [self addTarget:target action:@selector(invoke:) forControlEvents:controlEvents]; -} - -- (void)bk_removeEventHandlersForControlEvents:(UIControlEvents)controlEvents -{ - NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey); - if (!events) { - events = [NSMutableDictionary dictionary]; - objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - - NSNumber *key = @(controlEvents); - NSSet *handlers = events[key]; - - if (!handlers) - return; - - [handlers enumerateObjectsUsingBlock:^(id sender, BOOL *stop) { - [self removeTarget:sender action:NULL forControlEvents:controlEvents]; - }]; - - [events removeObjectForKey:key]; -} - -- (BOOL)bk_hasEventHandlersForControlEvents:(UIControlEvents)controlEvents -{ - NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey); - if (!events) { - events = [NSMutableDictionary dictionary]; - objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - } - - NSNumber *key = @(controlEvents); - NSSet *handlers = events[key]; - - if (!handlers) - return NO; - - return !!handlers.count; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h deleted file mode 100644 index c331741..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h +++ /dev/null @@ -1,104 +0,0 @@ -// -// UIGestureRecognizer+BlocksKit.h -// BlocksKit -// - -#import - -/** Block functionality for UIGestureRecognizer. - - Use of the delay property is pretty straightforward, although - cancellation might be a little harder to swallow. An example - follows: - UITapGestureRecognizer *singleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) { - NSLog(@"Single tap."); - } delay:0.18]; - [self addGestureRecognizer:singleTap]; - - UITapGestureRecognizer *doubleTap = [UITapGestureRecognizer recognizerWithHandler:^(id sender) { - [singleTap cancel]; - NSLog(@"Double tap."); - }]; - doubleTap.numberOfTapsRequired = 2; - [self addGestureRecognizer:doubleTap]; - - Believe it or not, the above code is fully memory-safe and efficient. Eagle-eyed coders - will notice that this setup emulates UIGestureRecognizer's requireGestureRecognizerToFail:, - and, yes, it totally apes it. Not only is this setup much faster on the user's end of - things, it is more flexible and allows for much more complicated setups. - - Includes code by the following: - - - [Kevin O'Neill](https://github.com/kevinoneill) - - [Zach Waldowski](https://github.com/zwaldowski) - - @warning UIGestureRecognizer is only available on a platform with UIKit. - - @warning It is not recommended to use the Apple-supplied locationInView and state - methods on a *delayed* block-backed gesture recognizer, as these properties are - likely to have been cleared by the time by the block fires. It is instead recommended - to use the arguments provided to the block. - */ - -@interface UIGestureRecognizer (BlocksKit) - -/** An autoreleased gesture recognizer that will, on firing, call - the given block asynchronously after a number of seconds. - - @return An autoreleased instance of a concrete UIGestureRecognizer subclass, or `nil`. - @param block The block which handles an executed gesture. - @param delay A number of seconds after which the block will fire. - */ -+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay; - -/** Initializes an allocated gesture recognizer that will call the given block - after a given delay. - - An alternative to the designated initializer. - - @return An initialized instance of a concrete UIGestureRecognizer subclass or `nil`. - @param block The block which handles an executed gesture. - @param delay A number of seconds after which the block will fire. - */ -- (id)bk_initWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay NS_REPLACES_RECEIVER; - -/** An autoreleased gesture recognizer that will call the given block. - - For convenience and compatibility reasons, this method is indentical - to using recognizerWithHandler:delay: with a delay of 0.0. - - @return An initialized and autoreleased instance of a concrete UIGestureRecognizer - subclass, or `nil`. - @param block The block which handles an executed gesture. - */ -+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block; - -/** Initializes an allocated gesture recognizer that will call the given block. - - This method is indentical to calling initWithHandler:delay: with a delay of 0.0. - - @return An initialized instance of a concrete UIGestureRecognizer subclass or `nil`. - @param block The block which handles an executed gesture. - */ -- (id)bk_initWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block NS_REPLACES_RECEIVER; - -/** Allows the block that will be fired by the gesture recognizer - to be modified after the fact. - */ -@property (nonatomic, copy, setter = bk_setHandler:) void (^bk_handler)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location); - -/** Allows the length of the delay after which the gesture - recognizer will be fired to modify. */ -@property (nonatomic, setter = bk_setHandlerDelay:) NSTimeInterval bk_handlerDelay; - -/** If the recognizer happens to be fired, calling this method - will stop it from firing, but only if a delay is set. - - @warning This method is not for arbitrarily canceling the - firing of a recognizer, but will only function for a block - handler *after the recognizer has already been fired*. Be - sure to make your delay times accomodate this likelihood. - */ -- (void)bk_cancel; - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.m deleted file mode 100644 index 6ee7920..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.m +++ /dev/null @@ -1,108 +0,0 @@ -// -// UIGestureRecognizer+BlocksKit.m -// BlocksKit -// - -#import -#import "UIGestureRecognizer+BlocksKit.h" - -static const void *BKGestureRecognizerBlockKey = &BKGestureRecognizerBlockKey; -static const void *BKGestureRecognizerDelayKey = &BKGestureRecognizerDelayKey; -static const void *BKGestureRecognizerShouldHandleActionKey = &BKGestureRecognizerShouldHandleActionKey; - -@interface UIGestureRecognizer (BlocksKitInternal) - -@property (nonatomic, setter = bk_setShouldHandleAction:) BOOL bk_shouldHandleAction; - -- (void)bk_handleAction:(UIGestureRecognizer *)recognizer; - -@end - -@implementation UIGestureRecognizer (BlocksKit) - -+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay -{ - return [[[self class] alloc] bk_initWithHandler:block delay:delay]; -} - -- (id)bk_initWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block delay:(NSTimeInterval)delay -{ - self = [self initWithTarget:self action:@selector(bk_handleAction:)]; - if (!self) return nil; - - self.bk_handler = block; - self.bk_handlerDelay = delay; - - return self; -} - -+ (id)bk_recognizerWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block -{ - return [self bk_recognizerWithHandler:block delay:0.0]; -} - -- (id)bk_initWithHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))block -{ - return (self = [self bk_initWithHandler:block delay:0.0]); -} - -- (void)bk_handleAction:(UIGestureRecognizer *)recognizer -{ - void (^handler)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location) = recognizer.bk_handler; - if (!handler) return; - - NSTimeInterval delay = self.bk_handlerDelay; - CGPoint location = [self locationInView:self.view]; - void (^block)(void) = ^{ - if (!self.bk_shouldHandleAction) return; - handler(self, self.state, location); - }; - - self.bk_shouldHandleAction = YES; - - if (!delay) { - block(); - return; - } - - dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)); - dispatch_after(popTime, dispatch_get_main_queue(), block); -} - -- (void)bk_setHandler:(void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))handler -{ - objc_setAssociatedObject(self, BKGestureRecognizerBlockKey, handler, OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -- (void (^)(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location))bk_handler -{ - return objc_getAssociatedObject(self, BKGestureRecognizerBlockKey); -} - -- (void)bk_setHandlerDelay:(NSTimeInterval)delay -{ - NSNumber *delayValue = delay ? @(delay) : nil; - objc_setAssociatedObject(self, BKGestureRecognizerDelayKey, delayValue, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (NSTimeInterval)bk_handlerDelay -{ - return [objc_getAssociatedObject(self, BKGestureRecognizerDelayKey) doubleValue]; -} - -- (void)bk_setShouldHandleAction:(BOOL)flag -{ - objc_setAssociatedObject(self, BKGestureRecognizerShouldHandleActionKey, @(flag), OBJC_ASSOCIATION_COPY_NONATOMIC); -} - -- (BOOL)bk_shouldHandleAction -{ - return [objc_getAssociatedObject(self, BKGestureRecognizerShouldHandleActionKey) boolValue]; -} - -- (void)bk_cancel -{ - self.bk_shouldHandleAction = NO; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.h deleted file mode 100644 index 2a06486..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// UIImagePickerController+BlocksKit.h -// BlocksKit -// -// Contributed by Yas Kuraishi. -// - -#import - -/** UIImagePickerController with block callback. - - Created by [Yas Kuraishi](https://github.com/YasKuraishi) and contributed to - BlocksKit. - - @warning UIImagePickerController is only available on a platform with - UIKit. -*/ -@interface UIImagePickerController (BlocksKit) - -/** - * The block that fires after the receiver finished picking up an image - */ -@property (nonatomic, copy) void(^bk_didFinishPickingMediaBlock)(UIImagePickerController *, NSDictionary *); - -/** - * The block that fires after the user cancels out of picker - */ -@property (nonatomic, copy) void(^bk_didCancelBlock)(UIImagePickerController *); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.m deleted file mode 100644 index 476ffc6..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.m +++ /dev/null @@ -1,54 +0,0 @@ -// -// UIImagePickerController+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" -#import "UIImagePickerController+BlocksKit.h" - -#pragma mark Custom delegate - -@interface A2DynamicUIImagePickerControllerDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicUIImagePickerControllerDelegate - -- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(imagePickerController:didFinishPickingMediaWithInfo:)]) - [realDelegate imagePickerController:picker didFinishPickingMediaWithInfo:info]; - - void (^block)(UIImagePickerController *, NSDictionary *) = [self blockImplementationForMethod:_cmd]; - if (block) block(picker, info); -} - -- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(imagePickerControllerDidCancel:)]) - [realDelegate imagePickerControllerDidCancel:picker]; - - void (^block)(UIImagePickerController *) = [self blockImplementationForMethod:_cmd]; - if (block) block(picker); -} - -@end - -#pragma mark Category - -@implementation UIImagePickerController (BlocksKit) - -@dynamic bk_didFinishPickingMediaBlock; -@dynamic bk_didCancelBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ @"bk_didFinishPickingMediaBlock": @"imagePickerController:didFinishPickingMediaWithInfo:", - @"bk_didCancelBlock": @"imagePickerControllerDidCancel:" }]; - } -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.h deleted file mode 100644 index c96838a..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// UIPopoverController+BlocksKit.h -// BlocksKit -// - -#import - -/** Block functionality for UIPopoverController. - - Created by [Alexsander Akers](https://github.com/a2) and contributed to BlocksKit. - - @warning UIPopovercontroller is only available on a platform with UIKit. - */ -@interface UIPopoverController (BlocksKit) - -/** The block to be called when the popover controller will dismiss the popover. Return NO to prevent the dismissal of the view. */ -@property (nonatomic, copy, setter = bk_setShouldDismissBlock:) BOOL (^bk_shouldDismissBlock)(UIPopoverController *popoverController); - -/** The block to be called when the user has taken action to dismiss the popover. This is not called when -dismissPopoverAnimated: is called directly. */ -@property (nonatomic, copy, setter = bk_setDidDismissBlock:) void (^bk_didDismissBlock)(UIPopoverController *popoverController); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.m deleted file mode 100644 index f4d30de..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.m +++ /dev/null @@ -1,58 +0,0 @@ -// -// UIPopoverController+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" -#import "UIPopoverController+BlocksKit.h" - -#pragma mark - Delegate - -@interface A2DynamicUIPopoverControllerDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicUIPopoverControllerDelegate - -- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController -{ - BOOL should = YES; - - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(popoverControllerShouldDismissPopover:)]) - should &= [realDelegate popoverControllerShouldDismissPopover:popoverController]; - - BOOL (^block)(UIPopoverController *) = [self blockImplementationForMethod:_cmd]; - if (block) should &= block(popoverController); - - return should; -} - -- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(popoverControllerDidDismissPopover:)]) - [realDelegate popoverControllerDidDismissPopover:popoverController]; - - void (^block)(UIPopoverController *) = [self blockImplementationForMethod:_cmd]; - if (block) block(popoverController); -} - -@end - -#pragma mark - Category - -@implementation UIPopoverController (BlocksKit) - -@dynamic bk_didDismissBlock, bk_shouldDismissBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ @"bk_didDismissBlock": @"popoverControllerDidDismissPopover:", @"bk_shouldDismissBlock": @"popoverControllerShouldDismissPopover:" }]; - } -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.h deleted file mode 100644 index 8bab90d..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// UITextField+BlocksKit.h -// BlocksKit -// -// Contributed by Samuel E. Giddins. -// - -#import -#import "BlocksKit.h" - -/** Block callbacks for UITextField. - - @warning UITextField is only available on a platform with UIKit. - - Created by [Samuel E. Giddins](https://github.com/segiddins) and - contributed to BlocksKit. - */ -@interface UITextField (BlocksKit) - -/** - * The block that fires before the receiver begins editing - * - * The return value indicates whether the receiver should begin editing - */ -@property (nonatomic, copy) BOOL(^bk_shouldBeginEditingBlock)(UITextField *); - -/** - * The block that fires after the receiver begins editing - */ -@property (nonatomic, copy) void(^bk_didBeginEditingBlock)(UITextField *); - -/** - * The block that fires before the receiver ends editing - * - * The return value indicates whether the receiver should end editing - */ -@property (nonatomic, copy) BOOL(^bk_shouldEndEditingBlock)(UITextField *); - -/** - * The block that fires after the receiver ends editing - */ -@property (nonatomic, copy) void(^bk_didEndEditingBlock)(UITextField *); - -/** - * The block that fires when the receiver's text will change - * - * The return value indicates whether the receiver should replace the characters in the given range with the replacement string - */ -@property (nonatomic, copy) BOOL(^bk_shouldChangeCharactersInRangeWithReplacementStringBlock)(UITextField *, NSRange, NSString *); - -/** - * The block that fires when the receiver's clear button is pressed - * - * The return value indicates whether the receiver should clear its contents - */ -@property (nonatomic, copy) BOOL(^bk_shouldClearBlock)(UITextField *); - -/** - * The block that fires when the keyboard's return button is pressed and the receiver is the first responder - * - * The return value indicates whether the receiver should return - */ -@property (nonatomic, copy) BOOL(^bk_shouldReturnBlock)(UITextField *); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.m deleted file mode 100644 index b126789..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.m +++ /dev/null @@ -1,119 +0,0 @@ -// -// UITextField+BlocksKit.m -// BlocksKit -// - -#import "UITextField+BlocksKit.h" -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" - -#pragma mark Delegate - -@interface A2DynamicUITextFieldDelegate : A2DynamicDelegate - -@end - -@implementation A2DynamicUITextFieldDelegate - -- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField -{ - BOOL ret = YES; - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) - ret = [realDelegate textFieldShouldBeginEditing:textField]; - BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(textField); - return ret; -} - -- (void)textFieldDidBeginEditing:(UITextField *)textField -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) - [realDelegate textFieldDidBeginEditing:textField]; - void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - block(textField); -} - -- (BOOL)textFieldShouldEndEditing:(UITextField *)textField -{ - BOOL ret = YES; - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) - ret = [realDelegate textFieldShouldEndEditing:textField]; - BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(textField); - return ret; -} - -- (void)textFieldDidEndEditing:(UITextField *)textField -{ - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidEndEditing:)]) - [realDelegate textFieldDidEndEditing:textField]; - void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - block(textField); -} - -- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string -{ - BOOL ret = YES; - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) - ret = [realDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string]; - BOOL (^block)(UITextField *, NSRange, NSString *) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(textField, range, string); - return ret; -} - -- (BOOL)textFieldShouldClear:(UITextField *)textField -{ - BOOL ret = YES; - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldClear:)]) - ret = [realDelegate textFieldShouldClear:textField]; - BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(textField); - return ret; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField -{ - BOOL ret = YES; - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldReturn:)]) - ret = [realDelegate textFieldShouldReturn:textField]; - BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(textField); - return ret; -} - -@end - -#pragma mark - Category - -@implementation UITextField (BlocksKit) - -@dynamic bk_shouldBeginEditingBlock, bk_didBeginEditingBlock, bk_shouldEndEditingBlock, bk_didEndEditingBlock, bk_shouldChangeCharactersInRangeWithReplacementStringBlock, bk_shouldClearBlock, bk_shouldReturnBlock; - -+ (void)load { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods: @{ - @"bk_shouldBeginEditingBlock": @"textFieldShouldBeginEditing:", - @"bk_didBeginEditingBlock": @"textFieldDidBeginEditing:", - @"bk_shouldEndEditingBlock": @"textFieldShouldEndEditing:", - @"bk_didEndEditingBlock" : @"textFieldDidEndEditing:", - @"bk_shouldChangeCharactersInRangeWithReplacementStringBlock" : @"textField:shouldChangeCharactersInRange:replacementString:", - @"bk_shouldClearBlock" : @"textFieldShouldClear:", - @"bk_shouldReturnBlock" : @"textFieldShouldReturn:", - }]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.h deleted file mode 100644 index aed8bb0..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.h +++ /dev/null @@ -1,69 +0,0 @@ -// -// UIView+BlocksKit.h -// BlocksKit -// - -#import - -/** Convenience on-touch methods for UIView. - - Includes code by the following: - - - Kevin O'Neill. . 2011. BSD. - - Jake Marsh. . 2011. - - Zach Waldowski. . 2011. - - @warning UIView is only available on a platform with UIKit. - */ -@interface UIView (BlocksKit) - -/** Abstract creation of a block-backed UITapGestureRecognizer. - - This method allows for the recognition of any arbitrary number - of fingers tapping any number of times on a view. An instance - of UITapGesture recognizer is allocated for the block and added - to the recieving view. - - @warning This method has an _additive_ effect. Do not call it multiple - times to set-up or tear-down. The view will discard the gesture recognizer - on release. - - @param numberOfTouches The number of fingers tapping that will trigger the block. - @param numberOfTaps The number of taps required to trigger the block. - @param block The handler for the UITapGestureRecognizer - @see whenTapped: - @see whenDoubleTapped: - */ -- (void)bk_whenTouches:(NSUInteger)numberOfTouches tapped:(NSUInteger)numberOfTaps handler:(void (^)(void))block; - -/** Adds a recognizer for one finger tapping once. - - @warning This method has an _additive_ effect. Do not call it multiple - times to set-up or tear-down. The view will discard the gesture recognizer - on release. - - @param block The handler for the tap recognizer - @see whenDoubleTapped: - @see whenTouches:tapped:handler: - */ -- (void)bk_whenTapped:(void (^)(void))block; - -/** Adds a recognizer for one finger tapping twice. - - @warning This method has an _additive_ effect. Do not call it multiple - times to set-up or tear-down. The view will discard the gesture recognizer - on release. - - @param block The handler for the tap recognizer - @see whenTapped: - @see whenTouches:tapped:handler: - */ -- (void)bk_whenDoubleTapped:(void (^)(void))block; - -/** A convenience wrapper that non-recursively loops through the subviews of a view. - - @param block A code block that interacts with a UIView sender. - */ -- (void)bk_eachSubview:(void (^)(UIView *subview))block; - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.m deleted file mode 100644 index 38a34a4..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.m +++ /dev/null @@ -1,55 +0,0 @@ -// -// UIView+BlocksKit.m -// BlocksKit -// - -#import "UIGestureRecognizer+BlocksKit.h" -#import "UIView+BlocksKit.h" - -@implementation UIView (BlocksKit) - -- (void)bk_whenTouches:(NSUInteger)numberOfTouches tapped:(NSUInteger)numberOfTaps handler:(void (^)(void))block -{ - if (!block) return; - - UITapGestureRecognizer *gesture = [UITapGestureRecognizer bk_recognizerWithHandler:^(UIGestureRecognizer *sender, UIGestureRecognizerState state, CGPoint location) { - if (state == UIGestureRecognizerStateRecognized) block(); - }]; - - gesture.numberOfTouchesRequired = numberOfTouches; - gesture.numberOfTapsRequired = numberOfTaps; - - [self.gestureRecognizers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - if (![obj isKindOfClass:[UITapGestureRecognizer class]]) return; - - UITapGestureRecognizer *tap = obj; - BOOL rightTouches = (tap.numberOfTouchesRequired == numberOfTouches); - BOOL rightTaps = (tap.numberOfTapsRequired == numberOfTaps); - if (rightTouches && rightTaps) { - [gesture requireGestureRecognizerToFail:tap]; - } - }]; - - [self addGestureRecognizer:gesture]; -} - -- (void)bk_whenTapped:(void (^)(void))block -{ - [self bk_whenTouches:1 tapped:1 handler:block]; -} - -- (void)bk_whenDoubleTapped:(void (^)(void))block -{ - [self bk_whenTouches:2 tapped:1 handler:block]; -} - -- (void)bk_eachSubview:(void (^)(UIView *subview))block -{ - NSParameterAssert(block != nil); - - [self.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) { - block(subview); - }]; -} - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.h b/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.h deleted file mode 100644 index 216fd8a..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// UIWebView+BlocksKit.h -// BlocksKit -// - -#import - -/** Block callbacks for UIWebView. - - @warning UIWebView is only available on a platform with UIKit. -*/ - -@interface UIWebView (BlocksKit) - -/** The block to be decide whether a URL will be loaded. - - @warning If the delegate implements webView:shouldStartLoadWithRequest:navigationType:, - the return values of both the delegate method and the block will be considered. -*/ -@property (nonatomic, copy, setter = bk_setShouldStartLoadBlock:) BOOL (^bk_shouldStartLoadBlock)(UIWebView *webView, NSURLRequest *request, UIWebViewNavigationType navigationType); - -/** The block that is fired when the web view starts loading. */ -@property (nonatomic, copy, setter = bk_setDidStartLoadBlock:) void (^bk_didStartLoadBlock)(UIWebView *webView); - -/** The block that is fired when the web view finishes loading. */ -@property (nonatomic, copy, setter = bk_setDidFinishLoadBlock:) void (^bk_didFinishLoadBlock)(UIWebView *webView); - -/** The block that is fired when the web view stops loading due to an error. */ -@property (nonatomic, copy, setter = bk_setDidFinishWithErrorBlock:) void (^bk_didFinishWithErrorBlock)(UIWebView *webView, NSError *error); - -@end diff --git a/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.m b/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.m deleted file mode 100644 index 6605b1b..0000000 --- a/Pods/BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.m +++ /dev/null @@ -1,79 +0,0 @@ -// -// UIWebView+BlocksKit.m -// BlocksKit -// - -#import "A2DynamicDelegate.h" -#import "NSObject+A2BlockDelegate.h" -#import "UIWebView+BlocksKit.h" - -#pragma mark Custom delegate - -@interface A2DynamicUIWebViewDelegate : A2DynamicDelegate -@end - -@implementation A2DynamicUIWebViewDelegate - -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { - BOOL ret = YES; - - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) - ret = [realDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType]; - - BOOL (^block)(UIWebView *, NSURLRequest *, UIWebViewNavigationType) = [self blockImplementationForMethod:_cmd]; - if (block) - ret &= block(webView, request, navigationType); - - return ret; -} - -- (void)webViewDidStartLoad:(UIWebView *)webView { - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) - [realDelegate webViewDidStartLoad:webView]; - - void (^block)(UIWebView *) = [self blockImplementationForMethod:_cmd]; - if (block) block(webView); -} - -- (void)webViewDidFinishLoad:(UIWebView *)webView { - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) - [realDelegate webViewDidFinishLoad:webView]; - - void (^block)(UIWebView *) = [self blockImplementationForMethod:_cmd]; - if (block) block(webView); -} - -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { - id realDelegate = self.realDelegate; - if (realDelegate && [realDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) - [realDelegate webView:webView didFailLoadWithError:error]; - - void (^block)(UIWebView *, NSError *) = [self blockImplementationForMethod:_cmd]; - if (block) block(webView, error); -} - -@end - -#pragma mark Category - -@implementation UIWebView (BlocksKit) - -@dynamic bk_shouldStartLoadBlock, bk_didStartLoadBlock, bk_didFinishLoadBlock, bk_didFinishWithErrorBlock; - -+ (void)load -{ - @autoreleasepool { - [self bk_registerDynamicDelegate]; - [self bk_linkDelegateMethods:@{ - @"bk_shouldStartLoadBlock": @"webView:shouldStartLoadWithRequest:navigationType:", - @"bk_didStartLoadBlock": @"webViewDidStartLoad:", - @"bk_didFinishLoadBlock": @"webViewDidFinishLoad:", - @"bk_didFinishWithErrorBlock": @"webView:didFailLoadWithError:" - }]; - } -} - -@end diff --git a/Pods/BlocksKit/LICENSE b/Pods/BlocksKit/LICENSE deleted file mode 100644 index 37aabca..0000000 --- a/Pods/BlocksKit/LICENSE +++ /dev/null @@ -1,12 +0,0 @@ -// -// LICENSE -// BlocksKit -// - -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/BlocksKit/README.md b/Pods/BlocksKit/README.md deleted file mode 100755 index be674e7..0000000 --- a/Pods/BlocksKit/README.md +++ /dev/null @@ -1,42 +0,0 @@ -[BlocksKit](https://zwaldowski.github.io/BlocksKit) -=================================================== - -Blocks in C and Objective-C are downright magical. They make coding easier and potentially quicker, not to mention faster on the front end with multithreading and Grand Central Dispatch. BlocksKit hopes to facilitate this kind of programming by removing some of the annoying - and, in some cases, impeding - limits on coding with blocks. - -BlocksKit is a framework for OS X Mountain Lion and newer and a static library for iOS 6 and newer. - -BlocksKit was created by [Zachary Waldowski](https://github.com/zwaldowski) and [Alexsander Akers](https://github.com/a2) and is maintained by Zachary Waldowski. - -Installation -============ - -BlocksKit can be added to a project using [CocoaPods](https://github.com/cocoapods/cocoapods). One may also use targets included in the project. - -### Library - -* Download a release of BlocksKit. -* Run "Archive" in XCode. -* By default the static library will be compiled to `~/Library/Developer/Xcode/DerivedData`. -* Move libBlocksKit.a and Headers to your project's folder, preferably a subfolder like "Vendor". -* In "Build Phases", Drag libBlocksKit.a into your target's "Link Binary With Libraries" build phase. -* In the build settings of your target or project, change "Other Linker Flags" to `-ObjC`. Make sure your app is linked with CoreGraphics, Foundation, MessageUI, and UIKit. -* Change (or add) to "Header Search Paths" the relative path to BlocksKit's headers, like `$(SRCROOT)/Vendor/Headers`. -* Insert `#import ` in your project's prefix header. - -### Framework - -See the included `Configurations/MacBundleFramework.xcconfig` for more information. - -Documentation -============= - -An Xcode-compatible documentation set is available [from CocoaDocs](http://cocoadocs.org/docsets/BlocksKit/). - -License -======= - -BlocksKit is maintained under the MIT license. **The project itself is free for use in any and all projects.** You can use BlocksKit in any project, public or private, with or without attribution - though we prefer attribution! It helps us. - -Unsure about your rights? [Read more.](http://opensource.org/licenses/MIT) - -Individual credits for included code exist in the header files and documentation. We thank them for their contributions to the open source community. diff --git a/Pods/DZNEmptyDataSet/LICENSE b/Pods/DZNEmptyDataSet/LICENSE new file mode 100644 index 0000000..199759a --- /dev/null +++ b/Pods/DZNEmptyDataSet/LICENSE @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/DZNEmptyDataSet/README.md b/Pods/DZNEmptyDataSet/README.md new file mode 100644 index 0000000..6f6be21 --- /dev/null +++ b/Pods/DZNEmptyDataSet/README.md @@ -0,0 +1,296 @@ +DZNEmptyDataSet +================= + +[![Pod Version](http://img.shields.io/cocoapods/v/DZNEmptyDataSet.svg)](http://cocoadocs.org/docsets/DZNEmptyDataSet/) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![License](http://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) + +### Projects using this library + +[Add your project to the list here](https://github.com/dzenbot/DZNEmptyDataSet/wiki/Projects-using-DZNEmptyDataSet) and provide a (320px wide) render of the result. + + +### The Empty Data Set Pattern +Also known as *[Empty State](http://emptystat.es/)* or *[Blank Slate](http://patternry.com/p=blank-slate/)*. + +Most applications show lists of content (data sets), which many turn out to be empty at one point, specially for new users with blank accounts. Empty screens create confusion by not being clear about what's going on, if there is an error/bug or if the user is supposed to do something within your app to be able to consume the content. + +Please read this very interesting article about [*Designing For The Empty States*](http://tympanus.net/codrops/2013/01/09/designing-for-the-empty-states/). + +![Screenshots_Row1](https://raw.githubusercontent.com/dzenbot/UITableView-DataSet/master/Examples/Applications/Screenshots/Screenshots_row1.png) +![Screenshots_Row2](https://raw.githubusercontent.com/dzenbot/UITableView-DataSet/master/Examples/Applications/Screenshots/Screenshots_row2.png) +(*These are real life examples, available in the 'Applications' sample project*) + +**[Empty Data Sets](http://pttrns.com/?did=1&scid=30)** are helpful for: +* Avoiding white-screens and communicating to your users why the screen is empty. +* Calling to action (particularly as an onboarding process). +* Avoiding other interruptive mechanisms like showing error alerts. +* Being consistent and improving the user experience. +* Delivering a brand presence. + + +### Features +* Compatible with UITableView and UICollectionView. Also compatible with UISearchDisplayController and UIScrollView. +* Gives multiple possibilities of layout and appearance, by showing an image and/or title label and/or description label and/or button. +* Uses NSAttributedString for easier appearance customisation. +* Uses auto-layout to automagically center the content to the tableview, with auto-rotation support. Also accepts custom vertical and horizontal alignment. +* Background color customisation. +* Allows tap gesture on the whole tableview rectangle (useful for resigning first responder or similar actions). +* For more advanced customisation, it allows a custom view. +* Compatible with Storyboard. +* Compatible with iOS 6 or later. +* Compatible with iPhone and iPad. +* **App Store ready** + +This library has been designed in a way where you won't need to extend UITableView or UICollectionView class. It will still work when using UITableViewController or UICollectionViewController. +By just conforming to DZNEmptyDataSetSource & DZNEmptyDataSetDelegate, you will be able to fully customize the content and appearance of the empty states for your application. + + +## Installation + +Available in [CocoaPods](http://cocoapods.org/?q=DZNEmptyDataSet) +```ruby +pod 'DZNEmptyDataSet' +``` + +To integrate DZNEmptyDataSet into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ruby +github "dzenbot/DZNEmptyDataSet" +``` + + +## How to use +For complete documentation, [visit CocoaPods' auto-generated doc](http://cocoadocs.org/docsets/DZNEmptyDataSet/) + +### Import +```objc +#import "UIScrollView+EmptyDataSet.h" +``` +Unless you are importing as a framework, then do: +```objc +#import "" +``` + +### Protocol Conformance +Conform to datasource and/or delegate. +```objc +@interface MainViewController : UITableViewController + +- (void)viewDidLoad +{ + [super viewDidLoad]; + + self.tableView.emptyDataSetSource = self; + self.tableView.emptyDataSetDelegate = self; + + // A little trick for removing the cell separators + self.tableView.tableFooterView = [UIView new]; +} +``` + +### Data Source Implementation +Return the content you want to show on the empty state, and take advantage of NSAttributedString features to customise the text appearance. + +The image for the empty state: +```objc +- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView +{ + return [UIImage imageNamed:@"empty_placeholder"]; +} +``` + +The image view animation +```objc +- (CAAnimation *)imageAnimationForEmptyDataSet:(UIScrollView *)scrollView +{ + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"transform"]; + + animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity]; + animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0)]; + + animation.duration = 0.25; + animation.cumulative = YES; + animation.repeatCount = MAXFLOAT; + + return animation; +} +``` + +The attributed string for the title of the empty state: +```objc +- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView +{ + NSString *text = @"Please Allow Photo Access"; + + NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:18.0f], + NSForegroundColorAttributeName: [UIColor darkGrayColor]}; + + return [[NSAttributedString alloc] initWithString:text attributes:attributes]; +} +``` + +The attributed string for the description of the empty state: +```objc +- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView +{ + NSString *text = @"This allows you to share photos from your library and save photos to your camera roll."; + + NSMutableParagraphStyle *paragraph = [NSMutableParagraphStyle new]; + paragraph.lineBreakMode = NSLineBreakByWordWrapping; + paragraph.alignment = NSTextAlignmentCenter; + + NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:14.0f], + NSForegroundColorAttributeName: [UIColor lightGrayColor], + NSParagraphStyleAttributeName: paragraph}; + + return [[NSAttributedString alloc] initWithString:text attributes:attributes]; +} +``` + +The attributed string to be used for the specified button state: +```objc +- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state +{ + NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17.0f]}; + + return [[NSAttributedString alloc] initWithString:@"Continue" attributes:attributes]; +} +``` + +or the image to be used for the specified button state: +```objc +- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state +{ + return [UIImage imageNamed:@"button_image"]; +} +``` + +The background color for the empty state: +```objc +- (UIColor *)backgroundColorForEmptyDataSet:(UIScrollView *)scrollView +{ + return [UIColor whiteColor]; +} +``` + +If you need a more complex layout, you can return a custom view instead: +```objc +- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView +{ + UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; + [activityView startAnimating]; + return activityView; +} +``` + +Additionally, you can also adjust the vertical alignment of the content view (ie: useful when there is tableHeaderView visible): +```objc +- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView +{ + return -self.tableView.tableHeaderView.frame.size.height/2.0f; +} +``` + +Finally, you can separate components from each other (default separation is 11 pts): +```objc +- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView +{ + return 20.0f; +} +``` + + +### Delegate Implementation +Return the behaviours you would expect from the empty states, and receive the user events. + +Asks to know if the empty state should be rendered and displayed (Default is YES) : +```objc +- (BOOL)emptyDataSetShouldDisplay:(UIScrollView *)scrollView +{ + return YES; +} +``` + +Asks for interaction permission (Default is YES) : +```objc +- (BOOL)emptyDataSetShouldAllowTouch:(UIScrollView *)scrollView +{ + return YES; +} +``` + +Asks for scrolling permission (Default is NO) : +```objc +- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView +{ + return YES; +} +``` + +Asks for image view animation permission (Default is NO) : +```objc +- (BOOL) emptyDataSetShouldAllowImageViewAnimate:(UIScrollView *)scrollView +{ + return YES; +} +``` + +Notifies when the dataset view was tapped: +```objc +- (void)emptyDataSet:(UIScrollView *)scrollView didTapView:(UIView *)view +{ + // Do something +} +``` + +Notifies when the data set call to action button was tapped: +```objc +- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button +{ + // Do something +} +``` + +### Refresh layout +If you need to refresh the empty state layout, simply call: + +```objc +[self.tableView reloadData]; +``` +or +```objc +[self.collectionView reloadData]; +``` +depending of which you are using. + +### Force layout update +You can also call `[self.tableView reloadEmptyDataSet]` to invalidate the current empty state layout and trigger a layout update, bypassing `-reloadData`. This might be useful if you have a lot of logic on your data source that you want to avoid calling, when not needed. `[self.scrollView reloadEmptyDataSet]` is the only way to refresh content when using with UIScrollView. + + +## Sample projects + +#### Applications +This project replicates several popular application's empty states (~20) with their exact content and appearance, such as Airbnb, Dropbox, Facebook, Foursquare, and many others. See how easy and flexible it is to customize the appearance of your empty states. You can also use this project as a playground to test things. + +#### Countries +This project shows a list of the world countries loaded from CoreData. It uses NSFecthedResultController for filtering search. When searching and no content is matched, a simple empty state is shown. See how to interact between the UITableViewDataSource and the DZNEmptyDataSetSource protocols, while using a typical CoreData stack. + +#### Colors +This project is a simple example of how this library also works with UICollectionView and UISearchDisplayController, while using Storyboards. + + +## Collaboration +Feel free to collaborate with ideas, issues and/or pull requests. + + +## License +(The MIT License) + +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h b/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h new file mode 100644 index 0000000..5dd70f2 --- /dev/null +++ b/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h @@ -0,0 +1,280 @@ +// +// UIScrollView+EmptyDataSet.h +// DZNEmptyDataSet +// https://github.com/dzenbot/DZNEmptyDataSet +// +// Created by Ignacio Romero Zurbuchen on 6/20/14. +// Copyright (c) 2016 DZN Labs. All rights reserved. +// Licence: MIT-Licence +// + +#import + +@protocol DZNEmptyDataSetSource; +@protocol DZNEmptyDataSetDelegate; + +#define DZNEmptyDataSetDeprecated(instead) DEPRECATED_MSG_ATTRIBUTE(" Use " # instead " instead") + +/** + A drop-in UITableView/UICollectionView superclass category for showing empty datasets whenever the view has no content to display. + @discussion It will work automatically, by just conforming to DZNEmptyDataSetSource, and returning the data you want to show. + */ +@interface UIScrollView (EmptyDataSet) + +/** The empty datasets data source. */ +@property (nonatomic, weak) IBOutlet id emptyDataSetSource; +/** The empty datasets delegate. */ +@property (nonatomic, weak) IBOutlet id emptyDataSetDelegate; +/** YES if any empty dataset is visible. */ +@property (nonatomic, readonly, getter = isEmptyDataSetVisible) BOOL emptyDataSetVisible; + +/** + Reloads the empty dataset content receiver. + @discussion Call this method to force all the data to refresh. Calling -reloadData is similar, but this forces only the empty dataset to reload, not the entire table view or collection view. + */ +- (void)reloadEmptyDataSet; + +@end + + +/** + The object that acts as the data source of the empty datasets. + @discussion The data source must adopt the DZNEmptyDataSetSource protocol. The data source is not retained. All data source methods are optional. + */ +@protocol DZNEmptyDataSetSource +@optional + +/** + Asks the data source for the title of the dataset. + The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string. + + @param scrollView A scrollView subclass informing the data source. + @return An attributed string for the dataset title, combining font, text color, text pararaph style, etc. + */ +- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView; + +/** + Asks the data source for the description of the dataset. + The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string. + + @param scrollView A scrollView subclass informing the data source. + @return An attributed string for the dataset description text, combining font, text color, text pararaph style, etc. + */ +- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView; + +/** + Asks the data source for the image of the dataset. + + @param scrollView A scrollView subclass informing the data source. + @return An image for the dataset. + */ +- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView; + + +/** + Asks the data source for a tint color of the image dataset. Default is nil. + + @param scrollView A scrollView subclass object informing the data source. + @return A color to tint the image of the dataset. + */ +- (UIColor *)imageTintColorForEmptyDataSet:(UIScrollView *)scrollView; + +/** + * Asks the data source for the image animation of the dataset. + * + * @param scrollView A scrollView subclass object informing the delegate. + * + * @return image animation + */ +- (CAAnimation *) imageAnimationForEmptyDataSet:(UIScrollView *) scrollView; + +/** + Asks the data source for the title to be used for the specified button state. + The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string. + + @param scrollView A scrollView subclass object informing the data source. + @param state The state that uses the specified title. The possible values are described in UIControlState. + @return An attributed string for the dataset button title, combining font, text color, text pararaph style, etc. + */ +- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state; + +/** + Asks the data source for the image to be used for the specified button state. + This method will override buttonTitleForEmptyDataSet:forState: and present the image only without any text. + + @param scrollView A scrollView subclass object informing the data source. + @param state The state that uses the specified title. The possible values are described in UIControlState. + @return An image for the dataset button imageview. + */ +- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state; + +/** + Asks the data source for a background image to be used for the specified button state. + There is no default style for this call. + + @param scrollView A scrollView subclass informing the data source. + @param state The state that uses the specified image. The values are described in UIControlState. + @return An attributed string for the dataset button title, combining font, text color, text pararaph style, etc. + */ +- (UIImage *)buttonBackgroundImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state; + +/** + Asks the data source for the background color of the dataset. Default is clear color. + + @param scrollView A scrollView subclass object informing the data source. + @return A color to be applied to the dataset background view. + */ +- (UIColor *)backgroundColorForEmptyDataSet:(UIScrollView *)scrollView; + +/** + Asks the data source for a custom view to be displayed instead of the default views such as labels, imageview and button. Default is nil. + Use this method to show an activity view indicator for loading feedback, or for complete custom empty data set. + Returning a custom view will ignore -offsetForEmptyDataSet and -spaceHeightForEmptyDataSet configurations. + + @param scrollView A scrollView subclass object informing the delegate. + @return The custom view. + */ +- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView; + +/** + Asks the data source for a offset for vertical and horizontal alignment of the content. Default is CGPointZero. + + @param scrollView A scrollView subclass object informing the delegate. + @return The offset for vertical and horizontal alignment. + */ +- (CGPoint)offsetForEmptyDataSet:(UIScrollView *)scrollView DZNEmptyDataSetDeprecated(-verticalOffsetForEmptyDataSet:); +- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView; + +/** + Asks the data source for a vertical space between elements. Default is 11 pts. + + @param scrollView A scrollView subclass object informing the delegate. + @return The space height between elements. + */ +- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView; + +@end + + +/** + The object that acts as the delegate of the empty datasets. + @discussion The delegate can adopt the DZNEmptyDataSetDelegate protocol. The delegate is not retained. All delegate methods are optional. + + @discussion All delegate methods are optional. Use this delegate for receiving action callbacks. + */ +@protocol DZNEmptyDataSetDelegate +@optional + +/** + Asks the delegate to know if the empty dataset should fade in when displayed. Default is YES. + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if the empty dataset should fade in. + */ +- (BOOL)emptyDataSetShouldFadeIn:(UIScrollView *)scrollView; + +/** + Asks the delegate to know if the empty dataset should still be displayed when the amount of items is more than 0. Default is NO + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if empty dataset should be forced to display + */ +- (BOOL)emptyDataSetShouldBeForcedToDisplay:(UIScrollView *)scrollView; + +/** + Asks the delegate to know if the empty dataset should be rendered and displayed. Default is YES. + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if the empty dataset should show. + */ +- (BOOL)emptyDataSetShouldDisplay:(UIScrollView *)scrollView; + +/** + Asks the delegate for touch permission. Default is YES. + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if the empty dataset receives touch gestures. + */ +- (BOOL)emptyDataSetShouldAllowTouch:(UIScrollView *)scrollView; + +/** + Asks the delegate for scroll permission. Default is NO. + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if the empty dataset is allowed to be scrollable. + */ +- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView; + +/** + Asks the delegate for image view animation permission. Default is NO. + Make sure to return a valid CAAnimation object from imageAnimationForEmptyDataSet: + + @param scrollView A scrollView subclass object informing the delegate. + @return YES if the empty dataset is allowed to animate + */ +- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView; + +/** + Tells the delegate that the empty dataset view was tapped. + Use this method either to resignFirstResponder of a textfield or searchBar. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetDidTapView:(UIScrollView *)scrollView DZNEmptyDataSetDeprecated(-emptyDataSet:didTapView:); + +/** + Tells the delegate that the action button was tapped. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetDidTapButton:(UIScrollView *)scrollView DZNEmptyDataSetDeprecated(-emptyDataSet:didTapButton:); + +/** + Tells the delegate that the empty dataset view was tapped. + Use this method either to resignFirstResponder of a textfield or searchBar. + + @param scrollView A scrollView subclass informing the delegate. + @param view the view tapped by the user + */ +- (void)emptyDataSet:(UIScrollView *)scrollView didTapView:(UIView *)view; + +/** + Tells the delegate that the action button was tapped. + + @param scrollView A scrollView subclass informing the delegate. + @param button the button tapped by the user + */ +- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button; + +/** + Tells the delegate that the empty data set will appear. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetWillAppear:(UIScrollView *)scrollView; + +/** + Tells the delegate that the empty data set did appear. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetDidAppear:(UIScrollView *)scrollView; + +/** + Tells the delegate that the empty data set will disappear. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetWillDisappear:(UIScrollView *)scrollView; + +/** + Tells the delegate that the empty data set did disappear. + + @param scrollView A scrollView subclass informing the delegate. + */ +- (void)emptyDataSetDidDisappear:(UIScrollView *)scrollView; + +@end + +#undef DZNEmptyDataSetDeprecated + diff --git a/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.m b/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.m new file mode 100644 index 0000000..ce43ffc --- /dev/null +++ b/Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.m @@ -0,0 +1,1074 @@ +// +// UIScrollView+EmptyDataSet.m +// DZNEmptyDataSet +// https://github.com/dzenbot/DZNEmptyDataSet +// +// Created by Ignacio Romero Zurbuchen on 6/20/14. +// Copyright (c) 2016 DZN Labs. All rights reserved. +// Licence: MIT-Licence +// + +#import "UIScrollView+EmptyDataSet.h" +#import + +@interface UIView (DZNConstraintBasedLayoutExtensions) + +- (NSLayoutConstraint *)equallyRelatedConstraintWithView:(UIView *)view attribute:(NSLayoutAttribute)attribute; + +@end + +@interface DZNWeakObjectContainer : NSObject + +@property (nonatomic, readonly, weak) id weakObject; + +- (instancetype)initWithWeakObject:(id)object; + +@end + +@interface DZNEmptyDataSetView : UIView + +@property (nonatomic, readonly) UIView *contentView; +@property (nonatomic, readonly) UILabel *titleLabel; +@property (nonatomic, readonly) UILabel *detailLabel; +@property (nonatomic, readonly) UIImageView *imageView; +@property (nonatomic, readonly) UIButton *button; +@property (nonatomic, strong) UIView *customView; +@property (nonatomic, strong) UITapGestureRecognizer *tapGesture; + +@property (nonatomic, assign) CGFloat verticalOffset; +@property (nonatomic, assign) CGFloat verticalSpace; + +@property (nonatomic, assign) BOOL fadeInOnDisplay; + +- (void)setupConstraints; +- (void)prepareForReuse; + +@end + + +#pragma mark - UIScrollView+EmptyDataSet + +static char const * const kEmptyDataSetSource = "emptyDataSetSource"; +static char const * const kEmptyDataSetDelegate = "emptyDataSetDelegate"; +static char const * const kEmptyDataSetView = "emptyDataSetView"; + +#define kEmptyImageViewAnimationKey @"com.dzn.emptyDataSet.imageViewAnimation" + +@interface UIScrollView () +@property (nonatomic, readonly) DZNEmptyDataSetView *emptyDataSetView; +@end + +@implementation UIScrollView (DZNEmptyDataSet) + +#pragma mark - Getters (Public) + +- (id)emptyDataSetSource +{ + DZNWeakObjectContainer *container = objc_getAssociatedObject(self, kEmptyDataSetSource); + return container.weakObject; +} + +- (id)emptyDataSetDelegate +{ + DZNWeakObjectContainer *container = objc_getAssociatedObject(self, kEmptyDataSetDelegate); + return container.weakObject; +} + +- (BOOL)isEmptyDataSetVisible +{ + UIView *view = objc_getAssociatedObject(self, kEmptyDataSetView); + return view ? !view.hidden : NO; +} + + +#pragma mark - Getters (Private) + +- (DZNEmptyDataSetView *)emptyDataSetView +{ + DZNEmptyDataSetView *view = objc_getAssociatedObject(self, kEmptyDataSetView); + + if (!view) + { + view = [DZNEmptyDataSetView new]; + view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; + view.hidden = YES; + + view.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dzn_didTapContentView:)]; + view.tapGesture.delegate = self; + [view addGestureRecognizer:view.tapGesture]; + + [self setEmptyDataSetView:view]; + } + return view; +} + +- (BOOL)dzn_canDisplay +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource conformsToProtocol:@protocol(DZNEmptyDataSetSource)]) { + if ([self isKindOfClass:[UITableView class]] || [self isKindOfClass:[UICollectionView class]] || [self isKindOfClass:[UIScrollView class]]) { + return YES; + } + } + + return NO; +} + +- (NSInteger)dzn_itemsCount +{ + NSInteger items = 0; + + // UIScollView doesn't respond to 'dataSource' so let's exit + if (![self respondsToSelector:@selector(dataSource)]) { + return items; + } + + // UITableView support + if ([self isKindOfClass:[UITableView class]]) { + + UITableView *tableView = (UITableView *)self; + id dataSource = tableView.dataSource; + + NSInteger sections = 1; + + if (dataSource && [dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)]) { + sections = [dataSource numberOfSectionsInTableView:tableView]; + } + + if (dataSource && [dataSource respondsToSelector:@selector(tableView:numberOfRowsInSection:)]) { + for (NSInteger section = 0; section < sections; section++) { + items += [dataSource tableView:tableView numberOfRowsInSection:section]; + } + } + } + // UICollectionView support + else if ([self isKindOfClass:[UICollectionView class]]) { + + UICollectionView *collectionView = (UICollectionView *)self; + id dataSource = collectionView.dataSource; + + NSInteger sections = 1; + + if (dataSource && [dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]) { + sections = [dataSource numberOfSectionsInCollectionView:collectionView]; + } + + if (dataSource && [dataSource respondsToSelector:@selector(collectionView:numberOfItemsInSection:)]) { + for (NSInteger section = 0; section < sections; section++) { + items += [dataSource collectionView:collectionView numberOfItemsInSection:section]; + } + } + } + + return items; +} + + +#pragma mark - Data Source Getters + +- (NSAttributedString *)dzn_titleLabelString +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(titleForEmptyDataSet:)]) { + NSAttributedString *string = [self.emptyDataSetSource titleForEmptyDataSet:self]; + if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @"You must return a valid NSAttributedString object for -titleForEmptyDataSet:"); + return string; + } + return nil; +} + +- (NSAttributedString *)dzn_detailLabelString +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(descriptionForEmptyDataSet:)]) { + NSAttributedString *string = [self.emptyDataSetSource descriptionForEmptyDataSet:self]; + if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @"You must return a valid NSAttributedString object for -descriptionForEmptyDataSet:"); + return string; + } + return nil; +} + +- (UIImage *)dzn_image +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageForEmptyDataSet:)]) { + UIImage *image = [self.emptyDataSetSource imageForEmptyDataSet:self]; + if (image) NSAssert([image isKindOfClass:[UIImage class]], @"You must return a valid UIImage object for -imageForEmptyDataSet:"); + return image; + } + return nil; +} + +- (CAAnimation *)dzn_imageAnimation +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageAnimationForEmptyDataSet:)]) { + CAAnimation *imageAnimation = [self.emptyDataSetSource imageAnimationForEmptyDataSet:self]; + if (imageAnimation) NSAssert([imageAnimation isKindOfClass:[CAAnimation class]], @"You must return a valid CAAnimation object for -imageAnimationForEmptyDataSet:"); + return imageAnimation; + } + return nil; +} + +- (UIColor *)dzn_imageTintColor +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageTintColorForEmptyDataSet:)]) { + UIColor *color = [self.emptyDataSetSource imageTintColorForEmptyDataSet:self]; + if (color) NSAssert([color isKindOfClass:[UIColor class]], @"You must return a valid UIColor object for -imageTintColorForEmptyDataSet:"); + return color; + } + return nil; +} + +- (NSAttributedString *)dzn_buttonTitleForState:(UIControlState)state +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonTitleForEmptyDataSet:forState:)]) { + NSAttributedString *string = [self.emptyDataSetSource buttonTitleForEmptyDataSet:self forState:state]; + if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @"You must return a valid NSAttributedString object for -buttonTitleForEmptyDataSet:forState:"); + return string; + } + return nil; +} + +- (UIImage *)dzn_buttonImageForState:(UIControlState)state +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonImageForEmptyDataSet:forState:)]) { + UIImage *image = [self.emptyDataSetSource buttonImageForEmptyDataSet:self forState:state]; + if (image) NSAssert([image isKindOfClass:[UIImage class]], @"You must return a valid UIImage object for -buttonImageForEmptyDataSet:forState:"); + return image; + } + return nil; +} + +- (UIImage *)dzn_buttonBackgroundImageForState:(UIControlState)state +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonBackgroundImageForEmptyDataSet:forState:)]) { + UIImage *image = [self.emptyDataSetSource buttonBackgroundImageForEmptyDataSet:self forState:state]; + if (image) NSAssert([image isKindOfClass:[UIImage class]], @"You must return a valid UIImage object for -buttonBackgroundImageForEmptyDataSet:forState:"); + return image; + } + return nil; +} + +- (UIColor *)dzn_dataSetBackgroundColor +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(backgroundColorForEmptyDataSet:)]) { + UIColor *color = [self.emptyDataSetSource backgroundColorForEmptyDataSet:self]; + if (color) NSAssert([color isKindOfClass:[UIColor class]], @"You must return a valid UIColor object for -backgroundColorForEmptyDataSet:"); + return color; + } + return [UIColor clearColor]; +} + +- (UIView *)dzn_customView +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(customViewForEmptyDataSet:)]) { + UIView *view = [self.emptyDataSetSource customViewForEmptyDataSet:self]; + if (view) NSAssert([view isKindOfClass:[UIView class]], @"You must return a valid UIView object for -customViewForEmptyDataSet:"); + return view; + } + return nil; +} + +- (CGFloat)dzn_verticalOffset +{ + CGFloat offset = 0.0; + + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(verticalOffsetForEmptyDataSet:)]) { + offset = [self.emptyDataSetSource verticalOffsetForEmptyDataSet:self]; + } + return offset; +} + +- (CGFloat)dzn_verticalSpace +{ + if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(spaceHeightForEmptyDataSet:)]) { + return [self.emptyDataSetSource spaceHeightForEmptyDataSet:self]; + } + return 0.0; +} + + +#pragma mark - Delegate Getters & Events (Private) + +- (BOOL)dzn_shouldFadeIn { + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldFadeIn:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldFadeIn:self]; + } + return YES; +} + +- (BOOL)dzn_shouldDisplay +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldDisplay:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldDisplay:self]; + } + return YES; +} + +- (BOOL)dzn_shouldBeForcedToDisplay +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldBeForcedToDisplay:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldBeForcedToDisplay:self]; + } + return NO; +} + +- (BOOL)dzn_isTouchAllowed +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAllowTouch:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldAllowTouch:self]; + } + return YES; +} + +- (BOOL)dzn_isScrollAllowed +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAllowScroll:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldAllowScroll:self]; + } + return NO; +} + +- (BOOL)dzn_isImageViewAnimateAllowed +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAnimateImageView:)]) { + return [self.emptyDataSetDelegate emptyDataSetShouldAnimateImageView:self]; + } + return NO; +} + +- (void)dzn_willAppear +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetWillAppear:)]) { + [self.emptyDataSetDelegate emptyDataSetWillAppear:self]; + } +} + +- (void)dzn_didAppear +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidAppear:)]) { + [self.emptyDataSetDelegate emptyDataSetDidAppear:self]; + } +} + +- (void)dzn_willDisappear +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetWillDisappear:)]) { + [self.emptyDataSetDelegate emptyDataSetWillDisappear:self]; + } +} + +- (void)dzn_didDisappear +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidDisappear:)]) { + [self.emptyDataSetDelegate emptyDataSetDidDisappear:self]; + } +} + +- (void)dzn_didTapContentView:(id)sender +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSet:didTapView:)]) { + [self.emptyDataSetDelegate emptyDataSet:self didTapView:sender]; + } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + else if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidTapView:)]) { + [self.emptyDataSetDelegate emptyDataSetDidTapView:self]; + } +#pragma clang diagnostic pop +} + +- (void)dzn_didTapDataButton:(id)sender +{ + if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSet:didTapButton:)]) { + [self.emptyDataSetDelegate emptyDataSet:self didTapButton:sender]; + } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + else if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidTapButton:)]) { + [self.emptyDataSetDelegate emptyDataSetDidTapButton:self]; + } +#pragma clang diagnostic pop +} + + +#pragma mark - Setters (Public) + +- (void)setEmptyDataSetSource:(id)datasource +{ + if (!datasource || ![self dzn_canDisplay]) { + [self dzn_invalidate]; + } + + objc_setAssociatedObject(self, kEmptyDataSetSource, [[DZNWeakObjectContainer alloc] initWithWeakObject:datasource], OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // We add method sizzling for injecting -dzn_reloadData implementation to the native -reloadData implementation + [self swizzleIfPossible:@selector(reloadData)]; + + // Exclusively for UITableView, we also inject -dzn_reloadData to -endUpdates + if ([self isKindOfClass:[UITableView class]]) { + [self swizzleIfPossible:@selector(endUpdates)]; + } +} + +- (void)setEmptyDataSetDelegate:(id)delegate +{ + if (!delegate) { + [self dzn_invalidate]; + } + + objc_setAssociatedObject(self, kEmptyDataSetDelegate, [[DZNWeakObjectContainer alloc] initWithWeakObject:delegate], OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + + +#pragma mark - Setters (Private) + +- (void)setEmptyDataSetView:(DZNEmptyDataSetView *)view +{ + objc_setAssociatedObject(self, kEmptyDataSetView, view, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + + +#pragma mark - Reload APIs (Public) + +- (void)reloadEmptyDataSet +{ + [self dzn_reloadEmptyDataSet]; +} + + +#pragma mark - Reload APIs (Private) + +- (void)dzn_reloadEmptyDataSet +{ + if (![self dzn_canDisplay]) { + return; + } + + if (([self dzn_shouldDisplay] && [self dzn_itemsCount] == 0) || [self dzn_shouldBeForcedToDisplay]) + { + // Notifies that the empty dataset view will appear + [self dzn_willAppear]; + + DZNEmptyDataSetView *view = self.emptyDataSetView; + + if (!view.superview) { + // Send the view all the way to the back, in case a header and/or footer is present, as well as for sectionHeaders or any other content + if (([self isKindOfClass:[UITableView class]] || [self isKindOfClass:[UICollectionView class]]) && self.subviews.count > 1) { + [self insertSubview:view atIndex:0]; + } + else { + [self addSubview:view]; + } + } + + // Removing view resetting the view and its constraints it very important to guarantee a good state + [view prepareForReuse]; + + UIView *customView = [self dzn_customView]; + + // If a non-nil custom view is available, let's configure it instead + if (customView) { + view.customView = customView; + } + else { + // Get the data from the data source + NSAttributedString *titleLabelString = [self dzn_titleLabelString]; + NSAttributedString *detailLabelString = [self dzn_detailLabelString]; + + UIImage *buttonImage = [self dzn_buttonImageForState:UIControlStateNormal]; + NSAttributedString *buttonTitle = [self dzn_buttonTitleForState:UIControlStateNormal]; + + UIImage *image = [self dzn_image]; + UIColor *imageTintColor = [self dzn_imageTintColor]; + UIImageRenderingMode renderingMode = imageTintColor ? UIImageRenderingModeAlwaysTemplate : UIImageRenderingModeAlwaysOriginal; + + view.verticalSpace = [self dzn_verticalSpace]; + + // Configure Image + if (image) { + if ([image respondsToSelector:@selector(imageWithRenderingMode:)]) { + view.imageView.image = [image imageWithRenderingMode:renderingMode]; + view.imageView.tintColor = imageTintColor; + } + else { + // iOS 6 fallback: insert code to convert imaged if needed + view.imageView.image = image; + } + } + + // Configure title label + if (titleLabelString) { + view.titleLabel.attributedText = titleLabelString; + } + + // Configure detail label + if (detailLabelString) { + view.detailLabel.attributedText = detailLabelString; + } + + // Configure button + if (buttonImage) { + [view.button setImage:buttonImage forState:UIControlStateNormal]; + [view.button setImage:[self dzn_buttonImageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted]; + } + else if (buttonTitle) { + [view.button setAttributedTitle:buttonTitle forState:UIControlStateNormal]; + [view.button setAttributedTitle:[self dzn_buttonTitleForState:UIControlStateHighlighted] forState:UIControlStateHighlighted]; + [view.button setBackgroundImage:[self dzn_buttonBackgroundImageForState:UIControlStateNormal] forState:UIControlStateNormal]; + [view.button setBackgroundImage:[self dzn_buttonBackgroundImageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted]; + } + } + + // Configure offset + view.verticalOffset = [self dzn_verticalOffset]; + + // Configure the empty dataset view + view.backgroundColor = [self dzn_dataSetBackgroundColor]; + view.hidden = NO; + view.clipsToBounds = YES; + + // Configure empty dataset userInteraction permission + view.userInteractionEnabled = [self dzn_isTouchAllowed]; + + // Configure empty dataset fade in display + view.fadeInOnDisplay = [self dzn_shouldFadeIn]; + + [view setupConstraints]; + + [UIView performWithoutAnimation:^{ + [view layoutIfNeeded]; + }]; + + // Configure scroll permission + self.scrollEnabled = [self dzn_isScrollAllowed]; + + // Configure image view animation + if ([self dzn_isImageViewAnimateAllowed]) + { + CAAnimation *animation = [self dzn_imageAnimation]; + + if (animation) { + [self.emptyDataSetView.imageView.layer addAnimation:animation forKey:kEmptyImageViewAnimationKey]; + } + } + else if ([self.emptyDataSetView.imageView.layer animationForKey:kEmptyImageViewAnimationKey]) { + [self.emptyDataSetView.imageView.layer removeAnimationForKey:kEmptyImageViewAnimationKey]; + } + + // Notifies that the empty dataset view did appear + [self dzn_didAppear]; + } + else if (self.isEmptyDataSetVisible) { + [self dzn_invalidate]; + } +} + +- (void)dzn_invalidate +{ + // Notifies that the empty dataset view will disappear + [self dzn_willDisappear]; + + if (self.emptyDataSetView) { + [self.emptyDataSetView prepareForReuse]; + [self.emptyDataSetView removeFromSuperview]; + + [self setEmptyDataSetView:nil]; + } + + self.scrollEnabled = YES; + + // Notifies that the empty dataset view did disappear + [self dzn_didDisappear]; +} + + +#pragma mark - Method Swizzling + +static NSMutableDictionary *_impLookupTable; +static NSString *const DZNSwizzleInfoPointerKey = @"pointer"; +static NSString *const DZNSwizzleInfoOwnerKey = @"owner"; +static NSString *const DZNSwizzleInfoSelectorKey = @"selector"; + +// Based on Bryce Buchanan's swizzling technique http://blog.newrelic.com/2014/04/16/right-way-to-swizzle/ +// And Juzzin's ideas https://github.com/juzzin/JUSEmptyViewController + +void dzn_original_implementation(id self, SEL _cmd) +{ + // Fetch original implementation from lookup table + Class baseClass = dzn_baseClassToSwizzleForTarget(self); + NSString *key = dzn_implementationKey(baseClass, _cmd); + + NSDictionary *swizzleInfo = [_impLookupTable objectForKey:key]; + NSValue *impValue = [swizzleInfo valueForKey:DZNSwizzleInfoPointerKey]; + + IMP impPointer = [impValue pointerValue]; + + // We then inject the additional implementation for reloading the empty dataset + // Doing it before calling the original implementation does update the 'isEmptyDataSetVisible' flag on time. + [self dzn_reloadEmptyDataSet]; + + // If found, call original implementation + if (impPointer) { + ((void(*)(id,SEL))impPointer)(self,_cmd); + } +} + +NSString *dzn_implementationKey(Class class, SEL selector) +{ + if (!class || !selector) { + return nil; + } + + NSString *className = NSStringFromClass([class class]); + + NSString *selectorName = NSStringFromSelector(selector); + return [NSString stringWithFormat:@"%@_%@",className,selectorName]; +} + +Class dzn_baseClassToSwizzleForTarget(id target) +{ + if ([target isKindOfClass:[UITableView class]]) { + return [UITableView class]; + } + else if ([target isKindOfClass:[UICollectionView class]]) { + return [UICollectionView class]; + } + else if ([target isKindOfClass:[UIScrollView class]]) { + return [UIScrollView class]; + } + + return nil; +} + +- (void)swizzleIfPossible:(SEL)selector +{ + // Check if the target responds to selector + if (![self respondsToSelector:selector]) { + return; + } + + // Create the lookup table + if (!_impLookupTable) { + _impLookupTable = [[NSMutableDictionary alloc] initWithCapacity:3]; // 3 represent the supported base classes + } + + // We make sure that setImplementation is called once per class kind, UITableView or UICollectionView. + for (NSDictionary *info in [_impLookupTable allValues]) { + Class class = [info objectForKey:DZNSwizzleInfoOwnerKey]; + NSString *selectorName = [info objectForKey:DZNSwizzleInfoSelectorKey]; + + if ([selectorName isEqualToString:NSStringFromSelector(selector)]) { + if ([self isKindOfClass:class]) { + return; + } + } + } + + Class baseClass = dzn_baseClassToSwizzleForTarget(self); + NSString *key = dzn_implementationKey(baseClass, selector); + NSValue *impValue = [[_impLookupTable objectForKey:key] valueForKey:DZNSwizzleInfoPointerKey]; + + // If the implementation for this class already exist, skip!! + if (impValue || !key || !baseClass) { + return; + } + + // Swizzle by injecting additional implementation + Method method = class_getInstanceMethod(baseClass, selector); + IMP dzn_newImplementation = method_setImplementation(method, (IMP)dzn_original_implementation); + + // Store the new implementation in the lookup table + NSDictionary *swizzledInfo = @{DZNSwizzleInfoOwnerKey: baseClass, + DZNSwizzleInfoSelectorKey: NSStringFromSelector(selector), + DZNSwizzleInfoPointerKey: [NSValue valueWithPointer:dzn_newImplementation]}; + + [_impLookupTable setObject:swizzledInfo forKey:key]; +} + + +#pragma mark - UIGestureRecognizerDelegate Methods + +- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer +{ + if ([gestureRecognizer.view isEqual:self.emptyDataSetView]) { + return [self dzn_isTouchAllowed]; + } + + return [super gestureRecognizerShouldBegin:gestureRecognizer]; +} + +- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer +{ + UIGestureRecognizer *tapGesture = self.emptyDataSetView.tapGesture; + + if ([gestureRecognizer isEqual:tapGesture] || [otherGestureRecognizer isEqual:tapGesture]) { + return YES; + } + + // defer to emptyDataSetDelegate's implementation if available + if ( (self.emptyDataSetDelegate != (id)self) && [self.emptyDataSetDelegate respondsToSelector:@selector(gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)]) { + return [(id)self.emptyDataSetDelegate gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer]; + } + + return NO; +} + +@end + + +#pragma mark - DZNEmptyDataSetView + +@interface DZNEmptyDataSetView () +@end + +@implementation DZNEmptyDataSetView +@synthesize contentView = _contentView; +@synthesize titleLabel = _titleLabel, detailLabel = _detailLabel, imageView = _imageView, button = _button; + +#pragma mark - Initialization Methods + +- (instancetype)init +{ + self = [super init]; + if (self) { + [self addSubview:self.contentView]; + } + return self; +} + +- (void)didMoveToSuperview +{ + self.frame = self.superview.bounds; + + void(^fadeInBlock)(void) = ^{_contentView.alpha = 1.0;}; + + if (self.fadeInOnDisplay) { + [UIView animateWithDuration:0.25 + animations:fadeInBlock + completion:NULL]; + } + else { + fadeInBlock(); + } +} + + +#pragma mark - Getters + +- (UIView *)contentView +{ + if (!_contentView) + { + _contentView = [UIView new]; + _contentView.translatesAutoresizingMaskIntoConstraints = NO; + _contentView.backgroundColor = [UIColor clearColor]; + _contentView.userInteractionEnabled = YES; + _contentView.alpha = 0; + } + return _contentView; +} + +- (UIImageView *)imageView +{ + if (!_imageView) + { + _imageView = [UIImageView new]; + _imageView.translatesAutoresizingMaskIntoConstraints = NO; + _imageView.backgroundColor = [UIColor clearColor]; + _imageView.contentMode = UIViewContentModeScaleAspectFit; + _imageView.userInteractionEnabled = NO; + _imageView.accessibilityIdentifier = @"empty set background image"; + + [_contentView addSubview:_imageView]; + } + return _imageView; +} + +- (UILabel *)titleLabel +{ + if (!_titleLabel) + { + _titleLabel = [UILabel new]; + _titleLabel.translatesAutoresizingMaskIntoConstraints = NO; + _titleLabel.backgroundColor = [UIColor clearColor]; + + _titleLabel.font = [UIFont systemFontOfSize:27.0]; + _titleLabel.textColor = [UIColor colorWithWhite:0.6 alpha:1.0]; + _titleLabel.textAlignment = NSTextAlignmentCenter; + _titleLabel.lineBreakMode = NSLineBreakByWordWrapping; + _titleLabel.numberOfLines = 0; + _titleLabel.accessibilityIdentifier = @"empty set title"; + + [_contentView addSubview:_titleLabel]; + } + return _titleLabel; +} + +- (UILabel *)detailLabel +{ + if (!_detailLabel) + { + _detailLabel = [UILabel new]; + _detailLabel.translatesAutoresizingMaskIntoConstraints = NO; + _detailLabel.backgroundColor = [UIColor clearColor]; + + _detailLabel.font = [UIFont systemFontOfSize:17.0]; + _detailLabel.textColor = [UIColor colorWithWhite:0.6 alpha:1.0]; + _detailLabel.textAlignment = NSTextAlignmentCenter; + _detailLabel.lineBreakMode = NSLineBreakByWordWrapping; + _detailLabel.numberOfLines = 0; + _detailLabel.accessibilityIdentifier = @"empty set detail label"; + + [_contentView addSubview:_detailLabel]; + } + return _detailLabel; +} + +- (UIButton *)button +{ + if (!_button) + { + _button = [UIButton buttonWithType:UIButtonTypeCustom]; + _button.translatesAutoresizingMaskIntoConstraints = NO; + _button.backgroundColor = [UIColor clearColor]; + _button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; + _button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; + _button.accessibilityIdentifier = @"empty set button"; + + [_button addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside]; + + [_contentView addSubview:_button]; + } + return _button; +} + +- (BOOL)canShowImage +{ + return (_imageView.image && _imageView.superview); +} + +- (BOOL)canShowTitle +{ + return (_titleLabel.attributedText.string.length > 0 && _titleLabel.superview); +} + +- (BOOL)canShowDetail +{ + return (_detailLabel.attributedText.string.length > 0 && _detailLabel.superview); +} + +- (BOOL)canShowButton +{ + if ([_button attributedTitleForState:UIControlStateNormal].string.length > 0 || [_button imageForState:UIControlStateNormal]) { + return (_button.superview != nil); + } + return NO; +} + + +#pragma mark - Setters + +- (void)setCustomView:(UIView *)view +{ + if (!view) { + return; + } + + if (_customView) { + [_customView removeFromSuperview]; + _customView = nil; + } + + _customView = view; + _customView.translatesAutoresizingMaskIntoConstraints = NO; + [self.contentView addSubview:_customView]; +} + + +#pragma mark - Action Methods + +- (void)didTapButton:(id)sender +{ + SEL selector = NSSelectorFromString(@"dzn_didTapDataButton:"); + + if ([self.superview respondsToSelector:selector]) { + [self.superview performSelector:selector withObject:sender afterDelay:0.0f]; + } +} + +- (void)removeAllConstraints +{ + [self removeConstraints:self.constraints]; + [_contentView removeConstraints:_contentView.constraints]; +} + +- (void)prepareForReuse +{ + [self.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; + + _titleLabel = nil; + _detailLabel = nil; + _imageView = nil; + _button = nil; + _customView = nil; + + [self removeAllConstraints]; +} + + +#pragma mark - Auto-Layout Configuration + +- (void)setupConstraints +{ + // First, configure the content view constaints + // The content view must alway be centered to its superview + NSLayoutConstraint *centerXConstraint = [self equallyRelatedConstraintWithView:self.contentView attribute:NSLayoutAttributeCenterX]; + NSLayoutConstraint *centerYConstraint = [self equallyRelatedConstraintWithView:self.contentView attribute:NSLayoutAttributeCenterY]; + + [self addConstraint:centerXConstraint]; + [self addConstraint:centerYConstraint]; + [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:nil views:@{@"contentView": self.contentView}]]; + + // When a custom offset is available, we adjust the vertical constraints' constants + if (self.verticalOffset != 0 && self.constraints.count > 0) { + centerYConstraint.constant = self.verticalOffset; + } + + // If applicable, set the custom view's constraints + if (_customView) { + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]]; + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[customView]|" options:0 metrics:nil views:@{@"customView":_customView}]]; + } + else { + CGFloat width = CGRectGetWidth(self.frame) ? : CGRectGetWidth([UIScreen mainScreen].bounds); + CGFloat padding = roundf(width/16.0); + CGFloat verticalSpace = self.verticalSpace ? : 11.0; // Default is 11 pts + + NSMutableArray *subviewStrings = [NSMutableArray array]; + NSMutableDictionary *views = [NSMutableDictionary dictionary]; + NSDictionary *metrics = @{@"padding": @(padding)}; + + // Assign the image view's horizontal constraints + if (_imageView.superview) { + + [subviewStrings addObject:@"imageView"]; + views[[subviewStrings lastObject]] = _imageView; + + [self.contentView addConstraint:[self.contentView equallyRelatedConstraintWithView:_imageView attribute:NSLayoutAttributeCenterX]]; + } + + // Assign the title label's horizontal constraints + if ([self canShowTitle]) { + + [subviewStrings addObject:@"titleLabel"]; + views[[subviewStrings lastObject]] = _titleLabel; + + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(padding@750)-[titleLabel(>=0)]-(padding@750)-|" + options:0 metrics:metrics views:views]]; + } + // or removes from its superview + else { + [_titleLabel removeFromSuperview]; + _titleLabel = nil; + } + + // Assign the detail label's horizontal constraints + if ([self canShowDetail]) { + + [subviewStrings addObject:@"detailLabel"]; + views[[subviewStrings lastObject]] = _detailLabel; + + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(padding@750)-[detailLabel(>=0)]-(padding@750)-|" + options:0 metrics:metrics views:views]]; + } + // or removes from its superview + else { + [_detailLabel removeFromSuperview]; + _detailLabel = nil; + } + + // Assign the button's horizontal constraints + if ([self canShowButton]) { + + [subviewStrings addObject:@"button"]; + views[[subviewStrings lastObject]] = _button; + + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(padding@750)-[button(>=0)]-(padding@750)-|" + options:0 metrics:metrics views:views]]; + } + // or removes from its superview + else { + [_button removeFromSuperview]; + _button = nil; + } + + + NSMutableString *verticalFormat = [NSMutableString new]; + + // Build a dynamic string format for the vertical constraints, adding a margin between each element. Default is 11 pts. + for (int i = 0; i < subviewStrings.count; i++) { + + NSString *string = subviewStrings[i]; + [verticalFormat appendFormat:@"[%@]", string]; + + if (i < subviewStrings.count-1) { + [verticalFormat appendFormat:@"-(%.f@750)-", verticalSpace]; + } + } + + // Assign the vertical constraints to the content view + if (verticalFormat.length > 0) { + [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@"V:|%@|", verticalFormat] + options:0 metrics:metrics views:views]]; + } + } +} + +- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event +{ + UIView *hitView = [super hitTest:point withEvent:event]; + + // Return any UIControl instance such as buttons, segmented controls, switches, etc. + if ([hitView isKindOfClass:[UIControl class]]) { + return hitView; + } + + // Return either the contentView or customView + if ([hitView isEqual:_contentView] || [hitView isEqual:_customView]) { + return hitView; + } + + return nil; +} + +@end + + +#pragma mark - UIView+DZNConstraintBasedLayoutExtensions + +@implementation UIView (DZNConstraintBasedLayoutExtensions) + +- (NSLayoutConstraint *)equallyRelatedConstraintWithView:(UIView *)view attribute:(NSLayoutAttribute)attribute +{ + return [NSLayoutConstraint constraintWithItem:view + attribute:attribute + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:attribute + multiplier:1.0 + constant:0.0]; +} + +@end + +#pragma mark - DZNWeakObjectContainer + +@implementation DZNWeakObjectContainer + +- (instancetype)initWithWeakObject:(id)object +{ + self = [super init]; + if (self) { + _weakObject = object; + } + return self; +} + +@end diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTracker.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTracker.h deleted file mode 100644 index 161a00f..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTracker.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -//! Project version number for FBAllocationTracker. -FOUNDATION_EXPORT double FBAllocationTrackerVersionNumber; - -//! Project version string for FBAllocationTracker. -FOUNDATION_EXPORT const unsigned char FBAllocationTrackerVersionString[]; - -#import "FBAllocationTrackerManager.h" -#import "FBAllocationTrackerSummary.h" diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerDefines.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerDefines.h deleted file mode 100644 index c636496..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerDefines.h +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#ifdef ALLOCATION_TRACKER_ENABLED -#define _INTERNAL_FBAT_ENABLED (ALLOCATION_TRACKER_ENABLED) -#else -#define _INTERNAL_FBAT_ENABLED DEBUG -#endif // ALLOCATION_TRACKER_ENABLED diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerFunctors.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerFunctors.h deleted file mode 100644 index 94883db..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerFunctors.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -namespace FB { namespace AllocationTracker { - struct ObjectHashFunctor { - size_t operator()(const __unsafe_unretained id key) const { - return (size_t)(key); - } - }; - - struct ObjectEqualFunctor { - bool operator()(const __unsafe_unretained id left, - const __unsafe_unretained id right) const { - return left == right; - } - }; - - struct ClassHashFunctor { - size_t operator()(const Class key) const { - return (size_t)(key); - } - }; - - struct ClassEqualFunctor { - bool operator()(const Class left, const Class right) const { - return left == right; - } - }; -} } diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerHelpers.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerHelpers.h deleted file mode 100644 index 4e80fa5..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerHelpers.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerDefines.h" - -#if _INTERNAL_FBAT_ENABLED - -namespace FB { namespace AllocationTracker { - - /** - Helper function that NSObject swizzles will use to increment on alloc - */ - void incrementAllocations(__unsafe_unretained id obj); - - /** - Helper function that NSObject swizzles will use to decrement on dealloc - */ - void incrementDeallocations(__unsafe_unretained id obj); - -} } - -#endif diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.h deleted file mode 100644 index 6f2a588..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.h +++ /dev/null @@ -1,116 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import - -#import "FBAllocationTrackerDefines.h" -#import "FBAllocationTrackerFunctors.h" -#import "FBAllocationTrackerGenerationManager.h" - -/** - FBAllocationTracker is a simple tool that's only purpose is to be able to track - allocated objects that are subclasses of NSObject (so mostly Objective-C objects). - - It should be able to track all allocations/deallocations, mark generations in time - (snapshots of allocations similar to what Instruments offer) and grab instances for - given classes. - - It should be enabled preferably as early in the application's lifetime as possible. - Preferably in main.m - - Check FBAllocationTrackerManager.h for Objective-C accessors. - */ - - -#if _INTERNAL_FBAT_ENABLED - -namespace FB { namespace AllocationTracker { - - struct SingleClassSummary { - NSUInteger allocations; - NSUInteger deallocations; - NSUInteger instanceSize; - }; - - typedef std::unordered_map AllocationSummary; - - /** - Generate summary snapshot for all allocations. - - @return unordered_map of Class->SingleClassSummary describing current snapshot of allocations - */ - AllocationSummary allocationTrackerSummary(); - - /** - Swizzles NSObject's alloc and dealloc and starts tracking all Objective-C allocations. - - beginTracking() and endTracking() should be matched and shouldn't be nested. - */ - void beginTracking(); - - /** - Swizzles back NSObject's alloc and dealloc, stops tracking allocations and clears out the data. - */ - void endTracking(); - - /** - Is the tracker currently running? - */ - bool isTracking(); - - /** - Enables generations. By default generations are not enabled, because they are additional - hit to performance. (We are not tracking just counters, but objects itself) - - If the generation existed, it will do nothing - */ - void enableGenerations(); - - /** - Disable generation tracking, clean all the generation data gathered so far. - */ - void disableGenerations(); - - /** - Mark generation. Every generation keeps objects from between generation markers (two calls - of markGeneration()) or beginning/now, respectively. - */ - void markGeneration(); - - /** - Summary for all generations. It will be similar to allocations summary, but grouped by generations. - */ - FullGenerationSummary generationSummary(); - - /** - Yields all classes that are being tracked by Allocation Tracker (all classes that's instances - were created since enabling Allocation Tracker). - */ - std::vector<__unsafe_unretained Class> trackedClasses(); - - NSArray *instancesOfClasses(NSArray *classes); - - /** - Tries to obtain instances of given class. This method might not be safe to use, proceed - with caution. It will try to obtain strong reference of object (that will be of type - __unsafe_unretained). If the object was scheduled to deletion, but was not yet dealloced, - we will try to retain dangling pointer and crash. - - @param aCls - Class we are interested in - @param generationIndex - from which generation we would like to get the objects - @return vector of id types - */ - std::vector<__weak id> instancesOfClassForGeneration(__unsafe_unretained Class aCls, - NSInteger generationIndex); - -} } - -#endif // _INTERNAL_FBAT_ENABLED diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.mm b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.mm deleted file mode 100644 index 095afd7..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.mm +++ /dev/null @@ -1,356 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerImpl.h" - -#import -#import -#import -#import - -#import "FBAllocationTrackerDefines.h" -#import "FBAllocationTrackerHelpers.h" -#import "NSObject+FBAllocationTracker.h" - -#if _INTERNAL_FBAT_ENABLED - -typedef NS_ENUM(NSUInteger, FBMethodType) { - FBInstanceMethod, - FBClassMethod, -}; - -namespace { - // Private - using TrackerMap = - std::unordered_map< - __unsafe_unretained Class, - NSUInteger, - FB::AllocationTracker::ClassHashFunctor, - FB::AllocationTracker::ClassEqualFunctor>; - - // Pointers to avoid static deallocation fiasco - static auto *_allocations = new TrackerMap(); - static auto *_deallocations = new TrackerMap(); - static bool _trackingInProgress = false; - static auto *_lock = (new std::mutex); - - // Private interface - static bool _didCopyOriginalMethods = false; - - static FB::AllocationTracker::GenerationManager *_generationManager = nil; - - void replaceSelectorWithSelector(Class aCls, - SEL selector, - SEL replacementSelector, - FBMethodType methodType) { - - Method replacementSelectorMethod = (methodType == FBClassMethod - ? class_getClassMethod(aCls, replacementSelector) - : class_getInstanceMethod(aCls, replacementSelector)); - - Class classEntityToEdit = aCls; - if (methodType == FBClassMethod) { - // Get meta-class - classEntityToEdit = object_getClass(aCls); - } - class_replaceMethod(classEntityToEdit, - selector, - method_getImplementation(replacementSelectorMethod), - method_getTypeEncoding(replacementSelectorMethod)); - } - - void prepareOriginalMethods(void) { - if (_didCopyOriginalMethods) { - return; - } - - // prepareOriginalMethods called from turnOn/Off which is synced by - // _lock, this is thread-safe - _didCopyOriginalMethods = true; - - replaceSelectorWithSelector([NSObject class], - @selector(fb_originalAlloc), - @selector(alloc), - FBClassMethod); - - replaceSelectorWithSelector([NSObject class], - @selector(fb_originalDealloc), - sel_registerName("dealloc"), - FBInstanceMethod); - } - - void turnOnTracking(void) { - prepareOriginalMethods(); - - replaceSelectorWithSelector([NSObject class], - @selector(alloc), - @selector(fb_newAlloc), - FBClassMethod); - - replaceSelectorWithSelector([NSObject class], - sel_registerName("dealloc"), - @selector(fb_newDealloc), - FBInstanceMethod); - } - - void turnOffTracking(void) { - prepareOriginalMethods(); - - replaceSelectorWithSelector([NSObject class], - @selector(alloc), - @selector(fb_originalAlloc), - FBClassMethod); - - replaceSelectorWithSelector([NSObject class], - sel_registerName("dealloc"), - @selector(fb_originalDealloc), - FBInstanceMethod); - } -} - -namespace FB { namespace AllocationTracker { - - void beginTracking() { - std::lock_guard l(*_lock); - - if (_trackingInProgress) { - return; - } - - _trackingInProgress = true; - - turnOnTracking(); - } - - void endTracking() { - std::lock_guard l(*_lock); - - if (!_trackingInProgress) { - return; - } - - _trackingInProgress = false; - - _allocations->clear(); - _deallocations->clear(); - - turnOffTracking(); - } - - bool isTracking() { - std::lock_guard l(*_lock); - bool isTracking = _trackingInProgress; - return isTracking; - } - - static bool _shouldTrackClass(Class aCls) { - if (aCls == Nil) { - return false; - } - - // We want to omit some classes for performance reasons - static Class blacklistedTaggedPointerContainerClass; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - blacklistedTaggedPointerContainerClass = NSClassFromString(@"NSTaggedPointerStringCStringContainer"); - }); - - if (aCls == blacklistedTaggedPointerContainerClass) { - return false; - } - - return true; - } - - void incrementAllocations(__unsafe_unretained id obj) { - Class aCls = [obj class]; - - if (!_shouldTrackClass(aCls)) { - return; - } - - std::lock_guard l(*_lock); - - if (_trackingInProgress) { - (*_allocations)[aCls]++; - } - - if (_generationManager) { - _generationManager->addObject(obj); - } - } - - void incrementDeallocations(__unsafe_unretained id obj) { - Class aCls = [obj class]; - - if (!_shouldTrackClass(aCls)) { - return; - } - - std::lock_guard l(*_lock); - - if (_trackingInProgress) { - (*_deallocations)[aCls]++; - } - - if (_generationManager) { - _generationManager->removeObject(obj); - } - } - - AllocationSummary allocationTrackerSummary() { - TrackerMap allocationsUntilNow; - TrackerMap deallocationsUntilNow; - - { - std::lock_guard l(*_lock); - - allocationsUntilNow = TrackerMap(*_allocations); - deallocationsUntilNow = TrackerMap(*_deallocations); - } - - std::unordered_set< - __unsafe_unretained Class, - FB::AllocationTracker::ClassHashFunctor, - FB::AllocationTracker::ClassEqualFunctor> keys; - - for (const auto &kv: allocationsUntilNow) { - keys.insert(kv.first); - } - - for (const auto &kv: deallocationsUntilNow) { - keys.insert(kv.first); - } - - AllocationSummary summary; - - for (Class aCls: keys) { - // Non-zero instances are the only interesting ones - if (allocationsUntilNow[aCls] - deallocationsUntilNow[aCls] <= 0) { - continue; - } - - SingleClassSummary singleSummary = { - .allocations = allocationsUntilNow[aCls], - .deallocations = deallocationsUntilNow[aCls], - .instanceSize = class_getInstanceSize(aCls), - }; - - summary[aCls] = singleSummary; - } - - return summary; - } - - void enableGenerations() { - std::lock_guard l(*_lock); - - if (_generationManager) { - return; - } - - _generationManager = new GenerationManager(); - } - - void disableGenerations(void) { - std::lock_guard l(*_lock); - - delete _generationManager; - _generationManager = nil; - } - - void markGeneration(void) { - std::lock_guard l(*_lock); - if (_generationManager) { - _generationManager->markGeneration(); - } - } - - FullGenerationSummary generationSummary() { - std::lock_guard l(*_lock); - - if (_generationManager) { - return _generationManager->summary(); - } - return FullGenerationSummary {}; - } - - static bool _shouldOmitClass(Class aCls) { - // Trying to retain NSAutoreleasePool/NSCFTimer is going to end up with crash. - NSString *className = NSStringFromClass(aCls); - if ([className isEqualToString:@"NSAutoreleasePool"] || - [className isEqualToString:@"NSCFTimer"]) { - return true; - } - - return false; - } - - std::vector<__weak id> instancesOfClassForGeneration(__unsafe_unretained Class aCls, - NSInteger generationIndex) { - if (_shouldOmitClass(aCls)) { - return std::vector<__weak id> {}; - } - - std::lock_guard l(*_lock); - if (_generationManager) { - return _generationManager->instancesOfClassInGeneration(aCls, generationIndex); - } - return std::vector<__weak id> {}; - } - - NSArray *instancesOfClasses(NSArray *classes) { - if (!_generationManager) { - return nil; - } - - NSMutableArray *instances = [NSMutableArray new]; - - for (Class aCls in classes) { - if (_shouldOmitClass(aCls)) { - continue; - } - - std::vector<__weak id> instancesFromGeneration; - - { - std::lock_guard l(*_lock); - instancesFromGeneration = _generationManager->instancesOfClassInLastGeneration(aCls); - } - - for (const auto &obj: instancesFromGeneration) { - if (obj) { - [instances addObject:obj]; - } - } - } - - return instances; - } - - std::vector<__unsafe_unretained Class> trackedClasses() { - std::lock_guard l(*_lock); - std::vector<__unsafe_unretained Class> trackedClasses; - - // Some first approximation for number of classes - trackedClasses.reserve(2048); - - if (!_trackingInProgress) { - return trackedClasses; - } - - for (const auto &mapValue: *_allocations) { - trackedClasses.push_back(mapValue.first); - } - - return trackedClasses; - } -} } - -#endif // _INTERNAL_FBAT_ENABLED diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.h deleted file mode 100644 index cb97454..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "FBAllocationTrackerDefines.h" - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL FBIsFBATEnabledInThisBuild(void); - -#ifdef __cplusplus -} -#endif - -@class FBAllocationTrackerSummary; - -/** - FBAllocationTrackerManager is a wrapper around C++ Allocation Tracker API. - This will let you interact with FBAllocationTracker using just Objective-C. - Because FBAllocationTracker is guarded by compilation flag, all calls in this - API are nullable. - */ -@interface FBAllocationTrackerManager : NSObject - -+ (nullable instancetype)sharedManager; - -/** - Enable tracking allocations. - */ -- (void)startTrackingAllocations; - -/** - Disable tracking allocations. It will clear all data gathered so far. - */ -- (void)stopTrackingAllocations; - -- (BOOL)isAllocationTrackerEnabled; - -/** - Grab summary snapshot for current moment. Every object in this array will have a quick - snapshot containing how many instances were allocated/deallocated and few more. - Check FBAllocationTrackerSummary.h. - */ -- (nullable NSArray *)currentAllocationSummary; - -/** - Enable generations. If generations were already enabled, it won't do anything. - - The number of enables and disables must match. - */ -- (void)enableGenerations; - -/** - Disable generations. It will remove all generations data. - */ -- (void)disableGenerations; - -/** - Marks generation. Every allocation is attributed to just one generation. After you mark - generation - all new allocations will be dropped to the new generation bucket. - */ -- (void)markGeneration; - -/** - Creates summary for all generations. Every element will be a summary for one generation. - In every generation the summary for given class will be described inside FBAllocationTrackerSummary - object. - Returns nil if generations are not enabled. - */ -- (nullable NSArray *> *)currentSummaryForGenerations; - -/** - Accessor to browse objects inside Allocation Tracker. You can browse objects only if generations - are enabled (otherwise you are just tracking counters). - Returns nil if generations are not enabled. - */ -- (nullable NSArray *)instancesForClass:(nonnull __unsafe_unretained Class)aCls - inGeneration:(NSInteger)generation; - - -/** - Grab all instances of given classes across all generations. - Returns nil if generations are not enabled. - */ -- (nullable NSArray *)instancesOfClasses:(nonnull NSArray *)classes; - -/** - Gets all classes that were used in allocation tracker. Basically if any instance of given - class was created when Allocation Tracker was enabled - this class will be there. - */ -- (nullable NSSet *)trackedClasses; - -@end diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.mm b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.mm deleted file mode 100644 index f8db9de..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.mm +++ /dev/null @@ -1,230 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerManager.h" - -#import - -#import "FBAllocationTrackerDefines.h" -#import "FBAllocationTrackerImpl.h" -#import "FBAllocationTrackerSummary.h" - -BOOL FBIsFBATEnabledInThisBuild(void) -{ -#if _INTERNAL_FBAT_ENABLED - return YES; -#endif - return NO; -} - -#if _INTERNAL_FBAT_ENABLED -@implementation FBAllocationTrackerManager { - dispatch_queue_t _queue; - NSUInteger _generationsClients; -} - -- (instancetype)init -{ - if (self = [super init]) { - _queue = dispatch_queue_create("com.facebook.fbat.manager", DISPATCH_QUEUE_SERIAL); - } - - return self; -} - -+ (instancetype)sharedManager -{ - static FBAllocationTrackerManager *sharedManager = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedManager = [FBAllocationTrackerManager new]; - }); - return sharedManager; -} - - -- (BOOL)isAllocationTrackerEnabled -{ - return FB::AllocationTracker::isTracking(); -} - -- (void)stopTrackingAllocations -{ - FB::AllocationTracker::endTracking(); -} - -- (void)startTrackingAllocations -{ - FB::AllocationTracker::beginTracking(); -} - -- (void)enableGenerations -{ - dispatch_async(_queue, ^{ - if (_generationsClients == 0) { - FB::AllocationTracker::enableGenerations(); - FB::AllocationTracker::markGeneration(); - } - _generationsClients += 1; - }); -} - -- (void)disableGenerations -{ - dispatch_async(_queue, ^{ - _generationsClients -= 1; - if (_generationsClients <= 0) { - FB::AllocationTracker::disableGenerations(); - } - }); -} - -- (void)markGeneration -{ - FB::AllocationTracker::markGeneration(); -} - -- (NSArray *)currentAllocationSummary -{ - FB::AllocationTracker::AllocationSummary summary = FB::AllocationTracker::allocationTrackerSummary(); - NSMutableArray *array = [NSMutableArray new]; - - for (const auto &item: summary) { - FB::AllocationTracker::SingleClassSummary singleSummary = item.second; - Class aCls = item.first; - NSString *className = NSStringFromClass(aCls); - - FBAllocationTrackerSummary *summaryObject = - [[FBAllocationTrackerSummary alloc] initWithAllocations:singleSummary.allocations - deallocations:singleSummary.deallocations - aliveObjects:singleSummary.allocations - singleSummary.deallocations - className:className - instanceSize:singleSummary.instanceSize]; - [array addObject:summaryObject]; - } - - return array; -} - -- (NSArray *)_getSingleGenerationSummary:(const FB::AllocationTracker::GenerationSummary &)summary -{ - NSMutableArray *array = [NSMutableArray new]; - - for (const auto &kv: summary) { - FBAllocationTrackerSummary *summaryObject = - [[FBAllocationTrackerSummary alloc] initWithAllocations:0 - deallocations:0 - aliveObjects:kv.second - className:NSStringFromClass(kv.first) - instanceSize:class_getInstanceSize(kv.first)]; - - [array addObject:summaryObject]; - } - - return array; -} -- (NSArray *> *)currentSummaryForGenerations -{ - FB::AllocationTracker::FullGenerationSummary summary = FB::AllocationTracker::generationSummary(); - - if (summary.size() == 0) { - return nil; - } - - NSMutableArray *array = [NSMutableArray new]; - - for (const auto &generation: summary) { - [array addObject:[self _getSingleGenerationSummary:generation]]; - } - - return array; -} - - -- (NSArray *)instancesForClass:(__unsafe_unretained Class)aCls - inGeneration:(NSInteger)generation -{ - std::vector<__weak id> objects = FB::AllocationTracker::instancesOfClassForGeneration(aCls, generation); - - if (objects.size() == 0) { - return nil; - } - - NSMutableArray *objectArray = [NSMutableArray new]; - for (id obj: objects) { - if (obj) { - [objectArray addObject:obj]; - } - } - return objectArray; -} - -- (NSArray *)instancesOfClasses:(NSArray *)classes -{ - return FB::AllocationTracker::instancesOfClasses(classes); -} - -- (NSSet *)trackedClasses -{ - std::vector<__unsafe_unretained Class> classes = FB::AllocationTracker::trackedClasses(); - return [NSSet setWithObjects:classes.data() count:classes.size()]; -} - -@end - -#else - -@implementation FBAllocationTrackerManager - -+ (instancetype)sharedManager -{ - return nil; -} - -- (BOOL)isAllocationTrackerEnabled -{ - return NO; -} - -- (void)startTrackingAllocations {} -- (void)stopTrackingAllocations {} - -- (void)enableGenerations {} -- (void)disableGenerations {} -- (void)markGeneration {} - -- (NSArray *)currentAllocationSummary -{ - return nil; -} - -- (NSArray *)currentSummaryForGenerations -{ - return nil; -} - -- (NSArray *)instancesForClass:(__unsafe_unretained Class)aCls - inGeneration:(NSInteger)generation -{ - return nil; -} - -- (NSArray *)instancesOfClasses:(NSArray *)classes -{ - return nil; -} - -- (NSSet *)trackedClasses -{ - return nil; -} - -@end - -#endif diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.h b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.h deleted file mode 100644 index c9d8026..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@interface FBAllocationTrackerSummary : NSObject - -@property (nonatomic, readonly) NSUInteger allocations; -@property (nonatomic, readonly) NSUInteger deallocations; -@property (nonatomic, readonly) NSInteger aliveObjects; -@property (nonatomic, copy, readonly, nonnull) NSString *className; -@property (nonatomic, readonly) NSUInteger instanceSize; - -- (nonnull instancetype)initWithAllocations:(NSUInteger)allocations - deallocations:(NSUInteger)deallocations - aliveObjects:(NSInteger)aliveObjects - className:(nonnull NSString *)className - instanceSize:(NSUInteger)instanceSize; - -@end diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.m b/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.m deleted file mode 100644 index 923ac7a..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.m +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerSummary.h" - -@implementation FBAllocationTrackerSummary - -- (instancetype)initWithAllocations:(NSUInteger)allocations - deallocations:(NSUInteger)deallocations - aliveObjects:(NSInteger)aliveObjects - className:(NSString *)className - instanceSize:(NSUInteger)instanceSize -{ - if ((self = [super init])) { - _allocations = allocations; - _deallocations = deallocations; - _aliveObjects = aliveObjects; - _className = className; - _instanceSize = instanceSize; - } - - return self; -} - -@end diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.h b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.h deleted file mode 100644 index 50e7d94..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import -#import -#import - -#import - -#import "FBAllocationTrackerFunctors.h" - -/** - Not thread-safe class, needs to be synchronized - - Generation is supposed to simulate Instruments Generation tool for allocations that let's - you mark objects that were allocated in a given time span. Generation is simply a map keyed by - Classes that point to vector of object pointers. In any given time you can look into generation to - check what objects are still allocated that were created in that time span. - */ - -namespace FB { namespace AllocationTracker { - // Types - typedef std::unordered_set<__unsafe_unretained id, ObjectHashFunctor, ObjectEqualFunctor> GenerationList; - - typedef std::unordered_map GenerationMap; - - typedef std::unordered_map GenerationSummary; - - class Generation { - public: - /** - Attributes object to given generation. - */ - void add(__unsafe_unretained id object); - - /** - Removes object on dealloc. The pointers are not self-zeroing so we have to remove them - by ourselves. - */ - void remove(__unsafe_unretained id object); - - /** - Provides summary for given generation, where summary is a map Class -> Count - */ - GenerationSummary getSummary() const; - - /** - Returns objects of given class that live in this generation. - - @param aCls - class that caller is interested in - @return vector of instances of class aCls - */ - std::vector<__weak id> instancesForClass(__unsafe_unretained Class aCls) const; - - /** - We do not want Generation to copy, blocking. - */ - Generation() = default; - Generation(Generation&&) = default; - Generation &operator=(Generation&&) = default; - - Generation(const Generation&) = delete; - Generation &operator=(const Generation&) = delete; - - private: - GenerationMap objects; - }; -} } diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.mm b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.mm deleted file mode 100644 index c2e45e7..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.mm +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerGeneration.h" - -#import -#import - -#import "FBAllocationTrackerNSZombieSupport.h" - -namespace FB { namespace AllocationTracker { - void Generation::add(__unsafe_unretained id object) { - Class aCls = [object class]; - objects[aCls].insert(object); - } - - void Generation::remove(__unsafe_unretained id object) { - Class aCls = [object class]; - objects[aCls].erase(object); - } - - GenerationSummary Generation::getSummary() const { - GenerationSummary summary; - - for (const auto &kv: objects) { - Class aCls = kv.first; - const GenerationList &list = kv.second; - - NSInteger count = list.size(); - - summary[aCls] = count; - } - - return summary; - } - - std::vector<__weak id> Generation::instancesForClass(__unsafe_unretained Class aCls) const { - std::vector<__weak id> returnValue; - - const GenerationMap::const_iterator obj = objects.find(aCls); - if (obj != objects.end()) { - const GenerationList &list = obj->second; - for (const auto &object: list) { - __weak id weakObject = nil; - - BOOL (*allowsWeakReference)(id, SEL) = - (__typeof__(allowsWeakReference))class_getMethodImplementation(aCls, @selector(allowsWeakReference)); - - if (allowsWeakReference && (IMP)allowsWeakReference != _objc_msgForward) { - if (allowsWeakReference(object, @selector(allowsWeakReference))) { - // This is still racey since allowsWeakReference could change it value by now. - weakObject = object; - } - } else { - weakObject = object; - } - - /** - Retain object and add it to returnValue. - This operation can be unsafe since we are retaining object that could - be deallocated on other thread. - - When NSZombie enabled, we can find if object has been deallocated by checking its class name. - */ - if (!fb_isZombieObject(weakObject)) { - returnValue.push_back(weakObject); - } - } - } - - return returnValue; - } - -} } diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.h b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.h deleted file mode 100644 index 8142fd0..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import -#import - -#import - -#import "FBAllocationTrackerGeneration.h" - -/** - GenerationManager is a class responsible for managing generations. It especially can point in O(1) - from which generation the pointer comes from thus reducing the complexity. - */ - -namespace FB { namespace AllocationTracker { - // Types - typedef std::vector FullGenerationSummary; - - class GenerationManager { - public: - - /** - Creates new generations. Every new object that will be added to manager will - be attributed to newest generation created. - */ - void markGeneration(); - - /** - Adds object to most recent generation. - */ - void addObject(__unsafe_unretained id object); - - /** - Removes object from generation. It will grab reference from generationMapping - (it holds mapping object -> generation for performance) and then ask this generation - to remove the reference. - */ - void removeObject(__unsafe_unretained id object); - - /** - Grab all instances of class aCls in generation at generationIndex. - - @param aCls Class to query - @param generationIndex index of generation from which the instances should be obtained - @return vector of instances of class aCls - */ - std::vector<__weak id> instancesOfClassInGeneration(__unsafe_unretained Class aCls, - size_t generationIndex); - - /** - Grab all instances of class aCls in last generation. - @param aCls Class to query - @return vector of instances of class aCls - */ - std::vector<__weak id> instancesOfClassInLastGeneration(__unsafe_unretained Class aCls); - - /** - Summarize all generations. For every generation it will summarize how many instances of each - class this generation holds. - */ - FullGenerationSummary summary() const; - - private: - std::vector<__weak id> unsafeInstancesOfClassInGeneration(__unsafe_unretained Class aCls, - size_t generationIndex); - std::unordered_map<__unsafe_unretained id, NSInteger, ObjectHashFunctor, ObjectEqualFunctor> generationMapping; - std::vector generations; - }; -} } diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.mm b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.mm deleted file mode 100644 index 9758778..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.mm +++ /dev/null @@ -1,62 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBAllocationTrackerGenerationManager.h" - -namespace FB { namespace AllocationTracker { - void GenerationManager::markGeneration() { - generations.emplace_back(Generation {}); - } - - void GenerationManager::addObject(__unsafe_unretained id object){ - NSInteger numberOfGenerations = generations.size(); - if (numberOfGenerations == 0) { - return; - } - - Generation &lastGeneration = generations.back(); - generationMapping[object] = numberOfGenerations - 1; - - lastGeneration.add(object); - } - - void GenerationManager::removeObject(__unsafe_unretained id object) { - auto it = generationMapping.find(object); - if (it == generationMapping.end()) { - return; - } - NSInteger generationNumber = it->second; - - Generation &generation = generations[generationNumber]; - generation.remove(object); - - generationMapping.erase(object); - } - - FullGenerationSummary GenerationManager::summary() const { - FullGenerationSummary fullSummary; - - for (const auto &generation: generations) { - fullSummary.push_back(generation.getSummary()); - } - - return fullSummary; - } - - std::vector<__weak id> GenerationManager::instancesOfClassInGeneration(__unsafe_unretained Class aCls, - size_t generationIndex) { - const Generation &givenGeneration = generations[generationIndex]; - return givenGeneration.instancesForClass(aCls); - } - - std::vector<__weak id> GenerationManager::instancesOfClassInLastGeneration(__unsafe_unretained Class aCls) { - size_t generationIndex = generations.size() - 1; - return instancesOfClassInGeneration(aCls, generationIndex); - } -} } diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.h b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.h deleted file mode 100644 index 3681a89..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.h +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -/** - Returns whether `object` is the zombie object. - - @return `true` if `object` is nil. - @return `false` if `object` is not nil and NSZombieEnabled = NO. - */ -bool fb_isZombieObject(_Nullable id object); - -/** - Returns whether runtime has NSZombie detection enabled. - */ -bool fb_isNSZombieEnabled(void); \ No newline at end of file diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.mm b/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.mm deleted file mode 100644 index ea04437..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.mm +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#if __has_feature(objc_arc) -#error This file must be compiled with MRR. Use -fno-objc-arc flag. -#endif - -#include "FBAllocationTrackerNSZombieSupport.h" - -bool fb_isZombieObject(_Nullable id object) { - if (object == nil) { return true; } - if (!fb_isNSZombieEnabled()) { return false; } - - const char *className = object_getClassName(object); - static const char zombiePrefix[] = "_NSZombie"; - return strncmp(className, zombiePrefix, sizeof(zombiePrefix) - 1) == 0; -} - -bool fb_isNSZombieEnabled(void) { - static bool zombieEnabled = false; - - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - char *NSZombieEnabledEnv = getenv("NSZombieEnabled"); - - if (NSZombieEnabledEnv != NULL) { - zombieEnabled = strcmp(NSZombieEnabledEnv, "YES") == 0; - } - else { - zombieEnabled = false; - } - }); - - return zombieEnabled; -} diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.h b/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.h deleted file mode 100644 index d8bfb33..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "FBAllocationTrackerDefines.h" - -/** - This category will expose methods to swizzle allocs - for NSObject. The allocs and deallocs will be registered - by FBObjectTracker so we can easily track the changes in - allocations. - */ - -#if _INTERNAL_FBAT_ENABLED - -@interface NSObject (FBAllocationTracker) - -+ (nonnull id)fb_originalAlloc; -- (void)fb_originalDealloc; - -+ (nonnull id)fb_newAlloc; -- (void)fb_newDealloc; - -@end - -#endif // _INTERNAL_FBAT_ENABLED diff --git a/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.mm b/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.mm deleted file mode 100644 index 52ad1c6..0000000 --- a/Pods/FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.mm +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#if __has_feature(objc_arc) -#error This file must be compiled with MRR. Use -fno-objc-arc flag. -#endif - -#import "NSObject+FBAllocationTracker.h" - -#import "FBAllocationTrackerDefines.h" -#import "FBAllocationTrackerHelpers.h" - -#if _INTERNAL_FBAT_ENABLED - -@implementation NSObject (FBAllocationTracker) - -+ (id)fb_originalAlloc -{ - // Placeholder for original alloc - return nil; -} - -- (void)fb_originalDealloc -{ - // Placeholder for original dealloc -} - -+ (id)fb_newAlloc -{ - id object = [self fb_originalAlloc]; - FB::AllocationTracker::incrementAllocations(object); - return object; -} - -- (void)fb_newDealloc -{ - FB::AllocationTracker::incrementDeallocations(self); - [self fb_originalDealloc]; -} - -@end - -#endif // _INTERNAL_FBAT_ENABLED diff --git a/Pods/FBAllocationTracker/LICENSE b/Pods/FBAllocationTracker/LICENSE deleted file mode 100644 index 9ed80ca..0000000 --- a/Pods/FBAllocationTracker/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -BSD License - -For FBAllocationTracker software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Pods/FBAllocationTracker/README.md b/Pods/FBAllocationTracker/README.md deleted file mode 100644 index 1f6a19b..0000000 --- a/Pods/FBAllocationTracker/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# FBAllocationTracker -[![Build Status](https://travis-ci.org/facebook/FBAllocationTracker.svg?branch=master)](https://travis-ci.org/facebook/FBAllocationTracker) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![CocoaPods](https://img.shields.io/cocoapods/v/FBAllocationTracker.svg?maxAge=2592000)]() -[![License](https://img.shields.io/cocoapods/l/FBAllocationTracker.svg)](https://github.com/facebook/FBallocationTracker/blob/master/LICENSE) - - -An iOS library for introspecting Objective-C objects that are currently alive. - -# About - -`FBAllocationTracker` is a tool that can be used as an interface to Objective-C objects allocated in memory. It can be used to query all instances of given class, or you can (as in Instruments) mark generations and query for objects created only in scope of one generation. - -## Installation - -### Carthage - -To your Cartfile add: - - github "facebook/FBAllocationTracker" - -`FBAllocationTracker` is built out from non-debug builds, so when you want to test it, use - - carthage update --configuration Debug - -### CocoaPods - -To your podspec add: - - pod 'FBAllocationTracker' - -You'll be able to use `FBAllocationTracker` fully only in `Debug` builds. This is controlled by [compilation flag](https://github.com/facebook/FBAllocationTracker/blob/master/FBAllocationTracker/FBAllocationTrackerImpl.h#L17) that can be provided to the build to make it work in other configurations. - -## Usage - -`FBAllocationTracker` can run in two modes: tracking objects, and just counting allocs/deallocs. The first one is more interesting and we will jump right to it. The second one can be considered useful for some statistics when you don't want to impact performance. - -First of all, we want to enable `FBAllocationTracker` in our run. We can do it at any time. For example in `main.m`! -```objc -#import - -int main(int argc, char * argv[]) { - [[FBAllocationTrackerManager sharedManager] startTrackingAllocations]; - [[FBAllocationTrackerManager sharedManager] enableGenerations]; - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} -``` - -In the code above `startTrackingAllocations` will take care of swizzling `NSObject`'s `+alloc` and `-dealloc` methods, while `enableGenerations` will start tracking actual *instances* of objects. - -We can grab summaries of all classes allocations: -```objc -NSArray *summaries = [[FBAllocationTrackerManager sharedManager] currentAllocationSummary]; -``` - -[FBAllocationTrackerSummary](https://github.com/facebook/FBAllocationTracker/blob/master/FBAllocationTracker/FBAllocationTrackerSummary.h) will tell you, for given class, how many instances of this class are still alive. - -With generations enabled (explained in details below) you can also get all instances of given class - -```objc -NSArray *instances =[[FBAllocationTrackerManager sharedManager] instancesOfClasses:@[[ViewController class]]]; -``` - -Check out [FBAllocationTrackerManager API](https://github.com/facebook/FBAllocationTracker/blob/master/FBAllocationTracker/FBAllocationTrackerManager.h) to see what else you can do. - -## Generations - -Generations is an idea inspired by Allocations tool in Instruments. With generations enabled we can call `[[FBAllocationTrackerManager sharedManager] markGeneration]` to mark generation. All objects that are allocated after given `markGeneration` call will be kept in new generation. We can see it in a very simple example: - -```objc -- (void)someFunction { - // Enable generations (if not already enabled in main.m) - [[FBAllocationTrackerManager sharedManager] enableGenerations]; - - // Object a will be kept in generation with index 0 - NSObject *a = [NSObject new]; - - // We are marking new generation - [[FBAllocationTrackerManager sharedManager] markGeneration]; - - // Objects b and c will be kept in second generation at index 1 - NSObject *b = [NSObject new]; - NSObject *c = [NSObject new]; - - [[FBAllocationTrackerManager sharedManager] markGeneration]; - - // Object d will be kept in third generation at index 2 - NSObject *d = [NSObject new]; -} -``` - -`FBAllocationTrackerManager` has API to get all instances of given class in given generation. - -```objc -NSArray *instances =[[FBAllocationTrackerManager sharedManager] instancesForClass:[NSObject class] - inGeneration:1]; -``` - -This can be used to analyze allocations, for example by performing common tasks a user might do. Between each task we can mark a new generation, and then verify which objects are kept in given generations. - -## Other use cases - -`FBAllocationTracker` is heavily used in [FBMemoryProfiler](https://github.com/facebook/FBMemoryProfiler). It provides data for `FBMemoryProfiler`. It also is a great source of candidates for [FBRetainCycleDetector](https://github.com/facebook/FBRetainCycleDetector). - -## Contributing -See the [CONTRIBUTING](CONTRIBUTING) file for how to help out. - -## License -[`FBAllocationTracker` is BSD-licensed](LICENSE). We also provide an additional [patent grant](PATENTS). diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h deleted file mode 100644 index d0bef5f..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -typedef NS_ENUM(NSUInteger, FBMemoryProfilerSortingMode) { - FBMemoryProfilerSortByClass, - FBMemoryProfilerSortByAlive, - FBMemoryProfilerSortBySize, -}; - -typedef NS_ENUM(NSUInteger, FBMemoryProfilerSortingOrder) { - FBMemoryProfilerSortingOrderAscending, - FBMemoryProfilerSortingOrderDescending, -}; - -@class FBRetainCycleAnalysisCache; - -/** - FBMemoryProfilerDataSource is responsible for gathering data about allocations from - FBAllocationTracker. It supports few ways of filtering data source and ordering them. - */ -@interface FBMemoryProfilerDataSource : NSObject - -/** - classFilter is a string representing part of class name, used to filter data by class name - */ -@property (nonatomic, copy, nullable) NSString *classFilter; - -/** - What mode is used to sort data in table view? Check FBMemoryProfilerSortingMode - */ -@property (nonatomic, assign) FBMemoryProfilerSortingMode sortingMode; - -/** - Is data in ascending or descending order? - */ -@property (nonatomic, assign) FBMemoryProfilerSortingOrder sortingOrder; - -/** - @param analysisCache is a cache of results memory profiler gathered during retain cycle detection. Rows which objects - were checked for retain cycles will be marked with red or green depending on wether they were cycled or no - */ -- (nonnull instancetype)initWithAnalysisCache:(nullable FBRetainCycleAnalysisCache *)analysisCache; - -/** - In Generations mode full section can be expanded or collapsed to make it easier to browse - */ -- (void)setExpanded:(BOOL)expanded forSection:(NSInteger)section; - -/** - Checks if current section is expanded - */ -- (BOOL)isSectionExpanded:(NSInteger)section; - -/** - Summary for section will be a string that will appear next to generation name. - */ -- (nonnull NSString *)summaryForSection:(NSInteger)section; - -/** - If we need new data, because we for example marked new generation, we can force refresh. - */ -- (void)forceDataReload; - -/** - Takes visible cells and returns an array of class names that those cells represent. - */ -- (nonnull NSArray *)classNamesForSection:(NSInteger)section; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.m deleted file mode 100644 index 221baa2..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.m +++ /dev/null @@ -1,247 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerDataSource.h" - -#import -#import - -#import "FBRetainCycleAnalysisCache.h" - -static NSString *const kFBMemoryProfilerCellIdentifier = @"kFBMemoryProfilerCellIdentifier"; - -static UIColor *FBMemoryProfilerPaleGreenColor() { - return [UIColor colorWithRed:198/255.0 green:1.0 blue:197/255.0 alpha:1.0]; -} - -static UIColor *FBMemoryProfilerPaleRedColor() { - return [UIColor colorWithRed:1.0 green:196/255.0 blue:197/255.0 alpha:1.0]; -} - -@implementation FBMemoryProfilerDataSource -{ - NSArray *_data; - NSArray *_filtered; - - // If section should be collapsed it's index will be in that set - NSMutableSet *_expandedSection; - - NSByteCountFormatter *_byteCountFormatter; - - UIFont *_font; - FBRetainCycleAnalysisCache *_analysisCache; -} - -- (instancetype)initWithAnalysisCache:(FBRetainCycleAnalysisCache *)analysisCache -{ - if (self = [super init]) { - _font = [UIFont systemFontOfSize:10.0]; - _expandedSection = [NSMutableSet new]; - _byteCountFormatter = [NSByteCountFormatter new]; - _analysisCache = analysisCache; - } - return self; -} - -- (void)setExpanded:(BOOL)expanded - forSection:(NSInteger)section -{ - if (expanded) { - [_expandedSection addObject:@(section)]; - } else { - [_expandedSection removeObject:@(section)]; - } -} - -- (BOOL)isSectionExpanded:(NSInteger)section -{ - return [_expandedSection containsObject:@(section)]; -} - -- (void)forceDataReload -{ - if (![[FBAllocationTrackerManager sharedManager] isAllocationTrackerEnabled]) { - return; - } - - _data = [[FBAllocationTrackerManager sharedManager] currentSummaryForGenerations]; - [self refilter]; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView -{ - return [_filtered count]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - if (![self isSectionExpanded:section]) { - return 0; - } - return [_filtered[section] count]; -} - -- (UIColor *)_colorForAnalysisStatus:(FBRetainCycleStatus)status -{ - switch (status) { - case FBRetainCycleUnknown: - return [UIColor whiteColor]; - case FBRetainCycleNotPresent: - return FBMemoryProfilerPaleGreenColor(); - case FBRetainCyclePresent: - return FBMemoryProfilerPaleRedColor(); - } -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFBMemoryProfilerCellIdentifier]; - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kFBMemoryProfilerCellIdentifier]; - cell.detailTextLabel.font = _font; - cell.detailTextLabel.textColor = [UIColor blackColor]; - cell.textLabel.font = _font; - cell.textLabel.textColor = [UIColor grayColor]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - } - - FBAllocationTrackerSummary *row = _filtered[indexPath.section][indexPath.row]; - - NSInteger alive = row.aliveObjects; - NSInteger byteCount = alive * row.instanceSize; - cell.detailTextLabel.text = [NSString stringWithFormat:@"%ld (%@)", - (long)alive, - [_byteCountFormatter stringFromByteCount:byteCount]]; - cell.textLabel.text = row.className; - cell.backgroundColor = [self _colorForAnalysisStatus:[_analysisCache statusInGeneration:indexPath.section - forClassNamed:row.className]]; - - return cell; -} - -- (NSString *)summaryForSection:(NSInteger)section -{ - NSInteger summary = 0; - NSInteger bytes = 0; - - for (FBAllocationTrackerSummary *entry in _data[section]) { - NSInteger alive = entry.aliveObjects; - summary += alive; - bytes += (alive * entry.instanceSize); - } - - return [NSString stringWithFormat:@"%ld (%@)", - (long)summary, - [_byteCountFormatter stringFromByteCount:bytes]]; -} - -- (void)setClassFilter:(NSString *)classFilter -{ - _classFilter = [classFilter lowercaseString]; - - if (_classFilter.length == 0) { - _classFilter = nil; - } - - [self refilter]; -} - -- (void)setSortingMode:(FBMemoryProfilerSortingMode)sortingMode -{ - BOOL sortingModeChanged = sortingMode != _sortingMode; - _sortingMode = sortingMode; - - if (sortingModeChanged) { - [self refilter]; - } -} - -- (void)setSortingOrder:(FBMemoryProfilerSortingOrder)sortingOrder -{ - BOOL sortingOrderChanged = sortingOrder != _sortingOrder; - _sortingOrder = sortingOrder; - - if (sortingOrderChanged) { - [self refilter]; - } -} - -- (NSArray *)_refilterSectionAtIndex:(NSInteger)index -{ - NSArray *filtered = [_data[index] filteredArrayUsingPredicate: - [NSPredicate predicateWithBlock:^BOOL(FBAllocationTrackerSummary *entry, NSDictionary *bindings) { - NSString *className = entry.className.lowercaseString; - if (_classFilter && [className rangeOfString:_classFilter].location == NSNotFound) { - return NO; - } - - if (entry.aliveObjects > 0 && entry.className) { - return YES; - } - - return NO; - }]]; - - switch (_sortingMode) { - case FBMemoryProfilerSortByClass: - filtered = [self _sortArray:filtered withKey:@"className"]; - break; - case FBMemoryProfilerSortByAlive: - filtered = [self _sortArray:filtered withKey:@"aliveObjects"]; - break; - case FBMemoryProfilerSortBySize: - filtered = [filtered sortedArrayUsingComparator:^NSComparisonResult(FBAllocationTrackerSummary *obj1, - FBAllocationTrackerSummary *obj2) { - NSUInteger size1 = obj1.aliveObjects * obj1.instanceSize; - NSUInteger size2 = obj2.aliveObjects * obj2.instanceSize; - if (size1 > size2) { - return (_sortingOrder == FBMemoryProfilerSortingOrderAscending) ? NSOrderedDescending : NSOrderedAscending; - } else if (size2 > size1) { - return (_sortingOrder == FBMemoryProfilerSortingOrderAscending) ? NSOrderedAscending : NSOrderedDescending; - } else { - return NSOrderedSame; - } - }]; - break; - } - - return filtered; -} - -- (NSArray *)_sortArray:(NSArray *)array withKey:(NSString *)key -{ - BOOL sortAscending = _sortingOrder == FBMemoryProfilerSortingOrderAscending; - NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:key - ascending:sortAscending]; - return [array sortedArrayUsingDescriptors:@[sort]]; -} - -- (void)refilter -{ - NSMutableArray *filtered = [NSMutableArray array]; - for (NSInteger i = 0; i < _data.count; ++i) { - [filtered addObject:[self _refilterSectionAtIndex:i]]; - } - - _filtered = filtered; -} - -- (NSArray *)classNamesForSection:(NSInteger)section -{ - NSMutableArray *array = [NSMutableArray new]; - - for (FBAllocationTrackerSummary *object in _filtered[section]) { - [array addObject:object.className]; - } - - return array; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h deleted file mode 100644 index 59f5ac5..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -#import "FBMemoryProfilerMovableViewController.h" - -@protocol FBMemoryProfilerPresentationModeDelegate; - -/** - Floating button mode view controller. If current mode is condensed, this is the view controller that will - own it. It represents a small button that can be dragged and dropped wherever, showing current resident memory. - It will expand to full size profiler on tap. - */ -@interface FBMemoryProfilerFloatingButtonController : UIViewController - -/** - Delegate that can change presentation mode, will be used on tap. - */ -@property (nonatomic, weak, nullable) id presentationModeDelegate; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.m deleted file mode 100644 index 6005472..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.m +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerFloatingButtonController.h" - -#import "FBMemoryProfilerDeviceUtils.h" -#import "FBMemoryProfilerMathUtils.h" -#import "FBMemoryProfilerPresentationModeDelegate.h" - -@implementation FBMemoryProfilerFloatingButtonController -{ - UIButton *_floatingButton; - - NSTimer *_timer; - NSByteCountFormatter *_formatter; -} - -- (instancetype)init -{ - if (self = [super init]) { - _formatter = [NSByteCountFormatter new]; - } - return self; -} - -- (void)loadView -{ - _floatingButton = [UIButton buttonWithType:UIButtonTypeCustom]; - - self.view = _floatingButton; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - _floatingButton.backgroundColor = [UIColor lightGrayColor]; - _floatingButton.titleLabel.font = [UIFont systemFontOfSize:11]; - _floatingButton.titleLabel.textColor = [UIColor whiteColor]; - _floatingButton.layer.borderWidth = 1.0; - _floatingButton.layer.borderColor = [UIColor grayColor].CGColor; - _floatingButton.alpha = 0.8; - [_floatingButton setTitle:@"IMP" forState:UIControlStateNormal]; - - [_floatingButton addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchUpInside]; - - [self _update]; -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - _timer = [NSTimer scheduledTimerWithTimeInterval:2.0 - target:self - selector:@selector(_update) - userInfo:nil - repeats:YES]; -} - -- (void)viewDidDisappear:(BOOL)animated -{ - [super viewDidDisappear:animated]; - - [_timer invalidate]; - _timer = nil; -} - -- (void)_update -{ - [_floatingButton setTitle:[_formatter stringFromByteCount:FBMemoryProfilerResidentMemoryInBytes()] forState:UIControlStateNormal]; -} - -- (void)buttonTapped -{ - [self.presentationModeDelegate presentationDelegateChangePresentationModeToMode:FBMemoryProfilerPresentationModeFullWindow]; -} - -#pragma mark FBMemoryProfilerMovableViewController - -- (void)containerWillMove:(UIViewController *)container -{ - // No extra behavior -} - -- (BOOL)shouldStretchInMovableContainer -{ - return YES; -} - -- (CGFloat)minimumHeightInMovableContainer -{ - return 0; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h deleted file mode 100644 index 2a793bf..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -/** - FBMemoryProfilerPresenting - - Protocol implemented by FBMemoryProfiler part that is responsible for UI. - */ - -@protocol FBMemoryProfilerPresenting - -/** - Custom presentation in memory profiler's container - */ -- (void)memoryProfilerPresenter:(nonnull id)presenter - presentViewController:(nonnull UIViewController *)viewController; - -- (void)memoryProfilerPresenter:(nonnull id)presenter - dismissViewController:(nonnull UIViewController *)viewController; - -- (BOOL)memoryProfilerCanPresent; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h deleted file mode 100644 index 391919a..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -@class FBMemoryProfilerGenerationsSectionHeaderView; - -@protocol FBMemoryProfilerSectionHeaderDelegate - -- (void)sectionHeaderRequestedExpandCollapseAction:(nonnull FBMemoryProfilerGenerationsSectionHeaderView *)sectionHeader; -- (void)sectionHeaderRequestedRetainCycleDetection:(nonnull FBMemoryProfilerGenerationsSectionHeaderView *)sectionHeader; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h deleted file mode 100644 index 0d0af7b..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -#import "FBMemoryProfilerMovableViewController.h" - -@class FBMemoryProfilerOptions; -@class FBObjectGraphConfiguration; - -@protocol FBMemoryProfilerPresentationModeDelegate; - -/** - Main view controller that is visible in full mode. It's represented by draggable and stretchable window - that has table view with all the allocations data. - */ -@interface FBMemoryProfilerViewController : UIViewController - -/** - @param options Options for memory profiler, see FBMemoryProfilerOptions - @param retainCycleDetectorConfiguration configuration for object graph, defines filters, and options for detector - */ -- (nonnull instancetype)initWithOptions:(nonnull FBMemoryProfilerOptions *)options - retainCycleDetectorConfiguration:(nullable FBObjectGraphConfiguration *)retainCycleDetectorConfiguration; - -/** - Delegate for presentation mode, it will be used on "Hide" action - */ -@property (nonatomic, weak, nullable) id presentationModeDelegate; -@property (nonatomic, copy, nonnull) FBMemoryProfilerOptions *profilerOptions; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.m deleted file mode 100644 index e68d77d..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.m +++ /dev/null @@ -1,403 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerViewController.h" - -#import - -#import "FBMemoryProfilerDataSource.h" -#import "FBMemoryProfilerDeviceUtils.h" -#import "FBMemoryProfilerGenerationsSectionHeaderView.h" -#import "FBMemoryProfilerMathUtils.h" -#import "FBMemoryProfilerOptions.h" -#import "FBMemoryProfilerPluggable.h" -#import "FBMemoryProfilerPresentationModeDelegate.h" -#import "FBMemoryProfilerPresenting.h" -#import "FBMemoryProfilerSectionHeaderDelegate.h" -#import "FBMemoryProfilerSegmentedControl.h" -#import "FBMemoryProfilerTextField.h" -#import "FBMemoryProfilerView.h" -#import "FBRetainCycleAnalysisCache.h" -#import "FBRetainCyclePresenter.h" - -#import - -static const CGFloat kFBMemoryProfilerRefreshIntervalInSeconds = 3.0; - -static NSString *const kFBMemoryProfilerSectionHeaderIdentifier = @"kFBMemoryProfilerSectionHeaderIdentifier"; - -@interface FBMemoryProfilerViewController () < -UITableViewDelegate, -UITextFieldDelegate, -FBMemoryProfilerSectionHeaderDelegate, -FBMemoryProfilerPresenting> -@end - -@implementation FBMemoryProfilerViewController -{ - FBMemoryProfilerView *_profilerView; - FBMemoryProfilerDataSource *_dataSource; - - NSTimer *_timer; - NSByteCountFormatter *_byteCountFormatter; - - UITapGestureRecognizer *_tapGestureRecognizer; - - UIViewController *_currentlyPresentedViewController; - FBRetainCyclePresenter *_retainCyclePresenter; - FBRetainCycleAnalysisCache *_analysisCache; - FBObjectGraphConfiguration *_retainCycleDetectorConfiguration; -} - -- (instancetype)initWithOptions:(FBMemoryProfilerOptions *)options -retainCycleDetectorConfiguration:(FBObjectGraphConfiguration *)retainCycleDetectorConfiguration -{ - if (self = [super init]) { - _analysisCache = [FBRetainCycleAnalysisCache new]; - _dataSource = [[FBMemoryProfilerDataSource alloc] initWithAnalysisCache:_analysisCache]; - _byteCountFormatter = [NSByteCountFormatter new]; - - self.profilerOptions = options; - _retainCyclePresenter = [[FBRetainCyclePresenter alloc] initWithDelegate:self]; - _retainCycleDetectorConfiguration = retainCycleDetectorConfiguration; - } - - return self; -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - _timer = [NSTimer scheduledTimerWithTimeInterval:kFBMemoryProfilerRefreshIntervalInSeconds - target:self - selector:@selector(_loadDataFromTimer:) - userInfo:nil - repeats:YES]; -} - -- (void)viewWillDisappear:(BOOL)animated -{ - [super viewWillDisappear:animated]; - - [_timer invalidate]; -} - -- (void)loadView -{ - _profilerView = [FBMemoryProfilerView new]; - self.view = _profilerView; - - _profilerView.tableView.delegate = self; - _profilerView.tableView.dataSource = _dataSource; - _profilerView.tableView.allowsSelection = YES; - - _profilerView.subwordFilter.delegate = self; - - [_profilerView.sortControl addTarget:self action:@selector(_sortControlValueChanged) forControlEvents:UIControlEventValueChanged]; - - NSInteger segmentSelected = 0; - if (_profilerOptions.sortingMode == FBMemoryProfilerSortByAlive) { - segmentSelected = 1; - } - - _profilerView.sortControl.selectedSegmentIndex = segmentSelected; - - - [_profilerView.hideButton addTarget:self action:@selector(_hideProfiler) forControlEvents:UIControlEventTouchUpInside]; - [_profilerView.markGenerationButton addTarget:self action:@selector(_markGeneration) forControlEvents:UIControlEventTouchUpInside]; -} - -- (void)_hideProfiler -{ - [_presentationModeDelegate presentationDelegateChangePresentationModeToMode:FBMemoryProfilerPresentationModeCondensed]; -} - -- (void)_sortControlValueChanged -{ - FBMemoryProfilerSortingMode mode = (FBMemoryProfilerSortingMode)_profilerView.sortControl.selectedSegmentIndex; - - if (mode != _profilerOptions.sortingMode) { - self.profilerOptions = [[FBMemoryProfilerOptions alloc] initWithSortingMode:mode - sortingOrder:_profilerOptions.sortingOrder - plugins:_profilerOptions.plugins]; - } else { - // Mode was the same, we are changing the ordering - FBMemoryProfilerSortingOrder order = - (_profilerOptions.sortingOrder == FBMemoryProfilerSortingOrderAscending) ? - FBMemoryProfilerSortingOrderDescending : - FBMemoryProfilerSortingOrderAscending; - self.profilerOptions = [[FBMemoryProfilerOptions alloc] initWithSortingMode:_profilerOptions.sortingMode - sortingOrder:order - plugins:_profilerOptions.plugins]; - } -} - -- (void)_markGeneration -{ - [[FBAllocationTrackerManager sharedManager] markGeneration]; - - for (id plugin in _profilerOptions.plugins) { - if ([plugin respondsToSelector:@selector(memoryProfilerDidMarkNewGeneration)]) { - [plugin memoryProfilerDidMarkNewGeneration]; - } - } - - [self _loadData]; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - self.view.layer.borderColor = [UIColor lightGrayColor].CGColor; - self.view.layer.borderWidth = 2.0f; - self.view.userInteractionEnabled = YES; - [self setupTapHandler]; - - [_profilerView.subwordFilter addTarget:self - action:@selector(_textFieldDidChange:) - forControlEvents:UIControlEventEditingChanged]; - - [self _loadData]; - [self _update]; -} - -- (void)dealloc -{ - [_tapGestureRecognizer removeTarget:self action:NULL]; -} - -- (void)_loadDataFromTimer:(NSTimer *)timer -{ - dispatch_async(dispatch_get_main_queue(), ^{ - [self _loadData]; - }); -} - -- (void)_loadData -{ - [_dataSource forceDataReload]; - [self _updateProfilerView]; -} - -- (void)setupTapHandler -{ - _tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tap:)]; - - _tapGestureRecognizer.numberOfTapsRequired = 1; - _tapGestureRecognizer.cancelsTouchesInView = NO; - [self.view addGestureRecognizer:_tapGestureRecognizer]; -} - -- (void)_tap:(UITapGestureRecognizer *)gestureRecognizer -{ - [self _hideKeyboardIfPresent]; -} - -#pragma mark - Subword Filter related - -- (void)_hideKeyboardIfPresent -{ - [_profilerView.subwordFilter resignFirstResponder]; -} - -- (void)_textFieldDidChange:(FBMemoryProfilerTextField *)textField -{ - NSString *currentFilter = textField.text; - _dataSource.classFilter = currentFilter; - [self _updateProfilerView]; -} - -#pragma mark - UITableViewDelegate - -- (CGFloat)tableView:(nonnull UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath -{ - return 16.0; -} - -- (CGFloat)tableView:(nonnull UITableView *)tableView heightForHeaderInSection:(NSInteger)section -{ - return 24.0; -} - -- (UIView *)tableView:(nonnull UITableView *)tableView viewForHeaderInSection:(NSInteger)section -{ - FBMemoryProfilerGenerationsSectionHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kFBMemoryProfilerSectionHeaderIdentifier]; - - if (!headerView) { - headerView = [[FBMemoryProfilerGenerationsSectionHeaderView alloc] initWithReuseIdentifier:kFBMemoryProfilerSectionHeaderIdentifier]; - } - - headerView.expanded = [_dataSource isSectionExpanded:section]; - headerView.delegate = self; - headerView.index = section; - headerView.textLabel.text = [NSString stringWithFormat:@"Gen %ld - %@", - (long)(section + 1), - [_dataSource summaryForSection:section]]; - - return headerView; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - // Retain cycle detection kicks in - NSString *className = [tableView cellForRowAtIndexPath:indexPath].textLabel.text; - NSInteger generationIndex = indexPath.section; - - [self _findRetainCyclesForClassesNamed:@[className] - inGeneration:generationIndex - presentDetails:YES]; -} - -- (void)_findRetainCyclesForClassesNamed:(NSArray *)classesNamed - inGeneration:(NSUInteger)generationIndex - presentDetails:(BOOL)presentDetails -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - for (NSString *className in classesNamed) { - Class aCls = NSClassFromString(className); - NSArray *objects = [[FBAllocationTrackerManager sharedManager] instancesForClass:aCls - inGeneration:generationIndex]; - FBObjectGraphConfiguration *configuration = _retainCycleDetectorConfiguration ?: [FBObjectGraphConfiguration new]; - FBRetainCycleDetector *detector = [[FBRetainCycleDetector alloc] initWithConfiguration:configuration]; - - for (id object in objects) { - [detector addCandidate:object]; - } - - NSSet *> *retainCycles = - [detector findRetainCyclesWithMaxCycleLength:8]; - - for (id plugin in _profilerOptions.plugins) { - if ([plugin respondsToSelector:@selector(memoryProfilerDidFindRetainCycles:)]) { - [plugin memoryProfilerDidFindRetainCycles:retainCycles]; - } - } - - dispatch_async(dispatch_get_main_queue(), ^{ - if ([retainCycles count] > 0) { - // We've got a leak - [_analysisCache updateAnalysisStatus:FBRetainCyclePresent - forInGeneration:generationIndex - forClassNamed:className]; - if (presentDetails) { - [_retainCyclePresenter presentRetainCycles:retainCycles]; - } - } else { - [_analysisCache updateAnalysisStatus:FBRetainCycleNotPresent - forInGeneration:generationIndex - forClassNamed:className]; - } - [_profilerView.tableView reloadData]; - }); - } - }); -} - -#pragma mark - UITextFieldDelegate - -- (BOOL)textFieldShouldReturn:(UITextField *)textField -{ - [textField resignFirstResponder]; - return NO; -} - -#pragma mark - FBMemoryProfilerPresenting - -- (void)memoryProfilerPresenter:(id)presenter presentViewController:(UIViewController *)viewController -{ - if (![self memoryProfilerCanPresent]) { - return; - } - - _currentlyPresentedViewController = viewController; - [self addChildViewController:viewController]; - viewController.view.frame = self.view.bounds; - [self.view addSubview:viewController.view]; - [viewController didMoveToParentViewController:self]; -} - -- (void)memoryProfilerPresenter:(id)presenter dismissViewController:(UIViewController *)viewController -{ - [viewController willMoveToParentViewController:nil]; - [viewController.view removeFromSuperview]; - [viewController removeFromParentViewController]; - _currentlyPresentedViewController = nil; -} - -- (BOOL)memoryProfilerCanPresent -{ - return (_currentlyPresentedViewController == nil); -} - -#pragma mark - Options - -- (void)setProfilerOptions:(FBMemoryProfilerOptions *)profilerOptions -{ - if ([_profilerOptions isEqual:profilerOptions]) { - return; - } - - _profilerOptions = profilerOptions; - - [self _update]; -} - -- (void)_update -{ - _dataSource.sortingMode = _profilerOptions.sortingMode; - _dataSource.sortingOrder = _profilerOptions.sortingOrder; - - [self _updateProfilerView]; -} - -- (void)_updateProfilerView -{ - [_profilerView setResidentMemory:[_byteCountFormatter stringFromByteCount:FBMemoryProfilerResidentMemoryInBytes()]]; - [_profilerView.tableView reloadData]; -} - -#pragma mark - FBMemoryProfilerSectionHeaderProtocol - -- (void)sectionHeaderRequestedExpandCollapseAction:(FBMemoryProfilerGenerationsSectionHeaderView *)sectionHeader -{ - sectionHeader.expanded = !sectionHeader.expanded; - - [_dataSource setExpanded:sectionHeader.expanded - forSection:sectionHeader.index]; - [_profilerView.tableView reloadSections:[NSIndexSet indexSetWithIndex:sectionHeader.index] withRowAnimation:UITableViewRowAnimationFade]; -} - -- (void)sectionHeaderRequestedRetainCycleDetection:(FBMemoryProfilerGenerationsSectionHeaderView *)sectionHeader -{ - NSArray *classNames = [_dataSource classNamesForSection:sectionHeader.index]; - - [self _findRetainCyclesForClassesNamed:classNames - inGeneration:sectionHeader.index - presentDetails:NO]; -} - -#pragma mark - FBMemoryProfilerMovableViewController - -- (void)containerWillMove:(UIViewController *)container -{ - [self _hideKeyboardIfPresent]; -} - -- (BOOL)shouldStretchInMovableContainer -{ - return YES; -} - -- (CGFloat)minimumHeightInMovableContainer -{ - return 130; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.h deleted file mode 100644 index 39f4f58..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -//! Project version number for FBMemoryProfiler. -FOUNDATION_EXPORT double FBMemoryProfilerVersionNumber; - -//! Project version string for FBMemoryProfiler. -FOUNDATION_EXPORT const unsigned char FBMemoryProfilerVersionString[]; - -#import - -#import "FBMemoryProfilerPluggable.h" -#import "FBMemoryProfilerPresentationModeDelegate.h" - -#import - -/** - This will protect some internal parts that could use dangerous paths like private API's. - Memory Profiler should be safe to use even without them, it's just going to have missing features. - */ -#ifdef FB_MEMORY_TOOLS -#define _INTERNAL_IMP_ENABLED (FB_MEMORY_TOOLS) -#else -#define _INTERNAL_IMP_ENABLED DEBUG -#endif // FB_MEMORY_TOOLS - -@protocol FBMemoryProfilerPluggable; - -/** - FBMemoryProfiler is a tool helping with memory profiling on iOS. It leverages FBAllocationTracker - and FBRetainCycleDetector. It can track all NSObject subclasses allocations. You can scan every - class' instances for retain cycles. It also supports generations similar to Instruments, so you - can observe objects created in between given generation marks. - */ -@interface FBMemoryProfiler : NSObject - -/** - Designated initializer - @param plugins Plugins can take up some behavior like cache cleaning when we are working with profiler. - Check FBMemoryProfilerPluggable for details. - @param retainCycleDetectorConfiguration Retain cycle detector will use this configuration to determine how it should - walk on object graph, check FBObjectGraphConfiguration to see what options you can define. - @see FBObjectGraphConfiguration - */ -- (nonnull instancetype)initWithPlugins:(nullable NSArray> *)plugins - retainCycleDetectorConfiguration:(nullable FBObjectGraphConfiguration *)retainCycleDetectorConfiguration NS_DESIGNATED_INITIALIZER; - -/** - Enable Memory Profiler. It will show a button that after clicking will bring up the memory profiler. - */ -- (void)enable; - -/** - Disable Memory Profiler. The window will be destroyed. - */ -- (void)disable; - -/** - Presentation mode for FBMemoryProfiler. It currently supports three presentation modes. - It can be a small floating button, that we can keep around, or a full window for actual - profiling, or it can simply be disabled. - */ -@property (nonatomic, assign) FBMemoryProfilerPresentationMode presentationMode; -@property (nonatomic, assign, getter=isEnabled) BOOL enabled; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.mm b/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.mm deleted file mode 100644 index 00cebf4..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.mm +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfiler.h" - -#import - -#import "FBMemoryProfilerContainerViewController.h" -#import "FBMemoryProfilerFloatingButtonController.h" -#import "FBMemoryProfilerOptions.h" -#import "FBMemoryProfilerPluggable.h" -#import "FBMemoryProfilerViewController.h" -#import "FBMemoryProfilerWindow.h" -#import "FBMemoryProfilerWindowTouchesHandling.h" - -static const NSUInteger kFBFloatingButtonSize = 52.0; -static const CGFloat KFBMemoryProfilerDesignatedHeight = 230; - -@interface FBMemoryProfiler () - -@property (nonatomic, strong) FBMemoryProfilerWindow *memoryProfilerWindow; - -@end - -@implementation FBMemoryProfiler -{ - FBMemoryProfilerViewController *_profilerViewController; - FBMemoryProfilerFloatingButtonController *_floatingButtonController; - - FBMemoryProfilerContainerViewController *_containerViewController; - - FBMemoryProfilerOptions *_options; - FBObjectGraphConfiguration *_retainCycleDetectorConfiguration; -} - -- (instancetype)init -{ - return [self initWithPlugins:nil -retainCycleDetectorConfiguration:nil]; -} - -- (instancetype)initWithPlugins:(NSArray> *)plugins -retainCycleDetectorConfiguration:(FBObjectGraphConfiguration *)retainCycleDetectorConfiguration -{ - if (self = [super init]) { - _presentationMode = FBMemoryProfilerPresentationModeFullWindow; - _options = [[FBMemoryProfilerOptions alloc] initWithSortingMode:FBMemoryProfilerSortByClass - sortingOrder:FBMemoryProfilerSortingOrderAscending - plugins:plugins]; - _retainCycleDetectorConfiguration = retainCycleDetectorConfiguration; - } - - return self; -} - -#pragma mark - Public - -- (void)enable -{ - // Put Memory profiler in status bar but save window for future reference when showing on screen - _enabled = YES; - - [[FBAllocationTrackerManager sharedManager] enableGenerations]; - - _containerViewController = [FBMemoryProfilerContainerViewController new]; - - _memoryProfilerWindow = [[FBMemoryProfilerWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - _memoryProfilerWindow.touchesDelegate = self; - _memoryProfilerWindow.rootViewController = _containerViewController; - _memoryProfilerWindow.hidden = NO; - - self.presentationMode = FBMemoryProfilerPresentationModeCondensed; - - [_options.plugins enumerateObjectsUsingBlock:^(id plugin, - NSUInteger idx, - BOOL *stop) { - if ([plugin respondsToSelector:@selector(memoryProfilerDidEnable)]) { - [plugin memoryProfilerDidEnable]; - } - }]; -} - -- (void)disable -{ - [_options.plugins enumerateObjectsUsingBlock:^(id plugin, - NSUInteger idx, - BOOL *stop) { - if ([plugin respondsToSelector:@selector(memoryProfilerDidDisable)]) { - [plugin memoryProfilerDidDisable]; - } - }]; - - self.presentationMode = FBMemoryProfilerPresentationModeDisabled; - _memoryProfilerWindow = nil; - [[FBAllocationTrackerManager sharedManager] disableGenerations]; - _enabled = NO; -} - -#pragma mark - Popover attaching - -- (void)_instanceAttachToWindow -{ - if (_profilerViewController) { - // Breaks cycle - [_profilerViewController.view removeFromSuperview]; - } - - _profilerViewController = [[FBMemoryProfilerViewController alloc] initWithOptions:_options - retainCycleDetectorConfiguration:_retainCycleDetectorConfiguration]; - _profilerViewController.presentationModeDelegate = self; - [_containerViewController presentViewController:_profilerViewController - withSize:CGSizeMake(MAXFLOAT, KFBMemoryProfilerDesignatedHeight)]; -} - -- (void)_instanceDetachFromWindow -{ - // Backup options - if (_profilerViewController) { - _options = _profilerViewController.profilerOptions; - } - - [_containerViewController dismissCurrentViewController]; - _profilerViewController = nil; -} - -- (void)setPresentationMode:(FBMemoryProfilerPresentationMode)presentationMode -{ - if (_presentationMode != presentationMode) { - switch (presentationMode) { - case FBMemoryProfilerPresentationModeFullWindow: - [self _hideFloatingButton]; - [self _instanceAttachToWindow]; - break; - case FBMemoryProfilerPresentationModeCondensed: - [self _instanceDetachFromWindow]; - [self _showFloatingButton]; - break; - case FBMemoryProfilerPresentationModeDisabled: - [self _hideFloatingButton]; - [self _instanceDetachFromWindow]; - break; - } - } - - _presentationMode = presentationMode; -} - -#pragma mark - Floating button presentation - -- (void)_showFloatingButton -{ - _floatingButtonController = [FBMemoryProfilerFloatingButtonController new]; - _floatingButtonController.presentationModeDelegate = self; - - [_containerViewController presentViewController:_floatingButtonController - withSize:CGSizeMake(kFBFloatingButtonSize, - kFBFloatingButtonSize)]; -} - -- (void)_hideFloatingButton -{ - [_containerViewController dismissCurrentViewController]; - _floatingButtonController = nil; -} - -#pragma mark - FBMemoryProfilerPresentationModeDelegate - -- (void)presentationDelegateChangePresentationModeToMode:(FBMemoryProfilerPresentationMode)mode -{ - self.presentationMode = mode; -} - -#pragma mark - FBMemoryProfilerWindowTouchesHandling - -- (BOOL)window:(UIWindow *)window shouldReceiveTouchAtPoint:(CGPoint)point -{ - switch (_presentationMode) { - case FBMemoryProfilerPresentationModeFullWindow: - return CGRectContainsPoint(_profilerViewController.view.bounds, - [_profilerViewController.view convertPoint:point - fromView:window]); - case FBMemoryProfilerPresentationModeCondensed: - return CGRectContainsPoint(_floatingButtonController.view.bounds, - [_floatingButtonController.view convertPoint:point - fromView:window]); - case FBMemoryProfilerPresentationModeDisabled: - return NO; - } -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h deleted file mode 100644 index 8bcf8fa..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -typedef NS_ENUM(NSUInteger, FBMemoryProfilerPresentationMode) { - // Overlay window with main memory profiler interface - FBMemoryProfilerPresentationModeFullWindow, - // Small translucent button that can be dragged and dropped around - FBMemoryProfilerPresentationModeCondensed, - FBMemoryProfilerPresentationModeDisabled, -}; - -/** - Presentation mode delegate owns memory profiler presentation and it can change it if requested. - */ -@protocol FBMemoryProfilerPresentationModeDelegate - -- (void)presentationDelegateChangePresentationModeToMode:(FBMemoryProfilerPresentationMode)mode; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.h deleted file mode 100644 index bdcbcdb..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -#import "FBMemoryProfilerDataSource.h" - -@protocol FBMemoryProfilerPluggable; - -/** - FBMemoryProfilerOptions is an object holding sorting options and plugins that profiler is using. - */ - -@interface FBMemoryProfilerOptions : NSObject - -/** - Which sorting mode is currently on? (classes, alive objects, size) - */ -@property (nonatomic, readonly) FBMemoryProfilerSortingMode sortingMode; - -/** - Is data ordered ascending or descending? - */ -@property (nonatomic, readonly) FBMemoryProfilerSortingOrder sortingOrder; - -/** - Contains list of plugins, every one of them has to conform to FBMemoryProfilerPluggable protocol. - */ -@property (nonatomic, readonly, copy, nullable) NSArray> *plugins; - -- (nonnull instancetype)initWithSortingMode:(FBMemoryProfilerSortingMode)sortingMode - sortingOrder:(FBMemoryProfilerSortingOrder)sortingOrder - plugins:(nullable NSArray> *)plugins; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.m deleted file mode 100644 index 3e96242..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.m +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerOptions.h" - -@implementation FBMemoryProfilerOptions - -- (instancetype)initWithSortingMode:(FBMemoryProfilerSortingMode)sortingMode - sortingOrder:(FBMemoryProfilerSortingOrder)sortingOrder - plugins:(NSArray> *)plugins -{ - if ((self = [super init])) { - _sortingMode = sortingMode; - _sortingOrder = sortingOrder; - _plugins = [plugins copy]; - } - - return self; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h deleted file mode 100644 index db29225..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -#import "FBMemoryProfilerPresenting.h" - -/** - FBMemoryProfilerPluggable describes plugin for memory profiler. Whenever we want to support - additional behavior for memory profiler such as clearing caches on generation mark, or - logging retain cycles to backend, we can create a plugin and attach it to memory profiler. - */ -@protocol FBMemoryProfilerPluggable - -@optional - -/** - Lifecycle events, when Memory profiler is enabled/disabled - */ -- (void)memoryProfilerDidEnable; -- (void)memoryProfilerDidDisable; - -/** - When memory profiler finds retain cycles plugins can subscribe to get them. - */ -- (void)memoryProfilerDidFindRetainCycles:(nonnull NSSet *)retainCycles; - -/** - If you want to do additional cleanup after marking new generations. - */ -- (void)memoryProfilerDidMarkNewGeneration; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h deleted file mode 100644 index e9c5f88..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -typedef NS_ENUM(NSUInteger, FBRetainCycleStatus) { - FBRetainCyclePresent, - FBRetainCycleNotPresent, - FBRetainCycleUnknown -}; - -/** - FBRetainCycleAnalysisCache can answer if we have ran retain cycle detection for given class in given - generation and what was it's result. - */ -@interface FBRetainCycleAnalysisCache : NSObject - -/** - What is the status of retain cycle detection for class in given generation - - @param generationIndex generation to check - @param className class to check - */ -- (FBRetainCycleStatus)statusInGeneration:(NSUInteger)generationIndex - forClassNamed:(nullable NSString *)className; - -/** - Sets new state for given class in given generation - - @param status new status to set - @param generationIndex generation to update - @param className class to update - */ -- (void)updateAnalysisStatus:(FBRetainCycleStatus)status - forInGeneration:(NSUInteger)generationIndex - forClassNamed:(nullable NSString *)className; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.m deleted file mode 100644 index 35cee1c..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.m +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBRetainCycleAnalysisCache.h" - -@implementation FBRetainCycleAnalysisCache -{ - NSMutableArray *_analysis; -} - -- (instancetype)init -{ - if (self = [super init]) { - _analysis = [NSMutableArray new]; - } - - return self; -} - -- (FBRetainCycleStatus)statusInGeneration:(NSUInteger)generationIndex - forClassNamed:(NSString *)className -{ - if (_analysis.count <= generationIndex || (_analysis[generationIndex][className] == nil)) { - return FBRetainCycleUnknown; - } - - return (FBRetainCycleStatus)[_analysis[generationIndex][className] unsignedIntegerValue]; -} - -- (void)updateAnalysisStatus:(FBRetainCycleStatus)status - forInGeneration:(NSUInteger)generationIndex - forClassNamed:(NSString *)className -{ - // If first class in new generation, expand array - while (_analysis.count <= generationIndex) { - [_analysis addObject:[NSMutableDictionary new]]; - } - - [_analysis[generationIndex] setObject:@(status) forKey:className]; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h deleted file mode 100644 index 4b00497..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -@protocol FBMemoryProfilerPresenting; - -@class FBObjectiveCGraphElement; - -/** - When we find retain cycles for given class, we will show this presenter. It's a table view. Every row will represent - retain cycle and, when selected, will present it in details using FBSingleRetainCycleViewController - */ -@interface FBRetainCyclePresenter : NSObject - -/** - @param delegate Delegate that can present view controllers inside FBMemoryProfiler - */ -- (nonnull instancetype)initWithDelegate:(nullable id)delegate; - -/** - When found, retain cycles can be presented, they will be delivered to presenter using this method and then - showed on top of FBMemoryProfiler - */ -- (void)presentRetainCycles:(nonnull NSSet *> *)retainCycles; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.m deleted file mode 100644 index 941f755..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.m +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBRetainCyclePresenter.h" - -#import "FBMemoryProfilerPresenting.h" -#import "FBSingleRetainCycleViewController.h" - -#import - -static NSString *const FBRetainCycleDetectorIdentifier = @"retain_cycle_detector_identifier"; -static NSString *const FBRetainCycleFromMemoryProfilerPerfEvent = @"retain_cycle_detector_memory_profiler_perf"; - -@interface FBRetainCyclePresenter () - -@end - -@implementation FBRetainCyclePresenter -{ - NSArray *> *_retainCycles; - __weak id _delegate; - - UINavigationController *_resultsViewController; -} - -- (instancetype)initWithDelegate:(id)delegate -{ - if (self = [super init]) { - _delegate = delegate; - } - - return self; -} - -- (void)presentRetainCycles:(NSSet *> *)retainCycles -{ - if (![_delegate memoryProfilerCanPresent]) { - return; - } - - _retainCycles = [retainCycles allObjects]; - - UITableViewController *tableViewController = [UITableViewController new]; - tableViewController.tableView.delegate = self; - tableViewController.tableView.dataSource = self; - - _resultsViewController = [[UINavigationController alloc] initWithRootViewController:tableViewController]; - - UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" - style:UIBarButtonItemStylePlain - target:self - action:@selector(_dismissTableViewController)]; - tableViewController.navigationItem.rightBarButtonItem = closeButton; - tableViewController.title = @"Results"; - - [_delegate memoryProfilerPresenter:self presentViewController:_resultsViewController]; -} - -- (void)_dismissTableViewController -{ - [_delegate memoryProfilerPresenter:self dismissViewController:_resultsViewController]; - _resultsViewController = nil; - _retainCycles = nil; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return [_retainCycles count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView - cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:FBRetainCycleDetectorIdentifier]; - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle - reuseIdentifier:FBRetainCycleDetectorIdentifier]; - } - - NSArray *retainCycle = _retainCycles[indexPath.row]; - cell.textLabel.text = [retainCycle[0] classNameOrNull]; - - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - FBSingleRetainCycleViewController *summary = [[FBSingleRetainCycleViewController alloc] initWithRetainCycle:_retainCycles[indexPath.row]]; - [_resultsViewController pushViewController:summary - animated:YES]; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h deleted file mode 100644 index d8a269f..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -@class FBObjectiveCGraphElement; - -/** - Simple view controller representing one retain cycle. It will present it in a table view, where very row - will be one FBObjectiveCGraphElement's description. - */ -@interface FBSingleRetainCycleViewController : UITableViewController - -/** - @param retainCycle retain cycle to present - */ -- (nonnull instancetype)initWithRetainCycle:(nonnull NSArray *)retainCycle; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.m deleted file mode 100644 index e8d586b..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.m +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBSingleRetainCycleViewController.h" - -#import - -static NSString *const FBRetainCycleSingleLeakIdentifier = @"retain_cycle_single_leak_identifier"; - -@implementation FBSingleRetainCycleViewController -{ - NSArray *_retainCycle; -} - -- (instancetype)initWithRetainCycle:(NSArray *)retainCycle -{ - if (self = [super init]) { - _retainCycle = [retainCycle copy]; - } - - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - self.tableView.delegate = self; - self.tableView.dataSource = self; - self.tableView.userInteractionEnabled = NO; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return [_retainCycle count]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath -{ - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:FBRetainCycleSingleLeakIdentifier]; - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:FBRetainCycleSingleLeakIdentifier]; - cell.textLabel.font = [UIFont systemFontOfSize:14]; - } - - cell.textLabel.text = [_retainCycle[indexPath.row] description]; - - return cell; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h deleted file mode 100644 index cd8cadd..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -/** - FBMemoryProfilerSegmentedControl will behave as UISegmentedControl with small difference: - - It will call up valueChanged target-action when someone will tap on already selected - segment. - */ -@interface FBMemoryProfilerSegmentedControl : UISegmentedControl - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.m deleted file mode 100644 index aee8a34..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.m +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerSegmentedControl.h" - -@implementation FBMemoryProfilerSegmentedControl - -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event -{ - NSInteger currentSegment = self.selectedSegmentIndex; - - [super touchesEnded:touches withEvent:event]; - - if (currentSegment == self.selectedSegmentIndex) { - [self sendActionsForControlEvents:UIControlEventValueChanged]; - } -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.h deleted file mode 100644 index de486f6..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.h +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -/** - Simple subclass of UITextField that supports insets - */ -@interface FBMemoryProfilerTextField : UITextField - -@property (nonatomic, assign) UIEdgeInsets edgeInsets; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.m deleted file mode 100644 index 80bba87..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.m +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerTextField.h" - -@implementation FBMemoryProfilerTextField - -- (CGRect)textRectForBounds:(CGRect)bounds -{ - return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, _edgeInsets)]; -} - -- (CGRect)editingRectForBounds:(CGRect)bounds -{ - return [super editingRectForBounds:UIEdgeInsetsInsetRect(bounds, _edgeInsets)]; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h deleted file mode 100644 index 2653a2b..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -#ifdef __cplusplus -extern "C" { -#endif - -/** - @return current resident memory from mach task info - */ -uint64_t FBMemoryProfilerResidentMemoryInBytes(void); - -#ifdef __cplusplus -} -#endif diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.m deleted file mode 100644 index b91df91..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.m +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerDeviceUtils.h" - -#import -#import - -#import - -uint64_t FBMemoryProfilerResidentMemoryInBytes() { - kern_return_t rval = 0; - mach_port_t task = mach_task_self(); - - struct task_basic_info info = {0}; - mach_msg_type_number_t tcnt = TASK_BASIC_INFO_COUNT; - task_flavor_t flavor = TASK_BASIC_INFO; - - task_info_t tptr = (task_info_t) &info; - - if (tcnt > sizeof(info)) - return 0; - - rval = task_info(task, flavor, tptr, &tcnt); - if (rval != KERN_SUCCESS) { - return 0; - } - - return info.resident_size; -} diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h deleted file mode 100644 index e1d4993..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -#ifdef __cplusplus -extern "C" { -#endif - -CGFloat FBMemoryProfilerRoundPixelValue(CGFloat value); - -#ifdef __cplusplus -} -#endif diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.m deleted file mode 100644 index 0ac6369..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.m +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerMathUtils.h" - -#import - -#import - -CGFloat FBMemoryProfilerRoundPixelValue(CGFloat value) { - CGFloat scale = [[UIScreen mainScreen] scale]; - return roundf(value * scale) / scale; -} diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h deleted file mode 100644 index 06de9ea..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -@protocol FBMemoryProfilerSectionHeaderDelegate; - -/** - Custom section view that adds some additional UI elements - */ -@interface FBMemoryProfilerGenerationsSectionHeaderView : UITableViewHeaderFooterView - -/** - Delegate to support header button actions - */ -@property (nonatomic, weak, nullable) id delegate; - -/** - Is section expanded - */ -@property (nonatomic, assign) BOOL expanded; - -/** - What is the index of this section - */ -@property (nonatomic, assign) NSInteger index; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.m deleted file mode 100644 index c53bb94..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.m +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerGenerationsSectionHeaderView.h" - -#import "FBMemoryProfilerSectionHeaderDelegate.h" - -@implementation FBMemoryProfilerGenerationsSectionHeaderView -{ - UIButton *_retainCycleDetectionButton; - UIButton *_collapseButton; -} - -- (UIButton *)_defaultSectionButton -{ - UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - button.titleLabel.font = [UIFont systemFontOfSize:10]; - button.layer.borderColor = [UIColor lightGrayColor].CGColor; - button.layer.borderWidth = 1.0; - - return button; -} - -- (instancetype)initWithReuseIdentifier:(nullable NSString *)reuseIdentifier -{ - if (self = [super initWithReuseIdentifier:reuseIdentifier]) { - _retainCycleDetectionButton = [self _defaultSectionButton]; - [_retainCycleDetectionButton setTitle:@"Retain Cycles" forState:UIControlStateNormal]; - [_retainCycleDetectionButton addTarget:self action:@selector(_retainCycleDetectionButtonTapped) forControlEvents:UIControlEventTouchUpInside]; - - _collapseButton = [self _defaultSectionButton]; - [_collapseButton addTarget:self action:@selector(_buttonTapped) forControlEvents:UIControlEventTouchUpInside]; - - [self addSubview:_retainCycleDetectionButton]; - [self addSubview:_collapseButton]; - } - - return self; -} - -- (void)_buttonTapped -{ - [self.delegate sectionHeaderRequestedExpandCollapseAction:self]; -} - -- (void)_retainCycleDetectionButtonTapped -{ - [self.delegate sectionHeaderRequestedRetainCycleDetection:self]; -} - -- (void)setExpanded:(BOOL)expanded -{ - _expanded = expanded; - - if (_expanded) { - [_collapseButton setTitle:@"Collapse" forState:UIControlStateNormal]; - } else { - [_collapseButton setTitle:@"Expand" forState:UIControlStateNormal]; - } -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - CGFloat expandButtonWidth = 56.0; - CGFloat retainCyclesButtonWidth = 70.0; - CGFloat width = CGRectGetWidth(self.bounds); - CGFloat margin = 2.0; - CGFloat height = CGRectGetHeight(self.bounds) - 2 * margin; - - _retainCycleDetectionButton.frame = CGRectMake(width - expandButtonWidth - retainCyclesButtonWidth - 4 * margin, - margin, - retainCyclesButtonWidth, - height); - - _collapseButton.frame = CGRectMake(width - expandButtonWidth - 2 * margin, - margin, - expandButtonWidth, - height); -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.h deleted file mode 100644 index 96ac521..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.h +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -@class FBMemoryProfilerTextField, FBMemoryProfilerSegmentedControl; - -/** - Main view that FBMemoryProfilerViewController will be using. - */ -@interface FBMemoryProfilerView : UIView - -/** - Table view, that data source will be on. - */ -@property (nonatomic, readonly, nullable) UITableView *tableView; - -/** - Text field to filter data by class name. - */ -@property (nonatomic, readonly, nullable) FBMemoryProfilerTextField *subwordFilter; - -/** - Segmented controller to pick ordering (alive objects, size, class name) - */ -@property (nonatomic, readonly, nullable) FBMemoryProfilerSegmentedControl *sortControl; - -@property (nonatomic, readonly, nullable) UIButton *hideButton; -@property (nonatomic, readonly, nullable) UIButton *markGenerationButton; - -- (void)setResidentMemory:(nullable NSString *)residentMemory; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.m deleted file mode 100644 index f041079..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.m +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerView.h" - -#import "FBMemoryProfilerMathUtils.h" -#import "FBMemoryProfilerSegmentedControl.h" -#import "FBMemoryProfilerTextField.h" - -static const CGFloat kFBMemoryProfilerHeaderHeight = 70.0; -static const CGFloat kFBMemoryProfilerMargin = 5.0; -static const CGFloat kFBMemoryProfilerNumberOfRowsInHeader = 2.0; -static const CGFloat kFBMemoryProfilerDragHandleHeight = 20.0; - -@implementation FBMemoryProfilerView -{ - NSDictionary *_attributes; - - UILabel *_residentMemory; -} - -- (instancetype)initWithFrame:(CGRect)frame -{ - if (self = [super initWithFrame:frame]) { - self.backgroundColor = [UIColor colorWithRed:(245.0f / 255.0f) green:(245.0f / 255.0f) blue:(245.0f / 255.0f) alpha:1.0]; - - UIFont *font = [UIFont systemFontOfSize:14]; - _attributes = @{NSFontAttributeName: font}; - - _residentMemory = [UILabel new]; - _residentMemory.font = font; - - _tableView = [UITableView new]; - _tableView.backgroundColor = [UIColor whiteColor]; - - _subwordFilter = [FBMemoryProfilerTextField new]; - _subwordFilter.backgroundColor = [UIColor whiteColor]; - _subwordFilter.font = font; - _subwordFilter.placeholder = @"Filter..."; - _subwordFilter.autocorrectionType = UITextAutocorrectionTypeNo; - _subwordFilter.autocapitalizationType = UITextAutocapitalizationTypeNone; - _subwordFilter.layer.borderWidth = 0.5; - _subwordFilter.layer.borderColor = [UIColor lightGrayColor].CGColor; - _subwordFilter.edgeInsets = UIEdgeInsetsMake(0, 5, 0, 5); - - _sortControl = [[FBMemoryProfilerSegmentedControl alloc] initWithItems:@[@"Class", @"Alive", @"Size"]]; - _sortControl.backgroundColor = [UIColor whiteColor]; - - _hideButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - _hideButton.backgroundColor = [UIColor whiteColor]; - _hideButton.layer.borderWidth = 1.0; - _hideButton.layer.borderColor = [UIColor lightGrayColor].CGColor; - [_hideButton setTitle:@"Hide" forState:UIControlStateNormal]; - - _markGenerationButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; - _markGenerationButton.backgroundColor = [UIColor whiteColor]; - _markGenerationButton.layer.borderWidth = 1.0; - _markGenerationButton.layer.borderColor = [UIColor lightGrayColor].CGColor; - [_markGenerationButton setTitle:@"Mark Gen." forState:UIControlStateNormal]; - - [self addSubview:_residentMemory]; - [self addSubview:_tableView]; - [self addSubview:_subwordFilter]; - [self addSubview:_sortControl]; - [self addSubview:_hideButton]; - [self addSubview:_markGenerationButton]; - } - - return self; -} - -- (void)layoutSubviews -{ - [super layoutSubviews]; - - CGFloat cellHeight = FBMemoryProfilerRoundPixelValue(kFBMemoryProfilerHeaderHeight / kFBMemoryProfilerNumberOfRowsInHeader); - - CGFloat width = CGRectGetWidth(self.bounds); - CGFloat halfWidth = FBMemoryProfilerRoundPixelValue(width / 2); - - // The real content width - CGFloat expectedElementWidth = halfWidth - 2 * kFBMemoryProfilerMargin; - CGFloat expectedElementHeight = cellHeight - 2 * kFBMemoryProfilerMargin; - - // Text Field in the top left corner - _subwordFilter.frame = CGRectMake(kFBMemoryProfilerMargin, - kFBMemoryProfilerMargin, - expectedElementWidth, - expectedElementHeight); - - // Two buttons will be layed out in top right corner sharing the space - CGFloat buttonSpaceWithMargins = FBMemoryProfilerRoundPixelValue(halfWidth / 2.0); - CGFloat buttonWidth = buttonSpaceWithMargins - 2 * kFBMemoryProfilerMargin; - _markGenerationButton.frame = CGRectMake(halfWidth + kFBMemoryProfilerMargin, - kFBMemoryProfilerMargin, - buttonWidth, - expectedElementHeight); - _hideButton.frame = CGRectMake(halfWidth + buttonSpaceWithMargins + kFBMemoryProfilerMargin, - kFBMemoryProfilerMargin, - buttonWidth, - expectedElementHeight); - - _sortControl.frame = CGRectMake(kFBMemoryProfilerMargin, - cellHeight + kFBMemoryProfilerMargin, - FBMemoryProfilerRoundPixelValue(expectedElementWidth), - expectedElementHeight); - - // Resident Memory layout - CGFloat residentLabelWidth = halfWidth - 2 * kFBMemoryProfilerMargin; - - CGRect residentBoundingRect = - [_residentMemory.text boundingRectWithSize:CGSizeMake(residentLabelWidth, CGFLOAT_MAX) - options:NSStringDrawingUsesLineFragmentOrigin - attributes:_attributes - context:nil]; - - // Y-offset for residentBoundingRect to make it centered vertically - CGFloat yOffset = MAX(0, FBMemoryProfilerRoundPixelValue((cellHeight - CGRectGetHeight(residentBoundingRect)) / 2)); - - - _residentMemory.frame = CGRectMake(halfWidth + kFBMemoryProfilerMargin, - cellHeight + yOffset, - FBMemoryProfilerRoundPixelValue(residentLabelWidth), - FBMemoryProfilerRoundPixelValue(CGRectGetHeight(residentBoundingRect))); - - - _tableView.frame = CGRectMake(0, - kFBMemoryProfilerHeaderHeight, - CGRectGetWidth(self.bounds), - CGRectGetHeight(self.bounds) - kFBMemoryProfilerHeaderHeight - kFBMemoryProfilerDragHandleHeight); -} - -- (void)setResidentMemory:(NSString *)residentMemory -{ - _residentMemory.text = [NSString stringWithFormat:@"%@", residentMemory]; -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h deleted file mode 100644 index da39722..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -@protocol FBMemoryProfilerMovableViewController; - -/** - Contains child view controller with given sizes, let's it being draggable all around within - the window it was created in. - */ -@interface FBMemoryProfilerContainerViewController : UIViewController - -- (void)presentViewController:(nonnull UIViewController *)viewController - withSize:(CGSize)size; - -- (void)dismissCurrentViewController; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.m deleted file mode 100644 index 7889a8c..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.m +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerContainerViewController.h" - -#import "FBMemoryProfiler.h" -#import "FBMemoryProfilerMathUtils.h" -#import "FBMemoryProfilerMovableViewController.h" - -@implementation FBMemoryProfilerContainerViewController -{ - UIViewController *_presentedViewController; - UIPanGestureRecognizer *_panGestureRecognizer; - - UIPinchGestureRecognizer *_pinchGestureRecognizer; - CGFloat _heightOnPinch; - CGPoint _previousPinchingPoint; - - CGSize _size; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor clearColor]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(_keyboardWillShow:) - name:UIKeyboardWillShowNotification - object:nil]; - -} - -- (void)dealloc -{ - [[NSNotificationCenter defaultCenter] removeObserver:self - name:UIKeyboardWillShowNotification - object:nil]; -} - -- (void)presentViewController:(UIViewController *)viewController - withSize:(CGSize)size -{ - if (_presentedViewController) { - [self dismissCurrentViewController]; - } - - _presentedViewController = viewController; - _size = size; - CGSize adjustedSize = CGSizeMake(MIN(_size.width, CGRectGetWidth(self.view.bounds)), - MIN(_size.height, CGRectGetHeight(self.view.bounds))); - - // Put content right under status bar, in the middle - CGFloat heightOffset = 20; - CGFloat widthOffset = FBMemoryProfilerRoundPixelValue((CGRectGetWidth(self.view.bounds) - adjustedSize.width) / 2.0); - - CGRect frame = CGRectMake(widthOffset, heightOffset, adjustedSize.width, adjustedSize.height); - - [self addChildViewController:_presentedViewController]; - _presentedViewController.view.frame = frame; - [self.view addSubview:_presentedViewController.view]; - - _panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(_pan)]; - _panGestureRecognizer.minimumNumberOfTouches = 1; - _panGestureRecognizer.maximumNumberOfTouches = 1; - [_presentedViewController.view addGestureRecognizer:_panGestureRecognizer]; - - if ([_presentedViewController shouldStretchInMovableContainer]) { - _pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(_pinch:)]; - [_presentedViewController.view addGestureRecognizer:_pinchGestureRecognizer]; - } - - [_presentedViewController didMoveToParentViewController:self]; -} - -- (void)dismissCurrentViewController -{ - if (!_presentedViewController) { - return; - } - - [_presentedViewController willMoveToParentViewController:nil]; - - [_panGestureRecognizer removeTarget:self action:NULL]; - _panGestureRecognizer = nil; - [_pinchGestureRecognizer removeTarget:self action:NULL]; - _pinchGestureRecognizer = nil; - - [_presentedViewController.view removeFromSuperview]; - [_presentedViewController removeFromParentViewController]; -} - -- (void)_pan -{ - if (_panGestureRecognizer.state == UIGestureRecognizerStateBegan) { - [_presentedViewController containerWillMove:self]; - } - - CGPoint translation = [_panGestureRecognizer translationInView:self.view]; - - CGPoint center = _presentedViewController.view.center; - center.x += translation.x; - center.y += translation.y; - - CGFloat centerHeightOffset = FBMemoryProfilerRoundPixelValue(CGRectGetHeight(_presentedViewController.view.frame) / 2.0); - CGFloat centerWidthOffset = FBMemoryProfilerRoundPixelValue(CGRectGetWidth(_presentedViewController.view.frame) / 2.0); - - // Make sure it stays on screen - if (center.y - centerHeightOffset < 0) { - center.y = centerHeightOffset; - } - if (center.x - centerWidthOffset < 0) { - center.x = centerWidthOffset; - } - - CGFloat maximumY = CGRectGetHeight(self.view.bounds) - CGRectGetHeight(_presentedViewController.view.frame); - if (center.y - centerHeightOffset > maximumY) { - center.y = maximumY + centerHeightOffset; - } - - CGFloat maximumX = CGRectGetWidth(self.view.bounds) - CGRectGetWidth(_presentedViewController.view.frame); - if (center.x - centerWidthOffset > maximumX) { - center.x = maximumX + centerWidthOffset; - } - - _presentedViewController.view.center = center; - - [_panGestureRecognizer setTranslation:CGPointZero inView:self.view]; -} - -- (void)_pinch:(UIPinchGestureRecognizer *)gestureRecognizer -{ - if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { - _heightOnPinch = CGRectGetHeight(_presentedViewController.view.frame); - - [_presentedViewController containerWillMove:self]; - } - - CGFloat windowHeight = CGRectGetHeight(self.view.bounds); - - CGFloat scale = gestureRecognizer.scale; - CGFloat statusBarOffset = 20; - - CGFloat expectedHeight = scale * _heightOnPinch; - expectedHeight = MAX(expectedHeight, [_presentedViewController minimumHeightInMovableContainer]); - expectedHeight = MIN(expectedHeight, windowHeight - statusBarOffset); - CGRect newFrame = _presentedViewController.view.frame; - - CGFloat yOffset = FBMemoryProfilerRoundPixelValue((expectedHeight - CGRectGetHeight(_presentedViewController.view.frame)) / 2.0); - - newFrame.size.height = expectedHeight; - newFrame.origin.y -= yOffset; - if (newFrame.origin.y <= statusBarOffset) { - newFrame.origin.y = statusBarOffset; - } - - if (newFrame.origin.y + expectedHeight >= windowHeight) { - newFrame.origin.y = windowHeight - expectedHeight; - } - - _presentedViewController.view.frame = newFrame; -} - -#pragma mark Keyboard Handling - -- (void)_keyboardWillShow:(NSNotification *)notification -{ - CGRect endFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; - CGFloat keyboardTopY = endFrame.origin.y; - - [self _pushPresentedViewAboveKeyboard:keyboardTopY]; -} - -- (void)_pushPresentedViewAboveKeyboard:(CGFloat)keyboardTopY -{ - CGFloat rectBottom = CGRectGetMaxY(_presentedViewController.view.frame); - if (rectBottom <= keyboardTopY) { - return; - } - - CGFloat difference = rectBottom - keyboardTopY; - - // Maximum height is measured from status bar to keyboard top line - CGFloat maximumHeight = keyboardTopY - 20; - CGFloat currentHeight = CGRectGetHeight(_presentedViewController.view.frame); - CGFloat desiredHeight = (currentHeight > maximumHeight) ? maximumHeight : currentHeight; - - CGFloat yOffset = MAX(currentHeight - maximumHeight, 0); - - CGRect newFrame = CGRectMake(_presentedViewController.view.frame.origin.x, - _presentedViewController.view.frame.origin.y - difference + yOffset, - CGRectGetWidth(_presentedViewController.view.frame), - desiredHeight); - - [UIView animateWithDuration:0.3 - animations:^{ - _presentedViewController.view.frame = newFrame; - }]; -} - -#pragma mark Rotations - -- (UIViewController *)_viewControllerDecidingAboutRotations -{ -#if _INTERNAL_IMP_ENABLED - UIWindow *window = [[UIApplication sharedApplication] keyWindow]; - UIViewController *viewController = window.rootViewController; - SEL viewControllerForSupportedInterfaceOrientationsSelector = - NSSelectorFromString(@"_viewControllerForSupportedInterfaceOrientations"); - if ([viewController respondsToSelector:viewControllerForSupportedInterfaceOrientationsSelector]) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - viewController = [viewController performSelector:viewControllerForSupportedInterfaceOrientationsSelector]; -#pragma clang diagnostic pop - } - return viewController; -#else - return self; -#endif // _INTERNAL_IMP_ENABLED -} - -- (UIInterfaceOrientationMask)supportedInterfaceOrientations -{ - UIViewController *viewControllerToAsk = [self _viewControllerDecidingAboutRotations]; - UIInterfaceOrientationMask supportedOrientations = UIInterfaceOrientationMaskAll; - if (viewControllerToAsk && viewControllerToAsk != self) { - supportedOrientations = [viewControllerToAsk supportedInterfaceOrientations]; - } - - return supportedOrientations; -} - -- (BOOL)shouldAutorotate -{ - UIViewController *viewControllerToAsk = [self _viewControllerDecidingAboutRotations]; - BOOL shouldAutorotate = YES; - if (viewControllerToAsk && viewControllerToAsk != self) { - shouldAutorotate = [viewControllerToAsk shouldAutorotate]; - } - return shouldAutorotate; -} - -- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation - duration:(NSTimeInterval)duration -{ - // We did rotate, we should update frame of contained window (it was depending on bounds) - CGSize adjustedSize = CGSizeMake(MIN(_size.width, CGRectGetWidth(self.view.bounds)), - MIN(_size.height, CGRectGetHeight(self.view.bounds))); - - CGFloat widthOffset = MIN(_presentedViewController.view.frame.origin.x, - CGRectGetWidth(self.view.bounds) - adjustedSize.width); - CGFloat heightOffset = MIN(_presentedViewController.view.frame.origin.y, - CGRectGetHeight(self.view.bounds) - adjustedSize.height); - - CGRect frame = CGRectMake(widthOffset, heightOffset, adjustedSize.width, adjustedSize.height); - - [UIView animateWithDuration:duration animations:^{ - _presentedViewController.view.frame = frame; - }]; - -} - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h deleted file mode 100644 index f163034..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -/** - View Controller put into FBMemoryProfilerContainerViewController should implement this protocol. - It's what container will use to interact with the view controller, inform him when it's being - moved, etc. - */ - -@protocol FBMemoryProfilerMovableViewController - -/** - Container will move view controller (either by pan or pinch). - */ -- (void)containerWillMove:(nonnull UIViewController *)container; - -/** - Should view should stretch on pinch? - */ -- (BOOL)shouldStretchInMovableContainer; - -/** - @return minimum height that view controllers must have - */ -- (CGFloat)minimumHeightInMovableContainer; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.h deleted file mode 100644 index d5bf26b..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.h +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import -#import - -#import "FBMemoryProfilerWindowTouchesHandling.h" - -/** - Window that FBMemoryProfiler will reside in. - */ -@interface FBMemoryProfilerWindow : UIWindow - -/** - Whenever we receive a touch event, window needs to ask delegate if this event should be captured. - */ -@property (nonatomic, weak, nullable) id touchesDelegate; - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.m b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.m deleted file mode 100644 index 0b72065..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.m +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import "FBMemoryProfilerWindow.h" - -#import "FBMemoryProfiler.h" - -@implementation FBMemoryProfilerWindow - -- (instancetype)initWithFrame:(CGRect)frame -{ - if (self = [super initWithFrame:frame]) { - self.backgroundColor = [UIColor clearColor]; - - /** - Window level will determine how on top we want to appear in window hierarchy. - We do not want to hide alerts, but we want to be pretty much above everything else. - */ - self.windowLevel = UIWindowLevelStatusBar + 100; - } - - return self; -} - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event -{ - if ([_touchesDelegate window:self shouldReceiveTouchAtPoint:point]) { - return [super pointInside:point withEvent:event]; - } - - return NO; -} - -#if _INTERNAL_IMP_ENABLED - -- (BOOL)_canAffectStatusBarAppearance -{ - return NO; -} - -- (BOOL)_canBecomeKeyWindow -{ - return NO; -} - -#endif // _INTERNAL_IMP_ENABLED - -@end diff --git a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h b/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h deleted file mode 100644 index 14841d7..0000000 --- a/Pods/FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the license found in the LICENSE file in - * the root directory of this source tree. - */ - -#import - -@protocol FBMemoryProfilerWindowTouchesHandling - -- (BOOL)window:(nullable UIWindow *)window shouldReceiveTouchAtPoint:(CGPoint)point; - -@end diff --git a/Pods/FBMemoryProfiler/LICENSE b/Pods/FBMemoryProfiler/LICENSE deleted file mode 100644 index aca9b42..0000000 --- a/Pods/FBMemoryProfiler/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -LICENSE AGREEMENT - -For FBMemoryProfiler software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. - -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. diff --git a/Pods/FBMemoryProfiler/README.md b/Pods/FBMemoryProfiler/README.md deleted file mode 100644 index a651cca..0000000 --- a/Pods/FBMemoryProfiler/README.md +++ /dev/null @@ -1,78 +0,0 @@ -# FBMemoryProfiler -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![CocoaPods](https://img.shields.io/cocoapods/v/FBMemoryProfiler.svg?maxAge=2592000)]() - - -An iOS library providing developer tools for browsing objects in memory over time, using [FBAllocationTracker](https://github.com/facebook/FBAllocationTracker) and [FBRetainCycleDetector](https://github.com/facebook/FBRetainCycleDetector). - -## About - -This library shows how `FBAllocationTracker` and `FBRetainCycleDetector` can cooperate together, and how they can be used in real app. - -It uses [FBAllocationTracker](https://github.com/facebook/FBAllocationTracker) to gather information about the objects. -It supports [generations](https://github.com/facebook/FBAllocationTracker#generations) and [retain cycle detection](https://github.com/facebook/FBRetainCycleDetector). - -Here is a small demo (project is [available in Example directory](Example/)) - - - -## Installation - -### Carthage - -To your Cartfile add: - - github "facebook/FBMemoryProfiler" - -`FBMemoryProfiler` is built out from non-debug builds, so when you want to test it, use - - carthage update --configuration Debug - -### CocoaPods - -To your podspec add: - - pod 'FBMemoryProfiler' - -You'll be able to use `FBMemoryProfiler` fully only in `Debug` builds. This is controlled by [compilation flag](FBMemoryProfiler/FBMemoryProfiler.h#L29) that can be provided to the build to make it work in other configurations. - -## Usage - -To start using `FBMemoryProfiler` you'll first need to enable `FBAllocationTracker`. - -```objc -#import - -int main(int argc, char * argv[]) { - [[FBAllocationTrackerManager sharedManager] startTrackingAllocations]; - [[FBAllocationTrackerManager sharedManager] enableGenerations]; - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} -``` - -To enable memory profiler: - -```objc -FBMemoryProfiler *memoryProfiler = [FBMemoryProfiler new]; -[memoryProfiler enable]; -``` - -`FBMemoryProfiler` will show up as a button on the screen. Once tapped, it will open memory profiler in full size mode. - -We can also define plugins (check below) and [filters for retain cycle detector](https://github.com/facebook/FBRetainCycleDetector#filters), that we pass to configuration. - -```objc -_memoryProfiler = [[FBMemoryProfiler alloc] initWithPlugins:@[[IncredibleCacheCleaningPlugin new], - [AwesomeLoggerPlugin new]] - retainCycleDetectorConfiguration:someConfigurationWithCustomFilters; -[_memoryProfiler enable]; -``` - -## Plugins - -Plugins are objects that conform to [FBMemoryProfilerPluggable](FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h) protocol. Example usage: [custom cache cleaners](Example/ExampleApp/CacheCleanerPlugin.h), [loggers that log data to server](Example/ExampleApp/RetainCycleLoggerPlugin.h). - -## Contributing -See the [CONTRIBUTING](CONTRIBUTING.md) file for how to help out. diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.h index 17c2c0c..f86992c 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.h @@ -21,10 +21,7 @@ FOUNDATION_EXPORT const unsigned char FBRetainCycleDetectorVersionString[]; #import "FBObjectiveCNSCFTimer.h" #import "FBObjectiveCObject.h" #import "FBObjectGraphConfiguration.h" -#import "FBParsedStruct.h" -#import "FBParsedType.h" #import "FBStandardGraphEdgeFilters.h" -#import "FBStructEncodingParser.h" /** Retain Cycle Detector is enabled by default in DEBUG builds, but you can also force it in other builds by diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm index 362e211..4ecef93 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm @@ -45,8 +45,10 @@ - (instancetype)init - (void)addCandidate:(id)candidate { - FBObjectiveCGraphElement *graphElement = FBWrapObjectGraphElement(candidate, _configuration); - [_candidates addObject:graphElement]; + FBObjectiveCGraphElement *graphElement = FBWrapObjectGraphElement(nil, candidate, _configuration); + if (graphElement) { + [_candidates addObject:graphElement]; + } } - (NSSet *> *)findRetainCycles diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.h index 62cc656..763a7b2 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.h @@ -20,11 +20,13 @@ extern "C" { Wrapper functions, for given object they will categorize it and create proper Graph Element subclass instance for it. */ -FBObjectiveCGraphElement *FBWrapObjectGraphElementWithContext(id object, - FBObjectGraphConfiguration *configuration, - NSArray *namePath); -FBObjectiveCGraphElement *FBWrapObjectGraphElement(id object, - FBObjectGraphConfiguration *configuration); +FBObjectiveCGraphElement *_Nullable FBWrapObjectGraphElementWithContext(FBObjectiveCGraphElement *_Nullable sourceElement, + id _Nullable object, + FBObjectGraphConfiguration *_Nullable configuration, + NSArray *_Nullable namePath); +FBObjectiveCGraphElement *_Nullable FBWrapObjectGraphElement(FBObjectiveCGraphElement *_Nullable sourceElement, + id _Nullable object, + FBObjectGraphConfiguration *_Nullable configuration); #ifdef __cplusplus } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.m index f690865..7934fc6 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.m +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/FBRetainCycleUtils.m @@ -19,9 +19,27 @@ #import "FBObjectiveCObject.h" #import "FBObjectGraphConfiguration.h" -FBObjectiveCGraphElement *FBWrapObjectGraphElementWithContext(id object, +static BOOL _ShouldBreakGraphEdge(FBObjectGraphConfiguration *configuration, + FBObjectiveCGraphElement *fromObject, + NSString *byIvar, + Class toObjectOfClass) { + for (FBGraphEdgeFilterBlock filterBlock in configuration.filterBlocks) { + if (filterBlock(fromObject, byIvar, toObjectOfClass) == FBGraphEdgeInvalid) { + return YES; + } + } + + return NO; +} + +FBObjectiveCGraphElement *FBWrapObjectGraphElementWithContext(FBObjectiveCGraphElement *sourceElement, + id object, FBObjectGraphConfiguration *configuration, NSArray *namePath) { + if (_ShouldBreakGraphEdge(configuration, sourceElement, [namePath firstObject], object_getClass(object))) { + return nil; + } + if (FBObjectIsBlock((__bridge void *)object)) { return [[FBObjectiveCBlock alloc] initWithObject:object configuration:configuration @@ -40,7 +58,8 @@ } } -FBObjectiveCGraphElement *FBWrapObjectGraphElement(id object, +FBObjectiveCGraphElement *FBWrapObjectGraphElement(FBObjectiveCGraphElement *sourceElement, + id object, FBObjectGraphConfiguration *configuration) { - return FBWrapObjectGraphElementWithContext(object, configuration, nil); + return FBWrapObjectGraphElementWithContext(sourceElement, object, configuration, nil); } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm index 051ecdf..0a88d90 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm @@ -23,12 +23,12 @@ FBGraphEdgeFilterBlock FBFilterBlockWithObjectIvarRelation(Class aCls, NSString FBGraphEdgeFilterBlock FBFilterBlockWithObjectToManyIvarsRelation(Class aCls, NSSet *ivarNames) { return ^(FBObjectiveCGraphElement *fromObject, - FBObjectiveCGraphElement *toObject){ + NSString *byIvar, + Class toObjectOfClass){ if (aCls && [[fromObject objectClass] isSubclassOfClass:aCls]) { // If graph element holds metadata about an ivar, it will be held in the name path, as early as possible - NSString *ivarName = [[toObject namePath] objectAtIndex:0]; - if ([ivarNames containsObject:ivarName]) { + if ([ivarNames containsObject:byIvar]) { return FBGraphEdgeInvalid; } } @@ -38,10 +38,11 @@ FBGraphEdgeFilterBlock FBFilterBlockWithObjectToManyIvarsRelation(Class aCls, FBGraphEdgeFilterBlock FBFilterBlockWithObjectIvarObjectRelation(Class fromClass, NSString *ivarName, Class toClass) { return ^(FBObjectiveCGraphElement *fromObject, - FBObjectiveCGraphElement *toObject) { + NSString *byIvar, + Class toObjectOfClass) { if (toClass && - [[toObject objectClass] isSubclassOfClass:toClass]) { - return FBFilterBlockWithObjectIvarRelation(fromClass, ivarName)(fromObject, toObject); + [toObjectOfClass isSubclassOfClass:toClass]) { + return FBFilterBlockWithObjectIvarRelation(fromClass, ivarName)(fromObject, byIvar, toObjectOfClass); } return FBGraphEdgeValid; }; diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h index e9744ba..6c6cd54 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h @@ -16,13 +16,16 @@ typedef NS_ENUM(NSUInteger, FBGraphEdgeType) { FBGraphEdgeInvalid, }; +@protocol FBObjectReference; + /** Every filter has to be of type FBGraphEdgeFilterBlock. Filter, given two object graph elements, it should decide, whether a reference between them should be filtered out or not. @see FBGetStandardGraphEdgeFilters() */ typedef FBGraphEdgeType (^FBGraphEdgeFilterBlock)(FBObjectiveCGraphElement *_Nullable fromObject, - FBObjectiveCGraphElement *_Nullable toObject); + NSString *_Nullable byIvar, + Class _Nullable toObjectOfClass); /** FBObjectGraphConfiguration represents a configuration for object graph walking. @@ -49,6 +52,12 @@ typedef FBGraphEdgeType (^FBGraphEdgeFilterBlock)(FBObjectiveCGraphElement *_Nul */ @property (nonatomic, readonly) BOOL shouldInspectTimers; +/** + Will cache layout + */ +@property (nonatomic, readonly, nullable) NSMutableDictionary> *> *layoutCache; +@property (nonatomic, readonly) BOOL shouldCacheLayouts; + - (nonnull instancetype)initWithFilterBlocks:(nonnull NSArray *)filterBlocks shouldInspectTimers:(BOOL)shouldInspectTimers NS_DESIGNATED_INITIALIZER; diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m index 27a826f..d4ef131 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m @@ -17,6 +17,7 @@ - (instancetype)initWithFilterBlocks:(NSArray *)filterBl if (self = [super init]) { _filterBlocks = [filterBlocks copy]; _shouldInspectTimers = shouldInspectTimers; + _layoutCache = [NSMutableDictionary new]; } return self; diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCBlock.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCBlock.m index 47f0bcd..128c30a 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCBlock.m +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCBlock.m @@ -18,12 +18,6 @@ @implementation FBObjectiveCBlock - (NSSet *)allRetainedObjects -{ - NSArray *unfiltered = [self _unfilteredRetainedObjects]; - return [self filterObjects:unfiltered]; -} - -- (NSArray *)_unfilteredRetainedObjects { NSMutableArray *results = [[[super allRetainedObjects] allObjects] mutableCopy]; @@ -35,10 +29,13 @@ - (NSArray *)_unfilteredRetainedObjects NSArray *allRetainedReferences = FBGetBlockStrongReferences(blockObjectReference); for (id object in allRetainedReferences) { - [results addObject:FBWrapObjectGraphElement(object, self.configuration)]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElement(self, object, self.configuration); + if (element) { + [results addObject:element]; + } } - return results; + return [NSSet setWithArray:results]; } @end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h index a81f803..38d0f12 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h @@ -48,14 +48,6 @@ */ - (nullable NSSet *)allRetainedObjects; -/** - Filter objects using filter provider. - - @param objects Objects to be filtered that are references from this object - @return NSSet of filtered objects - */ -- (nonnull NSSet *)filterObjects:(nullable NSArray *)objects; - /** @return address of the object represented by this element */ diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.m deleted file mode 100644 index efac260..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.m +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBObjectiveCGraphElement+Internal.h" - -#import -#import - -#import "FBAssociationManager.h" -#import "FBClassStrongLayout.h" -#import "FBObjectGraphConfiguration.h" -#import "FBRetainCycleUtils.h" -#import "FBRetainCycleDetector.h" - -@implementation FBObjectiveCGraphElement - -- (instancetype)initWithObject:(id)object -{ - return [self initWithObject:object - configuration:[FBObjectGraphConfiguration new]]; -} - -- (instancetype)initWithObject:(id)object - configuration:(nonnull FBObjectGraphConfiguration *)configuration -{ - return [self initWithObject:object - configuration:configuration - namePath:nil]; -} - -- (instancetype)initWithObject:(id)object - configuration:(nonnull FBObjectGraphConfiguration *)configuration - namePath:(NSArray *)namePath -{ - if (self = [super init]) { -#if _INTERNAL_RCD_ENABLED - // We are trying to mimic how ObjectiveC does storeWeak to not fall into - // _objc_fatal path - // https://github.com/bavarious/objc4/blob/3f282b8dbc0d1e501f97e4ed547a4a99cb3ac10b/runtime/objc-weak.mm#L369 - - Class aCls = object_getClass(object); - BOOL (*allowsWeakReference)(id, SEL) = - (__typeof__(allowsWeakReference))class_getMethodImplementation(aCls, @selector(allowsWeakReference)); - - if (allowsWeakReference && (IMP)allowsWeakReference != _objc_msgForward) { - if (allowsWeakReference(object, @selector(allowsWeakReference))) { - // This is still racey since allowsWeakReference could change it value by now. - _object = object; - } - } else { - _object = object; - } -#endif - _namePath = namePath; - _configuration = configuration; - } - - return self; -} - -- (NSSet *)allRetainedObjects -{ - NSArray *retainedObjectsNotWrapped = [FBAssociationManager associationsForObject:_object]; - NSMutableSet *retainedObjects = [NSMutableSet new]; - - for (id obj in retainedObjectsNotWrapped) { - [retainedObjects addObject:FBWrapObjectGraphElementWithContext(obj, - _configuration, - @[@"__associated_object"])]; - } - - return retainedObjects; -} - -- (NSSet *)filterObjects:(NSArray *)objects -{ - NSMutableSet *filtered = [NSMutableSet new]; - - for (FBObjectiveCGraphElement *reference in objects) { - if (![self _shouldBreakGraphEdgeFromObject:self - toObject:reference]) { - [filtered addObject:reference]; - } - } - - return filtered; -} - -- (BOOL)_shouldBreakGraphEdgeFromObject:(FBObjectiveCGraphElement *)fromObject - toObject:(FBObjectiveCGraphElement *)toObject -{ - for (FBGraphEdgeFilterBlock filterBlock in _configuration.filterBlocks) { - if (filterBlock(fromObject, toObject) == FBGraphEdgeInvalid) { - return YES; - } - } - - return NO; -} - -- (BOOL)isEqual:(id)object -{ - if ([object isKindOfClass:[FBObjectiveCGraphElement class]]) { - FBObjectiveCGraphElement *objcObject = object; - // Use pointer equality - return objcObject.object == _object; - } - return NO; -} - -- (NSUInteger)hash -{ - return (size_t)_object; -} - -- (NSString *)description -{ - if (_namePath) { - NSString *namePathStringified = [_namePath componentsJoinedByString:@" -> "]; - return [NSString stringWithFormat:@"-> %@ -> %@ ", namePathStringified, object_getClass(_object)]; - } - return [NSString stringWithFormat:@"-> %@ ", object_getClass(_object)]; -} - -- (size_t)objectAddress -{ - return (size_t)_object; -} - -- (NSString *)classNameOrNull -{ - NSString *className = NSStringFromClass(object_getClass(_object)); - if (!className) { - className = @"Null"; - } - - return className; -} - -- (Class)objectClass -{ - return object_getClass(_object); -} - -@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.mm new file mode 100644 index 0000000..6e962a6 --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.mm @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBObjectiveCGraphElement+Internal.h" + +#import +#import + +#import "FBAssociationManager.h" +#import "FBClassStrongLayout.h" +#import "FBObjectGraphConfiguration.h" +#import "FBRetainCycleUtils.h" +#import "FBRetainCycleDetector.h" + +@implementation FBObjectiveCGraphElement + +- (instancetype)initWithObject:(id)object +{ + return [self initWithObject:object + configuration:[FBObjectGraphConfiguration new]]; +} + +- (instancetype)initWithObject:(id)object + configuration:(nonnull FBObjectGraphConfiguration *)configuration +{ + return [self initWithObject:object + configuration:configuration + namePath:nil]; +} + +- (instancetype)initWithObject:(id)object + configuration:(nonnull FBObjectGraphConfiguration *)configuration + namePath:(NSArray *)namePath +{ + if (self = [super init]) { +#if _INTERNAL_RCD_ENABLED + // We are trying to mimic how ObjectiveC does storeWeak to not fall into + // _objc_fatal path + // https://github.com/bavarious/objc4/blob/3f282b8dbc0d1e501f97e4ed547a4a99cb3ac10b/runtime/objc-weak.mm#L369 + + Class aCls = object_getClass(object); + + BOOL (*allowsWeakReference)(id, SEL) = + (__typeof__(allowsWeakReference))class_getMethodImplementation(aCls, @selector(allowsWeakReference)); + + if (allowsWeakReference && (IMP)allowsWeakReference != _objc_msgForward) { + if (allowsWeakReference(object, @selector(allowsWeakReference))) { + // This is still racey since allowsWeakReference could change it value by now. + _object = object; + } + } else { + _object = object; + } +#endif + _namePath = namePath; + _configuration = configuration; + } + + return self; +} + +- (NSSet *)allRetainedObjects +{ + NSArray *retainedObjectsNotWrapped = [FBAssociationManager associationsForObject:_object]; + NSMutableSet *retainedObjects = [NSMutableSet new]; + + for (id obj in retainedObjectsNotWrapped) { + FBObjectiveCGraphElement *element = FBWrapObjectGraphElementWithContext(self, + obj, + _configuration, + @[@"__associated_object"]); + if (element) { + [retainedObjects addObject:element]; + } + } + + return retainedObjects; +} + +- (BOOL)isEqual:(id)object +{ + if ([object isKindOfClass:[FBObjectiveCGraphElement class]]) { + FBObjectiveCGraphElement *objcObject = object; + // Use pointer equality + return objcObject.object == _object; + } + return NO; +} + +- (NSUInteger)hash +{ + return (size_t)_object; +} + +- (NSString *)description +{ + if (_namePath) { + NSString *namePathStringified = [_namePath componentsJoinedByString:@" -> "]; + return [NSString stringWithFormat:@"-> %@ -> %@ ", namePathStringified, object_getClass(_object)]; + } + return [NSString stringWithFormat:@"-> %@ ", object_getClass(_object)]; +} + +- (size_t)objectAddress +{ + return (size_t)_object; +} + +- (NSString *)classNameOrNull +{ + NSString *className = NSStringFromClass(object_getClass(_object)); + if (!className) { + className = @"Null"; + } + + return className; +} + +- (Class)objectClass +{ + return object_getClass(_object); +} + +@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCObject.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCObject.m index 35cfba9..a269401 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCObject.m +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/FBObjectiveCObject.m @@ -12,25 +12,20 @@ #import #import "FBClassStrongLayout.h" +#import "FBObjectGraphConfiguration.h" #import "FBObjectReference.h" #import "FBRetainCycleUtils.h" @implementation FBObjectiveCObject - (NSSet *)allRetainedObjects -{ - NSArray *unfiltered = [self _unfilteredRetainedObjects]; - return [self filterObjects:unfiltered]; -} - -- (NSArray *)_unfilteredRetainedObjects { Class aCls = object_getClass(self.object); if (!self.object || !aCls) { return nil; } - NSArray *strongIvars = FBGetObjectStrongReferences(self.object); + NSArray *strongIvars = FBGetObjectStrongReferences(self.object, self.configuration.layoutCache); NSMutableArray *retainedObjects = [[[super allRetainedObjects] allObjects] mutableCopy]; @@ -39,9 +34,13 @@ - (NSArray *)_unfilteredRetainedObjects if (referencedObject) { NSArray *namePath = [ref namePath]; - [retainedObjects addObject:FBWrapObjectGraphElementWithContext(referencedObject, - self.configuration, - namePath)]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElementWithContext(self, + referencedObject, + self.configuration, + namePath); + if (element) { + [retainedObjects addObject:element]; + } } } @@ -51,7 +50,7 @@ - (NSArray *)_unfilteredRetainedObjects will hold only Objective-C objects. We are not able to check in runtime what callbacks it uses to retain/release (if any) and we could easily crash here. */ - return retainedObjects; + return [NSSet setWithArray:retainedObjects]; } if (class_isMetaClass(aCls)) { @@ -81,11 +80,18 @@ - (NSArray *)_unfilteredRetainedObjects @try { for (id subobject in self.object) { if (retainsKeys) { - [temporaryRetainedObjects addObject:FBWrapObjectGraphElement(subobject, self.configuration)]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElement(self, subobject, self.configuration); + if (element) { + [temporaryRetainedObjects addObject:element]; + } } if (isKeyValued && retainsValues) { - [temporaryRetainedObjects addObject:FBWrapObjectGraphElement([self.object objectForKey:subobject], - self.configuration)]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElement(self, + [self.object objectForKey:subobject], + self.configuration); + if (element) { + [temporaryRetainedObjects addObject:element]; + } } } } @@ -100,7 +106,7 @@ - (NSArray *)_unfilteredRetainedObjects } } - return retainedObjects; + return [NSSet setWithArray:retainedObjects]; } - (BOOL)_objectRetainsEnumerableValues diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm index 23afc11..7a21f30 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm @@ -43,10 +43,16 @@ - (NSSet *)allRetainedObjects if (context.info && context.retain) { _FBNSCFTimerInfoStruct infoStruct = *(_FBNSCFTimerInfoStruct *)(context.info); if (infoStruct.target) { - [retained addObject:FBWrapObjectGraphElementWithContext(infoStruct.target, self.configuration, @[@"target"])]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElementWithContext(self, infoStruct.target, self.configuration, @[@"target"]); + if (element) { + [retained addObject:element]; + } } if (infoStruct.userInfo) { - [retained addObject:FBWrapObjectGraphElementWithContext(infoStruct.userInfo, self.configuration, @[@"userInfo"])]; + FBObjectiveCGraphElement *element = FBWrapObjectGraphElementWithContext(self, infoStruct.userInfo, self.configuration, @[@"userInfo"]); + if (element) { + [retained addObject:element]; + } } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h index 03b507e..4ddaf81 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h @@ -24,7 +24,8 @@ NSArray> *_Nonnull FBGetClassReferences(__unsafe_unretaine @return An array of id objects that will have only those references that are retained by the object. It also goes through parent classes. */ -NSArray> *_Nonnull FBGetObjectStrongReferences(id _Nullable obj); +NSArray> *_Nonnull FBGetObjectStrongReferences(id _Nullable obj, + NSMutableDictionary> *> *_Nullable layoutCache); #ifdef __cplusplus } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.m deleted file mode 100644 index a3bf8e3..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.m +++ /dev/null @@ -1,184 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBClassStrongLayout.h" - -#import -#import - -#import - -#import "FBIvarReference.h" -#import "FBObjectInStructReference.h" -#import "FBStructEncodingParser.h" - -/** - If we stumble upon a struct, we need to go through it and check if it doesn't retain some objects. - */ -static NSArray *FBGetReferencesForObjectsInStructEncoding(FBIvarReference *ivar, NSString *encoding) { - NSMutableArray *references = [NSMutableArray new]; - - FBParsedStruct *parsedStruct = FBParseStructEncodingWithName(encoding, - ivar.name); - NSArray *types = [parsedStruct flattenTypes]; - - ptrdiff_t offset = ivar.offset; - - for (FBParsedType *typeEncoding in types) { - NSUInteger size, align; - - if ([typeEncoding.typeEncoding hasPrefix:@"^"]) { - // It's a pointer, let's skip - size = sizeof(void *); - align = _Alignof(void *); - } else { - @try { - const char *encodingString = [typeEncoding.typeEncoding UTF8String]; - NSGetSizeAndAlignment(encodingString, - &size, - &align); - } @catch (NSException *e) { - /** - If we failed, we probably have C++ and ObjC cannot get it's size and alignment. We are skipping. - If we would like to support it, we would need to derive size and alignment of type from the string. - C++ does not have reflection so we can't really do that unless we create the mapping ourselves. - */ - return nil; - } - } - - - // The object must be aligned - NSUInteger overAlignment = offset % align; - NSUInteger whatsMissing = (overAlignment == 0) ? 0 : align - overAlignment; - offset += whatsMissing; - - if ([typeEncoding.typeEncoding hasPrefix:@"@"]) { - // The index that ivar layout will ask for is going to be aligned with pointer size - - // Prepare additional context - NSString *typeEncodingName = typeEncoding.name; - NSArray *namePath = typeEncoding.typePath; - if (typeEncodingName) { - namePath = [namePath arrayByAddingObject:typeEncodingName]; - } - [references addObject:[[FBObjectInStructReference alloc] initWithIndex:(offset / sizeof(void *)) - namePath:namePath]]; - } - - offset += size; - } - - return references; -} - -NSArray> *FBGetClassReferences(Class aCls) { - NSMutableArray> *result = [NSMutableArray new]; - - unsigned int count; - Ivar *ivars = class_copyIvarList(aCls, &count); - - for (unsigned int i = 0; i < count; ++i) { - Ivar ivar = ivars[i]; - FBIvarReference *wrapper = [[FBIvarReference alloc] initWithIvar:ivar]; - - if (wrapper.type == FBStructType) { - NSString *encoding = @(ivar_getTypeEncoding(wrapper.ivar)); - NSArray *references = FBGetReferencesForObjectsInStructEncoding(wrapper, encoding); - - [result addObjectsFromArray:references]; - } else { - [result addObject:wrapper]; - } - } - free(ivars); - - return [result copy]; -} - -static NSIndexSet *FBGetLayoutAsIndexesForDescription(NSUInteger minimumIndex, const uint8_t *layoutDescription) { - NSMutableIndexSet *interestingIndexes = [NSMutableIndexSet new]; - NSUInteger currentIndex = minimumIndex; - - while (*layoutDescription != '\x00') { - int upperNibble = (*layoutDescription & 0xf0) >> 4; - int lowerNibble = *layoutDescription & 0xf; - - // Upper nimble is for skipping - currentIndex += upperNibble; - - // Lower nimble describes count - [interestingIndexes addIndexesInRange:NSMakeRange(currentIndex, lowerNibble)]; - currentIndex += lowerNibble; - - ++layoutDescription; - } - - return interestingIndexes; -} - -static NSUInteger FBGetMinimumIvarIndex(__unsafe_unretained Class aCls) { - NSUInteger minimumIndex = 1; - unsigned int count; - Ivar *ivars = class_copyIvarList(aCls, &count); - - if (count > 0) { - Ivar ivar = ivars[0]; - ptrdiff_t offset = ivar_getOffset(ivar); - minimumIndex = offset / (sizeof(void *)); - } - - free(ivars); - - return minimumIndex; -} - -static NSArray> *FBGetStrongReferencesForClass(Class aCls) { - NSArray> *ivars = [FBGetClassReferences(aCls) filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { - if ([evaluatedObject isKindOfClass:[FBIvarReference class]]) { - FBIvarReference *wrapper = evaluatedObject; - return wrapper.type != FBUnknownType; - } - return YES; - }]]; - - const uint8_t *fullLayout = class_getIvarLayout(aCls); - - if (!fullLayout) { - return nil; - } - - NSUInteger minimumIndex = FBGetMinimumIvarIndex(aCls); - NSIndexSet *parsedLayout = FBGetLayoutAsIndexesForDescription(minimumIndex, fullLayout); - - NSArray> *filteredIvars = - [ivars filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, - NSDictionary *bindings) { - return [parsedLayout containsIndex:[evaluatedObject indexInIvarLayout]]; - }]]; - - return filteredIvars; -} - -NSArray> *FBGetObjectStrongReferences(id obj) { - NSMutableArray> *array = [NSMutableArray new]; - - __unsafe_unretained Class previousClass = nil; - __unsafe_unretained Class currentClass = object_getClass(obj); - - while (previousClass != currentClass) { - NSArray> *ivars = FBGetStrongReferencesForClass(currentClass); - [array addObjectsFromArray:ivars]; - - previousClass = currentClass; - currentClass = class_getSuperclass(currentClass); - } - - return [array copy]; -} diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm new file mode 100644 index 0000000..6601a85 --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm @@ -0,0 +1,212 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "FBClassStrongLayout.h" + +#import +#import +#import +#import + +#import + +#import "FBIvarReference.h" +#import "FBObjectInStructReference.h" +#import "FBStructEncodingParser.h" +#import "Struct.h" +#import "Type.h" + +/** + If we stumble upon a struct, we need to go through it and check if it doesn't retain some objects. + */ +static NSArray *FBGetReferencesForObjectsInStructEncoding(FBIvarReference *ivar, std::string encoding) { + NSMutableArray *references = [NSMutableArray new]; + + std::string ivarName = std::string([ivar.name cStringUsingEncoding:NSUTF8StringEncoding]); + FB::RetainCycleDetector::Parser::Struct parsedStruct = + FB::RetainCycleDetector::Parser::parseStructEncodingWithName(encoding, ivarName); + + std::vector> types = parsedStruct.flattenTypes(); + + ptrdiff_t offset = ivar.offset; + + for (auto &type: types) { + NSUInteger size, align; + + std::string typeEncoding = type->typeEncoding; + if (typeEncoding[0] == '^') { + // It's a pointer, let's skip + size = sizeof(void *); + align = _Alignof(void *); + } else { + @try { + NSGetSizeAndAlignment(typeEncoding.c_str(), + &size, + &align); + } @catch (NSException *e) { + /** + If we failed, we probably have C++ and ObjC cannot get it's size and alignment. We are skipping. + If we would like to support it, we would need to derive size and alignment of type from the string. + C++ does not have reflection so we can't really do that unless we create the mapping ourselves. + */ + break; + } + } + + + // The object must be aligned + NSUInteger overAlignment = offset % align; + NSUInteger whatsMissing = (overAlignment == 0) ? 0 : align - overAlignment; + offset += whatsMissing; + + if (typeEncoding[0] == '@') { + + // The index that ivar layout will ask for is going to be aligned with pointer size + + // Prepare additional context + NSString *typeEncodingName = [NSString stringWithCString:type->name.c_str() encoding:NSUTF8StringEncoding]; + + NSMutableArray *namePath = [NSMutableArray new]; + + for (auto &name: type->typePath) { + NSString *nameString = [NSString stringWithCString:name.c_str() encoding:NSUTF8StringEncoding]; + if (nameString) { + [namePath addObject:nameString]; + } + } + + if (typeEncodingName) { + [namePath addObject:typeEncodingName]; + } + [references addObject:[[FBObjectInStructReference alloc] initWithIndex:(offset / sizeof(void *)) + namePath:namePath]]; + } + + offset += size; + } + + return references; +} + +NSArray> *FBGetClassReferences(Class aCls) { + NSMutableArray> *result = [NSMutableArray new]; + + unsigned int count; + Ivar *ivars = class_copyIvarList(aCls, &count); + + for (unsigned int i = 0; i < count; ++i) { + Ivar ivar = ivars[i]; + FBIvarReference *wrapper = [[FBIvarReference alloc] initWithIvar:ivar]; + + if (wrapper.type == FBStructType) { + std::string encoding = std::string(ivar_getTypeEncoding(wrapper.ivar)); + NSArray *references = FBGetReferencesForObjectsInStructEncoding(wrapper, encoding); + + [result addObjectsFromArray:references]; + } else { + [result addObject:wrapper]; + } + } + free(ivars); + + return [result copy]; +} + +static NSIndexSet *FBGetLayoutAsIndexesForDescription(NSUInteger minimumIndex, const uint8_t *layoutDescription) { + NSMutableIndexSet *interestingIndexes = [NSMutableIndexSet new]; + NSUInteger currentIndex = minimumIndex; + + while (*layoutDescription != '\x00') { + int upperNibble = (*layoutDescription & 0xf0) >> 4; + int lowerNibble = *layoutDescription & 0xf; + + // Upper nimble is for skipping + currentIndex += upperNibble; + + // Lower nimble describes count + [interestingIndexes addIndexesInRange:NSMakeRange(currentIndex, lowerNibble)]; + currentIndex += lowerNibble; + + ++layoutDescription; + } + + return interestingIndexes; +} + +static NSUInteger FBGetMinimumIvarIndex(__unsafe_unretained Class aCls) { + NSUInteger minimumIndex = 1; + unsigned int count; + Ivar *ivars = class_copyIvarList(aCls, &count); + + if (count > 0) { + Ivar ivar = ivars[0]; + ptrdiff_t offset = ivar_getOffset(ivar); + minimumIndex = offset / (sizeof(void *)); + } + + free(ivars); + + return minimumIndex; +} + +static NSArray> *FBGetStrongReferencesForClass(Class aCls) { + NSArray> *ivars = [FBGetClassReferences(aCls) filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { + if ([evaluatedObject isKindOfClass:[FBIvarReference class]]) { + FBIvarReference *wrapper = evaluatedObject; + return wrapper.type != FBUnknownType; + } + return YES; + }]]; + + const uint8_t *fullLayout = class_getIvarLayout(aCls); + + if (!fullLayout) { + return nil; + } + + NSUInteger minimumIndex = FBGetMinimumIvarIndex(aCls); + NSIndexSet *parsedLayout = FBGetLayoutAsIndexesForDescription(minimumIndex, fullLayout); + + NSArray> *filteredIvars = + [ivars filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, + NSDictionary *bindings) { + return [parsedLayout containsIndex:[evaluatedObject indexInIvarLayout]]; + }]]; + + return filteredIvars; +} + +NSArray> *FBGetObjectStrongReferences(id obj, + NSMutableDictionary> *> *layoutCache) { + NSMutableArray> *array = [NSMutableArray new]; + + __unsafe_unretained Class previousClass = nil; + __unsafe_unretained Class currentClass = object_getClass(obj); + + while (previousClass != currentClass) { + NSArray> *ivars; + + if (layoutCache && currentClass) { + ivars = layoutCache[currentClass]; + } + + if (!ivars) { + ivars = FBGetStrongReferencesForClass(currentClass); + if (layoutCache && currentClass) { + layoutCache[(id)currentClass] = ivars; + } + } + [array addObjectsFromArray:ivars]; + + previousClass = currentClass; + currentClass = class_getSuperclass(currentClass); + } + + return [array copy]; +} diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/BaseType.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/BaseType.h new file mode 100644 index 0000000..026bafd --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/BaseType.h @@ -0,0 +1,30 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +namespace FB { namespace RetainCycleDetector { namespace Parser { + class BaseType { + public: + virtual ~BaseType() {} + }; + + class Unresolved: public BaseType { + public: + std::string value; + Unresolved(std::string value): value(value) {} + Unresolved(Unresolved&&) = default; + Unresolved &operator=(Unresolved&&) = default; + + Unresolved(const Unresolved&) = delete; + Unresolved &operator=(const Unresolved&) = delete; + }; +} } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h deleted file mode 100644 index 53609ba..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import "FBParsedType.h" - -/** - FBParsedStruct will represent a struct parsed by the struct parser. It will hold all types that - the struct has within itself, including nested structs. - */ -@interface FBParsedStruct : FBParsedType - -/** - Type name for a struct is exactly a type of struct. For example: - struct SomeStruct {}; - - has structTypeName: SomeStruct - */ -@property (nonatomic, copy, readonly, nullable) NSString *structTypeName; - -/** - This array will hold all types parser parsed within this struct. - */ -@property (nonatomic, copy, readonly, nonnull) NSArray *typesContainedInStruct; - -- (nonnull instancetype)initWithName:(nullable NSString *)name - typeEncoding:(nonnull NSString *)typeEncoding - structTypeName:(nullable NSString *)structTypeName - typesContainedInStruct:(nonnull NSArray *)typesContainedInStruct; - -/** - To flatten a struct means to literally forgot about nested struct structure. For every struct - it will just retrieve all it's types inside and flatten them. Returned array is guaranteed - to consist only basic types. - */ -- (nonnull NSArray *)flattenTypes; - -@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.m deleted file mode 100644 index 7dde7af..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.m +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBParsedStruct.h" - -@implementation FBParsedStruct - -- (instancetype)initWithName:(NSString *)name - typeEncoding:(NSString *)typeEncoding - structTypeName:(NSString *)structTypeName - typesContainedInStruct:(NSArray *)typesContainedInStruct -{ - if (self = [super initWithName:name - typeEncoding:typeEncoding]) { - _structTypeName = structTypeName; - _typesContainedInStruct = typesContainedInStruct; - } - return self; -} - -- (NSArray *)flattenTypes -{ - NSMutableArray *simpleTypes = [NSMutableArray new]; - - for (id type in _typesContainedInStruct) { - if ([type isKindOfClass:[FBParsedStruct class]]) { - [simpleTypes addObjectsFromArray:[type flattenTypes]]; - } else { - [simpleTypes addObject:type]; - } - } - - return simpleTypes; -} - -- (void)passTypePath:(NSArray *)typePath -{ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wnullable-to-nonnull-conversion" - self.typePath = typePath; - NSMutableArray *typePathToPass = [typePath mutableCopy] ?: [NSMutableArray new]; - if (self.name) { - [typePathToPass addObject:self.name]; - } - if (_structTypeName && ![_structTypeName isEqualToString:@"?"]) { - [typePathToPass addObject:_structTypeName]; - } - for (FBParsedType *type in _typesContainedInStruct) { - [type passTypePath:typePathToPass]; - } -#pragma clang diagnostic pop -} - -@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h deleted file mode 100644 index 1d6bfd3..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -/** - FBParsedType is a class representing a basic token created from struct parser. - */ -@interface FBParsedType : NSObject - -/** - Name inside of struct: - struct SomeStruct { - NSObject *name; <--- this name - }; - */ -@property (nonatomic, copy, readonly, nullable) NSString *name; - -/** - Part of the parsed type encoding responsible for just this type. - */ -@property (nonatomic, copy, readonly, nonnull) NSString *typeEncoding; - -/** - Type Path inside the struct is a naming path that leads to this type. For example: - - struct SomeStruct { - NSObject *object; - } - - struct SomeOtherStruct { - struct SomeStruct someStruct; - } - - If we take an object in context of SomeOtherStruct, then the typePath for this object is: - @[@"SomeOtherStruct", @"someStruct", @"SomeStruct"] - - This is helpful when we are trying to quickly figure out where in the struct should we look for. - */ -@property (nonatomic, copy, nullable) NSArray *typePath; - -- (nonnull instancetype)initWithName:(nullable NSString *)name - typeEncoding:(nonnull NSString *)typeEncoding; - -/** - This is the helper function for passing the type path. Once the parser creates tokens for given struct - encoding, it will call passTypePath on it's root, which should transfer whole path to every object. - */ -- (void)passTypePath:(nullable NSArray *)typePath; - -@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.m b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.m deleted file mode 100644 index a0b6e3a..0000000 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.m +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "FBParsedType.h" - -@implementation FBParsedType -- (instancetype)initWithName:(NSString *)name - typeEncoding:(NSString *)typeEncoding -{ - if (self = [super init]) { - _name = name; - _typeEncoding = typeEncoding; - } - - return self; -} - -- (void)passTypePath:(NSArray *)typePath -{ - _typePath = [typePath copy]; -} - -@end diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h index 96e8c58..ffcf675 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h @@ -9,31 +9,29 @@ #import -#import "FBParsedStruct.h" -#import "FBParsedType.h" +#import "Struct.h" +#import "Type.h" -#ifdef __cplusplus -extern "C" { -#endif - -/** - This function will parse a struct encoding from an ivar, and return an FBParsedStruct instance. - Check FBParsedStruct to learn more on how to interact with it. - - FBParseStructEncoding assumes the string passed to it will be a proper struct encoding. - It will not work with encodings provided by @encode() because they do not add names. - It will work with encodings provided by ivars (ivar_getTypeEncoding) - */ -FBParsedStruct *_Nonnull FBParseStructEncoding(NSString *_Nonnull structEncodingString); - -/** - You can provide name for root struct you are passing. The name will be then used - in typePath (check out FBParsedType for details). - The name here can be for example a name of an ivar with this struct. - */ -FBParsedStruct *_Nonnull FBParseStructEncodingWithName(NSString *_Nonnull structEncodingString, - NSString *_Nullable structName); - -#ifdef __cplusplus -} -#endif +namespace FB { namespace RetainCycleDetector { namespace Parser { + + /** + This function will parse a struct encoding from an ivar, and return an FBParsedStruct instance. + Check FBParsedStruct to learn more on how to interact with it. + + FBParseStructEncoding assumes the string passed to it will be a proper struct encoding. + It will not work with encodings provided by @encode() because they do not add names. + It will work with encodings provided by ivars (ivar_getTypeEncoding) + */ + Struct parseStructEncoding(const std::string &structEncodingString); + + + /** + You can provide name for root struct you are passing. The name will be then used + in typePath (check out FBParsedType for details). + The name here can be for example a name of an ivar with this struct. + */ + Struct parseStructEncodingWithName(const std::string &structEncodingString, + const std::string &structName); + + +} } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm index 242c5d1..401e402 100644 --- a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm @@ -9,95 +9,153 @@ #import "FBStructEncodingParser.h" +#import +#import +#import #import +#import -/** - Intermediate struct object used inside the algorithm to pass some - information when parsing nested structures. - */ -struct _StructParseResult { - NSArray *containedTypes; - NSString *typeName; -}; - -static struct _StructParseResult _ParseStructEncodingWithScanner(NSScanner *scanner) { - NSMutableArray *types = [NSMutableArray new]; - - // Every struct starts with '{' - __unused BOOL scannedCorrectly = [scanner scanString:@"{" intoString:nil]; - NSCAssert(scannedCorrectly, @"The first character of struct encoding should be {"); - - // Parse name - NSString *structTypeName = nil; - [scanner scanUpToString:@"=" intoString:&structTypeName]; - [scanner scanString:@"=" intoString:nil]; +#import "BaseType.h" - NSCharacterSet *literalEndingCharacters = [NSCharacterSet characterSetWithCharactersInString:@"\"}"]; - - while (![scanner scanString:@"}" intoString:nil]) { - if ([scanner scanString:@"\"" intoString:nil]) { - NSString *parseResult = nil; - [scanner scanUpToString:@"\"" intoString:&parseResult]; - [scanner scanString:@"\"" intoString:nil]; - if (parseResult) { - [types addObject:parseResult]; +namespace { + class _StringScanner { + public: + const std::string string; + size_t index; + + _StringScanner(const std::string &string): string(string), index(0) {} + + bool scanString(const std::string &stringToScan) { + if (!(string.compare(index, stringToScan.length(), stringToScan) == 0)) { + return false; } - } else if ([scanner.string characterAtIndex:scanner.scanLocation] == '{') { - // We do not want to consume '{' because we will call parser recursively - NSUInteger locBefore = [scanner scanLocation]; - _StructParseResult parseResult = _ParseStructEncodingWithScanner(scanner); - NSRange typeEncodingRange = NSMakeRange(locBefore, ([scanner scanLocation] - locBefore)); - NSString *nameFromBefore = [types lastObject]; - [types removeLastObject]; - FBParsedStruct *type = [[FBParsedStruct alloc] initWithName:nameFromBefore - typeEncoding:[scanner.string substringWithRange:typeEncodingRange] - structTypeName:parseResult.typeName - typesContainedInStruct:parseResult.containedTypes]; - [types addObject:type]; - } else { - // It's a type name (literal), let's advance until we find '"', or '}' - NSString *parseResult = nil; - [scanner scanUpToCharactersFromSet:literalEndingCharacters - intoString:&parseResult]; - - NSString *nameFromBefore = nil; - if ([[types lastObject] isKindOfClass:[NSString class]]) { - // We have parsed some name - nameFromBefore = [types lastObject]; - [types removeLastObject]; + index += stringToScan.length(); + return true; + } + + const std::string scanUpToString(const std::string &upToString) { + size_t pos = string.find(upToString, index); + if (pos == std::string::npos) { + // Mark as whole string scanned + index = string.length(); + return ""; } - FBParsedType *type = [[FBParsedType alloc] initWithName:nameFromBefore - typeEncoding:parseResult]; - [types addObject:type]; + + std::string inBetweenString = string.substr(index, pos - index); + index = pos; + return inBetweenString; } - } - - NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, - NSDictionary *bindings) { - if ([evaluatedObject isKindOfClass:[FBParsedType class]] || - [evaluatedObject isKindOfClass:[FBParsedStruct class]]) { - return YES; + + const char currentCharacter() { + return string[index]; + } + + const std::string scanUpToCharacterFromSet(const std::string &characterSet) { + size_t pos = string.find_first_of(characterSet, index); + if (pos == std::string::npos) { + index = string.length(); + return ""; + } + + std::string inBetweenString = string.substr(index, pos-index); + index = pos; + return inBetweenString; } - return NO; - }]; - NSArray *finalTypes = [types filteredArrayUsingPredicate:filterPredicate]; - - return { - .containedTypes = finalTypes, - .typeName = structTypeName, }; -} - -FBParsedStruct *FBParseStructEncoding(NSString *structEncodingString) { - return FBParseStructEncodingWithName(structEncodingString, nil); -} + +}; -FBParsedStruct *FBParseStructEncodingWithName(NSString *structEncodingString, NSString *structName) { - struct _StructParseResult result = _ParseStructEncodingWithScanner([NSScanner scannerWithString:structEncodingString]); - FBParsedStruct *outerStruct = [[FBParsedStruct alloc] initWithName:structName - typeEncoding:structEncodingString - structTypeName:result.typeName - typesContainedInStruct:result.containedTypes]; - [outerStruct passTypePath:nil]; - return outerStruct; -} +namespace FB { namespace RetainCycleDetector { namespace Parser { + + /** + Intermediate struct object used inside the algorithm to pass some + information when parsing nested structures. + */ + struct _StructParseResult { + std::vector> containedTypes; + const std::string typeName; + }; + + static const auto kOpenStruct = "{"; + static const auto kCloseStruct = "}"; + static const auto kLiteralEndingCharacters = "\"}"; + static const auto kQuote = "\""; + + static struct _StructParseResult _ParseStructEncodingWithScanner(_StringScanner &scanner) { + std::vector> types; + + // Every struct starts with '{' + __unused const auto scannedCorrectly = scanner.scanString(kOpenStruct); + NSCAssert(scannedCorrectly, @"The first character of struct encoding should be {"); + + // Parse name + const auto structTypeName = scanner.scanUpToString("="); + scanner.scanString("="); + + while (!(scanner.scanString(kCloseStruct))) { + if (scanner.scanString(kQuote)) { + const auto parseResult = scanner.scanUpToString(kQuote); + scanner.scanString(kQuote); + if (parseResult.length() > 0) { + types.push_back(std::make_shared(parseResult)); + } + } else if (scanner.currentCharacter() == '{') { + // We do not want to consume '{' because we will call parser recursively + const auto locBefore = scanner.index; + auto parseResult = _ParseStructEncodingWithScanner(scanner); + + const auto nameFromBefore = std::dynamic_pointer_cast(types.back()); + NSCAssert(nameFromBefore, @"There should always be a name from before if we hit a struct"); + types.pop_back(); + std::shared_ptr type = std::make_shared(nameFromBefore->value, + scanner.string.substr(locBefore, (scanner.index - locBefore)), + parseResult.typeName, + parseResult.containedTypes); + + types.emplace_back(type); + } else { + // It's a type name (literal), let's advance until we find '"', or '}' + const auto parseResult = scanner.scanUpToCharacterFromSet(kLiteralEndingCharacters); + std::string nameFromBefore = ""; + if (types.size() > 0) { + if (std::shared_ptr maybeUnresolved = std::dynamic_pointer_cast(types.back())) { + nameFromBefore = maybeUnresolved->value; + types.pop_back(); + } + } + std::shared_ptr type = std::make_shared(nameFromBefore, parseResult); + types.emplace_back(type); + } + } + + std::vector> filteredVector; + + for (const auto &t: types) { + if (const auto convertedType = std::dynamic_pointer_cast(t)) { + filteredVector.emplace_back(convertedType); + } + } + + return { + .containedTypes = filteredVector, + .typeName = structTypeName, + }; + } + + Struct parseStructEncoding(const std::string &structEncodingString) { + return parseStructEncodingWithName(structEncodingString, ""); + } + + Struct parseStructEncodingWithName(const std::string &structEncodingString, + const std::string &structName) { + _StringScanner scanner = _StringScanner(structEncodingString); + auto result = _ParseStructEncodingWithScanner(scanner); + + Struct outerStruct = Struct(structName, + structEncodingString, + result.typeName, + result.containedTypes); + outerStruct.passTypePath({}); + return outerStruct; + } +} } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.h new file mode 100644 index 0000000..f751616 --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.h @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "Type.h" + +#import +#import +#import + +namespace FB { namespace RetainCycleDetector { namespace Parser { + class Struct: public Type { + public: + const std::string structTypeName; + + Struct(const std::string &name, + const std::string &typeEncoding, + const std::string &structTypeName, + std::vector> &typesContainedInStruct) + : Type(name, typeEncoding), + structTypeName(structTypeName), + typesContainedInStruct(std::move(typesContainedInStruct)) {}; + Struct(Struct&&) = default; + Struct &operator=(Struct&&) = default; + + Struct(const Struct&) = delete; + Struct &operator=(const Struct&) = delete; + + std::vector> flattenTypes(); + + virtual void passTypePath(std::vector typePath); + std::vector> typesContainedInStruct; + }; +} } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.mm b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.mm new file mode 100644 index 0000000..6e22ef1 --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.mm @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "Struct.h" + +#import + +namespace FB { namespace RetainCycleDetector { namespace Parser { + void Struct::passTypePath(std::vector typePath) { + this->typePath = typePath; + + if (name.length() > 0) { + typePath.emplace_back(name); + } + if (structTypeName.length() > 0 && structTypeName != "?") { + typePath.emplace_back(structTypeName); + } + + for (auto &type: typesContainedInStruct) { + type->passTypePath(typePath); + } + } + + std::vector> Struct::flattenTypes() { + std::vector> flattenedTypes; + + for (const auto &type:typesContainedInStruct) { + const auto maybeStruct = std::dynamic_pointer_cast(type); + if (maybeStruct) { + // Complex type, recursively grab all references + flattenedTypes.reserve(flattenedTypes.size() + std::distance(maybeStruct->typesContainedInStruct.begin(), + maybeStruct->typesContainedInStruct.end())); + flattenedTypes.insert(flattenedTypes.end(), + maybeStruct->typesContainedInStruct.begin(), + maybeStruct->typesContainedInStruct.end()); + } else { + // Simple type + flattenedTypes.emplace_back(type); + } + } + + return flattenedTypes; + } + +} } } diff --git a/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Type.h b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Type.h new file mode 100644 index 0000000..993e5ed --- /dev/null +++ b/Pods/FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Type.h @@ -0,0 +1,38 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import +#import +#import + +#import "BaseType.h" + +namespace FB { namespace RetainCycleDetector { namespace Parser { + class Type: public BaseType { + public: + const std::string name; + const std::string typeEncoding; + + Type(const std::string &name, + const std::string &typeEncoding): name(name), typeEncoding(typeEncoding) {} + Type(Type&&) = default; + Type &operator=(Type&&) = default; + + Type(const Type&) = delete; + Type &operator=(const Type&) = delete; + + virtual void passTypePath(std::vector typePath) { + this->typePath = typePath; + } + + std::vector typePath; + }; +} } } diff --git a/Pods/FMDB/LICENSE.txt b/Pods/FMDB/LICENSE.txt new file mode 100644 index 0000000..addfc1a --- /dev/null +++ b/Pods/FMDB/LICENSE.txt @@ -0,0 +1,28 @@ +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Pods/FMDB/README.markdown b/Pods/FMDB/README.markdown new file mode 100644 index 0000000..d351def --- /dev/null +++ b/Pods/FMDB/README.markdown @@ -0,0 +1,541 @@ +# FMDB v2.7 + +[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/FMDB.svg)](https://img.shields.io/cocoapods/v/FMDB.svg) +[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + +This is an Objective-C wrapper around SQLite: http://sqlite.org/ + +## The FMDB Mailing List: +http://groups.google.com/group/fmdb + +## Read the SQLite FAQ: +http://www.sqlite.org/faq.html + +Since FMDB is built on top of SQLite, you're going to want to read this page top to bottom at least once. And while you're there, make sure to bookmark the SQLite Documentation page: http://www.sqlite.org/docs.html + +## Contributing +Do you have an awesome idea that deserves to be in FMDB? You might consider pinging ccgus first to make sure he hasn't already ruled it out for some reason. Otherwise pull requests are great, and make sure you stick to the local coding conventions. However, please be patient and if you haven't heard anything from ccgus for a week or more, you might want to send a note asking what's up. + +## Installing + +### CocoaPods + +[![Dependency Status](https://www.versioneye.com/objective-c/fmdb/2.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/fmdb/2.3) +[![Reference Status](https://www.versioneye.com/objective-c/fmdb/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/fmdb/references) + +FMDB can be installed using [CocoaPods](https://cocoapods.org/). + +If you haven't done so already, you might want to initialize the project, to have it produce a `Podfile` template for you: + +``` +$ pod init +``` + +Then, edit the `Podfile`, adding `FMDB`: + +```ruby +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'MyApp' do + # Comment the next line if you're not using Swift and don't want to use dynamic frameworks + use_frameworks! + + # Pods for MyApp2 + + pod 'FMDB' + # pod 'FMDB/FTS' # FMDB with FTS + # pod 'FMDB/standalone' # FMDB with latest SQLite amalgamation source + # pod 'FMDB/standalone/FTS' # FMDB with latest SQLite amalgamation source and FTS + # pod 'FMDB/SQLCipher' # FMDB with SQLCipher +end +``` + +Then install the pods: + +``` +$ pod install +``` + +Then open the `.xcworkspace` rather than the `.xcodeproj`. + +For more information on Cocoapods visit https://cocoapods.org. + +**If using FMDB with [SQLCipher](https://www.zetetic.net/sqlcipher/) you must use the FMDB/SQLCipher subspec. The FMDB/SQLCipher subspec declares SQLCipher as a dependency, allowing FMDB to be compiled with the `-DSQLITE_HAS_CODEC` flag.** + +### Carthage + +Once you make sure you have [the latest version of Carthage](https://github.com/Carthage/Carthage/releases), you can open up a command line terminal, navigate to your project's main directory, and then do the following commands: + +``` +$ echo ' github "ccgus/fmdb" ' > ./Cartfile +$ carthage update +``` + +You can then configure your project as outlined in Carthage's [Getting Started](https://github.com/Carthage/Carthage#getting-started) (i.e. for iOS, adding the framework to the "Link Binary with Libraries" in your target and adding the `copy-frameworks` script; in macOS, adding the framework to the list of "Embedded Binaries"). + +## FMDB Class Reference: +http://ccgus.github.io/fmdb/html/index.html + +## Automatic Reference Counting (ARC) or Manual Memory Management? +You can use either style in your Cocoa project. FMDB will figure out which you are using at compile time and do the right thing. + +## What's New in FMDB 2.7 + +FMDB 2.7 attempts to support a more natural interface. This represents a fairly significant change for Swift developers (audited for nullability; shifted to properties in external interfaces where possible rather than methods; etc.). For Objective-C developers, this should be a fairly seamless transition (unless you were using the ivars that were previously exposed in the public interface, which you shouldn't have been doing, anyway!). + +### Nullability and Swift Optionals + +FMDB 2.7 is largely the same as prior versions, but has been audited for nullability. For Objective-C users, this simply means that if you perform a static analysis of your FMDB-based project, you may receive more meaningful warnings as you review your project, but there are likely to be few, if any, changes necessary in your code. + +For Swift users, this nullability audit results in changes that are not entirely backward compatible with FMDB 2.6, but is a little more Swifty. Before FMDB was audited for nullability, Swift was forced to defensively assume that variables were optional, but the library now more accurately knows which properties and method parameters are optional, and which are not. + +This means, though, that Swift code written for FMDB 2.7 may require changes. For example, consider the following Swift 3/Swift 4 code for FMDB 2.6: +```swift + +guard let queue = FMDatabaseQueue(path: fileURL.path) else { + print("Unable to create FMDatabaseQueue") + return +} + +queue.inTransaction { db, rollback in + do { + guard let db == db else { + // handle error here + return + } + + try db.executeUpdate("INSERT INTO foo (bar) VALUES (?)", values: [1]) + try db.executeUpdate("INSERT INTO foo (bar) VALUES (?)", values: [2]) + } catch { + rollback?.pointee = true + } +} +``` + +Because FMDB 2.6 was not audited for nullability, Swift inferred that `db` and `rollback` were optionals. But, now, in FMDB 2.7, Swift now knows that, for example, neither `db` nor `rollback` above can be `nil`, so they are no longer optionals. Thus it becomes: + +```swift + +let queue = FMDatabaseQueue(url: fileURL) + +queue.inTransaction { db, rollback in + do { + try db.executeUpdate("INSERT INTO foo (bar) VALUES (?)", values: [1]) + try db.executeUpdate("INSERT INTO foo (bar) VALUES (?)", values: [2]) + } catch { + rollback.pointee = true + } +} +``` + +### Custom Functions + +In the past, when writing custom functions, you would have to generally include your own `@autoreleasepool` block to avoid problems when writing functions that scanned through a large table. Now, FMDB will automatically wrap it in an autorelease pool, so you don't have to. + +Also, in the past, when retrieving the values passed to the function, you had to drop down to the SQLite C API and include your own `sqlite3_value_XXX` calls. There are now `FMDatabase` methods, `valueInt`, `valueString`, etc., so you can stay within Swift and/or Objective-C, without needing to call the C functions yourself. Likewise, when specifying the return values, you no longer need to call `sqlite3_result_XXX` C API, but rather you can use `FMDatabase` methods, `resultInt`, `resultString`, etc. There is a new `enum` for `valueType` called `SqliteValueType`, which can be used for checking the type of parameter passed to the custom function. + +Thus, you can do something like (as of Swift 3): + +```swift +db.makeFunctionNamed("RemoveDiacritics", arguments: 1) { context, argc, argv in + guard db.valueType(argv[0]) == .text || db.valueType(argv[0]) == .null else { + db.resultError("Expected string parameter", context: context) + return + } + + if let string = db.valueString(argv[0])?.folding(options: .diacriticInsensitive, locale: nil) { + db.resultString(string, context: context) + } else { + db.resultNull(context: context) + } +} +``` + +And you can then use that function in your SQL (in this case, matching both "Jose" and "José"): + +```sql +SELECT * FROM employees WHERE RemoveDiacritics(first_name) LIKE 'jose' +``` + +Note, the method `makeFunctionNamed:maximumArguments:withBlock:` has been renamed to `makeFunctionNamed:arguments:block:`, to more accurately reflect the functional intent of the second parameter. + +### API Changes + +In addition to the `makeFunctionNamed` noted above, there are a few other API changes. Specifically, + + - To become consistent with the rest of the API, the methods `objectForColumnName` and `UTF8StringForColumnName` have been renamed to `objectForColumn` and `UTF8StringForColumn`. + + - Note, the `objectForColumn` (and the associted subscript operator) now returns `nil` if an invalid column name/index is passed to it. It used to return `NSNull`. + + - To avoid confusion with `FMDatabaseQueue` method `inTransaction`, which performs transactions, the `FMDatabase` method to determine whether you are in a transaction or not, `inTransaction`, has been replaced with a read-only property, `isInTransaction`. + + - Several functions have been converted to properties, namely, `databasePath`, `maxBusyRetryTimeInterval`, `shouldCacheStatements`, `sqliteHandle`, `hasOpenResultSets`, `lastInsertRowId`, `changes`, `goodConnection`, `columnCount`, `resultDictionary`, `applicationID`, `applicationIDString`, `userVersion`, `countOfCheckedInDatabases`, `countOfCheckedOutDatabases`, and `countOfOpenDatabases`. For Objective-C users, this has little material impact, but for Swift users, it results in a slightly more natural interface. Note: For Objective-C developers, previously versions of FMDB exposed many ivars (but we hope you weren't using them directly, anyway!), but the implmentation details for these are no longer exposed. + +### URL Methods + +In keeping with Apple's shift from paths to URLs, there are now `NSURL` renditions of the various `init` methods, previously only accepting paths. + +## Usage +There are three main classes in FMDB: + +1. `FMDatabase` - Represents a single SQLite database. Used for executing SQL statements. +2. `FMResultSet` - Represents the results of executing a query on an `FMDatabase`. +3. `FMDatabaseQueue` - If you're wanting to perform queries and updates on multiple threads, you'll want to use this class. It's described in the "Thread Safety" section below. + +### Database Creation +An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + +1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. +2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. +3. `NULL`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + +(For more information on temporary and in-memory databases, read the sqlite documentation on the subject: http://www.sqlite.org/inmemorydb.html) + +```objc +NSString *path = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tmp.db"]; +FMDatabase *db = [FMDatabase databaseWithPath:path]; +``` + +### Opening + +Before you can interact with the database, it must be opened. Opening fails if there are insufficient resources or permissions to open and/or create the database. + +```objc +if (![db open]) { + // [db release]; // uncomment this line in manual referencing code; in ARC, this is not necessary/permitted + db = nil; + return; +} +``` + +### Executing Updates + +Any sort of SQL statement which is not a `SELECT` statement qualifies as an update. This includes `CREATE`, `UPDATE`, `INSERT`, `ALTER`, `COMMIT`, `BEGIN`, `DETACH`, `DELETE`, `DROP`, `END`, `EXPLAIN`, `VACUUM`, and `REPLACE` statements (plus many more). Basically, if your SQL statement does not begin with `SELECT`, it is an update statement. + +Executing updates returns a single value, a `BOOL`. A return value of `YES` means the update was successfully executed, and a return value of `NO` means that some error was encountered. You may invoke the `-lastErrorMessage` and `-lastErrorCode` methods to retrieve more information. + +### Executing Queries + +A `SELECT` statement is a query and is executed via one of the `-executeQuery...` methods. + +Executing queries returns an `FMResultSet` object if successful, and `nil` upon failure. You should use the `-lastErrorMessage` and `-lastErrorCode` methods to determine why a query failed. + +In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" from one record to the other. With FMDB, the easiest way to do that is like this: + +```objc +FMResultSet *s = [db executeQuery:@"SELECT * FROM myTable"]; +while ([s next]) { + //retrieve values for each record +} +``` + +You must always invoke `-[FMResultSet next]` before attempting to access the values returned in a query, even if you're only expecting one: + +```objc +FMResultSet *s = [db executeQuery:@"SELECT COUNT(*) FROM myTable"]; +if ([s next]) { + int totalCount = [s intForColumnIndex:0]; +} +``` + +`FMResultSet` has many methods to retrieve data in an appropriate format: + +- `intForColumn:` +- `longForColumn:` +- `longLongIntForColumn:` +- `boolForColumn:` +- `doubleForColumn:` +- `stringForColumn:` +- `dateForColumn:` +- `dataForColumn:` +- `dataNoCopyForColumn:` +- `UTF8StringForColumn:` +- `objectForColumn:` + +Each of these methods also has a `{type}ForColumnIndex:` variant that is used to retrieve the data based on the position of the column in the results, as opposed to the column's name. + +Typically, there's no need to `-close` an `FMResultSet` yourself, since that happens when either the result set is deallocated, or the parent database is closed. + +### Closing + +When you have finished executing queries and updates on the database, you should `-close` the `FMDatabase` connection so that SQLite will relinquish any resources it has acquired during the course of its operation. + +```objc +[db close]; +``` + +### Transactions + +`FMDatabase` can begin and commit a transaction by invoking one of the appropriate methods or executing a begin/end transaction statement. + +### Multiple Statements and Batch Stuff + +You can use `FMDatabase`'s executeStatements:withResultBlock: to do multiple statements in a string: + +```objc +NSString *sql = @"create table bulktest1 (id integer primary key autoincrement, x text);" + "create table bulktest2 (id integer primary key autoincrement, y text);" + "create table bulktest3 (id integer primary key autoincrement, z text);" + "insert into bulktest1 (x) values ('XXX');" + "insert into bulktest2 (y) values ('YYY');" + "insert into bulktest3 (z) values ('ZZZ');"; + +success = [db executeStatements:sql]; + +sql = @"select count(*) as count from bulktest1;" + "select count(*) as count from bulktest2;" + "select count(*) as count from bulktest3;"; + +success = [self.db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary) { + NSInteger count = [dictionary[@"count"] integerValue]; + XCTAssertEqual(count, 1, @"expected one record for dictionary %@", dictionary); + return 0; +}]; +``` + +### Data Sanitization + +When providing a SQL statement to FMDB, you should not attempt to "sanitize" any values before insertion. Instead, you should use the standard SQLite binding syntax: + +```sql +INSERT INTO myTable VALUES (?, ?, ?, ?) +``` + +The `?` character is recognized by SQLite as a placeholder for a value to be inserted. The execution methods all accept a variable number of arguments (or a representation of those arguments, such as an `NSArray`, `NSDictionary`, or a `va_list`), which are properly escaped for you. + +And, to use that SQL with the `?` placeholders from Objective-C: + +```objc +NSInteger identifier = 42; +NSString *name = @"Liam O'Flaherty (\"the famous Irish author\")"; +NSDate *date = [NSDate date]; +NSString *comment = nil; + +BOOL success = [db executeUpdate:@"INSERT INTO authors (identifier, name, date, comment) VALUES (?, ?, ?, ?)", @(identifier), name, date, comment ?: [NSNull null]]; +if (!success) { + NSLog(@"error = %@", [db lastErrorMessage]); +} +``` + +> **Note:** Fundamental data types, like the `NSInteger` variable `identifier`, should be as a `NSNumber` objects, achieved by using the `@` syntax, shown above. Or you can use the `[NSNumber numberWithInt:identifier]` syntax, too. +> +> Likewise, SQL `NULL` values should be inserted as `[NSNull null]`. For example, in the case of `comment` which might be `nil` (and is in this example), you can use the `comment ?: [NSNull null]` syntax, which will insert the string if `comment` is not `nil`, but will insert `[NSNull null]` if it is `nil`. + +In Swift, you would use `executeUpdate(values:)`, which not only is a concise Swift syntax, but also `throws` errors for proper error handling: + +```swift +do { + let identifier = 42 + let name = "Liam O'Flaherty (\"the famous Irish author\")" + let date = Date() + let comment: String? = nil + + try db.executeUpdate("INSERT INTO authors (identifier, name, date, comment) VALUES (?, ?, ?, ?)", values: [identifier, name, date, comment ?? NSNull()]) +} catch { + print("error = \(error)") +} +``` + +> **Note:** In Swift, you don't have to wrap fundamental numeric types like you do in Objective-C. But if you are going to insert an optional string, you would probably use the `comment ?? NSNull()` syntax (i.e., if it is `nil`, use `NSNull`, otherwise use the string). + +Alternatively, you may use named parameters syntax: + +```sql +INSERT INTO authors (identifier, name, date, comment) VALUES (:identifier, :name, :date, :comment) +``` + +The parameters *must* start with a colon. SQLite itself supports other characters, but internally the dictionary keys are prefixed with a colon, do **not** include the colon in your dictionary keys. + +```objc +NSDictionary *arguments = @{@"identifier": @(identifier), @"name": name, @"date": date, @"comment": comment ?: [NSNull null]}; +BOOL success = [db executeUpdate:@"INSERT INTO authors (identifier, name, date, comment) VALUES (:identifier, :name, :date, :comment)" withParameterDictionary:arguments]; +if (!success) { + NSLog(@"error = %@", [db lastErrorMessage]); +} +``` + +The key point is that one should not use `NSString` method `stringWithFormat` to manually insert values into the SQL statement, itself. Nor should one Swift string interpolation to insert values into the SQL. Use `?` placeholders for values to be inserted into the database (or used in `WHERE` clauses in `SELECT` statements). + +

Using FMDatabaseQueue and Thread Safety.

+ +Using a single instance of `FMDatabase` from multiple threads at once is a bad idea. It has always been OK to make a `FMDatabase` object *per thread*. Just don't share a single instance across threads, and definitely not across multiple threads at the same time. Bad things will eventually happen and you'll eventually get something to crash, or maybe get an exception, or maybe meteorites will fall out of the sky and hit your Mac Pro. *This would suck*. + +**So don't instantiate a single `FMDatabase` object and use it across multiple threads.** + +Instead, use `FMDatabaseQueue`. Instantiate a single `FMDatabaseQueue` and use it across multiple threads. The `FMDatabaseQueue` object will synchronize and coordinate access across the multiple threads. Here's how to use it: + +First, make your queue. + +```objc +FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; +``` + +Then use it like so: + + +```objc +[queue inDatabase:^(FMDatabase *db) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3]; + + FMResultSet *rs = [db executeQuery:@"select * from foo"]; + while ([rs next]) { + … + } +}]; +``` + +An easy way to wrap things up in a transaction can be done like this: + +```objc +[queue inTransaction:^(FMDatabase *db, BOOL *rollback) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3]; + + if (whoopsSomethingWrongHappened) { + *rollback = YES; + return; + } + + // etc ... +}]; +``` + +The Swift equivalent would be: + +```swift +queue.inTransaction { db, rollback in + do { + try db.executeUpdate("INSERT INTO myTable VALUES (?)", values: [1]) + try db.executeUpdate("INSERT INTO myTable VALUES (?)", values: [2]) + try db.executeUpdate("INSERT INTO myTable VALUES (?)", values: [3]) + + if whoopsSomethingWrongHappened { + rollback.pointee = true + return + } + + // etc ... + } catch { + rollback.pointee = true + print(error) + } +} +``` + +(Note, as of Swift 3, use `pointee`. But in Swift 2.3, use `memory` rather than `pointee`.) + +`FMDatabaseQueue` will run the blocks on a serialized queue (hence the name of the class). So if you call `FMDatabaseQueue`'s methods from multiple threads at the same time, they will be executed in the order they are received. This way queries and updates won't step on each other's toes, and every one is happy. + +**Note:** The calls to `FMDatabaseQueue`'s methods are blocking. So even though you are passing along blocks, they will **not** be run on another thread. + +## Making custom sqlite functions, based on blocks. + +You can do this! For an example, look for `-makeFunctionNamed:` in main.m + +## Swift + +You can use FMDB in Swift projects too. + +To do this, you must: + +1. Copy the relevant `.m` and `.h` files from the FMDB `src` folder into your project. + + You can copy all of them (which is easiest), or only the ones you need. Likely you will need [`FMDatabase`](http://ccgus.github.io/fmdb/html/Classes/FMDatabase.html) and [`FMResultSet`](http://ccgus.github.io/fmdb/html/Classes/FMResultSet.html) at a minimum. [`FMDatabaseAdditions`](http://ccgus.github.io/fmdb/html/Categories/FMDatabase+FMDatabaseAdditions.html) provides some very useful convenience methods, so you will likely want that, too. If you are doing multithreaded access to a database, [`FMDatabaseQueue`](http://ccgus.github.io/fmdb/html/Classes/FMDatabaseQueue.html) is quite useful, too. If you choose to not copy all of the files from the `src` directory, though, you may want to update `FMDB.h` to only reference the files that you included in your project. + + Note, if you're copying all of the files from the `src` folder into to your project (which is recommended), you may want to drag the individual files into your project, not the folder, itself, because if you drag the folder, you won't be prompted to add the bridging header (see next point). + +2. If prompted to create a "bridging header", you should do so. If not prompted and if you don't already have a bridging header, add one. + + For more information on bridging headers, see [Swift and Objective-C in the Same Project](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_76). + +3. In your bridging header, add a line that says: + ```objc + #import "FMDB.h" + ``` + +4. Use the variations of `executeQuery` and `executeUpdate` with the `sql` and `values` parameters with `try` pattern, as shown below. These renditions of `executeQuery` and `executeUpdate` both `throw` errors in true Swift fashion. + +If you do the above, you can then write Swift code that uses `FMDatabase`. For example, as of Swift 3: + +```swift +let fileURL = try! FileManager.default + .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) + .appendingPathComponent("test.sqlite") + +let database = FMDatabase(url: fileURL) + +guard database.open() else { + print("Unable to open database") + return +} + +do { + try database.executeUpdate("create table test(x text, y text, z text)", values: nil) + try database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", values: ["a", "b", "c"]) + try database.executeUpdate("insert into test (x, y, z) values (?, ?, ?)", values: ["e", "f", "g"]) + + let rs = try database.executeQuery("select x, y, z from test", values: nil) + while rs.next() { + if let x = rs.string(forColumn: "x"), let y = rs.string(forColumn: "y"), let z = rs.string(forColumn: "z") { + print("x = \(x); y = \(y); z = \(z)") + } + } +} catch { + print("failed: \(error.localizedDescription)") +} + +database.close() +``` + +## History + +The history and changes are availbe on its [GitHub page](https://github.com/ccgus/fmdb) and are summarized in the "CHANGES_AND_TODO_LIST.txt" file. + +## Contributors + +The contributors to FMDB are contained in the "Contributors.txt" file. + +## Additional projects using FMDB, which might be interesting to the discerning developer. + + * FMDBMigrationManager, A SQLite schema migration management system for FMDB: https://github.com/layerhq/FMDBMigrationManager + * FCModel, An alternative to Core Data for people who like having direct SQL access: https://github.com/marcoarment/FCModel + +## Quick notes on FMDB's coding style + +Spaces, not tabs. Square brackets, not dot notation. Look at what FMDB already does with curly brackets and such, and stick to that style. + +## Reporting bugs + +Reduce your bug down to the smallest amount of code possible. You want to make it super easy for the developers to see and reproduce your bug. If it helps, pretend that the person who can fix your bug is active on shipping 3 major products, works on a handful of open source projects, has a newborn baby, and is generally very very busy. + +And we've even added a template function to main.m (FMDBReportABugFunction) in the FMDB distribution to help you out: + +* Open up fmdb project in Xcode. +* Open up main.m and modify the FMDBReportABugFunction to reproduce your bug. + * Setup your table(s) in the code. + * Make your query or update(s). + * Add some assertions which demonstrate the bug. + +Then you can bring it up on the FMDB mailing list by showing your nice and compact FMDBReportABugFunction, or you can report the bug via the github FMDB bug reporter. + +**Optional:** + +Figure out where the bug is, fix it, and send a patch in or bring that up on the mailing list. Make sure all the other tests run after your modifications. + +## Support + +The support channels for FMDB are the mailing list (see above), filing a bug here, or maybe on Stack Overflow. So that is to say, support is provided by the community and on a voluntary basis. + +FMDB development is overseen by Gus Mueller of Flying Meat. If FMDB been helpful to you, consider purchasing an app from FM or telling all your friends about it. + +## License + +The license for FMDB is contained in the "License.txt" file. + +If you happen to come across either Gus Mueller or Rob Ryan in a bar, you might consider purchasing a drink of their choosing if FMDB has been useful to you. + +(The drink is for them of course, shame on you for trying to keep it.) diff --git a/Pods/FMDB/src/fmdb/FMDB.h b/Pods/FMDB/src/fmdb/FMDB.h new file mode 100644 index 0000000..1ff5465 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDB.h @@ -0,0 +1,10 @@ +#import + +FOUNDATION_EXPORT double FMDBVersionNumber; +FOUNDATION_EXPORT const unsigned char FMDBVersionString[]; + +#import "FMDatabase.h" +#import "FMResultSet.h" +#import "FMDatabaseAdditions.h" +#import "FMDatabaseQueue.h" +#import "FMDatabasePool.h" diff --git a/Pods/FMDB/src/fmdb/FMDatabase.h b/Pods/FMDB/src/fmdb/FMDatabase.h new file mode 100644 index 0000000..b779d54 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabase.h @@ -0,0 +1,1360 @@ +#import +#import "FMResultSet.h" +#import "FMDatabasePool.h" + +NS_ASSUME_NONNULL_BEGIN + +#if ! __has_feature(objc_arc) + #define FMDBAutorelease(__v) ([__v autorelease]); + #define FMDBReturnAutoreleased FMDBAutorelease + + #define FMDBRetain(__v) ([__v retain]); + #define FMDBReturnRetained FMDBRetain + + #define FMDBRelease(__v) ([__v release]); + + #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); +#else + // -fobjc-arc + #define FMDBAutorelease(__v) + #define FMDBReturnAutoreleased(__v) (__v) + + #define FMDBRetain(__v) + #define FMDBReturnRetained(__v) (__v) + + #define FMDBRelease(__v) + +// If OS_OBJECT_USE_OBJC=1, then the dispatch objects will be treated like ObjC objects +// and will participate in ARC. +// See the section on "Dispatch Queues and Automatic Reference Counting" in "Grand Central Dispatch (GCD) Reference" for details. + #if OS_OBJECT_USE_OBJC + #define FMDBDispatchQueueRelease(__v) + #else + #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); + #endif +#endif + +#if !__has_feature(objc_instancetype) + #define instancetype id +#endif + + +typedef int(^FMDBExecuteStatementsCallbackBlock)(NSDictionary *resultsDictionary); + + +/** A SQLite ([http://sqlite.org/](http://sqlite.org/)) Objective-C wrapper. + + ### Usage + The three main classes in FMDB are: + + - `FMDatabase` - Represents a single SQLite database. Used for executing SQL statements. + - `` - Represents the results of executing a query on an `FMDatabase`. + - `` - If you want to perform queries and updates on multiple threads, you'll want to use this class. + + ### See also + + - `` - A pool of `FMDatabase` objects. + - `` - A wrapper for `sqlite_stmt`. + + ### External links + + - [FMDB on GitHub](https://github.com/ccgus/fmdb) including introductory documentation + - [SQLite web site](http://sqlite.org/) + - [FMDB mailing list](http://groups.google.com/group/fmdb) + - [SQLite FAQ](http://www.sqlite.org/faq.html) + + @warning Do not instantiate a single `FMDatabase` object and use it across multiple threads. Instead, use ``. + + */ + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wobjc-interface-ivars" + + +@interface FMDatabase : NSObject + +///----------------- +/// @name Properties +///----------------- + +/** Whether should trace execution */ + +@property (atomic, assign) BOOL traceExecution; + +/** Whether checked out or not */ + +@property (atomic, assign) BOOL checkedOut; + +/** Crash on errors */ + +@property (atomic, assign) BOOL crashOnErrors; + +/** Logs errors */ + +@property (atomic, assign) BOOL logsErrors; + +/** Dictionary of cached statements */ + +@property (atomic, retain, nullable) NSMutableDictionary *cachedStatements; + +///--------------------- +/// @name Initialization +///--------------------- + +/** Create a `FMDatabase` object. + + An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + + 1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. + 3. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param inPath Path of database file + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + ++ (instancetype)databaseWithPath:(NSString * _Nullable)inPath; + +/** Create a `FMDatabase` object. + + An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + + 1. A file system URL. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param url The local file URL (not remote URL) of database file + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + ++ (instancetype)databaseWithURL:(NSURL * _Nullable)url; + +/** Initialize a `FMDatabase` object. + + An `FMDatabase` is created with a path to a SQLite database file. This path can be one of these three: + + 1. A file system path. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. An empty string (`@""`). An empty database is created at a temporary location. This database is deleted with the `FMDatabase` connection is closed. + 3. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param path Path of database file. + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + +- (instancetype)initWithPath:(NSString * _Nullable)path; + +/** Initialize a `FMDatabase` object. + + An `FMDatabase` is created with a local file URL to a SQLite database file. This path can be one of these three: + + 1. A file system URL. The file does not have to exist on disk. If it does not exist, it is created for you. + 2. `nil`. An in-memory database is created. This database will be destroyed with the `FMDatabase` connection is closed. + + For example, to create/open a database in your Mac OS X `tmp` folder: + + FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"]; + + Or, in iOS, you might open a database in the app's `Documents` directory: + + NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; + NSString *dbPath = [docsPath stringByAppendingPathComponent:@"test.db"]; + FMDatabase *db = [FMDatabase databaseWithPath:dbPath]; + + (For more information on temporary and in-memory databases, read the sqlite documentation on the subject: [http://www.sqlite.org/inmemorydb.html](http://www.sqlite.org/inmemorydb.html)) + + @param url The file `NSURL` of database file. + + @return `FMDatabase` object if successful; `nil` if failure. + + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url; + +///----------------------------------- +/// @name Opening and closing database +///----------------------------------- + +/** Opening a new database connection + + The database is opened for reading and writing, and is created if it does not already exist. + + @return `YES` if successful, `NO` on error. + + @see [sqlite3_open()](http://sqlite.org/c3ref/open.html) + @see openWithFlags: + @see close + */ + +- (BOOL)open; + +/** Opening a new database connection with flags and an optional virtual file system (VFS) + + @param flags one of the following three values, optionally combined with the `SQLITE_OPEN_NOMUTEX`, `SQLITE_OPEN_FULLMUTEX`, `SQLITE_OPEN_SHAREDCACHE`, `SQLITE_OPEN_PRIVATECACHE`, and/or `SQLITE_OPEN_URI` flags: + + `SQLITE_OPEN_READONLY` + + The database is opened in read-only mode. If the database does not already exist, an error is returned. + + `SQLITE_OPEN_READWRITE` + + The database is opened for reading and writing if possible, or reading only if the file is write protected by the operating system. In either case the database must already exist, otherwise an error is returned. + + `SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE` + + The database is opened for reading and writing, and is created if it does not already exist. This is the behavior that is always used for `open` method. + + @return `YES` if successful, `NO` on error. + + @see [sqlite3_open_v2()](http://sqlite.org/c3ref/open.html) + @see open + @see close + */ + +- (BOOL)openWithFlags:(int)flags; + +/** Opening a new database connection with flags and an optional virtual file system (VFS) + + @param flags one of the following three values, optionally combined with the `SQLITE_OPEN_NOMUTEX`, `SQLITE_OPEN_FULLMUTEX`, `SQLITE_OPEN_SHAREDCACHE`, `SQLITE_OPEN_PRIVATECACHE`, and/or `SQLITE_OPEN_URI` flags: + + `SQLITE_OPEN_READONLY` + + The database is opened in read-only mode. If the database does not already exist, an error is returned. + + `SQLITE_OPEN_READWRITE` + + The database is opened for reading and writing if possible, or reading only if the file is write protected by the operating system. In either case the database must already exist, otherwise an error is returned. + + `SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE` + + The database is opened for reading and writing, and is created if it does not already exist. This is the behavior that is always used for `open` method. + + @param vfsName If vfs is given the value is passed to the vfs parameter of sqlite3_open_v2. + + @return `YES` if successful, `NO` on error. + + @see [sqlite3_open_v2()](http://sqlite.org/c3ref/open.html) + @see open + @see close + */ + +- (BOOL)openWithFlags:(int)flags vfs:(NSString * _Nullable)vfsName; + +/** Closing a database connection + + @return `YES` if success, `NO` on error. + + @see [sqlite3_close()](http://sqlite.org/c3ref/close.html) + @see open + @see openWithFlags: + */ + +- (BOOL)close; + +/** Test to see if we have a good connection to the database. + + This will confirm whether: + + - is database open + - if open, it will try a simple SELECT statement and confirm that it succeeds. + + @return `YES` if everything succeeds, `NO` on failure. + */ + +@property (nonatomic, readonly) BOOL goodConnection; + + +///---------------------- +/// @name Perform updates +///---------------------- + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html), [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) to bind values to `?` placeholders in the SQL with the optional list of parameters, and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param outErr A reference to the `NSError` pointer to be updated with an auto released `NSError` object if an error if an error occurs. If `nil`, no `NSError` object will be returned. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + */ + +- (BOOL)executeUpdate:(NSString*)sql withErrorAndBindings:(NSError * _Nullable *)outErr, ...; + +/** Execute single update statement + + @see executeUpdate:withErrorAndBindings: + + @warning **Deprecated**: Please use `` instead. + */ + +- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError * _Nullable*)outErr, ... __deprecated_msg("Use executeUpdate:withErrorAndBindings: instead");; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html), [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) to bind values to `?` placeholders in the SQL with the optional list of parameters, and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + + @note This technique supports the use of `?` placeholders in the SQL, automatically binding any supplied value parameters to those placeholders. This approach is more robust than techniques that entail using `stringWithFormat` to manually build SQL statements, which can be problematic if the values happened to include any characters that needed to be quoted. + + @note You cannot use this method from Swift due to incompatibilities between Swift and Objective-C variadic implementations. Consider using `` instead. + */ + +- (BOOL)executeUpdate:(NSString*)sql, ...; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. Do not use `?` placeholders in the SQL if you use this method. + + @param format The SQL to be performed, with `printf`-style escape sequences. + + @param ... Optional parameters to bind to use in conjunction with the `printf`-style escape sequences in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeUpdate: + @see lastError + @see lastErrorCode + @see lastErrorMessage + + @note This method does not technically perform a traditional printf-style replacement. What this method actually does is replace the printf-style percent sequences with a SQLite `?` placeholder, and then bind values to that placeholder. Thus the following command + + [db executeUpdateWithFormat:@"INSERT INTO test (name) VALUES (%@)", @"Gus"]; + + is actually replacing the `%@` with `?` placeholder, and then performing something equivalent to `` + + [db executeUpdate:@"INSERT INTO test (name) VALUES (?)", @"Gus"]; + + There are two reasons why this distinction is important. First, the printf-style escape sequences can only be used where it is permissible to use a SQLite `?` placeholder. You can use it only for values in SQL statements, but not for table names or column names or any other non-value context. This method also cannot be used in conjunction with `pragma` statements and the like. Second, note the lack of quotation marks in the SQL. The `VALUES` clause was _not_ `VALUES ('%@')` (like you might have to do if you built a SQL statement using `NSString` method `stringWithFormat`), but rather simply `VALUES (%@)`. + */ + +- (BOOL)executeUpdateWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2); + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) binding any `?` placeholders in the SQL with the optional list of parameters. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param arguments A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeUpdate:values:error: + @see lastError + @see lastErrorCode + @see lastErrorMessage + */ + +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) binding any `?` placeholders in the SQL with the optional list of parameters. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + This is similar to ``, except that this also accepts a pointer to a `NSError` pointer, so that errors can be returned. + + In Swift, this throws errors, as if it were defined as follows: + + `func executeUpdate(sql: String, values: [Any]?) throws -> Bool` + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param values A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @param error A `NSError` object to receive any error object (if any). + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + + */ + +- (BOOL)executeUpdate:(NSString*)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error; + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param arguments A `NSDictionary` of objects keyed by column names that will be used when binding values to the `?` placeholders in the SQL statement. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage +*/ + +- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments; + + +/** Execute single update statement + + This method executes a single SQL update statement (i.e. any SQL that does not return results, such as `UPDATE`, `INSERT`, or `DELETE`. This method employs [`sqlite3_prepare_v2`](http://sqlite.org/c3ref/prepare.html) and [`sqlite_step`](http://sqlite.org/c3ref/step.html) to perform the update. Unlike the other `executeUpdate` methods, this uses printf-style formatters (e.g. `%s`, `%d`, etc.) to build the SQL. + + The optional values provided to this method should be objects (e.g. `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects), not fundamental data types (e.g. `int`, `long`, `NSInteger`, etc.). This method automatically handles the aforementioned object types, and all other object types will be interpreted as text values using the object's `description` method. + + @param sql The SQL to be performed, with optional `?` placeholders. + + @param args A `va_list` of arguments. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + */ + +- (BOOL)executeUpdate:(NSString*)sql withVAList: (va_list)args; + +/** Execute multiple SQL statements + + This executes a series of SQL statements that are combined in a single string (e.g. the SQL generated by the `sqlite3` command line `.dump` command). This accepts no value parameters, but rather simply expects a single string with multiple SQL statements, each terminated with a semicolon. This uses `sqlite3_exec`. + + @param sql The SQL to be performed + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeStatements:withResultBlock: + @see [sqlite3_exec()](http://sqlite.org/c3ref/exec.html) + + */ + +- (BOOL)executeStatements:(NSString *)sql; + +/** Execute multiple SQL statements with callback handler + + This executes a series of SQL statements that are combined in a single string (e.g. the SQL generated by the `sqlite3` command line `.dump` command). This accepts no value parameters, but rather simply expects a single string with multiple SQL statements, each terminated with a semicolon. This uses `sqlite3_exec`. + + @param sql The SQL to be performed. + @param block A block that will be called for any result sets returned by any SQL statements. + Note, if you supply this block, it must return integer value, zero upon success (this would be a good opportunity to use SQLITE_OK), + non-zero value upon failure (which will stop the bulk execution of the SQL). If a statement returns values, the block will be called with the results from the query in NSDictionary *resultsDictionary. + This may be `nil` if you don't care to receive any results. + + @return `YES` upon success; `NO` upon failure. If failed, you can call ``, + ``, or `` for diagnostic information regarding the failure. + + @see executeStatements: + @see [sqlite3_exec()](http://sqlite.org/c3ref/exec.html) + + */ + +- (BOOL)executeStatements:(NSString *)sql withResultBlock:(__attribute__((noescape)) FMDBExecuteStatementsCallbackBlock _Nullable)block; + +/** Last insert rowid + + Each entry in an SQLite table has a unique 64-bit signed integer key called the "rowid". The rowid is always available as an undeclared column named `ROWID`, `OID`, or `_ROWID_` as long as those names are not also used by explicitly declared columns. If the table has a column of type `INTEGER PRIMARY KEY` then that column is another alias for the rowid. + + This routine returns the rowid of the most recent successful `INSERT` into the database from the database connection in the first argument. As of SQLite version 3.7.7, this routines records the last insert rowid of both ordinary tables and virtual tables. If no successful `INSERT`s have ever occurred on that database connection, zero is returned. + + @return The rowid of the last inserted row. + + @see [sqlite3_last_insert_rowid()](http://sqlite.org/c3ref/last_insert_rowid.html) + + */ + +@property (nonatomic, readonly) int64_t lastInsertRowId; + +/** The number of rows changed by prior SQL statement. + + This function returns the number of database rows that were changed or inserted or deleted by the most recently completed SQL statement on the database connection specified by the first parameter. Only changes that are directly specified by the INSERT, UPDATE, or DELETE statement are counted. + + @return The number of rows changed by prior SQL statement. + + @see [sqlite3_changes()](http://sqlite.org/c3ref/changes.html) + + */ + +@property (nonatomic, readonly) int changes; + + +///------------------------- +/// @name Retrieving results +///------------------------- + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + This method employs [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) for any optional value parameters. This properly escapes any characters that need escape sequences (e.g. quotation marks), which eliminates simple SQL errors as well as protects against SQL injection attacks. This method natively handles `NSString`, `NSNumber`, `NSNull`, `NSDate`, and `NSData` objects. All other object types will be interpreted as text values using the object's `description` method. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param ... Optional parameters to bind to `?` placeholders in the SQL statement. These should be Objective-C objects (e.g. `NSString`, `NSNumber`, etc.), not fundamental C data types (e.g. `int`, `char *`, etc.). + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + @see [`sqlite3_bind`](http://sqlite.org/c3ref/bind_blob.html) + + @note You cannot use this method from Swift due to incompatibilities between Swift and Objective-C variadic implementations. Consider using `` instead. + */ + +- (FMResultSet * _Nullable)executeQuery:(NSString*)sql, ...; + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param format The SQL to be performed, with `printf`-style escape sequences. + + @param ... Optional parameters to bind to use in conjunction with the `printf`-style escape sequences in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see executeQuery: + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + + @note This method does not technically perform a traditional printf-style replacement. What this method actually does is replace the printf-style percent sequences with a SQLite `?` placeholder, and then bind values to that placeholder. Thus the following command + + [db executeQueryWithFormat:@"SELECT * FROM test WHERE name=%@", @"Gus"]; + + is actually replacing the `%@` with `?` placeholder, and then performing something equivalent to `` + + [db executeQuery:@"SELECT * FROM test WHERE name=?", @"Gus"]; + + There are two reasons why this distinction is important. First, the printf-style escape sequences can only be used where it is permissible to use a SQLite `?` placeholder. You can use it only for values in SQL statements, but not for table names or column names or any other non-value context. This method also cannot be used in conjunction with `pragma` statements and the like. Second, note the lack of quotation marks in the SQL. The `WHERE` clause was _not_ `WHERE name='%@'` (like you might have to do if you built a SQL statement using `NSString` method `stringWithFormat`), but rather simply `WHERE name=%@`. + + */ + +- (FMResultSet * _Nullable)executeQueryWithFormat:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2); + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param arguments A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see -executeQuery:values:error: + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + */ + +- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments; + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + This is similar to ``, except that this also accepts a pointer to a `NSError` pointer, so that errors can be returned. + + In Swift, this throws errors, as if it were defined as follows: + + `func executeQuery(sql: String, values: [Any]?) throws -> FMResultSet!` + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param values A `NSArray` of objects to be used when binding values to the `?` placeholders in the SQL statement. + + @param error A `NSError` object to receive any error object (if any). + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + + @note When called from Swift, only use the first two parameters, `sql` and `values`. This but throws the error. + + */ + +- (FMResultSet * _Nullable)executeQuery:(NSString *)sql values:(NSArray * _Nullable)values error:(NSError * _Nullable __autoreleasing *)error; + +/** Execute select statement + + Executing queries returns an `` object if successful, and `nil` upon failure. Like executing updates, there is a variant that accepts an `NSError **` parameter. Otherwise you should use the `` and `` methods to determine why a query failed. + + In order to iterate through the results of your query, you use a `while()` loop. You also need to "step" (via `<[FMResultSet next]>`) from one record to the other. + + @param sql The SELECT statement to be performed, with optional `?` placeholders. + + @param arguments A `NSDictionary` of objects keyed by column names that will be used when binding values to the `?` placeholders in the SQL statement. + + @return A `` for the result set upon success; `nil` upon failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see FMResultSet + @see [`FMResultSet next`](<[FMResultSet next]>) + */ + +- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary * _Nullable)arguments; + + +// Documentation forthcoming. +- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withVAList:(va_list)args; + +///------------------- +/// @name Transactions +///------------------- + +/** Begin a transaction + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see commit + @see rollback + @see beginDeferredTransaction + @see isInTransaction + */ + +- (BOOL)beginTransaction; + +/** Begin a deferred transaction + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see commit + @see rollback + @see beginTransaction + @see isInTransaction + */ + +- (BOOL)beginDeferredTransaction; + +/** Commit a transaction + + Commit a transaction that was initiated with either `` or with ``. + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see beginTransaction + @see beginDeferredTransaction + @see rollback + @see isInTransaction + */ + +- (BOOL)commit; + +/** Rollback a transaction + + Rollback a transaction that was initiated with either `` or with ``. + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see beginTransaction + @see beginDeferredTransaction + @see commit + @see isInTransaction + */ + +- (BOOL)rollback; + +/** Identify whether currently in a transaction or not + + @see beginTransaction + @see beginDeferredTransaction + @see commit + @see rollback + */ + +@property (nonatomic, readonly) BOOL isInTransaction; + +- (BOOL)inTransaction __deprecated_msg("Use isInTransaction property instead"); + + +///---------------------------------------- +/// @name Cached statements and result sets +///---------------------------------------- + +/** Clear cached statements */ + +- (void)clearCachedStatements; + +/** Close all open result sets */ + +- (void)closeOpenResultSets; + +/** Whether database has any open result sets + + @return `YES` if there are open result sets; `NO` if not. + */ + +@property (nonatomic, readonly) BOOL hasOpenResultSets; + +/** Whether should cache statements or not + */ + +@property (nonatomic) BOOL shouldCacheStatements; + +/** Interupt pending database operation + + This method causes any pending database operation to abort and return at its earliest opportunity + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + */ + +- (BOOL)interrupt; + +///------------------------- +/// @name Encryption methods +///------------------------- + +/** Set encryption key. + + @param key The key to be used. + + @return `YES` if success, `NO` on error. + + @see https://www.zetetic.net/sqlcipher/ + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)setKey:(NSString*)key; + +/** Reset encryption key + + @param key The key to be used. + + @return `YES` if success, `NO` on error. + + @see https://www.zetetic.net/sqlcipher/ + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)rekey:(NSString*)key; + +/** Set encryption key using `keyData`. + + @param keyData The `NSData` to be used. + + @return `YES` if success, `NO` on error. + + @see https://www.zetetic.net/sqlcipher/ + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)setKeyWithData:(NSData *)keyData; + +/** Reset encryption key using `keyData`. + + @param keyData The `NSData` to be used. + + @return `YES` if success, `NO` on error. + + @see https://www.zetetic.net/sqlcipher/ + + @warning You need to have purchased the sqlite encryption extensions for this method to work. + */ + +- (BOOL)rekeyWithData:(NSData *)keyData; + + +///------------------------------ +/// @name General inquiry methods +///------------------------------ + +/** The path of the database file + */ + +@property (nonatomic, readonly, nullable) NSString *databasePath; + +/** The file URL of the database file. + */ + +@property (nonatomic, readonly, nullable) NSURL *databaseURL; + +/** The underlying SQLite handle + + @return The `sqlite3` pointer. + + */ + +@property (nonatomic, readonly) void *sqliteHandle; + + +///----------------------------- +/// @name Retrieving error codes +///----------------------------- + +/** Last error message + + Returns the English-language text that describes the most recent failed SQLite API call associated with a database connection. If a prior API call failed but the most recent API call succeeded, this return value is undefined. + + @return `NSString` of the last error message. + + @see [sqlite3_errmsg()](http://sqlite.org/c3ref/errcode.html) + @see lastErrorCode + @see lastError + + */ + +- (NSString*)lastErrorMessage; + +/** Last error code + + Returns the numeric result code or extended result code for the most recent failed SQLite API call associated with a database connection. If a prior API call failed but the most recent API call succeeded, this return value is undefined. + + @return Integer value of the last error code. + + @see [sqlite3_errcode()](http://sqlite.org/c3ref/errcode.html) + @see lastErrorMessage + @see lastError + + */ + +- (int)lastErrorCode; + +/** Last extended error code + + Returns the numeric extended result code for the most recent failed SQLite API call associated with a database connection. If a prior API call failed but the most recent API call succeeded, this return value is undefined. + + @return Integer value of the last extended error code. + + @see [sqlite3_errcode()](http://sqlite.org/c3ref/errcode.html) + @see [2. Primary Result Codes versus Extended Result Codes](http://sqlite.org/rescode.html#primary_result_codes_versus_extended_result_codes) + @see [5. Extended Result Code List](http://sqlite.org/rescode.html#extrc) + @see lastErrorMessage + @see lastError + + */ + +- (int)lastExtendedErrorCode; + +/** Had error + + @return `YES` if there was an error, `NO` if no error. + + @see lastError + @see lastErrorCode + @see lastErrorMessage + + */ + +- (BOOL)hadError; + +/** Last error + + @return `NSError` representing the last error. + + @see lastErrorCode + @see lastErrorMessage + + */ + +- (NSError *)lastError; + + +// description forthcoming +@property (nonatomic) NSTimeInterval maxBusyRetryTimeInterval; + + +///------------------ +/// @name Save points +///------------------ + +/** Start save point + + @param name Name of save point. + + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see releaseSavePointWithName:error: + @see rollbackToSavePointWithName:error: + */ + +- (BOOL)startSavePointWithName:(NSString*)name error:(NSError * _Nullable *)outErr; + +/** Release save point + + @param name Name of save point. + + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see startSavePointWithName:error: + @see rollbackToSavePointWithName:error: + + */ + +- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError * _Nullable *)outErr; + +/** Roll back to save point + + @param name Name of save point. + @param outErr A `NSError` object to receive any error object (if any). + + @return `YES` on success; `NO` on failure. If failed, you can call ``, ``, or `` for diagnostic information regarding the failure. + + @see startSavePointWithName:error: + @see releaseSavePointWithName:error: + + */ + +- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError * _Nullable *)outErr; + +/** Start save point + + @param block Block of code to perform from within save point. + + @return The NSError corresponding to the error, if any. If no error, returns `nil`. + + @see startSavePointWithName:error: + @see releaseSavePointWithName:error: + @see rollbackToSavePointWithName:error: + + */ + +- (NSError * _Nullable)inSavePoint:(__attribute__((noescape)) void (^)(BOOL *rollback))block; + +///---------------------------- +/// @name SQLite library status +///---------------------------- + +/** Test to see if the library is threadsafe + + @return `NO` if and only if SQLite was compiled with mutexing code omitted due to the SQLITE_THREADSAFE compile-time option being set to 0. + + @see [sqlite3_threadsafe()](http://sqlite.org/c3ref/threadsafe.html) + */ + ++ (BOOL)isSQLiteThreadSafe; + +/** Run-time library version numbers + + @return The sqlite library version string. + + @see [sqlite3_libversion()](http://sqlite.org/c3ref/libversion.html) + */ + ++ (NSString*)sqliteLibVersion; + + ++ (NSString*)FMDBUserVersion; + ++ (SInt32)FMDBVersion; + + +///------------------------ +/// @name Make SQL function +///------------------------ + +/** Adds SQL functions or aggregates or to redefine the behavior of existing SQL functions or aggregates. + + For example: + + [db makeFunctionNamed:@"RemoveDiacritics" arguments:1 block:^(void *context, int argc, void **argv) { + SqliteValueType type = [self.db valueType:argv[0]]; + if (type == SqliteValueTypeNull) { + [self.db resultNullInContext:context]; + return; + } + if (type != SqliteValueTypeText) { + [self.db resultError:@"Expected text" context:context]; + return; + } + NSString *string = [self.db valueString:argv[0]]; + NSString *result = [string stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:nil]; + [self.db resultString:result context:context]; + }]; + + FMResultSet *rs = [db executeQuery:@"SELECT * FROM employees WHERE RemoveDiacritics(first_name) LIKE 'jose'"]; + NSAssert(rs, @"Error %@", [db lastErrorMessage]); + + @param name Name of function. + + @param arguments Maximum number of parameters. + + @param block The block of code for the function. + + @see [sqlite3_create_function()](http://sqlite.org/c3ref/create_function.html) + */ + +- (void)makeFunctionNamed:(NSString *)name arguments:(int)arguments block:(void (^)(void *context, int argc, void * _Nonnull * _Nonnull argv))block; + +- (void)makeFunctionNamed:(NSString *)name maximumArguments:(int)count withBlock:(void (^)(void *context, int argc, void * _Nonnull * _Nonnull argv))block __deprecated_msg("Use makeFunctionNamed:arguments:block:"); + +typedef NS_ENUM(int, SqliteValueType) { + SqliteValueTypeInteger = 1, + SqliteValueTypeFloat = 2, + SqliteValueTypeText = 3, + SqliteValueTypeBlob = 4, + SqliteValueTypeNull = 5 +}; + +- (SqliteValueType)valueType:(void *)argv; + +/** + Get integer value of parameter in custom function. + + @param value The argument whose value to return. + @return The integer value. + + @see makeFunctionNamed:arguments:block: + */ +- (int)valueInt:(void *)value; + +/** + Get long value of parameter in custom function. + + @param value The argument whose value to return. + @return The long value. + + @see makeFunctionNamed:arguments:block: + */ +- (long long)valueLong:(void *)value; + +/** + Get double value of parameter in custom function. + + @param value The argument whose value to return. + @return The double value. + + @see makeFunctionNamed:arguments:block: + */ +- (double)valueDouble:(void *)value; + +/** + Get `NSData` value of parameter in custom function. + + @param value The argument whose value to return. + @return The data object. + + @see makeFunctionNamed:arguments:block: + */ +- (NSData * _Nullable)valueData:(void *)value; + +/** + Get string value of parameter in custom function. + + @param value The argument whose value to return. + @return The string value. + + @see makeFunctionNamed:arguments:block: + */ +- (NSString * _Nullable)valueString:(void *)value; + +/** + Return null value from custom function. + + @param context The context to which the null value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultNullInContext:(void *)context NS_SWIFT_NAME(resultNull(context:)); + +/** + Return integer value from custom function. + + @param value The integer value to be returned. + @param context The context to which the value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultInt:(int) value context:(void *)context; + +/** + Return long value from custom function. + + @param value The long value to be returned. + @param context The context to which the value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultLong:(long long)value context:(void *)context; + +/** + Return double value from custom function. + + @param value The double value to be returned. + @param context The context to which the value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultDouble:(double)value context:(void *)context; + +/** + Return `NSData` object from custom function. + + @param data The `NSData` object to be returned. + @param context The context to which the value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultData:(NSData *)data context:(void *)context; + +/** + Return string value from custom function. + + @param value The string value to be returned. + @param context The context to which the value will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultString:(NSString *)value context:(void *)context; + +/** + Return error string from custom function. + + @param error The error string to be returned. + @param context The context to which the error will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultError:(NSString *)error context:(void *)context; + +/** + Return error code from custom function. + + @param errorCode The integer error code to be returned. + @param context The context to which the error will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultErrorCode:(int)errorCode context:(void *)context; + +/** + Report memory error in custom function. + + @param context The context to which the error will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultErrorNoMemoryInContext:(void *)context NS_SWIFT_NAME(resultErrorNoMemory(context:)); + +/** + Report that string or BLOB is too long to represent in custom function. + + @param context The context to which the error will be returned. + + @see makeFunctionNamed:arguments:block: + */ +- (void)resultErrorTooBigInContext:(void *)context NS_SWIFT_NAME(resultErrorTooBig(context:)); + +///--------------------- +/// @name Date formatter +///--------------------- + +/** Generate an `NSDateFormatter` that won't be broken by permutations of timezones or locales. + + Use this method to generate values to set the dateFormat property. + + Example: + + myDB.dateFormat = [FMDatabase storeableDateFormat:@"yyyy-MM-dd HH:mm:ss"]; + + @param format A valid NSDateFormatter format string. + + @return A `NSDateFormatter` that can be used for converting dates to strings and vice versa. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + + @warning Note that `NSDateFormatter` is not thread-safe, so the formatter generated by this method should be assigned to only one FMDB instance and should not be used for other purposes. + + */ + ++ (NSDateFormatter *)storeableDateFormat:(NSString *)format; + +/** Test whether the database has a date formatter assigned. + + @return `YES` if there is a date formatter; `NO` if not. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (BOOL)hasDateFormatter; + +/** Set to a date formatter to use string dates with sqlite instead of the default UNIX timestamps. + + @param format Set to nil to use UNIX timestamps. Defaults to nil. Should be set using a formatter generated using FMDatabase::storeableDateFormat. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + + @warning Note there is no direct getter for the `NSDateFormatter`, and you should not use the formatter you pass to FMDB for other purposes, as `NSDateFormatter` is not thread-safe. + */ + +- (void)setDateFormat:(NSDateFormatter *)format; + +/** Convert the supplied NSString to NSDate, using the current database formatter. + + @param s `NSString` to convert to `NSDate`. + + @return The `NSDate` object; or `nil` if no formatter is set. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (NSDate * _Nullable)dateFromString:(NSString *)s; + +/** Convert the supplied NSDate to NSString, using the current database formatter. + + @param date `NSDate` of date to convert to `NSString`. + + @return The `NSString` representation of the date; `nil` if no formatter is set. + + @see hasDateFormatter + @see setDateFormat: + @see dateFromString: + @see stringFromDate: + @see storeableDateFormat: + */ + +- (NSString *)stringFromDate:(NSDate *)date; + +@end + + +/** Objective-C wrapper for `sqlite3_stmt` + + This is a wrapper for a SQLite `sqlite3_stmt`. Generally when using FMDB you will not need to interact directly with `FMStatement`, but rather with `` and `` only. + + ### See also + + - `` + - `` + - [`sqlite3_stmt`](http://www.sqlite.org/c3ref/stmt.html) + */ + +@interface FMStatement : NSObject { + void *_statement; + NSString *_query; + long _useCount; + BOOL _inUse; +} + +///----------------- +/// @name Properties +///----------------- + +/** Usage count */ + +@property (atomic, assign) long useCount; + +/** SQL statement */ + +@property (atomic, retain) NSString *query; + +/** SQLite sqlite3_stmt + + @see [`sqlite3_stmt`](http://www.sqlite.org/c3ref/stmt.html) + */ + +@property (atomic, assign) void *statement; + +/** Indication of whether the statement is in use */ + +@property (atomic, assign) BOOL inUse; + +///---------------------------- +/// @name Closing and Resetting +///---------------------------- + +/** Close statement */ + +- (void)close; + +/** Reset statement */ + +- (void)reset; + +@end + +#pragma clang diagnostic pop + +NS_ASSUME_NONNULL_END diff --git a/Pods/FMDB/src/fmdb/FMDatabase.m b/Pods/FMDB/src/fmdb/FMDatabase.m new file mode 100644 index 0000000..493e772 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabase.m @@ -0,0 +1,1596 @@ +#import "FMDatabase.h" +#import "unistd.h" +#import + +#if FMDB_SQLITE_STANDALONE +#import +#else +#import +#endif + +@interface FMDatabase () { + void* _db; + BOOL _isExecutingStatement; + NSTimeInterval _startBusyRetryTime; + + NSMutableSet *_openResultSets; + NSMutableSet *_openFunctions; + + NSDateFormatter *_dateFormat; +} + +NS_ASSUME_NONNULL_BEGIN + +- (FMResultSet * _Nullable)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray * _Nullable)arrayArgs orDictionary:(NSDictionary * _Nullable)dictionaryArgs orVAList:(va_list)args; +- (BOOL)executeUpdate:(NSString *)sql error:(NSError * _Nullable *)outErr withArgumentsInArray:(NSArray * _Nullable)arrayArgs orDictionary:(NSDictionary * _Nullable)dictionaryArgs orVAList:(va_list)args; + +NS_ASSUME_NONNULL_END + +@end + +@implementation FMDatabase + +// Because these two properties have all of their accessor methods implemented, +// we have to synthesize them to get the corresponding ivars. The rest of the +// properties have their ivars synthesized automatically for us. + +@synthesize shouldCacheStatements = _shouldCacheStatements; +@synthesize maxBusyRetryTimeInterval = _maxBusyRetryTimeInterval; + +#pragma mark FMDatabase instantiation and deallocation + ++ (instancetype)databaseWithPath:(NSString *)aPath { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]); +} + ++ (instancetype)databaseWithURL:(NSURL *)url { + return FMDBReturnAutoreleased([[self alloc] initWithURL:url]); +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + +- (instancetype)initWithURL:(NSURL *)url { + return [self initWithPath:url.path]; +} + +- (instancetype)initWithPath:(NSString *)path { + + assert(sqlite3_threadsafe()); // whoa there big boy- gotta make sure sqlite it happy with what we're going to do. + + self = [super init]; + + if (self) { + _databasePath = [path copy]; + _openResultSets = [[NSMutableSet alloc] init]; + _db = nil; + _logsErrors = YES; + _crashOnErrors = NO; + _maxBusyRetryTimeInterval = 2; + } + + return self; +} + +#if ! __has_feature(objc_arc) +- (void)finalize { + [self close]; + [super finalize]; +} +#endif + +- (void)dealloc { + [self close]; + FMDBRelease(_openResultSets); + FMDBRelease(_cachedStatements); + FMDBRelease(_dateFormat); + FMDBRelease(_databasePath); + FMDBRelease(_openFunctions); + +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (NSURL *)databaseURL { + return _databasePath ? [NSURL fileURLWithPath:_databasePath] : nil; +} + ++ (NSString*)FMDBUserVersion { + return @"2.7.2"; +} + +// returns 0x0240 for version 2.4. This makes it super easy to do things like: +// /* need to make sure to do X with FMDB version 2.4 or later */ +// if ([FMDatabase FMDBVersion] >= 0x0240) { … } + ++ (SInt32)FMDBVersion { + + // we go through these hoops so that we only have to change the version number in a single spot. + static dispatch_once_t once; + static SInt32 FMDBVersionVal = 0; + + dispatch_once(&once, ^{ + NSString *prodVersion = [self FMDBUserVersion]; + + if ([[prodVersion componentsSeparatedByString:@"."] count] < 3) { + prodVersion = [prodVersion stringByAppendingString:@".0"]; + } + + NSString *junk = [prodVersion stringByReplacingOccurrencesOfString:@"." withString:@""]; + + char *e = nil; + FMDBVersionVal = (int) strtoul([junk UTF8String], &e, 16); + + }); + + return FMDBVersionVal; +} + +#pragma mark SQLite information + ++ (NSString*)sqliteLibVersion { + return [NSString stringWithFormat:@"%s", sqlite3_libversion()]; +} + ++ (BOOL)isSQLiteThreadSafe { + // make sure to read the sqlite headers on this guy! + return sqlite3_threadsafe() != 0; +} + +- (void*)sqliteHandle { + return _db; +} + +- (const char*)sqlitePath { + + if (!_databasePath) { + return ":memory:"; + } + + if ([_databasePath length] == 0) { + return ""; // this creates a temporary database (it's an sqlite thing). + } + + return [_databasePath fileSystemRepresentation]; + +} + +#pragma mark Open and close database + +- (BOOL)open { + if (_db) { + return YES; + } + + int err = sqlite3_open([self sqlitePath], (sqlite3**)&_db ); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + + if (_maxBusyRetryTimeInterval > 0.0) { + // set the handler + [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval]; + } + + + return YES; +} + +- (BOOL)openWithFlags:(int)flags { + return [self openWithFlags:flags vfs:nil]; +} +- (BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName { +#if SQLITE_VERSION_NUMBER >= 3005000 + if (_db) { + return YES; + } + + int err = sqlite3_open_v2([self sqlitePath], (sqlite3**)&_db, flags, [vfsName UTF8String]); + if(err != SQLITE_OK) { + NSLog(@"error opening!: %d", err); + return NO; + } + + if (_maxBusyRetryTimeInterval > 0.0) { + // set the handler + [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval]; + } + + return YES; +#else + NSLog(@"openWithFlags requires SQLite 3.5"); + return NO; +#endif +} + + +- (BOOL)close { + + [self clearCachedStatements]; + [self closeOpenResultSets]; + + if (!_db) { + return YES; + } + + int rc; + BOOL retry; + BOOL triedFinalizingOpenStatements = NO; + + do { + retry = NO; + rc = sqlite3_close(_db); + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + if (!triedFinalizingOpenStatements) { + triedFinalizingOpenStatements = YES; + sqlite3_stmt *pStmt; + while ((pStmt = sqlite3_next_stmt(_db, nil)) !=0) { + NSLog(@"Closing leaked statement"); + sqlite3_finalize(pStmt); + retry = YES; + } + } + } + else if (SQLITE_OK != rc) { + NSLog(@"error closing!: %d", rc); + } + } + while (retry); + + _db = nil; + return YES; +} + +#pragma mark Busy handler routines + +// NOTE: appledoc seems to choke on this function for some reason; +// so when generating documentation, you might want to ignore the +// .m files so that it only documents the public interfaces outlined +// in the .h files. +// +// This is a known appledoc bug that it has problems with C functions +// within a class implementation, but for some reason, only this +// C function causes problems; the rest don't. Anyway, ignoring the .m +// files with appledoc will prevent this problem from occurring. + +static int FMDBDatabaseBusyHandler(void *f, int count) { + FMDatabase *self = (__bridge FMDatabase*)f; + + if (count == 0) { + self->_startBusyRetryTime = [NSDate timeIntervalSinceReferenceDate]; + return 1; + } + + NSTimeInterval delta = [NSDate timeIntervalSinceReferenceDate] - (self->_startBusyRetryTime); + + if (delta < [self maxBusyRetryTimeInterval]) { + int requestedSleepInMillseconds = (int) arc4random_uniform(50) + 50; + int actualSleepInMilliseconds = sqlite3_sleep(requestedSleepInMillseconds); + if (actualSleepInMilliseconds != requestedSleepInMillseconds) { + NSLog(@"WARNING: Requested sleep of %i milliseconds, but SQLite returned %i. Maybe SQLite wasn't built with HAVE_USLEEP=1?", requestedSleepInMillseconds, actualSleepInMilliseconds); + } + return 1; + } + + return 0; +} + +- (void)setMaxBusyRetryTimeInterval:(NSTimeInterval)timeout { + + _maxBusyRetryTimeInterval = timeout; + + if (!_db) { + return; + } + + if (timeout > 0) { + sqlite3_busy_handler(_db, &FMDBDatabaseBusyHandler, (__bridge void *)(self)); + } + else { + // turn it off otherwise + sqlite3_busy_handler(_db, nil, nil); + } +} + +- (NSTimeInterval)maxBusyRetryTimeInterval { + return _maxBusyRetryTimeInterval; +} + + +// we no longer make busyRetryTimeout public +// but for folks who don't bother noticing that the interface to FMDatabase changed, +// we'll still implement the method so they don't get suprise crashes +- (int)busyRetryTimeout { + NSLog(@"%s:%d", __FUNCTION__, __LINE__); + NSLog(@"FMDB: busyRetryTimeout no longer works, please use maxBusyRetryTimeInterval"); + return -1; +} + +- (void)setBusyRetryTimeout:(int)i { +#pragma unused(i) + NSLog(@"%s:%d", __FUNCTION__, __LINE__); + NSLog(@"FMDB: setBusyRetryTimeout does nothing, please use setMaxBusyRetryTimeInterval:"); +} + +#pragma mark Result set functions + +- (BOOL)hasOpenResultSets { + return [_openResultSets count] > 0; +} + +- (void)closeOpenResultSets { + + //Copy the set so we don't get mutation errors + NSSet *openSetCopy = FMDBReturnAutoreleased([_openResultSets copy]); + for (NSValue *rsInWrappedInATastyValueMeal in openSetCopy) { + FMResultSet *rs = (FMResultSet *)[rsInWrappedInATastyValueMeal pointerValue]; + + [rs setParentDB:nil]; + [rs close]; + + [_openResultSets removeObject:rsInWrappedInATastyValueMeal]; + } +} + +- (void)resultSetDidClose:(FMResultSet *)resultSet { + NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet]; + + [_openResultSets removeObject:setValue]; +} + +#pragma mark Cached statements + +- (void)clearCachedStatements { + + for (NSMutableSet *statements in [_cachedStatements objectEnumerator]) { + for (FMStatement *statement in [statements allObjects]) { + [statement close]; + } + } + + [_cachedStatements removeAllObjects]; +} + +- (FMStatement*)cachedStatementForQuery:(NSString*)query { + + NSMutableSet* statements = [_cachedStatements objectForKey:query]; + + return [[statements objectsPassingTest:^BOOL(FMStatement* statement, BOOL *stop) { + + *stop = ![statement inUse]; + return *stop; + + }] anyObject]; +} + + +- (void)setCachedStatement:(FMStatement*)statement forQuery:(NSString*)query { + + query = [query copy]; // in case we got handed in a mutable string... + [statement setQuery:query]; + + NSMutableSet* statements = [_cachedStatements objectForKey:query]; + if (!statements) { + statements = [NSMutableSet set]; + } + + [statements addObject:statement]; + + [_cachedStatements setObject:statements forKey:query]; + + FMDBRelease(query); +} + +#pragma mark Key routines + +- (BOOL)rekey:(NSString*)key { + NSData *keyData = [NSData dataWithBytes:(void *)[key UTF8String] length:(NSUInteger)strlen([key UTF8String])]; + + return [self rekeyWithData:keyData]; +} + +- (BOOL)rekeyWithData:(NSData *)keyData { +#ifdef SQLITE_HAS_CODEC + if (!keyData) { + return NO; + } + + int rc = sqlite3_rekey(_db, [keyData bytes], (int)[keyData length]); + + if (rc != SQLITE_OK) { + NSLog(@"error on rekey: %d", rc); + NSLog(@"%@", [self lastErrorMessage]); + } + + return (rc == SQLITE_OK); +#else +#pragma unused(keyData) + return NO; +#endif +} + +- (BOOL)setKey:(NSString*)key { + NSData *keyData = [NSData dataWithBytes:[key UTF8String] length:(NSUInteger)strlen([key UTF8String])]; + + return [self setKeyWithData:keyData]; +} + +- (BOOL)setKeyWithData:(NSData *)keyData { +#ifdef SQLITE_HAS_CODEC + if (!keyData) { + return NO; + } + + int rc = sqlite3_key(_db, [keyData bytes], (int)[keyData length]); + + return (rc == SQLITE_OK); +#else +#pragma unused(keyData) + return NO; +#endif +} + +#pragma mark Date routines + ++ (NSDateFormatter *)storeableDateFormat:(NSString *)format { + + NSDateFormatter *result = FMDBReturnAutoreleased([[NSDateFormatter alloc] init]); + result.dateFormat = format; + result.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0]; + result.locale = FMDBReturnAutoreleased([[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]); + return result; +} + + +- (BOOL)hasDateFormatter { + return _dateFormat != nil; +} + +- (void)setDateFormat:(NSDateFormatter *)format { + FMDBAutorelease(_dateFormat); + _dateFormat = FMDBReturnRetained(format); +} + +- (NSDate *)dateFromString:(NSString *)s { + return [_dateFormat dateFromString:s]; +} + +- (NSString *)stringFromDate:(NSDate *)date { + return [_dateFormat stringFromDate:date]; +} + +#pragma mark State of database + +- (BOOL)goodConnection { + + if (!_db) { + return NO; + } + + FMResultSet *rs = [self executeQuery:@"select name from sqlite_master where type='table'"]; + + if (rs) { + [rs close]; + return YES; + } + + return NO; +} + +- (void)warnInUse { + NSLog(@"The FMDatabase %@ is currently in use.", self); + +#ifndef NS_BLOCK_ASSERTIONS + if (_crashOnErrors) { + NSAssert(false, @"The FMDatabase %@ is currently in use.", self); + abort(); + } +#endif +} + +- (BOOL)databaseExists { + + if (!_db) { + + NSLog(@"The FMDatabase %@ is not open.", self); + +#ifndef NS_BLOCK_ASSERTIONS + if (_crashOnErrors) { + NSAssert(false, @"The FMDatabase %@ is not open.", self); + abort(); + } +#endif + + return NO; + } + + return YES; +} + +#pragma mark Error routines + +- (NSString *)lastErrorMessage { + return [NSString stringWithUTF8String:sqlite3_errmsg(_db)]; +} + +- (BOOL)hadError { + int lastErrCode = [self lastErrorCode]; + + return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW); +} + +- (int)lastErrorCode { + return sqlite3_errcode(_db); +} + +- (int)lastExtendedErrorCode { + return sqlite3_extended_errcode(_db); +} + +- (NSError*)errorWithMessage:(NSString *)message { + NSDictionary* errorMessage = [NSDictionary dictionaryWithObject:message forKey:NSLocalizedDescriptionKey]; + + return [NSError errorWithDomain:@"FMDatabase" code:sqlite3_errcode(_db) userInfo:errorMessage]; +} + +- (NSError*)lastError { + return [self errorWithMessage:[self lastErrorMessage]]; +} + +#pragma mark Update information routines + +- (sqlite_int64)lastInsertRowId { + + if (_isExecutingStatement) { + [self warnInUse]; + return NO; + } + + _isExecutingStatement = YES; + + sqlite_int64 ret = sqlite3_last_insert_rowid(_db); + + _isExecutingStatement = NO; + + return ret; +} + +- (int)changes { + if (_isExecutingStatement) { + [self warnInUse]; + return 0; + } + + _isExecutingStatement = YES; + + int ret = sqlite3_changes(_db); + + _isExecutingStatement = NO; + + return ret; +} + +#pragma mark SQL manipulation + +- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt { + + if ((!obj) || ((NSNull *)obj == [NSNull null])) { + sqlite3_bind_null(pStmt, idx); + } + + // FIXME - someday check the return codes on these binds. + else if ([obj isKindOfClass:[NSData class]]) { + const void *bytes = [obj bytes]; + if (!bytes) { + // it's an empty NSData object, aka [NSData data]. + // Don't pass a NULL pointer, or sqlite will bind a SQL null instead of a blob. + bytes = ""; + } + sqlite3_bind_blob(pStmt, idx, bytes, (int)[obj length], SQLITE_STATIC); + } + else if ([obj isKindOfClass:[NSDate class]]) { + if (self.hasDateFormatter) + sqlite3_bind_text(pStmt, idx, [[self stringFromDate:obj] UTF8String], -1, SQLITE_STATIC); + else + sqlite3_bind_double(pStmt, idx, [obj timeIntervalSince1970]); + } + else if ([obj isKindOfClass:[NSNumber class]]) { + + if (strcmp([obj objCType], @encode(char)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj charValue]); + } + else if (strcmp([obj objCType], @encode(unsigned char)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj unsignedCharValue]); + } + else if (strcmp([obj objCType], @encode(short)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj shortValue]); + } + else if (strcmp([obj objCType], @encode(unsigned short)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj unsignedShortValue]); + } + else if (strcmp([obj objCType], @encode(int)) == 0) { + sqlite3_bind_int(pStmt, idx, [obj intValue]); + } + else if (strcmp([obj objCType], @encode(unsigned int)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedIntValue]); + } + else if (strcmp([obj objCType], @encode(long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longValue]); + } + else if (strcmp([obj objCType], @encode(unsigned long)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedLongValue]); + } + else if (strcmp([obj objCType], @encode(long long)) == 0) { + sqlite3_bind_int64(pStmt, idx, [obj longLongValue]); + } + else if (strcmp([obj objCType], @encode(unsigned long long)) == 0) { + sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedLongLongValue]); + } + else if (strcmp([obj objCType], @encode(float)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj floatValue]); + } + else if (strcmp([obj objCType], @encode(double)) == 0) { + sqlite3_bind_double(pStmt, idx, [obj doubleValue]); + } + else if (strcmp([obj objCType], @encode(BOOL)) == 0) { + sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0)); + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } + } + else { + sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC); + } +} + +- (void)extractSQL:(NSString *)sql argumentsList:(va_list)args intoString:(NSMutableString *)cleanedSQL arguments:(NSMutableArray *)arguments { + + NSUInteger length = [sql length]; + unichar last = '\0'; + for (NSUInteger i = 0; i < length; ++i) { + id arg = nil; + unichar current = [sql characterAtIndex:i]; + unichar add = current; + if (last == '%') { + switch (current) { + case '@': + arg = va_arg(args, id); + break; + case 'c': + // warning: second argument to 'va_arg' is of promotable type 'char'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSString stringWithFormat:@"%c", va_arg(args, int)]; + break; + case 's': + arg = [NSString stringWithUTF8String:va_arg(args, char*)]; + break; + case 'd': + case 'D': + case 'i': + arg = [NSNumber numberWithInt:va_arg(args, int)]; + break; + case 'u': + case 'U': + arg = [NSNumber numberWithUnsignedInt:va_arg(args, unsigned int)]; + break; + case 'h': + i++; + if (i < length && [sql characterAtIndex:i] == 'i') { + // warning: second argument to 'va_arg' is of promotable type 'short'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSNumber numberWithShort:(short)(va_arg(args, int))]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + // warning: second argument to 'va_arg' is of promotable type 'unsigned short'; this va_arg has undefined behavior because arguments will be promoted to 'int' + arg = [NSNumber numberWithUnsignedShort:(unsigned short)(va_arg(args, uint))]; + } + else { + i--; + } + break; + case 'q': + i++; + if (i < length && [sql characterAtIndex:i] == 'i') { + arg = [NSNumber numberWithLongLong:va_arg(args, long long)]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)]; + } + else { + i--; + } + break; + case 'f': + arg = [NSNumber numberWithDouble:va_arg(args, double)]; + break; + case 'g': + // warning: second argument to 'va_arg' is of promotable type 'float'; this va_arg has undefined behavior because arguments will be promoted to 'double' + arg = [NSNumber numberWithFloat:(float)(va_arg(args, double))]; + break; + case 'l': + i++; + if (i < length) { + unichar next = [sql characterAtIndex:i]; + if (next == 'l') { + i++; + if (i < length && [sql characterAtIndex:i] == 'd') { + //%lld + arg = [NSNumber numberWithLongLong:va_arg(args, long long)]; + } + else if (i < length && [sql characterAtIndex:i] == 'u') { + //%llu + arg = [NSNumber numberWithUnsignedLongLong:va_arg(args, unsigned long long)]; + } + else { + i--; + } + } + else if (next == 'd') { + //%ld + arg = [NSNumber numberWithLong:va_arg(args, long)]; + } + else if (next == 'u') { + //%lu + arg = [NSNumber numberWithUnsignedLong:va_arg(args, unsigned long)]; + } + else { + i--; + } + } + else { + i--; + } + break; + default: + // something else that we can't interpret. just pass it on through like normal + break; + } + } + else if (current == '%') { + // percent sign; skip this character + add = '\0'; + } + + if (arg != nil) { + [cleanedSQL appendString:@"?"]; + [arguments addObject:arg]; + } + else if (add == (unichar)'@' && last == (unichar) '%') { + [cleanedSQL appendFormat:@"NULL"]; + } + else if (add != '\0') { + [cleanedSQL appendFormat:@"%C", add]; + } + last = current; + } +} + +#pragma mark Execute queries + +- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments { + return [self executeQuery:sql withArgumentsInArray:nil orDictionary:arguments orVAList:nil]; +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args { + + if (![self databaseExists]) { + return 0x00; + } + + if (_isExecutingStatement) { + [self warnInUse]; + return 0x00; + } + + _isExecutingStatement = YES; + + int rc = 0x00; + sqlite3_stmt *pStmt = 0x00; + FMStatement *statement = 0x00; + FMResultSet *rs = 0x00; + + if (_traceExecution && sql) { + NSLog(@"%@ executeQuery: %@", self, sql); + } + + if (_shouldCacheStatements) { + statement = [self cachedStatementForQuery:sql]; + pStmt = statement ? [statement statement] : 0x00; + [statement reset]; + } + + if (!pStmt) { + + rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); + + if (SQLITE_OK != rc) { + if (_logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); + NSLog(@"DB Path: %@", _databasePath); + } + + if (_crashOnErrors) { + NSAssert(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + abort(); + } + + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return nil; + } + } + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); // pointed out by Dominic Yu (thanks!) + + // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support + if (dictionaryArgs) { + + for (NSString *dictionaryKey in [dictionaryArgs allKeys]) { + + // Prefix the key with a colon. + NSString *parameterName = [[NSString alloc] initWithFormat:@":%@", dictionaryKey]; + + if (_traceExecution) { + NSLog(@"%@ = %@", parameterName, [dictionaryArgs objectForKey:dictionaryKey]); + } + + // Get the index for the parameter name. + int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]); + + FMDBRelease(parameterName); + + if (namedIdx > 0) { + // Standard binding from here. + [self bindObject:[dictionaryArgs objectForKey:dictionaryKey] toColumn:namedIdx inStatement:pStmt]; + // increment the binding count, so our check below works out + idx++; + } + else { + NSLog(@"Could not find index for %@", dictionaryKey); + } + } + } + else { + + while (idx < queryCount) { + + if (arrayArgs && idx < (int)[arrayArgs count]) { + obj = [arrayArgs objectAtIndex:(NSUInteger)idx]; + } + else if (args) { + obj = va_arg(args, id); + } + else { + //We ran out of arguments + break; + } + + if (_traceExecution) { + if ([obj isKindOfClass:[NSData class]]) { + NSLog(@"data: %ld bytes", (unsigned long)[(NSData*)obj length]); + } + else { + NSLog(@"obj: %@", obj); + } + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + } + + if (idx != queryCount) { + NSLog(@"Error: the bind count is not correct for the # of variables (executeQuery)"); + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return nil; + } + + FMDBRetain(statement); // to balance the release below + + if (!statement) { + statement = [[FMStatement alloc] init]; + [statement setStatement:pStmt]; + + if (_shouldCacheStatements && sql) { + [self setCachedStatement:statement forQuery:sql]; + } + } + + // the statement gets closed in rs's dealloc or [rs close]; + rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self]; + [rs setQuery:sql]; + + NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs]; + [_openResultSets addObject:openResultSet]; + + [statement setUseCount:[statement useCount] + 1]; + + FMDBRelease(statement); + + _isExecutingStatement = NO; + + return rs; +} + +- (FMResultSet *)executeQuery:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + id result = [self executeQuery:sql withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ... { + va_list args; + va_start(args, format); + + NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]]; + NSMutableArray *arguments = [NSMutableArray array]; + [self extractSQL:format argumentsList:args intoString:sql arguments:arguments]; + + va_end(args); + + return [self executeQuery:sql withArgumentsInArray:arguments]; +} + +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeQuery:sql withArgumentsInArray:arguments orDictionary:nil orVAList:nil]; +} + +- (FMResultSet *)executeQuery:(NSString *)sql values:(NSArray *)values error:(NSError * __autoreleasing *)error { + FMResultSet *rs = [self executeQuery:sql withArgumentsInArray:values orDictionary:nil orVAList:nil]; + if (!rs && error) { + *error = [self lastError]; + } + return rs; +} + +- (FMResultSet *)executeQuery:(NSString*)sql withVAList:(va_list)args { + return [self executeQuery:sql withArgumentsInArray:nil orDictionary:nil orVAList:args]; +} + +#pragma mark Execute updates + +- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args { + + if (![self databaseExists]) { + return NO; + } + + if (_isExecutingStatement) { + [self warnInUse]; + return NO; + } + + _isExecutingStatement = YES; + + int rc = 0x00; + sqlite3_stmt *pStmt = 0x00; + FMStatement *cachedStmt = 0x00; + + if (_traceExecution && sql) { + NSLog(@"%@ executeUpdate: %@", self, sql); + } + + if (_shouldCacheStatements) { + cachedStmt = [self cachedStatementForQuery:sql]; + pStmt = cachedStmt ? [cachedStmt statement] : 0x00; + [cachedStmt reset]; + } + + if (!pStmt) { + rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0); + + if (SQLITE_OK != rc) { + if (_logsErrors) { + NSLog(@"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + NSLog(@"DB Query: %@", sql); + NSLog(@"DB Path: %@", _databasePath); + } + + if (_crashOnErrors) { + NSAssert(false, @"DB Error: %d \"%@\"", [self lastErrorCode], [self lastErrorMessage]); + abort(); + } + + if (outErr) { + *outErr = [self errorWithMessage:[NSString stringWithUTF8String:sqlite3_errmsg(_db)]]; + } + + sqlite3_finalize(pStmt); + + _isExecutingStatement = NO; + return NO; + } + } + + id obj; + int idx = 0; + int queryCount = sqlite3_bind_parameter_count(pStmt); + + // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support + if (dictionaryArgs) { + + for (NSString *dictionaryKey in [dictionaryArgs allKeys]) { + + // Prefix the key with a colon. + NSString *parameterName = [[NSString alloc] initWithFormat:@":%@", dictionaryKey]; + + if (_traceExecution) { + NSLog(@"%@ = %@", parameterName, [dictionaryArgs objectForKey:dictionaryKey]); + } + // Get the index for the parameter name. + int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]); + + FMDBRelease(parameterName); + + if (namedIdx > 0) { + // Standard binding from here. + [self bindObject:[dictionaryArgs objectForKey:dictionaryKey] toColumn:namedIdx inStatement:pStmt]; + + // increment the binding count, so our check below works out + idx++; + } + else { + NSString *message = [NSString stringWithFormat:@"Could not find index for %@", dictionaryKey]; + + if (_logsErrors) { + NSLog(@"%@", message); + } + if (outErr) { + *outErr = [self errorWithMessage:message]; + } + } + } + } + else { + + while (idx < queryCount) { + + if (arrayArgs && idx < (int)[arrayArgs count]) { + obj = [arrayArgs objectAtIndex:(NSUInteger)idx]; + } + else if (args) { + obj = va_arg(args, id); + } + else { + //We ran out of arguments + break; + } + + if (_traceExecution) { + if ([obj isKindOfClass:[NSData class]]) { + NSLog(@"data: %ld bytes", (unsigned long)[(NSData*)obj length]); + } + else { + NSLog(@"obj: %@", obj); + } + } + + idx++; + + [self bindObject:obj toColumn:idx inStatement:pStmt]; + } + } + + + if (idx != queryCount) { + NSString *message = [NSString stringWithFormat:@"Error: the bind count (%d) is not correct for the # of variables in the query (%d) (%@) (executeUpdate)", idx, queryCount, sql]; + if (_logsErrors) { + NSLog(@"%@", message); + } + if (outErr) { + *outErr = [self errorWithMessage:message]; + } + + sqlite3_finalize(pStmt); + _isExecutingStatement = NO; + return NO; + } + + /* Call sqlite3_step() to run the virtual machine. Since the SQL being + ** executed is not a SELECT statement, we assume no data will be returned. + */ + + rc = sqlite3_step(pStmt); + + if (SQLITE_DONE == rc) { + // all is well, let's return. + } + else if (SQLITE_INTERRUPT == rc) { + if (_logsErrors) { + NSLog(@"Error calling sqlite3_step. Query was interrupted (%d: %s) SQLITE_INTERRUPT", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + else if (rc == SQLITE_ROW) { + NSString *message = [NSString stringWithFormat:@"A executeUpdate is being called with a query string '%@'", sql]; + if (_logsErrors) { + NSLog(@"%@", message); + NSLog(@"DB Query: %@", sql); + } + if (outErr) { + *outErr = [self errorWithMessage:message]; + } + } + else { + if (outErr) { + *outErr = [self errorWithMessage:[NSString stringWithUTF8String:sqlite3_errmsg(_db)]]; + } + + if (SQLITE_ERROR == rc) { + if (_logsErrors) { + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_ERROR", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + if (_logsErrors) { + NSLog(@"Error calling sqlite3_step (%d: %s) SQLITE_MISUSE", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + else { + // wtf? + if (_logsErrors) { + NSLog(@"Unknown error calling sqlite3_step (%d: %s) eu", rc, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + } + + if (_shouldCacheStatements && !cachedStmt) { + cachedStmt = [[FMStatement alloc] init]; + + [cachedStmt setStatement:pStmt]; + + [self setCachedStatement:cachedStmt forQuery:sql]; + + FMDBRelease(cachedStmt); + } + + int closeErrorCode; + + if (cachedStmt) { + [cachedStmt setUseCount:[cachedStmt useCount] + 1]; + closeErrorCode = sqlite3_reset(pStmt); + } + else { + /* Finalize the virtual machine. This releases all memory and other + ** resources allocated by the sqlite3_prepare() call above. + */ + closeErrorCode = sqlite3_finalize(pStmt); + } + + if (closeErrorCode != SQLITE_OK) { + if (_logsErrors) { + NSLog(@"Unknown error finalizing or resetting statement (%d: %s)", closeErrorCode, sqlite3_errmsg(_db)); + NSLog(@"DB Query: %@", sql); + } + } + + _isExecutingStatement = NO; + return (rc == SQLITE_DONE || rc == SQLITE_OK); +} + + +- (BOOL)executeUpdate:(NSString*)sql, ... { + va_list args; + va_start(args, sql); + + BOOL result = [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments { + return [self executeUpdate:sql error:nil withArgumentsInArray:arguments orDictionary:nil orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql values:(NSArray *)values error:(NSError * __autoreleasing *)error { + return [self executeUpdate:sql error:error withArgumentsInArray:values orDictionary:nil orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments { + return [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:arguments orVAList:nil]; +} + +- (BOOL)executeUpdate:(NSString*)sql withVAList:(va_list)args { + return [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:nil orVAList:args]; +} + +- (BOOL)executeUpdateWithFormat:(NSString*)format, ... { + va_list args; + va_start(args, format); + + NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]]; + NSMutableArray *arguments = [NSMutableArray array]; + + [self extractSQL:format argumentsList:args intoString:sql arguments:arguments]; + + va_end(args); + + return [self executeUpdate:sql withArgumentsInArray:arguments]; +} + + +int FMDBExecuteBulkSQLCallback(void *theBlockAsVoid, int columns, char **values, char **names); // shhh clang. +int FMDBExecuteBulkSQLCallback(void *theBlockAsVoid, int columns, char **values, char **names) { + + if (!theBlockAsVoid) { + return SQLITE_OK; + } + + int (^execCallbackBlock)(NSDictionary *resultsDictionary) = (__bridge int (^)(NSDictionary *__strong))(theBlockAsVoid); + + NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:(NSUInteger)columns]; + + for (NSInteger i = 0; i < columns; i++) { + NSString *key = [NSString stringWithUTF8String:names[i]]; + id value = values[i] ? [NSString stringWithUTF8String:values[i]] : [NSNull null]; + [dictionary setObject:value forKey:key]; + } + + return execCallbackBlock(dictionary); +} + +- (BOOL)executeStatements:(NSString *)sql { + return [self executeStatements:sql withResultBlock:nil]; +} + +- (BOOL)executeStatements:(NSString *)sql withResultBlock:(FMDBExecuteStatementsCallbackBlock)block { + + int rc; + char *errmsg = nil; + + rc = sqlite3_exec([self sqliteHandle], [sql UTF8String], block ? FMDBExecuteBulkSQLCallback : nil, (__bridge void *)(block), &errmsg); + + if (errmsg && [self logsErrors]) { + NSLog(@"Error inserting batch: %s", errmsg); + sqlite3_free(errmsg); + } + + return (rc == SQLITE_OK); +} + +- (BOOL)executeUpdate:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... { + + va_list args; + va_start(args, outErr); + + BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... { + va_list args; + va_start(args, outErr); + + BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:args]; + + va_end(args); + return result; +} + +#pragma clang diagnostic pop + +#pragma mark Transactions + +- (BOOL)rollback { + BOOL b = [self executeUpdate:@"rollback transaction"]; + + if (b) { + _isInTransaction = NO; + } + + return b; +} + +- (BOOL)commit { + BOOL b = [self executeUpdate:@"commit transaction"]; + + if (b) { + _isInTransaction = NO; + } + + return b; +} + +- (BOOL)beginDeferredTransaction { + + BOOL b = [self executeUpdate:@"begin deferred transaction"]; + if (b) { + _isInTransaction = YES; + } + + return b; +} + +- (BOOL)beginTransaction { + + BOOL b = [self executeUpdate:@"begin exclusive transaction"]; + if (b) { + _isInTransaction = YES; + } + + return b; +} + +- (BOOL)inTransaction { + return _isInTransaction; +} + +- (BOOL)interrupt +{ + if (_db) { + sqlite3_interrupt([self sqliteHandle]); + return YES; + } + return NO; +} + +static NSString *FMDBEscapeSavePointName(NSString *savepointName) { + return [savepointName stringByReplacingOccurrencesOfString:@"'" withString:@"''"]; +} + +- (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr { +#if SQLITE_VERSION_NUMBER >= 3007000 + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"savepoint '%@';", FMDBEscapeSavePointName(name)]; + + return [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:nil]; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return NO; +#endif +} + +- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr { +#if SQLITE_VERSION_NUMBER >= 3007000 + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"release savepoint '%@';", FMDBEscapeSavePointName(name)]; + + return [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:nil]; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return NO; +#endif +} + +- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr { +#if SQLITE_VERSION_NUMBER >= 3007000 + NSParameterAssert(name); + + NSString *sql = [NSString stringWithFormat:@"rollback transaction to savepoint '%@';", FMDBEscapeSavePointName(name)]; + + return [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:nil]; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return NO; +#endif +} + +- (NSError*)inSavePoint:(void (^)(BOOL *rollback))block { +#if SQLITE_VERSION_NUMBER >= 3007000 + static unsigned long savePointIdx = 0; + + NSString *name = [NSString stringWithFormat:@"dbSavePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + NSError *err = 0x00; + + if (![self startSavePointWithName:name error:&err]) { + return err; + } + + if (block) { + block(&shouldRollback); + } + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [self rollbackToSavePointWithName:name error:&err]; + } + [self releaseSavePointWithName:name error:&err]; + + return err; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return [NSError errorWithDomain:@"FMDatabase" code:0 userInfo:@{NSLocalizedDescriptionKey : errorMessage}]; +#endif +} + + +#pragma mark Cache statements + +- (BOOL)shouldCacheStatements { + return _shouldCacheStatements; +} + +- (void)setShouldCacheStatements:(BOOL)value { + + _shouldCacheStatements = value; + + if (_shouldCacheStatements && !_cachedStatements) { + [self setCachedStatements:[NSMutableDictionary dictionary]]; + } + + if (!_shouldCacheStatements) { + [self setCachedStatements:nil]; + } +} + +#pragma mark Callback function + +void FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv); // -Wmissing-prototypes +void FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv) { +#if ! __has_feature(objc_arc) + void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (id)sqlite3_user_data(context); +#else + void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (__bridge id)sqlite3_user_data(context); +#endif + if (block) { + @autoreleasepool { + block(context, argc, argv); + } + } +} + +// deprecated because "arguments" parameter is not maximum argument count, but actual argument count. + +- (void)makeFunctionNamed:(NSString *)name maximumArguments:(int)arguments withBlock:(void (^)(void *context, int argc, void **argv))block { + [self makeFunctionNamed:name arguments:arguments block:block]; +} + +- (void)makeFunctionNamed:(NSString *)name arguments:(int)arguments block:(void (^)(void *context, int argc, void **argv))block { + + if (!_openFunctions) { + _openFunctions = [NSMutableSet new]; + } + + id b = FMDBReturnAutoreleased([block copy]); + + [_openFunctions addObject:b]; + + /* I tried adding custom functions to release the block when the connection is destroyed- but they seemed to never be called, so we use _openFunctions to store the values instead. */ +#if ! __has_feature(objc_arc) + sqlite3_create_function([self sqliteHandle], [name UTF8String], arguments, SQLITE_UTF8, (void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00); +#else + sqlite3_create_function([self sqliteHandle], [name UTF8String], arguments, SQLITE_UTF8, (__bridge void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00); +#endif +} + +- (SqliteValueType)valueType:(void *)value { + return sqlite3_value_type(value); +} + +- (int)valueInt:(void *)value { + return sqlite3_value_int(value); +} + +- (long long)valueLong:(void *)value { + return sqlite3_value_int64(value); +} + +- (double)valueDouble:(void *)value { + return sqlite3_value_double(value); +} + +- (NSData *)valueData:(void *)value { + const void *bytes = sqlite3_value_blob(value); + int length = sqlite3_value_bytes(value); + return bytes ? [NSData dataWithBytes:bytes length:length] : nil; +} + +- (NSString *)valueString:(void *)value { + const char *cString = (const char *)sqlite3_value_text(value); + return cString ? [NSString stringWithUTF8String:cString] : nil; +} + +- (void)resultNullInContext:(void *)context { + sqlite3_result_null(context); +} + +- (void)resultInt:(int) value context:(void *)context { + sqlite3_result_int(context, value); +} + +- (void)resultLong:(long long)value context:(void *)context { + sqlite3_result_int64(context, value); +} + +- (void)resultDouble:(double)value context:(void *)context { + sqlite3_result_double(context, value); +} + +- (void)resultData:(NSData *)data context:(void *)context { + sqlite3_result_blob(context, data.bytes, (int)data.length, SQLITE_TRANSIENT); +} + +- (void)resultString:(NSString *)value context:(void *)context { + sqlite3_result_text(context, [value UTF8String], -1, SQLITE_TRANSIENT); +} + +- (void)resultError:(NSString *)error context:(void *)context { + sqlite3_result_error(context, [error UTF8String], -1); +} + +- (void)resultErrorCode:(int)errorCode context:(void *)context { + sqlite3_result_error_code(context, errorCode); +} + +- (void)resultErrorNoMemoryInContext:(void *)context { + sqlite3_result_error_nomem(context); +} + +- (void)resultErrorTooBigInContext:(void *)context { + sqlite3_result_error_toobig(context); +} + +@end + + + +@implementation FMStatement + +#if ! __has_feature(objc_arc) +- (void)finalize { + [self close]; + [super finalize]; +} +#endif + +- (void)dealloc { + [self close]; + FMDBRelease(_query); +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + if (_statement) { + sqlite3_finalize(_statement); + _statement = 0x00; + } + + _inUse = NO; +} + +- (void)reset { + if (_statement) { + sqlite3_reset(_statement); + } + + _inUse = NO; +} + +- (NSString*)description { + return [NSString stringWithFormat:@"%@ %ld hit(s) for query %@", [super description], _useCount, _query]; +} + +@end + diff --git a/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h b/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h new file mode 100644 index 0000000..8ee51c7 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabaseAdditions.h @@ -0,0 +1,250 @@ +// +// FMDatabaseAdditions.h +// fmdb +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import +#import "FMDatabase.h" + +NS_ASSUME_NONNULL_BEGIN + +/** Category of additions for `` class. + + ### See also + + - `` + */ + +@interface FMDatabase (FMDatabaseAdditions) + +///---------------------------------------- +/// @name Return results of SQL to variable +///---------------------------------------- + +/** Return `int` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `int` value. + + @note This is not available from Swift. + */ + +- (int)intForQuery:(NSString*)query, ...; + +/** Return `long` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `long` value. + + @note This is not available from Swift. + */ + +- (long)longForQuery:(NSString*)query, ...; + +/** Return `BOOL` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `BOOL` value. + + @note This is not available from Swift. + */ + +- (BOOL)boolForQuery:(NSString*)query, ...; + +/** Return `double` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `double` value. + + @note This is not available from Swift. + */ + +- (double)doubleForQuery:(NSString*)query, ...; + +/** Return `NSString` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSString` value. + + @note This is not available from Swift. + */ + +- (NSString * _Nullable)stringForQuery:(NSString*)query, ...; + +/** Return `NSData` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSData` value. + + @note This is not available from Swift. + */ + +- (NSData * _Nullable)dataForQuery:(NSString*)query, ...; + +/** Return `NSDate` value for query + + @param query The SQL query to be performed. + @param ... A list of parameters that will be bound to the `?` placeholders in the SQL query. + + @return `NSDate` value. + + @note This is not available from Swift. + */ + +- (NSDate * _Nullable)dateForQuery:(NSString*)query, ...; + + +// Notice that there's no dataNoCopyForQuery:. +// That would be a bad idea, because we close out the result set, and then what +// happens to the data that we just didn't copy? Who knows, not I. + + +///-------------------------------- +/// @name Schema related operations +///-------------------------------- + +/** Does table exist in database? + + @param tableName The name of the table being looked for. + + @return `YES` if table found; `NO` if not found. + */ + +- (BOOL)tableExists:(NSString*)tableName; + +/** The schema of the database. + + This will be the schema for the entire database. For each entity, each row of the result set will include the following fields: + + - `type` - The type of entity (e.g. table, index, view, or trigger) + - `name` - The name of the object + - `tbl_name` - The name of the table to which the object references + - `rootpage` - The page number of the root b-tree page for tables and indices + - `sql` - The SQL that created the entity + + @return `FMResultSet` of schema; `nil` on error. + + @see [SQLite File Format](http://www.sqlite.org/fileformat.html) + */ + +- (FMResultSet *)getSchema; + +/** The schema of the database. + + This will be the schema for a particular table as report by SQLite `PRAGMA`, for example: + + PRAGMA table_info('employees') + + This will report: + + - `cid` - The column ID number + - `name` - The name of the column + - `type` - The data type specified for the column + - `notnull` - whether the field is defined as NOT NULL (i.e. values required) + - `dflt_value` - The default value for the column + - `pk` - Whether the field is part of the primary key of the table + + @param tableName The name of the table for whom the schema will be returned. + + @return `FMResultSet` of schema; `nil` on error. + + @see [table_info](http://www.sqlite.org/pragma.html#pragma_table_info) + */ + +- (FMResultSet*)getTableSchema:(NSString*)tableName; + +/** Test to see if particular column exists for particular table in database + + @param columnName The name of the column. + + @param tableName The name of the table. + + @return `YES` if column exists in table in question; `NO` otherwise. + */ + +- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName; + +/** Test to see if particular column exists for particular table in database + + @param columnName The name of the column. + + @param tableName The name of the table. + + @return `YES` if column exists in table in question; `NO` otherwise. + + @see columnExists:inTableWithName: + + @warning Deprecated - use `` instead. + */ + +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName __deprecated_msg("Use columnExists:inTableWithName: instead"); + + +/** Validate SQL statement + + This validates SQL statement by performing `sqlite3_prepare_v2`, but not returning the results, but instead immediately calling `sqlite3_finalize`. + + @param sql The SQL statement being validated. + + @param error This is a pointer to a `NSError` object that will receive the autoreleased `NSError` object if there was any error. If this is `nil`, no `NSError` result will be returned. + + @return `YES` if validation succeeded without incident; `NO` otherwise. + + */ + +- (BOOL)validateSQL:(NSString*)sql error:(NSError * _Nullable *)error; + + +///----------------------------------- +/// @name Application identifier tasks +///----------------------------------- + +/** Retrieve application ID + + @return The `uint32_t` numeric value of the application ID. + + @see setApplicationID: + */ + +@property (nonatomic) uint32_t applicationID; + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + +/** Retrieve application ID string + + @see setApplicationIDString: + */ + +@property (nonatomic, retain) NSString *applicationIDString; + +#endif + +///----------------------------------- +/// @name user version identifier tasks +///----------------------------------- + +/** Retrieve user version + + @see setUserVersion: + */ + +@property (nonatomic) uint32_t userVersion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m b/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m new file mode 100644 index 0000000..208e69e --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabaseAdditions.m @@ -0,0 +1,245 @@ +// +// FMDatabaseAdditions.m +// fmdb +// +// Created by August Mueller on 10/30/05. +// Copyright 2005 Flying Meat Inc.. All rights reserved. +// + +#import "FMDatabase.h" +#import "FMDatabaseAdditions.h" +#import "TargetConditionals.h" + +#if FMDB_SQLITE_STANDALONE +#import +#else +#import +#endif + +@interface FMDatabase (PrivateStuff) +- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray * _Nullable)arrayArgs orDictionary:(NSDictionary * _Nullable)dictionaryArgs orVAList:(va_list)args; +@end + +@implementation FMDatabase (FMDatabaseAdditions) + +#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel) \ +va_list args; \ +va_start(args, query); \ +FMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orDictionary:0x00 orVAList:args]; \ +va_end(args); \ +if (![resultSet next]) { return (type)0; } \ +type ret = [resultSet sel:0]; \ +[resultSet close]; \ +[resultSet setParentDB:nil]; \ +return ret; + + +- (NSString *)stringForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex); +} + +- (int)intForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex); +} + +- (long)longForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex); +} + +- (BOOL)boolForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex); +} + +- (double)doubleForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex); +} + +- (NSData*)dataForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex); +} + +- (NSDate*)dateForQuery:(NSString*)query, ... { + RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex); +} + + +- (BOOL)tableExists:(NSString*)tableName { + + tableName = [tableName lowercaseString]; + + FMResultSet *rs = [self executeQuery:@"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?", tableName]; + + //if at least one next exists, table exists + BOOL returnBool = [rs next]; + + //close and free object + [rs close]; + + return returnBool; +} + +/* + get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] + check if table exist in database (patch from OZLB) +*/ +- (FMResultSet*)getSchema { + + //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING] + FMResultSet *rs = [self executeQuery:@"SELECT type, name, tbl_name, rootpage, sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type != 'meta' AND name NOT LIKE 'sqlite_%' ORDER BY tbl_name, type DESC, name"]; + + return rs; +} + +/* + get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] +*/ +- (FMResultSet*)getTableSchema:(NSString*)tableName { + + //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER] + FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @"pragma table_info('%@')", tableName]]; + + return rs; +} + +- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName { + + BOOL returnBool = NO; + + tableName = [tableName lowercaseString]; + columnName = [columnName lowercaseString]; + + FMResultSet *rs = [self getTableSchema:tableName]; + + //check if column is present in table schema + while ([rs next]) { + if ([[[rs stringForColumn:@"name"] lowercaseString] isEqualToString:columnName]) { + returnBool = YES; + break; + } + } + + //If this is not done FMDatabase instance stays out of pool + [rs close]; + + return returnBool; +} + + + +- (uint32_t)applicationID { +#if SQLITE_VERSION_NUMBER >= 3007017 + uint32_t r = 0; + + FMResultSet *rs = [self executeQuery:@"pragma application_id"]; + + if ([rs next]) { + r = (uint32_t)[rs longLongIntForColumnIndex:0]; + } + + [rs close]; + + return r; +#else + NSString *errorMessage = NSLocalizedString(@"Application ID functions require SQLite 3.7.17", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return 0; +#endif +} + +- (void)setApplicationID:(uint32_t)appID { +#if SQLITE_VERSION_NUMBER >= 3007017 + NSString *query = [NSString stringWithFormat:@"pragma application_id=%d", appID]; + FMResultSet *rs = [self executeQuery:query]; + [rs next]; + [rs close]; +#else + NSString *errorMessage = NSLocalizedString(@"Application ID functions require SQLite 3.7.17", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); +#endif +} + + +#if TARGET_OS_MAC && !TARGET_OS_IPHONE + +- (NSString*)applicationIDString { +#if SQLITE_VERSION_NUMBER >= 3007017 + NSString *s = NSFileTypeForHFSTypeCode([self applicationID]); + + assert([s length] == 6); + + s = [s substringWithRange:NSMakeRange(1, 4)]; + + + return s; +#else + NSString *errorMessage = NSLocalizedString(@"Application ID functions require SQLite 3.7.17", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return nil; +#endif +} + +- (void)setApplicationIDString:(NSString*)s { +#if SQLITE_VERSION_NUMBER >= 3007017 + if ([s length] != 4) { + NSLog(@"setApplicationIDString: string passed is not exactly 4 chars long. (was %ld)", [s length]); + } + + [self setApplicationID:NSHFSTypeCodeFromFileType([NSString stringWithFormat:@"'%@'", s])]; +#else + NSString *errorMessage = NSLocalizedString(@"Application ID functions require SQLite 3.7.17", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); +#endif +} + +#endif + +- (uint32_t)userVersion { + uint32_t r = 0; + + FMResultSet *rs = [self executeQuery:@"pragma user_version"]; + + if ([rs next]) { + r = (uint32_t)[rs longLongIntForColumnIndex:0]; + } + + [rs close]; + return r; +} + +- (void)setUserVersion:(uint32_t)version { + NSString *query = [NSString stringWithFormat:@"pragma user_version = %d", version]; + FMResultSet *rs = [self executeQuery:query]; + [rs next]; + [rs close]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (BOOL)columnExists:(NSString*)tableName columnName:(NSString*)columnName __attribute__ ((deprecated)) { + return [self columnExists:columnName inTableWithName:tableName]; +} + +#pragma clang diagnostic pop + +- (BOOL)validateSQL:(NSString*)sql error:(NSError**)error { + sqlite3_stmt *pStmt = NULL; + BOOL validationSucceeded = YES; + + int rc = sqlite3_prepare_v2([self sqliteHandle], [sql UTF8String], -1, &pStmt, 0); + if (rc != SQLITE_OK) { + validationSucceeded = NO; + if (error) { + *error = [NSError errorWithDomain:NSCocoaErrorDomain + code:[self lastErrorCode] + userInfo:[NSDictionary dictionaryWithObject:[self lastErrorMessage] + forKey:NSLocalizedDescriptionKey]]; + } + } + + sqlite3_finalize(pStmt); + + return validationSucceeded; +} + +@end diff --git a/Pods/FMDB/src/fmdb/FMDatabasePool.h b/Pods/FMDB/src/fmdb/FMDatabasePool.h new file mode 100755 index 0000000..3642f59 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabasePool.h @@ -0,0 +1,258 @@ +// +// FMDatabasePool.h +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FMDatabase; + +/** Pool of `` objects. + + ### See also + + - `` + - `` + + @warning Before using `FMDatabasePool`, please consider using `` instead. + + If you really really really know what you're doing and `FMDatabasePool` is what + you really really need (ie, you're using a read only database), OK you can use + it. But just be careful not to deadlock! + + For an example on deadlocking, search for: + `ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD` + in the main.m file. + */ + +@interface FMDatabasePool : NSObject + +/** Database path */ + +@property (atomic, copy, nullable) NSString *path; + +/** Delegate object */ + +@property (atomic, assign, nullable) id delegate; + +/** Maximum number of databases to create */ + +@property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate; + +/** Open flags */ + +@property (atomic, readonly) int openFlags; + +/** Custom virtual file system name */ + +@property (atomic, copy, nullable) NSString *vfsName; + + +///--------------------- +/// @name Initialization +///--------------------- + +/** Create pool using path. + + @param aPath The file path of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithPath:(NSString * _Nullable)aPath; + +/** Create pool using file URL. + + @param url The file `NSURL` of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithURL:(NSURL * _Nullable)url; + +/** Create pool using path and specified flags + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithPath:(NSString * _Nullable)aPath flags:(int)openFlags; + +/** Create pool using file URL and specified flags + + @param url The file `NSURL` of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + ++ (instancetype)databasePoolWithURL:(NSURL * _Nullable)url flags:(int)openFlags; + +/** Create pool using path. + + @param aPath The file path of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath; + +/** Create pool using file URL. + + @param url The file `NSURL of the database. + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url; + +/** Create pool using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags; + +/** Create pool using file URL and specified flags. + + @param url The file `NSURL` of the database. + @param openFlags Flags passed to the openWithFlags method of the database + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags; + +/** Create pool using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + @param vfsName The name of a custom virtual file system + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags vfs:(NSString * _Nullable)vfsName; + +/** Create pool using file URL and specified flags. + + @param url The file `NSURL` of the database. + @param openFlags Flags passed to the openWithFlags method of the database + @param vfsName The name of a custom virtual file system + + @return The `FMDatabasePool` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags vfs:(NSString * _Nullable)vfsName; + +/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object. + + Subclasses can override this method to return specified Class of 'FMDatabase' subclass. + + @return The Class of 'FMDatabase' subclass, that will be used to instantiate database object. + */ + ++ (Class)databaseClass; + +///------------------------------------------------ +/// @name Keeping track of checked in/out databases +///------------------------------------------------ + +/** Number of checked-in databases in pool + */ + +@property (nonatomic, readonly) NSUInteger countOfCheckedInDatabases; + +/** Number of checked-out databases in pool + */ + +@property (nonatomic, readonly) NSUInteger countOfCheckedOutDatabases; + +/** Total number of databases in pool + */ + +@property (nonatomic, readonly) NSUInteger countOfOpenDatabases; + +/** Release all databases in pool */ + +- (void)releaseAllDatabases; + +///------------------------------------------ +/// @name Perform database operations in pool +///------------------------------------------ + +/** Synchronously perform database operations in pool. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inDatabase:(__attribute__((noescape)) void (^)(FMDatabase *db))block; + +/** Synchronously perform database operations in pool using transaction. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +/** Synchronously perform database operations in pool using deferred transaction. + + @param block The code to be run on the `FMDatabasePool` pool. + */ + +- (void)inDeferredTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +/** Synchronously perform database operations in pool using save point. + + @param block The code to be run on the `FMDatabasePool` pool. + + @return `NSError` object if error; `nil` if successful. + + @warning You can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock. If you need to nest, use `<[FMDatabase startSavePointWithName:error:]>` instead. +*/ + +- (NSError * _Nullable)inSavePoint:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +@end + + +/** FMDatabasePool delegate category + + This is a category that defines the protocol for the FMDatabasePool delegate + */ + +@interface NSObject (FMDatabasePoolDelegate) + +/** Asks the delegate whether database should be added to the pool. + + @param pool The `FMDatabasePool` object. + @param database The `FMDatabase` object. + + @return `YES` if it should add database to pool; `NO` if not. + + */ + +- (BOOL)databasePool:(FMDatabasePool*)pool shouldAddDatabaseToPool:(FMDatabase*)database; + +/** Tells the delegate that database was added to the pool. + + @param pool The `FMDatabasePool` object. + @param database The `FMDatabase` object. + + */ + +- (void)databasePool:(FMDatabasePool*)pool didAddDatabase:(FMDatabase*)database; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FMDB/src/fmdb/FMDatabasePool.m b/Pods/FMDB/src/fmdb/FMDatabasePool.m new file mode 100755 index 0000000..41a5985 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabasePool.m @@ -0,0 +1,316 @@ +// +// FMDatabasePool.m +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#if FMDB_SQLITE_STANDALONE +#import +#else +#import +#endif + +#import "FMDatabasePool.h" +#import "FMDatabase.h" + +@interface FMDatabasePool () { + dispatch_queue_t _lockQueue; + + NSMutableArray *_databaseInPool; + NSMutableArray *_databaseOutPool; +} + +- (void)pushDatabaseBackInPool:(FMDatabase*)db; +- (FMDatabase*)db; + +@end + + +@implementation FMDatabasePool +@synthesize path=_path; +@synthesize delegate=_delegate; +@synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate; +@synthesize openFlags=_openFlags; + + ++ (instancetype)databasePoolWithPath:(NSString *)aPath { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]); +} + ++ (instancetype)databasePoolWithURL:(NSURL *)url { + return FMDBReturnAutoreleased([[self alloc] initWithPath:url.path]); +} + ++ (instancetype)databasePoolWithPath:(NSString *)aPath flags:(int)openFlags { + return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath flags:openFlags]); +} + ++ (instancetype)databasePoolWithURL:(NSURL *)url flags:(int)openFlags { + return FMDBReturnAutoreleased([[self alloc] initWithPath:url.path flags:openFlags]); +} + +- (instancetype)initWithURL:(NSURL *)url flags:(int)openFlags vfs:(NSString *)vfsName { + return [self initWithPath:url.path flags:openFlags vfs:vfsName]; +} + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags vfs:(NSString *)vfsName { + + self = [super init]; + + if (self != nil) { + _path = [aPath copy]; + _lockQueue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); + _databaseInPool = FMDBReturnRetained([NSMutableArray array]); + _databaseOutPool = FMDBReturnRetained([NSMutableArray array]); + _openFlags = openFlags; + _vfsName = [vfsName copy]; + } + + return self; +} + +- (instancetype)initWithPath:(NSString *)aPath flags:(int)openFlags { + return [self initWithPath:aPath flags:openFlags vfs:nil]; +} + +- (instancetype)initWithURL:(NSURL *)url flags:(int)openFlags { + return [self initWithPath:url.path flags:openFlags vfs:nil]; +} + +- (instancetype)initWithPath:(NSString*)aPath { + // default flags for sqlite3_open + return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE]; +} + +- (instancetype)initWithURL:(NSURL *)url { + return [self initWithPath:url.path]; +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + ++ (Class)databaseClass { + return [FMDatabase class]; +} + +- (void)dealloc { + + _delegate = 0x00; + FMDBRelease(_path); + FMDBRelease(_databaseInPool); + FMDBRelease(_databaseOutPool); + FMDBRelease(_vfsName); + + if (_lockQueue) { + FMDBDispatchQueueRelease(_lockQueue); + _lockQueue = 0x00; + } +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + + +- (void)executeLocked:(void (^)(void))aBlock { + dispatch_sync(_lockQueue, aBlock); +} + +- (void)pushDatabaseBackInPool:(FMDatabase*)db { + + if (!db) { // db can be null if we set an upper bound on the # of databases to create. + return; + } + + [self executeLocked:^() { + + if ([self->_databaseInPool containsObject:db]) { + [[NSException exceptionWithName:@"Database already in pool" reason:@"The FMDatabase being put back into the pool is already present in the pool" userInfo:nil] raise]; + } + + [self->_databaseInPool addObject:db]; + [self->_databaseOutPool removeObject:db]; + + }]; +} + +- (FMDatabase*)db { + + __block FMDatabase *db; + + + [self executeLocked:^() { + db = [self->_databaseInPool lastObject]; + + BOOL shouldNotifyDelegate = NO; + + if (db) { + [self->_databaseOutPool addObject:db]; + [self->_databaseInPool removeLastObject]; + } + else { + + if (self->_maximumNumberOfDatabasesToCreate) { + NSUInteger currentCount = [self->_databaseOutPool count] + [self->_databaseInPool count]; + + if (currentCount >= self->_maximumNumberOfDatabasesToCreate) { + NSLog(@"Maximum number of databases (%ld) has already been reached!", (long)currentCount); + return; + } + } + + db = [[[self class] databaseClass] databaseWithPath:self->_path]; + shouldNotifyDelegate = YES; + } + + //This ensures that the db is opened before returning +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [db openWithFlags:self->_openFlags vfs:self->_vfsName]; +#else + BOOL success = [db open]; +#endif + if (success) { + if ([self->_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![self->_delegate databasePool:self shouldAddDatabaseToPool:db]) { + [db close]; + db = 0x00; + } + else { + //It should not get added in the pool twice if lastObject was found + if (![self->_databaseOutPool containsObject:db]) { + [self->_databaseOutPool addObject:db]; + + if (shouldNotifyDelegate && [self->_delegate respondsToSelector:@selector(databasePool:didAddDatabase:)]) { + [self->_delegate databasePool:self didAddDatabase:db]; + } + } + } + } + else { + NSLog(@"Could not open up the database at path %@", self->_path); + db = 0x00; + } + }]; + + return db; +} + +- (NSUInteger)countOfCheckedInDatabases { + + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseInPool count]; + }]; + + return count; +} + +- (NSUInteger)countOfCheckedOutDatabases { + + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseOutPool count]; + }]; + + return count; +} + +- (NSUInteger)countOfOpenDatabases { + __block NSUInteger count; + + [self executeLocked:^() { + count = [self->_databaseOutPool count] + [self->_databaseInPool count]; + }]; + + return count; +} + +- (void)releaseAllDatabases { + [self executeLocked:^() { + [self->_databaseOutPool removeAllObjects]; + [self->_databaseInPool removeAllObjects]; + }]; +} + +- (void)inDatabase:(void (^)(FMDatabase *db))block { + + FMDatabase *db = [self db]; + + block(db); + + [self pushDatabaseBackInPool:db]; +} + +- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { + + BOOL shouldRollback = NO; + + FMDatabase *db = [self db]; + + if (useDeferred) { + [db beginDeferredTransaction]; + } + else { + [db beginTransaction]; + } + + + block(db, &shouldRollback); + + if (shouldRollback) { + [db rollback]; + } + else { + [db commit]; + } + + [self pushDatabaseBackInPool:db]; +} + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:YES withBlock:block]; +} + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:NO withBlock:block]; +} + +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block { +#if SQLITE_VERSION_NUMBER >= 3007000 + static unsigned long savePointIdx = 0; + + NSString *name = [NSString stringWithFormat:@"savePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + FMDatabase *db = [self db]; + + NSError *err = 0x00; + + if (![db startSavePointWithName:name error:&err]) { + [self pushDatabaseBackInPool:db]; + return err; + } + + block(db, &shouldRollback); + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [db rollbackToSavePointWithName:name error:&err]; + } + [db releaseSavePointWithName:name error:&err]; + + [self pushDatabaseBackInPool:db]; + + return err; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return [NSError errorWithDomain:@"FMDatabase" code:0 userInfo:@{NSLocalizedDescriptionKey : errorMessage}]; +#endif +} + +@end diff --git a/Pods/FMDB/src/fmdb/FMDatabaseQueue.h b/Pods/FMDB/src/fmdb/FMDatabaseQueue.h new file mode 100755 index 0000000..0a8b938 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabaseQueue.h @@ -0,0 +1,235 @@ +// +// FMDatabaseQueue.h +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@class FMDatabase; + +/** To perform queries and updates on multiple threads, you'll want to use `FMDatabaseQueue`. + + Using a single instance of `` from multiple threads at once is a bad idea. It has always been OK to make a `` object *per thread*. Just don't share a single instance across threads, and definitely not across multiple threads at the same time. + + Instead, use `FMDatabaseQueue`. Here's how to use it: + + First, make your queue. + + FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; + + Then use it like so: + + [queue inDatabase:^(FMDatabase *db) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + FMResultSet *rs = [db executeQuery:@"select * from foo"]; + while ([rs next]) { + //… + } + }]; + + An easy way to wrap things up in a transaction can be done like this: + + [queue inTransaction:^(FMDatabase *db, BOOL *rollback) { + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]]; + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]]; + + if (whoopsSomethingWrongHappened) { + *rollback = YES; + return; + } + // etc… + [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]]; + }]; + + `FMDatabaseQueue` will run the blocks on a serialized queue (hence the name of the class). So if you call `FMDatabaseQueue`'s methods from multiple threads at the same time, they will be executed in the order they are received. This way queries and updates won't step on each other's toes, and every one is happy. + + ### See also + + - `` + + @warning Do not instantiate a single `` object and use it across multiple threads. Use `FMDatabaseQueue` instead. + + @warning The calls to `FMDatabaseQueue`'s methods are blocking. So even though you are passing along blocks, they will **not** be run on another thread. + + */ + +@interface FMDatabaseQueue : NSObject +/** Path of database */ + +@property (atomic, retain, nullable) NSString *path; + +/** Open flags */ + +@property (atomic, readonly) int openFlags; + +/** Custom virtual file system name */ + +@property (atomic, copy, nullable) NSString *vfsName; + +///---------------------------------------------------- +/// @name Initialization, opening, and closing of queue +///---------------------------------------------------- + +/** Create queue using path. + + @param aPath The file path of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + ++ (instancetype)databaseQueueWithPath:(NSString * _Nullable)aPath; + +/** Create queue using file URL. + + @param url The file `NSURL` of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + ++ (instancetype)databaseQueueWithURL:(NSURL * _Nullable)url; + +/** Create queue using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ ++ (instancetype)databaseQueueWithPath:(NSString * _Nullable)aPath flags:(int)openFlags; + +/** Create queue using file URL and specified flags. + + @param url The file `NSURL` of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ ++ (instancetype)databaseQueueWithURL:(NSURL * _Nullable)url flags:(int)openFlags; + +/** Create queue using path. + + @param aPath The file path of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath; + +/** Create queue using file URL. + + @param url The file `NSURL of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url; + +/** Create queue using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags; + +/** Create queue using file URL and specified flags. + + @param url The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database. + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags; + +/** Create queue using path and specified flags. + + @param aPath The file path of the database. + @param openFlags Flags passed to the openWithFlags method of the database + @param vfsName The name of a custom virtual file system + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithPath:(NSString * _Nullable)aPath flags:(int)openFlags vfs:(NSString * _Nullable)vfsName; + +/** Create queue using file URL and specified flags. + + @param url The file `NSURL of the database. + @param openFlags Flags passed to the openWithFlags method of the database + @param vfsName The name of a custom virtual file system + + @return The `FMDatabaseQueue` object. `nil` on error. + */ + +- (instancetype)initWithURL:(NSURL * _Nullable)url flags:(int)openFlags vfs:(NSString * _Nullable)vfsName; + +/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object. + + Subclasses can override this method to return specified Class of 'FMDatabase' subclass. + + @return The Class of 'FMDatabase' subclass, that will be used to instantiate database object. + */ + ++ (Class)databaseClass; + +/** Close database used by queue. */ + +- (void)close; + +/** Interupt pending database operation. */ + +- (void)interrupt; + +///----------------------------------------------- +/// @name Dispatching database operations to queue +///----------------------------------------------- + +/** Synchronously perform database operations on queue. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inDatabase:(__attribute__((noescape)) void (^)(FMDatabase *db))block; + +/** Synchronously perform database operations on queue, using transactions. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +/** Synchronously perform database operations on queue, using deferred transactions. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inDeferredTransaction:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +///----------------------------------------------- +/// @name Dispatching database operations to queue +///----------------------------------------------- + +/** Synchronously perform database operations using save point. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +// NOTE: you can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock. +// If you need to nest, use FMDatabase's startSavePointWithName:error: instead. +- (NSError * _Nullable)inSavePoint:(__attribute__((noescape)) void (^)(FMDatabase *db, BOOL *rollback))block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FMDB/src/fmdb/FMDatabaseQueue.m b/Pods/FMDB/src/fmdb/FMDatabaseQueue.m new file mode 100755 index 0000000..f3f30cf --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMDatabaseQueue.m @@ -0,0 +1,270 @@ +// +// FMDatabaseQueue.m +// fmdb +// +// Created by August Mueller on 6/22/11. +// Copyright 2011 Flying Meat Inc. All rights reserved. +// + +#import "FMDatabaseQueue.h" +#import "FMDatabase.h" + +#if FMDB_SQLITE_STANDALONE +#import +#else +#import +#endif + +/* + + Note: we call [self retain]; before using dispatch_sync, just incase + FMDatabaseQueue is released on another thread and we're in the middle of doing + something in dispatch_sync + + */ + +/* + * A key used to associate the FMDatabaseQueue object with the dispatch_queue_t it uses. + * This in turn is used for deadlock detection by seeing if inDatabase: is called on + * the queue's dispatch queue, which should not happen and causes a deadlock. + */ +static const void * const kDispatchQueueSpecificKey = &kDispatchQueueSpecificKey; + +@interface FMDatabaseQueue () { + dispatch_queue_t _queue; + FMDatabase *_db; +} +@end + +@implementation FMDatabaseQueue + ++ (instancetype)databaseQueueWithPath:(NSString *)aPath { + FMDatabaseQueue *q = [[self alloc] initWithPath:aPath]; + + FMDBAutorelease(q); + + return q; +} + ++ (instancetype)databaseQueueWithURL:(NSURL *)url { + return [self databaseQueueWithPath:url.path]; +} + ++ (instancetype)databaseQueueWithPath:(NSString *)aPath flags:(int)openFlags { + FMDatabaseQueue *q = [[self alloc] initWithPath:aPath flags:openFlags]; + + FMDBAutorelease(q); + + return q; +} + ++ (instancetype)databaseQueueWithURL:(NSURL *)url flags:(int)openFlags { + return [self databaseQueueWithPath:url.path flags:openFlags]; +} + ++ (Class)databaseClass { + return [FMDatabase class]; +} + +- (instancetype)initWithURL:(NSURL *)url flags:(int)openFlags vfs:(NSString *)vfsName { + return [self initWithPath:url.path flags:openFlags vfs:vfsName]; +} + +- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags vfs:(NSString *)vfsName { + self = [super init]; + + if (self != nil) { + + _db = [[[self class] databaseClass] databaseWithPath:aPath]; + FMDBRetain(_db); + +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [_db openWithFlags:openFlags vfs:vfsName]; +#else + BOOL success = [_db open]; +#endif + if (!success) { + NSLog(@"Could not create database queue for path %@", aPath); + FMDBRelease(self); + return 0x00; + } + + _path = FMDBReturnRetained(aPath); + + _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); + dispatch_queue_set_specific(_queue, kDispatchQueueSpecificKey, (__bridge void *)self, NULL); + _openFlags = openFlags; + _vfsName = [vfsName copy]; + } + + return self; +} + +- (instancetype)initWithPath:(NSString *)aPath flags:(int)openFlags { + return [self initWithPath:aPath flags:openFlags vfs:nil]; +} + +- (instancetype)initWithURL:(NSURL *)url flags:(int)openFlags { + return [self initWithPath:url.path flags:openFlags vfs:nil]; +} + +- (instancetype)initWithURL:(NSURL *)url { + return [self initWithPath:url.path]; +} + +- (instancetype)initWithPath:(NSString *)aPath { + // default flags for sqlite3_open + return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE vfs:nil]; +} + +- (instancetype)init { + return [self initWithPath:nil]; +} + + +- (void)dealloc { + FMDBRelease(_db); + FMDBRelease(_path); + FMDBRelease(_vfsName); + + if (_queue) { + FMDBDispatchQueueRelease(_queue); + _queue = 0x00; + } +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + FMDBRetain(self); + dispatch_sync(_queue, ^() { + [self->_db close]; + FMDBRelease(_db); + self->_db = 0x00; + }); + FMDBRelease(self); +} + +- (void)interrupt { + [[self database] interrupt]; +} + +- (FMDatabase*)database { + if (!_db) { + _db = FMDBReturnRetained([[[self class] databaseClass] databaseWithPath:_path]); + +#if SQLITE_VERSION_NUMBER >= 3005000 + BOOL success = [_db openWithFlags:_openFlags vfs:_vfsName]; +#else + BOOL success = [_db open]; +#endif + if (!success) { + NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path); + FMDBRelease(_db); + _db = 0x00; + return 0x00; + } + } + + return _db; +} + +- (void)inDatabase:(void (^)(FMDatabase *db))block { +#ifndef NDEBUG + /* Get the currently executing queue (which should probably be nil, but in theory could be another DB queue + * and then check it against self to make sure we're not about to deadlock. */ + FMDatabaseQueue *currentSyncQueue = (__bridge id)dispatch_get_specific(kDispatchQueueSpecificKey); + assert(currentSyncQueue != self && "inDatabase: was called reentrantly on the same queue, which would lead to a deadlock"); +#endif + + FMDBRetain(self); + + dispatch_sync(_queue, ^() { + + FMDatabase *db = [self database]; + block(db); + + if ([db hasOpenResultSets]) { + NSLog(@"Warning: there is at least one open result set around after performing [FMDatabaseQueue inDatabase:]"); + +#if defined(DEBUG) && DEBUG + NSSet *openSetCopy = FMDBReturnAutoreleased([[db valueForKey:@"_openResultSets"] copy]); + for (NSValue *rsInWrappedInATastyValueMeal in openSetCopy) { + FMResultSet *rs = (FMResultSet *)[rsInWrappedInATastyValueMeal pointerValue]; + NSLog(@"query: '%@'", [rs query]); + } +#endif + } + }); + + FMDBRelease(self); +} + +- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { + FMDBRetain(self); + dispatch_sync(_queue, ^() { + + BOOL shouldRollback = NO; + + if (useDeferred) { + [[self database] beginDeferredTransaction]; + } + else { + [[self database] beginTransaction]; + } + + block([self database], &shouldRollback); + + if (shouldRollback) { + [[self database] rollback]; + } + else { + [[self database] commit]; + } + }); + + FMDBRelease(self); +} + +- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:YES withBlock:block]; +} + +- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { + [self beginTransaction:NO withBlock:block]; +} + +- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block { +#if SQLITE_VERSION_NUMBER >= 3007000 + static unsigned long savePointIdx = 0; + __block NSError *err = 0x00; + FMDBRetain(self); + dispatch_sync(_queue, ^() { + + NSString *name = [NSString stringWithFormat:@"savePoint%ld", savePointIdx++]; + + BOOL shouldRollback = NO; + + if ([[self database] startSavePointWithName:name error:&err]) { + + block([self database], &shouldRollback); + + if (shouldRollback) { + // We need to rollback and release this savepoint to remove it + [[self database] rollbackToSavePointWithName:name error:&err]; + } + [[self database] releaseSavePointWithName:name error:&err]; + + } + }); + FMDBRelease(self); + return err; +#else + NSString *errorMessage = NSLocalizedString(@"Save point functions require SQLite 3.7", nil); + if (self.logsErrors) NSLog(@"%@", errorMessage); + return [NSError errorWithDomain:@"FMDatabase" code:0 userInfo:@{NSLocalizedDescriptionKey : errorMessage}]; +#endif +} + +@end diff --git a/Pods/FMDB/src/fmdb/FMResultSet.h b/Pods/FMDB/src/fmdb/FMResultSet.h new file mode 100644 index 0000000..8057291 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMResultSet.h @@ -0,0 +1,467 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +#ifndef __has_feature // Optional. +#define __has_feature(x) 0 // Compatibility with non-clang compilers. +#endif + +#ifndef NS_RETURNS_NOT_RETAINED +#if __has_feature(attribute_ns_returns_not_retained) +#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained)) +#else +#define NS_RETURNS_NOT_RETAINED +#endif +#endif + +@class FMDatabase; +@class FMStatement; + +/** Represents the results of executing a query on an ``. + + ### See also + + - `` + */ + +@interface FMResultSet : NSObject + +@property (nonatomic, retain, nullable) FMDatabase *parentDB; + +///----------------- +/// @name Properties +///----------------- + +/** Executed query */ + +@property (atomic, retain, nullable) NSString *query; + +/** `NSMutableDictionary` mapping column names to numeric index */ + +@property (readonly) NSMutableDictionary *columnNameToIndexMap; + +/** `FMStatement` used by result set. */ + +@property (atomic, retain, nullable) FMStatement *statement; + +///------------------------------------ +/// @name Creating and closing database +///------------------------------------ + +/** Create result set from `` + + @param statement A `` to be performed + + @param aDB A `` to be used + + @return A `FMResultSet` on success; `nil` on failure + */ + ++ (instancetype)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB; + +/** Close result set */ + +- (void)close; + +///--------------------------------------- +/// @name Iterating through the result set +///--------------------------------------- + +/** Retrieve next row for result set. + + You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one. + + @return `YES` if row successfully retrieved; `NO` if end of result set reached + + @see hasAnotherRow + */ + +- (BOOL)next; + +/** Retrieve next row for result set. + + You must always invoke `next` or `nextWithError` before attempting to access the values returned in a query, even if you're only expecting one. + + @param outErr A 'NSError' object to receive any error object (if any). + + @return 'YES' if row successfully retrieved; 'NO' if end of result set reached + + @see hasAnotherRow + */ + +- (BOOL)nextWithError:(NSError * _Nullable *)outErr; + +/** Did the last call to `` succeed in retrieving another row? + + @return `YES` if the last call to `` succeeded in retrieving another record; `NO` if not. + + @see next + + @warning The `hasAnotherRow` method must follow a call to ``. If the previous database interaction was something other than a call to `next`, then this method may return `NO`, whether there is another row of data or not. + */ + +- (BOOL)hasAnotherRow; + +///--------------------------------------------- +/// @name Retrieving information from result set +///--------------------------------------------- + +/** How many columns in result set + + @return Integer value of the number of columns. + */ + +@property (nonatomic, readonly) int columnCount; + +/** Column index for column name + + @param columnName `NSString` value of the name of the column. + + @return Zero-based index for column. + */ + +- (int)columnIndexForName:(NSString*)columnName; + +/** Column name for column index + + @param columnIdx Zero-based index for column. + + @return columnName `NSString` value of the name of the column. + */ + +- (NSString * _Nullable)columnNameForIndex:(int)columnIdx; + +/** Result set integer value for column. + + @param columnName `NSString` value of the name of the column. + + @return `int` value of the result set's column. + */ + +- (int)intForColumn:(NSString*)columnName; + +/** Result set integer value for column. + + @param columnIdx Zero-based index for column. + + @return `int` value of the result set's column. + */ + +- (int)intForColumnIndex:(int)columnIdx; + +/** Result set `long` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `long` value of the result set's column. + */ + +- (long)longForColumn:(NSString*)columnName; + +/** Result set long value for column. + + @param columnIdx Zero-based index for column. + + @return `long` value of the result set's column. + */ + +- (long)longForColumnIndex:(int)columnIdx; + +/** Result set `long long int` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `long long int` value of the result set's column. + */ + +- (long long int)longLongIntForColumn:(NSString*)columnName; + +/** Result set `long long int` value for column. + + @param columnIdx Zero-based index for column. + + @return `long long int` value of the result set's column. + */ + +- (long long int)longLongIntForColumnIndex:(int)columnIdx; + +/** Result set `unsigned long long int` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `unsigned long long int` value of the result set's column. + */ + +- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName; + +/** Result set `unsigned long long int` value for column. + + @param columnIdx Zero-based index for column. + + @return `unsigned long long int` value of the result set's column. + */ + +- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx; + +/** Result set `BOOL` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `BOOL` value of the result set's column. + */ + +- (BOOL)boolForColumn:(NSString*)columnName; + +/** Result set `BOOL` value for column. + + @param columnIdx Zero-based index for column. + + @return `BOOL` value of the result set's column. + */ + +- (BOOL)boolForColumnIndex:(int)columnIdx; + +/** Result set `double` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `double` value of the result set's column. + + */ + +- (double)doubleForColumn:(NSString*)columnName; + +/** Result set `double` value for column. + + @param columnIdx Zero-based index for column. + + @return `double` value of the result set's column. + + */ + +- (double)doubleForColumnIndex:(int)columnIdx; + +/** Result set `NSString` value for column. + + @param columnName `NSString` value of the name of the column. + + @return String value of the result set's column. + + */ + +- (NSString * _Nullable)stringForColumn:(NSString*)columnName; + +/** Result set `NSString` value for column. + + @param columnIdx Zero-based index for column. + + @return String value of the result set's column. + */ + +- (NSString * _Nullable)stringForColumnIndex:(int)columnIdx; + +/** Result set `NSDate` value for column. + + @param columnName `NSString` value of the name of the column. + + @return Date value of the result set's column. + */ + +- (NSDate * _Nullable)dateForColumn:(NSString*)columnName; + +/** Result set `NSDate` value for column. + + @param columnIdx Zero-based index for column. + + @return Date value of the result set's column. + + */ + +- (NSDate * _Nullable)dateForColumnIndex:(int)columnIdx; + +/** Result set `NSData` value for column. + + This is useful when storing binary data in table (such as image or the like). + + @param columnName `NSString` value of the name of the column. + + @return Data value of the result set's column. + + */ + +- (NSData * _Nullable)dataForColumn:(NSString*)columnName; + +/** Result set `NSData` value for column. + + @param columnIdx Zero-based index for column. + + @return Data value of the result set's column. + */ + +- (NSData * _Nullable)dataForColumnIndex:(int)columnIdx; + +/** Result set `(const unsigned char *)` value for column. + + @param columnName `NSString` value of the name of the column. + + @return `(const unsigned char *)` value of the result set's column. + */ + +- (const unsigned char * _Nullable)UTF8StringForColumn:(NSString*)columnName; + +- (const unsigned char * _Nullable)UTF8StringForColumnName:(NSString*)columnName __deprecated_msg("Use UTF8StringForColumn instead"); + +/** Result set `(const unsigned char *)` value for column. + + @param columnIdx Zero-based index for column. + + @return `(const unsigned char *)` value of the result set's column. + */ + +- (const unsigned char * _Nullable)UTF8StringForColumnIndex:(int)columnIdx; + +/** Result set object for column. + + @param columnName Name of the column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + + @see objectForKeyedSubscript: + */ + +- (id _Nullable)objectForColumn:(NSString*)columnName; + +- (id _Nullable)objectForColumnName:(NSString*)columnName __deprecated_msg("Use objectForColumn instead"); + +/** Result set object for column. + + @param columnIdx Zero-based index for column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + + @see objectAtIndexedSubscript: + */ + +- (id _Nullable)objectForColumnIndex:(int)columnIdx; + +/** Result set object for column. + + This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported: + + id result = rs[@"employee_name"]; + + This simplified syntax is equivalent to calling: + + id result = [rs objectForKeyedSubscript:@"employee_name"]; + + which is, it turns out, equivalent to calling: + + id result = [rs objectForColumnName:@"employee_name"]; + + @param columnName `NSString` value of the name of the column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + */ + +- (id _Nullable)objectForKeyedSubscript:(NSString *)columnName; + +/** Result set object for column. + + This method allows the use of the "boxed" syntax supported in Modern Objective-C. For example, by defining this method, the following syntax is now supported: + + id result = rs[0]; + + This simplified syntax is equivalent to calling: + + id result = [rs objectForKeyedSubscript:0]; + + which is, it turns out, equivalent to calling: + + id result = [rs objectForColumnName:0]; + + @param columnIdx Zero-based index for column. + + @return Either `NSNumber`, `NSString`, `NSData`, or `NSNull`. If the column was `NULL`, this returns `[NSNull null]` object. + */ + +- (id _Nullable)objectAtIndexedSubscript:(int)columnIdx; + +/** Result set `NSData` value for column. + + @param columnName `NSString` value of the name of the column. + + @return Data value of the result set's column. + + @warning If you are going to use this data after you iterate over the next row, or after you close the +result set, make sure to make a copy of the data first (or just use ``/``) +If you don't, you're going to be in a world of hurt when you try and use the data. + + */ + +- (NSData * _Nullable)dataNoCopyForColumn:(NSString *)columnName NS_RETURNS_NOT_RETAINED; + +/** Result set `NSData` value for column. + + @param columnIdx Zero-based index for column. + + @return Data value of the result set's column. + + @warning If you are going to use this data after you iterate over the next row, or after you close the + result set, make sure to make a copy of the data first (or just use ``/``) + If you don't, you're going to be in a world of hurt when you try and use the data. + + */ + +- (NSData * _Nullable)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED; + +/** Is the column `NULL`? + + @param columnIdx Zero-based index for column. + + @return `YES` if column is `NULL`; `NO` if not `NULL`. + */ + +- (BOOL)columnIndexIsNull:(int)columnIdx; + +/** Is the column `NULL`? + + @param columnName `NSString` value of the name of the column. + + @return `YES` if column is `NULL`; `NO` if not `NULL`. + */ + +- (BOOL)columnIsNull:(NSString*)columnName; + + +/** Returns a dictionary of the row results mapped to case sensitive keys of the column names. + + @warning The keys to the dictionary are case sensitive of the column names. + */ + +@property (nonatomic, readonly, nullable) NSDictionary *resultDictionary; + +/** Returns a dictionary of the row results + + @see resultDictionary + + @warning **Deprecated**: Please use `` instead. Also, beware that `` is case sensitive! + */ + +- (NSDictionary * _Nullable)resultDict __deprecated_msg("Use resultDictionary instead"); + +///----------------------------- +/// @name Key value coding magic +///----------------------------- + +/** Performs `setValue` to yield support for key value observing. + + @param object The object for which the values will be set. This is the key-value-coding compliant object that you might, for example, observe. + + */ + +- (void)kvcMagic:(id)object; + + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/FMDB/src/fmdb/FMResultSet.m b/Pods/FMDB/src/fmdb/FMResultSet.m new file mode 100644 index 0000000..2231e47 --- /dev/null +++ b/Pods/FMDB/src/fmdb/FMResultSet.m @@ -0,0 +1,432 @@ +#import "FMResultSet.h" +#import "FMDatabase.h" +#import "unistd.h" + +#if FMDB_SQLITE_STANDALONE +#import +#else +#import +#endif + +@interface FMDatabase () +- (void)resultSetDidClose:(FMResultSet *)resultSet; +@end + +@interface FMResultSet () { + NSMutableDictionary *_columnNameToIndexMap; +} +@end + +@implementation FMResultSet + ++ (instancetype)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB { + + FMResultSet *rs = [[FMResultSet alloc] init]; + + [rs setStatement:statement]; + [rs setParentDB:aDB]; + + NSParameterAssert(![statement inUse]); + [statement setInUse:YES]; // weak reference + + return FMDBReturnAutoreleased(rs); +} + +#if ! __has_feature(objc_arc) +- (void)finalize { + [self close]; + [super finalize]; +} +#endif + +- (void)dealloc { + [self close]; + + FMDBRelease(_query); + _query = nil; + + FMDBRelease(_columnNameToIndexMap); + _columnNameToIndexMap = nil; + +#if ! __has_feature(objc_arc) + [super dealloc]; +#endif +} + +- (void)close { + [_statement reset]; + FMDBRelease(_statement); + _statement = nil; + + // we don't need this anymore... (i think) + //[_parentDB setInUse:NO]; + [_parentDB resultSetDidClose:self]; + _parentDB = nil; +} + +- (int)columnCount { + return sqlite3_column_count([_statement statement]); +} + +- (NSMutableDictionary *)columnNameToIndexMap { + if (!_columnNameToIndexMap) { + int columnCount = sqlite3_column_count([_statement statement]); + _columnNameToIndexMap = [[NSMutableDictionary alloc] initWithCapacity:(NSUInteger)columnCount]; + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + [_columnNameToIndexMap setObject:[NSNumber numberWithInt:columnIdx] + forKey:[[NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)] lowercaseString]]; + } + } + return _columnNameToIndexMap; +} + +- (void)kvcMagic:(id)object { + + int columnCount = sqlite3_column_count([_statement statement]); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + + const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx); + + // check for a null row + if (c) { + NSString *s = [NSString stringWithUTF8String:c]; + + [object setValue:s forKey:[NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)]]; + } + } +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" + +- (NSDictionary *)resultDict { + + NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]); + + if (num_cols > 0) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols]; + + NSEnumerator *columnNames = [[self columnNameToIndexMap] keyEnumerator]; + NSString *columnName = nil; + while ((columnName = [columnNames nextObject])) { + id objectValue = [self objectForColumnName:columnName]; + [dict setObject:objectValue forKey:columnName]; + } + + return FMDBReturnAutoreleased([dict copy]); + } + else { + NSLog(@"Warning: There seem to be no columns in this set."); + } + + return nil; +} + +#pragma clang diagnostic pop + +- (NSDictionary*)resultDictionary { + + NSUInteger num_cols = (NSUInteger)sqlite3_data_count([_statement statement]); + + if (num_cols > 0) { + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols]; + + int columnCount = sqlite3_column_count([_statement statement]); + + int columnIdx = 0; + for (columnIdx = 0; columnIdx < columnCount; columnIdx++) { + + NSString *columnName = [NSString stringWithUTF8String:sqlite3_column_name([_statement statement], columnIdx)]; + id objectValue = [self objectForColumnIndex:columnIdx]; + [dict setObject:objectValue forKey:columnName]; + } + + return dict; + } + else { + NSLog(@"Warning: There seem to be no columns in this set."); + } + + return nil; +} + + + + +- (BOOL)next { + return [self nextWithError:nil]; +} + +- (BOOL)nextWithError:(NSError **)outErr { + + int rc = sqlite3_step([_statement statement]); + + if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) { + NSLog(@"%s:%d Database busy (%@)", __FUNCTION__, __LINE__, [_parentDB databasePath]); + NSLog(@"Database busy"); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + else if (SQLITE_DONE == rc || SQLITE_ROW == rc) { + // all is well, let's return. + } + else if (SQLITE_ERROR == rc) { + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + else if (SQLITE_MISUSE == rc) { + // uh oh. + NSLog(@"Error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + if (_parentDB) { + *outErr = [_parentDB lastError]; + } + else { + // If 'next' or 'nextWithError' is called after the result set is closed, + // we need to return the appropriate error. + NSDictionary* errorMessage = [NSDictionary dictionaryWithObject:@"parentDB does not exist" forKey:NSLocalizedDescriptionKey]; + *outErr = [NSError errorWithDomain:@"FMDatabase" code:SQLITE_MISUSE userInfo:errorMessage]; + } + + } + } + else { + // wtf? + NSLog(@"Unknown error calling sqlite3_step (%d: %s) rs", rc, sqlite3_errmsg([_parentDB sqliteHandle])); + if (outErr) { + *outErr = [_parentDB lastError]; + } + } + + + if (rc != SQLITE_ROW) { + [self close]; + } + + return (rc == SQLITE_ROW); +} + +- (BOOL)hasAnotherRow { + return sqlite3_errcode([_parentDB sqliteHandle]) == SQLITE_ROW; +} + +- (int)columnIndexForName:(NSString*)columnName { + columnName = [columnName lowercaseString]; + + NSNumber *n = [[self columnNameToIndexMap] objectForKey:columnName]; + + if (n != nil) { + return [n intValue]; + } + + NSLog(@"Warning: I could not find the column named '%@'.", columnName); + + return -1; +} + +- (int)intForColumn:(NSString*)columnName { + return [self intForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (int)intForColumnIndex:(int)columnIdx { + return sqlite3_column_int([_statement statement], columnIdx); +} + +- (long)longForColumn:(NSString*)columnName { + return [self longForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long)longForColumnIndex:(int)columnIdx { + return (long)sqlite3_column_int64([_statement statement], columnIdx); +} + +- (long long int)longLongIntForColumn:(NSString*)columnName { + return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (long long int)longLongIntForColumnIndex:(int)columnIdx { + return sqlite3_column_int64([_statement statement], columnIdx); +} + +- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName { + return [self unsignedLongLongIntForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx { + return (unsigned long long int)[self longLongIntForColumnIndex:columnIdx]; +} + +- (BOOL)boolForColumn:(NSString*)columnName { + return [self boolForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (BOOL)boolForColumnIndex:(int)columnIdx { + return ([self intForColumnIndex:columnIdx] != 0); +} + +- (double)doubleForColumn:(NSString*)columnName { + return [self doubleForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (double)doubleForColumnIndex:(int)columnIdx { + return sqlite3_column_double([_statement statement], columnIdx); +} + +- (NSString *)stringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0) || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx); + + if (!c) { + // null row. + return nil; + } + + return [NSString stringWithUTF8String:c]; +} + +- (NSString*)stringForColumn:(NSString*)columnName { + return [self stringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumn:(NSString*)columnName { + return [self dateForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSDate*)dateForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0) || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + return [_parentDB hasDateFormatter] ? [_parentDB dateFromString:[self stringForColumnIndex:columnIdx]] : [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]]; +} + + +- (NSData*)dataForColumn:(NSString*)columnName { + return [self dataForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0) || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + const char *dataBuffer = sqlite3_column_blob([_statement statement], columnIdx); + int dataSize = sqlite3_column_bytes([_statement statement], columnIdx); + + if (dataBuffer == NULL) { + return nil; + } + + return [NSData dataWithBytes:(const void *)dataBuffer length:(NSUInteger)dataSize]; +} + + +- (NSData*)dataNoCopyForColumn:(NSString*)columnName { + return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0) || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + const char *dataBuffer = sqlite3_column_blob([_statement statement], columnIdx); + int dataSize = sqlite3_column_bytes([_statement statement], columnIdx); + + NSData *data = [NSData dataWithBytesNoCopy:(void *)dataBuffer length:(NSUInteger)dataSize freeWhenDone:NO]; + + return data; +} + + +- (BOOL)columnIndexIsNull:(int)columnIdx { + return sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL; +} + +- (BOOL)columnIsNull:(NSString*)columnName { + return [self columnIndexIsNull:[self columnIndexForName:columnName]]; +} + +- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx { + + if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0) || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + return sqlite3_column_text([_statement statement], columnIdx); +} + +- (const unsigned char *)UTF8StringForColumn:(NSString*)columnName { + return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]]; +} + +- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName { + return [self UTF8StringForColumn:columnName]; +} + +- (id)objectForColumnIndex:(int)columnIdx { + if (columnIdx < 0 || columnIdx >= sqlite3_column_count([_statement statement])) { + return nil; + } + + int columnType = sqlite3_column_type([_statement statement], columnIdx); + + id returnValue = nil; + + if (columnType == SQLITE_INTEGER) { + returnValue = [NSNumber numberWithLongLong:[self longLongIntForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_FLOAT) { + returnValue = [NSNumber numberWithDouble:[self doubleForColumnIndex:columnIdx]]; + } + else if (columnType == SQLITE_BLOB) { + returnValue = [self dataForColumnIndex:columnIdx]; + } + else { + //default to a string for everything else + returnValue = [self stringForColumnIndex:columnIdx]; + } + + if (returnValue == nil) { + returnValue = [NSNull null]; + } + + return returnValue; +} + +- (id)objectForColumnName:(NSString*)columnName { + return [self objectForColumn:columnName]; +} + +- (id)objectForColumn:(NSString*)columnName { + return [self objectForColumnIndex:[self columnIndexForName:columnName]]; +} + +// returns autoreleased NSString containing the name of the column in the result set +- (NSString*)columnNameForIndex:(int)columnIdx { + return [NSString stringWithUTF8String: sqlite3_column_name([_statement statement], columnIdx)]; +} + +- (id)objectAtIndexedSubscript:(int)columnIdx { + return [self objectForColumnIndex:columnIdx]; +} + +- (id)objectForKeyedSubscript:(NSString *)columnName { + return [self objectForColumn:columnName]; +} + + +@end diff --git a/Pods/Headers/Private/BAAlert/BAActionSheet.h b/Pods/Headers/Private/BAAlert/BAActionSheet.h new file mode 120000 index 0000000..b2d04e7 --- /dev/null +++ b/Pods/Headers/Private/BAAlert/BAActionSheet.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAActionSheet.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAAlert/BAActionSheetCell.h b/Pods/Headers/Private/BAAlert/BAActionSheetCell.h new file mode 120000 index 0000000..0debeb8 --- /dev/null +++ b/Pods/Headers/Private/BAAlert/BAActionSheetCell.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAActionSheetCell.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAAlert/BAAlert.h b/Pods/Headers/Private/BAAlert/BAAlert.h new file mode 120000 index 0000000..f8717c3 --- /dev/null +++ b/Pods/Headers/Private/BAAlert/BAAlert.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAAlert/BAAlert_Config.h b/Pods/Headers/Private/BAAlert/BAAlert_Config.h new file mode 120000 index 0000000..24aaaa5 --- /dev/null +++ b/Pods/Headers/Private/BAAlert/BAAlert_Config.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert_Config.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAAlert/BAAlert_OC.h b/Pods/Headers/Private/BAAlert/BAAlert_OC.h new file mode 120000 index 0000000..5c0b57d --- /dev/null +++ b/Pods/Headers/Private/BAAlert/BAAlert_OC.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert_OC.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAAlert/CALayer+Animation.h b/Pods/Headers/Private/BAAlert/CALayer+Animation.h new file mode 120000 index 0000000..7f6640e --- /dev/null +++ b/Pods/Headers/Private/BAAlert/CALayer+Animation.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/CALayer+Animation.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAButton/BAButton.h b/Pods/Headers/Private/BAButton/BAButton.h index 00db182..dddfe84 120000 --- a/Pods/Headers/Private/BAButton/BAButton.h +++ b/Pods/Headers/Private/BAButton/BAButton.h @@ -1 +1 @@ -../../../BAButton/BAButton/BAButton.h \ No newline at end of file +../../../BAButton/BAButton/BAButton/BAButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAButton/UIButton+BACountDown.h b/Pods/Headers/Private/BAButton/UIButton+BACountDown.h new file mode 120000 index 0000000..022bca9 --- /dev/null +++ b/Pods/Headers/Private/BAButton/UIButton+BACountDown.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BACountDown.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAButton/UIButton+BAKit.h b/Pods/Headers/Private/BAButton/UIButton+BAKit.h new file mode 120000 index 0000000..7cc50c6 --- /dev/null +++ b/Pods/Headers/Private/BAButton/UIButton+BAKit.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAButton/UIButton+BAState.h b/Pods/Headers/Private/BAButton/UIButton+BAState.h new file mode 120000 index 0000000..78e65af --- /dev/null +++ b/Pods/Headers/Private/BAButton/UIButton+BAState.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BAState.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAButton/UIView+BARectCorner.h b/Pods/Headers/Private/BAButton/UIView+BARectCorner.h new file mode 120000 index 0000000..8bb6499 --- /dev/null +++ b/Pods/Headers/Private/BAButton/UIView+BARectCorner.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIView+BARectCorner.h \ No newline at end of file diff --git a/Pods/Headers/Private/BANetManager/BANetManager.h b/Pods/Headers/Private/BANetManager/BANetManager.h new file mode 120000 index 0000000..d22cd84 --- /dev/null +++ b/Pods/Headers/Private/BANetManager/BANetManager.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/BANetManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/BANetManager/BANetManagerCache.h b/Pods/Headers/Private/BANetManager/BANetManagerCache.h new file mode 120000 index 0000000..44227ca --- /dev/null +++ b/Pods/Headers/Private/BANetManager/BANetManagerCache.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/BANetManagerCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/BANetManager/UIImage+CompressImage.h b/Pods/Headers/Private/BANetManager/UIImage+CompressImage.h new file mode 120000 index 0000000..7022034 --- /dev/null +++ b/Pods/Headers/Private/BANetManager/UIImage+CompressImage.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/UIImage+CompressImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/BAKit_PickerView.h b/Pods/Headers/Private/BAPickView/BAKit_PickerView.h new file mode 120000 index 0000000..44f31c1 --- /dev/null +++ b/Pods/Headers/Private/BAPickView/BAKit_PickerView.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAKit_PickerView.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/BAPickView_Config.h b/Pods/Headers/Private/BAPickView/BAPickView_Config.h new file mode 120000 index 0000000..9be0c7e --- /dev/null +++ b/Pods/Headers/Private/BAPickView/BAPickView_Config.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAPickView_Config.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/BAPickView_OC.h b/Pods/Headers/Private/BAPickView/BAPickView_OC.h new file mode 120000 index 0000000..61a16cb --- /dev/null +++ b/Pods/Headers/Private/BAPickView/BAPickView_OC.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAPickView_OC.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/NSDate+BAKit.h b/Pods/Headers/Private/BAPickView/NSDate+BAKit.h new file mode 120000 index 0000000..7879695 --- /dev/null +++ b/Pods/Headers/Private/BAPickView/NSDate+BAKit.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/NSDate+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/NSDateFormatter+BAKit.h b/Pods/Headers/Private/BAPickView/NSDateFormatter+BAKit.h new file mode 120000 index 0000000..5a40f8f --- /dev/null +++ b/Pods/Headers/Private/BAPickView/NSDateFormatter+BAKit.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/UIView+BAAnimation.h b/Pods/Headers/Private/BAPickView/UIView+BAAnimation.h new file mode 120000 index 0000000..a640543 --- /dev/null +++ b/Pods/Headers/Private/BAPickView/UIView+BAAnimation.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/UIView+BAAnimation.h \ No newline at end of file diff --git a/Pods/Headers/Private/BAPickView/UIView+BARectCorner.h b/Pods/Headers/Private/BAPickView/UIView+BARectCorner.h new file mode 120000 index 0000000..7b5a9f4 --- /dev/null +++ b/Pods/Headers/Private/BAPickView/UIView+BARectCorner.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/UIView+BARectCorner.h \ No newline at end of file diff --git a/Pods/Headers/Private/BATextView/BATextView.h b/Pods/Headers/Private/BATextView/BATextView.h new file mode 120000 index 0000000..09af06e --- /dev/null +++ b/Pods/Headers/Private/BATextView/BATextView.h @@ -0,0 +1 @@ +../../../BATextView/BATextView/BATextView/BATextView.h \ No newline at end of file diff --git a/Pods/Headers/Private/BATextView/UITextView+BAKit.h b/Pods/Headers/Private/BATextView/UITextView+BAKit.h new file mode 120000 index 0000000..e0bffef --- /dev/null +++ b/Pods/Headers/Private/BATextView/UITextView+BAKit.h @@ -0,0 +1 @@ +../../../BATextView/BATextView/BATextView/UITextView+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BATouchID/BAKit_DeviceModel.h b/Pods/Headers/Private/BATouchID/BAKit_DeviceModel.h new file mode 120000 index 0000000..0c8f47a --- /dev/null +++ b/Pods/Headers/Private/BATouchID/BAKit_DeviceModel.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.h \ No newline at end of file diff --git a/Pods/Headers/Private/BATouchID/BAKit_TouchID.h b/Pods/Headers/Private/BATouchID/BAKit_TouchID.h new file mode 120000 index 0000000..fe3e22f --- /dev/null +++ b/Pods/Headers/Private/BATouchID/BAKit_TouchID.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BAKit_TouchID.h \ No newline at end of file diff --git a/Pods/Headers/Private/BATouchID/BATouchID.h b/Pods/Headers/Private/BATouchID/BATouchID.h new file mode 120000 index 0000000..fc63fe3 --- /dev/null +++ b/Pods/Headers/Private/BATouchID/BATouchID.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BATouchID.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/A2BlockInvocation.h b/Pods/Headers/Private/BlocksKit/A2BlockInvocation.h deleted file mode 120000 index 08c2de1..0000000 --- a/Pods/Headers/Private/BlocksKit/A2BlockInvocation.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/A2DynamicDelegate.h b/Pods/Headers/Private/BlocksKit/A2DynamicDelegate.h deleted file mode 120000 index ebcd461..0000000 --- a/Pods/Headers/Private/BlocksKit/A2DynamicDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/BKMacros.h b/Pods/Headers/Private/BlocksKit/BKMacros.h deleted file mode 120000 index 190e23c..0000000 --- a/Pods/Headers/Private/BlocksKit/BKMacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/BKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/BlocksKit+MessageUI.h b/Pods/Headers/Private/BlocksKit/BlocksKit+MessageUI.h deleted file mode 120000 index 0462a65..0000000 --- a/Pods/Headers/Private/BlocksKit/BlocksKit+MessageUI.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit+MessageUI.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/BlocksKit+UIKit.h b/Pods/Headers/Private/BlocksKit/BlocksKit+UIKit.h deleted file mode 120000 index ff2b10e..0000000 --- a/Pods/Headers/Private/BlocksKit/BlocksKit+UIKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit+UIKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/BlocksKit.h b/Pods/Headers/Private/BlocksKit/BlocksKit.h deleted file mode 120000 index a4b8214..0000000 --- a/Pods/Headers/Private/BlocksKit/BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/MFMailComposeViewController+BlocksKit.h b/Pods/Headers/Private/BlocksKit/MFMailComposeViewController+BlocksKit.h deleted file mode 120000 index b5aa446..0000000 --- a/Pods/Headers/Private/BlocksKit/MFMailComposeViewController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/MFMessageComposeViewController+BlocksKit.h b/Pods/Headers/Private/BlocksKit/MFMessageComposeViewController+BlocksKit.h deleted file mode 120000 index 2b73762..0000000 --- a/Pods/Headers/Private/BlocksKit/MFMessageComposeViewController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSArray+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSArray+BlocksKit.h deleted file mode 120000 index 22a1ce7..0000000 --- a/Pods/Headers/Private/BlocksKit/NSArray+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSArray+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSCache+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSCache+BlocksKit.h deleted file mode 120000 index 44a17ce..0000000 --- a/Pods/Headers/Private/BlocksKit/NSCache+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSDictionary+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSDictionary+BlocksKit.h deleted file mode 120000 index d8c0ca3..0000000 --- a/Pods/Headers/Private/BlocksKit/NSDictionary+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSIndexSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSIndexSet+BlocksKit.h deleted file mode 120000 index afa7e41..0000000 --- a/Pods/Headers/Private/BlocksKit/NSIndexSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSInvocation+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSInvocation+BlocksKit.h deleted file mode 120000 index 3d3fc8f..0000000 --- a/Pods/Headers/Private/BlocksKit/NSInvocation+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSMutableArray+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSMutableArray+BlocksKit.h deleted file mode 120000 index 568b89e..0000000 --- a/Pods/Headers/Private/BlocksKit/NSMutableArray+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSMutableDictionary+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSMutableDictionary+BlocksKit.h deleted file mode 120000 index 1d9d942..0000000 --- a/Pods/Headers/Private/BlocksKit/NSMutableDictionary+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSMutableIndexSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSMutableIndexSet+BlocksKit.h deleted file mode 120000 index 7c8a23f..0000000 --- a/Pods/Headers/Private/BlocksKit/NSMutableIndexSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSMutableOrderedSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSMutableOrderedSet+BlocksKit.h deleted file mode 120000 index de5931c..0000000 --- a/Pods/Headers/Private/BlocksKit/NSMutableOrderedSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSMutableSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSMutableSet+BlocksKit.h deleted file mode 120000 index a415f20..0000000 --- a/Pods/Headers/Private/BlocksKit/NSMutableSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSObject+A2BlockDelegate.h b/Pods/Headers/Private/BlocksKit/NSObject+A2BlockDelegate.h deleted file mode 120000 index d0c206b..0000000 --- a/Pods/Headers/Private/BlocksKit/NSObject+A2BlockDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSObject+A2DynamicDelegate.h b/Pods/Headers/Private/BlocksKit/NSObject+A2DynamicDelegate.h deleted file mode 120000 index ca1af22..0000000 --- a/Pods/Headers/Private/BlocksKit/NSObject+A2DynamicDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSObject+BKAssociatedObjects.h b/Pods/Headers/Private/BlocksKit/NSObject+BKAssociatedObjects.h deleted file mode 120000 index 98b5c83..0000000 --- a/Pods/Headers/Private/BlocksKit/NSObject+BKAssociatedObjects.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSObject+BKBlockExecution.h b/Pods/Headers/Private/BlocksKit/NSObject+BKBlockExecution.h deleted file mode 120000 index 4f60201..0000000 --- a/Pods/Headers/Private/BlocksKit/NSObject+BKBlockExecution.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSObject+BKBlockObservation.h b/Pods/Headers/Private/BlocksKit/NSObject+BKBlockObservation.h deleted file mode 120000 index d94700c..0000000 --- a/Pods/Headers/Private/BlocksKit/NSObject+BKBlockObservation.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSOrderedSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSOrderedSet+BlocksKit.h deleted file mode 120000 index e0e0999..0000000 --- a/Pods/Headers/Private/BlocksKit/NSOrderedSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSSet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSSet+BlocksKit.h deleted file mode 120000 index b49aa73..0000000 --- a/Pods/Headers/Private/BlocksKit/NSSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSTimer+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSTimer+BlocksKit.h deleted file mode 120000 index 25d861b..0000000 --- a/Pods/Headers/Private/BlocksKit/NSTimer+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/NSURLConnection+BlocksKit.h b/Pods/Headers/Private/BlocksKit/NSURLConnection+BlocksKit.h deleted file mode 120000 index a968a5b..0000000 --- a/Pods/Headers/Private/BlocksKit/NSURLConnection+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIActionSheet+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIActionSheet+BlocksKit.h deleted file mode 120000 index 1ae5b33..0000000 --- a/Pods/Headers/Private/BlocksKit/UIActionSheet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIAlertView+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIAlertView+BlocksKit.h deleted file mode 120000 index a872701..0000000 --- a/Pods/Headers/Private/BlocksKit/UIAlertView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIBarButtonItem+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIBarButtonItem+BlocksKit.h deleted file mode 120000 index 1a50da0..0000000 --- a/Pods/Headers/Private/BlocksKit/UIBarButtonItem+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIControl+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIControl+BlocksKit.h deleted file mode 120000 index 528d1ea..0000000 --- a/Pods/Headers/Private/BlocksKit/UIControl+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIGestureRecognizer+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIGestureRecognizer+BlocksKit.h deleted file mode 120000 index f343150..0000000 --- a/Pods/Headers/Private/BlocksKit/UIGestureRecognizer+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIImagePickerController+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIImagePickerController+BlocksKit.h deleted file mode 120000 index a674bef..0000000 --- a/Pods/Headers/Private/BlocksKit/UIImagePickerController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIPopoverController+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIPopoverController+BlocksKit.h deleted file mode 120000 index f20f8a4..0000000 --- a/Pods/Headers/Private/BlocksKit/UIPopoverController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UITextField+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UITextField+BlocksKit.h deleted file mode 120000 index b6c3ca8..0000000 --- a/Pods/Headers/Private/BlocksKit/UITextField+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIView+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIView+BlocksKit.h deleted file mode 120000 index 6c4e8e4..0000000 --- a/Pods/Headers/Private/BlocksKit/UIView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/BlocksKit/UIWebView+BlocksKit.h b/Pods/Headers/Private/BlocksKit/UIWebView+BlocksKit.h deleted file mode 120000 index 729ac72..0000000 --- a/Pods/Headers/Private/BlocksKit/UIWebView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h b/Pods/Headers/Private/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h new file mode 120000 index 0000000..6c759cf --- /dev/null +++ b/Pods/Headers/Private/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h @@ -0,0 +1 @@ +../../../DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTracker.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTracker.h deleted file mode 120000 index 07c1975..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTracker.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTracker.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerDefines.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerDefines.h deleted file mode 120000 index 54d1cdb..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerDefines.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerFunctors.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerFunctors.h deleted file mode 120000 index a84503b..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerFunctors.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerFunctors.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGeneration.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGeneration.h deleted file mode 120000 index d14137e..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGeneration.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGeneration.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGenerationManager.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGenerationManager.h deleted file mode 120000 index 17d0abe..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerGenerationManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerHelpers.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerHelpers.h deleted file mode 120000 index 8005e08..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerHelpers.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerHelpers.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerImpl.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerImpl.h deleted file mode 120000 index 2c378a9..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerImpl.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerImpl.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerManager.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerManager.h deleted file mode 120000 index 901e452..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerNSZombieSupport.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerNSZombieSupport.h deleted file mode 120000 index ed9b49e..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerNSZombieSupport.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerSummary.h b/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerSummary.h deleted file mode 120000 index d102573..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/FBAllocationTrackerSummary.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBAllocationTracker/NSObject+FBAllocationTracker.h b/Pods/Headers/Private/FBAllocationTracker/NSObject+FBAllocationTracker.h deleted file mode 120000 index a103772..0000000 --- a/Pods/Headers/Private/FBAllocationTracker/NSObject+FBAllocationTracker.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/NSObject+FBAllocationTracker.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfiler.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfiler.h deleted file mode 120000 index 0226a94..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfiler.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h deleted file mode 120000 index 1be87b8..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDataSource.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDataSource.h deleted file mode 120000 index 28d9a30..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h deleted file mode 120000 index 8721725..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h deleted file mode 120000 index a15d958..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h deleted file mode 120000 index fc4735f..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMathUtils.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMathUtils.h deleted file mode 120000 index 60e8e49..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMathUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h deleted file mode 120000 index 64214c5..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerOptions.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerOptions.h deleted file mode 120000 index 2c48155..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerOptions.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPluggable.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPluggable.h deleted file mode 120000 index 34967b9..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPluggable.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h deleted file mode 120000 index 81124eb..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresenting.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresenting.h deleted file mode 120000 index 88f297f..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerPresenting.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h deleted file mode 120000 index 7b98e1e..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h deleted file mode 120000 index e95fb52..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerTextField.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerTextField.h deleted file mode 120000 index 6155d4d..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerTextField.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerView.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerView.h deleted file mode 120000 index e092a1b..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerViewController.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerViewController.h deleted file mode 120000 index 38c4ca2..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindow.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindow.h deleted file mode 120000 index 6b9d453..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindow.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h b/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h deleted file mode 120000 index 360d6ce..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBRetainCycleAnalysisCache.h b/Pods/Headers/Private/FBMemoryProfiler/FBRetainCycleAnalysisCache.h deleted file mode 120000 index c99e305..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBRetainCycleAnalysisCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBRetainCyclePresenter.h b/Pods/Headers/Private/FBMemoryProfiler/FBRetainCyclePresenter.h deleted file mode 120000 index 6e5f1a0..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBRetainCyclePresenter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBMemoryProfiler/FBSingleRetainCycleViewController.h b/Pods/Headers/Private/FBMemoryProfiler/FBSingleRetainCycleViewController.h deleted file mode 120000 index 2c410ce..0000000 --- a/Pods/Headers/Private/FBMemoryProfiler/FBSingleRetainCycleViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBRetainCycleDetector/BaseType.h b/Pods/Headers/Private/FBRetainCycleDetector/BaseType.h new file mode 120000 index 0000000..a4f8a37 --- /dev/null +++ b/Pods/Headers/Private/FBRetainCycleDetector/BaseType.h @@ -0,0 +1 @@ +../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/BaseType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBRetainCycleDetector/FBParsedStruct.h b/Pods/Headers/Private/FBRetainCycleDetector/FBParsedStruct.h deleted file mode 120000 index faa2b7e..0000000 --- a/Pods/Headers/Private/FBRetainCycleDetector/FBParsedStruct.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBRetainCycleDetector/FBParsedType.h b/Pods/Headers/Private/FBRetainCycleDetector/FBParsedType.h deleted file mode 120000 index b03ea66..0000000 --- a/Pods/Headers/Private/FBRetainCycleDetector/FBParsedType.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBRetainCycleDetector/Struct.h b/Pods/Headers/Private/FBRetainCycleDetector/Struct.h new file mode 120000 index 0000000..2661031 --- /dev/null +++ b/Pods/Headers/Private/FBRetainCycleDetector/Struct.h @@ -0,0 +1 @@ +../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Struct.h \ No newline at end of file diff --git a/Pods/Headers/Private/FBRetainCycleDetector/Type.h b/Pods/Headers/Private/FBRetainCycleDetector/Type.h new file mode 120000 index 0000000..f31a327 --- /dev/null +++ b/Pods/Headers/Private/FBRetainCycleDetector/Type.h @@ -0,0 +1 @@ +../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/Type.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMDB.h b/Pods/Headers/Private/FMDB/FMDB.h new file mode 120000 index 0000000..bcd6e0a --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMDB.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDB.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMDatabase.h b/Pods/Headers/Private/FMDB/FMDatabase.h new file mode 120000 index 0000000..e69b333 --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMDatabase.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabase.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMDatabaseAdditions.h b/Pods/Headers/Private/FMDB/FMDatabaseAdditions.h new file mode 120000 index 0000000..b48a6a3 --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMDatabaseAdditions.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMDatabasePool.h b/Pods/Headers/Private/FMDB/FMDatabasePool.h new file mode 120000 index 0000000..1d78001 --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMDatabasePool.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabasePool.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMDatabaseQueue.h b/Pods/Headers/Private/FMDB/FMDatabaseQueue.h new file mode 120000 index 0000000..9adde87 --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMDatabaseQueue.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseQueue.h \ No newline at end of file diff --git a/Pods/Headers/Private/FMDB/FMResultSet.h b/Pods/Headers/Private/FMDB/FMResultSet.h new file mode 120000 index 0000000..fd761d8 --- /dev/null +++ b/Pods/Headers/Private/FMDB/FMResultSet.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMResultSet.h \ No newline at end of file diff --git a/Pods/Headers/Private/MLeaksFinder/UITouch+MemoryLeak.h b/Pods/Headers/Private/MLeaksFinder/UITouch+MemoryLeak.h new file mode 120000 index 0000000..f41084a --- /dev/null +++ b/Pods/Headers/Private/MLeaksFinder/UITouch+MemoryLeak.h @@ -0,0 +1 @@ +../../../MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyLayoutDime.h b/Pods/Headers/Private/MyLayout/MyLayoutDime.h deleted file mode 120000 index 82105b1..0000000 --- a/Pods/Headers/Private/MyLayout/MyLayoutDime.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutDime.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyLayoutDimeInner.h b/Pods/Headers/Private/MyLayout/MyLayoutDimeInner.h deleted file mode 120000 index 39f7c7b..0000000 --- a/Pods/Headers/Private/MyLayout/MyLayoutDimeInner.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutDimeInner.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyLayoutMeasure.h b/Pods/Headers/Private/MyLayout/MyLayoutMeasure.h deleted file mode 120000 index 6fad072..0000000 --- a/Pods/Headers/Private/MyLayout/MyLayoutMeasure.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutMeasure.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyLayoutSize.h b/Pods/Headers/Private/MyLayout/MyLayoutSize.h new file mode 120000 index 0000000..51979e4 --- /dev/null +++ b/Pods/Headers/Private/MyLayout/MyLayoutSize.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyLayoutSize.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyLayoutSizeInner.h b/Pods/Headers/Private/MyLayout/MyLayoutSizeInner.h new file mode 120000 index 0000000..078770c --- /dev/null +++ b/Pods/Headers/Private/MyLayout/MyLayoutSizeInner.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyLayoutSizeInner.h \ No newline at end of file diff --git a/Pods/Headers/Private/MyLayout/MyPathLayout.h b/Pods/Headers/Private/MyLayout/MyPathLayout.h new file mode 120000 index 0000000..5848c3d --- /dev/null +++ b/Pods/Headers/Private/MyLayout/MyPathLayout.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyPathLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/MKAnnotationView+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/MKAnnotationView+RACSignalSupport.h new file mode 120000 index 0000000..e79e126 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/MKAnnotationView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSArray+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSArray+RACSequenceAdditions.h new file mode 120000 index 0000000..46decd6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSArray+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSData+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSData+RACSupport.h new file mode 120000 index 0000000..4a4b10b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSData+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSData+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSDictionary+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSDictionary+RACSequenceAdditions.h new file mode 120000 index 0000000..04f3b04 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSDictionary+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h new file mode 120000 index 0000000..501b332 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSFileHandle+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSFileHandle+RACSupport.h new file mode 120000 index 0000000..c8e0e58 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSFileHandle+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h new file mode 120000 index 0000000..fa4b6f2 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSInvocation+RACTypeParsing.h b/Pods/Headers/Private/ReactiveObjC/NSInvocation+RACTypeParsing.h new file mode 120000 index 0000000..65448b0 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSInvocation+RACTypeParsing.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSNotificationCenter+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSNotificationCenter+RACSupport.h new file mode 120000 index 0000000..b18ac56 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSNotificationCenter+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACDeallocating.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACDeallocating.h new file mode 120000 index 0000000..b05cf18 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACDeallocating.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACDescription.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACDescription.h new file mode 120000 index 0000000..89975e7 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACDescription.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACKVOWrapper.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACKVOWrapper.h new file mode 120000 index 0000000..61836b9 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACKVOWrapper.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACLifting.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACLifting.h new file mode 120000 index 0000000..74f3d92 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACLifting.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACPropertySubscribing.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACPropertySubscribing.h new file mode 120000 index 0000000..b04700e --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACPropertySubscribing.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSObject+RACSelectorSignal.h b/Pods/Headers/Private/ReactiveObjC/NSObject+RACSelectorSignal.h new file mode 120000 index 0000000..da825ee --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSObject+RACSelectorSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h new file mode 120000 index 0000000..11857b0 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSSet+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSSet+RACSequenceAdditions.h new file mode 120000 index 0000000..ea33c93 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSString+RACKeyPathUtilities.h b/Pods/Headers/Private/ReactiveObjC/NSString+RACKeyPathUtilities.h new file mode 120000 index 0000000..345e28b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSString+RACKeyPathUtilities.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSString+RACSequenceAdditions.h b/Pods/Headers/Private/ReactiveObjC/NSString+RACSequenceAdditions.h new file mode 120000 index 0000000..321cc61 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSString+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSString+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSString+RACSupport.h new file mode 120000 index 0000000..e0921af --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSString+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSURLConnection+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSURLConnection+RACSupport.h new file mode 120000 index 0000000..4fba2c8 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSURLConnection+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/NSUserDefaults+RACSupport.h b/Pods/Headers/Private/ReactiveObjC/NSUserDefaults+RACSupport.h new file mode 120000 index 0000000..af8fa7e --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/NSUserDefaults+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACAnnotations.h b/Pods/Headers/Private/ReactiveObjC/RACAnnotations.h new file mode 120000 index 0000000..d5a17b1 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACAnnotations.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACAnnotations.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACArraySequence.h b/Pods/Headers/Private/ReactiveObjC/RACArraySequence.h new file mode 120000 index 0000000..7239f2a --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACArraySequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACArraySequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACBehaviorSubject.h b/Pods/Headers/Private/ReactiveObjC/RACBehaviorSubject.h new file mode 120000 index 0000000..27d732d --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACBehaviorSubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACBlockTrampoline.h b/Pods/Headers/Private/ReactiveObjC/RACBlockTrampoline.h new file mode 120000 index 0000000..c7da3f4 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACBlockTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACChannel.h b/Pods/Headers/Private/ReactiveObjC/RACChannel.h new file mode 120000 index 0000000..3aba205 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACChannel.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACChannel.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACCommand.h b/Pods/Headers/Private/ReactiveObjC/RACCommand.h new file mode 120000 index 0000000..b482435 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACCommand.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACCommand.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACCompoundDisposable.h b/Pods/Headers/Private/ReactiveObjC/RACCompoundDisposable.h new file mode 120000 index 0000000..30ff17d --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACCompoundDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACDelegateProxy.h b/Pods/Headers/Private/ReactiveObjC/RACDelegateProxy.h new file mode 120000 index 0000000..ce98ef4 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACDelegateProxy.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDelegateProxy.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACDisposable.h b/Pods/Headers/Private/ReactiveObjC/RACDisposable.h new file mode 120000 index 0000000..8231e89 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACDynamicSequence.h b/Pods/Headers/Private/ReactiveObjC/RACDynamicSequence.h new file mode 120000 index 0000000..ed7b7a6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACDynamicSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDynamicSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACDynamicSignal.h b/Pods/Headers/Private/ReactiveObjC/RACDynamicSignal.h new file mode 120000 index 0000000..49627bc --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACDynamicSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDynamicSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEXTKeyPathCoding.h b/Pods/Headers/Private/ReactiveObjC/RACEXTKeyPathCoding.h new file mode 120000 index 0000000..32b158d --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEXTKeyPathCoding.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACEXTKeyPathCoding.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEXTRuntimeExtensions.h b/Pods/Headers/Private/ReactiveObjC/RACEXTRuntimeExtensions.h new file mode 120000 index 0000000..dc30e8a --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEXTRuntimeExtensions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEXTScope.h b/Pods/Headers/Private/ReactiveObjC/RACEXTScope.h new file mode 120000 index 0000000..e3c542f --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEXTScope.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACEXTScope.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEagerSequence.h b/Pods/Headers/Private/ReactiveObjC/RACEagerSequence.h new file mode 120000 index 0000000..96ce023 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEagerSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEagerSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEmptySequence.h b/Pods/Headers/Private/ReactiveObjC/RACEmptySequence.h new file mode 120000 index 0000000..8ceb416 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEmptySequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEmptySequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEmptySignal.h b/Pods/Headers/Private/ReactiveObjC/RACEmptySignal.h new file mode 120000 index 0000000..9a102a8 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEmptySignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEmptySignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACErrorSignal.h b/Pods/Headers/Private/ReactiveObjC/RACErrorSignal.h new file mode 120000 index 0000000..3cc7f4c --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACErrorSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACErrorSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACEvent.h b/Pods/Headers/Private/ReactiveObjC/RACEvent.h new file mode 120000 index 0000000..87a834b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACEvent.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEvent.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACGroupedSignal.h b/Pods/Headers/Private/ReactiveObjC/RACGroupedSignal.h new file mode 120000 index 0000000..69230d9 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACGroupedSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACGroupedSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACImmediateScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACImmediateScheduler.h new file mode 120000 index 0000000..c19c716 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACImmediateScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACIndexSetSequence.h b/Pods/Headers/Private/ReactiveObjC/RACIndexSetSequence.h new file mode 120000 index 0000000..54215f7 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACIndexSetSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACKVOChannel.h b/Pods/Headers/Private/ReactiveObjC/RACKVOChannel.h new file mode 120000 index 0000000..d70cc9e --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACKVOChannel.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOChannel.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACKVOProxy.h b/Pods/Headers/Private/ReactiveObjC/RACKVOProxy.h new file mode 120000 index 0000000..2d924a0 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACKVOProxy.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOProxy.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACKVOTrampoline.h b/Pods/Headers/Private/ReactiveObjC/RACKVOTrampoline.h new file mode 120000 index 0000000..e13f46c --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACKVOTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection+Private.h b/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection+Private.h new file mode 120000 index 0000000..bb85777 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection+Private.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACMulticastConnection+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection.h b/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection.h new file mode 120000 index 0000000..2e5808b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACMulticastConnection.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACMulticastConnection.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACPassthroughSubscriber.h b/Pods/Headers/Private/ReactiveObjC/RACPassthroughSubscriber.h new file mode 120000 index 0000000..aa80cab --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACPassthroughSubscriber.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler+Subclass.h b/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler+Subclass.h new file mode 120000 index 0000000..f67e31f --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler+Subclass.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler.h new file mode 120000 index 0000000..ea57520 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACQueueScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACQueueScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACReplaySubject.h b/Pods/Headers/Private/ReactiveObjC/RACReplaySubject.h new file mode 120000 index 0000000..854344d --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACReplaySubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACReplaySubject.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACReturnSignal.h b/Pods/Headers/Private/ReactiveObjC/RACReturnSignal.h new file mode 120000 index 0000000..e20b893 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACReturnSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACReturnSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACScheduler+Private.h b/Pods/Headers/Private/ReactiveObjC/RACScheduler+Private.h new file mode 120000 index 0000000..2a181ce --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACScheduler+Private.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScheduler+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACScheduler+Subclass.h b/Pods/Headers/Private/ReactiveObjC/RACScheduler+Subclass.h new file mode 120000 index 0000000..9ae2fe1 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACScheduler+Subclass.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACScheduler.h new file mode 120000 index 0000000..6607f25 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACScopedDisposable.h b/Pods/Headers/Private/ReactiveObjC/RACScopedDisposable.h new file mode 120000 index 0000000..dfa4a85 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACScopedDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScopedDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSequence.h b/Pods/Headers/Private/ReactiveObjC/RACSequence.h new file mode 120000 index 0000000..a0f66f5 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSerialDisposable.h b/Pods/Headers/Private/ReactiveObjC/RACSerialDisposable.h new file mode 120000 index 0000000..9c0c169 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSerialDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSerialDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSignal+Operations.h b/Pods/Headers/Private/ReactiveObjC/RACSignal+Operations.h new file mode 120000 index 0000000..82e3f44 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSignal+Operations.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignal+Operations.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSignal.h b/Pods/Headers/Private/ReactiveObjC/RACSignal.h new file mode 120000 index 0000000..4b1cdd0 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignal.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSignalSequence.h b/Pods/Headers/Private/ReactiveObjC/RACSignalSequence.h new file mode 120000 index 0000000..fdd34d9 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSignalSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignalSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACStream+Private.h b/Pods/Headers/Private/ReactiveObjC/RACStream+Private.h new file mode 120000 index 0000000..414de4a --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACStream+Private.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACStream+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACStream.h b/Pods/Headers/Private/ReactiveObjC/RACStream.h new file mode 120000 index 0000000..910bd08 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACStream.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACStream.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACStringSequence.h b/Pods/Headers/Private/ReactiveObjC/RACStringSequence.h new file mode 120000 index 0000000..c0059cb --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACStringSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACStringSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSubject.h b/Pods/Headers/Private/ReactiveObjC/RACSubject.h new file mode 120000 index 0000000..b4f83e7 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubject.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSubscriber+Private.h b/Pods/Headers/Private/ReactiveObjC/RACSubscriber+Private.h new file mode 120000 index 0000000..3a2a582 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSubscriber+Private.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriber+Private.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSubscriber.h b/Pods/Headers/Private/ReactiveObjC/RACSubscriber.h new file mode 120000 index 0000000..d65e0bd --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSubscriber.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriber.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h b/Pods/Headers/Private/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h new file mode 120000 index 0000000..3ea4289 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACSubscriptionScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACSubscriptionScheduler.h new file mode 120000 index 0000000..f45ddb2 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACSubscriptionScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACTargetQueueScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACTargetQueueScheduler.h new file mode 120000 index 0000000..3390556 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACTargetQueueScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACTestScheduler.h b/Pods/Headers/Private/ReactiveObjC/RACTestScheduler.h new file mode 120000 index 0000000..98d129b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACTestScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTestScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACTuple.h b/Pods/Headers/Private/ReactiveObjC/RACTuple.h new file mode 120000 index 0000000..e55f508 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACTuple.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTuple.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACTupleSequence.h b/Pods/Headers/Private/ReactiveObjC/RACTupleSequence.h new file mode 120000 index 0000000..c960fb6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACTupleSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTupleSequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACUnarySequence.h b/Pods/Headers/Private/ReactiveObjC/RACUnarySequence.h new file mode 120000 index 0000000..e0312e0 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACUnarySequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACUnarySequence.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACUnit.h b/Pods/Headers/Private/ReactiveObjC/RACUnit.h new file mode 120000 index 0000000..a5a6ef9 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACUnit.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACUnit.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACValueTransformer.h b/Pods/Headers/Private/ReactiveObjC/RACValueTransformer.h new file mode 120000 index 0000000..df910f6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACValueTransformer.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACValueTransformer.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/RACmetamacros.h b/Pods/Headers/Private/ReactiveObjC/RACmetamacros.h new file mode 120000 index 0000000..1de0ce9 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/RACmetamacros.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACmetamacros.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/ReactiveObjC.h b/Pods/Headers/Private/ReactiveObjC/ReactiveObjC.h new file mode 120000 index 0000000..391acec --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/ReactiveObjC.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/ReactiveObjC.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIActionSheet+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIActionSheet+RACSignalSupport.h new file mode 120000 index 0000000..3be79b1 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIActionSheet+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIAlertView+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIAlertView+RACSignalSupport.h new file mode 120000 index 0000000..51b41fd --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIAlertView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h b/Pods/Headers/Private/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h new file mode 120000 index 0000000..0727229 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIButton+RACCommandSupport.h b/Pods/Headers/Private/ReactiveObjC/UIButton+RACCommandSupport.h new file mode 120000 index 0000000..b06b2d8 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIButton+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h new file mode 120000 index 0000000..ecc8173 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupport.h new file mode 120000 index 0000000..db09cf6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupportPrivate.h b/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupportPrivate.h new file mode 120000 index 0000000..e96b6bd --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIControl+RACSignalSupportPrivate.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIDatePicker+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIDatePicker+RACSignalSupport.h new file mode 120000 index 0000000..cfb2ac6 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIDatePicker+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h new file mode 120000 index 0000000..ceabb9f --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIImagePickerController+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIImagePickerController+RACSignalSupport.h new file mode 120000 index 0000000..47e463b --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIImagePickerController+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIRefreshControl+RACCommandSupport.h b/Pods/Headers/Private/ReactiveObjC/UIRefreshControl+RACCommandSupport.h new file mode 120000 index 0000000..62d4147 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIRefreshControl+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UISegmentedControl+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UISegmentedControl+RACSignalSupport.h new file mode 120000 index 0000000..5c2b916 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UISegmentedControl+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UISlider+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UISlider+RACSignalSupport.h new file mode 120000 index 0000000..817a76a --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UISlider+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UIStepper+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UIStepper+RACSignalSupport.h new file mode 120000 index 0000000..ddb21b7 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UIStepper+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UISwitch+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UISwitch+RACSignalSupport.h new file mode 120000 index 0000000..2cbd6a7 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UISwitch+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UITableViewCell+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UITableViewCell+RACSignalSupport.h new file mode 120000 index 0000000..94c3d13 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UITableViewCell+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h new file mode 120000 index 0000000..ce71d78 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UITextField+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UITextField+RACSignalSupport.h new file mode 120000 index 0000000..56a156c --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UITextField+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/ReactiveObjC/UITextView+RACSignalSupport.h b/Pods/Headers/Private/ReactiveObjC/UITextView+RACSignalSupport.h new file mode 120000 index 0000000..db98b97 --- /dev/null +++ b/Pods/Headers/Private/ReactiveObjC/UITextView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h b/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h new file mode 120000 index 0000000..b7a00e1 --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/NSImage+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/NSImage+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h b/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h new file mode 120000 index 0000000..f0f1f8f --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/SDImageCacheConfig.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDImageCacheConfig.h \ No newline at end of file diff --git a/Pods/Headers/Private/SDWebImage/UIView+WebCache.h b/Pods/Headers/Private/SDWebImage/UIView+WebCache.h new file mode 120000 index 0000000..641671a --- /dev/null +++ b/Pods/Headers/Private/SDWebImage/UIView+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/APOpenAPI.h b/Pods/Headers/Private/UMengSocial/APOpenAPI.h deleted file mode 120000 index 2338b7f..0000000 --- a/Pods/Headers/Private/UMengSocial/APOpenAPI.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/APOpenAPIObject.h b/Pods/Headers/Private/UMengSocial/APOpenAPIObject.h deleted file mode 120000 index db61581..0000000 --- a/Pods/Headers/Private/UMengSocial/APOpenAPIObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocial.h b/Pods/Headers/Private/UMengSocial/UMSocial.h deleted file mode 120000 index f3722cf..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocial.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialAccountManager.h b/Pods/Headers/Private/UMengSocial/UMSocialAccountManager.h deleted file mode 120000 index 1055eb7..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialAccountManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialAlipayShareHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialAlipayShareHandler.h deleted file mode 120000 index 5e1b23a..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialAlipayShareHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialBar.h b/Pods/Headers/Private/UMengSocial/UMSocialBar.h deleted file mode 120000 index 1a3ba01..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialBar.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialConfig.h b/Pods/Headers/Private/UMengSocial/UMSocialConfig.h deleted file mode 120000 index 983918b..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialConfig.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialControllerService.h b/Pods/Headers/Private/UMengSocial/UMSocialControllerService.h deleted file mode 120000 index 4247fb6..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialControllerService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialControllerServiceComment.h b/Pods/Headers/Private/UMengSocial/UMSocialControllerServiceComment.h deleted file mode 120000 index d4fc4d3..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialControllerServiceComment.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialData.h b/Pods/Headers/Private/UMengSocial/UMSocialData.h deleted file mode 120000 index c4c5287..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialData.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialDataService.h b/Pods/Headers/Private/UMengSocial/UMSocialDataService.h deleted file mode 120000 index 2411bfe..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialDataService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialFacebookHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialFacebookHandler.h deleted file mode 120000 index ffba44c..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialFacebookHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialInstagramHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialInstagramHandler.h deleted file mode 120000 index 59e7c09..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialInstagramHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialLaiwangHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialLaiwangHandler.h deleted file mode 120000 index 36a248a..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialLaiwangHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialLineHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialLineHandler.h deleted file mode 120000 index 82f7257..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialLineHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialQQHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialQQHandler.h deleted file mode 120000 index b71e814..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialQQHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialSinaHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialSinaHandler.h deleted file mode 120000 index 1bb23d5..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialSinaHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialSinaSSOHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialSinaSSOHandler.h deleted file mode 120000 index ecbad57..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialSinaSSOHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialSnsData.h b/Pods/Headers/Private/UMengSocial/UMSocialSnsData.h deleted file mode 120000 index 34c5ee8..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialSnsData.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialSnsPlatformManager.h b/Pods/Headers/Private/UMengSocial/UMSocialSnsPlatformManager.h deleted file mode 120000 index b4202a7..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialSnsPlatformManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialSnsService.h b/Pods/Headers/Private/UMengSocial/UMSocialSnsService.h deleted file mode 120000 index bc7d24b..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialSnsService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialTumblrHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialTumblrHandler.h deleted file mode 120000 index b6abdc7..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialTumblrHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialTwitterHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialTwitterHandler.h deleted file mode 120000 index e29fe15..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialTwitterHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialWechatHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialWechatHandler.h deleted file mode 120000 index 0371048..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialWechatHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/UMSocialWhatsappHandler.h b/Pods/Headers/Private/UMengSocial/UMSocialWhatsappHandler.h deleted file mode 120000 index d49139c..0000000 --- a/Pods/Headers/Private/UMengSocial/UMSocialWhatsappHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboGame.h b/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboGame.h deleted file mode 120000 index 6193e95..0000000 --- a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboGame.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboShare.h b/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboShare.h deleted file mode 120000 index 8365d25..0000000 --- a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboShare.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboToken.h b/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboToken.h deleted file mode 120000 index 81290c9..0000000 --- a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboUser.h b/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboUser.h deleted file mode 120000 index 832edb2..0000000 --- a/Pods/Headers/Private/UMengSocial/WBHttpRequest+WeiboUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBHttpRequest.h b/Pods/Headers/Private/UMengSocial/WBHttpRequest.h deleted file mode 120000 index 1fdea8a..0000000 --- a/Pods/Headers/Private/UMengSocial/WBHttpRequest.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBSDKBasicButton.h b/Pods/Headers/Private/UMengSocial/WBSDKBasicButton.h deleted file mode 120000 index 126e8ff..0000000 --- a/Pods/Headers/Private/UMengSocial/WBSDKBasicButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBSDKCommentButton.h b/Pods/Headers/Private/UMengSocial/WBSDKCommentButton.h deleted file mode 120000 index 9ce7fc4..0000000 --- a/Pods/Headers/Private/UMengSocial/WBSDKCommentButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WBSDKRelationshipButton.h b/Pods/Headers/Private/UMengSocial/WBSDKRelationshipButton.h deleted file mode 120000 index de69fcf..0000000 --- a/Pods/Headers/Private/UMengSocial/WBSDKRelationshipButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WXApi.h b/Pods/Headers/Private/UMengSocial/WXApi.h deleted file mode 120000 index 9849318..0000000 --- a/Pods/Headers/Private/UMengSocial/WXApi.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WXApiObject.h b/Pods/Headers/Private/UMengSocial/WXApiObject.h deleted file mode 120000 index 2a4b4e6..0000000 --- a/Pods/Headers/Private/UMengSocial/WXApiObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WeiboSDK.h b/Pods/Headers/Private/UMengSocial/WeiboSDK.h deleted file mode 120000 index 6c748ec..0000000 --- a/Pods/Headers/Private/UMengSocial/WeiboSDK.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengSocial/WeiboUser.h b/Pods/Headers/Private/UMengSocial/WeiboUser.h deleted file mode 120000 index 828f55a..0000000 --- a/Pods/Headers/Private/UMengSocial/WeiboUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/APOpenAPI.h b/Pods/Headers/Private/UMengUShare/APOpenAPI.h new file mode 120000 index 0000000..80f8187 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/APOpenAPI.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/APOpenAPIObject.h b/Pods/Headers/Private/UMengUShare/APOpenAPIObject.h new file mode 120000 index 0000000..dc635ba --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/APOpenAPIObject.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/UMSocialAlipayHandler.h b/Pods/Headers/Private/UMengUShare/UMSocialAlipayHandler.h new file mode 120000 index 0000000..e01232b --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/UMSocialAlipayHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/UMSocialQQHandler.h b/Pods/Headers/Private/UMengUShare/UMSocialQQHandler.h new file mode 120000 index 0000000..1e88607 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/UMSocialQQHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/QQ/UMSocialQQHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/UMSocialSinaHandler.h b/Pods/Headers/Private/UMengUShare/UMSocialSinaHandler.h new file mode 120000 index 0000000..a63854a --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/UMSocialSinaHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/UMSocialSinaHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/UMSocialWechatHandler.h b/Pods/Headers/Private/UMengUShare/UMSocialWechatHandler.h new file mode 120000 index 0000000..2199de1 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/UMSocialWechatHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/UMSocialWechatHandler.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WBHttpRequest+WeiboToken.h b/Pods/Headers/Private/UMengUShare/WBHttpRequest+WeiboToken.h new file mode 120000 index 0000000..2d5b55b --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WBHttpRequest+WeiboToken.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest+WeiboToken.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WBHttpRequest.h b/Pods/Headers/Private/UMengUShare/WBHttpRequest.h new file mode 120000 index 0000000..7af9b26 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WBHttpRequest.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WXApi.h b/Pods/Headers/Private/UMengUShare/WXApi.h new file mode 120000 index 0000000..0901fac --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WXApi.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApi.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WXApiObject.h b/Pods/Headers/Private/UMengUShare/WXApiObject.h new file mode 120000 index 0000000..361c800 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WXApiObject.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApiObject.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WechatAuthSDK.h b/Pods/Headers/Private/UMengUShare/WechatAuthSDK.h new file mode 120000 index 0000000..6661ac1 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WechatAuthSDK.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WechatAuthSDK.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WeiboSDK+Statistics.h b/Pods/Headers/Private/UMengUShare/WeiboSDK+Statistics.h new file mode 120000 index 0000000..b272ebd --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WeiboSDK+Statistics.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK+Statistics.h \ No newline at end of file diff --git a/Pods/Headers/Private/UMengUShare/WeiboSDK.h b/Pods/Headers/Private/UMengUShare/WeiboSDK.h new file mode 120000 index 0000000..0e8b242 --- /dev/null +++ b/Pods/Headers/Private/UMengUShare/WeiboSDK.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.h \ No newline at end of file diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h deleted file mode 120000 index aa9dc22..0000000 --- a/Pods/Headers/Private/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h \ No newline at end of file diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h deleted file mode 120000 index 29b9ace..0000000 --- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h \ No newline at end of file diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h deleted file mode 120000 index dff4a3e..0000000 --- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h \ No newline at end of file diff --git a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h b/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h deleted file mode 120000 index a6b45d8..0000000 --- a/Pods/Headers/Private/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYCache/YYCache.h b/Pods/Headers/Private/YYCache/YYCache.h new file mode 120000 index 0000000..2ba9cf8 --- /dev/null +++ b/Pods/Headers/Private/YYCache/YYCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYCache/YYDiskCache.h b/Pods/Headers/Private/YYCache/YYDiskCache.h new file mode 120000 index 0000000..9627fdd --- /dev/null +++ b/Pods/Headers/Private/YYCache/YYDiskCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYDiskCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYCache/YYKVStorage.h b/Pods/Headers/Private/YYCache/YYKVStorage.h new file mode 120000 index 0000000..ac9f318 --- /dev/null +++ b/Pods/Headers/Private/YYCache/YYKVStorage.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYKVStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYCache/YYMemoryCache.h b/Pods/Headers/Private/YYCache/YYMemoryCache.h new file mode 120000 index 0000000..e33b84c --- /dev/null +++ b/Pods/Headers/Private/YYCache/YYMemoryCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYMemoryCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/CALayer+YYAdd.h b/Pods/Headers/Private/YYKit/CALayer+YYAdd.h deleted file mode 120000 index d2c1f10..0000000 --- a/Pods/Headers/Private/YYKit/CALayer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Quartz/CALayer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/CALayer+YYWebImage.h b/Pods/Headers/Private/YYKit/CALayer+YYWebImage.h deleted file mode 120000 index fee3afd..0000000 --- a/Pods/Headers/Private/YYKit/CALayer+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/CALayer+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/MKAnnotationView+YYWebImage.h b/Pods/Headers/Private/YYKit/MKAnnotationView+YYWebImage.h deleted file mode 120000 index 9adbf52..0000000 --- a/Pods/Headers/Private/YYKit/MKAnnotationView+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/MKAnnotationView+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSArray+YYAdd.h b/Pods/Headers/Private/YYKit/NSArray+YYAdd.h deleted file mode 120000 index db5222d..0000000 --- a/Pods/Headers/Private/YYKit/NSArray+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSArray+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSAttributedString+YYText.h b/Pods/Headers/Private/YYKit/NSAttributedString+YYText.h deleted file mode 120000 index 5e24484..0000000 --- a/Pods/Headers/Private/YYKit/NSAttributedString+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/NSAttributedString+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSBundle+YYAdd.h b/Pods/Headers/Private/YYKit/NSBundle+YYAdd.h deleted file mode 120000 index 7e4cfb4..0000000 --- a/Pods/Headers/Private/YYKit/NSBundle+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSBundle+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSData+YYAdd.h b/Pods/Headers/Private/YYKit/NSData+YYAdd.h deleted file mode 120000 index 69d7137..0000000 --- a/Pods/Headers/Private/YYKit/NSData+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSData+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSDate+YYAdd.h b/Pods/Headers/Private/YYKit/NSDate+YYAdd.h deleted file mode 120000 index 8a3ccb7..0000000 --- a/Pods/Headers/Private/YYKit/NSDate+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSDate+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSDictionary+YYAdd.h b/Pods/Headers/Private/YYKit/NSDictionary+YYAdd.h deleted file mode 120000 index 9538356..0000000 --- a/Pods/Headers/Private/YYKit/NSDictionary+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSDictionary+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSKeyedUnarchiver+YYAdd.h b/Pods/Headers/Private/YYKit/NSKeyedUnarchiver+YYAdd.h deleted file mode 120000 index 4787d9d..0000000 --- a/Pods/Headers/Private/YYKit/NSKeyedUnarchiver+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSNotificationCenter+YYAdd.h b/Pods/Headers/Private/YYKit/NSNotificationCenter+YYAdd.h deleted file mode 120000 index 9f01d0d..0000000 --- a/Pods/Headers/Private/YYKit/NSNotificationCenter+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSNotificationCenter+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSNumber+YYAdd.h b/Pods/Headers/Private/YYKit/NSNumber+YYAdd.h deleted file mode 120000 index add39f9..0000000 --- a/Pods/Headers/Private/YYKit/NSNumber+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSNumber+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSObject+YYAdd.h b/Pods/Headers/Private/YYKit/NSObject+YYAdd.h deleted file mode 120000 index 7ec4eb0..0000000 --- a/Pods/Headers/Private/YYKit/NSObject+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSObject+YYAddForARC.h b/Pods/Headers/Private/YYKit/NSObject+YYAddForARC.h deleted file mode 120000 index 679f020..0000000 --- a/Pods/Headers/Private/YYKit/NSObject+YYAddForARC.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAddForARC.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSObject+YYAddForKVO.h b/Pods/Headers/Private/YYKit/NSObject+YYAddForKVO.h deleted file mode 120000 index accfbb1..0000000 --- a/Pods/Headers/Private/YYKit/NSObject+YYAddForKVO.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAddForKVO.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSObject+YYModel.h b/Pods/Headers/Private/YYKit/NSObject+YYModel.h deleted file mode 120000 index ad9b22c..0000000 --- a/Pods/Headers/Private/YYKit/NSObject+YYModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Model/NSObject+YYModel.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSParagraphStyle+YYText.h b/Pods/Headers/Private/YYKit/NSParagraphStyle+YYText.h deleted file mode 120000 index 98c5af2..0000000 --- a/Pods/Headers/Private/YYKit/NSParagraphStyle+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/NSParagraphStyle+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSString+YYAdd.h b/Pods/Headers/Private/YYKit/NSString+YYAdd.h deleted file mode 120000 index b6a485c..0000000 --- a/Pods/Headers/Private/YYKit/NSString+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSString+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSThread+YYAdd.h b/Pods/Headers/Private/YYKit/NSThread+YYAdd.h deleted file mode 120000 index c28d4a9..0000000 --- a/Pods/Headers/Private/YYKit/NSThread+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSThread+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/NSTimer+YYAdd.h b/Pods/Headers/Private/YYKit/NSTimer+YYAdd.h deleted file mode 120000 index d1ef170..0000000 --- a/Pods/Headers/Private/YYKit/NSTimer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSTimer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIApplication+YYAdd.h b/Pods/Headers/Private/YYKit/UIApplication+YYAdd.h deleted file mode 120000 index 4c41039..0000000 --- a/Pods/Headers/Private/YYKit/UIApplication+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIApplication+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIBarButtonItem+YYAdd.h b/Pods/Headers/Private/YYKit/UIBarButtonItem+YYAdd.h deleted file mode 120000 index 4d02b17..0000000 --- a/Pods/Headers/Private/YYKit/UIBarButtonItem+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIBarButtonItem+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIBezierPath+YYAdd.h b/Pods/Headers/Private/YYKit/UIBezierPath+YYAdd.h deleted file mode 120000 index f405375..0000000 --- a/Pods/Headers/Private/YYKit/UIBezierPath+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIBezierPath+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIButton+YYWebImage.h b/Pods/Headers/Private/YYKit/UIButton+YYWebImage.h deleted file mode 120000 index 5c708cb..0000000 --- a/Pods/Headers/Private/YYKit/UIButton+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/UIButton+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIColor+YYAdd.h b/Pods/Headers/Private/YYKit/UIColor+YYAdd.h deleted file mode 120000 index 73884c0..0000000 --- a/Pods/Headers/Private/YYKit/UIColor+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIColor+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIControl+YYAdd.h b/Pods/Headers/Private/YYKit/UIControl+YYAdd.h deleted file mode 120000 index 6a9e739..0000000 --- a/Pods/Headers/Private/YYKit/UIControl+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIControl+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIDevice+YYAdd.h b/Pods/Headers/Private/YYKit/UIDevice+YYAdd.h deleted file mode 120000 index 21e5977..0000000 --- a/Pods/Headers/Private/YYKit/UIDevice+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIDevice+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIFont+YYAdd.h b/Pods/Headers/Private/YYKit/UIFont+YYAdd.h deleted file mode 120000 index 7b4019d..0000000 --- a/Pods/Headers/Private/YYKit/UIFont+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIFont+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIGestureRecognizer+YYAdd.h b/Pods/Headers/Private/YYKit/UIGestureRecognizer+YYAdd.h deleted file mode 120000 index 4d56367..0000000 --- a/Pods/Headers/Private/YYKit/UIGestureRecognizer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIImage+YYAdd.h b/Pods/Headers/Private/YYKit/UIImage+YYAdd.h deleted file mode 120000 index 3856385..0000000 --- a/Pods/Headers/Private/YYKit/UIImage+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIImage+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIImageView+YYWebImage.h b/Pods/Headers/Private/YYKit/UIImageView+YYWebImage.h deleted file mode 120000 index f5f777a..0000000 --- a/Pods/Headers/Private/YYKit/UIImageView+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/UIImageView+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIPasteboard+YYText.h b/Pods/Headers/Private/YYKit/UIPasteboard+YYText.h deleted file mode 120000 index c29d012..0000000 --- a/Pods/Headers/Private/YYKit/UIPasteboard+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/UIPasteboard+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIScreen+YYAdd.h b/Pods/Headers/Private/YYKit/UIScreen+YYAdd.h deleted file mode 120000 index e5a10b8..0000000 --- a/Pods/Headers/Private/YYKit/UIScreen+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIScreen+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIScrollView+YYAdd.h b/Pods/Headers/Private/YYKit/UIScrollView+YYAdd.h deleted file mode 120000 index 96bca68..0000000 --- a/Pods/Headers/Private/YYKit/UIScrollView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIScrollView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UITableView+YYAdd.h b/Pods/Headers/Private/YYKit/UITableView+YYAdd.h deleted file mode 120000 index b852f2c..0000000 --- a/Pods/Headers/Private/YYKit/UITableView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UITableView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UITextField+YYAdd.h b/Pods/Headers/Private/YYKit/UITextField+YYAdd.h deleted file mode 120000 index f2e15d1..0000000 --- a/Pods/Headers/Private/YYKit/UITextField+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UITextField+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/UIView+YYAdd.h b/Pods/Headers/Private/YYKit/UIView+YYAdd.h deleted file mode 120000 index 86bdc27..0000000 --- a/Pods/Headers/Private/YYKit/UIView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYAnimatedImageView.h b/Pods/Headers/Private/YYKit/YYAnimatedImageView.h deleted file mode 120000 index c6af432..0000000 --- a/Pods/Headers/Private/YYKit/YYAnimatedImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYAnimatedImageView.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYAsyncLayer.h b/Pods/Headers/Private/YYKit/YYAsyncLayer.h deleted file mode 120000 index 9fa5e6f..0000000 --- a/Pods/Headers/Private/YYKit/YYAsyncLayer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYAsyncLayer.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYCGUtilities.h b/Pods/Headers/Private/YYKit/YYCGUtilities.h deleted file mode 120000 index e5db3d7..0000000 --- a/Pods/Headers/Private/YYKit/YYCGUtilities.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Quartz/YYCGUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYCache.h b/Pods/Headers/Private/YYKit/YYCache.h deleted file mode 120000 index 12c1033..0000000 --- a/Pods/Headers/Private/YYKit/YYCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYClassInfo.h b/Pods/Headers/Private/YYKit/YYClassInfo.h deleted file mode 120000 index 579e368..0000000 --- a/Pods/Headers/Private/YYKit/YYClassInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Model/YYClassInfo.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYDiskCache.h b/Pods/Headers/Private/YYKit/YYDiskCache.h deleted file mode 120000 index f1f6adf..0000000 --- a/Pods/Headers/Private/YYKit/YYDiskCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYDiskCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYDispatchQueuePool.h b/Pods/Headers/Private/YYKit/YYDispatchQueuePool.h deleted file mode 120000 index 449ebc0..0000000 --- a/Pods/Headers/Private/YYKit/YYDispatchQueuePool.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYDispatchQueuePool.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYFileHash.h b/Pods/Headers/Private/YYKit/YYFileHash.h deleted file mode 120000 index 1a437d0..0000000 --- a/Pods/Headers/Private/YYKit/YYFileHash.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYFileHash.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYFrameImage.h b/Pods/Headers/Private/YYKit/YYFrameImage.h deleted file mode 120000 index f932499..0000000 --- a/Pods/Headers/Private/YYKit/YYFrameImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYFrameImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYGestureRecognizer.h b/Pods/Headers/Private/YYKit/YYGestureRecognizer.h deleted file mode 120000 index 5400d6a..0000000 --- a/Pods/Headers/Private/YYKit/YYGestureRecognizer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYGestureRecognizer.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYImage.h b/Pods/Headers/Private/YYKit/YYImage.h deleted file mode 120000 index 5f3e4d2..0000000 --- a/Pods/Headers/Private/YYKit/YYImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYImageCache.h b/Pods/Headers/Private/YYKit/YYImageCache.h deleted file mode 120000 index 74c7dce..0000000 --- a/Pods/Headers/Private/YYKit/YYImageCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImageCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYImageCoder.h b/Pods/Headers/Private/YYKit/YYImageCoder.h deleted file mode 120000 index 4fd6fb2..0000000 --- a/Pods/Headers/Private/YYKit/YYImageCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImageCoder.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYKVStorage.h b/Pods/Headers/Private/YYKit/YYKVStorage.h deleted file mode 120000 index 3e74333..0000000 --- a/Pods/Headers/Private/YYKit/YYKVStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYKVStorage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYKeychain.h b/Pods/Headers/Private/YYKit/YYKeychain.h deleted file mode 120000 index e54ec02..0000000 --- a/Pods/Headers/Private/YYKit/YYKeychain.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYKeychain.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYKit.h b/Pods/Headers/Private/YYKit/YYKit.h deleted file mode 120000 index 80b17f8..0000000 --- a/Pods/Headers/Private/YYKit/YYKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/YYKit.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYKitMacro.h b/Pods/Headers/Private/YYKit/YYKitMacro.h deleted file mode 120000 index 2665533..0000000 --- a/Pods/Headers/Private/YYKit/YYKitMacro.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/YYKitMacro.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYLabel.h b/Pods/Headers/Private/YYKit/YYLabel.h deleted file mode 120000 index 9542a5c..0000000 --- a/Pods/Headers/Private/YYKit/YYLabel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/YYLabel.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYMemoryCache.h b/Pods/Headers/Private/YYKit/YYMemoryCache.h deleted file mode 120000 index 8343558..0000000 --- a/Pods/Headers/Private/YYKit/YYMemoryCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYMemoryCache.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYReachability.h b/Pods/Headers/Private/YYKit/YYReachability.h deleted file mode 120000 index ae8667c..0000000 --- a/Pods/Headers/Private/YYKit/YYReachability.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYReachability.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYSentinel.h b/Pods/Headers/Private/YYKit/YYSentinel.h deleted file mode 120000 index 716a0c3..0000000 --- a/Pods/Headers/Private/YYKit/YYSentinel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYSentinel.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYSpriteSheetImage.h b/Pods/Headers/Private/YYKit/YYSpriteSheetImage.h deleted file mode 120000 index 8421889..0000000 --- a/Pods/Headers/Private/YYKit/YYSpriteSheetImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYSpriteSheetImage.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextArchiver.h b/Pods/Headers/Private/YYKit/YYTextArchiver.h deleted file mode 120000 index e75a903..0000000 --- a/Pods/Headers/Private/YYKit/YYTextArchiver.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextArchiver.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextAttribute.h b/Pods/Headers/Private/YYKit/YYTextAttribute.h deleted file mode 120000 index 4a60f8c..0000000 --- a/Pods/Headers/Private/YYKit/YYTextAttribute.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextAttribute.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextContainerView.h b/Pods/Headers/Private/YYKit/YYTextContainerView.h deleted file mode 120000 index b7ffbdf..0000000 --- a/Pods/Headers/Private/YYKit/YYTextContainerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextContainerView.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextDebugOption.h b/Pods/Headers/Private/YYKit/YYTextDebugOption.h deleted file mode 120000 index 2680ecd..0000000 --- a/Pods/Headers/Private/YYKit/YYTextDebugOption.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextDebugOption.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextEffectWindow.h b/Pods/Headers/Private/YYKit/YYTextEffectWindow.h deleted file mode 120000 index 0220060..0000000 --- a/Pods/Headers/Private/YYKit/YYTextEffectWindow.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextEffectWindow.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextInput.h b/Pods/Headers/Private/YYKit/YYTextInput.h deleted file mode 120000 index c20d0f7..0000000 --- a/Pods/Headers/Private/YYKit/YYTextInput.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextInput.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextKeyboardManager.h b/Pods/Headers/Private/YYKit/YYTextKeyboardManager.h deleted file mode 120000 index b43d5e1..0000000 --- a/Pods/Headers/Private/YYKit/YYTextKeyboardManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextKeyboardManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextLayout.h b/Pods/Headers/Private/YYKit/YYTextLayout.h deleted file mode 120000 index 3f135b9..0000000 --- a/Pods/Headers/Private/YYKit/YYTextLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextLayout.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextLine.h b/Pods/Headers/Private/YYKit/YYTextLine.h deleted file mode 120000 index 3c5ef08..0000000 --- a/Pods/Headers/Private/YYKit/YYTextLine.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextLine.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextMagnifier.h b/Pods/Headers/Private/YYKit/YYTextMagnifier.h deleted file mode 120000 index 0ce186e..0000000 --- a/Pods/Headers/Private/YYKit/YYTextMagnifier.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextMagnifier.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextParser.h b/Pods/Headers/Private/YYKit/YYTextParser.h deleted file mode 120000 index cf3d667..0000000 --- a/Pods/Headers/Private/YYKit/YYTextParser.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextParser.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextRubyAnnotation.h b/Pods/Headers/Private/YYKit/YYTextRubyAnnotation.h deleted file mode 120000 index 72ad4d6..0000000 --- a/Pods/Headers/Private/YYKit/YYTextRubyAnnotation.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextRubyAnnotation.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextRunDelegate.h b/Pods/Headers/Private/YYKit/YYTextRunDelegate.h deleted file mode 120000 index e80062d..0000000 --- a/Pods/Headers/Private/YYKit/YYTextRunDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextRunDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextSelectionView.h b/Pods/Headers/Private/YYKit/YYTextSelectionView.h deleted file mode 120000 index c036e68..0000000 --- a/Pods/Headers/Private/YYKit/YYTextSelectionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextSelectionView.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextUtilities.h b/Pods/Headers/Private/YYKit/YYTextUtilities.h deleted file mode 120000 index e325fd2..0000000 --- a/Pods/Headers/Private/YYKit/YYTextUtilities.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTextView.h b/Pods/Headers/Private/YYKit/YYTextView.h deleted file mode 120000 index 3e50b7f..0000000 --- a/Pods/Headers/Private/YYKit/YYTextView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/YYTextView.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYThreadSafeArray.h b/Pods/Headers/Private/YYKit/YYThreadSafeArray.h deleted file mode 120000 index 6224923..0000000 --- a/Pods/Headers/Private/YYKit/YYThreadSafeArray.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYThreadSafeArray.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYThreadSafeDictionary.h b/Pods/Headers/Private/YYKit/YYThreadSafeDictionary.h deleted file mode 120000 index f39a001..0000000 --- a/Pods/Headers/Private/YYKit/YYThreadSafeDictionary.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYThreadSafeDictionary.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTimer.h b/Pods/Headers/Private/YYKit/YYTimer.h deleted file mode 120000 index d3373dd..0000000 --- a/Pods/Headers/Private/YYKit/YYTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYTimer.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYTransaction.h b/Pods/Headers/Private/YYKit/YYTransaction.h deleted file mode 120000 index a414798..0000000 --- a/Pods/Headers/Private/YYKit/YYTransaction.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYTransaction.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYWeakProxy.h b/Pods/Headers/Private/YYKit/YYWeakProxy.h deleted file mode 120000 index 73d57b2..0000000 --- a/Pods/Headers/Private/YYKit/YYWeakProxy.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYWeakProxy.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYWebImageManager.h b/Pods/Headers/Private/YYKit/YYWebImageManager.h deleted file mode 120000 index ac5412b..0000000 --- a/Pods/Headers/Private/YYKit/YYWebImageManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYWebImageManager.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/YYWebImageOperation.h b/Pods/Headers/Private/YYKit/YYWebImageOperation.h deleted file mode 120000 index aad3cff..0000000 --- a/Pods/Headers/Private/YYKit/YYWebImageOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYWebImageOperation.h \ No newline at end of file diff --git a/Pods/Headers/Private/YYKit/_YYWebImageSetter.h b/Pods/Headers/Private/YYKit/_YYWebImageSetter.h deleted file mode 120000 index 8ed76d4..0000000 --- a/Pods/Headers/Private/YYKit/_YYWebImageSetter.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/_YYWebImageSetter.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/BAActionSheet.h b/Pods/Headers/Public/BAAlert/BAActionSheet.h new file mode 120000 index 0000000..b2d04e7 --- /dev/null +++ b/Pods/Headers/Public/BAAlert/BAActionSheet.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAActionSheet.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/BAActionSheetCell.h b/Pods/Headers/Public/BAAlert/BAActionSheetCell.h new file mode 120000 index 0000000..0debeb8 --- /dev/null +++ b/Pods/Headers/Public/BAAlert/BAActionSheetCell.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAActionSheetCell.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/BAAlert.h b/Pods/Headers/Public/BAAlert/BAAlert.h new file mode 120000 index 0000000..f8717c3 --- /dev/null +++ b/Pods/Headers/Public/BAAlert/BAAlert.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/BAAlert_Config.h b/Pods/Headers/Public/BAAlert/BAAlert_Config.h new file mode 120000 index 0000000..24aaaa5 --- /dev/null +++ b/Pods/Headers/Public/BAAlert/BAAlert_Config.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert_Config.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/BAAlert_OC.h b/Pods/Headers/Public/BAAlert/BAAlert_OC.h new file mode 120000 index 0000000..5c0b57d --- /dev/null +++ b/Pods/Headers/Public/BAAlert/BAAlert_OC.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/BAAlert_OC.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAAlert/CALayer+Animation.h b/Pods/Headers/Public/BAAlert/CALayer+Animation.h new file mode 120000 index 0000000..7f6640e --- /dev/null +++ b/Pods/Headers/Public/BAAlert/CALayer+Animation.h @@ -0,0 +1 @@ +../../../BAAlert/BAAlert/BAAlert/CALayer+Animation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAButton/BAButton.h b/Pods/Headers/Public/BAButton/BAButton.h index 00db182..dddfe84 120000 --- a/Pods/Headers/Public/BAButton/BAButton.h +++ b/Pods/Headers/Public/BAButton/BAButton.h @@ -1 +1 @@ -../../../BAButton/BAButton/BAButton.h \ No newline at end of file +../../../BAButton/BAButton/BAButton/BAButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAButton/UIButton+BACountDown.h b/Pods/Headers/Public/BAButton/UIButton+BACountDown.h new file mode 120000 index 0000000..022bca9 --- /dev/null +++ b/Pods/Headers/Public/BAButton/UIButton+BACountDown.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BACountDown.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAButton/UIButton+BAKit.h b/Pods/Headers/Public/BAButton/UIButton+BAKit.h new file mode 120000 index 0000000..7cc50c6 --- /dev/null +++ b/Pods/Headers/Public/BAButton/UIButton+BAKit.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAButton/UIButton+BAState.h b/Pods/Headers/Public/BAButton/UIButton+BAState.h new file mode 120000 index 0000000..78e65af --- /dev/null +++ b/Pods/Headers/Public/BAButton/UIButton+BAState.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIButton+BAState.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAButton/UIView+BARectCorner.h b/Pods/Headers/Public/BAButton/UIView+BARectCorner.h new file mode 120000 index 0000000..8bb6499 --- /dev/null +++ b/Pods/Headers/Public/BAButton/UIView+BARectCorner.h @@ -0,0 +1 @@ +../../../BAButton/BAButton/BAButton/UIView+BARectCorner.h \ No newline at end of file diff --git a/Pods/Headers/Public/BANetManager/BANetManager.h b/Pods/Headers/Public/BANetManager/BANetManager.h new file mode 120000 index 0000000..d22cd84 --- /dev/null +++ b/Pods/Headers/Public/BANetManager/BANetManager.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/BANetManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/BANetManager/BANetManagerCache.h b/Pods/Headers/Public/BANetManager/BANetManagerCache.h new file mode 120000 index 0000000..44227ca --- /dev/null +++ b/Pods/Headers/Public/BANetManager/BANetManagerCache.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/BANetManagerCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/BANetManager/UIImage+CompressImage.h b/Pods/Headers/Public/BANetManager/UIImage+CompressImage.h new file mode 120000 index 0000000..7022034 --- /dev/null +++ b/Pods/Headers/Public/BANetManager/UIImage+CompressImage.h @@ -0,0 +1 @@ +../../../BANetManager/BANetManager/UIImage+CompressImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/BAKit_PickerView.h b/Pods/Headers/Public/BAPickView/BAKit_PickerView.h new file mode 120000 index 0000000..44f31c1 --- /dev/null +++ b/Pods/Headers/Public/BAPickView/BAKit_PickerView.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAKit_PickerView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/BAPickView_Config.h b/Pods/Headers/Public/BAPickView/BAPickView_Config.h new file mode 120000 index 0000000..9be0c7e --- /dev/null +++ b/Pods/Headers/Public/BAPickView/BAPickView_Config.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAPickView_Config.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/BAPickView_OC.h b/Pods/Headers/Public/BAPickView/BAPickView_OC.h new file mode 120000 index 0000000..61a16cb --- /dev/null +++ b/Pods/Headers/Public/BAPickView/BAPickView_OC.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/BAPickView_OC.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/NSDate+BAKit.h b/Pods/Headers/Public/BAPickView/NSDate+BAKit.h new file mode 120000 index 0000000..7879695 --- /dev/null +++ b/Pods/Headers/Public/BAPickView/NSDate+BAKit.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/NSDate+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/NSDateFormatter+BAKit.h b/Pods/Headers/Public/BAPickView/NSDateFormatter+BAKit.h new file mode 120000 index 0000000..5a40f8f --- /dev/null +++ b/Pods/Headers/Public/BAPickView/NSDateFormatter+BAKit.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/NSDateFormatter+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/UIView+BAAnimation.h b/Pods/Headers/Public/BAPickView/UIView+BAAnimation.h new file mode 120000 index 0000000..a640543 --- /dev/null +++ b/Pods/Headers/Public/BAPickView/UIView+BAAnimation.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/UIView+BAAnimation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BAPickView/UIView+BARectCorner.h b/Pods/Headers/Public/BAPickView/UIView+BARectCorner.h new file mode 120000 index 0000000..7b5a9f4 --- /dev/null +++ b/Pods/Headers/Public/BAPickView/UIView+BARectCorner.h @@ -0,0 +1 @@ +../../../BAPickView/BAPickView/BAPickView/UIView+BARectCorner.h \ No newline at end of file diff --git a/Pods/Headers/Public/BATextView/BATextView.h b/Pods/Headers/Public/BATextView/BATextView.h new file mode 120000 index 0000000..09af06e --- /dev/null +++ b/Pods/Headers/Public/BATextView/BATextView.h @@ -0,0 +1 @@ +../../../BATextView/BATextView/BATextView/BATextView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BATextView/UITextView+BAKit.h b/Pods/Headers/Public/BATextView/UITextView+BAKit.h new file mode 120000 index 0000000..e0bffef --- /dev/null +++ b/Pods/Headers/Public/BATextView/UITextView+BAKit.h @@ -0,0 +1 @@ +../../../BATextView/BATextView/BATextView/UITextView+BAKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BATouchID/BAKit_DeviceModel.h b/Pods/Headers/Public/BATouchID/BAKit_DeviceModel.h new file mode 120000 index 0000000..0c8f47a --- /dev/null +++ b/Pods/Headers/Public/BATouchID/BAKit_DeviceModel.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BAKit_DeviceModel.h \ No newline at end of file diff --git a/Pods/Headers/Public/BATouchID/BAKit_TouchID.h b/Pods/Headers/Public/BATouchID/BAKit_TouchID.h new file mode 120000 index 0000000..fe3e22f --- /dev/null +++ b/Pods/Headers/Public/BATouchID/BAKit_TouchID.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BAKit_TouchID.h \ No newline at end of file diff --git a/Pods/Headers/Public/BATouchID/BATouchID.h b/Pods/Headers/Public/BATouchID/BATouchID.h new file mode 120000 index 0000000..fc63fe3 --- /dev/null +++ b/Pods/Headers/Public/BATouchID/BATouchID.h @@ -0,0 +1 @@ +../../../BATouchID/BATouchID/BATouchID/BATouchID.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKBaseComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKBaseComponent.h new file mode 120000 index 0000000..ee002e2 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKBaseComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKBaseComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKGeneralDelegate.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKGeneralDelegate.h new file mode 120000 index 0000000..1e329f0 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKGeneralDelegate.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKGeneralDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKMapManager.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKMapManager.h new file mode 120000 index 0000000..c09f6d6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKMapManager.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKMapManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKTypes.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKTypes.h new file mode 120000 index 0000000..f914d17 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKTypes.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKTypes.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKUserLocation.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKUserLocation.h new file mode 120000 index 0000000..612325a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKUserLocation.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKUserLocation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKVersion.h new file mode 120000 index 0000000..02df08b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Base/BMKVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudPOIList.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudPOIList.h new file mode 120000 index 0000000..09cadc6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudPOIList.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudPOIList.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearch.h new file mode 120000 index 0000000..97052c8 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchComponent.h new file mode 120000 index 0000000..5024556 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchInfo.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchInfo.h new file mode 120000 index 0000000..ec7f4a9 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudSearchInfo.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudVersion.h new file mode 120000 index 0000000..8bc4c8f --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Cloud/BMKCloudVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationComponent.h new file mode 120000 index 0000000..9493a72 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationService.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationService.h new file mode 120000 index 0000000..ebea5c1 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationService.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationService.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationVersion.h new file mode 120000 index 0000000..2e1c700 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Location/BMKLocationVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKActionPaopaoView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKActionPaopaoView.h new file mode 120000 index 0000000..c75baa3 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKActionPaopaoView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKActionPaopaoView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotation.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotation.h new file mode 120000 index 0000000..4474790 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotation.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotationView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotationView.h new file mode 120000 index 0000000..cf8073a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKAnnotationView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotationView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArcline.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArcline.h new file mode 120000 index 0000000..7c71a05 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArcline.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArcline.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArclineView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArclineView.h new file mode 120000 index 0000000..13b28d8 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKArclineView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArclineView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKBaseIndoorMapInfo.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKBaseIndoorMapInfo.h new file mode 120000 index 0000000..31375b8 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKBaseIndoorMapInfo.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKBaseIndoorMapInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircle.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircle.h new file mode 120000 index 0000000..5db0b12 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircle.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircle.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircleView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircleView.h new file mode 120000 index 0000000..6a3cdc9 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKCircleView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircleView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGradient.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGradient.h new file mode 120000 index 0000000..ab9237f --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGradient.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGradient.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlay.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlay.h new file mode 120000 index 0000000..a6b3e40 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlay.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlay.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlayView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlayView.h new file mode 120000 index 0000000..5f74577 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKGroundOverlayView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlayView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKHeatMap.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKHeatMap.h new file mode 120000 index 0000000..badcc10 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKHeatMap.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKHeatMap.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKLocationViewDisplayParam.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKLocationViewDisplayParam.h new file mode 120000 index 0000000..211ad43 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKLocationViewDisplayParam.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKLocationViewDisplayParam.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapComponent.h new file mode 120000 index 0000000..f463a0a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapStatus.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapStatus.h new file mode 120000 index 0000000..9a5cc7b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapStatus.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapStatus.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapVersion.h new file mode 120000 index 0000000..a23da3b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapView.h new file mode 120000 index 0000000..cd819d6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMapView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMultiPoint.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMultiPoint.h new file mode 120000 index 0000000..2435276 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKMultiPoint.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMultiPoint.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMap.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMap.h new file mode 120000 index 0000000..e4b16c2 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMap.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMap.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMapType.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMapType.h new file mode 120000 index 0000000..10ed12b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOfflineMapType.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMapType.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlay.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlay.h new file mode 120000 index 0000000..46f06e0 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlay.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlay.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayGLBasicView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayGLBasicView.h new file mode 120000 index 0000000..3271a0d --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayGLBasicView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayGLBasicView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayPathView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayPathView.h new file mode 120000 index 0000000..5fb90fb --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayPathView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayPathView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayView.h new file mode 120000 index 0000000..12ef554 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKOverlayView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPinAnnotationView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPinAnnotationView.h new file mode 120000 index 0000000..8f91377 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPinAnnotationView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPinAnnotationView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPointAnnotation.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPointAnnotation.h new file mode 120000 index 0000000..f536e15 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPointAnnotation.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPointAnnotation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygon.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygon.h new file mode 120000 index 0000000..55f5f9b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygon.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygon.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygonView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygonView.h new file mode 120000 index 0000000..ed4e0b7 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolygonView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygonView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolyline.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolyline.h new file mode 120000 index 0000000..3846ae0 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolyline.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolyline.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolylineView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolylineView.h new file mode 120000 index 0000000..1e3d18a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKPolylineView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolylineView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKShape.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKShape.h new file mode 120000 index 0000000..15db8bf --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKShape.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKShape.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayer.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayer.h new file mode 120000 index 0000000..21ab3c6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayer.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayer.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayerView.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayerView.h new file mode 120000 index 0000000..c0c7c9a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Map/BMKTileLayerView.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayerView.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarComponent.h new file mode 120000 index 0000000..84c1bbf --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarManager.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarManager.h new file mode 120000 index 0000000..7fe0617 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarManager.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarOption.h new file mode 120000 index 0000000..27c165e --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarResult.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarResult.h new file mode 120000 index 0000000..1a53c9a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarResult.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarResult.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarVersion.h new file mode 120000 index 0000000..bab78e6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Radar/BMKRadarVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearch.h new file mode 120000 index 0000000..7b923b6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearchOption.h new file mode 120000 index 0000000..6da5d6f --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKBusLineSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKDistrictSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKDistrictSearch.h new file mode 120000 index 0000000..4b9f0b3 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKDistrictSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKDistrictSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearch.h new file mode 120000 index 0000000..cd3310b --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearchOption.h new file mode 120000 index 0000000..4bab6b7 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeType.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeType.h new file mode 120000 index 0000000..db7e776 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKGeocodeType.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeType.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearch.h new file mode 120000 index 0000000..06da641 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchOption.h new file mode 120000 index 0000000..dc81615 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchType.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchType.h new file mode 120000 index 0000000..7752d65 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKPoiSearchType.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchType.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearch.h new file mode 120000 index 0000000..3e545a8 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchOption.h new file mode 120000 index 0000000..1c6b4ed --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchType.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchType.h new file mode 120000 index 0000000..96a0e83 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKRouteSearchType.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchType.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchBase.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchBase.h new file mode 120000 index 0000000..94baa2f --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchBase.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchBase.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchComponent.h new file mode 120000 index 0000000..4f7186c --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchVersion.h new file mode 120000 index 0000000..945919a --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSearchVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareURLSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareURLSearch.h new file mode 120000 index 0000000..a42d95c --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareURLSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareURLSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareUrlSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareUrlSearchOption.h new file mode 120000 index 0000000..6eb8218 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKShareUrlSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareUrlSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearch.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearch.h new file mode 120000 index 0000000..378fc10 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearch.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearch.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearchOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearchOption.h new file mode 120000 index 0000000..875f179 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Search/BMKSuggestionSearchOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearchOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiInfo.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiInfo.h new file mode 120000 index 0000000..9052a55 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiInfo.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiManager.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiManager.h new file mode 120000 index 0000000..7c234a1 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKFavPoiManager.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKGeometry.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKGeometry.h new file mode 120000 index 0000000..3cd2b47 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKGeometry.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKGeometry.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKNavigation.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKNavigation.h new file mode 120000 index 0000000..bfb56a0 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKNavigation.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKNavigation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenOption.h new file mode 120000 index 0000000..b0e30c4 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPanorama.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPanorama.h new file mode 120000 index 0000000..c97c746 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPanorama.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPanorama.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoi.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoi.h new file mode 120000 index 0000000..2d20133 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoi.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoi.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoiOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoiOption.h new file mode 120000 index 0000000..8ff839d --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenPoiOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoiOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRoute.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRoute.h new file mode 120000 index 0000000..7c4d0e6 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRoute.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRoute.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRouteOption.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRouteOption.h new file mode 120000 index 0000000..6ca4523 --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKOpenRouteOption.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRouteOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsComponent.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsComponent.h new file mode 120000 index 0000000..23e909d --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsComponent.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsComponent.h \ No newline at end of file diff --git a/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsVersion.h b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsVersion.h new file mode 120000 index 0000000..32ca1fa --- /dev/null +++ b/Pods/Headers/Public/BaiduMapKit/BaiduMapAPI_Utils/BMKUtilsVersion.h @@ -0,0 +1 @@ +../../../../BaiduMapKit/BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsVersion.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/A2BlockInvocation.h b/Pods/Headers/Public/BlocksKit/A2BlockInvocation.h deleted file mode 120000 index 08c2de1..0000000 --- a/Pods/Headers/Public/BlocksKit/A2BlockInvocation.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/A2BlockInvocation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/A2DynamicDelegate.h b/Pods/Headers/Public/BlocksKit/A2DynamicDelegate.h deleted file mode 120000 index ebcd461..0000000 --- a/Pods/Headers/Public/BlocksKit/A2DynamicDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/A2DynamicDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/BKMacros.h b/Pods/Headers/Public/BlocksKit/BKMacros.h deleted file mode 120000 index 190e23c..0000000 --- a/Pods/Headers/Public/BlocksKit/BKMacros.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/BKMacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/BlocksKit+MessageUI.h b/Pods/Headers/Public/BlocksKit/BlocksKit+MessageUI.h deleted file mode 120000 index 0462a65..0000000 --- a/Pods/Headers/Public/BlocksKit/BlocksKit+MessageUI.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit+MessageUI.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/BlocksKit+UIKit.h b/Pods/Headers/Public/BlocksKit/BlocksKit+UIKit.h deleted file mode 120000 index ff2b10e..0000000 --- a/Pods/Headers/Public/BlocksKit/BlocksKit+UIKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit+UIKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/BlocksKit.h b/Pods/Headers/Public/BlocksKit/BlocksKit.h deleted file mode 120000 index a4b8214..0000000 --- a/Pods/Headers/Public/BlocksKit/BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/MFMailComposeViewController+BlocksKit.h b/Pods/Headers/Public/BlocksKit/MFMailComposeViewController+BlocksKit.h deleted file mode 120000 index b5aa446..0000000 --- a/Pods/Headers/Public/BlocksKit/MFMailComposeViewController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/MFMessageComposeViewController+BlocksKit.h b/Pods/Headers/Public/BlocksKit/MFMessageComposeViewController+BlocksKit.h deleted file mode 120000 index 2b73762..0000000 --- a/Pods/Headers/Public/BlocksKit/MFMessageComposeViewController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSArray+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSArray+BlocksKit.h deleted file mode 120000 index 22a1ce7..0000000 --- a/Pods/Headers/Public/BlocksKit/NSArray+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSArray+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSCache+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSCache+BlocksKit.h deleted file mode 120000 index 44a17ce..0000000 --- a/Pods/Headers/Public/BlocksKit/NSCache+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSDictionary+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSDictionary+BlocksKit.h deleted file mode 120000 index d8c0ca3..0000000 --- a/Pods/Headers/Public/BlocksKit/NSDictionary+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSDictionary+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSIndexSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSIndexSet+BlocksKit.h deleted file mode 120000 index afa7e41..0000000 --- a/Pods/Headers/Public/BlocksKit/NSIndexSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSIndexSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSInvocation+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSInvocation+BlocksKit.h deleted file mode 120000 index 3d3fc8f..0000000 --- a/Pods/Headers/Public/BlocksKit/NSInvocation+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSInvocation+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSMutableArray+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSMutableArray+BlocksKit.h deleted file mode 120000 index 568b89e..0000000 --- a/Pods/Headers/Public/BlocksKit/NSMutableArray+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableArray+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSMutableDictionary+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSMutableDictionary+BlocksKit.h deleted file mode 120000 index 1d9d942..0000000 --- a/Pods/Headers/Public/BlocksKit/NSMutableDictionary+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableDictionary+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSMutableIndexSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSMutableIndexSet+BlocksKit.h deleted file mode 120000 index 7c8a23f..0000000 --- a/Pods/Headers/Public/BlocksKit/NSMutableIndexSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableIndexSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSMutableOrderedSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSMutableOrderedSet+BlocksKit.h deleted file mode 120000 index de5931c..0000000 --- a/Pods/Headers/Public/BlocksKit/NSMutableOrderedSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSMutableSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSMutableSet+BlocksKit.h deleted file mode 120000 index a415f20..0000000 --- a/Pods/Headers/Public/BlocksKit/NSMutableSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSMutableSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSObject+A2BlockDelegate.h b/Pods/Headers/Public/BlocksKit/NSObject+A2BlockDelegate.h deleted file mode 120000 index d0c206b..0000000 --- a/Pods/Headers/Public/BlocksKit/NSObject+A2BlockDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSObject+A2DynamicDelegate.h b/Pods/Headers/Public/BlocksKit/NSObject+A2DynamicDelegate.h deleted file mode 120000 index ca1af22..0000000 --- a/Pods/Headers/Public/BlocksKit/NSObject+A2DynamicDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSObject+BKAssociatedObjects.h b/Pods/Headers/Public/BlocksKit/NSObject+BKAssociatedObjects.h deleted file mode 120000 index 98b5c83..0000000 --- a/Pods/Headers/Public/BlocksKit/NSObject+BKAssociatedObjects.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKAssociatedObjects.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSObject+BKBlockExecution.h b/Pods/Headers/Public/BlocksKit/NSObject+BKBlockExecution.h deleted file mode 120000 index 4f60201..0000000 --- a/Pods/Headers/Public/BlocksKit/NSObject+BKBlockExecution.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKBlockExecution.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSObject+BKBlockObservation.h b/Pods/Headers/Public/BlocksKit/NSObject+BKBlockObservation.h deleted file mode 120000 index d94700c..0000000 --- a/Pods/Headers/Public/BlocksKit/NSObject+BKBlockObservation.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSObject+BKBlockObservation.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSOrderedSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSOrderedSet+BlocksKit.h deleted file mode 120000 index e0e0999..0000000 --- a/Pods/Headers/Public/BlocksKit/NSOrderedSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSOrderedSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSSet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSSet+BlocksKit.h deleted file mode 120000 index b49aa73..0000000 --- a/Pods/Headers/Public/BlocksKit/NSSet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSSet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSTimer+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSTimer+BlocksKit.h deleted file mode 120000 index 25d861b..0000000 --- a/Pods/Headers/Public/BlocksKit/NSTimer+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/Core/NSTimer+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/NSURLConnection+BlocksKit.h b/Pods/Headers/Public/BlocksKit/NSURLConnection+BlocksKit.h deleted file mode 120000 index a968a5b..0000000 --- a/Pods/Headers/Public/BlocksKit/NSURLConnection+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIActionSheet+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIActionSheet+BlocksKit.h deleted file mode 120000 index 1ae5b33..0000000 --- a/Pods/Headers/Public/BlocksKit/UIActionSheet+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIActionSheet+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIAlertView+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIAlertView+BlocksKit.h deleted file mode 120000 index a872701..0000000 --- a/Pods/Headers/Public/BlocksKit/UIAlertView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIAlertView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIBarButtonItem+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIBarButtonItem+BlocksKit.h deleted file mode 120000 index 1a50da0..0000000 --- a/Pods/Headers/Public/BlocksKit/UIBarButtonItem+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIControl+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIControl+BlocksKit.h deleted file mode 120000 index 528d1ea..0000000 --- a/Pods/Headers/Public/BlocksKit/UIControl+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIControl+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIGestureRecognizer+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIGestureRecognizer+BlocksKit.h deleted file mode 120000 index f343150..0000000 --- a/Pods/Headers/Public/BlocksKit/UIGestureRecognizer+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIImagePickerController+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIImagePickerController+BlocksKit.h deleted file mode 120000 index a674bef..0000000 --- a/Pods/Headers/Public/BlocksKit/UIImagePickerController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIImagePickerController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIPopoverController+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIPopoverController+BlocksKit.h deleted file mode 120000 index f20f8a4..0000000 --- a/Pods/Headers/Public/BlocksKit/UIPopoverController+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIPopoverController+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UITextField+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UITextField+BlocksKit.h deleted file mode 120000 index b6c3ca8..0000000 --- a/Pods/Headers/Public/BlocksKit/UITextField+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UITextField+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIView+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIView+BlocksKit.h deleted file mode 120000 index 6c4e8e4..0000000 --- a/Pods/Headers/Public/BlocksKit/UIView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/BlocksKit/UIWebView+BlocksKit.h b/Pods/Headers/Public/BlocksKit/UIWebView+BlocksKit.h deleted file mode 120000 index 729ac72..0000000 --- a/Pods/Headers/Public/BlocksKit/UIWebView+BlocksKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../BlocksKit/BlocksKit/UIKit/UIWebView+BlocksKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h b/Pods/Headers/Public/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h new file mode 120000 index 0000000..6c759cf --- /dev/null +++ b/Pods/Headers/Public/DZNEmptyDataSet/UIScrollView+EmptyDataSet.h @@ -0,0 +1 @@ +../../../DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTracker.h b/Pods/Headers/Public/FBAllocationTracker/FBAllocationTracker.h deleted file mode 120000 index 07c1975..0000000 --- a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTracker.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTracker.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerDefines.h b/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerDefines.h deleted file mode 120000 index 54d1cdb..0000000 --- a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerDefines.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerDefines.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerManager.h b/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerManager.h deleted file mode 120000 index 901e452..0000000 --- a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerSummary.h b/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerSummary.h deleted file mode 120000 index d102573..0000000 --- a/Pods/Headers/Public/FBAllocationTracker/FBAllocationTrackerSummary.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBAllocationTracker/FBAllocationTracker/FBAllocationTrackerSummary.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfiler.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfiler.h deleted file mode 120000 index 0226a94..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfiler.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfiler.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h deleted file mode 120000 index 1be87b8..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerContainerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDataSource.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDataSource.h deleted file mode 120000 index 28d9a30..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDataSource.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h deleted file mode 120000 index 8721725..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerDeviceUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h deleted file mode 120000 index a15d958..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerFloatingButtonController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h deleted file mode 120000 index fc4735f..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerGenerationsSectionHeaderView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMathUtils.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMathUtils.h deleted file mode 120000 index 60e8e49..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMathUtils.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h deleted file mode 120000 index 64214c5..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerMovableViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerOptions.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerOptions.h deleted file mode 120000 index 2c48155..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerOptions.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerOptions.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPluggable.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPluggable.h deleted file mode 120000 index 34967b9..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPluggable.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h deleted file mode 120000 index 81124eb..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresenting.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresenting.h deleted file mode 120000 index 88f297f..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerPresenting.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h deleted file mode 120000 index 7b98e1e..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSectionHeaderDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h deleted file mode 120000 index e95fb52..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerSegmentedControl.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerTextField.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerTextField.h deleted file mode 120000 index 6155d4d..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerTextField.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/UI/FBMemoryProfilerTextField.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerView.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerView.h deleted file mode 120000 index e092a1b..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Views/FBMemoryProfilerView.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerViewController.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerViewController.h deleted file mode 120000 index 38c4ca2..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindow.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindow.h deleted file mode 120000 index 6b9d453..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindow.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindow.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h b/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h deleted file mode 120000 index 360d6ce..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBMemoryProfilerWindowTouchesHandling.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBRetainCycleAnalysisCache.h b/Pods/Headers/Public/FBMemoryProfiler/FBRetainCycleAnalysisCache.h deleted file mode 120000 index c99e305..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBRetainCycleAnalysisCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBRetainCyclePresenter.h b/Pods/Headers/Public/FBMemoryProfiler/FBRetainCyclePresenter.h deleted file mode 120000 index 6e5f1a0..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBRetainCyclePresenter.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBMemoryProfiler/FBSingleRetainCycleViewController.h b/Pods/Headers/Public/FBMemoryProfiler/FBSingleRetainCycleViewController.h deleted file mode 120000 index 2c410ce..0000000 --- a/Pods/Headers/Public/FBMemoryProfiler/FBSingleRetainCycleViewController.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBMemoryProfiler/FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBRetainCycleDetector/FBParsedStruct.h b/Pods/Headers/Public/FBRetainCycleDetector/FBParsedStruct.h deleted file mode 120000 index faa2b7e..0000000 --- a/Pods/Headers/Public/FBRetainCycleDetector/FBParsedStruct.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBRetainCycleDetector/FBParsedType.h b/Pods/Headers/Public/FBRetainCycleDetector/FBParsedType.h deleted file mode 120000 index b03ea66..0000000 --- a/Pods/Headers/Public/FBRetainCycleDetector/FBParsedType.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h \ No newline at end of file diff --git a/Pods/Headers/Public/FBRetainCycleDetector/FBStructEncodingParser.h b/Pods/Headers/Public/FBRetainCycleDetector/FBStructEncodingParser.h deleted file mode 120000 index 1884d70..0000000 --- a/Pods/Headers/Public/FBRetainCycleDetector/FBStructEncodingParser.h +++ /dev/null @@ -1 +0,0 @@ -../../../FBRetainCycleDetector/FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMDB.h b/Pods/Headers/Public/FMDB/FMDB.h new file mode 120000 index 0000000..bcd6e0a --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMDB.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDB.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMDatabase.h b/Pods/Headers/Public/FMDB/FMDatabase.h new file mode 120000 index 0000000..e69b333 --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMDatabase.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabase.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h b/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h new file mode 120000 index 0000000..b48a6a3 --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMDatabaseAdditions.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMDatabasePool.h b/Pods/Headers/Public/FMDB/FMDatabasePool.h new file mode 120000 index 0000000..1d78001 --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMDatabasePool.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabasePool.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMDatabaseQueue.h b/Pods/Headers/Public/FMDB/FMDatabaseQueue.h new file mode 120000 index 0000000..9adde87 --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMDatabaseQueue.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMDatabaseQueue.h \ No newline at end of file diff --git a/Pods/Headers/Public/FMDB/FMResultSet.h b/Pods/Headers/Public/FMDB/FMResultSet.h new file mode 120000 index 0000000..fd761d8 --- /dev/null +++ b/Pods/Headers/Public/FMDB/FMResultSet.h @@ -0,0 +1 @@ +../../../FMDB/src/fmdb/FMResultSet.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyLayoutDime.h b/Pods/Headers/Public/MyLayout/MyLayoutDime.h deleted file mode 120000 index 82105b1..0000000 --- a/Pods/Headers/Public/MyLayout/MyLayoutDime.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutDime.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyLayoutDimeInner.h b/Pods/Headers/Public/MyLayout/MyLayoutDimeInner.h deleted file mode 120000 index 39f7c7b..0000000 --- a/Pods/Headers/Public/MyLayout/MyLayoutDimeInner.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutDimeInner.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyLayoutMeasure.h b/Pods/Headers/Public/MyLayout/MyLayoutMeasure.h deleted file mode 120000 index 6fad072..0000000 --- a/Pods/Headers/Public/MyLayout/MyLayoutMeasure.h +++ /dev/null @@ -1 +0,0 @@ -../../../MyLayout/MyLayout/Lib/MyLayoutMeasure.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyLayoutSize.h b/Pods/Headers/Public/MyLayout/MyLayoutSize.h new file mode 120000 index 0000000..51979e4 --- /dev/null +++ b/Pods/Headers/Public/MyLayout/MyLayoutSize.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyLayoutSize.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyLayoutSizeInner.h b/Pods/Headers/Public/MyLayout/MyLayoutSizeInner.h new file mode 120000 index 0000000..078770c --- /dev/null +++ b/Pods/Headers/Public/MyLayout/MyLayoutSizeInner.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyLayoutSizeInner.h \ No newline at end of file diff --git a/Pods/Headers/Public/MyLayout/MyPathLayout.h b/Pods/Headers/Public/MyLayout/MyPathLayout.h new file mode 120000 index 0000000..5848c3d --- /dev/null +++ b/Pods/Headers/Public/MyLayout/MyPathLayout.h @@ -0,0 +1 @@ +../../../MyLayout/MyLayout/Lib/MyPathLayout.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/MKAnnotationView+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/MKAnnotationView+RACSignalSupport.h new file mode 120000 index 0000000..e79e126 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/MKAnnotationView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSArray+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSArray+RACSequenceAdditions.h new file mode 120000 index 0000000..46decd6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSArray+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSData+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSData+RACSupport.h new file mode 120000 index 0000000..4a4b10b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSData+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSData+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSDictionary+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSDictionary+RACSequenceAdditions.h new file mode 120000 index 0000000..04f3b04 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSDictionary+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h new file mode 120000 index 0000000..501b332 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSFileHandle+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSFileHandle+RACSupport.h new file mode 120000 index 0000000..c8e0e58 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSFileHandle+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h new file mode 120000 index 0000000..fa4b6f2 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSInvocation+RACTypeParsing.h b/Pods/Headers/Public/ReactiveObjC/NSInvocation+RACTypeParsing.h new file mode 120000 index 0000000..65448b0 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSInvocation+RACTypeParsing.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSNotificationCenter+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSNotificationCenter+RACSupport.h new file mode 120000 index 0000000..b18ac56 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSNotificationCenter+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACDeallocating.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACDeallocating.h new file mode 120000 index 0000000..b05cf18 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACDeallocating.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACDescription.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACDescription.h new file mode 120000 index 0000000..89975e7 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACDescription.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACKVOWrapper.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACKVOWrapper.h new file mode 120000 index 0000000..61836b9 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACKVOWrapper.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACLifting.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACLifting.h new file mode 120000 index 0000000..74f3d92 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACLifting.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACPropertySubscribing.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACPropertySubscribing.h new file mode 120000 index 0000000..b04700e --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACPropertySubscribing.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSObject+RACSelectorSignal.h b/Pods/Headers/Public/ReactiveObjC/NSObject+RACSelectorSignal.h new file mode 120000 index 0000000..da825ee --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSObject+RACSelectorSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h new file mode 120000 index 0000000..11857b0 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSSet+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSSet+RACSequenceAdditions.h new file mode 120000 index 0000000..ea33c93 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSSet+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSString+RACKeyPathUtilities.h b/Pods/Headers/Public/ReactiveObjC/NSString+RACKeyPathUtilities.h new file mode 120000 index 0000000..345e28b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSString+RACKeyPathUtilities.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSString+RACSequenceAdditions.h b/Pods/Headers/Public/ReactiveObjC/NSString+RACSequenceAdditions.h new file mode 120000 index 0000000..321cc61 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSString+RACSequenceAdditions.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSString+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSString+RACSupport.h new file mode 120000 index 0000000..e0921af --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSString+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSString+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSURLConnection+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSURLConnection+RACSupport.h new file mode 120000 index 0000000..4fba2c8 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSURLConnection+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/NSUserDefaults+RACSupport.h b/Pods/Headers/Public/ReactiveObjC/NSUserDefaults+RACSupport.h new file mode 120000 index 0000000..af8fa7e --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/NSUserDefaults+RACSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACAnnotations.h b/Pods/Headers/Public/ReactiveObjC/RACAnnotations.h new file mode 120000 index 0000000..d5a17b1 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACAnnotations.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACAnnotations.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACArraySequence.h b/Pods/Headers/Public/ReactiveObjC/RACArraySequence.h new file mode 120000 index 0000000..7239f2a --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACArraySequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACArraySequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACBehaviorSubject.h b/Pods/Headers/Public/ReactiveObjC/RACBehaviorSubject.h new file mode 120000 index 0000000..27d732d --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACBehaviorSubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACBlockTrampoline.h b/Pods/Headers/Public/ReactiveObjC/RACBlockTrampoline.h new file mode 120000 index 0000000..c7da3f4 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACBlockTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACChannel.h b/Pods/Headers/Public/ReactiveObjC/RACChannel.h new file mode 120000 index 0000000..3aba205 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACChannel.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACChannel.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACCommand.h b/Pods/Headers/Public/ReactiveObjC/RACCommand.h new file mode 120000 index 0000000..b482435 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACCommand.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACCommand.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACCompoundDisposable.h b/Pods/Headers/Public/ReactiveObjC/RACCompoundDisposable.h new file mode 120000 index 0000000..30ff17d --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACCompoundDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACDelegateProxy.h b/Pods/Headers/Public/ReactiveObjC/RACDelegateProxy.h new file mode 120000 index 0000000..ce98ef4 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACDelegateProxy.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDelegateProxy.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACDisposable.h b/Pods/Headers/Public/ReactiveObjC/RACDisposable.h new file mode 120000 index 0000000..8231e89 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACDynamicSequence.h b/Pods/Headers/Public/ReactiveObjC/RACDynamicSequence.h new file mode 120000 index 0000000..ed7b7a6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACDynamicSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDynamicSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACDynamicSignal.h b/Pods/Headers/Public/ReactiveObjC/RACDynamicSignal.h new file mode 120000 index 0000000..49627bc --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACDynamicSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACDynamicSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACEXTKeyPathCoding.h b/Pods/Headers/Public/ReactiveObjC/RACEXTKeyPathCoding.h new file mode 120000 index 0000000..32b158d --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACEXTKeyPathCoding.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACEXTKeyPathCoding.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACEXTScope.h b/Pods/Headers/Public/ReactiveObjC/RACEXTScope.h new file mode 120000 index 0000000..e3c542f --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACEXTScope.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACEXTScope.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACEagerSequence.h b/Pods/Headers/Public/ReactiveObjC/RACEagerSequence.h new file mode 120000 index 0000000..96ce023 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACEagerSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEagerSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACErrorSignal.h b/Pods/Headers/Public/ReactiveObjC/RACErrorSignal.h new file mode 120000 index 0000000..3cc7f4c --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACErrorSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACErrorSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACEvent.h b/Pods/Headers/Public/ReactiveObjC/RACEvent.h new file mode 120000 index 0000000..87a834b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACEvent.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACEvent.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACGroupedSignal.h b/Pods/Headers/Public/ReactiveObjC/RACGroupedSignal.h new file mode 120000 index 0000000..69230d9 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACGroupedSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACGroupedSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACImmediateScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACImmediateScheduler.h new file mode 120000 index 0000000..c19c716 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACImmediateScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACIndexSetSequence.h b/Pods/Headers/Public/ReactiveObjC/RACIndexSetSequence.h new file mode 120000 index 0000000..54215f7 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACIndexSetSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACKVOChannel.h b/Pods/Headers/Public/ReactiveObjC/RACKVOChannel.h new file mode 120000 index 0000000..d70cc9e --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACKVOChannel.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOChannel.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACKVOProxy.h b/Pods/Headers/Public/ReactiveObjC/RACKVOProxy.h new file mode 120000 index 0000000..2d924a0 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACKVOProxy.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOProxy.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACKVOTrampoline.h b/Pods/Headers/Public/ReactiveObjC/RACKVOTrampoline.h new file mode 120000 index 0000000..e13f46c --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACKVOTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACMulticastConnection.h b/Pods/Headers/Public/ReactiveObjC/RACMulticastConnection.h new file mode 120000 index 0000000..2e5808b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACMulticastConnection.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACMulticastConnection.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACPassthroughSubscriber.h b/Pods/Headers/Public/ReactiveObjC/RACPassthroughSubscriber.h new file mode 120000 index 0000000..aa80cab --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACPassthroughSubscriber.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler+Subclass.h b/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler+Subclass.h new file mode 120000 index 0000000..f67e31f --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler+Subclass.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler.h new file mode 120000 index 0000000..ea57520 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACQueueScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACQueueScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACReplaySubject.h b/Pods/Headers/Public/ReactiveObjC/RACReplaySubject.h new file mode 120000 index 0000000..854344d --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACReplaySubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACReplaySubject.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACReturnSignal.h b/Pods/Headers/Public/ReactiveObjC/RACReturnSignal.h new file mode 120000 index 0000000..e20b893 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACReturnSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACReturnSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACScheduler+Subclass.h b/Pods/Headers/Public/ReactiveObjC/RACScheduler+Subclass.h new file mode 120000 index 0000000..9ae2fe1 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACScheduler+Subclass.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACScheduler.h new file mode 120000 index 0000000..6607f25 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACScopedDisposable.h b/Pods/Headers/Public/ReactiveObjC/RACScopedDisposable.h new file mode 120000 index 0000000..dfa4a85 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACScopedDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACScopedDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSequence.h b/Pods/Headers/Public/ReactiveObjC/RACSequence.h new file mode 120000 index 0000000..a0f66f5 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSerialDisposable.h b/Pods/Headers/Public/ReactiveObjC/RACSerialDisposable.h new file mode 120000 index 0000000..9c0c169 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSerialDisposable.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSerialDisposable.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSignal+Operations.h b/Pods/Headers/Public/ReactiveObjC/RACSignal+Operations.h new file mode 120000 index 0000000..82e3f44 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSignal+Operations.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignal+Operations.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSignal.h b/Pods/Headers/Public/ReactiveObjC/RACSignal.h new file mode 120000 index 0000000..4b1cdd0 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSignal.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignal.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSignalSequence.h b/Pods/Headers/Public/ReactiveObjC/RACSignalSequence.h new file mode 120000 index 0000000..fdd34d9 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSignalSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSignalSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACStream.h b/Pods/Headers/Public/ReactiveObjC/RACStream.h new file mode 120000 index 0000000..910bd08 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACStream.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACStream.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACStringSequence.h b/Pods/Headers/Public/ReactiveObjC/RACStringSequence.h new file mode 120000 index 0000000..c0059cb --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACStringSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACStringSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSubject.h b/Pods/Headers/Public/ReactiveObjC/RACSubject.h new file mode 120000 index 0000000..b4f83e7 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSubject.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubject.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSubscriber.h b/Pods/Headers/Public/ReactiveObjC/RACSubscriber.h new file mode 120000 index 0000000..d65e0bd --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSubscriber.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriber.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h b/Pods/Headers/Public/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h new file mode 120000 index 0000000..3ea4289 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACSubscriptionScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACSubscriptionScheduler.h new file mode 120000 index 0000000..f45ddb2 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACSubscriptionScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACTargetQueueScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACTargetQueueScheduler.h new file mode 120000 index 0000000..3390556 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACTargetQueueScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACTestScheduler.h b/Pods/Headers/Public/ReactiveObjC/RACTestScheduler.h new file mode 120000 index 0000000..98d129b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACTestScheduler.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTestScheduler.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACTuple.h b/Pods/Headers/Public/ReactiveObjC/RACTuple.h new file mode 120000 index 0000000..e55f508 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACTuple.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTuple.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACTupleSequence.h b/Pods/Headers/Public/ReactiveObjC/RACTupleSequence.h new file mode 120000 index 0000000..c960fb6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACTupleSequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACTupleSequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACUnarySequence.h b/Pods/Headers/Public/ReactiveObjC/RACUnarySequence.h new file mode 120000 index 0000000..e0312e0 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACUnarySequence.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACUnarySequence.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACUnit.h b/Pods/Headers/Public/ReactiveObjC/RACUnit.h new file mode 120000 index 0000000..a5a6ef9 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACUnit.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACUnit.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACValueTransformer.h b/Pods/Headers/Public/ReactiveObjC/RACValueTransformer.h new file mode 120000 index 0000000..df910f6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACValueTransformer.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/RACValueTransformer.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/RACmetamacros.h b/Pods/Headers/Public/ReactiveObjC/RACmetamacros.h new file mode 120000 index 0000000..1de0ce9 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/RACmetamacros.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/extobjc/RACmetamacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/ReactiveObjC.h b/Pods/Headers/Public/ReactiveObjC/ReactiveObjC.h new file mode 120000 index 0000000..391acec --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/ReactiveObjC.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/ReactiveObjC.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIActionSheet+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIActionSheet+RACSignalSupport.h new file mode 120000 index 0000000..3be79b1 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIActionSheet+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIAlertView+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIAlertView+RACSignalSupport.h new file mode 120000 index 0000000..51b41fd --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIAlertView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h b/Pods/Headers/Public/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h new file mode 120000 index 0000000..0727229 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIButton+RACCommandSupport.h b/Pods/Headers/Public/ReactiveObjC/UIButton+RACCommandSupport.h new file mode 120000 index 0000000..b06b2d8 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIButton+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h new file mode 120000 index 0000000..ecc8173 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIControl+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIControl+RACSignalSupport.h new file mode 120000 index 0000000..db09cf6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIControl+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIDatePicker+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIDatePicker+RACSignalSupport.h new file mode 120000 index 0000000..cfb2ac6 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIDatePicker+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h new file mode 120000 index 0000000..ceabb9f --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIImagePickerController+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIImagePickerController+RACSignalSupport.h new file mode 120000 index 0000000..47e463b --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIImagePickerController+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIRefreshControl+RACCommandSupport.h b/Pods/Headers/Public/ReactiveObjC/UIRefreshControl+RACCommandSupport.h new file mode 120000 index 0000000..62d4147 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIRefreshControl+RACCommandSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UISegmentedControl+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UISegmentedControl+RACSignalSupport.h new file mode 120000 index 0000000..5c2b916 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UISegmentedControl+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UISlider+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UISlider+RACSignalSupport.h new file mode 120000 index 0000000..817a76a --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UISlider+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UIStepper+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UIStepper+RACSignalSupport.h new file mode 120000 index 0000000..ddb21b7 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UIStepper+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UISwitch+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UISwitch+RACSignalSupport.h new file mode 120000 index 0000000..2cbd6a7 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UISwitch+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UITableViewCell+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UITableViewCell+RACSignalSupport.h new file mode 120000 index 0000000..94c3d13 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UITableViewCell+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h new file mode 120000 index 0000000..ce71d78 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UITextField+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UITextField+RACSignalSupport.h new file mode 120000 index 0000000..56a156c --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UITextField+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/ReactiveObjC/UITextView+RACSignalSupport.h b/Pods/Headers/Public/ReactiveObjC/UITextView+RACSignalSupport.h new file mode 120000 index 0000000..db98b97 --- /dev/null +++ b/Pods/Headers/Public/ReactiveObjC/UITextView+RACSignalSupport.h @@ -0,0 +1 @@ +../../../ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h b/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h new file mode 120000 index 0000000..b7a00e1 --- /dev/null +++ b/Pods/Headers/Public/SDWebImage/NSImage+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/NSImage+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h b/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h new file mode 120000 index 0000000..f0f1f8f --- /dev/null +++ b/Pods/Headers/Public/SDWebImage/SDImageCacheConfig.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/SDImageCacheConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/SDWebImage/UIView+WebCache.h b/Pods/Headers/Public/SDWebImage/UIView+WebCache.h new file mode 120000 index 0000000..641671a --- /dev/null +++ b/Pods/Headers/Public/SDWebImage/UIView+WebCache.h @@ -0,0 +1 @@ +../../../SDWebImage/SDWebImage/UIView+WebCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClick.h b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClick.h new file mode 120000 index 0000000..83ed437 --- /dev/null +++ b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClick.h @@ -0,0 +1 @@ +../../../../UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClick.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickGameAnalytics.h b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickGameAnalytics.h new file mode 120000 index 0000000..52d11d9 --- /dev/null +++ b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickGameAnalytics.h @@ -0,0 +1 @@ +../../../../UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickGameAnalytics.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickSocialAnalytics.h b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickSocialAnalytics.h new file mode 120000 index 0000000..041d48d --- /dev/null +++ b/Pods/Headers/Public/UMengAnalytics-NO-IDFA/UMMobClick/MobClickSocialAnalytics.h @@ -0,0 +1 @@ +../../../../UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickSocialAnalytics.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/APOpenAPI.h b/Pods/Headers/Public/UMengSocial/APOpenAPI.h deleted file mode 120000 index 2338b7f..0000000 --- a/Pods/Headers/Public/UMengSocial/APOpenAPI.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/APOpenAPIObject.h b/Pods/Headers/Public/UMengSocial/APOpenAPIObject.h deleted file mode 120000 index db61581..0000000 --- a/Pods/Headers/Public/UMengSocial/APOpenAPIObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocial.h b/Pods/Headers/Public/UMengSocial/UMSocial.h deleted file mode 120000 index f3722cf..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocial.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialAccountManager.h b/Pods/Headers/Public/UMengSocial/UMSocialAccountManager.h deleted file mode 120000 index 1055eb7..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialAccountManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialAlipayShareHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialAlipayShareHandler.h deleted file mode 120000 index 5e1b23a..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialAlipayShareHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialBar.h b/Pods/Headers/Public/UMengSocial/UMSocialBar.h deleted file mode 120000 index 1a3ba01..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialBar.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialConfig.h b/Pods/Headers/Public/UMengSocial/UMSocialConfig.h deleted file mode 120000 index 983918b..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialConfig.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialControllerService.h b/Pods/Headers/Public/UMengSocial/UMSocialControllerService.h deleted file mode 120000 index 4247fb6..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialControllerService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialControllerServiceComment.h b/Pods/Headers/Public/UMengSocial/UMSocialControllerServiceComment.h deleted file mode 120000 index d4fc4d3..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialControllerServiceComment.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialData.h b/Pods/Headers/Public/UMengSocial/UMSocialData.h deleted file mode 120000 index c4c5287..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialData.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialDataService.h b/Pods/Headers/Public/UMengSocial/UMSocialDataService.h deleted file mode 120000 index 2411bfe..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialDataService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialFacebookHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialFacebookHandler.h deleted file mode 120000 index ffba44c..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialFacebookHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialInstagramHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialInstagramHandler.h deleted file mode 120000 index 59e7c09..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialInstagramHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialLaiwangHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialLaiwangHandler.h deleted file mode 120000 index 36a248a..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialLaiwangHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialLineHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialLineHandler.h deleted file mode 120000 index 82f7257..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialLineHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialQQHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialQQHandler.h deleted file mode 120000 index b71e814..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialQQHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialSinaHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialSinaHandler.h deleted file mode 120000 index 1bb23d5..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialSinaHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialSinaSSOHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialSinaSSOHandler.h deleted file mode 120000 index ecbad57..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialSinaSSOHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialSnsData.h b/Pods/Headers/Public/UMengSocial/UMSocialSnsData.h deleted file mode 120000 index 34c5ee8..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialSnsData.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialSnsPlatformManager.h b/Pods/Headers/Public/UMengSocial/UMSocialSnsPlatformManager.h deleted file mode 120000 index b4202a7..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialSnsPlatformManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialSnsService.h b/Pods/Headers/Public/UMengSocial/UMSocialSnsService.h deleted file mode 120000 index bc7d24b..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialSnsService.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialTumblrHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialTumblrHandler.h deleted file mode 120000 index b6abdc7..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialTumblrHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialTwitterHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialTwitterHandler.h deleted file mode 120000 index e29fe15..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialTwitterHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialWechatHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialWechatHandler.h deleted file mode 120000 index 0371048..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialWechatHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/UMSocialWhatsappHandler.h b/Pods/Headers/Public/UMengSocial/UMSocialWhatsappHandler.h deleted file mode 120000 index d49139c..0000000 --- a/Pods/Headers/Public/UMengSocial/UMSocialWhatsappHandler.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboGame.h b/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboGame.h deleted file mode 120000 index 6193e95..0000000 --- a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboGame.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboShare.h b/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboShare.h deleted file mode 120000 index 8365d25..0000000 --- a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboShare.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboToken.h b/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboToken.h deleted file mode 120000 index 81290c9..0000000 --- a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboToken.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboUser.h b/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboUser.h deleted file mode 120000 index 832edb2..0000000 --- a/Pods/Headers/Public/UMengSocial/WBHttpRequest+WeiboUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBHttpRequest.h b/Pods/Headers/Public/UMengSocial/WBHttpRequest.h deleted file mode 120000 index 1fdea8a..0000000 --- a/Pods/Headers/Public/UMengSocial/WBHttpRequest.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBSDKBasicButton.h b/Pods/Headers/Public/UMengSocial/WBSDKBasicButton.h deleted file mode 120000 index 126e8ff..0000000 --- a/Pods/Headers/Public/UMengSocial/WBSDKBasicButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBSDKCommentButton.h b/Pods/Headers/Public/UMengSocial/WBSDKCommentButton.h deleted file mode 120000 index 9ce7fc4..0000000 --- a/Pods/Headers/Public/UMengSocial/WBSDKCommentButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WBSDKRelationshipButton.h b/Pods/Headers/Public/UMengSocial/WBSDKRelationshipButton.h deleted file mode 120000 index de69fcf..0000000 --- a/Pods/Headers/Public/UMengSocial/WBSDKRelationshipButton.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WXApi.h b/Pods/Headers/Public/UMengSocial/WXApi.h deleted file mode 120000 index 9849318..0000000 --- a/Pods/Headers/Public/UMengSocial/WXApi.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WXApiObject.h b/Pods/Headers/Public/UMengSocial/WXApiObject.h deleted file mode 120000 index 2a4b4e6..0000000 --- a/Pods/Headers/Public/UMengSocial/WXApiObject.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WeiboSDK.h b/Pods/Headers/Public/UMengSocial/WeiboSDK.h deleted file mode 120000 index 6c748ec..0000000 --- a/Pods/Headers/Public/UMengSocial/WeiboSDK.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengSocial/WeiboUser.h b/Pods/Headers/Public/UMengSocial/WeiboUser.h deleted file mode 120000 index 828f55a..0000000 --- a/Pods/Headers/Public/UMengSocial/WeiboUser.h +++ /dev/null @@ -1 +0,0 @@ -../../../UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/APOpenAPI.h b/Pods/Headers/Public/UMengUShare/APOpenAPI.h new file mode 120000 index 0000000..80f8187 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/APOpenAPI.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/APOpenAPIObject.h b/Pods/Headers/Public/UMengUShare/APOpenAPIObject.h new file mode 120000 index 0000000..dc635ba --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/APOpenAPIObject.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterface.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterface.h new file mode 120000 index 0000000..f32274b --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterface.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterface.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterfaceObject.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterfaceObject.h new file mode 120000 index 0000000..b7829fd --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/QQApiInterfaceObject.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentApiInterface.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentApiInterface.h new file mode 120000 index 0000000..cd38d2d --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentApiInterface.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentApiInterface.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentMessageObject.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentMessageObject.h new file mode 120000 index 0000000..4ca0191 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentMessageObject.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentMessageObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuth.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuth.h new file mode 120000 index 0000000..026c3cf --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuth.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuthObject.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuthObject.h new file mode 120000 index 0000000..d4af291 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/TencentOAuthObject.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuthObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/TencentOpenAPI/sdkdef.h b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/sdkdef.h new file mode 120000 index 0000000..e03aeb8 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/TencentOpenAPI/sdkdef.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/sdkdef.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialAlipayHandler.h b/Pods/Headers/Public/UMengUShare/UMSocialAlipayHandler.h new file mode 120000 index 0000000..e01232b --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialAlipayHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCore.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCore.h new file mode 120000 index 0000000..6914bbb --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCore.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialCore.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCoreImageUtils.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCoreImageUtils.h new file mode 120000 index 0000000..28506ae --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialCoreImageUtils.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialCoreImageUtils.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialDataManager.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialDataManager.h new file mode 120000 index 0000000..0a6e2a4 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialDataManager.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialDataManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialGlobal.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialGlobal.h new file mode 120000 index 0000000..b7c7bf4 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialGlobal.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialGlobal.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialHandler.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialHandler.h new file mode 120000 index 0000000..125f031 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialHandler.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialImageUtil.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialImageUtil.h new file mode 120000 index 0000000..fa6404b --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialImageUtil.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialImageUtil.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialManager.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialManager.h new file mode 120000 index 0000000..d998cd2 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialManager.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialMessageObject.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialMessageObject.h new file mode 120000 index 0000000..240829d --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialMessageObject.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialMessageObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformConfig.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformConfig.h new file mode 120000 index 0000000..7af8474 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformConfig.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialPlatformConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformProvider.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformProvider.h new file mode 120000 index 0000000..e6d9f86 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialPlatformProvider.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialPlatformProvider.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialResponse.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialResponse.h new file mode 120000 index 0000000..68905f7 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialResponse.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialResponse.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialWarterMarkConfig.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialWarterMarkConfig.h new file mode 120000 index 0000000..d65813e --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSocialWarterMarkConfig.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSocialWarterMarkConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSociallogMacros.h b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSociallogMacros.h new file mode 120000 index 0000000..b87311c --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialCore/UMSociallogMacros.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialCore.framework/Headers/UMSociallogMacros.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialHttpFactory.h b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialHttpFactory.h new file mode 120000 index 0000000..79c451f --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialHttpFactory.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialNetwork.framework/Headers/UMSocialHttpFactory.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialNetwork.h b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialNetwork.h new file mode 120000 index 0000000..8245b71 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialNetwork.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialNetwork.framework/Headers/UMSocialNetwork.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTask.h b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTask.h new file mode 120000 index 0000000..4021e8f --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTask.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialNetwork.framework/Headers/UMSocialTask.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskConfig.h b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskConfig.h new file mode 120000 index 0000000..5d2d9ce --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskConfig.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialNetwork.framework/Headers/UMSocialTaskConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskManager.h b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskManager.h new file mode 120000 index 0000000..e21c710 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialNetwork/UMSocialTaskManager.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialSDK/UMSocialNetwork.framework/Headers/UMSocialTaskManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialQQHandler.h b/Pods/Headers/Public/UMengUShare/UMSocialQQHandler.h new file mode 120000 index 0000000..1e88607 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialQQHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/QQ/UMSocialQQHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialSinaHandler.h b/Pods/Headers/Public/UMengUShare/UMSocialSinaHandler.h new file mode 120000 index 0000000..a63854a --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialSinaHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/UMSocialSinaHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UMSocialWechatHandler.h b/Pods/Headers/Public/UMengUShare/UMSocialWechatHandler.h new file mode 120000 index 0000000..2199de1 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UMSocialWechatHandler.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/UMSocialWechatHandler.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialShareUIConfig.h b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialShareUIConfig.h new file mode 120000 index 0000000..d7200a8 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialShareUIConfig.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialUI/UShareUI.framework/Headers/UMSocialShareUIConfig.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIManager.h b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIManager.h new file mode 120000 index 0000000..8c1e912 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIManager.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialUI/UShareUI.framework/Headers/UMSocialUIManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIUtility.h b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIUtility.h new file mode 120000 index 0000000..95bc4d7 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UShareUI/UMSocialUIUtility.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialUI/UShareUI.framework/Headers/UMSocialUIUtility.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/UShareUI/UShareUI.h b/Pods/Headers/Public/UMengUShare/UShareUI/UShareUI.h new file mode 120000 index 0000000..c27caf6 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/UShareUI/UShareUI.h @@ -0,0 +1 @@ +../../../../UMengUShare/UShareSDK/UMSocialUI/UShareUI.framework/Headers/UShareUI.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WBHttpRequest+WeiboToken.h b/Pods/Headers/Public/UMengUShare/WBHttpRequest+WeiboToken.h new file mode 120000 index 0000000..2d5b55b --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WBHttpRequest+WeiboToken.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest+WeiboToken.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WBHttpRequest.h b/Pods/Headers/Public/UMengUShare/WBHttpRequest.h new file mode 120000 index 0000000..7af9b26 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WBHttpRequest.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WXApi.h b/Pods/Headers/Public/UMengUShare/WXApi.h new file mode 120000 index 0000000..0901fac --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WXApi.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApi.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WXApiObject.h b/Pods/Headers/Public/UMengUShare/WXApiObject.h new file mode 120000 index 0000000..361c800 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WXApiObject.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApiObject.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WechatAuthSDK.h b/Pods/Headers/Public/UMengUShare/WechatAuthSDK.h new file mode 120000 index 0000000..6661ac1 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WechatAuthSDK.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK/WechatAuthSDK.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WeiboSDK+Statistics.h b/Pods/Headers/Public/UMengUShare/WeiboSDK+Statistics.h new file mode 120000 index 0000000..b272ebd --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WeiboSDK+Statistics.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK+Statistics.h \ No newline at end of file diff --git a/Pods/Headers/Public/UMengUShare/WeiboSDK.h b/Pods/Headers/Public/UMengUShare/WeiboSDK.h new file mode 120000 index 0000000..0e8b242 --- /dev/null +++ b/Pods/Headers/Public/UMengUShare/WeiboSDK.h @@ -0,0 +1 @@ +../../../UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.h \ No newline at end of file diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h deleted file mode 120000 index aa9dc22..0000000 --- a/Pods/Headers/Public/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WKWebViewJavascriptBridge.h \ No newline at end of file diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h deleted file mode 120000 index 29b9ace..0000000 --- a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridge.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h \ No newline at end of file diff --git a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h b/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h deleted file mode 120000 index dff4a3e..0000000 --- a/Pods/Headers/Public/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h +++ /dev/null @@ -1 +0,0 @@ -../../../WebViewJavascriptBridge/WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYCache/YYCache.h b/Pods/Headers/Public/YYCache/YYCache.h new file mode 120000 index 0000000..2ba9cf8 --- /dev/null +++ b/Pods/Headers/Public/YYCache/YYCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYCache/YYDiskCache.h b/Pods/Headers/Public/YYCache/YYDiskCache.h new file mode 120000 index 0000000..9627fdd --- /dev/null +++ b/Pods/Headers/Public/YYCache/YYDiskCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYDiskCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYCache/YYKVStorage.h b/Pods/Headers/Public/YYCache/YYKVStorage.h new file mode 120000 index 0000000..ac9f318 --- /dev/null +++ b/Pods/Headers/Public/YYCache/YYKVStorage.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYKVStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYCache/YYMemoryCache.h b/Pods/Headers/Public/YYCache/YYMemoryCache.h new file mode 120000 index 0000000..e33b84c --- /dev/null +++ b/Pods/Headers/Public/YYCache/YYMemoryCache.h @@ -0,0 +1 @@ +../../../YYCache/YYCache/YYMemoryCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/CALayer+YYAdd.h b/Pods/Headers/Public/YYKit/CALayer+YYAdd.h deleted file mode 120000 index d2c1f10..0000000 --- a/Pods/Headers/Public/YYKit/CALayer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Quartz/CALayer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/CALayer+YYWebImage.h b/Pods/Headers/Public/YYKit/CALayer+YYWebImage.h deleted file mode 120000 index fee3afd..0000000 --- a/Pods/Headers/Public/YYKit/CALayer+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/CALayer+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/MKAnnotationView+YYWebImage.h b/Pods/Headers/Public/YYKit/MKAnnotationView+YYWebImage.h deleted file mode 120000 index 9adbf52..0000000 --- a/Pods/Headers/Public/YYKit/MKAnnotationView+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/MKAnnotationView+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSArray+YYAdd.h b/Pods/Headers/Public/YYKit/NSArray+YYAdd.h deleted file mode 120000 index db5222d..0000000 --- a/Pods/Headers/Public/YYKit/NSArray+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSArray+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSAttributedString+YYText.h b/Pods/Headers/Public/YYKit/NSAttributedString+YYText.h deleted file mode 120000 index 5e24484..0000000 --- a/Pods/Headers/Public/YYKit/NSAttributedString+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/NSAttributedString+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSBundle+YYAdd.h b/Pods/Headers/Public/YYKit/NSBundle+YYAdd.h deleted file mode 120000 index 7e4cfb4..0000000 --- a/Pods/Headers/Public/YYKit/NSBundle+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSBundle+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSData+YYAdd.h b/Pods/Headers/Public/YYKit/NSData+YYAdd.h deleted file mode 120000 index 69d7137..0000000 --- a/Pods/Headers/Public/YYKit/NSData+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSData+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSDate+YYAdd.h b/Pods/Headers/Public/YYKit/NSDate+YYAdd.h deleted file mode 120000 index 8a3ccb7..0000000 --- a/Pods/Headers/Public/YYKit/NSDate+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSDate+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSDictionary+YYAdd.h b/Pods/Headers/Public/YYKit/NSDictionary+YYAdd.h deleted file mode 120000 index 9538356..0000000 --- a/Pods/Headers/Public/YYKit/NSDictionary+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSDictionary+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSKeyedUnarchiver+YYAdd.h b/Pods/Headers/Public/YYKit/NSKeyedUnarchiver+YYAdd.h deleted file mode 120000 index 4787d9d..0000000 --- a/Pods/Headers/Public/YYKit/NSKeyedUnarchiver+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSNotificationCenter+YYAdd.h b/Pods/Headers/Public/YYKit/NSNotificationCenter+YYAdd.h deleted file mode 120000 index 9f01d0d..0000000 --- a/Pods/Headers/Public/YYKit/NSNotificationCenter+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSNotificationCenter+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSNumber+YYAdd.h b/Pods/Headers/Public/YYKit/NSNumber+YYAdd.h deleted file mode 120000 index add39f9..0000000 --- a/Pods/Headers/Public/YYKit/NSNumber+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSNumber+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSObject+YYAdd.h b/Pods/Headers/Public/YYKit/NSObject+YYAdd.h deleted file mode 120000 index 7ec4eb0..0000000 --- a/Pods/Headers/Public/YYKit/NSObject+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSObject+YYAddForARC.h b/Pods/Headers/Public/YYKit/NSObject+YYAddForARC.h deleted file mode 120000 index 679f020..0000000 --- a/Pods/Headers/Public/YYKit/NSObject+YYAddForARC.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAddForARC.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSObject+YYAddForKVO.h b/Pods/Headers/Public/YYKit/NSObject+YYAddForKVO.h deleted file mode 120000 index accfbb1..0000000 --- a/Pods/Headers/Public/YYKit/NSObject+YYAddForKVO.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSObject+YYAddForKVO.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSObject+YYModel.h b/Pods/Headers/Public/YYKit/NSObject+YYModel.h deleted file mode 120000 index ad9b22c..0000000 --- a/Pods/Headers/Public/YYKit/NSObject+YYModel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Model/NSObject+YYModel.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSParagraphStyle+YYText.h b/Pods/Headers/Public/YYKit/NSParagraphStyle+YYText.h deleted file mode 120000 index 98c5af2..0000000 --- a/Pods/Headers/Public/YYKit/NSParagraphStyle+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/NSParagraphStyle+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSString+YYAdd.h b/Pods/Headers/Public/YYKit/NSString+YYAdd.h deleted file mode 120000 index b6a485c..0000000 --- a/Pods/Headers/Public/YYKit/NSString+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSString+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSThread+YYAdd.h b/Pods/Headers/Public/YYKit/NSThread+YYAdd.h deleted file mode 120000 index c28d4a9..0000000 --- a/Pods/Headers/Public/YYKit/NSThread+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSThread+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/NSTimer+YYAdd.h b/Pods/Headers/Public/YYKit/NSTimer+YYAdd.h deleted file mode 120000 index d1ef170..0000000 --- a/Pods/Headers/Public/YYKit/NSTimer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Foundation/NSTimer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIApplication+YYAdd.h b/Pods/Headers/Public/YYKit/UIApplication+YYAdd.h deleted file mode 120000 index 4c41039..0000000 --- a/Pods/Headers/Public/YYKit/UIApplication+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIApplication+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIBarButtonItem+YYAdd.h b/Pods/Headers/Public/YYKit/UIBarButtonItem+YYAdd.h deleted file mode 120000 index 4d02b17..0000000 --- a/Pods/Headers/Public/YYKit/UIBarButtonItem+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIBarButtonItem+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIBezierPath+YYAdd.h b/Pods/Headers/Public/YYKit/UIBezierPath+YYAdd.h deleted file mode 120000 index f405375..0000000 --- a/Pods/Headers/Public/YYKit/UIBezierPath+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIBezierPath+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIButton+YYWebImage.h b/Pods/Headers/Public/YYKit/UIButton+YYWebImage.h deleted file mode 120000 index 5c708cb..0000000 --- a/Pods/Headers/Public/YYKit/UIButton+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/UIButton+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIColor+YYAdd.h b/Pods/Headers/Public/YYKit/UIColor+YYAdd.h deleted file mode 120000 index 73884c0..0000000 --- a/Pods/Headers/Public/YYKit/UIColor+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIColor+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIControl+YYAdd.h b/Pods/Headers/Public/YYKit/UIControl+YYAdd.h deleted file mode 120000 index 6a9e739..0000000 --- a/Pods/Headers/Public/YYKit/UIControl+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIControl+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIDevice+YYAdd.h b/Pods/Headers/Public/YYKit/UIDevice+YYAdd.h deleted file mode 120000 index 21e5977..0000000 --- a/Pods/Headers/Public/YYKit/UIDevice+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIDevice+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIFont+YYAdd.h b/Pods/Headers/Public/YYKit/UIFont+YYAdd.h deleted file mode 120000 index 7b4019d..0000000 --- a/Pods/Headers/Public/YYKit/UIFont+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIFont+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIGestureRecognizer+YYAdd.h b/Pods/Headers/Public/YYKit/UIGestureRecognizer+YYAdd.h deleted file mode 120000 index 4d56367..0000000 --- a/Pods/Headers/Public/YYKit/UIGestureRecognizer+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIImage+YYAdd.h b/Pods/Headers/Public/YYKit/UIImage+YYAdd.h deleted file mode 120000 index 3856385..0000000 --- a/Pods/Headers/Public/YYKit/UIImage+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIImage+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIImageView+YYWebImage.h b/Pods/Headers/Public/YYKit/UIImageView+YYWebImage.h deleted file mode 120000 index f5f777a..0000000 --- a/Pods/Headers/Public/YYKit/UIImageView+YYWebImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/UIImageView+YYWebImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIPasteboard+YYText.h b/Pods/Headers/Public/YYKit/UIPasteboard+YYText.h deleted file mode 120000 index c29d012..0000000 --- a/Pods/Headers/Public/YYKit/UIPasteboard+YYText.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/UIPasteboard+YYText.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIScreen+YYAdd.h b/Pods/Headers/Public/YYKit/UIScreen+YYAdd.h deleted file mode 120000 index e5a10b8..0000000 --- a/Pods/Headers/Public/YYKit/UIScreen+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIScreen+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIScrollView+YYAdd.h b/Pods/Headers/Public/YYKit/UIScrollView+YYAdd.h deleted file mode 120000 index 96bca68..0000000 --- a/Pods/Headers/Public/YYKit/UIScrollView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIScrollView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UITableView+YYAdd.h b/Pods/Headers/Public/YYKit/UITableView+YYAdd.h deleted file mode 120000 index b852f2c..0000000 --- a/Pods/Headers/Public/YYKit/UITableView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UITableView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UITextField+YYAdd.h b/Pods/Headers/Public/YYKit/UITextField+YYAdd.h deleted file mode 120000 index f2e15d1..0000000 --- a/Pods/Headers/Public/YYKit/UITextField+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UITextField+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/UIView+YYAdd.h b/Pods/Headers/Public/YYKit/UIView+YYAdd.h deleted file mode 120000 index 86bdc27..0000000 --- a/Pods/Headers/Public/YYKit/UIView+YYAdd.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/UIKit/UIView+YYAdd.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/config.h b/Pods/Headers/Public/YYKit/WebP/config.h deleted file mode 120000 index 6dec264..0000000 --- a/Pods/Headers/Public/YYKit/WebP/config.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/config.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/decode.h b/Pods/Headers/Public/YYKit/WebP/decode.h deleted file mode 120000 index 99e6255..0000000 --- a/Pods/Headers/Public/YYKit/WebP/decode.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/decode.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/demux.h b/Pods/Headers/Public/YYKit/WebP/demux.h deleted file mode 120000 index 26dfa98..0000000 --- a/Pods/Headers/Public/YYKit/WebP/demux.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/demux.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/encode.h b/Pods/Headers/Public/YYKit/WebP/encode.h deleted file mode 120000 index b763f3c..0000000 --- a/Pods/Headers/Public/YYKit/WebP/encode.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/encode.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/extras.h b/Pods/Headers/Public/YYKit/WebP/extras.h deleted file mode 120000 index bd8d7be..0000000 --- a/Pods/Headers/Public/YYKit/WebP/extras.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/extras.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/format_constants.h b/Pods/Headers/Public/YYKit/WebP/format_constants.h deleted file mode 120000 index 7856d8d..0000000 --- a/Pods/Headers/Public/YYKit/WebP/format_constants.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/format_constants.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/mux.h b/Pods/Headers/Public/YYKit/WebP/mux.h deleted file mode 120000 index d3b9e87..0000000 --- a/Pods/Headers/Public/YYKit/WebP/mux.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/mux.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/mux_types.h b/Pods/Headers/Public/YYKit/WebP/mux_types.h deleted file mode 120000 index 343f6e8..0000000 --- a/Pods/Headers/Public/YYKit/WebP/mux_types.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/mux_types.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/WebP/types.h b/Pods/Headers/Public/YYKit/WebP/types.h deleted file mode 120000 index 98e8ada..0000000 --- a/Pods/Headers/Public/YYKit/WebP/types.h +++ /dev/null @@ -1 +0,0 @@ -../../../../YYKit/Vendor/WebP.framework/Headers/types.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYAnimatedImageView.h b/Pods/Headers/Public/YYKit/YYAnimatedImageView.h deleted file mode 120000 index c6af432..0000000 --- a/Pods/Headers/Public/YYKit/YYAnimatedImageView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYAnimatedImageView.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYAsyncLayer.h b/Pods/Headers/Public/YYKit/YYAsyncLayer.h deleted file mode 120000 index 9fa5e6f..0000000 --- a/Pods/Headers/Public/YYKit/YYAsyncLayer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYAsyncLayer.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYCGUtilities.h b/Pods/Headers/Public/YYKit/YYCGUtilities.h deleted file mode 120000 index e5db3d7..0000000 --- a/Pods/Headers/Public/YYKit/YYCGUtilities.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/Quartz/YYCGUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYCache.h b/Pods/Headers/Public/YYKit/YYCache.h deleted file mode 120000 index 12c1033..0000000 --- a/Pods/Headers/Public/YYKit/YYCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYClassInfo.h b/Pods/Headers/Public/YYKit/YYClassInfo.h deleted file mode 120000 index 579e368..0000000 --- a/Pods/Headers/Public/YYKit/YYClassInfo.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Model/YYClassInfo.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYDiskCache.h b/Pods/Headers/Public/YYKit/YYDiskCache.h deleted file mode 120000 index f1f6adf..0000000 --- a/Pods/Headers/Public/YYKit/YYDiskCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYDiskCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYDispatchQueuePool.h b/Pods/Headers/Public/YYKit/YYDispatchQueuePool.h deleted file mode 120000 index 449ebc0..0000000 --- a/Pods/Headers/Public/YYKit/YYDispatchQueuePool.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYDispatchQueuePool.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYFileHash.h b/Pods/Headers/Public/YYKit/YYFileHash.h deleted file mode 120000 index 1a437d0..0000000 --- a/Pods/Headers/Public/YYKit/YYFileHash.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYFileHash.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYFrameImage.h b/Pods/Headers/Public/YYKit/YYFrameImage.h deleted file mode 120000 index f932499..0000000 --- a/Pods/Headers/Public/YYKit/YYFrameImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYFrameImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYGestureRecognizer.h b/Pods/Headers/Public/YYKit/YYGestureRecognizer.h deleted file mode 120000 index 5400d6a..0000000 --- a/Pods/Headers/Public/YYKit/YYGestureRecognizer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYGestureRecognizer.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYImage.h b/Pods/Headers/Public/YYKit/YYImage.h deleted file mode 120000 index 5f3e4d2..0000000 --- a/Pods/Headers/Public/YYKit/YYImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYImageCache.h b/Pods/Headers/Public/YYKit/YYImageCache.h deleted file mode 120000 index 74c7dce..0000000 --- a/Pods/Headers/Public/YYKit/YYImageCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImageCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYImageCoder.h b/Pods/Headers/Public/YYKit/YYImageCoder.h deleted file mode 120000 index 4fd6fb2..0000000 --- a/Pods/Headers/Public/YYKit/YYImageCoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYImageCoder.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYKVStorage.h b/Pods/Headers/Public/YYKit/YYKVStorage.h deleted file mode 120000 index 3e74333..0000000 --- a/Pods/Headers/Public/YYKit/YYKVStorage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYKVStorage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYKeychain.h b/Pods/Headers/Public/YYKit/YYKeychain.h deleted file mode 120000 index e54ec02..0000000 --- a/Pods/Headers/Public/YYKit/YYKeychain.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYKeychain.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYKit.h b/Pods/Headers/Public/YYKit/YYKit.h deleted file mode 120000 index 80b17f8..0000000 --- a/Pods/Headers/Public/YYKit/YYKit.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/YYKit.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYKitMacro.h b/Pods/Headers/Public/YYKit/YYKitMacro.h deleted file mode 120000 index 2665533..0000000 --- a/Pods/Headers/Public/YYKit/YYKitMacro.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Base/YYKitMacro.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYLabel.h b/Pods/Headers/Public/YYKit/YYLabel.h deleted file mode 120000 index 9542a5c..0000000 --- a/Pods/Headers/Public/YYKit/YYLabel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/YYLabel.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYMemoryCache.h b/Pods/Headers/Public/YYKit/YYMemoryCache.h deleted file mode 120000 index 8343558..0000000 --- a/Pods/Headers/Public/YYKit/YYMemoryCache.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Cache/YYMemoryCache.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYReachability.h b/Pods/Headers/Public/YYKit/YYReachability.h deleted file mode 120000 index ae8667c..0000000 --- a/Pods/Headers/Public/YYKit/YYReachability.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYReachability.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYSentinel.h b/Pods/Headers/Public/YYKit/YYSentinel.h deleted file mode 120000 index 716a0c3..0000000 --- a/Pods/Headers/Public/YYKit/YYSentinel.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYSentinel.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYSpriteSheetImage.h b/Pods/Headers/Public/YYKit/YYSpriteSheetImage.h deleted file mode 120000 index 8421889..0000000 --- a/Pods/Headers/Public/YYKit/YYSpriteSheetImage.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYSpriteSheetImage.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextArchiver.h b/Pods/Headers/Public/YYKit/YYTextArchiver.h deleted file mode 120000 index e75a903..0000000 --- a/Pods/Headers/Public/YYKit/YYTextArchiver.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextArchiver.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextAttribute.h b/Pods/Headers/Public/YYKit/YYTextAttribute.h deleted file mode 120000 index 4a60f8c..0000000 --- a/Pods/Headers/Public/YYKit/YYTextAttribute.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextAttribute.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextContainerView.h b/Pods/Headers/Public/YYKit/YYTextContainerView.h deleted file mode 120000 index b7ffbdf..0000000 --- a/Pods/Headers/Public/YYKit/YYTextContainerView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextContainerView.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextDebugOption.h b/Pods/Headers/Public/YYKit/YYTextDebugOption.h deleted file mode 120000 index 2680ecd..0000000 --- a/Pods/Headers/Public/YYKit/YYTextDebugOption.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextDebugOption.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextEffectWindow.h b/Pods/Headers/Public/YYKit/YYTextEffectWindow.h deleted file mode 120000 index 0220060..0000000 --- a/Pods/Headers/Public/YYKit/YYTextEffectWindow.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextEffectWindow.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextInput.h b/Pods/Headers/Public/YYKit/YYTextInput.h deleted file mode 120000 index c20d0f7..0000000 --- a/Pods/Headers/Public/YYKit/YYTextInput.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextInput.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextKeyboardManager.h b/Pods/Headers/Public/YYKit/YYTextKeyboardManager.h deleted file mode 120000 index b43d5e1..0000000 --- a/Pods/Headers/Public/YYKit/YYTextKeyboardManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextKeyboardManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextLayout.h b/Pods/Headers/Public/YYKit/YYTextLayout.h deleted file mode 120000 index 3f135b9..0000000 --- a/Pods/Headers/Public/YYKit/YYTextLayout.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextLayout.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextLine.h b/Pods/Headers/Public/YYKit/YYTextLine.h deleted file mode 120000 index 3c5ef08..0000000 --- a/Pods/Headers/Public/YYKit/YYTextLine.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextLine.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextMagnifier.h b/Pods/Headers/Public/YYKit/YYTextMagnifier.h deleted file mode 120000 index 0ce186e..0000000 --- a/Pods/Headers/Public/YYKit/YYTextMagnifier.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextMagnifier.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextParser.h b/Pods/Headers/Public/YYKit/YYTextParser.h deleted file mode 120000 index cf3d667..0000000 --- a/Pods/Headers/Public/YYKit/YYTextParser.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextParser.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextRubyAnnotation.h b/Pods/Headers/Public/YYKit/YYTextRubyAnnotation.h deleted file mode 120000 index 72ad4d6..0000000 --- a/Pods/Headers/Public/YYKit/YYTextRubyAnnotation.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextRubyAnnotation.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextRunDelegate.h b/Pods/Headers/Public/YYKit/YYTextRunDelegate.h deleted file mode 120000 index e80062d..0000000 --- a/Pods/Headers/Public/YYKit/YYTextRunDelegate.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextRunDelegate.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextSelectionView.h b/Pods/Headers/Public/YYKit/YYTextSelectionView.h deleted file mode 120000 index c036e68..0000000 --- a/Pods/Headers/Public/YYKit/YYTextSelectionView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/Component/YYTextSelectionView.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextUtilities.h b/Pods/Headers/Public/YYKit/YYTextUtilities.h deleted file mode 120000 index e325fd2..0000000 --- a/Pods/Headers/Public/YYKit/YYTextUtilities.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/String/YYTextUtilities.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTextView.h b/Pods/Headers/Public/YYKit/YYTextView.h deleted file mode 120000 index 3e50b7f..0000000 --- a/Pods/Headers/Public/YYKit/YYTextView.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Text/YYTextView.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYThreadSafeArray.h b/Pods/Headers/Public/YYKit/YYThreadSafeArray.h deleted file mode 120000 index 6224923..0000000 --- a/Pods/Headers/Public/YYKit/YYThreadSafeArray.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYThreadSafeArray.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYThreadSafeDictionary.h b/Pods/Headers/Public/YYKit/YYThreadSafeDictionary.h deleted file mode 120000 index f39a001..0000000 --- a/Pods/Headers/Public/YYKit/YYThreadSafeDictionary.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYThreadSafeDictionary.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTimer.h b/Pods/Headers/Public/YYKit/YYTimer.h deleted file mode 120000 index d3373dd..0000000 --- a/Pods/Headers/Public/YYKit/YYTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYTimer.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYTransaction.h b/Pods/Headers/Public/YYKit/YYTransaction.h deleted file mode 120000 index a414798..0000000 --- a/Pods/Headers/Public/YYKit/YYTransaction.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYTransaction.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYWeakProxy.h b/Pods/Headers/Public/YYKit/YYWeakProxy.h deleted file mode 120000 index 73d57b2..0000000 --- a/Pods/Headers/Public/YYKit/YYWeakProxy.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Utility/YYWeakProxy.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYWebImageManager.h b/Pods/Headers/Public/YYKit/YYWebImageManager.h deleted file mode 120000 index ac5412b..0000000 --- a/Pods/Headers/Public/YYKit/YYWebImageManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYWebImageManager.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/YYWebImageOperation.h b/Pods/Headers/Public/YYKit/YYWebImageOperation.h deleted file mode 120000 index aad3cff..0000000 --- a/Pods/Headers/Public/YYKit/YYWebImageOperation.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/YYWebImageOperation.h \ No newline at end of file diff --git a/Pods/Headers/Public/YYKit/_YYWebImageSetter.h b/Pods/Headers/Public/YYKit/_YYWebImageSetter.h deleted file mode 120000 index 8ed76d4..0000000 --- a/Pods/Headers/Public/YYKit/_YYWebImageSetter.h +++ /dev/null @@ -1 +0,0 @@ -../../../YYKit/YYKit/Image/Categories/_YYWebImageSetter.h \ No newline at end of file diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.h b/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.h index 212e17f..fa0da09 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.h @@ -38,7 +38,7 @@ /** Returns YES if IQKeyboardManager asking for `canBecomeFirstResponder. Useful when doing custom work in `textFieldShouldBeginEditing:` delegate. */ -@property (nonatomic, readonly) BOOL isAskingCanBecomeFirstResponder; +@property (nonatomic, readonly) BOOL isAskingCanBecomeFirstResponder __attribute__((deprecated("isAskingCanBecomeFirstResponder property was come to existence as a workaround to handle `textFieldShouldBeginEditing:` multiple call issue, but we removed `canBecomeFirstResponder` method call from library, now this property make no sense and will be removed in future releases. From now this property will always return NO because of not calling `canBecomeFirstResponder` method. Please update your code/logic in `textFieldShouldBeginEditing:` method."))); ///---------------------- /// @name viewControllers diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.m b/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.m index a56369d..b9b840d 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/Categories/IQUIView+Hierarchy.m @@ -24,7 +24,7 @@ #import "IQUIView+Hierarchy.h" #import - +#import #import #import #import @@ -38,39 +38,9 @@ @implementation UIView (IQ_UIView_Hierarchy) -//Special textFields,textViews,scrollViews -Class UIAlertSheetTextFieldClass; //UIAlertView -Class UIAlertSheetTextFieldClass_iOS8; //UIAlertView - -Class UITableViewCellScrollViewClass; //UITableViewCell -Class UITableViewWrapperViewClass; //UITableViewCell -Class UIQueuingScrollViewClass; //UIPageViewController - -Class UISearchBarTextFieldClass; //UISearchBar - -+(void)initialize -{ - [super initialize]; - - UIAlertSheetTextFieldClass = NSClassFromString(@"UIAlertSheetTextField"); - UIAlertSheetTextFieldClass_iOS8 = NSClassFromString(@"_UIAlertControllerTextField"); - - UITableViewCellScrollViewClass = NSClassFromString(@"UITableViewCellScrollView"); - UITableViewWrapperViewClass = NSClassFromString(@"UITableViewWrapperView"); - UIQueuingScrollViewClass = NSClassFromString(@"_UIQueuingScrollView"); - - UISearchBarTextFieldClass = NSClassFromString(@"UISearchBarTextField"); -} - --(void)_setIsAskingCanBecomeFirstResponder:(BOOL)isAskingCanBecomeFirstResponder -{ - objc_setAssociatedObject(self, @selector(isAskingCanBecomeFirstResponder), @(isAskingCanBecomeFirstResponder), OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -(BOOL)isAskingCanBecomeFirstResponder { - NSNumber *isAskingCanBecomeFirstResponder = objc_getAssociatedObject(self, @selector(isAskingCanBecomeFirstResponder)); - return [isAskingCanBecomeFirstResponder boolValue]; + return NO; } -(UIViewController*)viewController @@ -126,14 +96,26 @@ -(UIView*)superviewOfClassType:(Class)classType while (superview) { - if ([superview isKindOfClass:classType] && - ([superview isKindOfClass:UITableViewCellScrollViewClass] == NO) && - ([superview isKindOfClass:UITableViewWrapperViewClass] == NO) && - ([superview isKindOfClass:UIQueuingScrollViewClass] == NO)) + if ([superview isKindOfClass:classType]) { - return superview; + //If it's UIScrollView, then validating for special cases + if ([superview isKindOfClass:[UIScrollView class]]) + { + NSString *classNameString = NSStringFromClass([superview class]); + + //UITableViewCellScrollView, UITableViewWrapperView, _UIQueuingScrollView + if ((([classNameString hasPrefix:@"UITableView"] && ([classNameString hasSuffix:@"CellScrollView"] || [classNameString hasSuffix:@"WrapperView"])) || [classNameString hasPrefix:@"_"]) == NO) + { + return superview; + } + } + else + { + return superview; + } } - else superview = superview.superview; + + superview = superview.superview; } return nil; @@ -141,23 +123,22 @@ -(UIView*)superviewOfClassType:(Class)classType -(BOOL)_IQcanBecomeFirstResponder { - [self _setIsAskingCanBecomeFirstResponder:YES]; - BOOL _IQcanBecomeFirstResponder = ([self canBecomeFirstResponder] && [self isUserInteractionEnabled] && ![self isHidden] && [self alpha]!=0.0 && ![self isAlertViewTextField] && ![self isSearchBarTextField]); + BOOL _IQcanBecomeFirstResponder = NO; + if ([self isKindOfClass:[UITextField class]]) + { + _IQcanBecomeFirstResponder = [(UITextField*)self isEnabled]; + } + else if ([self isKindOfClass:[UITextView class]]) + { + _IQcanBecomeFirstResponder = [(UITextView*)self isEditable]; + } + if (_IQcanBecomeFirstResponder == YES) { - if ([self isKindOfClass:[UITextField class]]) - { - _IQcanBecomeFirstResponder = [(UITextField*)self isEnabled]; - } - else if ([self isKindOfClass:[UITextView class]]) - { - _IQcanBecomeFirstResponder = [(UITextView*)self isEditable]; - } + _IQcanBecomeFirstResponder = ([self isUserInteractionEnabled] && ![self isHidden] && [self alpha]!=0.0 && ![self isAlertViewTextField] && ![self isSearchBarTextField]); } - [self _setIsAskingCanBecomeFirstResponder:NO]; - return _IQcanBecomeFirstResponder; } @@ -169,7 +150,7 @@ - (NSArray*)responderSiblings //Array of (UITextField/UITextView's). NSMutableArray *tempTextFields = [[NSMutableArray alloc] init]; - for (UITextField *textField in siblings) + for (UIView *textField in siblings) if ([textField _IQcanBecomeFirstResponder]) [tempTextFields addObject:textField]; @@ -180,22 +161,44 @@ - (NSArray*)deepResponderViews { NSMutableArray *textFields = [[NSMutableArray alloc] init]; - //subviews are returning in opposite order. So I sorted it according the frames 'y'. - NSArray *subViews = [self.subviews sortedArrayByPosition]; - - for (UITextField *textField in subViews) + for (UIView *textField in self.subviews) { if ([textField _IQcanBecomeFirstResponder]) { [textFields addObject:textField]; } + //Sometimes there are hidden or disabled views and textField inside them still recorded, so we added some more validations here (Bug ID: #458) - else if (textField.subviews.count && [textField isUserInteractionEnabled] && ![textField isHidden] && [textField alpha]!=0.0) + //Uncommented else (Bug ID: #625) + if (textField.subviews.count && [textField isUserInteractionEnabled] && ![textField isHidden] && [textField alpha]!=0.0) { [textFields addObjectsFromArray:[textField deepResponderViews]]; } } + //subviews are returning in incorrect order. Sorting according the frames 'y'. + return [textFields sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { + + CGRect frame1 = [view1 convertRect:view1.bounds toView:self]; + CGRect frame2 = [view2 convertRect:view2.bounds toView:self]; + + CGFloat x1 = CGRectGetMinX(frame1); + CGFloat y1 = CGRectGetMinY(frame1); + CGFloat x2 = CGRectGetMinX(frame2); + CGFloat y2 = CGRectGetMinY(frame2); + + if (y1 < y2) return NSOrderedAscending; + + else if (y1 > y2) return NSOrderedDescending; + + //Else both y are same so checking for x positions + else if (x1 < x2) return NSOrderedAscending; + + else if (x1 > x2) return NSOrderedDescending; + + else return NSOrderedSame; + }]; + return textFields; } @@ -305,12 +308,44 @@ -(NSString *)debugHierarchy -(BOOL)isSearchBarTextField { - return ([self isKindOfClass:UISearchBarTextFieldClass] || [self isKindOfClass:[UISearchBar class]]); + UIResponder *searchBar = [self nextResponder]; + + BOOL isSearchBarTextField = NO; + while (searchBar && isSearchBarTextField == NO) + { + if ([searchBar isKindOfClass:[UISearchBar class]]) + { + isSearchBarTextField = YES; + break; + } + else if ([searchBar isKindOfClass:[UIViewController class]]) //If found viewcontroller but still not found UISearchBar then it's not the search bar textfield + { + break; + } + + searchBar = [searchBar nextResponder]; + } + + return isSearchBarTextField; } -(BOOL)isAlertViewTextField { - return ([self isKindOfClass:UIAlertSheetTextFieldClass] || [self isKindOfClass:UIAlertSheetTextFieldClass_iOS8]); + UIResponder *alertViewController = [self viewController]; + + BOOL isAlertViewTextField = NO; + while (alertViewController && isAlertViewTextField == NO) + { + if ([alertViewController isKindOfClass:[UIAlertController class]]) + { + isAlertViewTextField = YES; + break; + } + + alertViewController = [alertViewController nextResponder]; + } + + return isAlertViewTextField; } @end diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstants.h b/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstants.h index c8e57da..1f7af44 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstants.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstants.h @@ -46,6 +46,22 @@ typedef NS_ENUM(NSInteger, IQAutoToolbarManageBehaviour) { IQAutoToolbarByPosition, }; +/** + `IQPreviousNextDisplayModeDefault` + Show NextPrevious when there are more than 1 textField otherwise hide. + + `IQPreviousNextDisplayModeAlwaysHide` + Do not show NextPrevious buttons in any case. + + `IQPreviousNextDisplayModeAlwaysShow` + Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled. + */ +typedef NS_ENUM(NSUInteger, IQPreviousNextDisplayMode) { + IQPreviousNextDisplayModeDefault, + IQPreviousNextDisplayModeAlwaysHide, + IQPreviousNextDisplayModeAlwaysShow, +}; + ///------------------- /// @name Localization ///------------------- diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h b/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h index 01c1979..3e6317a 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h @@ -45,4 +45,12 @@ typedef NS_ENUM(NSInteger, IQLayoutGuidePosition) { IQLayoutGuidePositionBottom, }; +//Xcode 8 compatibility check +#ifdef NSFoundationVersionNumber_iOS_9_x_Max + #define IQ_IS_IOS10_OR_GREATER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) +#else + #define IQ_IS_IOS10_OR_GREATER NO +#endif + + #endif diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.h b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.h index 3903d60..26912af 100755 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.h @@ -83,6 +83,17 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; */ - (void)reloadLayoutIfNeeded; +/** + Boolean to know if keyboard is showing. + */ +@property(nonatomic, assign, readonly, getter = isKeyboardShowing) BOOL keyboardShowing; + +/** + moved distance to the top used to maintain distance between keyboard and textField. Most of the time this will be a positive value. + */ +@property(nonatomic, assign, readonly) CGFloat movedDistance; + + ///------------------------- /// @name IQToolbar handling ///------------------------- @@ -93,8 +104,12 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; @property(nonatomic, assign, getter = isEnableAutoToolbar) BOOL enableAutoToolbar; /** - AutoToolbar managing behaviour. Default is IQAutoToolbarBySubviews. - */ + IQAutoToolbarBySubviews: Creates Toolbar according to subview's hirarchy of Textfield's in view. + IQAutoToolbarByTag: Creates Toolbar according to tag property of TextField's. + IQAutoToolbarByPosition: Creates Toolbar according to the y,x position of textField in it's superview coordinate. + + Default is IQAutoToolbarBySubviews. +*/ @property(nonatomic, assign) IQAutoToolbarManageBehaviour toolbarManageBehaviour; /** @@ -108,9 +123,11 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; @property(nullable, nonatomic, strong) UIColor *toolbarTintColor; /** - If YES, then hide previous/next button. Default is NO. + IQPreviousNextDisplayModeDefault: Show NextPrevious when there are more than 1 textField otherwise hide. + IQPreviousNextDisplayModeAlwaysHide: Do not show NextPrevious buttons in any case. + IQPreviousNextDisplayModeAlwaysShow: Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled. */ -@property(nonatomic, assign) BOOL shouldHidePreviousNext; +@property(nonatomic, assign) IQPreviousNextDisplayMode previousNextDisplayMode; /** Toolbar done button icon, If nothing is provided then check toolbarDoneBarButtonItemText to draw done button. @@ -217,40 +234,44 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; ///--------------------------------------------- /** - Disable distance handling within the scope of disabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. + Disable distance handling within the scope of disabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. Default is [UITableViewController, UIAlertController, _UIAlertControllerTextFieldViewController]. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *disabledDistanceHandlingClasses; /** - Enable distance handling within the scope of enabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledDistanceHandlingClasses list, then enabledDistanceHandlingClasses will we ignored. + Enable distance handling within the scope of enabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. Default is []. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *enabledDistanceHandlingClasses; /** - Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. + Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. Default is [UIAlertController, _UIAlertControllerTextFieldViewController]. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *disabledToolbarClasses; /** - Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignored. + Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. Default is []. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *enabledToolbarClasses; /** - Allowed subclasses of UIView to add all inner textField, this will allow to navigate between textField contains in different superview. Class should be kind of UIView. + Allowed subclasses of UIView to add all inner textField, this will allow to navigate between textField contains in different superview. Class should be kind of UIView. Default is [UITableView, UICollectionView, IQPreviousNextView]. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *toolbarPreviousNextAllowedClasses; /** - Disabled classes to ignore 'shouldResignOnTouchOutside' property, Class should be kind of UIViewController. + Disabled classes to ignore 'shouldResignOnTouchOutside' property, Class should be kind of UIViewController. Default is [UIAlertController, UIAlertControllerTextFieldViewController] */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *disabledTouchResignedClasses; /** - Enabled classes to forcefully enable 'shouldResignOnTouchOutsite' property. Class should be kind of UIViewController. If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored. + Enabled classes to forcefully enable 'shouldResignOnTouchOutsite' property. Class should be kind of UIViewController. Default is []. */ @property(nonatomic, strong, nonnull, readonly) NSMutableSet *enabledTouchResignedClasses; +/** + if shouldResignOnTouchOutside is enabled then you can customise the behaviour to not recognise gesture touches on some specific view subclasses. Class should be kind of UIView. Default is [UIControl, UINavigationBar] + */ +@property(nonatomic, strong, nonnull, readonly) NSMutableSet *touchResignedGestureIgnoreClasses; ///------------------------------------------- /// @name Third Party Library support @@ -258,20 +279,29 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; ///------------------------------------------- /** - Add customised Notification for third party customised TextField/TextView. Please be aware that the NSNotification object must be idential to UITextField/UITextView NSNotification objects and customised TextField/TextView support must be idential to UITextField/UITextView. + Add/Remove customised Notification for third party customised TextField/TextView. Please be aware that the NSNotification object must be idential to UITextField/UITextView NSNotification objects and customised TextField/TextView support must be idential to UITextField/UITextView. @param didBeginEditingNotificationName This should be identical to UITextViewTextDidBeginEditingNotification @param didEndEditingNotificationName This should be identical to UITextViewTextDidEndEditingNotification */ -(void)registerTextFieldViewClass:(nonnull Class)aClass didBeginEditingNotificationName:(nonnull NSString *)didBeginEditingNotificationName didEndEditingNotificationName:(nonnull NSString *)didEndEditingNotificationName; +-(void)unregisterTextFieldViewClass:(nonnull Class)aClass + didBeginEditingNotificationName:(nonnull NSString *)didBeginEditingNotificationName + didEndEditingNotificationName:(nonnull NSString *)didEndEditingNotificationName; ///---------------------------------------- -/// @name Debugging. +/// @name Debugging & Developer options ///---------------------------------------- @property(nonatomic, assign) BOOL enableDebugging; +/** + @warning Use below methods to completely enable/disable notifications registered by library internally. Please keep in mind that library is totally dependent on NSNotification of UITextField, UITextField, Keyboard etc. If you do unregisterAllNotifications then library will not work at all. You should only use below methods if you want to completedly disable all library functions. You should use below methods at your own risk. + */ +-(void)registerAllNotifications; +-(void)unregisterAllNotifications; + ///---------------------------------------- /// @name Must not be used for subclassing. ///---------------------------------------- @@ -287,9 +317,3 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; + (nonnull instancetype)new NS_UNAVAILABLE; @end - - -@interface IQKeyboardManager(IQKeyboardManagerDeprecated) - -@end - diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.m index feef0b3..d2de47b 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardManager.m @@ -43,9 +43,13 @@ #import #import +#import + #import #import +#import + NSInteger const kIQDoneButtonToolbarTag = -1002; NSInteger const kIQPreviousNextButtonToolbarTag = -1005; @@ -76,6 +80,9 @@ @interface IQKeyboardManager() /** To save topBottomLayoutConstraint original constant */ @property(nonatomic, assign) CGFloat layoutGuideConstraintInitialConstant; +/** To save topBottomLayoutConstraint original constraint reference */ +@property(nonatomic, weak) NSLayoutConstraint *layoutGuideConstraint; + /*******************************************/ @@ -104,9 +111,6 @@ @interface IQKeyboardManager() /** To mimic the keyboard animation */ @property(nonatomic, assign) NSInteger animationCurve; -/** Boolean to maintain keyboard is showing or it is hide. To solve rootViewController.view.frame calculations. */ -@property(nonatomic, assign) BOOL isKeyboardShowing; - /*******************************************/ @property(nonatomic, strong, nonnull, readwrite) NSMutableSet *registeredClasses; @@ -121,6 +125,7 @@ @interface IQKeyboardManager() @property(nonatomic, strong, nonnull, readwrite) NSMutableSet *disabledTouchResignedClasses; @property(nonatomic, strong, nonnull, readwrite) NSMutableSet *enabledTouchResignedClasses; +@property(nonatomic, strong, nonnull, readwrite) NSMutableSet *touchResignedGestureIgnoreClasses; /*******************************************/ @@ -138,6 +143,9 @@ @implementation IQKeyboardManager /** To save keyboard size. */ CGSize _kbSize; + /** To save Status Bar size. */ + CGRect _statusBarFrame; + /*******************************************/ } @@ -174,8 +182,8 @@ @implementation IQKeyboardManager /** Override +load method to enable KeyboardManager when class loader load IQKeyboardManager. Enabling when app starts (No need to write any code) */ +(void)load { - //Enabling IQKeyboardManager. - [[IQKeyboardManager sharedManager] setEnable:YES]; + //Enabling IQKeyboardManager. Loading asynchronous on main thread + [self performSelectorOnMainThread:@selector(sharedManager) withObject:nil waitUntilDone:NO]; } /* Singleton Object Initialization. */ @@ -190,30 +198,10 @@ -(instancetype)init __strong typeof(self) strongSelf = weakSelf; - // Registering for keyboard notification. - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; - strongSelf.registeredClasses = [[NSMutableSet alloc] init]; - // Registering for UITextField notification. - [self registerTextFieldViewClass:[UITextField class] - didBeginEditingNotificationName:UITextFieldTextDidBeginEditingNotification - didEndEditingNotificationName:UITextFieldTextDidEndEditingNotification]; - - // Registering for UITextView notification. - [self registerTextFieldViewClass:[UITextView class] - didBeginEditingNotificationName:UITextViewTextDidBeginEditingNotification - didEndEditingNotificationName:UITextViewTextDidEndEditingNotification]; - - // Registering for orientation changes notification - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willChangeStatusBarOrientation:) name:UIApplicationWillChangeStatusBarOrientationNotification object:[UIApplication sharedApplication]]; + [strongSelf registerAllNotifications]; - // Registering for status bar frame change notification - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeStatusBarFrame:) name:UIApplicationDidChangeStatusBarFrameNotification object:[UIApplication sharedApplication]]; - //Creating gesture for @shouldResignOnTouchOutside. (Enhancement ID: #14) strongSelf.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)]; strongSelf.tapGesture.cancelsTouchesInView = NO; @@ -223,6 +211,7 @@ -(instancetype)init //Setting it's initial values strongSelf.animationDuration = 0.25; strongSelf.animationCurve = UIViewAnimationCurveEaseInOut; + [self setEnable:YES]; [self setKeyboardDistanceFromTextField:10.0]; [self setShouldPlayInputClicks:YES]; [self setShouldResignOnTouchOutside:NO]; @@ -235,18 +224,26 @@ -(instancetype)init [self setLayoutIfNeededOnUpdate:NO]; [self setShouldFixInteractivePopGestureRecognizer:YES]; + //Loading IQToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay (Bug ID: #550) + { + UITextField *view = [[UITextField alloc] init]; + [view addDoneOnKeyboardWithTarget:nil action:nil]; + [view addPreviousNextDoneOnKeyboardWithTarget:nil previousAction:nil nextAction:nil doneAction:nil]; + } + //Initializing disabled classes Set. - strongSelf.disabledDistanceHandlingClasses = [[NSMutableSet alloc] initWithObjects:[UITableViewController class], nil]; + strongSelf.disabledDistanceHandlingClasses = [[NSMutableSet alloc] initWithObjects:[UITableViewController class],[UIAlertController class], nil]; strongSelf.enabledDistanceHandlingClasses = [[NSMutableSet alloc] init]; - strongSelf.disabledToolbarClasses = [[NSMutableSet alloc] init]; + strongSelf.disabledToolbarClasses = [[NSMutableSet alloc] initWithObjects:[UIAlertController class], nil]; strongSelf.enabledToolbarClasses = [[NSMutableSet alloc] init]; strongSelf.toolbarPreviousNextAllowedClasses = [[NSMutableSet alloc] initWithObjects:[UITableView class],[UICollectionView class],[IQPreviousNextView class], nil]; - strongSelf.disabledTouchResignedClasses = [[NSMutableSet alloc] init]; + strongSelf.disabledTouchResignedClasses = [[NSMutableSet alloc] initWithObjects:[UIAlertController class], nil]; strongSelf.enabledTouchResignedClasses = [[NSMutableSet alloc] init]; - + strongSelf.touchResignedGestureIgnoreClasses = [[NSMutableSet alloc] initWithObjects:[UIControl class],[UINavigationBar class], nil]; + [self setShouldToolbarUsesTextFieldTintColor:NO]; }); } @@ -282,7 +279,8 @@ -(void)dealloc -(void)setEnable:(BOOL)enable { // If not enabled, enable it. - if (enable == YES && _enable == NO) + if (enable == YES && + _enable == NO) { //Setting NO to _enable. _enable = enable; @@ -293,7 +291,8 @@ -(void)setEnable:(BOOL)enable [self showLog:IQLocalizedString(@"enabled", nil)]; } //If not disable, desable it. - else if (enable == NO && _enable == YES) + else if (enable == NO && + _enable == YES) { //Sending a fake notification for keyboardWillHide to retain view's original frame. [self keyboardWillHide:nil]; @@ -304,12 +303,14 @@ -(void)setEnable:(BOOL)enable [self showLog:IQLocalizedString(@"disabled", nil)]; } //If already disabled. - else if (enable == NO && _enable == NO) + else if (enable == NO && + _enable == NO) { [self showLog:IQLocalizedString(@"already disabled", nil)]; } //If already enabled. - else if (enable == YES && _enable == YES) + else if (enable == YES && + _enable == YES) { [self showLog:IQLocalizedString(@"already enabled", nil)]; } @@ -347,6 +348,18 @@ -(BOOL)privateIsEnabled break; } } + + //Special Controllers + if (enable == YES) + { + NSString *classNameString = NSStringFromClass([textFieldViewController class]); + + //_UIAlertControllerTextFieldViewController + if ([classNameString containsString:@"UIAlertController"] && [classNameString hasSuffix:@"TextFieldViewController"]) + { + enable = NO; + } + } } } @@ -405,6 +418,18 @@ -(BOOL)privateShouldResignOnTouchOutside break; } } + + //Special Controllers + if (shouldResignOnTouchOutside == YES) + { + NSString *classNameString = NSStringFromClass([textFieldViewController class]); + + //_UIAlertControllerTextFieldViewController + if ([classNameString containsString:@"UIAlertController"] && [classNameString hasSuffix:@"TextFieldViewController"]) + { + shouldResignOnTouchOutside = NO; + } + } } } @@ -462,6 +487,19 @@ -(BOOL)privateIsEnableAutoToolbar break; } } + + + //Special Controllers + if (enableAutoToolbar == YES) + { + NSString *classNameString = NSStringFromClass([textFieldViewController class]); + + //_UIAlertControllerTextFieldViewController + if ([classNameString containsString:@"UIAlertController"] && [classNameString hasSuffix:@"TextFieldViewController"]) + { + enableAutoToolbar = NO; + } + } } } @@ -485,7 +523,11 @@ -(UIWindow *)keyWindow UIWindow *originalKeyWindow = [[UIApplication sharedApplication] keyWindow]; //If original key window is not nil and the cached keywindow is also not original keywindow then changing keywindow. - if (originalKeyWindow != nil && _keyWindow != originalKeyWindow) _keyWindow = originalKeyWindow; + if (originalKeyWindow != nil && + _keyWindow != originalKeyWindow) + { + _keyWindow = originalKeyWindow; + } return _keyWindow; } @@ -533,11 +575,9 @@ -(void)adjustFrame // We are unable to get textField object while keyboard showing on UIWebView's textField. (Bug ID: #11) if (_textFieldView == nil) return; + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; - // Boolean to know keyboard is showing/hiding - _isKeyboardShowing = YES; - // Getting KeyWindow object. UIWindow *keyWindow = [self keyWindow]; @@ -569,15 +609,15 @@ -(void)adjustFrame // (Bug ID: #250) IQLayoutGuidePosition layoutGuidePosition = IQLayoutGuidePositionNone; - NSLayoutConstraint *constraint = [[_textFieldView viewController] IQLayoutGuideConstraint]; - //If topLayoutGuide constraint - if (constraint && (constraint.firstItem == [[_textFieldView viewController] topLayoutGuide] || constraint.secondItem == [[_textFieldView viewController] topLayoutGuide])) + if (_layoutGuideConstraint && (_layoutGuideConstraint.firstItem == [[_textFieldView viewController] topLayoutGuide] || + _layoutGuideConstraint.secondItem == [[_textFieldView viewController] topLayoutGuide])) { layoutGuidePosition = IQLayoutGuidePositionTop; } //If bottomLayoutGuice constraint - else if (constraint && (constraint.firstItem == [[_textFieldView viewController] bottomLayoutGuide] || constraint.secondItem == [[_textFieldView viewController] bottomLayoutGuide])) + else if (_layoutGuideConstraint && (_layoutGuideConstraint.firstItem == [[_textFieldView viewController] bottomLayoutGuide] || + _layoutGuideConstraint.secondItem == [[_textFieldView viewController] bottomLayoutGuide])) { layoutGuidePosition = IQLayoutGuidePositionBottom; } @@ -698,8 +738,27 @@ -(void)adjustFrame UIScrollView *superScrollView = _lastScrollView; //Looping in upper hierarchy until we don't found any scrollView in it's upper hirarchy till UIWindow object. - while (superScrollView && (move>0?(move > (-superScrollView.contentOffset.y-superScrollView.contentInset.top)):superScrollView.contentOffset.y>0) ) + while (superScrollView && + (move>0?(move > (-superScrollView.contentOffset.y-superScrollView.contentInset.top)):superScrollView.contentOffset.y>0) ) { + UIScrollView *nextScrollView = nil; + UIScrollView *tempScrollView = (UIScrollView*)[superScrollView superviewOfClassType:[UIScrollView class]]; + + //Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285) + while (tempScrollView) + { + if (tempScrollView.isScrollEnabled) + { + nextScrollView = tempScrollView; + break; + } + else + { + // Getting it's superScrollView. // (Enhancement ID: #21, #24) + tempScrollView = (UIScrollView*)[tempScrollView superviewOfClassType:[UIScrollView class]]; + } + } + //Getting lastViewRect. CGRect lastViewRect = [[lastView superview] convertRect:lastView.frame toView:superScrollView]; @@ -712,7 +771,9 @@ -(void)adjustFrame //[_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type //[superScrollView superviewOfClassType:[UIScrollView class]] == nil If processing scrollView is last scrollView in upper hierarchy (there is no other scrollView upper hierrchy.) //shouldOffsetY >= 0 shouldOffsetY must be greater than in order to keep distance from navigationBar (Bug ID: #92) - if ([_textFieldView isKindOfClass:[UITextView class]] && [superScrollView superviewOfClassType:[UIScrollView class]] == nil && (shouldOffsetY >= 0)) + if ([_textFieldView isKindOfClass:[UITextView class]] && + nextScrollView == nil && + (shouldOffsetY >= 0)) { CGFloat maintainTopLayout = 0; @@ -755,7 +816,7 @@ -(void)adjustFrame // Getting next lastView & superScrollView. lastView = superScrollView; - superScrollView = (UIScrollView*)[lastView superviewOfClassType:[UIScrollView class]]; + superScrollView = nextScrollView; } //Updating contentInset @@ -793,15 +854,15 @@ -(void)adjustFrame if (layoutGuidePosition == IQLayoutGuidePositionTop) { - CGFloat constant = MIN(_layoutGuideConstraintInitialConstant, constraint.constant-move); + CGFloat constant = MIN(_layoutGuideConstraintInitialConstant, _layoutGuideConstraint.constant-move); __weak typeof(self) weakSelf = self; - [UIView animateWithDuration:_animationDuration delay:0 options:(7<<16|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ __strong typeof(self) strongSelf = weakSelf; - constraint.constant = constant; + weakSelf.layoutGuideConstraint.constant = constant; [strongSelf.rootViewController.view setNeedsLayout]; [strongSelf.rootViewController.view layoutIfNeeded]; } completion:NULL]; @@ -809,15 +870,15 @@ -(void)adjustFrame //If bottomLayoutGuice constraint else if (layoutGuidePosition == IQLayoutGuidePositionBottom) { - CGFloat constant = MAX(_layoutGuideConstraintInitialConstant, constraint.constant+move); + CGFloat constant = MAX(_layoutGuideConstraintInitialConstant, _layoutGuideConstraint.constant+move); __weak typeof(self) weakSelf = self; - [UIView animateWithDuration:_animationDuration delay:0 options:(7<<16|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ __strong typeof(self) strongSelf = weakSelf; - constraint.constant = constant; + weakSelf.layoutGuideConstraint.constant = constant; [strongSelf.rootViewController.view setNeedsLayout]; [strongSelf.rootViewController.view layoutIfNeeded]; } completion:NULL]; @@ -886,6 +947,7 @@ -(void)adjustFrame [self showLog:@"Moving Upward"]; // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; + _movedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y); } // -Negative else @@ -903,6 +965,7 @@ -(void)adjustFrame [self showLog:@"Moving Downward"]; // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; + _movedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y); } } } @@ -923,6 +986,7 @@ -(void)adjustFrame [self showLog:@"Moving Upward"]; // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; + _movedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y); } // -Negative else @@ -938,12 +1002,14 @@ -(void)adjustFrame [self showLog:@"Moving Downward"]; // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; + _movedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y); } } } } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } #pragma mark - Public Methods @@ -951,14 +1017,15 @@ -(void)adjustFrame /* Refreshes textField/textView position if any external changes is explicitly made by user. */ - (void)reloadLayoutIfNeeded { - if ([self privateIsEnabled] == NO) return; - - if (_textFieldView != nil && - _isKeyboardShowing == YES && - CGRectEqualToRect(_topViewBeginRect, CGRectZero) == false && - [_textFieldView isAlertViewTextField] == NO) + if ([self privateIsEnabled] == YES) { - [self adjustFrame]; + if (_textFieldView != nil && + _keyboardShowing == YES && + CGRectEqualToRect(_topViewBeginRect, CGRectZero) == false && + [_textFieldView isAlertViewTextField] == NO) + { + [self adjustFrame]; + } } } @@ -968,29 +1035,12 @@ -(void)keyboardWillShow:(NSNotification*)aNotification { _kbShowNotification = aNotification; - if ([self privateIsEnabled] == NO) return; - - [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; - - if (CGRectEqualToRect(_topViewBeginRect, CGRectZero)) // (Bug ID: #5) - { - // keyboard is not showing(At the beginning only). We should save rootViewRect. - _rootViewController = [_textFieldView topMostController]; - if (_rootViewController == nil) _rootViewController = [[self keyWindow] topMostController]; - - _topViewBeginRect = _rootViewController.view.frame; - - if (_shouldFixInteractivePopGestureRecognizer && [_rootViewController isKindOfClass:[UINavigationController class]]) - { - _topViewBeginRect.origin = CGPointMake(0, [self keyWindow].frame.size.height-_rootViewController.view.frame.size.height); - } - - [self showLog:[NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription] ,NSStringFromCGRect(_topViewBeginRect)]]; - } - + // Boolean to know keyboard is showing/hiding + _keyboardShowing = YES; + // Getting keyboard animation. - _animationCurve = [[aNotification userInfo][UIKeyboardAnimationCurveUserInfoKey] integerValue]; - _animationCurve = _animationCurve<<16; + NSInteger curve = [[aNotification userInfo][UIKeyboardAnimationCurveUserInfoKey] integerValue]; + _animationCurve = curve<<16; // Getting keyboard animation duration CGFloat duration = [[aNotification userInfo][UIKeyboardAnimationDurationUserInfoKey] floatValue]; @@ -1016,19 +1066,50 @@ -(void)keyboardWillShow:(NSNotification*)aNotification { _kbSize = intersectRect.size; } - + + if ([self privateIsEnabled] == NO) return; + + CFTimeInterval startTime = CACurrentMediaTime(); + [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; + + if (_textFieldView != nil && CGRectEqualToRect(_topViewBeginRect, CGRectZero)) // (Bug ID: #5) + { + // keyboard is not showing(At the beginning only). We should save rootViewRect and _layoutGuideConstraintInitialConstant. + _layoutGuideConstraint = [[_textFieldView viewController] IQLayoutGuideConstraint]; + _layoutGuideConstraintInitialConstant = [_layoutGuideConstraint constant]; + + // keyboard is not showing(At the beginning only). We should save rootViewRect. + _rootViewController = [_textFieldView topMostController]; + if (_rootViewController == nil) _rootViewController = [[self keyWindow] topMostController]; + + _topViewBeginRect = _rootViewController.view.frame; + + if (_shouldFixInteractivePopGestureRecognizer && + [_rootViewController isKindOfClass:[UINavigationController class]] && + [_rootViewController modalPresentationStyle] != UIModalPresentationFormSheet && + [_rootViewController modalPresentationStyle] != UIModalPresentationPageSheet) + { + _topViewBeginRect.origin = CGPointMake(0, [self keyWindow].frame.size.height-_rootViewController.view.frame.size.height); + } + + [self showLog:[NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription] ,NSStringFromCGRect(_topViewBeginRect)]]; + } + //If last restored keyboard size is different(any orientation accure), then refresh. otherwise not. if (!CGSizeEqualToSize(_kbSize, oldKBSize)) { //If _textFieldView is inside UIAlertView then do nothing. (Bug ID: #37, #74, #76) //See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70). - if (_textFieldView != nil && [_textFieldView isAlertViewTextField] == NO) + if (_keyboardShowing == YES && + _textFieldView != nil && + [_textFieldView isAlertViewTextField] == NO) { [self adjustFrame]; } } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /* UIKeyboardDidShowNotification. */ @@ -1036,6 +1117,7 @@ - (void)keyboardDidShow:(NSNotification*)aNotification { if ([self privateIsEnabled] == NO) return; + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; // Getting topMost ViewController. @@ -1043,12 +1125,19 @@ - (void)keyboardDidShow:(NSNotification*)aNotification if (controller == nil) controller = [[self keyWindow] topMostController]; //If _textFieldView viewController is presented as formSheet, then adjustFrame again because iOS internally update formSheet frame on keyboardShown. (Bug ID: #37, #74, #76) - if (_textFieldView != nil && controller.modalPresentationStyle == UIModalPresentationFormSheet && [_textFieldView isAlertViewTextField] == NO) + if (_keyboardShowing == YES && + _textFieldView != nil && + (controller.modalPresentationStyle == UIModalPresentationFormSheet || controller.modalPresentationStyle == UIModalPresentationPageSheet) && + [_textFieldView isAlertViewTextField] == NO) { - [self adjustFrame]; + //In case of form sheet or page sheet, we'll add adjustFrame call in main queue to perform it when UI thread will do all framing updation so adjustFrame will be executed after all internal operations. + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + [self adjustFrame]; + }]; } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /* UIKeyboardWillHideNotification. So setting rootViewController to it's default frame. */ @@ -1057,17 +1146,8 @@ - (void)keyboardWillHide:(NSNotification*)aNotification //If it's not a fake notification generated by [self setEnable:NO]. if (aNotification != nil) _kbShowNotification = nil; - //If not enabled then do nothing. - if ([self privateIsEnabled] == NO) return; - - [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; - - //Commented due to #56. Added all the conditions below to handle UIWebView's textFields. (Bug ID: #56) - // We are unable to get textField object while keyboard showing on UIWebView's textField. (Bug ID: #11) -// if (_textFieldView == nil) return; - // Boolean to know keyboard is showing/hiding - _isKeyboardShowing = NO; + _keyboardShowing = NO; // Getting keyboard animation duration CGFloat aDuration = [[aNotification userInfo][UIKeyboardAnimationDurationUserInfoKey] floatValue]; @@ -1076,6 +1156,16 @@ - (void)keyboardWillHide:(NSNotification*)aNotification _animationDuration = aDuration; } + //If not enabled then do nothing. + if ([self privateIsEnabled] == NO) return; + + CFTimeInterval startTime = CACurrentMediaTime(); + [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; + + //Commented due to #56. Added all the conditions below to handle UIWebView's textFields. (Bug ID: #56) + // We are unable to get textField object while keyboard showing on UIWebView's textField. (Bug ID: #11) +// if (_textFieldView == nil) return; + //Restoring the contentOffset of the lastScrollView if (_lastScrollView) { @@ -1116,7 +1206,8 @@ - (void)keyboardWillHide:(NSNotification*)aNotification } // Setting rootViewController frame to it's original position. // (Bug ID: #18) - if (!CGRectEqualToRect(_topViewBeginRect, CGRectZero) && _rootViewController) + if (!CGRectEqualToRect(_topViewBeginRect, CGRectZero) && + _rootViewController) { //frame size needs to be adjusted on iOS8 due to orientation API changes. _topViewBeginRect.size = _rootViewController.view.frame.size; @@ -1128,14 +1219,10 @@ - (void)keyboardWillHide:(NSNotification*)aNotification __strong typeof(self) strongSelf = weakSelf; - NSLayoutConstraint *constraint = [[strongSelf.textFieldView viewController] IQLayoutGuideConstraint]; - //If done LayoutGuide tweak - if (constraint && - ((constraint.firstItem == [[strongSelf.textFieldView viewController] topLayoutGuide] || constraint.secondItem == [[strongSelf.textFieldView viewController] topLayoutGuide]) || - (constraint.firstItem == [[strongSelf.textFieldView viewController] bottomLayoutGuide] || constraint.secondItem == [[strongSelf.textFieldView viewController] bottomLayoutGuide]))) + if (weakSelf.layoutGuideConstraint) { - constraint.constant = strongSelf.layoutGuideConstraintInitialConstant; + weakSelf.layoutGuideConstraint.constant = strongSelf.layoutGuideConstraintInitialConstant; [strongSelf.rootViewController.view setNeedsLayout]; [strongSelf.rootViewController.view layoutIfNeeded]; } @@ -1144,7 +1231,8 @@ - (void)keyboardWillHide:(NSNotification*)aNotification [self showLog:[NSString stringWithFormat:@"Restoring %@ frame to : %@",[strongSelf.rootViewController _IQDescription],NSStringFromCGRect(strongSelf.topViewBeginRect)]]; // Setting it's new frame [strongSelf.rootViewController.view setFrame:strongSelf.topViewBeginRect]; - + _movedDistance = 0; + //Animating content if needed (Bug ID: #204) if (strongSelf.layoutIfNeededOnUpdate) { @@ -1157,8 +1245,24 @@ - (void)keyboardWillHide:(NSNotification*)aNotification } completion:NULL]; _rootViewController = nil; } + //If done LayoutGuide tweak + else if (_layoutGuideConstraint) + { + __weak typeof(self) weakSelf = self; + + //Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations. + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + __strong typeof(self) strongSelf = weakSelf; + + weakSelf.layoutGuideConstraint.constant = strongSelf.layoutGuideConstraintInitialConstant; + [strongSelf.rootViewController.view setNeedsLayout]; + [strongSelf.rootViewController.view layoutIfNeeded]; + } completion:NULL]; + } //Reset all values + _layoutGuideConstraint = nil; + _layoutGuideConstraintInitialConstant = 0; _lastScrollView = nil; _kbSize = CGSizeZero; _startingContentInsets = UIEdgeInsetsZero; @@ -1166,23 +1270,27 @@ - (void)keyboardWillHide:(NSNotification*)aNotification _startingContentOffset = CGPointZero; // topViewBeginRect = CGRectZero; //Commented due to #82 - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /* UIKeyboardDidHideNotification. So topViewBeginRect can be set to CGRectZero. */ - (void)keyboardDidHide:(NSNotification*)aNotification { + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; _topViewBeginRect = CGRectZero; - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } #pragma mark - UITextFieldView Delegate methods /** UITextFieldTextDidBeginEditingNotification, UITextViewTextDidBeginEditingNotification. Fetching UITextFieldView object. */ -(void)textFieldViewDidBeginEditing:(NSNotification*)notification { + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; // Getting object @@ -1192,22 +1300,24 @@ -(void)textFieldViewDidBeginEditing:(NSNotification*)notification { UITextField *textField = (UITextField*)_textFieldView; - //If keyboard appearance is not like the provided appearance - if (textField.keyboardAppearance != _keyboardAppearance) + if ([textField respondsToSelector:@selector(keyboardAppearance)]) { - //Setting textField keyboard appearance and reloading inputViews. - textField.keyboardAppearance = _keyboardAppearance; - [textField reloadInputViews]; + //If keyboard appearance is not like the provided appearance + if (textField.keyboardAppearance != _keyboardAppearance) + { + //Setting textField keyboard appearance and reloading inputViews. + textField.keyboardAppearance = _keyboardAppearance; + [textField reloadInputViews]; + } } } //If autoToolbar enable, then add toolbar on all the UITextField/UITextView's if required. if ([self privateIsEnableAutoToolbar]) { - [self showLog:@"adding UIToolbars if required"]; - //UITextView special case. Keyboard Notification is firing before textView notification so we need to reload it's inputViews. - if ([_textFieldView isKindOfClass:[UITextView class]] && _textFieldView.inputAccessoryView == nil) + if ([_textFieldView isKindOfClass:[UITextView class]] && + _textFieldView.inputAccessoryView == nil) { __weak typeof(self) weakSelf = self; @@ -1232,54 +1342,71 @@ -(void)textFieldViewDidBeginEditing:(NSNotification*)notification [self removeToolbarIfRequired]; } - if ([self privateIsEnabled] == NO) - { - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; - return; - } - //Adding Geture recognizer to window (Enhancement ID: #14) + [_tapGesture setEnabled:[self privateShouldResignOnTouchOutside]]; [_textFieldView.window addGestureRecognizer:_tapGesture]; - - if (_isKeyboardShowing == NO) // (Bug ID: #5) + + if ([self privateIsEnabled] == YES) { - // keyboard is not showing(At the beginning only). We should save rootViewRect and _layoutGuideConstraintInitialConstant. - _layoutGuideConstraintInitialConstant = [[[_textFieldView viewController] IQLayoutGuideConstraint] constant]; - - _rootViewController = [_textFieldView topMostController]; - if (_rootViewController == nil) _rootViewController = [[self keyWindow] topMostController]; + if (CGRectEqualToRect(_topViewBeginRect, CGRectZero)) // (Bug ID: #5) + { + // keyboard is not showing(At the beginning only). We should save rootViewRect and _layoutGuideConstraintInitialConstant. + _layoutGuideConstraint = [[_textFieldView viewController] IQLayoutGuideConstraint]; + _layoutGuideConstraintInitialConstant = [_layoutGuideConstraint constant]; + + _rootViewController = [_textFieldView topMostController]; + if (_rootViewController == nil) _rootViewController = [[self keyWindow] topMostController]; + + _topViewBeginRect = _rootViewController.view.frame; + + if (_shouldFixInteractivePopGestureRecognizer && + [_rootViewController isKindOfClass:[UINavigationController class]] && + [_rootViewController modalPresentationStyle] != UIModalPresentationFormSheet && + [_rootViewController modalPresentationStyle] != UIModalPresentationPageSheet) + { + _topViewBeginRect.origin = CGPointMake(0, [self keyWindow].frame.size.height-_rootViewController.view.frame.size.height); + } + + [self showLog:[NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription], NSStringFromCGRect(_topViewBeginRect)]]; + } - _topViewBeginRect = _rootViewController.view.frame; - - if (_shouldFixInteractivePopGestureRecognizer && [_rootViewController isKindOfClass:[UINavigationController class]]) + //If _textFieldView is inside UIAlertView then do nothing. (Bug ID: #37, #74, #76) + //See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70). + if (_keyboardShowing == YES && + _textFieldView != nil && + [_textFieldView isAlertViewTextField] == NO) { - _topViewBeginRect.origin = CGPointMake(0, [self keyWindow].frame.size.height-_rootViewController.view.frame.size.height); + // keyboard is already showing. adjust frame. + [self adjustFrame]; } - - [self showLog:[NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription], NSStringFromCGRect(_topViewBeginRect)]]; } - //If _textFieldView is inside UIAlertView then do nothing. (Bug ID: #37, #74, #76) - //See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70). - if (_textFieldView != nil && [_textFieldView isAlertViewTextField] == NO) - { - // keyboard is already showing. adjust frame. - [self adjustFrame]; - } +// if ([_textFieldView isKindOfClass:[UITextField class]]) +// { +// [(UITextField*)_textFieldView addTarget:self action:@selector(editingDidEndOnExit:) forControlEvents:UIControlEventEditingDidEndOnExit]; +// } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /** UITextFieldTextDidEndEditingNotification, UITextViewTextDidEndEditingNotification. Removing fetched object. */ -(void)textFieldViewDidEndEditing:(NSNotification*)notification { + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; //Removing gesture recognizer (Enhancement ID: #14) [_textFieldView.window removeGestureRecognizer:_tapGesture]; +// if ([_textFieldView isKindOfClass:[UITextField class]]) +// { +// [(UITextField*)_textFieldView removeTarget:self action:@selector(editingDidEndOnExit:) forControlEvents:UIControlEventEditingDidEndOnExit]; +// } + // We check if there's a change in original frame or not. - if(_isTextViewContentInsetChanged == YES && [_textFieldView isKindOfClass:[UITextView class]]) + if(_isTextViewContentInsetChanged == YES && + [_textFieldView isKindOfClass:[UITextView class]]) { UITextView *textView = (UITextView*)_textFieldView; @@ -1303,17 +1430,25 @@ -(void)textFieldViewDidEndEditing:(NSNotification*)notification //Setting object to nil _textFieldView = nil; - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } -#pragma mark - UIInterfaceOrientation Change notification methods +//-(void)editingDidEndOnExit:(UITextField*)textField +//{ +// [self showLog:[NSString stringWithFormat:@"ReturnKey %@",NSStringFromSelector(_cmd)]]; +//} + +#pragma mark - UIStatusBar Notification methods /** UIApplicationWillChangeStatusBarOrientationNotification. Need to set the textView to it's original position. If any frame changes made. (Bug ID: #92)*/ - (void)willChangeStatusBarOrientation:(NSNotification*)aNotification { + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; //If textViewContentInsetChanged is changed then restore it. - if (_isTextViewContentInsetChanged == YES && [_textFieldView isKindOfClass:[UITextView class]]) + if (_isTextViewContentInsetChanged == YES && + [_textFieldView isKindOfClass:[UITextView class]]) { UITextView *textView = (UITextView*)_textFieldView; @@ -1334,23 +1469,32 @@ - (void)willChangeStatusBarOrientation:(NSNotification*)aNotification } completion:NULL]; } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } -#pragma mark - Status Bar Frame change Notifications - /** UIApplicationDidChangeStatusBarFrameNotification. Need to refresh view position and update _topViewBeginRect. (Bug ID: #446)*/ - (void)didChangeStatusBarFrame:(NSNotification*)aNotification { + CGRect oldStatusBarFrame = _statusBarFrame; + + // Getting UIStatusBarFrame + _statusBarFrame = [[aNotification userInfo][UIApplicationStatusBarFrameUserInfoKey] CGRectValue]; + if ([self privateIsEnabled] == NO) return; + CFTimeInterval startTime = CACurrentMediaTime(); [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; - if (_rootViewController && !CGRectEqualToRect(_topViewBeginRect, _rootViewController.view.frame)) + if (_rootViewController && + !CGRectEqualToRect(_topViewBeginRect, _rootViewController.view.frame)) { _topViewBeginRect = _rootViewController.view.frame; - if (_shouldFixInteractivePopGestureRecognizer && [_rootViewController isKindOfClass:[UINavigationController class]]) + if (_shouldFixInteractivePopGestureRecognizer && + [_rootViewController isKindOfClass:[UINavigationController class]] && + [_rootViewController modalPresentationStyle] != UIModalPresentationFormSheet && + [_rootViewController modalPresentationStyle] != UIModalPresentationPageSheet) { _topViewBeginRect.origin = CGPointMake(0, [self keyWindow].frame.size.height-_rootViewController.view.frame.size.height); } @@ -1360,12 +1504,16 @@ - (void)didChangeStatusBarFrame:(NSNotification*)aNotification //If _textFieldView is inside UIAlertView then do nothing. (Bug ID: #37, #74, #76) //See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70). - if (_textFieldView != nil && [_textFieldView isAlertViewTextField] == NO) + if (_keyboardShowing == YES && + _textFieldView != nil && + CGSizeEqualToSize(_statusBarFrame.size, oldStatusBarFrame.size) == NO && + [_textFieldView isAlertViewTextField] == NO) { [self adjustFrame]; } - [self showLog:[NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]]; + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } #pragma mark AutoResign methods @@ -1390,7 +1538,15 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecogni -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar( 0) + if (index != NSNotFound && + index > 0) { return YES; } @@ -1451,7 +1608,8 @@ -(BOOL)canGoNext NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not last textField. then it's next object becomeFirstResponder. - if (index != NSNotFound && index < textFields.count-1) + if (index != NSNotFound && + index < textFields.count-1) { return YES; } @@ -1471,7 +1629,8 @@ -(BOOL)goPrevious NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not first textField. then it's previous object becomeFirstResponder. - if (index != NSNotFound && index > 0) + if (index != NSNotFound && + index > 0) { UITextField *nextTextField = textFields[index-1]; @@ -1507,7 +1666,8 @@ -(BOOL)goNext NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not last textField. then it's next object becomeFirstResponder. - if (index != NSNotFound && index < textFields.count-1) + if (index != NSNotFound && + index < textFields.count-1) { UITextField *nextTextField = textFields[index+1]; @@ -1586,11 +1746,16 @@ -(NSArray*)responderViews /** Add toolbar if it is required to add on textFields and it's siblings. */ -(void)addToolbarIfRequired { + CFTimeInterval startTime = CACurrentMediaTime(); + [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; + // Getting all the sibling textFields. NSArray *siblings = [self responderViews]; + [self showLog:[NSString stringWithFormat:@"Found %lu responder sibling(s)",(unsigned long)siblings.count]]; + // If only one object is found, then adding only Done button. - if (siblings.count==1 || self.shouldHidePreviousNext) + if ((siblings.count==1 && self.previousNextDisplayMode == IQPreviousNextDisplayModeDefault) || self.previousNextDisplayMode == IQPreviousNextDisplayModeAlwaysHide) { UITextField *textField = (UITextField*)_textFieldView; @@ -1598,26 +1763,32 @@ -(void)addToolbarIfRequired //setInputAccessoryView: check (Bug ID: #307) if ([textField respondsToSelector:@selector(setInputAccessoryView:)]) { - if ((![textField inputAccessoryView] || ([[textField inputAccessoryView] tag] == kIQPreviousNextButtonToolbarTag))) + BOOL needReload = NO; + + if (![textField inputAccessoryView] || [[textField inputAccessoryView] tag] == kIQPreviousNextButtonToolbarTag) { //Supporting Custom Done button image (Enhancement ID: #366) if (_toolbarDoneBarButtonItemImage) { [textField addRightButtonOnKeyboardWithImage:_toolbarDoneBarButtonItemImage target:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376) else if (_toolbarDoneBarButtonItemText) { [textField addRightButtonOnKeyboardWithText:_toolbarDoneBarButtonItemText target:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } else { //Now adding textField placeholder text as title of IQToolbar (Enhancement ID: #27) [textField addDoneOnKeyboardWithTarget:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } textField.inputAccessoryView.tag = kIQDoneButtonToolbarTag; // (Bug ID: #78) } - else if ([[textField inputAccessoryView] isKindOfClass:[IQToolbar class]] && ([[textField inputAccessoryView] tag] == kIQDoneButtonToolbarTag)) + else if ([[textField inputAccessoryView] isKindOfClass:[IQToolbar class]] && + ([[textField inputAccessoryView] tag] == kIQDoneButtonToolbarTag)) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; @@ -1627,6 +1798,7 @@ -(void)addToolbarIfRequired if ([toolbar.doneImage isEqual:_toolbarDoneBarButtonItemImage] == NO) { [textField addRightButtonOnKeyboardWithImage:_toolbarDoneBarButtonItemImage target:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } } //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376) @@ -1636,6 +1808,7 @@ -(void)addToolbarIfRequired if ([toolbar.doneTitle isEqualToString:_toolbarDoneBarButtonItemText] == NO) { [textField addRightButtonOnKeyboardWithText:_toolbarDoneBarButtonItemText target:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } } else if ((_toolbarDoneBarButtonItemText == nil && toolbar.doneTitle) || @@ -1643,12 +1816,19 @@ -(void)addToolbarIfRequired { //Now adding textField placeholder text as title of IQToolbar (Enhancement ID: #27) [textField addDoneOnKeyboardWithTarget:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } textField.inputAccessoryView.tag = kIQDoneButtonToolbarTag; // (Bug ID: #78) } + + if (needReload) + { + [textField reloadInputViews]; + } } - if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && textField.inputAccessoryView.tag == kIQDoneButtonToolbarTag) + if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && + textField.inputAccessoryView.tag == kIQDoneButtonToolbarTag) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; @@ -1686,15 +1866,22 @@ -(void)addToolbarIfRequired } //If need to show placeholder - if (_shouldShowTextFieldPlaceholder && textField.shouldHidePlaceholderText == NO) + if (_shouldShowTextFieldPlaceholder && + textField.shouldHidePlaceholderText == NO) { //Updating placeholder //(Bug ID: #148, #272) - if (toolbar.title == nil || [toolbar.title isEqualToString:textField.drawingPlaceholderText] == NO) + if (toolbar.title == nil || + [toolbar.title isEqualToString:textField.drawingPlaceholderText] == NO) + { [toolbar setTitle:textField.drawingPlaceholderText]; + } //Setting toolbar title font. // (Enhancement ID: #30) - if (_placeholderFont && [_placeholderFont isKindOfClass:[UIFont class]]) + if (_placeholderFont && + [_placeholderFont isKindOfClass:[UIFont class]]) + { [toolbar setTitleFont:_placeholderFont]; + } } else { @@ -1703,7 +1890,7 @@ -(void)addToolbarIfRequired } } } - else if(siblings.count) + else if ((siblings.count && self.previousNextDisplayMode == IQPreviousNextDisplayModeDefault) || self.previousNextDisplayMode == IQPreviousNextDisplayModeAlwaysShow) { // If more than 1 textField is found. then adding previous/next/done buttons on it. for (UITextField *textField in siblings) @@ -1712,26 +1899,33 @@ -(void)addToolbarIfRequired //setInputAccessoryView: check (Bug ID: #307) if ([textField respondsToSelector:@selector(setInputAccessoryView:)]) { - if ((![textField inputAccessoryView] || [[textField inputAccessoryView] tag] == kIQDoneButtonToolbarTag)) + BOOL needReload = NO; + + if ((![textField inputAccessoryView] || + [[textField inputAccessoryView] tag] == kIQDoneButtonToolbarTag)) { //Supporting Custom Done button image (Enhancement ID: #366) if (_toolbarDoneBarButtonItemImage) { [textField addPreviousNextRightOnKeyboardWithTarget:self rightButtonImage:_toolbarDoneBarButtonItemImage previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) rightButtonAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376) else if (_toolbarDoneBarButtonItemText) { [textField addPreviousNextRightOnKeyboardWithTarget:self rightButtonTitle:_toolbarDoneBarButtonItemText previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) rightButtonAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } else { //Now adding textField placeholder text as title of IQToolbar (Enhancement ID: #27) [textField addPreviousNextDoneOnKeyboardWithTarget:self previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) doneAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } textField.inputAccessoryView.tag = kIQPreviousNextButtonToolbarTag; // (Bug ID: #78) } - else if ([[textField inputAccessoryView] isKindOfClass:[IQToolbar class]] && ([[textField inputAccessoryView] tag] == kIQPreviousNextButtonToolbarTag)) + else if ([[textField inputAccessoryView] isKindOfClass:[IQToolbar class]] && + ([[textField inputAccessoryView] tag] == kIQPreviousNextButtonToolbarTag)) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; @@ -1741,6 +1935,7 @@ -(void)addToolbarIfRequired if ([toolbar.doneImage isEqual:_toolbarDoneBarButtonItemImage] == NO) { [textField addPreviousNextRightOnKeyboardWithTarget:self rightButtonImage:_toolbarDoneBarButtonItemImage previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) rightButtonAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } } //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376) @@ -1749,6 +1944,7 @@ -(void)addToolbarIfRequired if ([toolbar.doneTitle isEqualToString:_toolbarDoneBarButtonItemText] == NO) { [textField addPreviousNextRightOnKeyboardWithTarget:self rightButtonTitle:_toolbarDoneBarButtonItemText previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) rightButtonAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } } else if ((_toolbarDoneBarButtonItemText == nil && toolbar.doneTitle) || @@ -1756,12 +1952,19 @@ -(void)addToolbarIfRequired { //Now adding textField placeholder text as title of IQToolbar (Enhancement ID: #27) [textField addPreviousNextDoneOnKeyboardWithTarget:self previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) doneAction:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; + needReload = YES; } textField.inputAccessoryView.tag = kIQPreviousNextButtonToolbarTag; // (Bug ID: #78) } + + if (needReload) + { + [textField reloadInputViews]; + } } - if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && textField.inputAccessoryView.tag == kIQPreviousNextButtonToolbarTag) + if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && + textField.inputAccessoryView.tag == kIQPreviousNextButtonToolbarTag) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; @@ -1799,15 +2002,22 @@ -(void)addToolbarIfRequired } //If need to show placeholder - if (_shouldShowTextFieldPlaceholder && textField.shouldHidePlaceholderText == NO) + if (_shouldShowTextFieldPlaceholder && + textField.shouldHidePlaceholderText == NO) { //Updating placeholder //(Bug ID: #148, #272) - if (toolbar.title == nil || [toolbar.title isEqualToString:textField.drawingPlaceholderText] == NO) - [toolbar setTitle:textField.drawingPlaceholderText]; + if (toolbar.title == nil || + [toolbar.title isEqualToString:textField.drawingPlaceholderText] == NO) + { + [toolbar setTitle:textField.drawingPlaceholderText]; + } //Setting toolbar title font. // (Enhancement ID: #30) - if (_placeholderFont && [_placeholderFont isKindOfClass:[UIFont class]]) + if (_placeholderFont && + [_placeholderFont isKindOfClass:[UIFont class]]) + { [toolbar setTitleFont:_placeholderFont]; + } } else { @@ -1819,7 +2029,14 @@ -(void)addToolbarIfRequired // If firstTextField, then previous should not be enabled. if (siblings[0] == textField) { - [textField setEnablePrevious:NO next:YES]; + if (siblings.count == 1) + { + [textField setEnablePrevious:NO next:NO]; + } + else + { + [textField setEnablePrevious:NO next:YES]; + } } // If lastTextField then next should not be enaled. else if ([siblings lastObject] == textField) @@ -1833,56 +2050,51 @@ -(void)addToolbarIfRequired } } } + + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /** Remove any toolbar if it is IQToolbar. */ -(void)removeToolbarIfRequired // (Bug ID: #18) { + CFTimeInterval startTime = CACurrentMediaTime(); + [self showLog:[NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]]; + // Getting all the sibling textFields. NSArray *siblings = [self responderViews]; + [self showLog:[NSString stringWithFormat:@"Found %lu responder sibling(s)",(unsigned long)siblings.count]]; + for (UITextField *textField in siblings) { UIView *toolbar = [textField inputAccessoryView]; // (Bug ID: #78) //setInputAccessoryView: check (Bug ID: #307) - if ([textField respondsToSelector:@selector(setInputAccessoryView:)] && ([toolbar isKindOfClass:[IQToolbar class]] && (toolbar.tag == kIQDoneButtonToolbarTag || toolbar.tag == kIQPreviousNextButtonToolbarTag))) + if ([textField respondsToSelector:@selector(setInputAccessoryView:)] && + ([toolbar isKindOfClass:[IQToolbar class]] && (toolbar.tag == kIQDoneButtonToolbarTag || toolbar.tag == kIQPreviousNextButtonToolbarTag))) { textField.inputAccessoryView = nil; } } + + CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime; + [self showLog:[NSString stringWithFormat:@"****** %@ ended: %g seconds ******",NSStringFromSelector(_cmd),elapsedTime]]; } /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */ - (void)reloadInputViews { - // Getting all the sibling textFields. - NSArray *siblings = [self responderViews]; - - for (UITextField *textField in siblings) + //If enabled then adding toolbar. + if ([self privateIsEnableAutoToolbar] == YES) { - // If firstTextField, then previous should not be enabled. - if (siblings[0] == textField) - { - if (siblings.count == 1) - { - [textField setEnablePrevious:NO next:NO]; - } - else - { - [textField setEnablePrevious:NO next:YES]; - } - } - // If lastTextField then next should not be enaled. - else if ([siblings lastObject] == textField) - { - [textField setEnablePrevious:YES next:NO]; - } - else - { - [textField setEnablePrevious:YES next:YES]; - } + [self addToolbarIfRequired]; + } + //Else removing toolbar. + else + { + [self removeToolbarIfRequired]; } } @@ -1902,7 +2114,8 @@ -(void)previousAction:(id)segmentedControl BOOL isAcceptAsFirstResponder = [self goPrevious]; - if (isAcceptAsFirstResponder == YES && textFieldRetain.previousInvocation) + if (isAcceptAsFirstResponder == YES && + textFieldRetain.previousInvocation) { [textFieldRetain.previousInvocation invoke]; } @@ -1924,7 +2137,8 @@ -(void)nextAction:(id)segmentedControl BOOL isAcceptAsFirstResponder = [self goNext]; - if (isAcceptAsFirstResponder == YES && textFieldRetain.nextInvocation) + if (isAcceptAsFirstResponder == YES && + textFieldRetain.nextInvocation) { [textFieldRetain.nextInvocation invoke]; } @@ -1944,7 +2158,8 @@ -(void)doneAction:(IQBarButtonItem*)barButton BOOL isResignedFirstResponder = [self resignFirstResponder]; - if (isResignedFirstResponder == YES && textFieldRetain.doneInvocation) + if (isResignedFirstResponder == YES && + textFieldRetain.doneInvocation) { [textFieldRetain.doneInvocation invoke]; } @@ -1965,6 +2180,69 @@ -(void)registerTextFieldViewClass:(nonnull Class)aClass [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidEndEditing:) name:didEndEditingNotificationName object:nil]; } +/** + Remove customised Notification for third party customised TextField/TextView. + */ +-(void)unregisterTextFieldViewClass:(nonnull Class)aClass + didBeginEditingNotificationName:(nonnull NSString *)didBeginEditingNotificationName + didEndEditingNotificationName:(nonnull NSString *)didEndEditingNotificationName +{ + [_registeredClasses removeObject:aClass]; + + [[NSNotificationCenter defaultCenter] removeObserver:self name:didBeginEditingNotificationName object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:didEndEditingNotificationName object:nil]; +} + +-(void)registerAllNotifications +{ + // Registering for keyboard notification. + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; + + // Registering for UITextField notification. + [self registerTextFieldViewClass:[UITextField class] + didBeginEditingNotificationName:UITextFieldTextDidBeginEditingNotification + didEndEditingNotificationName:UITextFieldTextDidEndEditingNotification]; + + // Registering for UITextView notification. + [self registerTextFieldViewClass:[UITextView class] + didBeginEditingNotificationName:UITextViewTextDidBeginEditingNotification + didEndEditingNotificationName:UITextViewTextDidEndEditingNotification]; + + // Registering for orientation changes notification + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willChangeStatusBarOrientation:) name:UIApplicationWillChangeStatusBarOrientationNotification object:[UIApplication sharedApplication]]; + + // Registering for status bar frame change notification + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didChangeStatusBarFrame:) name:UIApplicationDidChangeStatusBarFrameNotification object:[UIApplication sharedApplication]]; +} + +-(void)unregisterAllNotifications +{ + // Unregistering for keyboard notification. + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; + + // Unregistering for UITextField notification. + [self unregisterTextFieldViewClass:[UITextField class] + didBeginEditingNotificationName:UITextFieldTextDidBeginEditingNotification + didEndEditingNotificationName:UITextFieldTextDidEndEditingNotification]; + + // Unregistering for UITextView notification. + [self unregisterTextFieldViewClass:[UITextView class] + didBeginEditingNotificationName:UITextViewTextDidBeginEditingNotification + didEndEditingNotificationName:UITextViewTextDidEndEditingNotification]; + + // Unregistering for orientation changes notification + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillChangeStatusBarOrientationNotification object:[UIApplication sharedApplication]]; + + // Unregistering for status bar frame change notification + [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidChangeStatusBarFrameNotification object:[UIApplication sharedApplication]]; +} + -(void)showLog:(NSString*)logString { if (_enableDebugging) @@ -1974,8 +2252,3 @@ -(void)showLog:(NSString*)logString } @end - - -@implementation IQKeyboardManager(IQKeyboardManagerDeprecated) - -@end diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.h b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.h index dc13eb8..bfe72d9 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.h @@ -85,14 +85,14 @@ /** Add all the UITextField/UITextView responderView's. - @param UIView object to register all it's responder subviews. + @param view object to register all it's responder subviews. */ -(void)addResponderFromView:(nonnull UIView*)view; /** Remove all the UITextField/UITextView responderView's. - @param UIView object to unregister all it's responder subviews. + @param view object to unregister all it's responder subviews. */ -(void)removeResponderFromView:(nonnull UIView*)view; diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.m index 3a92ff0..05bc19c 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQKeyboardReturnKeyHandler.m @@ -57,20 +57,24 @@ - (instancetype)init return self; } --(instancetype)initWithViewController:(UIViewController*)controller +-(instancetype)initWithViewController:(nullable UIViewController*)controller { self = [super init]; if (self) { textFieldInfoCache = [[NSMutableSet alloc] init]; - [self addResponderFromView:controller.view]; + + if (controller.view) + { + [self addResponderFromView:controller.view]; + } } return self; } --(NSDictionary*)textFieldCachedInfo:(UITextField*)textField +-(NSDictionary*)textFieldViewCachedInfo:(UIView*)textField { for (NSDictionary *infoDict in textFieldInfoCache) if (infoDict[kIQTextField] == textField) return infoDict; @@ -83,40 +87,47 @@ -(void)addResponderFromView:(UIView*)view { NSArray *textFields = [view deepResponderViews]; - for (UITextField *textField in textFields) [self addTextFieldView:textField]; + for (UIView *textField in textFields) [self addTextFieldView:textField]; } -(void)removeResponderFromView:(UIView*)view { NSArray *textFields = [view deepResponderViews]; - for (UITextField *textField in textFields) [self removeTextFieldView:textField]; + for (UIView *textField in textFields) [self removeTextFieldView:textField]; } --(void)removeTextFieldView:(UITextField*)textField +-(void)removeTextFieldView:(UIView*)view { - NSDictionary *dict = [self textFieldCachedInfo:textField]; + NSDictionary *dict = [self textFieldViewCachedInfo:view]; if (dict) { - textField.keyboardType = [dict[kIQTextFieldReturnKeyType] integerValue]; - textField.delegate = dict[kIQTextFieldDelegate]; + if ([view isKindOfClass:[UITextField class]] || [view isKindOfClass:[UITextView class]]) + { + UITextField *textField = (UITextField*)view; + textField.returnKeyType = (UIReturnKeyType)[dict[kIQTextFieldReturnKeyType] integerValue]; + textField.delegate = dict[kIQTextFieldDelegate]; + } [textFieldInfoCache removeObject:dict]; } } --(void)addTextFieldView:(UITextField*)textField +-(void)addTextFieldView:(UIView*)view { - NSMutableDictionary *dictInfo = [[NSMutableDictionary alloc] init]; + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; - dictInfo[kIQTextField] = textField; - dictInfo[kIQTextFieldReturnKeyType] = @(textField.returnKeyType); + dict[kIQTextField] = view; - if (textField.delegate) dictInfo[kIQTextFieldDelegate] = textField.delegate; - - [textField setDelegate:self]; + if ([view isKindOfClass:[UITextField class]] || [view isKindOfClass:[UITextView class]]) + { + UITextField *textField = (UITextField*)view; + dict[kIQTextFieldReturnKeyType] = @(textField.returnKeyType); + if (textField.delegate) dict[kIQTextFieldDelegate] = textField.delegate; + [textField setDelegate:self]; + } - [textFieldInfoCache addObject:dictInfo]; + [textFieldInfoCache addObject:dict]; } -(void)updateReturnKeyTypeOnTextField:(UIView*)textField @@ -168,7 +179,7 @@ -(void)updateReturnKeyTypeOnTextField:(UIView*)textField #pragma mark - Goto next or Resign. --(void)goToNextResponderOrResign:(UIView*)textField +-(BOOL)goToNextResponderOrResign:(UIView*)textField { UIView *superConsideredView; @@ -215,14 +226,31 @@ -(void)goToNextResponderOrResign:(UIView*)textField NSUInteger index = [textFields indexOfObject:textField]; //If it is not last textField. then it's next object becomeFirstResponder. - (index != NSNotFound && index < textFields.count-1) ? [textFields[index+1] becomeFirstResponder] : [textField resignFirstResponder]; + if (index != NSNotFound && index < textFields.count-1) + { + [textFields[index+1] becomeFirstResponder]; + return NO; + } + else + { + [textField resignFirstResponder]; + return YES; + } } #pragma mark - TextField delegate - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { - if ([self.delegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) - return [self.delegate textFieldShouldBeginEditing:textField]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) + return [delegate textFieldShouldBeginEditing:textField]; else return YES; } @@ -231,69 +259,157 @@ - (void)textFieldDidBeginEditing:(UITextField *)textField { [self updateReturnKeyTypeOnTextField:textField]; - if ([self.delegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) - [self.delegate textFieldDidBeginEditing:textField]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) + [delegate textFieldDidBeginEditing:textField]; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { - if ([self.delegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) - return [self.delegate textFieldShouldEndEditing:textField]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) + return [delegate textFieldShouldEndEditing:textField]; else return YES; } - (void)textFieldDidEndEditing:(UITextField *)textField { - if ([self.delegate respondsToSelector:@selector(textFieldDidEndEditing:)]) - [self.delegate textFieldDidEndEditing:textField]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldDidEndEditing:)]) + [delegate textFieldDidEndEditing:textField]; } +//Xcode8, compile validation +#ifdef NSFoundationVersionNumber_iOS_9_x_Max + +- (void)textFieldDidEndEditing:(UITextField *)textField reason:(UITextFieldDidEndEditingReason)reason +{ + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldDidEndEditing:reason:)]) + [delegate textFieldDidEndEditing:textField reason:reason]; +} + +#endif + + - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { - if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) - return [self.delegate textField:textField shouldChangeCharactersInRange:range replacementString:string]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) + return [delegate textField:textField shouldChangeCharactersInRange:range replacementString:string]; else return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField { - if ([self.delegate respondsToSelector:@selector(textFieldShouldClear:)]) - return [self.delegate textFieldShouldClear:textField]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textFieldShouldClear:)]) + return [delegate textFieldShouldClear:textField]; else return YES; } -(BOOL)textFieldShouldReturn:(UITextField *)textField { - BOOL shouldReturn = YES; - - if ([self.delegate respondsToSelector:@selector(textFieldShouldReturn:)]) - shouldReturn = [self.delegate textFieldShouldReturn:textField]; - - if (shouldReturn) + id delegate = self.delegate; + + if (delegate == nil) { - [self goToNextResponderOrResign:textField]; + NSDictionary *dict = [self textFieldViewCachedInfo:textField]; + delegate = dict[kIQTextFieldDelegate]; } - return shouldReturn; + if ([delegate respondsToSelector:@selector(textFieldShouldReturn:)]) + { + BOOL shouldReturn = [delegate textFieldShouldReturn:textField]; + + if (shouldReturn) + { + shouldReturn = [self goToNextResponderOrResign:textField]; + } + + return shouldReturn; + } + else + { + return [self goToNextResponderOrResign:textField]; + } } #pragma mark - TextView delegate - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { - if ([self.delegate respondsToSelector:@selector(textViewShouldBeginEditing:)]) - return [self.delegate textViewShouldBeginEditing:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewShouldBeginEditing:)]) + return [delegate textViewShouldBeginEditing:textView]; else return YES; } - (BOOL)textViewShouldEndEditing:(UITextView *)textView { - if ([self.delegate respondsToSelector:@selector(textViewShouldEndEditing:)]) - return [self.delegate textViewShouldEndEditing:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewShouldEndEditing:)]) + return [delegate textViewShouldEndEditing:textView]; else return YES; } @@ -302,26 +418,50 @@ - (void)textViewDidBeginEditing:(UITextView *)textView { [self updateReturnKeyTypeOnTextField:textView]; - if ([self.delegate respondsToSelector:@selector(textViewDidBeginEditing:)]) - [self.delegate textViewDidBeginEditing:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewDidBeginEditing:)]) + [delegate textViewDidBeginEditing:textView]; } - (void)textViewDidEndEditing:(UITextView *)textView { - if ([self.delegate respondsToSelector:@selector(textViewDidEndEditing:)]) - [self.delegate textViewDidEndEditing:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewDidEndEditing:)]) + [delegate textViewDidEndEditing:textView]; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + BOOL shouldReturn = YES; - if ([self.delegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)]) - shouldReturn = [self.delegate textView:textView shouldChangeTextInRange:range replacementText:text]; + if ([delegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)]) + shouldReturn = [delegate textView:textView shouldChangeTextInRange:range replacementText:text]; if (shouldReturn && [text isEqualToString:@"\n"]) { - [self goToNextResponderOrResign:textView]; + shouldReturn = [self goToNextResponderOrResign:textView]; } return shouldReturn; @@ -329,28 +469,103 @@ - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range r - (void)textViewDidChange:(UITextView *)textView { - if ([self.delegate respondsToSelector:@selector(textViewDidChange:)]) - [self.delegate textViewDidChange:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewDidChange:)]) + [delegate textViewDidChange:textView]; } - (void)textViewDidChangeSelection:(UITextView *)textView { - if ([self.delegate respondsToSelector:@selector(textViewDidChangeSelection:)]) - [self.delegate textViewDidChangeSelection:textView]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textViewDidChangeSelection:)]) + [delegate textViewDidChangeSelection:textView]; +} + +//Xcode8, compile validation +#ifdef NSFoundationVersionNumber_iOS_9_x_Max + +- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction +{ + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textView:shouldInteractWithURL:inRange:interaction:)]) + return [delegate textView:textView shouldInteractWithURL:URL inRange:characterRange interaction:interaction]; + else + return YES; +} + +- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction +{ + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + + if ([delegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:interaction:)]) + return [delegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:characterRange interaction:interaction]; + else + return YES; } +#endif + - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange { - if ([self.delegate respondsToSelector:@selector(textView:shouldInteractWithURL:inRange:)]) - return [self.delegate textView:textView shouldInteractWithURL:URL inRange:characterRange]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if ([delegate respondsToSelector:@selector(textView:shouldInteractWithURL:inRange:)]) + return [delegate textView:textView shouldInteractWithURL:URL inRange:characterRange]; +#pragma clang diagnostic pop else return YES; } - (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange { - if ([self.delegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)]) - return [self.delegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:characterRange]; + id delegate = self.delegate; + + if (delegate == nil) + { + NSDictionary *dict = [self textFieldViewCachedInfo:textView]; + delegate = dict[kIQTextFieldDelegate]; + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if ([delegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)]) + return [delegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:characterRange]; +#pragma clang diagnostic pop else return YES; } @@ -359,9 +574,14 @@ -(void)dealloc { for (NSDictionary *dict in textFieldInfoCache) { - UITextField *textField = dict[kIQTextField]; - textField.keyboardType = [dict[kIQTextFieldReturnKeyType] integerValue]; - textField.delegate = dict[kIQTextFieldDelegate]; + UIView *view = dict[kIQTextField]; + + if ([view isKindOfClass:[UITextField class]] || [view isKindOfClass:[UITextView class]]) + { + UITextField *textField = (UITextField*)view; + textField.returnKeyType = (UIReturnKeyType)[dict[kIQTextFieldReturnKeyType] integerValue]; + textField.delegate = dict[kIQTextFieldDelegate]; + } } [textFieldInfoCache removeAllObjects]; diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQTextView/IQTextView.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQTextView/IQTextView.m index 580e18d..838a194 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQTextView/IQTextView.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQTextView/IQTextView.m @@ -99,7 +99,7 @@ -(void)layoutSubviews [super layoutSubviews]; [placeHolderLabel sizeToFit]; - placeHolderLabel.frame = CGRectMake(8, 8, CGRectGetWidth(self.frame)-16, CGRectGetHeight(placeHolderLabel.frame)); + placeHolderLabel.frame = CGRectMake(4, 8, CGRectGetWidth(self.frame)-16, CGRectGetHeight(placeHolderLabel.frame)); } -(void)setPlaceholder:(NSString *)placeholder diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQBarButtonItem.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQBarButtonItem.m index 0dec8bd..a788f0b 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQBarButtonItem.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQBarButtonItem.m @@ -26,8 +26,10 @@ @implementation IQBarButtonItem -+(void)load ++(void)initialize { + [super initialize]; + //Tint color [[self appearance] setTintColor:nil]; diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m index 3180eca..daf6e96 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m @@ -25,7 +25,7 @@ #import "IQKeyboardManagerConstants.h" #import "IQKeyboardManagerConstantsInternal.h" #import -#import +#import @implementation IQTitleBarButtonItem { diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQToolbar.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQToolbar.m index 8d11e04..5386c29 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQToolbar.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQToolbar.m @@ -32,14 +32,9 @@ @implementation IQToolbar @synthesize titleFont = _titleFont; @synthesize title = _title; -Class IQUIToolbarTextButtonClass; -Class IQUIToolbarButtonClass; - - -+(void)load ++(void)initialize { - IQUIToolbarTextButtonClass = NSClassFromString(@"UIToolbarTextButton"); - IQUIToolbarButtonClass = NSClassFromString(@"UIToolbarButton"); + [super initialize]; //Tint Color [[self appearance] setTintColor:nil]; @@ -226,10 +221,15 @@ -(void)layoutSubviews { isTitleBarButtonFound = YES; } - else if ([barButtonItemView isKindOfClass:IQUIToolbarTextButtonClass] || - [barButtonItemView isKindOfClass:IQUIToolbarButtonClass]) + else { - leftRect = barButtonItemView.frame; + NSString *classNameString = NSStringFromClass([barButtonItemView class]); + + //If it's UIToolbarButton or UIToolbarTextButton + if (([classNameString hasPrefix:@"UIToolbar"] && [classNameString hasSuffix:@"Button"])) + { + leftRect = barButtonItemView.frame; + } } } diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h index f77eff8..76516d2 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h @@ -179,7 +179,7 @@ @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ -- (void)addRightButtonOnKeyboardWithImage:(nullable UIImage*)image target:(nullable id)target action:(nullable SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder; +- (void)addRightButtonOnKeyboardWithImage:(nullable UIImage*)image target:(nullable id)target action:(nullable SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; /** Helper function to add Right button on keyboard. diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m index d453210..02cebfb 100644 --- a/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m +++ b/Pods/IQKeyboardManager/IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m @@ -259,11 +259,11 @@ - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target acti [(UITextField*)self setInputAccessoryView:toolbar]; } -- (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder +- (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addRightButtonOnKeyboardWithImage:image target:target action:action titleText:title]; @@ -308,11 +308,11 @@ - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target actio [(UITextField*)self setInputAccessoryView:toolbar]; } -- (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder +- (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:title]; @@ -362,11 +362,11 @@ - (void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action titleText:(NSS [(UITextField*)self setInputAccessoryView:toolbar]; } --(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder +-(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addDoneOnKeyboardWithTarget:target action:action titleText:title]; @@ -423,11 +423,11 @@ - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)l [(UITextField*)self setInputAccessoryView:toolbar]; } -- (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction shouldShowPlaceholder:(BOOL)showPlaceholder +- (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:title]; @@ -482,11 +482,11 @@ - (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAct [(UITextField*)self setInputAccessoryView:toolbar]; } --(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder +-(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:title]; @@ -528,9 +528,20 @@ - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)p resourcesBundle = mainBundle; } - UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; - UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + UIImage *imageLeftArrow = nil; + UIImage *imageRightArrow = nil; + if (IQ_IS_IOS10_OR_GREATER) + { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } + else + { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } + //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448) if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) { @@ -545,7 +556,11 @@ - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)p //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; - [fixed setWidth:20]; + if (IQ_IS_IOS10_OR_GREATER) { + [fixed setWidth:6]; + } else { + [fixed setWidth:20]; + } [items addObject:fixed]; //Next button @@ -575,11 +590,11 @@ - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)p [(UITextField*)self setInputAccessoryView:toolbar]; } --(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder +-(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:title]; @@ -623,8 +638,16 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UI resourcesBundle = mainBundle; } - UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; - UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + UIImage *imageLeftArrow = nil; + UIImage *imageRightArrow = nil; + + if (IQ_IS_IOS10_OR_GREATER) { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } else { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448) if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) @@ -640,7 +663,11 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UI //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; - [fixed setWidth:20]; + if (IQ_IS_IOS10_OR_GREATER) { + [fixed setWidth:6]; + } else { + [fixed setWidth:20]; + } [items addObject:fixed]; //Next button @@ -671,11 +698,11 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UI [(UITextField*)self setInputAccessoryView:toolbar]; } -- (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)showPlaceholder +- (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonImage:rightButtonImage previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title]; @@ -714,8 +741,16 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NS resourcesBundle = mainBundle; } - UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; - UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + UIImage *imageLeftArrow = nil; + UIImage *imageRightArrow = nil; + + if (IQ_IS_IOS10_OR_GREATER) { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowUp" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowDown" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } else { + imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; + } //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448) if ([UIImage instancesRespondToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) @@ -731,7 +766,11 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NS //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; - [fixed setWidth:20]; + if (IQ_IS_IOS10_OR_GREATER) { + [fixed setWidth:6]; + } else { + [fixed setWidth:20]; + } [items addObject:fixed]; //Next button @@ -761,11 +800,11 @@ - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NS [(UITextField*)self setInputAccessoryView:toolbar]; } -- (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction shouldShowPlaceholder:(BOOL)showPlaceholder +- (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder { NSString *title = nil; - if (showPlaceholder) + if (shouldShowPlaceholder) title = [self drawingPlaceholderText]; [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title]; diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@2x.png b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@2x.png new file mode 100644 index 0000000..81db2ed Binary files /dev/null and b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@2x.png differ diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@3x.png b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@3x.png new file mode 100644 index 0000000..dd34122 Binary files /dev/null and b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowDown@3x.png differ diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@2x.png b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@2x.png new file mode 100644 index 0000000..8ec96a9 Binary files /dev/null and b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@2x.png differ diff --git a/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@3x.png b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@3x.png new file mode 100644 index 0000000..9304f50 Binary files /dev/null and b/Pods/IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowUp@3x.png differ diff --git a/Pods/IQKeyboardManager/README.md b/Pods/IQKeyboardManager/README.md index acfbf5a..9cbc1b4 100644 --- a/Pods/IQKeyboardManager/README.md +++ b/Pods/IQKeyboardManager/README.md @@ -15,7 +15,7 @@ Often while developing an app, We ran into an issues where the iPhone keyboard slide up and cover the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent issues of the keyboard sliding up and cover `UITextField/UITextView` without needing you to enter any code and no additional setup required. To use `IQKeyboardManager` you simply need to add source files to your project. -####Key Features +#### Key Features [![Issue Stats](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager/badge/pr?style=flat)](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager) [![Issue Stats](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager/badge/issue?style=flat)](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager) @@ -49,7 +49,7 @@ alt="IQKeyboardManager Demo Video" width="480" height="360" border="10" /> ## Warning -- **If you're planning to build SDK/library/framework and wants to handle UITextField/UITextView with IQKeyboardManager then you're totally going on wrong way.** I would never suggest to add IQKeyboardManager as dependency/adding/shipping with any third-party library, instead of adding IQKeyboardManager you should implement your custom solution to achieve same result. IQKeyboardManager is totally designed for projects to help developers for their convenience, it's not designed for adding/dependency/shipping with any third-party library, because **doing this could block adoption by other developers for their projects as well(who are not using IQKeyboardManager and implemented their custom solution to handle UITextField/UITextView throught the project).** +- **If you're planning to build SDK/library/framework and wants to handle UITextField/UITextView with IQKeyboardManager then you're totally going on wrong way.** I would never suggest to add IQKeyboardManager as dependency/adding/shipping with any third-party library, instead of adding IQKeyboardManager you should implement your custom solution to achieve same result. IQKeyboardManager is totally designed for projects to help developers for their convenience, it's not designed for adding/dependency/shipping with any third-party library, because **doing this could block adoption by other developers for their projects as well(who are not using IQKeyboardManager and implemented their custom solution to handle UITextField/UITextView thought the project).** - If IQKeybaordManager conflicts with other third-party library, then it's developer responsibility to enable/disable IQKeyboardManager when presenting/dismissing third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager. ## Requirements @@ -63,41 +63,48 @@ Minimum iOS Target: iOS 8.0 Minimum Xcode Version: Xcode 6.0.1 #### IQKeyboardManagerSwift:- -[![Swift 2.2 compatible](https://img.shields.io/badge/Language-Swift2-blue.svg?style=flat)](https://developer.apple.com/swift) +[![Swift 3.1 compatible](https://img.shields.io/badge/Language-Swift3-blue.svg?style=flat)](https://developer.apple.com/swift) Minimum iOS Target: iOS 8.0 -Minimum Xcode Version: Xcode 7.3 +Minimum Xcode Version: Xcode 8.0 #### Demo Project:- -Minimum Xcode Version: Xcode 7.3 +Minimum Xcode Version: Xcode 8.3 Installation ========================== -#### Cocoapod Method:- +#### Installation with Cocoapod:- [![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManager.svg)](http://cocoadocs.org/docsets/IQKeyboardManager) -**Note:-** 3.3.7 is the last iOS 7 supported version. +**Note:-** +- 3.3.7 is the last iOS 7 supported version. ***IQKeyboardManager (Objective-C):-*** IQKeyboardManager is available through [CocoaPods](http://cocoapods.org), to install it simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9)) -`pod 'IQKeyboardManager'` +*iOS8 and later* `pod 'IQKeyboardManager'` + +*iOS7* `pod 'IQKeyboardManagerSwift', '3.3.7'` ***IQKeyboardManager (Swift):-*** IQKeyboardManagerSwift is available through [CocoaPods](http://cocoapods.org), to install it simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236)) -*Swift 2.2 (Xcode 7.3)* +*Swift 3.1 (Xcode 8.0)* `pod 'IQKeyboardManagerSwift'` *Or* -`pod 'IQKeyboardManagerSwift', '4.0.3'` +`pod 'IQKeyboardManagerSwift', '4.0.9'` + +*Swift 3.0(3.0.2) (Xcode 8.2)* `pod 'IQKeyboardManagerSwift', '4.0.8'` + +*Swift 2.2 or 2.3 (Xcode 7.3)* `pod 'IQKeyboardManagerSwift', '4.0.5'` *Swift 2.1.1 (Xcode 7.2)* `pod 'IQKeyboardManagerSwift', '4.0.0'` @@ -122,9 +129,27 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } ``` +#### Installation with Carthage + +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. + +You can install Carthage with [Homebrew](http://brew.sh/) using the following command: + +```bash +$ brew update +$ brew install carthage +``` + +To integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, specify it in your `Cartfile`: + +```ogdl +github "hackiftekhar/IQKeyboardManager" +``` + +Run `carthage` to build the frameworks and drag the appropriate framework (`IQKeyboardManager.framework` or `IQKeyboardManagerSwift.framework`) into your Xcode project according to your need. Make sure to add only one framework and not both. -#### Source Code Method:- +#### Installation with Source Code:- [![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)]() @@ -154,12 +179,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { ## Known Issues:- -You can find known issues list [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/KNOWN ISSUES.md). +You can find known issues list [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/KNOWN%20ISSUES.md). Manual Management:- --- -You can find some manual management tweaks & examples [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/MANUAL MANAGEMENT.md). +You can find some manual management tweaks & examples [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/MANUAL%20MANAGEMENT.md). @@ -167,9 +192,9 @@ You can find some manual management tweaks & examples [here](https://github.com/ [![IQKeyboardManager CFD](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerCFD.jpg)](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerCFD.jpg) -##Properties and functions usage:- +## Properties and functions usage:- -You can find some documentation about properties, methods and their uses [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/PROPERTIES & FUNCTIONS.md). +You can find some documentation about properties, methods and their uses [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/PROPERTIES%20%26%20FUNCTIONS.md). LICENSE diff --git a/Pods/MJExtension/MJExtension/MJProperty.m b/Pods/MJExtension/MJExtension/MJProperty.m index 2489d9a..96710fa 100644 --- a/Pods/MJExtension/MJExtension/MJProperty.m +++ b/Pods/MJExtension/MJExtension/MJProperty.m @@ -18,21 +18,14 @@ @interface MJProperty() @implementation MJProperty -#pragma mark - 懒加载 -- (NSMutableDictionary *)propertyKeysDict +#pragma mark - 初始化 +- (instancetype)init { - if (!_propertyKeysDict) { + if (self = [super init]) { _propertyKeysDict = [NSMutableDictionary dictionary]; - } - return _propertyKeysDict; -} - -- (NSMutableDictionary *)objectClassInArrayDict -{ - if (!_objectClassInArrayDict) { _objectClassInArrayDict = [NSMutableDictionary dictionary]; } - return _objectClassInArrayDict; + return self; } #pragma mark - 缓存 diff --git a/Pods/MJExtension/MJExtension/MJPropertyType.m b/Pods/MJExtension/MJExtension/MJPropertyType.m index b78b202..384beba 100755 --- a/Pods/MJExtension/MJExtension/MJPropertyType.m +++ b/Pods/MJExtension/MJExtension/MJPropertyType.m @@ -22,14 +22,15 @@ + (void)initialize + (instancetype)cachedTypeWithCode:(NSString *)code { MJExtensionAssertParamNotNil2(code, nil); - - MJPropertyType *type = types_[code]; - if (type == nil) { - type = [[self alloc] init]; - type.code = code; - types_[code] = type; + @synchronized (self) { + MJPropertyType *type = types_[code]; + if (type == nil) { + type = [[self alloc] init]; + type.code = code; + types_[code] = type; + } + return type; } - return type; } #pragma mark - 公共方法 diff --git a/Pods/MJExtension/MJExtension/NSObject+MJClass.m b/Pods/MJExtension/MJExtension/NSObject+MJClass.m index 789b9a8..46447a8 100644 --- a/Pods/MJExtension/MJExtension/NSObject+MJClass.m +++ b/Pods/MJExtension/MJExtension/NSObject+MJClass.m @@ -34,11 +34,13 @@ + (void)load + (NSMutableDictionary *)dictForKey:(const void *)key { - if (key == &MJAllowedPropertyNamesKey) return allowedPropertyNamesDict_; - if (key == &MJIgnoredPropertyNamesKey) return ignoredPropertyNamesDict_; - if (key == &MJAllowedCodingPropertyNamesKey) return allowedCodingPropertyNamesDict_; - if (key == &MJIgnoredCodingPropertyNamesKey) return ignoredCodingPropertyNamesDict_; - return nil; + @synchronized (self) { + if (key == &MJAllowedPropertyNamesKey) return allowedPropertyNamesDict_; + if (key == &MJIgnoredPropertyNamesKey) return ignoredPropertyNamesDict_; + if (key == &MJAllowedCodingPropertyNamesKey) return allowedCodingPropertyNamesDict_; + if (key == &MJIgnoredCodingPropertyNamesKey) return ignoredCodingPropertyNamesDict_; + return nil; + } } + (void)mj_enumerateClasses:(MJClassesEnumeration)enumeration diff --git a/Pods/MJExtension/MJExtension/NSObject+MJKeyValue.m b/Pods/MJExtension/MJExtension/NSObject+MJKeyValue.m index 5635e29..84fe982 100755 --- a/Pods/MJExtension/MJExtension/NSObject+MJKeyValue.m +++ b/Pods/MJExtension/MJExtension/NSObject+MJKeyValue.m @@ -212,7 +212,8 @@ + (instancetype)mj_objectWithKeyValues:(id)keyValues context:(NSManagedObjectCon MJExtensionAssertError([keyValues isKindOfClass:[NSDictionary class]], nil, [self class], @"keyValues参数不是一个字典"); if ([self isSubclassOfClass:[NSManagedObject class]] && context) { - return [[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass(self) inManagedObjectContext:context] mj_setKeyValues:keyValues context:context]; + NSString *entityName = [NSStringFromClass(self) componentsSeparatedByString:@"."].lastObject; + return [[NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context] mj_setKeyValues:keyValues context:context]; } return [[[self alloc] init] mj_setKeyValues:keyValues]; } diff --git a/Pods/MJExtension/MJExtension/NSObject+MJProperty.m b/Pods/MJExtension/MJExtension/NSObject+MJProperty.m index fd7197a..c9aff54 100644 --- a/Pods/MJExtension/MJExtension/NSObject+MJProperty.m +++ b/Pods/MJExtension/MJExtension/NSObject+MJProperty.m @@ -44,12 +44,14 @@ + (void)load + (NSMutableDictionary *)dictForKey:(const void *)key { - if (key == &MJReplacedKeyFromPropertyNameKey) return replacedKeyFromPropertyNameDict_; - if (key == &MJReplacedKeyFromPropertyName121Key) return replacedKeyFromPropertyName121Dict_; - if (key == &MJNewValueFromOldValueKey) return newValueFromOldValueDict_; - if (key == &MJObjectClassInArrayKey) return objectClassInArrayDict_; - if (key == &MJCachedPropertiesKey) return cachedPropertiesDict_; - return nil; + @synchronized (self) { + if (key == &MJReplacedKeyFromPropertyNameKey) return replacedKeyFromPropertyNameDict_; + if (key == &MJReplacedKeyFromPropertyName121Key) return replacedKeyFromPropertyName121Dict_; + if (key == &MJNewValueFromOldValueKey) return newValueFromOldValueDict_; + if (key == &MJObjectClassInArrayKey) return objectClassInArrayDict_; + if (key == &MJCachedPropertiesKey) return cachedPropertiesDict_; + return nil; + } } #pragma mark - --私有方法-- @@ -161,13 +163,8 @@ + (NSMutableArray *)properties // 2.遍历每一个成员变量 for (unsigned int i = 0; i * More information of App can focus on:[M了个J-博客园](http://www.cnblogs.com/mjios/p/4409853.html) -## The Class Structure Chart of MJRefres +## The Class Structure Chart of MJRefresh ![](http://images0.cnblogs.com/blog2015/497279/201506/132232456139177.png) - `The class of red text` in the chart:You can use them directly - The drop-down refresh control types diff --git a/Pods/MLeaksFinder/MLeaksFinder/MLeaksFinder.h b/Pods/MLeaksFinder/MLeaksFinder/MLeaksFinder.h index b72334c..a46760c 100644 --- a/Pods/MLeaksFinder/MLeaksFinder/MLeaksFinder.h +++ b/Pods/MLeaksFinder/MLeaksFinder/MLeaksFinder.h @@ -16,7 +16,7 @@ #define _INTERNAL_MLF_ENABLED DEBUG #endif -//#define MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED 0 +//#define MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED 1 #ifdef MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED #define _INTERNAL_MLF_RC_ENABLED MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED diff --git a/Pods/MLeaksFinder/MLeaksFinder/NSObject+MemoryLeak.m b/Pods/MLeaksFinder/MLeaksFinder/NSObject+MemoryLeak.m index 4524d47..4488673 100644 --- a/Pods/MLeaksFinder/MLeaksFinder/NSObject+MemoryLeak.m +++ b/Pods/MLeaksFinder/MLeaksFinder/NSObject+MemoryLeak.m @@ -108,14 +108,21 @@ - (void)setParentPtrs:(NSSet *)parentPtrs { } + (NSSet *)classNamesInWhiteList { - static NSSet *whiteList; + static NSMutableSet *whiteList; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - whiteList = [NSSet setWithObjects: + whiteList = [NSMutableSet setWithObjects: @"UIFieldEditor", // UIAlertControllerTextField @"UINavigationBar", @"_UIAlertControllerActionView", + @"_UIVisualEffectBackdropView", nil]; + + // System's bug since iOS 10 and not fixed yet up to this ci. + NSString *systemVersion = [UIDevice currentDevice].systemVersion; + if ([systemVersion compare:@"10.0" options:NSNumericSearch] != NSOrderedAscending) { + [whiteList addObject:@"UISwitch"]; + } }); return whiteList; } diff --git a/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.h b/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.h new file mode 100644 index 0000000..1f89c91 --- /dev/null +++ b/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.h @@ -0,0 +1,18 @@ +// +// UITouch+MemoryLeak.h +// MLeaksFinder +// +// Created by 佘泽坡 on 8/31/16. +// Copyright © 2016 zeposhe. All rights reserved. +// + +#import +#import "MLeaksFinder.h" + +#if _INTERNAL_MLF_ENABLED + +@interface UITouch (MemoryLeak) + +@end + +#endif diff --git a/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.m b/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.m new file mode 100644 index 0000000..807ba8a --- /dev/null +++ b/Pods/MLeaksFinder/MLeaksFinder/UITouch+MemoryLeak.m @@ -0,0 +1,38 @@ +// +// UITouch+MemoryLeak.m +// MLeaksFinder +// +// Created by 佘泽坡 on 8/31/16. +// Copyright © 2016 zeposhe. All rights reserved. +// + +#import "UITouch+MemoryLeak.h" +#import + +#if _INTERNAL_MLF_ENABLED + +extern const void *const kLatestSenderKey; + +@implementation UITouch (MemoryLeak) + ++ (void)load { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + [self swizzleSEL:@selector(setView:) withSEL:@selector(swizzled_setView:)]; + }); +} + +- (void)swizzled_setView:(UIView *)view { + [self swizzled_setView:view]; + + if (view) { + objc_setAssociatedObject([UIApplication sharedApplication], + kLatestSenderKey, + @((uintptr_t)view), + OBJC_ASSOCIATION_RETAIN); + } +} + +@end + +#endif diff --git a/Pods/MLeaksFinder/MLeaksFinder/UIViewController+MemoryLeak.m b/Pods/MLeaksFinder/MLeaksFinder/UIViewController+MemoryLeak.m index 28e102b..f7dee54 100644 --- a/Pods/MLeaksFinder/MLeaksFinder/UIViewController+MemoryLeak.m +++ b/Pods/MLeaksFinder/MLeaksFinder/UIViewController+MemoryLeak.m @@ -59,7 +59,10 @@ - (BOOL)willDealloc { [self willReleaseChildren:self.childViewControllers]; [self willReleaseChild:self.presentedViewController]; - [self willReleaseChild:self.view]; + + if (self.isViewLoaded) { + [self willReleaseChild:self.view]; + } return YES; } diff --git a/Pods/MLeaksFinder/README-CN.md b/Pods/MLeaksFinder/README-CN.md new file mode 100644 index 0000000..b8e3d94 --- /dev/null +++ b/Pods/MLeaksFinder/README-CN.md @@ -0,0 +1,18 @@ +# FAQ +**1) 引进 MLeaksFinder 后没生效?** + +* 先验证引进是否正确,在 UIViewController+MemoryLeak.m 的 `+ (void)load` 方法里加断点,看 app 启动时有没有进入。 + +**2) 可以手动引进 MLeaksFinder 吗?** + +* 直接把 MLeaksFinder 的代码放到项目里即生效。如果把 MLeaksFinder 做为子工程,需要在主工程的 Build Settings -> Other Linker Flags 加上 `-ObjC`。 +* 只是引进 MLeaksFinder 的代码 Retain Cycle 功能还未生效,可以再手动加入 FBRetainCycleDetector 代码,然后把 MLeaksFinder.h 里的 `//#define MEMORY_LEAKS_FINDER_RETAIN_CYCLE_ENABLED 1` 打开。 + +**3) Fail to find a retain cycle?** + +* 内存泄漏不一定是循环引用造成的。 +* 有的循环引用 FBRetainCycleDetector 不一定能找出。 + +**4) 如何关掉 MLeaksFinder?** + +* 把 MLeaksFinder.h 里的 `//#define MEMORY_LEAKS_FINDER_ENABLED 0` 打开。 diff --git a/Pods/MLeaksFinder/README.md b/Pods/MLeaksFinder/README.md deleted file mode 100644 index 51456d4..0000000 --- a/Pods/MLeaksFinder/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# MLeaksFinder -MLeaksFinder helps you find memory leaks in your iOS apps at develop time. It can automatically find leaks in UIView and UIViewController objects, hit assertion and print the View-ViewController stack when leaks happening. You can also extend it to find leaks in other kinds of objects. - -# Communication -QQ group: 482121244 - -# Installation -- Download MLeaksFinder -- Add MLeaksFinder as a subproject -- Add MLeaksFinder to your Target Dependencies and Link Binary With Libraries -- Click your app's target, then "Build Settings", search for "Other Linker Flags", add '-ObjC' - -Or you can simply copy the source files into your project. - -## Installation with CocoaPods -``` -pod 'MLeaksFinder' -``` - -# Usage -MLeaksFinder can automatically find leaks in UIView and UIViewController objects. When leaks happening, it will hit assertion and print the leaked object in its View-ViewController stack. -``` -*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Possibly Memory Leak. -In case that MyTableViewCell should not be dealloced, override -willDealloc in MyTableViewCell by returning NO. -View-ViewController stack: ( - MyTableViewController, - UITableView, - UITableViewWrapperView, - MyTableViewCell -)' -``` - -## Mute Assertion -If your class is designed as singleton or for some reason objects of your class should not be dealloced, override -willDealloc in your class by returning NO. -```objc -- (BOOL)willDealloc { - return NO; -} -``` - -## Find Leaks in Other Objects -MLeaksFinder finds leaks in UIView and UIViewController objects by default. However, you can extend it to find leaks in the whole object graph rooted at a UIViewController object. -```objc -- (BOOL)willDealloc { - if (![super willDealloc]) { - return NO; - } - - MLCheck(self.viewModel); - return YES; -} -``` diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 4726b8a..2b23d46 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -14,89 +14,118 @@ PODS: - AFNetworking/Serialization (3.1.0) - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - - BAButton (1.0.1) - - BlocksKit (2.2.5): - - BlocksKit/All (= 2.2.5) - - BlocksKit/All (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - BlocksKit/MessageUI - - BlocksKit/UIKit - - BlocksKit/Core (2.2.5) - - BlocksKit/DynamicDelegate (2.2.5) - - BlocksKit/MessageUI (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - BlocksKit/UIKit (2.2.5): - - BlocksKit/Core - - BlocksKit/DynamicDelegate - - FBAllocationTracker (0.1.5) - - FBMemoryProfiler (0.1.3): - - FBAllocationTracker (~> 0.1) - - FBRetainCycleDetector (~> 0.1) - - FBRetainCycleDetector (0.1.2) - - IQKeyboardManager (4.0.4) + - BAAlert (1.1.9) + - BAButton (2.4.3) + - BaiduMapKit (3.3.2) + - BANetManager (2.2.2): + - AFNetworking + - YYCache + - BAPickView (1.0.3) + - BATextView (1.0.1) + - BATouchID (1.0.1) + - DZNEmptyDataSet (1.8.1) + - FBRetainCycleDetector (0.1.3) + - FMDB (2.7.2): + - FMDB/standard (= 2.7.2) + - FMDB/standard (2.7.2) + - IQKeyboardManager (4.0.10) - JMRoundedCorner (1.2.1) - - Masonry (0.6.4) + - Masonry (1.0.2) - MBProgressHUD (1.0.0) - - MJExtension (3.0.11) - - MJRefresh (3.1.10) - - MLeaksFinder (0.2.0): + - MJExtension (3.0.13) + - MJRefresh (3.1.12) + - MLeaksFinder (0.2.1): - FBRetainCycleDetector - - MyLayout (1.1.9) + - MyLayout (1.3.9) - NullSafe (1.2.2) - - SDAutoLayout (2.1.4) - - SDWebImage (3.7.6): - - SDWebImage/Core (= 3.7.6) - - SDWebImage/Core (3.7.6) - - UMengSocial (4.4) - - WebViewJavascriptBridge (5.0.5) - - YYKit (1.0.7): - - YYKit/no-arc (= 1.0.7) - - YYKit/no-arc (1.0.7) + - ReactiveObjC (3.0.0) + - SDAutoLayout (2.1.8) + - SDWebImage (4.0.0): + - SDWebImage/Core (= 4.0.0) + - SDWebImage/Core (4.0.0) + - UMengAnalytics-NO-IDFA (4.2.5) + - UMengUShare/Core (6.4.4): + - UMengUShare/Network + - UMengUShare/Network (6.4.4) + - UMengUShare/Social/AlipayShare (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/QQ (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedQQ + - UMengUShare/Social/ReducedQQ (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedSina (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedWeChat (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/Sina (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedSina + - UMengUShare/Social/WeChat (6.4.4): + - UMengUShare/Core + - UMengUShare/Social/ReducedWeChat + - UMengUShare/UI (6.4.4): + - UMengUShare/Core + - YYCache (1.0.4) DEPENDENCIES: - - AFNetworking (~> 3.0) - - BAButton (~> 1.0.1) - - BlocksKit - - FBMemoryProfiler + - AFNetworking + - BAAlert + - BAButton + - BaiduMapKit + - BANetManager + - BAPickView + - BATextView + - BATouchID + - DZNEmptyDataSet + - FMDB - IQKeyboardManager - JMRoundedCorner - - Masonry (~> 0.6.4) + - Masonry - MBProgressHUD - - MJExtension (~> 3.0.10) - - MJRefresh (~> 3.1.0) + - MJExtension + - MJRefresh - MLeaksFinder - - MyLayout (~> 1.1.6) + - MyLayout - NullSafe + - ReactiveObjC - SDAutoLayout - - SDWebImage (~> 3.7.5) - - UMengSocial (~> 4.4) - - WebViewJavascriptBridge (~> 5.0) - - YYKit + - SDWebImage + - UMengAnalytics-NO-IDFA + - UMengUShare/Social/AlipayShare + - UMengUShare/Social/QQ + - UMengUShare/Social/Sina + - UMengUShare/Social/WeChat + - UMengUShare/UI SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 - BAButton: bb8f74e5e167a7e01ce8c0a66eafc3245ebb8c31 - BlocksKit: 7f422b971407001178d181a43b99014ea2591fe6 - FBAllocationTracker: dfdca3f71aceca6a85e95e3c6ec76a9785eba0f1 - FBMemoryProfiler: 623fc5f8a61f7d02ec75c87e3b97c90f621d8b02 - FBRetainCycleDetector: 45462f9ed1af0cd77224a4cc4e6dacaca47371b4 - IQKeyboardManager: 4a6f83b540283c2645aaeba2bd8dc0f09b5c77f8 + BAAlert: 99fb0f11877797481623369032eb2ff788ae8ddb + BAButton: 5297ede563f199a8110b85a46f861217d92b1543 + BaiduMapKit: 5118390d63b375483bd64c963e8e32a40fd9ddb5 + BANetManager: bd2e6d0bcb5fc7397f3098b90c3bcf25a04127b5 + BAPickView: 0ddba863e40bf706bc4417c5bc2d220b74a46a1e + BATextView: 0514fcbc994a7abafc0a3addb35596fe56c1910c + BATouchID: 33732f62f7d656733a3208c94744c61806095d3c + DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7 + FBRetainCycleDetector: f0c7b290bf48ae77f6ae060843ce34ae341781eb + FMDB: 6198a90e7b6900cfc046e6bc0ef6ebb7be9236aa + IQKeyboardManager: 593ee99b88381f4b9ccb22bd680f22606351bd41 JMRoundedCorner: 214e56c2a7e3a0916e8d6040c66d85519cc1be87 - Masonry: 281802d04d787ea2973179ee8bcb50500579ede2 + Masonry: 7c429b56da9d4ee0bbb3ed77a5ea710d6a5df39e MBProgressHUD: 4890f671c94e8a0f3cf959aa731e9de2f036d71a - MJExtension: f9ae6ddc0f1c482c3c9af750280ccebd14381958 - MJRefresh: bb72948c985914b0b5cecac573a2c69a8915fb02 - MLeaksFinder: 07ab450d72d3bf5ef4201b74047d74ceae66d605 - MyLayout: a908e6a34cd9dc5320b6ac27b7fb419c6a8933d2 + MJExtension: 5932755f451458eefa24239358817f8d291240c7 + MJRefresh: b96cdb21c4aa75a7b07654311ab2f315c497e806 + MLeaksFinder: '0850e2f2abc7227adc4d4e2d1992b431264eb4d5' + MyLayout: 3d0450e4b5c404806929ea689ebbca6dea7ac45c NullSafe: cbf1f77a24558e49bc76e2673f31250d3087c792 - SDAutoLayout: 1b2926b193a63287f473dae426ed07861e21e271 - SDWebImage: c325cf02c30337336b95beff20a13df489ec0ec9 - UMengSocial: aba7296602310385114d82c255539a7bef3b7ab0 - WebViewJavascriptBridge: a4d502315f1b8d9a51cd6a9174147ed567ec3bc5 - YYKit: 843d1b26e20b82c695790c9a89907eaa1e99907f + ReactiveObjC: ce79989e8684b9086b5f8d0c74bc7b81a8729c9e + SDAutoLayout: 5a4b48d6b8a5172ae8d088d2879e40dd795e6251 + SDWebImage: 76a6348bdc74eb5a55dd08a091ef298e56b55e41 + UMengAnalytics-NO-IDFA: 16666e32edce5be44ae5b14aaaa7f3582e09d6ab + UMengUShare: cd54ae52958426b79aa9193a7b02058d6a6d9aa0 + YYCache: 8105b6638f5e849296c71f331ff83891a4942952 -PODFILE CHECKSUM: a2e7a9ca6e8652cd21e7bc06e38899dea225bf83 +PODFILE CHECKSUM: 8136b95a48adadabc0540614ee4d5836b1f967d8 -COCOAPODS: 1.0.1 +COCOAPODS: 1.2.1 diff --git a/Pods/Masonry/Masonry/MASConstraint.h b/Pods/Masonry/Masonry/MASConstraint.h index 655590b..70a10c8 100644 --- a/Pods/Masonry/Masonry/MASConstraint.h +++ b/Pods/Masonry/Masonry/MASConstraint.h @@ -127,6 +127,13 @@ - (MASConstraint *)centerY; - (MASConstraint *)baseline; +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +- (MASConstraint *)firstBaseline; +- (MASConstraint *)lastBaseline; + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV - (MASConstraint *)leftMargin; diff --git a/Pods/Masonry/Masonry/MASConstraint.m b/Pods/Masonry/Masonry/MASConstraint.m index 02d1f62..f24ec10 100644 --- a/Pods/Masonry/Masonry/MASConstraint.m +++ b/Pods/Masonry/Masonry/MASConstraint.m @@ -208,6 +208,17 @@ - (MASConstraint *)baseline { return [self addConstraintWithLayoutAttribute:NSLayoutAttributeBaseline]; } +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +- (MASConstraint *)firstBaseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline]; +} +- (MASConstraint *)lastBaseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline]; +} + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV - (MASConstraint *)leftMargin { diff --git a/Pods/Masonry/Masonry/MASConstraintMaker.h b/Pods/Masonry/Masonry/MASConstraintMaker.h index ad9e702..8f72b4c 100644 --- a/Pods/Masonry/Masonry/MASConstraintMaker.h +++ b/Pods/Masonry/Masonry/MASConstraintMaker.h @@ -22,6 +22,13 @@ typedef NS_OPTIONS(NSInteger, MASAttribute) { MASAttributeCenterY = 1 << NSLayoutAttributeCenterY, MASAttributeBaseline = 1 << NSLayoutAttributeBaseline, +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + + MASAttributeFirstBaseline = 1 << NSLayoutAttributeFirstBaseline, + MASAttributeLastBaseline = 1 << NSLayoutAttributeLastBaseline, + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV MASAttributeLeftMargin = 1 << NSLayoutAttributeLeftMargin, @@ -60,6 +67,13 @@ typedef NS_OPTIONS(NSInteger, MASAttribute) { @property (nonatomic, strong, readonly) MASConstraint *centerY; @property (nonatomic, strong, readonly) MASConstraint *baseline; +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +@property (nonatomic, strong, readonly) MASConstraint *firstBaseline; +@property (nonatomic, strong, readonly) MASConstraint *lastBaseline; + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV @property (nonatomic, strong, readonly) MASConstraint *leftMargin; diff --git a/Pods/Masonry/Masonry/MASConstraintMaker.m b/Pods/Masonry/Masonry/MASConstraintMaker.m index ecb5297..6e40a26 100644 --- a/Pods/Masonry/Masonry/MASConstraintMaker.m +++ b/Pods/Masonry/Masonry/MASConstraintMaker.m @@ -78,6 +78,9 @@ - (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs { __unused MASAttribute anyAttribute = (MASAttributeLeft | MASAttributeRight | MASAttributeTop | MASAttributeBottom | MASAttributeLeading | MASAttributeTrailing | MASAttributeWidth | MASAttributeHeight | MASAttributeCenterX | MASAttributeCenterY | MASAttributeBaseline +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + | MASAttributeFirstBaseline | MASAttributeLastBaseline +#endif #if TARGET_OS_IPHONE || TARGET_OS_TV | MASAttributeLeftMargin | MASAttributeRightMargin | MASAttributeTopMargin | MASAttributeBottomMargin | MASAttributeLeadingMargin | MASAttributeTrailingMargin | MASAttributeCenterXWithinMargins @@ -101,6 +104,13 @@ - (MASConstraint *)addConstraintWithAttributes:(MASAttribute)attrs { if (attrs & MASAttributeCenterY) [attributes addObject:self.view.mas_centerY]; if (attrs & MASAttributeBaseline) [attributes addObject:self.view.mas_baseline]; +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + + if (attrs & MASAttributeFirstBaseline) [attributes addObject:self.view.mas_firstBaseline]; + if (attrs & MASAttributeLastBaseline) [attributes addObject:self.view.mas_lastBaseline]; + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV if (attrs & MASAttributeLeftMargin) [attributes addObject:self.view.mas_leftMargin]; @@ -182,6 +192,19 @@ - (MASConstraint *)baseline { }; } +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +- (MASConstraint *)firstBaseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeFirstBaseline]; +} + +- (MASConstraint *)lastBaseline { + return [self addConstraintWithLayoutAttribute:NSLayoutAttributeLastBaseline]; +} + +#endif + + #if TARGET_OS_IPHONE || TARGET_OS_TV - (MASConstraint *)leftMargin { diff --git a/Pods/Masonry/Masonry/MASViewConstraint.m b/Pods/Masonry/Masonry/MASViewConstraint.m index a70865b..84a801e 100644 --- a/Pods/Masonry/Masonry/MASViewConstraint.m +++ b/Pods/Masonry/Masonry/MASViewConstraint.m @@ -175,6 +175,7 @@ - (void)setSecondViewAttribute:(id)secondViewAttribute { NSMutableArray *children = NSMutableArray.new; for (id attr in attribute) { MASViewConstraint *viewConstraint = [self copy]; + viewConstraint.layoutRelation = relation; viewConstraint.secondViewAttribute = attr; [children addObject:viewConstraint]; } @@ -288,24 +289,11 @@ - (void)setCenterOffset:(CGPoint)centerOffset { #pragma mark - MASConstraint - (void)activate { - if ([self supportsActiveProperty] && self.layoutConstraint) { - if (self.hasBeenInstalled) { - return; - } - self.layoutConstraint.active = YES; - [self.firstViewAttribute.view.mas_installedConstraints addObject:self]; - } else { - [self install]; - } + [self install]; } - (void)deactivate { - if ([self supportsActiveProperty]) { - self.layoutConstraint.active = NO; - [self.firstViewAttribute.view.mas_installedConstraints removeObject:self]; - } else { - [self uninstall]; - } + [self uninstall]; } - (void)install { @@ -313,6 +301,12 @@ - (void)install { return; } + if ([self supportsActiveProperty] && self.layoutConstraint) { + self.layoutConstraint.active = YES; + [self.firstViewAttribute.view.mas_installedConstraints addObject:self]; + return; + } + MAS_VIEW *firstLayoutItem = self.firstViewAttribute.item; NSLayoutAttribute firstLayoutAttribute = self.firstViewAttribute.layoutAttribute; MAS_VIEW *secondLayoutItem = self.secondViewAttribute.item; @@ -387,6 +381,12 @@ - (MASLayoutConstraint *)layoutConstraintSimilarTo:(MASLayoutConstraint *)layout } - (void)uninstall { + if ([self supportsActiveProperty]) { + self.layoutConstraint.active = NO; + [self.firstViewAttribute.view.mas_installedConstraints removeObject:self]; + return; + } + [self.installedView removeConstraint:self.layoutConstraint]; self.layoutConstraint = nil; self.installedView = nil; diff --git a/Pods/Masonry/Masonry/NSArray+MASAdditions.m b/Pods/Masonry/Masonry/NSArray+MASAdditions.m index da094cb..831d8cd 100644 --- a/Pods/Masonry/Masonry/NSArray+MASAdditions.m +++ b/Pods/Masonry/Masonry/NSArray+MASAdditions.m @@ -53,7 +53,7 @@ - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGF if (prev) { make.width.equalTo(prev); make.left.equalTo(prev.mas_right).offset(fixedSpacing); - if (i == (CGFloat)self.count - 1) {//last one + if (i == self.count - 1) {//last one make.right.equalTo(tempSuperView).offset(-tailSpacing); } } @@ -73,7 +73,7 @@ - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedSpacing:(CGF if (prev) { make.height.equalTo(prev); make.top.equalTo(prev.mas_bottom).offset(fixedSpacing); - if (i == (CGFloat)self.count - 1) {//last one + if (i == self.count - 1) {//last one make.bottom.equalTo(tempSuperView).offset(-tailSpacing); } } @@ -99,19 +99,18 @@ - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedItemLength:( for (int i = 0; i < self.count; i++) { MAS_VIEW *v = self[i]; [v mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.equalTo(@(fixedItemLength)); if (prev) { - CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1)); - make.width.equalTo(@(fixedItemLength)); - if (i == (CGFloat)self.count - 1) {//last one + if (i == self.count - 1) {//last one make.right.equalTo(tempSuperView).offset(-tailSpacing); } else { + CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1)); make.right.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset); } } else {//first one make.left.equalTo(tempSuperView).offset(leadSpacing); - make.width.equalTo(@(fixedItemLength)); } }]; prev = v; @@ -122,19 +121,18 @@ - (void)mas_distributeViewsAlongAxis:(MASAxisType)axisType withFixedItemLength:( for (int i = 0; i < self.count; i++) { MAS_VIEW *v = self[i]; [v mas_makeConstraints:^(MASConstraintMaker *make) { + make.height.equalTo(@(fixedItemLength)); if (prev) { - CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1)); - make.height.equalTo(@(fixedItemLength)); - if (i == (CGFloat)self.count - 1) {//last one + if (i == self.count - 1) {//last one make.bottom.equalTo(tempSuperView).offset(-tailSpacing); } else { + CGFloat offset = (1-(i/((CGFloat)self.count-1)))*(fixedItemLength+leadSpacing)-i*tailSpacing/(((CGFloat)self.count-1)); make.bottom.equalTo(tempSuperView).multipliedBy(i/((CGFloat)self.count-1)).with.offset(offset); } } else {//first one make.top.equalTo(tempSuperView).offset(leadSpacing); - make.height.equalTo(@(fixedItemLength)); } }]; prev = v; diff --git a/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m b/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m index 18c93f2..3569cf8 100644 --- a/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m +++ b/Pods/Masonry/Masonry/NSLayoutConstraint+MASDebugAdditions.m @@ -44,6 +44,11 @@ + (NSDictionary *)layoutAttributeDescriptionsByValue { @(NSLayoutAttributeCenterY) : @"centerY", @(NSLayoutAttributeBaseline) : @"baseline", +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + @(NSLayoutAttributeFirstBaseline) : @"firstBaseline", + @(NSLayoutAttributeLastBaseline) : @"lastBaseline", +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV @(NSLayoutAttributeLeftMargin) : @"leftMargin", @(NSLayoutAttributeRightMargin) : @"rightMargin", diff --git a/Pods/Masonry/Masonry/View+MASAdditions.h b/Pods/Masonry/Masonry/View+MASAdditions.h index 66bd66c..ab1e8ae 100644 --- a/Pods/Masonry/Masonry/View+MASAdditions.h +++ b/Pods/Masonry/Masonry/View+MASAdditions.h @@ -32,6 +32,13 @@ @property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline; @property (nonatomic, strong, readonly) MASViewAttribute *(^mas_attribute)(NSLayoutAttribute attr); +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +@property (nonatomic, strong, readonly) MASViewAttribute *mas_firstBaseline; +@property (nonatomic, strong, readonly) MASViewAttribute *mas_lastBaseline; + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV @property (nonatomic, strong, readonly) MASViewAttribute *mas_leftMargin; diff --git a/Pods/Masonry/Masonry/View+MASAdditions.m b/Pods/Masonry/Masonry/View+MASAdditions.m index e7c4e22..b53b68d 100644 --- a/Pods/Masonry/Masonry/View+MASAdditions.m +++ b/Pods/Masonry/Masonry/View+MASAdditions.m @@ -87,6 +87,17 @@ - (MASViewAttribute *)mas_baseline { }; } +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +- (MASViewAttribute *)mas_firstBaseline { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeFirstBaseline]; +} +- (MASViewAttribute *)mas_lastBaseline { + return [[MASViewAttribute alloc] initWithView:self layoutAttribute:NSLayoutAttributeLastBaseline]; +} + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV - (MASViewAttribute *)mas_leftMargin { diff --git a/Pods/Masonry/Masonry/View+MASShorthandAdditions.h b/Pods/Masonry/Masonry/View+MASShorthandAdditions.h index fc93c63..0446056 100644 --- a/Pods/Masonry/Masonry/View+MASShorthandAdditions.h +++ b/Pods/Masonry/Masonry/View+MASShorthandAdditions.h @@ -29,6 +29,13 @@ @property (nonatomic, strong, readonly) MASViewAttribute *baseline; @property (nonatomic, strong, readonly) MASViewAttribute *(^attribute)(NSLayoutAttribute attr); +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +@property (nonatomic, strong, readonly) MASViewAttribute *firstBaseline; +@property (nonatomic, strong, readonly) MASViewAttribute *lastBaseline; + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV @property (nonatomic, strong, readonly) MASViewAttribute *leftMargin; @@ -67,6 +74,13 @@ MAS_ATTR_FORWARD(centerX); MAS_ATTR_FORWARD(centerY); MAS_ATTR_FORWARD(baseline); +#if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 80000) || (__TV_OS_VERSION_MIN_REQUIRED >= 9000) || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101100) + +MAS_ATTR_FORWARD(firstBaseline); +MAS_ATTR_FORWARD(lastBaseline); + +#endif + #if TARGET_OS_IPHONE || TARGET_OS_TV MAS_ATTR_FORWARD(leftMargin); diff --git a/Pods/Masonry/README.md b/Pods/Masonry/README.md index 966ba7a..2b59a48 100644 --- a/Pods/Masonry/README.md +++ b/Pods/Masonry/README.md @@ -1,4 +1,4 @@ -#Masonry [![Build Status](https://travis-ci.org/SnapKit/Masonry.svg?branch=master)](https://travis-ci.org/SnapKit/Masonry) [![Coverage Status](https://img.shields.io/coveralls/SnapKit/Masonry.svg?style=flat-square)](https://coveralls.io/r/SnapKit/Masonry) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +#Masonry [![Build Status](https://travis-ci.org/SnapKit/Masonry.svg?branch=master)](https://travis-ci.org/SnapKit/Masonry) [![Coverage Status](https://img.shields.io/coveralls/SnapKit/Masonry.svg?style=flat-square)](https://coveralls.io/r/SnapKit/Masonry) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) ![Pod Version](https://img.shields.io/cocoapods/v/Masonry.svg?style=flat) **Masonry is still actively maintained, we are committed to fixing bugs and merging good quality PRs from the wider community. However if you're using Swift in your project, we recommend using [SnapKit](https://github.com/SnapKit/SnapKit) as it provides better type safety with a simpler API.** @@ -12,7 +12,7 @@ For examples take a look at the **Masonry iOS Examples** project in the Masonry Under the hood Auto Layout is a powerful and flexible way of organising and laying out your views. However creating constraints from code is verbose and not very descriptive. Imagine a simple example in which you want to have a view fill its superview but inset by 10 pixels on every side ```obj-c -UIView *superview = self; +UIView *superview = self.view; UIView *view1 = [[UIView alloc] init]; view1.translatesAutoresizingMaskIntoConstraints = NO; @@ -274,7 +274,7 @@ Alternatively if you are only updating the constant value of the constraint you ### 3. mas_remakeConstraints `mas_updateConstraints` is useful for updating a set of constraints, but doing anything beyond updating constant values can get exhausting. That's where `mas_remakeConstraints` comes in. -`mas_remakeConstraints` is similar to `mas_updateConstraints`, but instead of updating constant values, it will remove all of its contraints before installing them again. This lets you provide different constraints without having to keep around references to ones which you want to remove. +`mas_remakeConstraints` is similar to `mas_updateConstraints`, but instead of updating constant values, it will remove all of its constraints before installing them again. This lets you provide different constraints without having to keep around references to ones which you want to remove. ```obj-c - (void)changeButtonPosition { diff --git a/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.h b/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.h index e0bb16c..b7cc47c 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.h @@ -8,9 +8,21 @@ #import "MyLayoutDef.h" #import "MyLayoutPos.h" -#import "MyLayoutDime.h" +#import "MyLayoutSize.h" #import "MyLayoutSizeClass.h" +/* + 几种视图类型的定义: +1.布局视图: 就是从MyBaseLayout派生而出的视图,目前MyLayout中一共有:线性布局、框架布局、相对布局、表格布局、流式布局、浮动布局、路径布局7种布局。 布局视图也是一个视图。 +2.非布局视图: 除上面说的7种布局视图外的所有视图和控件。 +3.布局父视图: 如果某个视图的父视图是一个布局视图,那么这个父视图就是布局父视图。 +4.非布局父视图:如果某个视图的父视图不是一个布局视图,那么这个父视图就是非布局父视图。 +5.布局子视图: 如果某个视图的子视图是一个布局视图,那么这个子视图就是布局子视图。 +6.非布局子视图:如果某个视图的子视图不是一个布局视图,那么这个子视图就是非布局子视图。 +*/ + + +@class MyBaseLayout; @interface UIView(MyLayoutExt) @@ -40,6 +52,8 @@ |Vert MyFloatLayout | - | T,B,R,L | - | - | - | - | - | |--------------------+------------------+----------------------+---------------+-----------+--------------------+-------+-------| |Horz MyFloatLayout | - | T,B,R,L | - | - | - | - | - | + |--------------------+------------------+----------------------+---------------+-----------+--------------------+-------+-------| + |MyPathLayout | - | T,L | - | - | - | - | - | +--------------------+------------------+----------------------+---------------+-----------+--------------------+-------+-------+ *上面表格中L=leftPos, R=rightPos, T=topPos, B=bottomPos,CX=centerXPos,CY=centerYPos,ALL是所有布局位置对象,-表示不支持。 @@ -51,8 +65,10 @@ Scene2:布局位置对象的值设置为数值,且表示的是视图之间的间距。所谓间距就是指视图和其他视图之间的距离。这里要注意边距和间距的区别,边距是子视图和父视图之间的距离,间距是子视图和兄弟视图之间的距离。 比如垂直线性布局视图L分别添加了A,B两个子视图则设置A.topPos.equalTo(10),A.bottomPos.equalTo(10),B.topPos.equalTo(10)的意思是A的顶部间距是10,底部间距也是10。视图B的顶部间距10。这样视图B和视图A之间的间距就是20 - Scene3:布局位置对象的值设置为大于0且小于1的数值,表示视图之间的相对距离。 - 相对距离的最终距离 = (布局视图尺寸 - 所有固定尺寸和间距的视图) * 当前视图的相对距离 /(所有子视图相对距离的总和) + Scene3:布局位置对象的值设置为大于0且小于1的数值,表示视图之间的相对间距值或者边距值。 + 视图的相对间距的最终距离 = (布局视图尺寸 - 所有固定尺寸和固定间距之和) * 当前视图的相对间距值 /(所有子视图相对间距的总和) + 视图的相对边距的最终距离 = 布局视图尺寸 * 当前视图的相对边距值 + Scene4:布局位置对象的值设置为MyLayoutPos对象,表示某个位置依赖于另外一个位置。只有在相对布局中的子视图的布局位置对象的位置值才能设置为MyLayoutPos对象。 比如: A.leftPos.equalTo(B.rightPos)表示视图A的左边等于视图B的右边。 @@ -66,12 +82,10 @@ Scene7:当同时设置了topPos和bottomPos上下边距后就能确定出视图的布局高度了,这样就不需要为子视图指定布局高度值了。需要注意的是只有同时设置了上下边距才能确定视图的高度,而设置上下间距是则不能。 比如:某个布局布局视图高度是100,而某个子视图的topPos.equalTo(@10),bottomPos.equalTo(@20).则这个子视图的高度=70(100-10-20) + 另外如果某个布局视图是视图控制器的根视图,那么你可以将布局视图里面的第一个子视图的topPos设置为: topPos.equalTo(vc.topLayoutGuide) 或者最后一个子视图的bottomPos设置为bottomPos.equalTo(vc.bottomLayoutGuide) 这样不管视图控制器所在的导航条是否半透明,总是会显示在导航条下面的位置。。 + */ -/** - *视图的左边布局位置对象。(left layout position of the view.) - */ -@property(nonatomic, readonly) MyLayoutPos *leftPos; /** *视图的上边布局位置对象。(top layout position of the view.) @@ -79,15 +93,23 @@ @property(nonatomic, readonly) MyLayoutPos *topPos; /** - *视图的右边布局位置对象。(right layout position of the view.) + *视图的头部布局位置对象,对于非阿拉伯国家就是左边,对于阿拉伯国家就是右边(leading layout position of the view.) */ -@property(nonatomic, readonly) MyLayoutPos *rightPos; +@property(nonatomic, readonly) MyLayoutPos *leadingPos; + /** *视图的下边布局位置对象。(bottom layout position of the view.) */ @property(nonatomic, readonly) MyLayoutPos *bottomPos; + +/** + *视图的尾部布局位置对象,对于非阿拉伯国家就是右边,对于阿拉伯国家就是左边。(trailing layout position of the view.) + */ +@property(nonatomic, readonly) MyLayoutPos *trailingPos; + + /** *视图的水平中心布局位置对象。(horizontal center layout position of the view.) */ @@ -100,24 +122,49 @@ +/** + *视图的左边布局位置对象。如果您不考虑国际化布局就用这个属性,如果考虑国际化则请用leadingPos(left layout position of the view.) + */ +@property(nonatomic, readonly) MyLayoutPos *leftPos; + +/** + *视图的右边布局位置对象。如果您不考虑国际化布局就用这个属性,如果考虑国际化则请用trailingPos(right layout position of the view.) + */ +@property(nonatomic, readonly) MyLayoutPos *rightPos; + + + + + /* 下面定义的八个属性是上面定义的leftPos,topPos,rightPos,bottomPos,centerXPos,centerYPos的equalTo设置NSNumber类型的值时的简化版本。 比如: - v.myLeftMargin = 10 <==> v.leftPos.equalTo(@10) - v.myRightMargin = 20 <==> v.rightPos.equalTo(@20) - v.myCenterXOffset = 0 <==> v.centerXPos.equalTo(@0) + v.myLeft = 10 <==> v.leftPos.equalTo(@10) + v.myRight = 20 <==> v.rightPos.equalTo(@20) + v.myCenterX = 0 <==> v.centerXPos.equalTo(@0) 这八个属性的值最好别用于读取,而只是单纯用于设置 + + 这要再次区分一下边距和间距和概念,所谓边距是指子视图距离父视图的距离;而间距则是指子视图距离兄弟视图的距离。myLeft,myRight,myTop,myBottom这几个子视图的扩展属性即可用来表示边距也可以用来表示间距,这个要根据子视图所归属的父布局视图的类型而确定: + + 1.垂直线性布局MyLinearLayout中的子视图: myLeft,myRight表示边距,而myTop,myBottom则表示间距。 + 2.水平线性布局MyLinearLayout中的子视图: myLeft,myRight表示间距,而myTop,myBottom则表示边距。 + 3.表格布局中的子视图: myLeft,myRight,myTop,myBottom的定义和线性布局是一致的。 + 4.框架布局MyFrameLayout中的子视图: myLeft,myRight,myTop,myBottom都表示边距。 + 5.相对布局MyRelativeLayout中的子视图: myLeft,myRight,myTop,myBottom都表示边距。 + 6.流式布局MyFlowLayout中的子视图: myLeft,myRight,myTop,myBottom都表示间距。 + 7.浮动布局MyFloatLayout中的子视图: myLeft,myRight,myTop,myBottom都表示间距。 + 8.路径布局MyPathLayout中的子视图: myLeft,myRight,myTop,myBottom即不表示间距也不表示边距,它表示自己中心位置的偏移量。 + 9.非布局父视图中的布局子视图: myLeft,myRight,myTop,myBottom都表示边距。 + 10.非布局父视图中的非布局子视图: myLeft,myRight,myTop,myBottom的设置不会起任何作用,因为MyLayout已经无法控制了。 + + 再次强调的是: + 1. 如果同时设置了左右边距就能决定自己的宽度,同时设置左右间距不能决定自己的宽度! + 2. 如果同时设置了上下边距就能决定自己的高度,同时设置上下间距不能决定自己的高度! */ -/** - *视图左边的布局位置, 是leftPos.equalTo方法的简化版本 - */ -/** - *Left layout position of the view. Equivalent to leftPos.equalTo(NSNumber). - */ -@property(nonatomic, assign) IBInspectable CGFloat myLeftMargin; + /** *视图上边的布局位置, 是topPos.equalTo方法的简化版本 @@ -125,15 +172,17 @@ /** *Top layout position of the view. Equivalent to topPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myTopMargin; +@property(nonatomic, assign) IBInspectable CGFloat myTop; + /** - *视图右边的布局位置, 是rightPos.equalTo方法的简化版本 + *视图头部的布局位置, 是leadingPos.equalTo方法的简化版本 */ /** - *Right layout position of the view. Equivalent to rightPos.equalTo(NSNumber). + *Leading layout position of the view. Equivalent to leadingPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myRightMargin; +@property(nonatomic, assign) IBInspectable CGFloat myLeading; + /** *视图下边的布局位置, 是bottomPos.equalTo方法的简化版本 @@ -141,15 +190,17 @@ /** *Bottom layout position of the view. Equivalent to bottomPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myBottomMargin; +@property(nonatomic, assign) IBInspectable CGFloat myBottom; + /** - *视图四边的布局位置, 是myLeftMargin,myTopMargin,myRightMargin,myBottomMargin的简化版本 + *视图尾部的布局位置, 是trailingPos.equalTo方法的简化版本 */ /** - *Boundary layout position of the view. Equivalent to myLeftMargin,myTopMargin,myRightMargin,myBottomMargin set to the same number. + *Trailing layout position of the view. Equivalent to trailingPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myMargin; +@property(nonatomic, assign) IBInspectable CGFloat myTrailing; + /** *视图水平中心布局位置, 是centerXPos.equalTo方法的简化版本 @@ -157,7 +208,7 @@ /** *Horizontal center layout position of the view. Equivalent to centerXPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myCenterXOffset; +@property(nonatomic, assign) IBInspectable CGFloat myCenterX; /** *视图垂直中心布局位置, 是centerYPos.equalTo方法的简化版本 @@ -165,215 +216,668 @@ /** *Vertical center layout position of the view. Equivalent to centerYPos.equalTo(NSNumber). */ -@property(nonatomic, assign) IBInspectable CGFloat myCenterYOffset; +@property(nonatomic, assign) IBInspectable CGFloat myCenterY; /** - *视图中心布局位置, 是myCenterXOffset,myCenterYOffset方法的简化版本 + *视图中心布局位置, 是myCenterX,myCenterY方法的简化版本 */ /** - *Center layout position of the view. Equivalent to set myCenterXOffset and myCenterYOffset . + *Center layout position of the view. Equivalent to set myCenterX and myCenterY . */ -@property(nonatomic, assign) IBInspectable CGPoint myCenterOffset; +@property(nonatomic, assign) IBInspectable CGPoint myCenter; + + +/** + *视图左边的布局位置, 是leftPos.equalTo方法的简化版本 + */ +/** + *Left layout position of the view. Equivalent to leftPos.equalTo(NSNumber). + */ +@property(nonatomic, assign) IBInspectable CGFloat myLeft; + + +/** + *视图右边的布局位置, 是rightPos.equalTo方法的简化版本 + */ +/** + *Right layout position of the view. Equivalent to rightPos.equalTo(NSNumber). + */ +@property(nonatomic, assign) IBInspectable CGFloat myRight; + + + +/** + *视图四边的布局位置, 是myLeading,myTop,myTrailing,myBottom的简化版本 + */ +/** + *Boundary layout position of the view. Equivalent to myLeading,myTop,myTrailing,myBottom set to the same number. + */ +@property(nonatomic, assign) IBInspectable CGFloat myMargin; + +/** + *leading and trailing margin of the view to the superview. Equivalent to myLeading,myTrailing set to the same number + */ +@property(nonatomic, assign) IBInspectable CGFloat myHorzMargin; + +/** + *top and bottom margin of the view to the superview. Equivalent to myTop,myBottom set to the same number + */ +@property(nonatomic, assign) IBInspectable CGFloat myVertMargin; + /* - 视图的布局尺寸对象MyLayoutDime,用于设置视图的宽度和高度尺寸。视图可以通过设置frame值来设置自身的尺寸,也可以通过设置widthDime和heightDime来 - 设置布局尺寸,通过frame设置的结果会立即生效,而通过widthDime和heightDime设置则会在布局后才生效,如果同时设置了frame值和MyLayoutDime值则MyLayoutDime的设置值优先。 + 视图的布局尺寸对象MyLayoutSize,用于设置视图的宽度和高度尺寸。视图可以通过设置frame值来设置自身的尺寸,也可以通过设置widthSize和heightSize来 + 设置布局尺寸,通过frame设置的结果会立即生效,而通过widthSize和heightSize设置则会在布局后才生效,如果同时设置了frame值和MyLayoutSize值则MyLayoutSize的设置值优先。 其中的equalTo方法可用于设置布局尺寸的具体值: - 1.如果设置为NSNumber则表示布局尺寸是一个具体的数值。比如widthDime.equalTo(@20)表示视图的宽度设置为20个点。 - 2.如果设置为MyLayoutDime则表示布局尺寸依赖于另外一个视图的布局尺寸。比如A.widthDime.equalTo(B.widthDime)表示A的宽度和B的宽度相等 - 3.如果设置为NSArray则表示视图和数组里面的视图均分布局视图的宽度或者高度。比如A.widthDime.equalTo(@[B.widthDime,C.widthDime])表示视图A,B,C三个视图均分父视图的宽度。 + 1.如果设置为NSNumber则表示布局尺寸是一个具体的数值。比如widthSize.equalTo(@20)表示视图的宽度设置为20个点。 + 2.如果设置为MyLayoutSize则表示布局尺寸依赖于另外一个视图的布局尺寸。比如A.widthSize.equalTo(B.widthSize)表示A的宽度和B的宽度相等 + 3.如果设置为NSArray则表示视图和数组里面的视图均分布局视图的宽度或者高度。比如A.widthSize.equalTo(@[B.widthSize,C.widthSize])表示视图A,B,C三个视图均分父视图的宽度。 4.如果设置为nil则表示取消布局尺寸的值的设置。 - 其中的add方法可以用于设置布局尺寸的增加值,一般只和equalTo设置为MyLayoutDime和NSArray时配合使用。比如A.widthDime.equalTo(B.widthDime).add(20)表示视图A的宽度等于视图B的宽度再加上20个点。 + 其中的add方法可以用于设置布局尺寸的增加值,一般只和equalTo设置为MyLayoutSize和NSArray时配合使用。比如A.widthSize.equalTo(B.widthSize).add(20)表示视图A的宽度等于视图B的宽度再加上20个点。 - 其中的multiply方法可用于设置布局尺寸放大的倍数值。比如A.widthDime.equalTo(B.widthDime).multiply(2)表示视图A的宽度是视图B的宽度的2倍。 + 其中的multiply方法可用于设置布局尺寸放大的倍数值。比如A.widthSize.equalTo(B.widthSize).multiply(2)表示视图A的宽度是视图B的宽度的2倍。 - 其中的min,max表示用来设置布局尺寸的最大最小值。比如A.widthDime.min(10).max(40)表示宽度的最小是10最大是40。 + 其中的min,max表示用来设置布局尺寸的最大最小值。比如A.widthSize.min(10).max(40)表示宽度的最小是10最大是40。 下面的表格描述了在各种布局下的子视图的布局尺寸对象的equalTo方法可以设置的值。 为了表示方便我们把: 线性布局简写为L、垂直线性布局简写为L-V、水平线性布局简写为L-H 相对布局简写为R、表格布局简写为T、框架布局简写为FR、 流式布局简写为FL、垂直流式布局简写为FL-V,水平流式布局简写为FL-H、浮动布局简写为FO、左右浮动布局简写为FO-V、上下浮动布局简写为FO-H、 - 全部简写为ALL,不支持为-, + 路径布局简写为P、全部简写为ALL,不支持为-, 定义A为操作的视图本身,B为A的兄弟视图,P为A的父视图。 - +-------------+----------+-------------+--------------+------------+--------------+---------------+--------------+----------------------+ - | 对象 \ 值 | NSNumber |A.widthDime |A.heightDime |B.widthDime | B.heightDime | P.widthDime|P.heightDime |NSArray| - +-------------+----------+-------------+--------------+------------+--------------+---------------+--------------+----------------------+ - |A.widthDime | ALL |ALL |FR/R/FL-H/FO |FR/R/FO | R |L/FR/R/FL/FO | R |R | - +-------------+----------+-------------+--------------+------------+--------------+---------------+--------------+----------------------+ - |A.heightDime | ALL |FR/R/FL-V/FO |ALL |R |FR/R/FO |R |L/FR/R/FL/FO |R | - +-------------+----------+-------------+--------------+------------+--------------+---------------+--------------+----------------------+ + +-------------+----------+--------------+---------------+------------+--------------+---------------+--------------+----------------------+ + | 对象 \ 值 | NSNumber |A.widthSize |A.heightSize |B.widthSize | B.heightSize | P.widthSize |P.heightSize |NSArray| + +-------------+----------+--------------+---------------+------------+--------------+---------------+--------------+----------------------+ + |A.widthSize | ALL |ALL |FR/R/FL-H/FO/LH|FR/R/FO/P | R |L/FR/R/FL/FO/P | R |R | + +-------------+----------+--------------+---------------+------------+--------------+---------------+--------------+----------------------+ + |A.heightSize | ALL |FR/R/FL-V/FO/L|ALL |R |FR/R/FO/P |R |L/FR/R/FL/FO/P|R | + +-------------+----------+--------------+---------------+------------+--------------+---------------+--------------+----------------------+ 上表中所有的布局尺寸的值都支持设置为数值,而且所有布局下的子视图的宽度和高度尺寸都可以设置为等于自身的宽度和高度尺寸,布局库这里做了特殊处理,是不会造成循环引用的。比如: - A.widthDime.equalTo(A.widthDime),支持这种设置的原因是有时候比如希望某个UILabel的宽度是在其本身内容宽度的基础上再添加一个增加值,这时候就可以设置如下: - A.widthDime.equalTo(A.widthDime).add(30); + A.widthSize.equalTo(A.widthSize),支持这种设置的原因是有时候比如希望某个UILabel的宽度是在其本身内容宽度的基础上再添加一个增加值,这时候就可以设置如下: + A.widthSize.equalTo(A.widthSize).add(30); 表示视图A的宽度总是视图内容的宽度+30,这样即使视图调用了sizeToFit方法来计算出包裹内容的宽度,但是最终的布局宽度还是会再增加30个点。 */ /** - the MyLayoutDime is layout dimension object object of the UIView. used to set the width and height of the View which is in Layout View + the MyLayoutSize is layout dimension object object of the UIView. used to set the width and height of the View which is in Layout View */ /** - *视图的宽度布局尺寸对象,可以通过其中的euqalTo方法来设置NSNumber,MyLayoutDime,NSArray,nil这四种值 + *视图的宽度布局尺寸对象,可以通过其中的euqalTo方法来设置NSNumber,MyLayoutSize,NSArray,nil这四种值 */ -@property(nonatomic, readonly) MyLayoutDime *widthDime; +@property(nonatomic, readonly) MyLayoutSize *widthSize; /** - *视图的高度布局尺寸对象,可以通过其中的euqalTo方法来设置NSNumber,MyLayoutDime,NSArray,nil这四种值 + *视图的高度布局尺寸对象,可以通过其中的euqalTo方法来设置NSNumber,MyLayoutSize,NSArray,nil这四种值 */ -@property(nonatomic, readonly) MyLayoutDime *heightDime; +@property(nonatomic, readonly) MyLayoutSize *heightSize; /* - 下面三个属性是上面widthDime,heightDime的equalTo设置NSNumber类型值的简化版本,表示设置视图的高度和宽度的布局尺寸。 + 下面三个属性是上面widthSize,heightSize的equalTo设置NSNumber类型值的简化版本,表示设置视图的高度和宽度的布局尺寸。 需要注意的是设置这三个值并不是直接设置frame里面的size的宽度和高度,而是设置的是布局尺寸的数值 - v.myWidth = 10 <=> v.widthDime.equalTo(@10) - v.myHeight = 20 <=> v.heightDime.equalTo(@10) + v.myWidth = 10 <=> v.widthSize.equalTo(@10) + v.myHeight = 20 <=> v.heightSize.equalTo(@10) 这三个属性的值最好别用于读取,而只是单纯用于设置 */ /** - *视图的宽度布局尺寸,是widthDime.equalTo方法的简化版本 + *视图的宽度布局尺寸,是widthSize.equalTo方法的简化版本 */ @property(nonatomic,assign) IBInspectable CGFloat myWidth; /** - *视图的高度布局尺寸,是heightDime.equalTo方法的简化版本 + *视图的高度布局尺寸,是heightSize.equalTo方法的简化版本 */ @property(nonatomic,assign) IBInspectable CGFloat myHeight; /** *视图的宽度高度布局尺寸,是myWidth,myHeight方法的简化版本 */ -@property(nonatomic,assign) IBInspectable CGSize mySize; +@property(nonatomic,assign) IBInspectable CGSize mySize; + +/** + *视图的宽度包裹属性,表示视图的宽度由所有子视图的整体宽度来确定或者根据视图内容来宽度自适应。默认值是NO(水平线性布局默认这个属性是YES),表示必须要明确指定视图的宽度,而当设置为YES时则不需要明确的指定视图的宽度了。这个属性不能和widthSize(或者设置了左右边距)同时设置否则可能会产生约束冲突,因为前者表明宽度由子视图或者内容来决定而后者则表示宽度是一个明确的值。如果同时设置了宽度包裹属性又同时设置了明确的宽度则系统会出现约束冲突告警,虽然如此,系统在布局时做了一些优化,如果同时设置了明确的宽度和宽度包裹则会在布局前将宽度包裹属性置为NO。 + */ +@property(nonatomic,assign) IBInspectable BOOL wrapContentWidth; /** - *视图的高度根据内容自适应。当设置为YES时视图会在固定宽度的情况下自动调整高度来自适应视图的内容,默认设置为NO。这个属性主要用于UILabel,UITextView以及实现了sizeThatFits方法的视图,当设置这个属性为YES时,视图的宽度必须要明确的被指定。UILabel在使用这个属性时请同时设置numberOfLines不等于1。UITextView可以用这个属性以及heightDime中的max方法来实现到达指定的高度后若继续输入则产生滚动的效果。UIImageView可以用这个属性来在确定宽度的情况下高度根据宽度的缩放情况进行等比例的缩放。 + *视图的高度包裹属性,表示视图的高度由所有子视图的整体高度来确定或者根据视图内容来高度自适应。默认值是NO(垂直线性布局默认这个属性是YES),表示必须要明确指定布局的高度,而当设置为YES时则不需要明确的指定视图的高度了。这个属性不能和heightSize(或者设置了上下边距)同时设置否则可能会产生约束冲突,因为前者表明高度由子视图或者内容来决定而后者则表示高度是一个明确的值。如果同时设置了高度包裹属性又同时设置了明确的高度则系统会出现约束冲突告警,虽然如此,系统在布局时做了一些优化,如果同时设置了明确的高度和高度包裹则会在布局前将高度包裹属性置为NO。如果某个非布局视图指定了明确的宽度,而又将这个属性设置为了YES的话就能实现在固定宽度的情况下视图的高度根据内容自适应的效果,这个特性主要用于UILabel,UITextView以及实现了sizeThatFits方法的视图来实现高度根据内容自适应的场景。UILabel在使用这个属性时会自动设置numberOfLines为0,因此如果您要修改numberOfLines则需要在设置这个属性后进行;UITextView可以用这个属性以及heightSize中的max方法来实现到达指定的高度后若继续输入则产生滚动的效果;UIImageView可以用这个属性来在实现在确定宽度的情况下高度根据宽度的缩放情况进行等比例的缩放。 */ -@property(nonatomic, assign, getter=isFlexedHeight) IBInspectable BOOL flexedHeight; +@property(nonatomic,assign) IBInspectable BOOL wrapContentHeight; /** - *设置视图不受布局视图的布局约束控制,所有的视图扩展属性失效而是用自身原始的frame的设置值来进行定位和布局,默认值是NO。这个属性一般用来实现视图在特定场景下的动画效果,以及可以和布局视图的autoresizesSubviews方法配合使用来实现一些特殊功能。 + *视图的尺寸根据内容来决定,也就是视图的尺寸由内容包裹。这个属性是: A.wrapContentWidth = YES; A.wrapContentHeight = YES;的简化版本。 + *在历史版本中对UILabel进行text赋值后总要手动调用sizeToFit来重新更新布局,在1.3.6以后的新版本中,如果你希望视图的尺寸根据内容而确定则请将这个属性 + *设置为YES。这样就可以在设置完毕text后系统会自动激发布局处理。 */ -@property(nonatomic, assign) IBInspectable BOOL useFrame; +@property(nonatomic, assign) IBInspectable BOOL wrapContentSize; + /** - *设置视图在进行布局时只占位置而不真实的调整位置和尺寸。也就是视图的真实位置和尺寸不变,但在布局视图布局时会保留出子视图的布局位置和布局尺寸的空间,这个属性通常和useFrame混合使用来实现一些动画特效。通常在处理时设置:noLayout为YES同时useFrame为NO时布局时视图的frame是不会改变的,而当useFrame设置为YES时则noLayout属性无效。 + 设置子视图的相对比重尺寸。也就是子视图的尺寸并不是一个绝对值而是一个相对值,在最终布局时系统会根据布局视图的剩余尺寸来将这个相对的值转化为绝对的值。通过对子视图设置相对的尺寸可以很方便的适配各种屏幕尺寸的设备,以便达到完美的布局效果。这个属性默认值是0表示不使用相对尺寸。weight属性的引入是参考android中的weight的概念而来的。 + + 目前只有在线性布局、表格布局、流式布局、浮动布局下的子视图设置weight才有效,相对布局、框架布局、路径布局里面的子视图不支持weight属性的设置。 + 在不同的布局下的子视图的weight属性所表达的意义也有所差异: + + @note + 1.在线性布局和表格布局下: + + 1.1. 当线性布局是垂直线性布局时这个属性用来设置子视图高度占用父线性布局剩余高度的比重,这样子视图就不需要明确的设定高度值。 + + 1.2. 当线性布局是水平线性布局时这个属性用来设置子视图宽度占用父线性布局剩余宽度的比重,这样子视图就不需要明确的设定宽度值。 + + @code + 视图的真实尺寸值 = 布局视图剩余尺寸 * 当前视图的weight比重/(布局视图内所有设置了weight比重值的子视图比重之和)。 + @endcode + + 对一个垂直线性布局举例来说:假设布局视图的高度是100,A子视图占据了20的固定高度,B子视图的weight设置为0.4,C子视图的weight设置为0.6 那么: + @code + A子视图的高度 = 20 + B子视图的高度 = (100-20)*0.4/(0.4+0.6) = 32 + C子视图的高度 = (100-20)*0.6/(0.4+0.6) = 48 + @endcode + + 子视图设置weight属性时要注意如下几点: + + - 垂直线性布局必须指定明确的高度,而不能使用wrapContentHeight属性;水平线性布局必须指定明确的宽度,而不能使用wrapContentWidth属性。 + + - 如果比重属性设置为0的话则表示视图的尺寸必须要明确的被指定,这也是默认值。 + + - 线性布局里面的所有子视图的比重值的和不一定要求是1,比如线性布局里面两个视图的比重都设置为1和都设置为0.5以及都设置为0.1的意义是一样的,都是占用50%。 + + @note + 2.在流式布局下: + + 2.1. 当流式布局是垂直流式布局时这个属性用来设置子视图宽度占用父流式布局当前行的剩余宽度的比重,这样子视图就不需要明确的设定宽度值。 + + 2.2. 当流式布局是水平流式布局时这个属性用来设置子视图高度占用父流式布局当前列的剩余高度的比重,这样子视图就不需要明确的设定高度值。 + + 同时在数量约束和内容约束两种布局中视图设置的比重值在最终计算出真实尺寸时也是有差异的: + + @code + 数量约束流式布局内的视图的真实尺寸值 = 布局视图剩余尺寸 * 当前视图的weight比重/(视图所在行的所有设置了weight比重值的视图比重之和)。 + + 内容约束流式布局内的视图的真实尺寸值 = 布局视图剩余尺寸 * 当前视图的weight比重。 + + 对一个垂直数量约束流式布局举例来说:假设布局视图的宽度是100,A子视图占据了20的固定宽度,B子视图的weight设置为0.4,C子视图的weight设置为0.6 那么: + A子视图的宽度 = 20 + B子视图的宽度 = (100-20)*0.4/(0.4+0.6) = 32 + C子视图的宽度 = (100-20)*0.6/(0.4+0.6) = 48 + + 对一个垂直内容约束流式布局举例来说:假设布局视图的宽度是100,A子视图占据了20的固定宽度,B子视图的weight设置为0.4,C子视图的weight设置为0.6 那么: + A子视图的宽度 = 20 + B子视图的宽度 = (100-20)*0.4 = 32 + C子视图的宽度 = (100-20-32)*0.6 = 28.8 + @endcode + + + @note + 3. 在浮动布局下: + + 3.1. 当浮动布局的方向是垂直布局时,这个属性用来设置视图宽度占用当前浮动布局父视图剩余宽度的比重,这样视图就不需要明确的设定宽度值。 + + 3.2. 当浮动布局的方向是水平布局时,这个属性用来设置视图高度占用当前浮动布局父视图剩余高度的比重,这样子视图就不需要明确的设定高度值。 + + @code + 视图的真实尺寸 = 布局父视图的剩余尺寸 * 视图的weight比重值。 + @endcode + + 举例来说:假设一个垂直浮动布局视图的宽度是100,A子视图占据了20的固定宽度,B子视图的weight设置为0.4,C子视图的weight设置为0.6 那么: + + @code + A子视图的宽度 = 20 + B子视图的宽度 = (100-20)*0.4 = 32 + C子视图的宽度 = (100-20-32)*0.6 = 28.8 + @endcode + */ +@property(nonatomic, assign) IBInspectable CGFloat weight; + + + +/** + 设置视图不受布局父视图的布局约束控制和不再参与视图的布局,所有设置的其他扩展属性都将失效而必须用frame来设置视图的位置和尺寸,默认值是NO。这个属性主要用于某些视图希望在布局视图中进行特殊处理和进行自定义的设置的场景。比如一个垂直线性布局下有A,B,C三个子视图设置如下: + + @code + A.mySize = CGSizeMake(100,100); + B.mySize = CGSizeMake(100,50); + C.mySize = CGSizeMake(100,200); + B.frame = CGRectMake(20,20,200,100); + + 正常情况下当布局完成后: + A.frame == {0,0,100,100} + B.frame == {0,100,100,50} //可以看出即使B设置了frame值,但是因为布局约束属性优先级高所以对B设置的frame值是无效的。 + C.frame == {0,150,100,200} + + 而当我们设置如下时: + A.mySize = CGSizeMake(100,100); + B.mySize = CGSizeMake(100,50); + C.mySize = CGSizeMake(100,200); + B.frame = CGRectMake(20,20,200,100); + B.useFrame = YES; + + 那么在布局完成后: + A.frame == {0, 0, 100, 100} + B.frame == {20,20,200,100} //可以看出B并没有受到约束的限制,结果就是B设置的frame值。 + C.frame == {0, 100,100,200} //因为B不再参与布局了,所以C就往上移动了,由原来的150变为了100. + + @endcode + + @note + useFrame的应用场景是某个视图虽然是布局视图的子视图但不想受到父布局视图的约束,而是可以通过frame进行自由位置和尺寸调整的场景。 + + */ +@property(nonatomic, assign) IBInspectable BOOL useFrame; + + +/** + 设置视图在进行布局时只会参与布局但不会真实的调整位置和尺寸,默认值是NO。当设置为YES时会在布局时保留出视图的布局位置和布局尺寸的空间,但不会更新视图的位置和尺寸,也就是说只会占位但不会更新。因此你可以通过frame值来进行位置和尺寸的任意设置,而不会受到你的布局视图的影响。这个属性主要用于某些视图希望在布局视图中进行特殊处理和进行自定义的设置的场景。比如一个垂直线性布局下有A,B,C三个子视图设置如下: + + @code + A.mySize = CGSizeMake(100,100); + B.mySize = CGSizeMake(100,50); + C.mySize = CGSizeMake(100,200); + B.frame = CGRectMake(20,20,200,100); + + 正常情况下当布局完成后: + A.frame == {0,0,100,100} + B.frame == {0,100,100,50} //可以看出即使B设置了frame值,但是因为布局约束属性优先级高所以对B设置的frame值是无效的。 + C.frame == {0,150,100,200} + + 而当我们设置如下时: + A.mySize = CGSizeMake(100,100); + B.mySize = CGSizeMake(100,50); + C.mySize = CGSizeMake(100,200); + B.frame = CGRectMake(20,20,200,100); + B.noLayout = YES; + + 那么在布局完成后: + A.frame == {0,0,100,100} + B.frame == {20,20,200,100} //可以看出虽然B参与了布局,但是并没有更新B的frame值,而是保持为通过frame设置的原始值。 + C.frame == {0,150,100,200} //因为B参与了布局,占用了50的高度,所以这里C的位置还是150,而不是100. +@endcode + + @note + useFrame和noLayout的区别是: + + 1.前者不会参与布局而必须要通过frame值进行设置,而后者则会参与布局但是不会将布局的结果更新到frame中。 + + 2.当前者设置为YES时后者的设置将无效,而后者的设置并不会影响前者的设置。 + + + @note + noLayout的应用场景是那些想在运行时动态调整某个视图的位置和尺寸,但是又不想破坏布局视图中其他子视图的布局结构的场景,也就是调整了视图的位置和尺寸,但是不会调整其他的兄弟子视图的位置和尺寸。 + +*/ @property(nonatomic, assign) IBInspectable BOOL noLayout; /** - *视图的评估Rect值。评估的Rect值是在布局前评估计算的值,而frame则是视图真正完成布局后的真实的Rect值。在调用这个方法前请先调用父布局视图的-(CGRect)estimateLayoutRect方法进行布局视图的尺寸评估,否则此方法返回的值未可知。这个方法主要用于在视图布局前而想得到其在父布局视图中的Rect值的场景。 + 指定视图的可见性,默认是visible。这个属性是对视图hidden属性的扩展,布局系统对视图的hidden属性设置后,视图将不再参与布局。但在实际中有些场景我们希望视图隐藏后 + 仍然会占用空间仍然会参与布局。因此我们可以用这个属性来设置当视图隐藏后是否继续参与布局。 + 如果您使用了这个属性来对视图进行隐藏和取消隐藏操作则请不要再去操作hidden属性,否则可能出现二者效果不一致的情况。因此建议视图的隐藏和显示用这个属性进行设置。 + 在老版本中布局中的子视图隐藏时要么都参与布局,要么都不参与布局,这是通过布局属性hideSubviewReLayout来设置,新版本中这个属性将会设置为无效了! + + 属性可以设置的值如下: + + 1. MyVisibility_Visible 视图可见,等价于hidden = NO + + 2. MyVisibility_Invisible 视图不可见,等价于hidden = YES, 但是会在父布局视图中占位空白区域 + + 3. MyVisibility_Gone 视图不可见,等价于hidden = YES, 但是不会在父视图中占位空白区域 + + + @note + 建议您用这个属性设置视图的隐藏的显示而不用系统默认的hidden来进行设置。 + + */ +@property(nonatomic, assign) MyVisibility myVisibility; + + +/** + 指定子在布局视图上的对齐方式,默认是None表示未指定,这个属性目前只支持框架布局,线性布局,流式布局下的属性设置。 + + 1. 在框架布局中支持上、中、下、垂直拉伸和左、中、右、水平拉伸8个设置 + + 2. 在垂直线性布局中只支持左、中、右、水平拉伸对齐。(如果父布局视图设置了gravity,子视图设置了这个属性则这个属性优先级最高) + + 3. 在水平线性布局中只支持上、中、下、垂直拉伸对齐。(如果父布局视图设置了gravity,子视图设置了这个属性则这个属性优先级最高) + + 4. 在垂直流式布局中用来设置一行内的上、中、下、垂直拉伸对齐。(如果父布局视图设置了arrangedGravity,子视图设置了这个属性则这个属性优先级最高) + + 5. 在水平流式布局中用来设置一列内的左、中、右、水平拉伸对齐。(如果父布局视图设置了arrangedGravity,子视图时设置了这个属性则这个属性优先级最高) + */ +@property(nonatomic, assign) MyGravity myAlignment; + + + +/** + 视图在父布局视图中布局完成后也就是视图的frame更新完成后执行的block,执行完block后会被重置为nil。通过在viewLayoutCompleteBlock中我们可以得到这个视图真实的frame值,当然您也可以在里面进行其他业务逻辑的操作和属性的获取和更新。block方法中layout参数就是父布局视图,而v就是视图本身,block中这两个参数目的是为了防止循环引用的问题。 + */ +@property(nonatomic,copy) void (^viewLayoutCompleteBlock)(MyBaseLayout* layout, UIView *v); + + +/** + 视图的在父布局视图调用完评估尺寸的方法后,可以通过这个方法来获取评估的CGRect值。评估的CGRect值是在布局前评估计算的值,而frame则是视图真正完成布局后的真实的CGRect值。在调用这个方法前请先调用父布局视图的-(CGRect)estimateLayoutRect方法进行布局视图的尺寸评估,否则此方法返回的值未可知。这个方法主要用于在视图布局前而想得到其在父布局视图中的位置和尺寸的场景。 + + @return 返回被子视图的评估的CGRect值。 */ -(CGRect)estimatedRect; + /** - *清除所有为布局而设置的视图扩展属性值。 - *@sizeClass: 清除某个MySizeClass下设置的视图扩展属性值。 + *清除视图所有为布局而设置的扩展属性值。如果是布局视图调用这个方法则同时会清除布局视图中所有关于布局设置的属性值。 */ -(void)resetMyLayoutSetting; -(void)resetMyLayoutSettingInSizeClass:(MySizeClass)sizeClass; /** - *获取视图在某个SizeClass下的MyLayoutSizeClass对象。可以通过得到的MyLayoutSizeClass对象来设置视图在对应SizeClass下的各种布局约束属性。 + 获取视图在某个Size Classes下的MyLayoutSizeClass对象。视图可以通过得到的MyLayoutSizeClass对象来设置视图在对应Size Classes下的各种布局约束属性。 + + @param sizeClass 指定获取某种SizeClass + @return 返回指定的SizeClass */ -(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass; + /** - *获取视图在某个SizeClass下的MyLayoutSizeClass对象,如果对象不存在则会新建立一个MyLayoutSizeClass对象,并且其布局约束属性都拷贝自srcSizeClass的属性,如果对象已经存在则srcSizeClass不起作用,如果srcSizeClass本来就不存在则也不会起作用。 + 获取视图在某个Size Classes下的MyLayoutSizeClass对象,如果对象不存在则会新建立一个MyLayoutSizeClass对象,并且其布局约束属性都拷贝自srcSizeClass中的属性,如果对象已经存在则srcSizeClass不起作用,如果srcSizeClass本来就不存在则也不会起作用。 + @param sizeClass 指定获取某个SizeClass + @param srcSizeClass 指定从哪种SizeClass中拷贝 + @return 返回指定的SizeClass */ -(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass copyFrom:(MySizeClass)srcSizeClass; +@end + + +@interface UIView(MyLayoutExtDeprecated) + +/** + * 过期的位置和尺寸设置方法,老版本中带Margin后缀就明确为了边距的概念,但是这个和属性定义的概念是不一致的,位置即可表示边距也可以表示间距。所以这些方法将设置为过期。您可以在相应的位置定义宏:#define MY_USEOLDMETHODNOWARNING = 1 则不会出现老方法告警,不过不建议这么做。 + */ + + +/** + *过期属性,请用myLeft + */ +@property(nonatomic, assign) CGFloat myLeftMargin MYMETHODDEPRECATED("use myLeft to instead"); + +/** + *过期属性,请用myTop + */ +@property(nonatomic, assign) CGFloat myTopMargin MYMETHODDEPRECATED("use myTop to instead"); + +/** + *过期属性,请用myRight + */ +@property(nonatomic, assign) CGFloat myRightMargin MYMETHODDEPRECATED("use myRight to instead"); + +/** + *过期属性,请用myBottom + */ +@property(nonatomic, assign) CGFloat myBottomMargin MYMETHODDEPRECATED("use myBottom to instead"); + +/** + *过期属性,请用myCenterX + */ +@property(nonatomic, assign) CGFloat myCenterXOffset MYMETHODDEPRECATED("use myCenterX to instead"); + +/** + *过期属性,请用myCenterY + */ +@property(nonatomic, assign) CGFloat myCenterYOffset MYMETHODDEPRECATED("use myCenterY to instead"); + +/** + *过期属性,请用myCenter + */ +@property(nonatomic, assign) CGPoint myCenterOffset MYMETHODDEPRECATED("use myCenter to instead"); + +/** + *过期属性,请用widthSize + */ +@property(nonatomic, readonly) MyLayoutSize *widthDime MYMETHODDEPRECATED("use widthSize to instead"); + +/** + *过期属性,请用heightSize + */ +@property(nonatomic, readonly) MyLayoutSize *heightDime MYMETHODDEPRECATED("use heightSize to instead"); + + +/** + *过期属性,请用wrapContentHeight + */ +@property(nonatomic, assign, getter=isFlexedHeight) BOOL flexedHeight MYMETHODDEPRECATED("use wrapContentHeight to instead"); + + @end -/**布局的边界画线类,用于实现绘制布局的四周的边界线的功能**/ -@interface MyBorderLineDraw : NSObject -/**边界线的颜色*/ +/** + *布局的边界画线类,用于实现绘制布局的四周的边界线的功能。一个布局视图中提供了上下左右4个方向的边界画线类对象。 + */ +@interface MyBorderline : NSObject + + +/** + *边界线的颜色 + */ @property(nonatomic,strong) UIColor *color; -/**边界线的厚度,默认是1*/ + +/** + *边界线的厚度,默认是1,设置的值不能小于1. 单位是像素。 + */ @property(nonatomic,assign) CGFloat thick; -/**边界线的头部缩进单位*/ + +/** + *边界线的头部缩进单位。比如某个布局视图宽度是100,头部缩进单位是20,那么边界线将从20的位置开始绘制。 + */ @property(nonatomic,assign) CGFloat headIndent; -/**边界线的尾部缩进单位*/ + +/** + *边界线的尾部缩进单位。比如某个布局视图宽度是100,尾部缩进单位是20,那么边界线将绘制到80的位置结束。 + */ @property(nonatomic, assign) CGFloat tailIndent; -/**设置边界线为点划线,如果是0则边界线是实线*/ + +/** + *设置边界线为点划线,如果是0则边界线是实线 + */ @property(nonatomic, assign) CGFloat dash; +/** + *边界线绘制时的偏移量 + */ +@property(nonatomic, assign) CGFloat offset; -(id)initWithColor:(UIColor*)color; + @end +//兼容老版本的类名命名不规则的问题,这样老版本仍然可以用MyBorderLineDraw这个类名。 +typedef MyBorderline MyBorderLineDraw MYMETHODDEPRECATED("use MyBorderline to instead"); -/*布局视图基类,基类不支持实例化对象*/ +/** + 布局视图基类,基类不支持实例化对象。在编程时我们经常会用到一些视图,这种视图只是负责将里面的子视图按照某种规则进行排列和布局,而别无其他的作用。因此我们称这种视图为容器视图或者称为布局视图。 + 布局视图通过重载layoutSubviews方法来完成子视图的布局和排列的工作。对于每个加入到布局视图中的子视图,都会在加入时通过KVO机制监控子视图的center和bounds以及frame值的变化,每当子视图的这些属性一变化时就又会重新引发布局视图的布局动作。同时对每个视图的布局扩展属性的设置以及对布局视图的布局属性的设置都会引发布局视图的布局动作。布局视图在添加到非布局父视图时也会通过KVO机制来监控非布局父视图的frame值和bounds值,这样每当非布局父视图的尺寸变更时也会引发布局视图的布局动作。前面说的引起变动的方法就是会在KVO处理逻辑以及布局扩展属性和布局属性设置完毕后通过调用setNeedLayout来实现的,当布局视图收到setNeedLayout的请求后,会在下一个runloop中对布局视图进行重新布局而这就是通过调用layoutSubviews方法来实现的。布局视图基类只提供了更新所有子视图的位置和尺寸以及一些基础的设置,而至于如何排列和布局这些子视图则要根据应用的场景和需求来确定,因此布局基类视图提供了一个: + -(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs + 的方法,要求派生类去重载这个方法,这样不同的派生类就可以实现不同的应用场景,这就是布局视图的核心实现机制。 + + MyLayout布局库根据实际中常见的场景实现了7种不同的布局视图派生类他们分别是:线性布局、表格布局、相对布局、框架布局、流式布局、浮动布局、路径布局。 + */ @interface MyBaseLayout : UIView +#if UIKIT_DEFINE_AS_PROPERTIES + +/** + 用于实现对阿拉伯国家的布局适配。对于非阿拉伯国家来说,界面布局都是默认从左到右排列。而对于阿拉伯国家来说界面布局则默认是从右往左排列。默认这个属性是NO,您可以将这个属性设置为YES,这样布局里面的所有视图都将从右到左进行排列布局。如果您需要考虑国际化布局的问题,那么您应该用leadingPos来表示头部的位置,而用trailingPos来表示尾部的位置,这样当布局方向是LTR时那么leadingPos就表示的是左边而trailingPos则表示的是右边;而当布局方向是RTL时那么leadingPos表示的是右边而trailingPos则表示的是左边。如果您的界面布局不会考虑到国际化以及不需要考虑RTL时那么您可以用leftPos和rightPos来表示左右而不需要用leadingPos和trailingPos。 + */ +@property(class, nonatomic, assign) BOOL isRTL; +#else ++(BOOL)isRTL; ++(void)setIsRTL:(BOOL)isRTL; +#endif + +/* + 布局视图里面的padding属性用来设置布局视图的内边距。内边距是指布局视图里面的子视图离自己距离。外边距则是视图与父视图之间的距离。 + 内边距是在自己的尺寸内离子视图的距离,而外边距则不是自己尺寸内离其他视图的距离。下面是内边距和外边距的效果图: + + ^ + | topMargin + | width + +------------------------------+ + | |------------> + | l r | rightMargin + | e topPadding i | + | f g | + | t +---------------+ h | + <----------| P | | t | + leftMargin| a | | P | + | d | subviews | a | height + | d | content | d | + | i | | d | + | n | | i | + | g +---------------+ n | + | g | + | bottomPadding | + +------------------------------+ + |bottomMargin + | + V + + + 如果一个布局视图中的每个子视图都离自己有一定的距离就可以通过设置布局视图的内边距来实现,而不需要为每个子视图都设置外边距。 + + */ + /** * 设置布局视图四周的内边距值。所谓内边距是指布局视图内的所有子视图离布局视图四周的边距。通过为布局视图设置内边距可以减少为所有子视图设置外边距的工作,而外边距则是指视图离父视图四周的距离。 */ @property(nonatomic,assign) UIEdgeInsets padding; + +/** + * 顶部内边距,用来设置子视图离自身顶部的边距值。 + */ @property(nonatomic, assign) IBInspectable CGFloat topPadding; -@property(nonatomic, assign) IBInspectable CGFloat leftPadding; +/** + *头部内边距,用来设置子视图离自身头部的边距值。对于LTR方向的布局来说就是指的左边内边距,而对于RTL方向的布局来说就是指的右边内边距 + */ +@property(nonatomic, assign) IBInspectable CGFloat leadingPadding; +/** + *底部内边距,用来设置子视图离自身底部的边距值。 + */ @property(nonatomic, assign) IBInspectable CGFloat bottomPadding; +/** + *尾部内边距,用来设置子视图离自身尾部的边距值。对于LTR方向的布局来说就是指的右边内边距,而对于RTL方向的布局来说就是指的左边内边距 + */ +@property(nonatomic, assign) IBInspectable CGFloat trailingPadding; + +/** + *左边内边距,用来设置子视图离自身左边的边距值。如果您不需要考虑布局的方向,那么请用这个属性来设置左边的内部边距,如果您需要考虑国际化则请用leadingPadding + */ +@property(nonatomic, assign) IBInspectable CGFloat leftPadding; + +/** + *右边内边距,用来设置子视图离自身右边的边距值。如果您不需要考虑布局的方向,那么请用这个属性来设置右边的内部边距,如果您需要考虑国际化则请用trailingPadding + */ @property(nonatomic, assign) IBInspectable CGFloat rightPadding; /** - *布局视图的宽度包裹属性,表示布局视图的宽度等于所有子视图的整体宽度。默认值是NO。当设置为NO是必须要明确指定布局的宽度,而当设置为YES时则不需要明确的指定布局视图的宽度了,否则可能会产生约束冲突而导致死循环的出现。wrapContentWidth的优先级最低,一旦布局视图明确的指定了宽度则属性设置无效。 + * 设置当布局的尺寸由子视图决定并且在没有子视图加入的情况下padding的设置值是否会加入到布局的尺寸值里面。默认是YES,表示当布局视图没有子视图时padding值也会加入到尺寸里面。 + * 举例来说假设某个布局视图的高度是wrapContentHeight,并且设置了topPadding为10,bottomPadding为20。那么默认情况下当没有任何子视图时布局视图的高度是30;而当我们将这个属性设置为NO时,那么在没有任何子视图时布局视图的高度就是0,也就是说topPadding和bottomPadding不会参与高度的计算了。 */ -@property(nonatomic,assign) IBInspectable BOOL wrapContentWidth; +@property(nonatomic, assign) BOOL zeroPadding; + + /** - *布局视图的高度包裹属性,表示布局视图的高度等于所有子视图的整体高度。默认值是NO。当设置为NO是必须要明确指定布局的高度,而当设置为YES时则不需要明确的指定布局视图的高度了,否则可能会产生约束冲突而导致死循环的出现。wrapContentHeight的优先级最低,一旦布局视图明确的指定了高度则属性设置无效。 + *设置布局视图里面子视图之间的垂直间距。如果布局内每个子视图的垂直间距都相等则可以用这个属性来设置。这个属性不支持框架布局、相对布局、路径布局。 */ -@property(nonatomic,assign) IBInspectable BOOL wrapContentHeight; +@property(nonatomic ,assign) IBInspectable CGFloat subviewVSpace; +/** + *设置布局视图里面子视图之间的水平间距。如果布局内每个子视图的水平间距都相等则可以用这个属性来设置。这个属性不支持框架布局、相对布局、路径布局。 + */ +@property(nonatomic, assign) IBInspectable CGFloat subviewHSpace; +/** + *设置布局视图里面子视图之间的间距。如果布局内每个子视图的间距都相等则可以用这个属性来设置。这个属性不支持框架布局、相对布局、路径布局。 + */ +@property(nonatomic, assign) IBInspectable CGFloat subviewSpace; /** - *把一个布局视图放入到UIScrollView内时是否自动调整UIScrollView的contentSize值,默认是YES。你可以将这个属性设置NO而不调整contentSize的值,要设置这个属性值为NO请在将布局视图添加到UIScrollView以后再设置才能生效 + 布局里面的所有子视图的整体停靠方向以及填充,所谓停靠是指布局视图里面的所有子视图整体在布局视图中的位置,系统默认的停靠是在布局视图的左上角。 + + @note + 只有框架布局、线性布局、表格布局、流式布局、浮动布局支持gravity属性,相对布局和路径布局不支持。 + + 1. MyGravity_Vert_Top,MyGravity_Vert_Center,MyGravity_Vert_Bottom 表示整体垂直居上,居中,居下 (支持:框架布局,线性布局,表格布局,流式布局,垂直浮动布局) + + 2. MyGravity_Horz_Left,MyGravity_Horz_Center,MyGravity_Horz_Right 表示整体水平居左,居中,居右 (支持:框架布局,线性布局,表格布局,流式布局,水平浮动布局) + + 3. MyGravity_Vert_Between 表示每行之间的行间距都被拉伸,以便使里面的子视图垂直方向填充满整个布局视图。 (支持:垂直线性布局,垂直表格布局,流式布局) + + 4. MyGravity_Horz_Between 表示每列之间的列间距都被拉伸,以便使里面的子视图水平方向填充满整个布局视图。 (支持:水平线性布局,水平表格布局,流式布局) + + 5. MyGravity_Vert_Fill 表示布局会拉伸子视图的高度,以便使里面的子视图垂直方向填充满整个布局视图的高度或者子视图平分布局视图的高度。(支持:框架布局,水平线性布局,水平表格布局,流式布局) + + 6. MyGravity_Horz_Fill 表示布局会拉伸子视图的宽度,以便使里面的子视图水平方向填充满整个布局视图的宽度或者子视图平分布局视图的宽度。 (支持:框架布局,垂直线性布局,垂直表格布局,流式布局) */ -@property(nonatomic, assign, getter = isAdjustScrollViewContentSize) BOOL adjustScrollViewContentSize; +@property(nonatomic, assign) IBInspectable MyGravity gravity; /** - *在布局视图进行布局时是否调用基类的layoutSubviews方法,默认设置为NO。 + *设置是否布局里面的所有子视图按添加的顺序逆序进行布局。默认是NO,表示按子视图添加的顺序排列。比如一个垂直线性布局依次添加A,B,C三个子视图,那么在正常布局时A,B,C从上到下依次排列,而当这个属性设置为YES时,则布局时就会变成按C,B,A依次从上到下排列。这个属性的设置对框架布局和相对布局无效。 */ -@property(nonatomic, assign) BOOL priorAutoresizingMask; +@property(nonatomic, assign) BOOL reverseLayout; + + +/** + *把一个布局视图放入到UIScrollView(UITableView和UICollectionView除外)内时是否自动调整UIScrollView的contentSize值。默认是MyAdjustScrollViewContentSizeModeAuto表示布局视图会自动接管UIScrollView的contentSize的值。 你可以将这个属性设置MyAdjustScrollViewContentSizeModeNo而不调整和控制contentSize的值,设置为MyAdjustScrollViewContentSizeModeYes则一定会调整contentSize. + */ +@property(nonatomic, assign) MyAdjustScrollViewContentSizeMode adjustScrollViewContentSizeMode; /** - *设置当布局视图里面的子视图隐藏时,是否重新布局所有非隐藏的子视图。默认值是YES,表示当有子视图隐藏时,隐藏的子视图将不会占据任何位置和尺寸,而其他的未隐藏的子视图将会覆盖掉隐藏的子视图的位置和尺寸。如果布局视图的宽度或者高度在设置了包裹属性后也会重新调整。 + *在布局视图进行布局时是否调用基类的layoutSubviews方法,默认设置为NO。 */ -@property(nonatomic, assign) BOOL hideSubviewReLayout; +@property(nonatomic, assign) BOOL priorAutoresizingMask; + + /** - *设置布局视图在布局之前和布局完成之后的处理块。这两个处理块主要用来实现布局的动画功能。系统会在每次布局完成之后将处理块清空为nil。您也可以在endLayoutBlock块内取到所有子视图真实布局后的frame值。 + *设置布局视图在布局开始之前的处理块。系统会在每次布局完成前调用对应的处理块后将处理块清空为nil。系统会在调用layoutSubviews方法前执行beginLayoutBlock。 */ @property(nonatomic,copy) void (^beginLayoutBlock)(); +/** + *设置布局视图在布局完成之后的处理块。系统会在每次布局完成后调用对应的处理块后将处理块清空为nil。您也可以在endLayoutBlock块内取到所有子视图真实布局后的frame值。系统会在调用layoutSubviews方法后执行endLayoutBlock。 + */ @property(nonatomic,copy) void (^endLayoutBlock)(); + /** *设置布局时的动画。并指定时间。这个函数是下面方法的简单实现: + @code self.beginLayoutBlock = ^{ [UIView beginAnimations:nil context:nil]; @@ -385,61 +889,95 @@ [UIView commitAnimations]; }; +@endcode + @param duration 指定动画的时间间隔 */ -(void)layoutAnimationWithDuration:(NSTimeInterval)duration; +/** + 设置布局视图在第一次布局完成之后或者有横竖屏切换时进行处理的block。这个block不像beginLayoutBlock以及endLayoutBlock那样只会执行一次,而是会一直存在 + 因此需要注意代码块里面的循环引用的问题。这个block调用的时机是第一次布局完成或者每次横竖屏切换时布局完成被调用。 + 这个方法会在endLayoutBlock后调用。 + + layout 参数就是布局视图本身。 + + isFirst 表明当前是否是第一次布局时调用。 + + isPortrait 表明当前是横屏还是竖屏。 + */ +@property(nonatomic,copy) void (^rotationToDeviceOrientationBlock)(MyBaseLayout *layout, BOOL isFirst, BOOL isPortrait); -/**当前是否正在布局中,如果正在布局中则返回YES,否则返回NO*/ + +/** + *判断当前是否正在布局中,如果正在布局中则返回YES,否则返回NO + */ @property(nonatomic,assign,readonly) BOOL isMyLayouting; /** - *设置布局的四周的边界线对象,boundBorderLine是同时设置四周的边界线。 + *设置布局视图的四周的边界线对象。boundBorderLine是同时设置四周的边界线。您也可以单独设置布局视图某些边的边界线。边界线对象默认是nil,您必须通过建立边界线类MyBorderline的对象实例并赋值给下面的属性来实现边界线的指定。 */ -@property(nonatomic, strong) MyBorderLineDraw *leftBorderLine; -@property(nonatomic, strong) MyBorderLineDraw *rightBorderLine; -@property(nonatomic, strong) MyBorderLineDraw *topBorderLine; -@property(nonatomic, strong) MyBorderLineDraw *bottomBorderLine; -@property(nonatomic, strong) MyBorderLineDraw *boundBorderLine; +/**顶部边界线*/ +@property(nonatomic, strong) MyBorderline *topBorderline; +/**头部边界线*/ +@property(nonatomic, strong) MyBorderline *leadingBorderline; +/**底部边界线*/ +@property(nonatomic, strong) MyBorderline *bottomBorderline; +/**尾部边界线*/ +@property(nonatomic, strong) MyBorderline *trailingBorderline; +/**四周边界线*/ +@property(nonatomic, strong) MyBorderline *boundBorderline; /** - *智能边界线,智能边界线不是设置自身的边界线而是对添加到布局视图里面的子布局视图根据子视图之间的关系智能的生成边界线,对于布局视图里面的非布局子视图则不会生成边界线。目前的版本只支持线性布局,表格布局,流式布局和浮动布局这四种布局。 + *如果您不需要考虑国际化的问题则请用这个属性设置左边边界线,否则用leadingBorderline */ -@property(nonatomic, strong) MyBorderLineDraw *IntelligentBorderLine; +@property(nonatomic, strong) MyBorderline *leftBorderline; +/** + *如果您不需要考虑国际化的问题则请用这个属性设置右边边界线,否则用trailingBorderline + */ +@property(nonatomic, strong) MyBorderline *rightBorderline; + /** - *不使用父布局视图提供的智能边界线功能。当布局视图的父布局视图设置了IntelligentBorderLine时但是布局视图又想自己定义边界线时则将这个属性设置为YES + *智能边界线,智能边界线不是设置布局自身的边界线而是对添加到布局视图里面的子布局视图根据子视图之间的关系智能的生成边界线,对于布局视图里面的非布局子视图则不会生成边界线。目前的版本只支持线性布局,表格布局,流式布局和浮动布局这四种布局。 + *举例来说如果为某个垂直线性布局设置了智能边界线,那么当这垂直线性布局里面添加了A和B两个子布局视图时,系统会智能的在A和B之间绘制一条边界线。 */ -@property(nonatomic, assign) BOOL notUseIntelligentBorderLine; +@property(nonatomic, strong) MyBorderline *intelligentBorderline; + +/** + *不使用父布局视图提供的智能边界线功能。当某个布局视图的父布局视图设置了intelligentBorderline时但是这个布局视图又想自己定义边界线或者不想要边界线时则将这个属性设置为YES即可。 + */ +@property(nonatomic, assign) BOOL notUseIntelligentBorderline; + /** - *设置布局按下时背景的高亮的颜色。只有设置了setTarget:action方法此属性才生效。 + *在有布局触摸事件时布局按下时背景的高亮的颜色。只有设置了setTarget:action方法此属性才生效。 */ -@property(nonatomic,strong) IBInspectable UIColor *highlightedBackgroundColor; +@property(nonatomic,strong) UIColor *highlightedBackgroundColor; /** - *设置布局按下时的高亮不透明度。值的范围是[0,1],默认是0表示完全不透明,为1表示完全透明。只有设置了setTarget:action方法此属性才生效。 + *在有布局触摸事件时布局按下时的高亮不透明度。值的范围是[0,1],默认是0表示完全不透明,为1表示完全透明。只有设置了setTarget:action方法此属性才生效。 */ -@property(nonatomic,assign) IBInspectable CGFloat highlightedOpacity; +@property(nonatomic,assign) CGFloat highlightedOpacity; /** - *设置布局的背景图片。这个属性的设置就是设置了布局的layer.contents的值,因此如果要实现背景图的局部拉伸请用layer.contentsXXX这些属性进行调整 + *设置布局的背景图片。这个属性的设置就是设置了布局的layer.contents的值,因此如果要实现背景图的局部拉伸请用layer的其他contentsXXX属性进行调整和处理 */ -@property(nonatomic,strong) IBInspectable UIImage *backgroundImage; +@property(nonatomic,strong) UIImage *backgroundImage; /** - *设置布局按下时的高亮背景图片。只有设置了setTarget:action方法此属性才生效。 + *在有布局触摸事件时布局按下时的高亮背景图片。只有设置了setTarget:action方法此属性才生效。 */ -@property(nonatomic,strong) IBInspectable UIImage *highlightedBackgroundImage; +@property(nonatomic,strong) UIImage *highlightedBackgroundImage; /** - *设置布局的Touch、按下、取消事件的处理动作,后两个事件的处理必须依赖于第一个事件的处理。请不要在这些处理动作中修改背景色,不透明度,以及背景图片。如果您只想要高亮效果但是不想处理事件则将action设置为nil即可了。 - * @target: 事件的处理对象,如果设置为nil则表示取消事件。 - * @action: 事件的处理动作,格式为:-(void)handleAction:(MyBaseLayout*)sender。 + 设置布局的touch up 、touch down、touch cancel事件的处理动作,后两个事件的处理必须依赖于第一个事件的处理。请不要在这些处理动作中修改背景色,不透明度,以及背景图片。如果您只想要高亮效果但是不想处理事件则将action设置为nil即可了。 + @param target 事件的处理对象,如果设置为nil则表示取消事件。 + @param action 事件的处理动作,格式为:-(void)handleAction:(MyBaseLayout*)sender。 */ -(void)setTarget:(id)target action:(SEL)action; -(void)setTouchDownTarget:(id)target action:(SEL)action; @@ -447,15 +985,158 @@ /** - *评估布局视图的尺寸,这个方法并不会进行真正的布局,只是对布局的尺寸进行评估,主要用于在布局前想预先知道布局尺寸的场景。通过对布局进行尺寸的评估,可以在不进行布局的情况下动态的计算出布局的位置和大小,但需要注意的是这个评估值有可能不是真实显示的实际位置和尺寸。 - *@size:指定期望的宽度或者高度,如果size中对应的值设置为0则根据布局自身的高度和宽度来进行评估,而设置为非0则固定指定的高度或者宽度来进行评估。比如下面的例子: - * estimateLayoutRect:CGSizeMake(0,0) 表示按布局的位置和尺寸根据布局的子视图来进行动态评估。 - * estimateLayoutRect:CGSizeMake(320,0) 表示布局的宽度固定为320,而高度则根据布局的子视图来进行动态评估。这个情况非常适用于UITableViewCell的动态高度的计算评估。 - * estimateLayoutRect:CGSizeMake(0,100) 表示布局的高度固定为100,而宽度则根据布局的子视图来进行动态评估。 - *@sizeClass:参数表示评估某个sizeClass下的尺寸值,如果没有找到指定的sizeClass则会根据继承规则得到最合适的sizeClass +评估布局视图的尺寸。这个方法并不会让布局视图进行真正的布局,只是对布局的尺寸进行评估,主要用于在布局完成前想预先知道布局尺寸的场景。通过对布局进行尺寸的评估,可以在不进行布局的情况下动态的计算出布局的位置和大小,但需要注意的是这个评估值有可能不是真实显示的实际位置和尺寸。 + @param size 指定期望的宽度或者高度,如果size中对应的值设置为0则根据布局自身的高度和宽度来进行评估,而设置为非0则固定指定的高度或者宽度来进行评估。比如下面的例子: + 1.estimateLayoutRect:CGSizeMake(0,0) 表示按布局的位置和尺寸根据布局的子视图来进行动态评估。 + 2.estimateLayoutRect:CGSizeMake(320,0) 表示布局的宽度固定为320,而高度则根据布局的子视图来进行动态评估。这个情况非常适用于UITableViewCell的动态高度的计算评估。 + 3.estimateLayoutRect:CGSizeMake(0,100) 表示布局的高度固定为100,而宽度则根据布局的子视图来进行动态评估。 + @return 返回评估的尺寸。 */ -(CGRect)estimateLayoutRect:(CGSize)size; -(CGRect)estimateLayoutRect:(CGSize)size inSizeClass:(MySizeClass)sizeClass; +/** + 是否缓存经过estimateLayoutRect方法评估后的所有子视图的位置和尺寸一次!,默认设置为NO不缓存。当我们用estimateLayoutRect方法评估布局视图的尺寸后,所有子视图都会生成评估的位置和尺寸,因为此时并没有执行布局所以子视图并没有真实的更新frame值。而当布局视图要进行真实布局时又会重新计算所有子视图的位置和尺寸,因此为了优化性能当我们对布局进行评估后在下次真实布局时我们可以不再重新计算子视图的位置和尺寸而是用前面评估的值来设置位置和尺寸。这个属性设置为YES时则每次评估后到下一次布局时不会再重新计算子视图的布局了,而是用评估值来布局子视图的位置和尺寸。而当这个属性设置为NO时则每次布局都会重新计算子视图的位置和布局。 + 这个属性一般用在那些动态高度UITableviewCell中进行配合使用,我们一般将布局视图作为UITableviewCell的contentView的子视图: + + @code + MyXXXLayout *rootLayout= [MyXXXLayout new]; + rootLayout.cacheEstimatedRect = YES; //设置缓存评估的rect,如果您的cell是高度自适应的话,强烈建立打开这个属性,这会大大的增强您的tableview的性能!! + rootLayout.myHorzMargin = 0; //宽度和父视图相等 + rootLayout.wrapContentHeight = YES; //高度动态包裹。 + [self.contentView addSubview:rootLayout]; + self.rootLayout = rootLayout; + + //在rootLayout添加子视图。。。 + + ************************************* + + 然后我们在heightForRowAtIndexPath中按如下格式进行高度的评估的计算。 + -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath + { + UITableViewCellXXX *cell = (UITableViewCellXXX*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; + CGRect rect = [cell.rootLayout estimateLayoutRect:CGSizeMake(tableView.frame.size.width, 0)]; + return rect.size.height; + } + + @endcode + */ +@property(nonatomic, assign) BOOL cacheEstimatedRect; + + +/** + 评估计算一个未加入到布局视图中的子视图subview在加入后的frame值。在实践中我们希望得到某个未加入的子视图在添加到布局视图后的应该具有的frame值,这时候就可以用这个方法来获取。比如我们希望把一个子视图从一个布局视图里面移到另外一个布局视图的末尾时希望能够提供动画效果,这时候就可以通过这个方法来得到加入后的子视图的位置和尺寸。 + 这个方法只有针对那些通过添加顺序进行约束的布局视图才有意义,相对布局和框架布局则没有意义。 + + @note 使用示例:假设存在两个布局视图L1,L2他们的父视图是S,现在要实现将L1中的任意一个子视图A移动到L2的末尾中去,而且要带动画效果,那么代码如下: + @code + //得到A在S中的frame,这里需要进行坐标转换为S在中的frame + CGRect rectOld = [L1 convertRect:A.frame toView:S]; + //得到将A加入到L2后的评估的frame值,注意这时候A还没有加入到L2。 + CGRect rectNew = [L2 subview:A estimatedRectInLayoutSize:CGSizeZero]; + //将新位置的评估的frame值,这里需要进行坐标转换为S在中的frame。 + rectNew = [L2 convertRect:rectNew toView:self.view]; + + //动画的过程是先将A作为S的子视图进行位置的调整后再加入到L2中去 + [A removeFromSuperview]; + //因为A要使用frame进行位置的调整,所以这里要记得将useFrame设置为YES。 + A.useFrame = YES; + A.frame = rectOld; + [S addSubview:A]; + [UIView animateWithDuration:0.3 animations:^{ + + A.frame = rectNew; + + } completion:^(BOOL finished) { + + //动画结束后再将A移植到L2中。 + [A removeFromSuperview]; + //将useFrame设置为NO表示,视图A重新受到布局视图的约束控制 + A.useFrame = NO; + [L2 addSubview:A]; + }]; + @endcode + + @param subview 一个未加入布局视图的子视图,如果子视图已经加入则直接返回子视图的frame值。 + @param size 指定布局视图期望的宽度或者高度,一般请将这个值设置为CGSizeZero。 具体请参考estimateLayoutRect方法中的size的说明。 + @return 子视图在布局视图最后一个位置(假如加入后)的frame值。 + */ +-(CGRect)subview:(UIView*)subview estimatedRectInLayoutSize:(CGSize)size; + + +@end + + +@interface MyBaseLayout(MyBaseLayoutDeprecated) + +/** + *过期方法,对于间距统一用space来描述,而边距用margin来描述。 + *原先子视图之间的间距属性的命名规范不合理,所以这里将原先的设置间距的属性设置为过期。这里也和TangramKit中的命名统一。 + *您可以在相应的位置定义宏:#define MY_USEOLDMETHODNOWARNING = 1 则不会出现老方法告警,不过不建议这么做。 + */ + +/** +*过期属性,请用subviewVSpace +*/ +@property(nonatomic ,assign, getter=subviewVSpace, setter=setSubviewVSpace:) CGFloat subviewVertMargin MYMETHODDEPRECATED("use subviewVSpace to instead"); + +/** + *过期属性,请用subviewHSpace + */ +@property(nonatomic, assign, getter=subviewHSpace, setter=setSubviewHSpace:) CGFloat subviewHorzMargin MYMETHODDEPRECATED("use subviewHSpace to instead"); + +/** + *过期属性,请用subviewSpace + */ +@property(nonatomic, assign, getter=subviewSpace, setter=setSubviewSpace:) CGFloat subviewMargin MYMETHODDEPRECATED("use subviewSpace to instead"); + +/** + *过期方法, 原先对边界线命名BorderLine不符合规则,Borderline是一个单词不是一个词组。这里也和TangramKit中的命名统一。 + */ + +/** + *过期属性,请用leftBorderline + */ +@property(nonatomic, strong, getter=leftBorderline, setter=setLeftBorderline:) MyBorderline *leftBorderLine MYMETHODDEPRECATED("use leftBorderline to instead"); + +/** + *过期属性,请用rightBorderline + */ +@property(nonatomic, strong, getter=rightBorderline, setter=setRightBorderline:) MyBorderline *rightBorderLine MYMETHODDEPRECATED("use rightBorderline to instead"); + +/** + *过期属性,请用topBorderline + */ +@property(nonatomic, strong, getter=topBorderline, setter=setTopBorderline:) MyBorderline *topBorderLine MYMETHODDEPRECATED("use topBorderline to instead"); + +/** + *过期属性,请用bottomBorderline + */ +@property(nonatomic, strong, getter=bottomBorderline, setter=setBottomBorderline:) MyBorderline *bottomBorderLine MYMETHODDEPRECATED("use bottomBorderline to instead"); + +/** + *过期属性,请用boundBorderline + */ +@property(nonatomic, strong, getter=boundBorderline, setter=setBoundBorderline:) MyBorderline *boundBorderLine MYMETHODDEPRECATED("use boundBorderline to instead"); + +/** + *过期属性,请用intelligentBorderline + */ +@property(nonatomic, strong, getter=intelligentBorderline, setter=setIntelligentBorderline:) MyBorderline *IntelligentBorderLine MYMETHODDEPRECATED("use intelligentBorderline to instead"); + +/** + *过期属性,请用notUseIntelligentBorderline + */ +@property(nonatomic, assign, getter=notUseIntelligentBorderline, setter=setNotUseIntelligentBorderline:) BOOL notUseIntelligentBorderLine MYMETHODDEPRECATED("use notUseIntelligentBorderline to instead"); + + +/** + *这个属性在新版本将失效并且无任何意义了。如果想让子视图隐藏时是否继续占据位置则请参考使用子视图的myVisibility属性来进行单独设置。 + */ +@property(nonatomic, assign) BOOL hideSubviewReLayout MYMETHODDEPRECATED("this property was invalid, please use subview's myVisibility to instead"); + + @end + + diff --git a/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.m b/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.m index ab50f01..1140f1a 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyBaseLayout.m @@ -11,225 +11,319 @@ #import -const char * const ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES = "ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES"; -const char * const ASSOCIATEDOBJECT_KEY_MYLAYOUT_ABSPOS = "ASSOCIATEDOBJECT_KEY_MYLAYOUT_ABSPOS"; +const char * const ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME = "ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME"; +void* _myObserverContextA = (void*)20175281; +void* _myObserverContextB = (void*)20175282; +void* _myObserverContextC = (void*)20175283; -@implementation UIView(MyLayoutExt) +CGFloat _myMyLayoutScale = 1.0; +CGFloat _myMLayoutSizeError = 0.0; +@implementation UIView(MyLayoutExt) --(MyLayoutPos*)leftPos ++(void)load { - - MyLayoutPos *pos = self.myCurrentSizeClass.leftPos; - pos.view = self; - return pos; + _myMyLayoutScale = [UIScreen mainScreen].scale; + _myMLayoutSizeError = (1.0 / _myMyLayoutScale + 0.0001); //误差增量。 } -(MyLayoutPos*)topPos { - MyLayoutPos *pos = self.myCurrentSizeClass.topPos; - pos.view = self; - return pos; + return self.myCurrentSizeClass.topPos; } +-(MyLayoutPos*)leadingPos +{ + return self.myCurrentSizeClass.leadingPos; +} --(MyLayoutPos*)rightPos + + +-(MyLayoutPos*)bottomPos { + return self.myCurrentSizeClass.bottomPos; +} - MyLayoutPos *pos = self.myCurrentSizeClass.rightPos; - pos.view = self; - return pos; - + +-(MyLayoutPos*)trailingPos +{ + return self.myCurrentSizeClass.trailingPos; } --(MyLayoutPos*)bottomPos + +-(MyLayoutPos*)centerXPos { - - MyLayoutPos *pos = self.myCurrentSizeClass.bottomPos; - pos.view = self; - return pos; - + return self.myCurrentSizeClass.centerXPos; } --(CGFloat)myLeftMargin + +-(MyLayoutPos*)centerYPos { - return self.leftPos.margin; + return self.myCurrentSizeClass.centerYPos; } --(void)setMyLeftMargin:(CGFloat)leftMargin + +-(MyLayoutPos*)leftPos { - self.leftPos.equalTo(@(leftMargin)); - + return self.myCurrentSizeClass.leftPos; } --(CGFloat)myTopMargin +-(MyLayoutPos*)rightPos { - return self.topPos.margin; + return self.myCurrentSizeClass.rightPos; } --(void)setMyTopMargin:(CGFloat)topMargin + + + +-(CGFloat)myTop { - self.topPos.equalTo(@(topMargin)); + return self.myCurrentSizeClass.myTop; } --(CGFloat)myRightMargin +-(void)setMyTop:(CGFloat)myTop { - return self.rightPos.margin; + self.myCurrentSizeClass.myTop = myTop; } --(void)setMyRightMargin:(CGFloat)rightMargin +-(CGFloat)myLeading { - self.rightPos.equalTo(@(rightMargin)); + return self.myCurrentSizeClass.myLeading; } --(CGFloat)myBottomMargin +-(void)setMyLeading:(CGFloat)myLeading { - return self.bottomPos.margin; + self.myCurrentSizeClass.myLeading = myLeading; } --(void)setMyBottomMargin:(CGFloat)bottomMargin + +-(CGFloat)myBottom { - self.bottomPos.equalTo(@(bottomMargin)); + return self.myCurrentSizeClass.myBottom; } --(CGFloat)myMargin +-(void)setMyBottom:(CGFloat)myBottom { - return self.leftPos.margin; + self.myCurrentSizeClass.myBottom = myBottom; } --(void)setMyMargin:(CGFloat)myMargin + + +-(CGFloat)myTrailing { - self.topPos.equalTo(@(myMargin)); - self.leftPos.equalTo(@(myMargin)); - self.rightPos.equalTo(@(myMargin)); - self.bottomPos.equalTo(@(myMargin)); + return self.myCurrentSizeClass.myTrailing; } --(MyLayoutDime*)widthDime +-(void)setMyTrailing:(CGFloat)myTrailing { + self.myCurrentSizeClass.myTrailing = myTrailing; +} - MyLayoutDime *dime = self.myCurrentSizeClass.widthDime; - dime.view = self; - return dime; - + +-(CGFloat)myCenterX +{ + return self.myCurrentSizeClass.myCenterX; +} + +-(void)setMyCenterX:(CGFloat)myCenterX +{ + self.myCurrentSizeClass.myCenterX = myCenterX; } +-(CGFloat)myCenterY +{ + return self.myCurrentSizeClass.myCenterY; +} + +-(void)setMyCenterY:(CGFloat)myCenterY +{ + self.myCurrentSizeClass.myCenterY = myCenterY; +} --(MyLayoutDime*)heightDime +-(CGPoint)myCenter { + return self.myCurrentSizeClass.myCenter; +} - MyLayoutDime *dime = self.myCurrentSizeClass.heightDime; - dime.view = self; - return dime; +-(void)setMyCenter:(CGPoint)myCenter +{ + self.myCurrentSizeClass.myCenter = myCenter; } --(CGFloat)myWidth +-(CGFloat)myLeft { - return self.widthDime.measure; + return self.myCurrentSizeClass.myLeft; } --(void)setMyWidth:(CGFloat)width +-(void)setMyLeft:(CGFloat)myLeft { - self.widthDime.equalTo(@(width)); + self.myCurrentSizeClass.myLeft = myLeft; } --(CGFloat)myHeight +-(CGFloat)myRight { - return self.heightDime.measure; + return self.myCurrentSizeClass.myRight; } --(void)setMyHeight:(CGFloat)height +-(void)setMyRight:(CGFloat)myRight { - self.heightDime.equalTo(@(height)); + self.myCurrentSizeClass.myRight = myRight; } --(CGSize)mySize + + +-(CGFloat)myMargin { - return CGSizeMake(self.myWidth, self.myHeight); + return self.myCurrentSizeClass.myMargin; } --(void)setMySize:(CGSize)mySize +-(void)setMyMargin:(CGFloat)myMargin { - self.myWidth = mySize.width; - self.myHeight = mySize.height; + self.myCurrentSizeClass.myMargin = myMargin; } +-(CGFloat)myHorzMargin +{ + return self.myCurrentSizeClass.myHorzMargin; +} +-(void)setMyHorzMargin:(CGFloat)myHorzMargin +{ + self.myCurrentSizeClass.myHorzMargin = myHorzMargin; +} --(MyLayoutPos*)centerXPos +-(CGFloat)myVertMargin { - MyLayoutPos *pos = self.myCurrentSizeClass.centerXPos; - pos.view = self; - return pos; - + return self.myCurrentSizeClass.myVertMargin; } +-(void)setMyVertMargin:(CGFloat)myVertMargin +{ + self.myCurrentSizeClass.myVertMargin = myVertMargin; +} --(MyLayoutPos*)centerYPos + +-(MyLayoutSize*)widthSize { - - MyLayoutPos *pos = self.myCurrentSizeClass.centerYPos; - pos.view = self; - return pos; + return self.myCurrentSizeClass.widthSize; } --(CGFloat)myCenterXOffset + +-(MyLayoutSize*)heightSize { - return self.centerXPos.margin; + return self.myCurrentSizeClass.heightSize; } --(void)setMyCenterXOffset:(CGFloat)centerXOffset + +-(CGFloat)myWidth { - self.centerXPos.equalTo(@(centerXOffset)); + return self.myCurrentSizeClass.myWidth; } --(CGFloat)myCenterYOffset + +-(void)setMyWidth:(CGFloat)myWidth { - return self.centerYPos.margin; + self.myCurrentSizeClass.myWidth = myWidth; } --(void)setMyCenterYOffset:(CGFloat)centerYOffset +-(CGFloat)myHeight { - self.centerYPos.equalTo(@(centerYOffset)); + return self.myCurrentSizeClass.myHeight; } +-(void)setMyHeight:(CGFloat)myHeight +{ + self.myCurrentSizeClass.myHeight = myHeight; +} --(CGPoint)myCenterOffset +-(CGSize)mySize { - return CGPointMake(self.myCenterXOffset, self.myCenterYOffset); + return self.myCurrentSizeClass.mySize; } --(void)setMyCenterOffset:(CGPoint)centerOffset +-(void)setMySize:(CGSize)mySize { - self.myCenterXOffset = centerOffset.x; - self.myCenterYOffset = centerOffset.y; + self.myCurrentSizeClass.mySize = mySize; } --(void)setFlexedHeight:(BOOL)flexedHeight +-(void)setWrapContentHeight:(BOOL)wrapContentHeight { - UIView *lsc = self.myCurrentSizeClass; - if (lsc.flexedHeight != flexedHeight) + UIView *sc = self.myCurrentSizeClass; + if (sc.wrapContentHeight != wrapContentHeight) { - lsc.flexedHeight = flexedHeight; + sc.wrapContentHeight = wrapContentHeight; if (self.superview != nil) [self.superview setNeedsLayout]; } } --(BOOL)isFlexedHeight +-(BOOL)wrapContentHeight +{ + //特殊处理,减少不必要的对象创建 + return self.myCurrentSizeClassInner.wrapContentHeight; +} + +-(void)setWrapContentWidth:(BOOL)wrapContentWidth +{ + UIView *sc = self.myCurrentSizeClass; + if (sc.wrapContentWidth != wrapContentWidth) + { + sc.wrapContentWidth = wrapContentWidth; + if (self.superview != nil) + [self.superview setNeedsLayout]; + } + +} + +-(BOOL)wrapContentWidth +{ + //特殊处理,减少不必要的对象创建 + return self.myCurrentSizeClassInner.wrapContentWidth; +} + + +-(BOOL)wrapContentSize +{ + return self.myCurrentSizeClassInner.wrapContentSize; +} + +-(void)setWrapContentSize:(BOOL)wrapContentSize +{ + UIView *sc = self.myCurrentSizeClass; + if (sc.wrapContentSize != wrapContentSize) + { + sc.wrapContentSize = wrapContentSize; + if (self.superview != nil) + [self.superview setNeedsLayout]; + } +} + +-(CGFloat)weight +{ + return self.myCurrentSizeClass.weight; +} + +-(void)setWeight:(CGFloat)weight { - return self.myCurrentSizeClass.isFlexedHeight; + UIView *sc = self.myCurrentSizeClass; + if (sc.weight != weight) + { + sc.weight = weight; + if (self.superview != nil) + [self.superview setNeedsLayout]; + } } + -(BOOL)useFrame { return self.myCurrentSizeClass.useFrame; @@ -237,10 +331,10 @@ -(BOOL)useFrame -(void)setUseFrame:(BOOL)useFrame { - UIView *lsc = self.myCurrentSizeClass; - if (lsc.useFrame != useFrame) + UIView *sc = self.myCurrentSizeClass; + if (sc.useFrame != useFrame) { - lsc.useFrame = useFrame; + sc.useFrame = useFrame; if (self.superview != nil) [ self.superview setNeedsLayout]; } @@ -254,24 +348,74 @@ -(BOOL)noLayout -(void)setNoLayout:(BOOL)noLayout { - UIView *lsc = self.myCurrentSizeClass; - if (lsc.noLayout != noLayout) + UIView *sc = self.myCurrentSizeClass; + if (sc.noLayout != noLayout) { - lsc.noLayout = noLayout; + sc.noLayout = noLayout; if (self.superview != nil) [ self.superview setNeedsLayout]; } } +-(MyVisibility)myVisibility +{ + return self.myCurrentSizeClass.myVisibility; +} + +-(void)setMyVisibility:(MyVisibility)myVisibility +{ + UIView *sc = self.myCurrentSizeClass; + if (sc.myVisibility != myVisibility) + { + sc.myVisibility = myVisibility; + if (myVisibility == MyVisibility_Visible) + self.hidden = NO; + else + self.hidden = YES; + + if (self.superview != nil) + [ self.superview setNeedsLayout]; + } + +} + +-(MyGravity)myAlignment +{ + return self.myCurrentSizeClass.myAlignment; +} + +-(void)setMyAlignment:(MyGravity)myAlignment +{ + UIView *sc = self.myCurrentSizeClass; + if (sc.myAlignment != myAlignment) + { + sc.myAlignment = myAlignment; + if (self.superview != nil) + [ self.superview setNeedsLayout]; + } + +} + + +-(void (^)(MyBaseLayout*, UIView*))viewLayoutCompleteBlock +{ + return self.myCurrentSizeClass.viewLayoutCompleteBlock; +} + +-(void)setViewLayoutCompleteBlock:(void (^)(MyBaseLayout *, UIView *))viewLayoutCompleteBlock +{ + self.myCurrentSizeClass.viewLayoutCompleteBlock = viewLayoutCompleteBlock; +} + -(CGRect)estimatedRect { - CGRect rect = self.absPos.frame; - if (rect.origin.x == CGFLOAT_MAX || rect.origin.y == CGFLOAT_MAX) + CGRect rect = self.myFrame.frame; + if (rect.size.width == CGFLOAT_MAX || rect.size.width == CGFLOAT_MAX) return self.frame; return rect; } @@ -285,12 +429,7 @@ -(void)resetMyLayoutSetting -(void)resetMyLayoutSettingInSizeClass:(MySizeClass)sizeClass { - NSMutableDictionary *dict = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES); - if (dict != nil) - { - [dict removeObjectForKey:@(sizeClass)]; - } - + [self.myFrame.sizeClasses removeObjectForKey:@(sizeClass)]; } @@ -305,33 +444,130 @@ -(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass -(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass copyFrom:(MySizeClass)srcSizeClass { - NSMutableDictionary *dict = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES); - if (dict == nil) - { - dict = [NSMutableDictionary new]; - objc_setAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - } + MyFrame *myFrame = self.myFrame; + if (myFrame.sizeClasses == nil) + myFrame.sizeClasses = [NSMutableDictionary new]; - MyLayoutSizeClass *myLayoutSizeClass = (MyLayoutSizeClass*)[dict objectForKey:@(sizeClass)]; + MyViewSizeClass *myLayoutSizeClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(sizeClass)]; if (myLayoutSizeClass == nil) { - MyLayoutSizeClass *srcLayoutSizeClass = (MyLayoutSizeClass*)[dict objectForKey:@(srcSizeClass)]; + MyViewSizeClass *srcLayoutSizeClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(srcSizeClass)]; if (srcLayoutSizeClass == nil) myLayoutSizeClass = [self createSizeClassInstance]; else myLayoutSizeClass = [srcLayoutSizeClass copy]; - - [dict setObject:myLayoutSizeClass forKey:@(sizeClass)]; + myLayoutSizeClass.view = self; + [myFrame.sizeClasses setObject:myLayoutSizeClass forKey:@(sizeClass)]; } - return (UIView*)myLayoutSizeClass; } +@end + +@implementation UIView(MyLayoutExtDeprecated) + + + + +-(CGFloat)myLeftMargin +{ + return self.myLeft; +} + +-(void)setMyLeftMargin:(CGFloat)myLeftMargin +{ + self.myLeft = myLeftMargin; +} + +-(CGFloat)myTopMargin +{ + return self.myTop; +} + +-(void)setMyTopMargin:(CGFloat)myTopMargin +{ + self.myTop = myTopMargin; +} + +-(CGFloat)myRightMargin +{ + return self.myRight; +} + +-(void)setMyRightMargin:(CGFloat)myRightMargin +{ + self.myRight = myRightMargin; +} + +-(CGFloat)myBottomMargin +{ + return self.myBottom; +} + +-(void)setMyBottomMargin:(CGFloat)myBottomMargin +{ + self.myBottom = myBottomMargin; +} + +-(MyLayoutSize*)widthDime +{ + return self.widthSize; +} + + + +-(MyLayoutSize*)heightDime +{ + return self.heightSize; +} + + +-(CGFloat)myCenterXOffset +{ + return self.myCenterX; +} + +-(void)setMyCenterXOffset:(CGFloat)myCenterXOffset +{ + self.myCenterX = myCenterXOffset; +} + +-(CGFloat)myCenterYOffset +{ + return self.myCenterY; +} + +-(void)setMyCenterYOffset:(CGFloat)myCenterYOffset +{ + self.myCenterY = myCenterYOffset; +} + + +-(CGPoint)myCenterOffset +{ + return self.myCenter; +} + +-(void)setMyCenterOffset:(CGPoint)myCenterOffset +{ + self.myCenter = myCenterOffset; +} + + + +-(void)setFlexedHeight:(BOOL)flexedHeight +{ + self.wrapContentHeight = flexedHeight; +} + +-(BOOL)isFlexedHeight +{ + return self.wrapContentHeight; +} @@ -349,13 +585,31 @@ -(instancetype)myDefaultSizeClass -(instancetype)myCurrentSizeClass { - if (self.absPos.sizeClass == nil) - self.absPos.sizeClass = [self myDefaultSizeClass]; + MyFrame *myFrame = self.myFrame; //减少多次访问,增加性能。 + if (myFrame.sizeClass == nil) + myFrame.sizeClass = [self myDefaultSizeClass]; + + return myFrame.sizeClass; +} + +-(instancetype)myCurrentSizeClassInner +{ + //如果没有则不会建立,为了优化减少不必要的建立。 + MyFrame *obj = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME); + return obj.sizeClass; +} + +-(instancetype)myCurrentSizeClassFrom:(MyFrame*)myFrame +{ + if (myFrame.sizeClass == nil) + myFrame.sizeClass = [self myDefaultSizeClass]; - return self.absPos.sizeClass; + return myFrame.sizeClass; } + + -(instancetype)myBestSizeClass:(MySizeClass)sizeClass { @@ -363,85 +617,82 @@ -(instancetype)myBestSizeClass:(MySizeClass)sizeClass MySizeClass hsc = sizeClass & 0x0C; MySizeClass ori = sizeClass & 0xC0; + MyFrame *myFrame = self.myFrame; - NSMutableDictionary *dict = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES); - if (dict == nil) - { - dict = [NSMutableDictionary new]; - objc_setAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_SIZECLASSES, dict, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - } - - if ([UIDevice currentDevice].systemVersion.floatValue < 8.0) - { - wsc = MySizeClass_wAny; - hsc = MySizeClass_hAny; - } - - - //first search the most exact SizeClass - MySizeClass searchSizeClass = wsc | hsc | ori; - MyLayoutSizeClass *myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; + if (myFrame.sizeClasses == nil) + myFrame.sizeClasses = [NSMutableDictionary new]; - searchSizeClass = wsc | hsc; - if (searchSizeClass != sizeClass) + MySizeClass searchSizeClass; + MyViewSizeClass *myClass = nil; + if (myFrame.multiple) { - MyLayoutSizeClass *myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; - } - - - searchSizeClass = MySizeClass_wAny | hsc | ori; - if (ori != 0 && searchSizeClass != sizeClass) - { - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; + //first search the most exact SizeClass + searchSizeClass = wsc | hsc | ori; + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; if (myClass != nil) return (UIView*)myClass; - } - - searchSizeClass = MySizeClass_wAny | hsc; - if (searchSizeClass != sizeClass) - { - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; - } - - searchSizeClass = wsc | MySizeClass_hAny | ori; - if (ori != 0 && searchSizeClass != sizeClass) - { - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; - } - - searchSizeClass = wsc | MySizeClass_hAny; - if (searchSizeClass != sizeClass) - { - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; - } - - searchSizeClass = MySizeClass_wAny | MySizeClass_hAny | ori; - if (ori != 0 && searchSizeClass != sizeClass) - { - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; - if (myClass != nil) - return (UIView*)myClass; + + searchSizeClass = wsc | hsc; + if (searchSizeClass != sizeClass) + { + MyViewSizeClass *myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + } + + + searchSizeClass = MySizeClass_wAny | hsc | ori; + if (ori != 0 && searchSizeClass != sizeClass) + { + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + + } + + searchSizeClass = MySizeClass_wAny | hsc; + if (searchSizeClass != sizeClass) + { + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + } + + searchSizeClass = wsc | MySizeClass_hAny | ori; + if (ori != 0 && searchSizeClass != sizeClass) + { + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + } + + searchSizeClass = wsc | MySizeClass_hAny; + if (searchSizeClass != sizeClass) + { + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + } + + searchSizeClass = MySizeClass_wAny | MySizeClass_hAny | ori; + if (ori != 0 && searchSizeClass != sizeClass) + { + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; + if (myClass != nil) + return (UIView*)myClass; + } + } searchSizeClass = MySizeClass_wAny | MySizeClass_hAny; - myClass = (MyLayoutSizeClass*)[dict objectForKey:@(searchSizeClass)]; + myClass = (MyViewSizeClass*)[myFrame.sizeClasses objectForKey:@(searchSizeClass)]; if (myClass == nil) { myClass = [self createSizeClassInstance]; - [dict setObject:myClass forKey:@(searchSizeClass)]; + myClass.view = self; + [myFrame.sizeClasses setObject:myClass forKey:@(searchSizeClass)]; } return (UIView*)myClass; @@ -450,14 +701,14 @@ -(instancetype)myBestSizeClass:(MySizeClass)sizeClass } --(MyLayoutMeasure*)absPos +-(MyFrame*)myFrame { - MyLayoutMeasure *obj = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_ABSPOS); + MyFrame *obj = objc_getAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME); if (obj == nil) { - obj = [MyLayoutMeasure new]; - objc_setAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_ABSPOS, obj, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + obj = [MyFrame new]; + objc_setAssociatedObject(self, ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME, obj, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @@ -466,307 +717,377 @@ -(MyLayoutMeasure*)absPos -(id)createSizeClassInstance { - return [MyLayoutSizeClass new]; + return [MyViewSizeClass new]; } +-(MyLayoutPos*)topPosInner +{ + return self.myCurrentSizeClass.topPosInner; +} -@end +-(MyLayoutPos*)leadingPosInner +{ + return self.myCurrentSizeClass.leadingPosInner; +} +-(MyLayoutPos*)bottomPosInner +{ + return self.myCurrentSizeClass.bottomPosInner; +} +-(MyLayoutPos*)trailingPosInner +{ + return self.myCurrentSizeClass.trailingPosInner; +} -@implementation MyBorderLineDraw --(id)init +-(MyLayoutPos*)centerXPosInner { - self = [super init]; - if (self != nil) - { - _color = [UIColor blackColor]; - _thick = 1; - _headIndent = 0; - _tailIndent = 0; - _dash = 0; - } - - return self; + return self.myCurrentSizeClass.centerXPosInner; } --(id)initWithColor:(UIColor *)color + +-(MyLayoutPos*)centerYPosInner { - self = [self init]; - if (self != nil) - { - _color = color; - } - - return self; + return self.myCurrentSizeClass.centerYPosInner; +} + + +-(MyLayoutPos*)leftPosInner +{ + return self.myCurrentSizeClass.leftPosInner; +} + +-(MyLayoutPos*)rightPosInner +{ + return self.myCurrentSizeClass.rightPosInner; +} + + + +-(MyLayoutSize*)widthSizeInner +{ + return self.myCurrentSizeClass.widthSizeInner; +} + + +-(MyLayoutSize*)heightSizeInner +{ + return self.myCurrentSizeClass.heightSizeInner; } -@end -/**绘制线条层委托实现类**/ -@interface MyBorderLineLayerDelegate : NSObject -@property(nonatomic ,weak) MyBaseLayout *layout; --(id)initWithLayout:(MyBaseLayout*)layout; + @end -@implementation MyBorderLineLayerDelegate --(id)initWithLayout:(MyBaseLayout*)layout +@implementation MyBorderline + + +-(id)init { - self = [self init]; + self = [super init]; if (self != nil) { - _layout = layout; + _color = [UIColor blackColor]; + _thick = 1; + _headIndent = 0; + _tailIndent = 0; + _dash = 0; } return self; } - --(void)layoutSublayersOfLayer:(CAShapeLayer *)layer +-(id)initWithColor:(UIColor *)color { - if (self.layout == nil) - return; - - CGSize layoutSize = self.layout.layer.bounds.size; - - CGRect layerRect; - CGPoint fromPoint; - CGPoint toPoint; - - if (layer == self.layout.leftBorderLineLayer) - { - layerRect = CGRectMake(0, self.layout.leftBorderLine.headIndent, self.layout.leftBorderLine.thick/2, layoutSize.height - self.layout.leftBorderLine.headIndent - self.layout.leftBorderLine.tailIndent); - fromPoint = CGPointMake(0, 0); - toPoint = CGPointMake(0, layerRect.size.height); - - } - else if (layer == self.layout.rightBorderLineLayer) - { - layerRect = CGRectMake(layoutSize.width - self.layout.rightBorderLine.thick / 2, self.layout.rightBorderLine.headIndent, self.layout.rightBorderLine.thick / 2, layoutSize.height - self.layout.rightBorderLine.headIndent - self.layout.rightBorderLine.tailIndent); - fromPoint = CGPointMake(0, 0); - toPoint = CGPointMake(0, layerRect.size.height); - - } - else if (layer == self.layout.topBorderLineLayer) - { - layerRect = CGRectMake(self.layout.topBorderLine.headIndent, 0, layoutSize.width - self.layout.topBorderLine.headIndent - self.layout.topBorderLine.tailIndent, self.layout.topBorderLine.thick/2); - fromPoint = CGPointMake(0, 0); - toPoint = CGPointMake(layerRect.size.width, 0); - } - else if (layer == self.layout.bottomBorderLineLayer) - { - layerRect = CGRectMake(self.layout.bottomBorderLine.headIndent, layoutSize.height - self.layout.bottomBorderLine.thick / 2, layoutSize.width - self.layout.bottomBorderLine.headIndent - self.layout.bottomBorderLine.tailIndent, self.layout.bottomBorderLine.thick /2); - fromPoint = CGPointMake(0, 0); - toPoint = CGPointMake(layerRect.size.width, 0); - } - else + self = [self init]; + if (self != nil) { - NSAssert(0, @"oops!"); + _color = color; } - - //把动画效果取消。 - if (!CGRectEqualToRect(layer.frame, layerRect)) - { - - [CATransaction begin]; - - [CATransaction setValue:(id)kCFBooleanTrue - forKey:kCATransactionDisableActions]; - - - - if (layer.lineDashPhase == 0) - { - layer.path = nil; - } - else - { - CGMutablePathRef path = CGPathCreateMutable(); - CGPathMoveToPoint(path, nil, fromPoint.x, fromPoint.y); - CGPathAddLineToPoint(path, nil, toPoint.x,toPoint.y); - layer.path = path; - CGPathRelease(path); + return self; +} - } - - - layer.frame = layerRect; - - - [CATransaction commit]; +-(void)setThick:(CGFloat)thick +{ + if (thick < 1) + thick = 1; + if (_thick != thick) + { + _thick = thick; } - } @end -@interface MyBaseLayout() - -@end - - -IB_DESIGNABLE @implementation MyBaseLayout { - __weak id _target; - SEL _action; - - __weak id _touchDownTarget; - SEL _touchDownAction; - - __weak id _touchCancelTarget; - SEL _touchCancelAction; - BOOL _hasDoCancel; - - - UIColor *_oldBackgroundColor; - UIImage *_oldBackgroundImage; - - CGFloat _oldAlpha; - CGFloat _highlightedOpacity; + MyTouchEventDelegate *_touchEventDelegate; - BOOL _forbidTouch; - BOOL _canCallAction; - CGPoint _beginPoint; - MyBorderLineLayerDelegate *_layerDelegate; + MyBorderlineLayerDelegate *_borderlineLayerDelegate; BOOL _isAddSuperviewKVO; + int _lastScreenOrientation; //为0为初始状态,为1为竖屏,为2为横屏。内部使用。 + + BOOL _useCacheRects; } -BOOL _hasBegin; -(void)dealloc { //如果您在使用时出现了KVO的异常崩溃,原因是您将这个视图被多次加入为子视图,请检查您的代码,是否这个视图被多次加入!! + _endLayoutBlock = nil; + _beginLayoutBlock = nil; + _rotationToDeviceOrientationBlock = nil; } -#pragma mark -- Public Method - --(void)setPadding:(UIEdgeInsets)padding ++(BOOL)isRTL { - MyBaseLayout *lsc = self.myCurrentSizeClass; - if (!UIEdgeInsetsEqualToEdgeInsets(lsc.padding, padding)) - { - lsc.padding = padding; - [self setNeedsLayout]; - } + return [MyViewSizeClass isRTL]; } --(UIEdgeInsets)padding ++(void)setIsRTL:(BOOL)isRTL { - return self.myCurrentSizeClass.padding; + [MyViewSizeClass setIsRTL:isRTL]; } --(void)setLeftPadding:(CGFloat)leftPadding -{ - MyBaseLayout *lsc = self.myCurrentSizeClass; - [self setPadding:UIEdgeInsetsMake(lsc.padding.top, leftPadding, lsc.padding.bottom,lsc.padding.right)]; -} +#pragma mark -- Public Method --(CGFloat)leftPadding + +-(CGFloat)topPadding { - return self.myCurrentSizeClass.padding.left; + return self.myCurrentSizeClass.topPadding; } -(void)setTopPadding:(CGFloat)topPadding { MyBaseLayout *lsc = self.myCurrentSizeClass; - [self setPadding:UIEdgeInsetsMake(topPadding, lsc.padding.left, lsc.padding.bottom,lsc.padding.right)]; + if (lsc.topPadding != topPadding) + { + lsc.topPadding = topPadding; + [self setNeedsLayout]; + } } --(CGFloat)topPadding +-(CGFloat)leadingPadding { - return self.myCurrentSizeClass.padding.top; + return self.myCurrentSizeClass.leadingPadding; } --(void)setRightPadding:(CGFloat)rightPadding +-(void)setLeadingPadding:(CGFloat)leadingPadding { MyBaseLayout *lsc = self.myCurrentSizeClass; - [self setPadding:UIEdgeInsetsMake(lsc.padding.top, lsc.padding.left, lsc.padding.bottom, rightPadding)]; + if (lsc.leadingPadding != leadingPadding) + { + lsc.leadingPadding = leadingPadding; + [self setNeedsLayout]; + } } --(CGFloat)rightPadding + +-(CGFloat)bottomPadding { - return self.myCurrentSizeClass.padding.right; + return self.myCurrentSizeClass.bottomPadding; } -(void)setBottomPadding:(CGFloat)bottomPadding { MyBaseLayout *lsc = self.myCurrentSizeClass; - [self setPadding:UIEdgeInsetsMake(lsc.padding.top, lsc.padding.left, bottomPadding, lsc.padding.right)]; + if (lsc.bottomPadding != bottomPadding) + { + lsc.bottomPadding = bottomPadding; + [self setNeedsLayout]; + } } --(CGFloat)bottomPadding + +-(CGFloat)trailingPadding { - return self.myCurrentSizeClass.padding.bottom; + return self.myCurrentSizeClass.trailingPadding; } - - --(void)setWrapContentHeight:(BOOL)wrapContentHeight +-(void)setTrailingPadding:(CGFloat)trailingPadding { MyBaseLayout *lsc = self.myCurrentSizeClass; - - if (lsc.wrapContentHeight != wrapContentHeight) + if (lsc.trailingPadding != trailingPadding) { - lsc.wrapContentHeight = wrapContentHeight; + lsc.trailingPadding = trailingPadding; [self setNeedsLayout]; } } --(BOOL)wrapContentHeight + +-(UIEdgeInsets)padding { - return self.myCurrentSizeClass.wrapContentHeight; + return self.myCurrentSizeClass.padding; } --(void)setWrapContentWidth:(BOOL)wrapContentWidth +-(void)setPadding:(UIEdgeInsets)padding { MyBaseLayout *lsc = self.myCurrentSizeClass; - - if (lsc.wrapContentWidth != wrapContentWidth) + if (!UIEdgeInsetsEqualToEdgeInsets(lsc.padding, padding)) { - lsc.wrapContentWidth = wrapContentWidth; + lsc.padding = padding; [self setNeedsLayout]; } } --(BOOL)wrapContentWidth + +-(CGFloat)leftPadding { - return self.myCurrentSizeClass.wrapContentWidth; + return self.myCurrentSizeClass.leftPadding; } - --(void)setHideSubviewReLayout:(BOOL)hideSubviewReLayout +-(void)setLeftPadding:(CGFloat)leftPadding { MyBaseLayout *lsc = self.myCurrentSizeClass; - - if (lsc.hideSubviewReLayout != hideSubviewReLayout) + if (lsc.leftPadding != leftPadding) { - lsc.hideSubviewReLayout = hideSubviewReLayout; + lsc.leftPadding = leftPadding; [self setNeedsLayout]; } - } --(BOOL)hideSubviewReLayout + +-(CGFloat)rightPadding { - return self.myCurrentSizeClass.hideSubviewReLayout; + return self.myCurrentSizeClass.rightPadding; } - +-(void)setRightPadding:(CGFloat)rightPadding +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.rightPadding != rightPadding) + { + lsc.rightPadding = rightPadding; + [self setNeedsLayout]; + } +} + +-(BOOL)zeroPadding +{ + return self.myCurrentSizeClass.zeroPadding; +} + +-(void)setZeroPadding:(BOOL)zeroPadding +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.zeroPadding != zeroPadding) + { + lsc.zeroPadding = zeroPadding; + [self setNeedsLayout]; + } +} + + + +-(void)setSubviewHSpace:(CGFloat)subviewHSpace +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + + if (lsc.subviewHSpace != subviewHSpace) + { + lsc.subviewHSpace = subviewHSpace; + [self setNeedsLayout]; + } +} + +-(CGFloat)subviewHSpace +{ + return self.myCurrentSizeClass.subviewHSpace; +} + +-(void)setSubviewVSpace:(CGFloat)subviewVSpace +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.subviewVSpace != subviewVSpace) + { + lsc.subviewVSpace = subviewVSpace; + [self setNeedsLayout]; + } +} + +-(CGFloat)subviewVSpace +{ + return self.myCurrentSizeClass.subviewVSpace; +} + +-(void)setSubviewSpace:(CGFloat)subviewSpace +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + + if (lsc.subviewSpace != subviewSpace) + { + lsc.subviewSpace = subviewSpace; + [self setNeedsLayout]; + } +} + +-(CGFloat)subviewSpace +{ + return self.myCurrentSizeClass.subviewSpace; +} + +-(void)setGravity:(MyGravity)gravity +{ + + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.gravity != gravity) + { + lsc.gravity = gravity; + [self setNeedsLayout]; + } +} + +-(MyGravity)gravity +{ + return self.myCurrentSizeClass.gravity; +} + + + +-(void)setReverseLayout:(BOOL)reverseLayout +{ + + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.reverseLayout != reverseLayout) + { + lsc.reverseLayout = reverseLayout; + [self setNeedsLayout]; + } +} + +-(BOOL)reverseLayout +{ + return self.myCurrentSizeClass.reverseLayout; +} + + + +-(void)setHideSubviewReLayout:(BOOL)hideSubviewReLayout +{ + //这个属性已经无效了,请单独设置子视图的myVisibility属性来控制视图的显示与否。 + NSAssert(0, @"oops!, hideSubviewReLayout is invalid please use subview's myVisibility to instead!!!"); +} + +-(BOOL)hideSubviewReLayout +{ + return NO; +} + + -(void)layoutAnimationWithDuration:(NSTimeInterval)duration { self.beginLayoutBlock = ^{ @@ -781,70 +1102,112 @@ -(void)layoutAnimationWithDuration:(NSTimeInterval)duration }; } +-(MyBorderline*)topBorderline +{ + return _borderlineLayerDelegate.topBorderline; +} + +-(void)setTopBorderline:(MyBorderline *)topBorderline +{ + if (_borderlineLayerDelegate == nil) + { + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; + } + + _borderlineLayerDelegate.topBorderline = topBorderline; +} +-(MyBorderline*)leadingBorderline +{ + return _borderlineLayerDelegate.leadingBorderline; +} --(void)setBottomBorderLine:(MyBorderLineDraw *)bottomBorderLine +-(void)setLeadingBorderline:(MyBorderline *)leadingBorderline { - if (_bottomBorderLine != bottomBorderLine) + if (_borderlineLayerDelegate == nil) { - _bottomBorderLine = bottomBorderLine; + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; + } - CAShapeLayer *borderLayer = _bottomBorderLineLayer; - [self updateBorderLayer:&borderLayer withBorderLineDraw:_bottomBorderLine]; - _bottomBorderLineLayer = borderLayer; + _borderlineLayerDelegate.leadingBorderline = leadingBorderline; +} + +-(MyBorderline*)bottomBorderline +{ + return _borderlineLayerDelegate.bottomBorderline; +} + +-(void)setBottomBorderline:(MyBorderline *)bottomBorderline +{ + if (_borderlineLayerDelegate == nil) + { + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; } + + _borderlineLayerDelegate.bottomBorderline = bottomBorderline; +} + + +-(MyBorderline*)trailingBorderline +{ + return _borderlineLayerDelegate.trailingBorderline; } --(void)setTopBorderLine:(MyBorderLineDraw *)topBorderLine +-(void)setTrailingBorderline:(MyBorderline *)trailingBorderline { - if (_topBorderLine != topBorderLine) + if (_borderlineLayerDelegate == nil) { - _topBorderLine = topBorderLine; - - CAShapeLayer *borderLayer = _topBorderLineLayer; - [self updateBorderLayer:&borderLayer withBorderLineDraw:_topBorderLine]; - _topBorderLineLayer = borderLayer; - + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; } + + _borderlineLayerDelegate.trailingBorderline = trailingBorderline; +} + + + +-(MyBorderline*)leftBorderline +{ + return _borderlineLayerDelegate.leftBorderline; } --(void)setLeftBorderLine:(MyBorderLineDraw *)leftBorderLine +-(void)setLeftBorderline:(MyBorderline *)leftBorderline { - if (_leftBorderLine != leftBorderLine) + if (_borderlineLayerDelegate == nil) { - _leftBorderLine = leftBorderLine; - - CAShapeLayer *borderLayer = _leftBorderLineLayer; - [self updateBorderLayer:&borderLayer withBorderLineDraw:_leftBorderLine]; - _leftBorderLineLayer = borderLayer; + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; } + + _borderlineLayerDelegate.leftBorderline = leftBorderline; } --(void)setRightBorderLine:(MyBorderLineDraw *)rightBorderLine + +-(MyBorderline*)rightBorderline +{ + return _borderlineLayerDelegate.rightBorderline; +} + +-(void)setRightBorderline:(MyBorderline *)rightBorderline { - if (_rightBorderLine != rightBorderLine) + if (_borderlineLayerDelegate == nil) { - _rightBorderLine = rightBorderLine; - - CAShapeLayer *borderLayer = _rightBorderLineLayer; - [self updateBorderLayer:&borderLayer withBorderLineDraw:_rightBorderLine]; - _rightBorderLineLayer = borderLayer; + _borderlineLayerDelegate = [[MyBorderlineLayerDelegate alloc] initWithLayout:self]; } + _borderlineLayerDelegate.rightBorderline = rightBorderline; } --(void)setBoundBorderLine:(MyBorderLineDraw *)boundBorderLine +-(void)setBoundBorderline:(MyBorderline *)boundBorderline { - self.leftBorderLine = boundBorderLine; - self.rightBorderLine = boundBorderLine; - self.topBorderLine = boundBorderLine; - self.bottomBorderLine = boundBorderLine; + self.leadingBorderline = boundBorderline; + self.trailingBorderline = boundBorderline; + self.topBorderline = boundBorderline; + self.bottomBorderline = boundBorderline; } --(MyBorderLineDraw*)boundBorderLine +-(MyBorderline*)boundBorderline { - return self.leftBorderLine; + return self.bottomBorderline; } -(void)setBackgroundImage:(UIImage *)backgroundImage @@ -858,65 +1221,116 @@ -(void)setBackgroundImage:(UIImage *)backgroundImage -//只获取计算得到尺寸,不进行真正的布局。 --(CGRect)estimateLayoutRect:(CGSize)size -{ - return [self estimateLayoutRect:size inSizeClass:MySizeClass_wAny | MySizeClass_hAny]; -} - --(CGRect)estimateLayoutRect:(CGSize)size inSizeClass:(MySizeClass)sizeClass +-(CGRect)estimateLayoutRect:(CGSize)size inSizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs { + MyFrame *selfMyFrame = self.myFrame; + + if (selfMyFrame.multiple) + selfMyFrame.sizeClass = [self myBestSizeClass:sizeClass]; - self.absPos.sizeClass = [self myBestSizeClass:sizeClass]; for (UIView *sbv in self.subviews) { - sbv.absPos.sizeClass = [sbv myBestSizeClass:sizeClass]; + MyFrame *sbvmyFrame = sbv.myFrame; + if (sbvmyFrame.multiple) + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; } BOOL hasSubLayout = NO; - CGRect rect; - self.absPos.frame = [self calcLayoutRect:size isEstimate:NO pHasSubLayout:&hasSubLayout sizeClass:sizeClass]; - if (!hasSubLayout) - rect = self.absPos.frame; - else + CGSize selfSize= [self calcLayoutRect:size isEstimate:NO pHasSubLayout:&hasSubLayout sizeClass:sizeClass sbs:sbs]; + + if (hasSubLayout) { - rect = [self calcLayoutRect:CGSizeZero isEstimate:YES pHasSubLayout:&hasSubLayout sizeClass:sizeClass]; - self.absPos.frame = rect; + selfMyFrame.width = selfSize.width; + selfMyFrame.height = selfSize.height; + + selfSize = [self calcLayoutRect:CGSizeZero isEstimate:YES pHasSubLayout:&hasSubLayout sizeClass:sizeClass sbs:sbs]; } - + + selfMyFrame.width = selfSize.width; + selfMyFrame.height = selfSize.height; + + //计算后还原为默认sizeClass for (UIView *sbv in self.subviews) { - sbv.absPos.sizeClass = self.myDefaultSizeClass; - + MyFrame *sbvmyFrame = sbv.myFrame; + if (sbvmyFrame.multiple) + sbvmyFrame.sizeClass = self.myDefaultSizeClass; } - self.absPos.sizeClass = self.myDefaultSizeClass; + if (selfMyFrame.multiple) + selfMyFrame.sizeClass = self.myDefaultSizeClass; - return rect; + if (self.cacheEstimatedRect) + _useCacheRects = YES; + + return CGRectMake(0, 0, _myRoundNumber(selfSize.width), _myRoundNumber(selfSize.height)); +} + +//只获取计算得到尺寸,不进行真正的布局。 +-(CGRect)estimateLayoutRect:(CGSize)size +{ + return [self estimateLayoutRect:size inSizeClass:MySizeClass_wAny | MySizeClass_hAny]; +} + +-(CGRect)estimateLayoutRect:(CGSize)size inSizeClass:(MySizeClass)sizeClass +{ + return [self estimateLayoutRect:size inSizeClass:sizeClass sbs:nil]; +} + +-(void)setCacheEstimatedRect:(BOOL)cacheEstimatedRect +{ + _cacheEstimatedRect = cacheEstimatedRect; + _useCacheRects = NO; +} + + +-(CGRect)subview:(UIView*)subview estimatedRectInLayoutSize:(CGSize)size +{ + if (subview.superview == self) + return subview.frame; + NSMutableArray *sbs = [self myGetLayoutSubviews]; + [sbs addObject:subview]; + + [self estimateLayoutRect:size inSizeClass:MySizeClass_wAny | MySizeClass_hAny sbs:sbs]; + + return [subview estimatedRect]; } + -(void)setTarget:(id)target action:(SEL)action { - _target = target; - _action = action; + if (_touchEventDelegate == nil) + { + _touchEventDelegate = [[MyTouchEventDelegate alloc] initWithLayout:self]; + } + + [_touchEventDelegate setTarget:target action:action]; } -(void)setTouchDownTarget:(id)target action:(SEL)action { - _touchDownTarget = target; - _touchDownAction = action; + if (_touchEventDelegate == nil) + { + _touchEventDelegate = [[MyTouchEventDelegate alloc] initWithLayout:self]; + } + + [_touchEventDelegate setTouchDownTarget:target action:action]; } -(void)setTouchCancelTarget:(id)target action:(SEL)action { - _touchCancelTarget = target; - _touchCancelAction = action; + if (_touchEventDelegate == nil) + { + _touchEventDelegate = [[MyTouchEventDelegate alloc] initWithLayout:self]; + } + + [_touchEventDelegate setTouchCancelTarget:target action:action]; } @@ -927,253 +1341,153 @@ -(void)setTouchCancelTarget:(id)target action:(SEL)action #pragma mark -- Touches Event - - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { - UITouch *touch = [touches anyObject]; - if (_target != nil && !_forbidTouch && touch.tapCount == 1 && !_hasBegin) - { - _hasBegin = YES; - _canCallAction = YES; - _beginPoint = [((UITouch*)[touches anyObject]) locationInView:self]; - - if (_highlightedOpacity != 0) - { - _oldAlpha = self.alpha; - self.alpha = 1 - _highlightedOpacity; - } - - if (_highlightedBackgroundColor != nil) - { - _oldBackgroundColor = self.backgroundColor; - self.backgroundColor = _highlightedBackgroundColor; - } - - if (_highlightedBackgroundImage != nil) - { - _oldBackgroundImage = self.backgroundImage; - self.backgroundImage = _highlightedBackgroundImage; - } - - _hasDoCancel = NO; - if (_touchDownTarget != nil && _touchDownAction != nil) - { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [_touchDownTarget performSelector:_touchDownAction withObject:self]; -#pragma clang diagnostic pop - - } - - } + + [_touchEventDelegate touchesBegan:touches withEvent:event]; [super touchesBegan:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { - if (_target != nil && _hasBegin) - { - if (_canCallAction) - { - CGPoint pt = [((UITouch*)[touches anyObject]) locationInView:self]; - if (fabs(pt.x - _beginPoint.x) > 2 || fabs(pt.y - _beginPoint.y) > 2) - { - _canCallAction = NO; - - if (!_hasDoCancel) - { - - if (_touchCancelTarget != nil && _touchCancelAction != nil) - { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [_touchCancelTarget performSelector:_touchCancelAction withObject:self]; -#pragma clang diagnostic pop + [_touchEventDelegate touchesMoved:touches withEvent:event]; + [super touchesMoved:touches withEvent:event]; +} - } - - _hasDoCancel = YES; - } - - } - } - } - - [super touchesMoved:touches withEvent:event]; +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + [_touchEventDelegate touchesEnded:touches withEvent:event]; + [super touchesEnded:touches withEvent:event]; } --(void)doTargetAction:(UITouch*)touch +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + [_touchEventDelegate touchesCancelled:touches withEvent:event]; + [super touchesCancelled:touches withEvent:event]; +} + + + +#pragma mark -- KVO + + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(UIView*)object change:(NSDictionary *)change context:(void *)context { - if (_highlightedOpacity != 0) - { - self.alpha = _oldAlpha; - _oldAlpha = 1; - } - - if (_highlightedBackgroundColor != nil) + //监控非布局父视图的frame的变化,而改变自身的位置和尺寸 + if (context == _myObserverContextC) { - self.backgroundColor = _oldBackgroundColor; - _oldBackgroundColor = nil; + //只监控父视图的尺寸变换 + CGRect rcOld = [change[NSKeyValueChangeOldKey] CGRectValue]; + CGRect rcNew = [change[NSKeyValueChangeNewKey] CGRectValue]; + if (!_myCGSizeEqual(rcOld.size, rcNew.size)) + { + [self myUpdateLayoutRectInNoLayoutSuperview:object]; + } + return; } - - if (_highlightedBackgroundImage != nil) + + //监控子视图的frame的变化以便重新进行布局 + if (!_isMyLayouting) { - self.backgroundImage = _oldBackgroundImage; - _oldBackgroundImage = nil; - } - - - //距离太远则不会处理 - CGPoint pt = [touch locationInView:self]; - if (CGRectContainsPoint(self.bounds, pt) && _action != nil && _canCallAction) - { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [_target performSelector:_action withObject:self]; -#pragma clang diagnostic pop - - } - else - { - if (!_hasDoCancel) + + if (context == _myObserverContextA) { - if (_touchCancelTarget != nil && _touchCancelAction != nil) + [self setNeedsLayout]; + //这里添加的原因是有可能子视图取消隐藏后不会绘制自身,所以这里要求子视图重新绘制自身 + if ([keyPath isEqualToString:@"hidden"] && ![change[NSKeyValueChangeNewKey] boolValue]) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [_touchCancelTarget performSelector:_touchCancelAction withObject:self]; -#pragma clang diagnostic pop - + [(UIView*)object setNeedsDisplay]; } - _hasDoCancel = YES; } - + else if (context == _myObserverContextB) + {//针对UILabel特殊处理。。 + + UIView *sbvsc = object.myCurrentSizeClass; + + if (sbvsc.widthSizeInner.dimeSelfVal != nil && sbvsc.heightSizeInner.dimeSelfVal != nil) + { + [self setNeedsLayout]; + } + else if (sbvsc.wrapContentWidth || + sbvsc.wrapContentHeight || + sbvsc.widthSizeInner.dimeSelfVal != nil || + sbvsc.heightSizeInner.dimeSelfVal != nil) + { + [object sizeToFit]; + } + } } - - _forbidTouch = NO; - } -- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +#pragma mark -- Override Method + + + +-(void)setWrapContentHeight:(BOOL)wrapContentHeight { - - if (_target != nil && _hasBegin) + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.wrapContentHeight != wrapContentHeight) { - //设置一个延时. - _forbidTouch = YES; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [self performSelector:@selector(doTargetAction:) withObject:[touches anyObject] afterDelay:0.12]; -#pragma clang diagnostic pop - - _hasBegin = NO; + lsc.wrapContentHeight = wrapContentHeight; + [self setNeedsLayout]; } - - - [super touchesEnded:touches withEvent:event]; } -- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event + +-(void)setWrapContentWidth:(BOOL)wrapContentWidth { - - if (_target != nil && _hasBegin) + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.wrapContentWidth != wrapContentWidth) { - if (_highlightedOpacity != 0) - { - self.alpha = _oldAlpha; - _oldAlpha = 1; - } - - if (_highlightedBackgroundColor != nil) - { - self.backgroundColor = _oldBackgroundColor; - _oldBackgroundColor = nil; - } - - if (_highlightedBackgroundImage != nil) - { - self.backgroundImage = _oldBackgroundImage; - _oldBackgroundImage = nil; - } - - - _hasBegin = NO; - - if (!_hasDoCancel) - { - if (_touchCancelTarget != nil && _touchCancelAction != nil) - { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [_touchCancelTarget performSelector:_touchCancelAction withObject:self]; -#pragma clang diagnostic pop - - } - - _hasDoCancel = YES; - - } - + lsc.wrapContentWidth = wrapContentWidth; + [self setNeedsLayout]; } - - [super touchesCancelled:touches withEvent:event]; } +-(void)setWrapContentSize:(BOOL)wrapContentSize +{ + MyBaseLayout *lsc = self.myCurrentSizeClass; + if (lsc.wrapContentSize != wrapContentSize) + { + lsc.wrapContentSize = wrapContentSize; + [self setNeedsLayout]; + } +} -#pragma mark -- KVO - -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(UIView*)object change:(NSDictionary *)change context:(void *)context +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs { - - //监控非布局父视图的frame的变化,而改变自身的位置和尺寸 - if (object == self.superview && ![object isKindOfClass:[MyBaseLayout class]]) + CGSize selfSize; + if (isEstimate) + selfSize = self.myFrame.frame.size; + else { - - if ([keyPath isEqualToString:@"frame"] || - [keyPath isEqualToString:@"bounds"] ) - { - [self setLayoutRectInNoLayoutSuperview:object]; - } - return; + selfSize = self.bounds.size; + if (size.width != 0) + selfSize.width = size.width; + if (size.height != 0) + selfSize.height = size.height; } + if (pHasSubLayout != nil) + *pHasSubLayout = NO; - //监控子视图的frame的变化以便重新进行布局 - if ([keyPath isEqualToString:@"frame"] || - [keyPath isEqualToString:@"hidden"] ) - { - if (!_isMyLayouting && [self.subviews containsObject:object]) - { - if (![object useFrame]) - { - [self setNeedsLayout]; - - //这里添加的原因是有可能子视图取消隐藏后不会绘制自身,所以这里要求子视图重新绘制自身 - if ([keyPath isEqualToString:@"hidden"] && ![change[NSKeyValueChangeNewKey] boolValue]) - { - [(UIView*)object setNeedsDisplay]; - } - } - } - } + return selfSize; } -#pragma mark -- Override Method - -(id)createSizeClassInstance { - return [MyLayoutSizeClassLayout new]; + return [MyLayoutViewSizeClass new]; } @@ -1184,22 +1498,22 @@ -(CGSize)sizeThatFits:(CGSize)size -(void)setHidden:(BOOL)hidden { + if (self.isHidden == hidden) + return; + [super setHidden:hidden]; if (hidden == NO) { - if (_topBorderLineLayer != nil) - [_topBorderLineLayer setNeedsLayout]; - - if (_bottomBorderLineLayer != nil) - [_bottomBorderLineLayer setNeedsLayout]; - + + [_borderlineLayerDelegate setNeedsLayout]; - if (_leftBorderLineLayer != nil) - [_leftBorderLineLayer setNeedsLayout]; + if ([self.superview isKindOfClass:[MyBaseLayout class]]) + { + [self setNeedsLayout]; + } - if (_rightBorderLineLayer != nil) - [_rightBorderLineLayer setNeedsLayout]; } + } @@ -1208,99 +1522,122 @@ - (void)didAddSubview:(UIView *)subview { [super didAddSubview:subview]; //只要加入进来后就修改其默认的实现,而改用我们的实现,这里包括隐藏,调整大小, - //添加hidden, frame,center的属性通知。 - [subview addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:nil]; - [subview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; + if ([subview isKindOfClass:[MyBaseLayout class]]) + { + ((MyBaseLayout*)subview).cacheEstimatedRect = self.cacheEstimatedRect; + } + } - (void)willRemoveSubview:(UIView *)subview { [super willRemoveSubview:subview]; //删除后恢复其原来的实现。 - - [subview removeObserver:self forKeyPath:@"hidden"]; - [subview removeObserver:self forKeyPath:@"frame"]; + + [self myRemoveSubviewObserver:subview]; } - (void)willMoveToSuperview:(UIView*)newSuperview { [super willMoveToSuperview:newSuperview]; + MyBaseLayout *lsc = self.myCurrentSizeClass; + + //特殊处理如果视图是控制器根视图则取消wrapContentWidth, wrapContentHeight,以及adjustScrollViewContentSizeMode的设置。 + @try { + + if (newSuperview != nil) + { + id vc = [self valueForKey:@"viewDelegate"]; + if (vc != nil) + { + lsc.wrapContentWidth = NO; + lsc.wrapContentHeight = NO; + self.adjustScrollViewContentSizeMode = MyAdjustScrollViewContentSizeModeNo; + } + } + + } @catch (NSException *exception) { + + } + + #ifdef DEBUG - if (self.wrapContentHeight && self.heightDime.dimeVal != nil) + if (lsc.wrapContentHeight && lsc.heightSizeInner.dimeVal != nil) { - //约束警告:wrapContentHeight和设置的heightDime可能有约束冲突 - NSLog(@"Constraint warning!%@'s wrapContentHeight and heightDime setting may be constraint.",self); + //约束警告:wrapContentHeight和设置的heightSize可能有约束冲突 + NSLog(@"Constraint warning!%@'s wrapContentHeight and heightSize setting may be constraint.",self); } - if (self.wrapContentWidth && self.widthDime.dimeVal != nil) + if (lsc.wrapContentWidth && lsc.widthSizeInner.dimeVal != nil) { - //约束警告:wrapContentWidth和设置的widthDime可能有约束冲突 - NSLog(@"Constraint warning!%@'s wrapContentWidth and widthDime setting may be constraint.",self); + //约束警告:wrapContentWidth和设置的widthSize可能有约束冲突 + NSLog(@"Constraint warning!%@'s wrapContentWidth and widthSize setting may be constraint.",self); } #endif + //将要添加到父视图时,如果不是MyLayout派生则则跟需要根据父视图的frame的变化而调整自身的位置和尺寸 if (newSuperview != nil && ![newSuperview isKindOfClass:[MyBaseLayout class]]) { #ifdef DEBUG - if (self.leftPos.posRelaVal != nil) + if (lsc.leadingPosInner.posRelaVal != nil) { //约束冲突:左边距依赖的视图不是父视图 - NSCAssert(self.leftPos.posRelaVal.view == newSuperview, @"Constraint exception!! %@left margin dependent on:%@is not superview",self, self.leftPos.posRelaVal.view); + NSCAssert(lsc.leadingPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! %@leading pos dependent on:%@is not superview",self, lsc.leadingPosInner.posRelaVal.view); } - if (self.rightPos.posRelaVal != nil) + if (lsc.trailingPosInner.posRelaVal != nil) { //约束冲突:右边距依赖的视图不是父视图 - NSCAssert(self.rightPos.posRelaVal.view == newSuperview, @"Constraint exception!! %@right margin dependent on:%@is not superview",self,self.rightPos.posRelaVal.view); + NSCAssert(lsc.trailingPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! %@trailing pos dependent on:%@is not superview",self,lsc.trailingPosInner.posRelaVal.view); } - if (self.centerXPos.posRelaVal != nil) + if (lsc.centerXPosInner.posRelaVal != nil) { //约束冲突:水平中心点依赖的视图不是父视图 - NSCAssert(self.centerXPos.posRelaVal.view == newSuperview, @"Constraint exception!! %@horizontal center margin dependent on:%@is not superview",self, self.centerXPos.posRelaVal.view); + NSCAssert(lsc.centerXPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! %@horizontal center pos dependent on:%@is not superview",self, lsc.centerXPosInner.posRelaVal.view); } - if (self.topPos.posRelaVal != nil) + if (lsc.topPosInner.posRelaVal != nil) { //约束冲突:上边距依赖的视图不是父视图 - NSCAssert(self.topPos.posRelaVal.view == newSuperview, @"Constraint exception!! %@top margin dependent on:%@is not superview",self, self.topPos.posRelaVal.view); + NSCAssert(lsc.topPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! %@top pos dependent on:%@is not superview",self, lsc.topPosInner.posRelaVal.view); } - if (self.bottomPos.posRelaVal != nil) + if (lsc.bottomPosInner.posRelaVal != nil) { //约束冲突:下边距依赖的视图不是父视图 - NSCAssert(self.bottomPos.posRelaVal.view == newSuperview, @"Constraint exception!! %@bottom margin dependent on:%@is not superview",self, self.bottomPos.posRelaVal.view); + NSCAssert(lsc.bottomPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! %@bottom pos dependent on:%@is not superview",self, lsc.bottomPosInner.posRelaVal.view); } - if (self.centerYPos.posRelaVal != nil) + if (lsc.centerYPosInner.posRelaVal != nil) { //约束冲突:垂直中心点依赖的视图不是父视图 - NSCAssert(self.centerYPos.posRelaVal.view == newSuperview, @"Constraint exception!! vertical center margin dependent on:%@is not superview",self.centerYPos.posRelaVal.view); + NSCAssert(lsc.centerYPosInner.posRelaVal.view == newSuperview, @"Constraint exception!! vertical center pos dependent on:%@is not superview",lsc.centerYPosInner.posRelaVal.view); } - if (self.widthDime.dimeRelaVal != nil) + if (lsc.widthSizeInner.dimeRelaVal != nil) { //约束冲突:宽度依赖的视图不是父视图 - NSCAssert(self.widthDime.dimeRelaVal.view == newSuperview, @"Constraint exception!! %@width dependent on:%@is not superview",self, self.widthDime.dimeRelaVal.view); + NSCAssert(lsc.widthSizeInner.dimeRelaVal.view == newSuperview, @"Constraint exception!! %@width dependent on:%@is not superview",self, lsc.widthSizeInner.dimeRelaVal.view); } - if (self.heightDime.dimeRelaVal != nil) + if (lsc.heightSizeInner.dimeRelaVal != nil) { //约束冲突:高度依赖的视图不是父视图 - NSCAssert(self.heightDime.dimeRelaVal.view == newSuperview, @"Constraint exception!! %@height dependent on:%@is not superview",self,self.heightDime.dimeRelaVal.view); + NSCAssert(lsc.heightSizeInner.dimeRelaVal.view == newSuperview, @"Constraint exception!! %@height dependent on:%@is not superview",self,lsc.heightSizeInner.dimeRelaVal.view); } #endif - if ([self setLayoutRectInNoLayoutSuperview:newSuperview]) + if ([self myUpdateLayoutRectInNoLayoutSuperview:newSuperview]) { //有可能父视图不为空,所以这里先把以前父视图的KVO删除。否则会导致程序崩溃 @@ -1334,8 +1671,8 @@ - (void)willMoveToSuperview:(UIView*)newSuperview } - [newSuperview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; - [newSuperview addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew context:nil]; + [newSuperview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:_myObserverContextC]; + [newSuperview addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:_myObserverContextC]; _isAddSuperviewKVO = YES; } @@ -1378,407 +1715,840 @@ - (void)willMoveToSuperview:(UIView*)newSuperview { //不支持放在UITableView和UICollectionView下,因为有肯能是tableheaderView或者section下。 if ([newSuperview isKindOfClass:[UIScrollView class]] && ![newSuperview isKindOfClass:[UITableView class]] && ![newSuperview isKindOfClass:[UICollectionView class]]) - self.adjustScrollViewContentSize = YES; + { + if (self.adjustScrollViewContentSizeMode == MyAdjustScrollViewContentSizeModeAuto) + { + self.adjustScrollViewContentSizeMode = MyAdjustScrollViewContentSizeModeYes; + } + } + } + else + { + self.beginLayoutBlock = nil; + self.endLayoutBlock = nil; } } +-(void)awakeFromNib +{ + [super awakeFromNib]; + + if (self.superview != nil && ![self.superview isKindOfClass:[MyBaseLayout class]]) + [self myUpdateLayoutRectInNoLayoutSuperview:self.superview]; +} -(void)layoutSubviews { + if (!self.autoresizesSubviews) return; if (self.beginLayoutBlock != nil) self.beginLayoutBlock(); + self.beginLayoutBlock = nil; + + int currentScreenOrientation = 0; + if (!self.isMyLayouting) - { + { + _isMyLayouting = YES; - + if (self.priorAutoresizingMask) [super layoutSubviews]; - //得到最佳的sizeClass - MySizeClass sizeClass; - if ([UIDevice currentDevice].systemVersion.floatValue < 8) - sizeClass = MySizeClass_hAny | MySizeClass_wAny; - else - sizeClass = (MySizeClass)((self.traitCollection.verticalSizeClass << 2) | self.traitCollection.horizontalSizeClass); - - UIDeviceOrientation ori = [UIDevice currentDevice].orientation; - if (UIDeviceOrientationIsPortrait(ori)) - sizeClass |= MySizeClass_Portrait; - else if (UIDeviceOrientationIsLandscape(ori)) - sizeClass |= MySizeClass_Landscape; - else; + //减少每次调用就计算设备方向以及sizeclass的次数。 + MySizeClass sizeClass = [self myGetGlobalSizeClass]; + if ((sizeClass & 0xF0) == MySizeClass_Portrait) + currentScreenOrientation = 1; + else if ((sizeClass & 0xF0) == MySizeClass_Landscape) + currentScreenOrientation = 2; - self.absPos.sizeClass = [self myBestSizeClass:sizeClass]; + MyFrame *selfMyFrame = self.myFrame; + if (selfMyFrame.multiple) + selfMyFrame.sizeClass = [self myBestSizeClass:sizeClass]; for (UIView *sbv in self.subviews) { - sbv.absPos.sizeClass = [sbv myBestSizeClass:sizeClass]; + MyFrame *sbvmyFrame = sbv.myFrame; + if (sbvmyFrame.multiple) + sbv.myFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; + + if (!sbvmyFrame.hasObserver && sbvmyFrame.sizeClass != nil && !sbvmyFrame.sizeClass.useFrame) + { + [self myAddSubviewObserver:sbv sbvmyFrame:sbvmyFrame]; + } } + + MyBaseLayout *lsc = (MyBaseLayout*)selfMyFrame.sizeClass; + //计算布局 - CGRect oldSelfRect = self.frame; - CGRect newSelfRect = [self calcLayoutRect:CGSizeZero isEstimate:NO pHasSubLayout:nil sizeClass:sizeClass]; - + CGSize oldSelfSize = self.bounds.size; + CGSize newSelfSize; + if (_useCacheRects && selfMyFrame.width != CGFLOAT_MAX && selfMyFrame.height != CGFLOAT_MAX) + { + newSelfSize = CGSizeMake(selfMyFrame.width, selfMyFrame.height); + } + else + { + newSelfSize = [self calcLayoutRect:[self myCalcSizeInNoLayoutSuperview:self.superview currentSize:oldSelfSize] isEstimate:NO pHasSubLayout:nil sizeClass:sizeClass sbs:nil]; + } + newSelfSize = _myRoundSize(newSelfSize); + _useCacheRects = NO; + //设置子视图的frame并还原 for (UIView *sbv in self.subviews) { - if (sbv.absPos.leftPos != CGFLOAT_MAX && sbv.absPos.topPos != CGFLOAT_MAX && !sbv.noLayout) - sbv.frame = sbv.absPos.frame; + CGPoint ptorigin = sbv.bounds.origin; + + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (sbvmyFrame.leading != CGFLOAT_MAX && sbvmyFrame.top != CGFLOAT_MAX && !sbvsc.noLayout && !sbvsc.useFrame) + { + if (sbvmyFrame.width < 0) + { + sbvmyFrame.width = 0; + } + if (sbvmyFrame.height < 0) + { + sbvmyFrame.height = 0; + } + + //这里的位置需要进行有效像素的舍入处理,否则可能出现文本框模糊,以及视图显示可能多出一条黑线的问题。 + //原因是当frame中的值不能有效的转化为最小可绘制的物理像素时就会出现模糊,虚化,多出黑线,以及layer处理圆角不圆的情况。 + //所以这里要将frame中的点转化为有效的点。 + //这里之所以讲布局子视图的转化方法和一般子视图的转化方法区分开来是因为。我们要保证布局子视图不能出现细微的重叠,因为布局子视图有边界线 + //如果有边界线而又出现细微重叠的话,那么边界线将无法正常显示,因此这里做了一个特殊的处理。 + CGRect rc; + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + rc = _myRoundRectForLayout(sbvmyFrame.frame); + } + else + { + rc = _myRoundRect(sbvmyFrame.frame); + } + + + sbv.center = CGPointMake(rc.origin.x + sbv.layer.anchorPoint.x * rc.size.width, rc.origin.y + sbv.layer.anchorPoint.y * rc.size.height); + sbv.bounds = CGRectMake(ptorigin.x, ptorigin.y, rc.size.width, rc.size.height); + + + } + + if (sbvsc.myVisibility == MyVisibility_Gone && !sbv.isHidden) + { + sbv.bounds = CGRectMake(ptorigin.x, ptorigin.y, 0, 0); + } + + if (sbvmyFrame.sizeClass.viewLayoutCompleteBlock != nil) + { + sbvmyFrame.sizeClass.viewLayoutCompleteBlock(self, sbv); + sbvmyFrame.sizeClass.viewLayoutCompleteBlock = nil; + } - if (sbv.absPos.sizeClass.isHidden) - sbv.frame = CGRectZero; - sbv.absPos.sizeClass = [sbv myDefaultSizeClass]; - [sbv.absPos reset]; + if (sbvmyFrame.multiple) + sbvmyFrame.sizeClass = [sbv myDefaultSizeClass]; + [sbvmyFrame reset]; } - self.absPos.sizeClass = [self myDefaultSizeClass]; - //调整自身 - if (!CGRectEqualToRect(oldSelfRect,newSelfRect) && newSelfRect.origin.x != CGFLOAT_MAX) + + if (newSelfSize.width != CGFLOAT_MAX && (lsc.wrapContentWidth || lsc.wrapContentHeight)) { - self.frame = newSelfRect; + + //因为布局子视图的新老尺寸计算在上面有两种不同的方法,因此这里需要考虑两种计算的误差值,而这两种计算的误差值是不超过1/屏幕精度的。 + //因此我们认为当二者的值超过误差时我们才认为有尺寸变化。 + BOOL isWidthAlter = fabs(newSelfSize.width - oldSelfSize.width) > _myMLayoutSizeError; + BOOL isHeightAlter = fabs(newSelfSize.height - oldSelfSize.height) > _myMLayoutSizeError; + + //如果父视图也是布局视图,并且自己隐藏则不调整自身的尺寸和位置。 + BOOL isAdjustSelf = YES; + if (self.superview != nil && [self.superview isKindOfClass:[MyBaseLayout class]]) + { + MyBaseLayout *supl = (MyBaseLayout*)self.superview; + if ([supl myIsNoLayoutSubview:self]) + isAdjustSelf = NO; + } + if (isAdjustSelf && (isWidthAlter || isHeightAlter)) + { + + if (newSelfSize.width < 0) + { + newSelfSize.width = 0; + } + + if (newSelfSize.height < 0) + { + newSelfSize.height = 0; + } + + if (CGAffineTransformIsIdentity(self.transform)) + { + CGRect currentFrame = self.frame; + if (isWidthAlter && lsc.wrapContentWidth) + currentFrame.size.width = newSelfSize.width; + + if (isHeightAlter && lsc.wrapContentHeight) + currentFrame.size.height = newSelfSize.height; + + self.frame = currentFrame; + } + else + { + CGRect currentBounds = self.bounds; + CGPoint currentCenter = self.center; + + if (isWidthAlter && lsc.wrapContentWidth) + { + currentBounds.size.width = newSelfSize.width; + currentCenter.x += (newSelfSize.width - oldSelfSize.width) * self.layer.anchorPoint.x; + } + + if (isHeightAlter && lsc.wrapContentHeight) + { + currentBounds.size.height = newSelfSize.height; + currentCenter.y += (newSelfSize.height - oldSelfSize.height) * self.layer.anchorPoint.y; + } + + self.bounds = currentBounds; + self.center = currentCenter; + + } + } } - if (_topBorderLineLayer != nil) - [_topBorderLineLayer setNeedsLayout]; - - if (_bottomBorderLineLayer != nil) - [_bottomBorderLineLayer setNeedsLayout]; - - - if (_leftBorderLineLayer != nil) - [_leftBorderLineLayer setNeedsLayout]; - - if (_rightBorderLineLayer != nil) - [_rightBorderLineLayer setNeedsLayout]; + [_borderlineLayerDelegate setNeedsLayout]; + + //这里只用width判断的原因是如果newSelfSize被计算成功则size中的所有值都不是CGFLOAT_MAX,所以这里选width只是其中一个代表。 + if (newSelfSize.width != CGFLOAT_MAX) + { + UIView *supv = self.superview; - - //这里只用origin.x判断的原因是如果newSelfRect被计算成功则rect中的所有值都不是CGFLOAT_MAX,所以这里选origin.x只是其中一个代表。 - if (newSelfRect.origin.x != CGFLOAT_MAX) - [self alterScrollViewContentSize:newSelfRect]; - - - - _isMyLayouting = NO; - } - - if (self.endLayoutBlock != nil) - { + //如果自己的父视图是非UIScrollView以及非布局视图。以及自己是wrapContentWidth或者wrapContentHeight时,并且如果设置了在父视图居中或者居下或者居右时要在父视图中更新自己的位置。 + if (supv != nil && ![supv isKindOfClass:[MyBaseLayout class]] && ![supv isKindOfClass:[UIScrollView class]]) + { + if (lsc.wrapContentWidth || lsc.wrapContentHeight) + { + CGRect rectSuper = supv.bounds; + CGRect rectSelf = self.bounds; + CGPoint centerPonintSelf = self.center; + + if ([MyBaseLayout isRTL]) + centerPonintSelf.x = rectSuper.size.width - centerPonintSelf.x; + + if (lsc.wrapContentWidth) + { + //如果只设置了右边,或者只设置了居中则更新位置。。 + if (lsc.centerXPosInner.posVal != nil) + { + centerPonintSelf.x = (rectSuper.size.width - rectSelf.size.width)/2 + self.layer.anchorPoint.x * rectSelf.size.width; + + centerPonintSelf.x += [lsc.centerXPosInner realPosIn:rectSuper.size.width]; + } + else if (lsc.trailingPosInner.posVal != nil && lsc.leadingPosInner.posVal == nil) + { + centerPonintSelf.x = rectSuper.size.width - rectSelf.size.width - [lsc.trailingPosInner realPosIn:rectSuper.size.width] + self.layer.anchorPoint.x * rectSelf.size.width; + } + + } + + if (lsc.wrapContentHeight) + { + if (lsc.centerYPosInner.posVal != nil) + { + centerPonintSelf.y = (rectSuper.size.height - rectSelf.size.height)/2 + [lsc.centerYPosInner realPosIn:rectSuper.size.height] + self.layer.anchorPoint.y * rectSelf.size.height; + } + else if (lsc.bottomPosInner.posVal != nil && lsc.topPosInner.posVal == nil) + { + centerPonintSelf.y = rectSuper.size.height - rectSelf.size.height - [lsc.bottomPosInner realPosIn:rectSuper.size.height] + self.layer.anchorPoint.y * rectSelf.size.height; + } + } + + if ([MyBaseLayout isRTL]) + centerPonintSelf.x = rectSuper.size.width - centerPonintSelf.x; + + //如果有变化则只调整自己的center。而不变化 + if (!_myCGPointEqual(self.center, centerPonintSelf)) + { + self.center = centerPonintSelf; + } + } + + } + + + //这里处理当布局视图的父视图是非布局父视图,且父视图具有wrap属性时需要调整父视图的尺寸。 + if (supv != nil && ![supv isKindOfClass:[MyBaseLayout class]]) + { + if (supv.wrapContentHeight || supv.wrapContentWidth) + { + //调整父视图的高度和宽度。frame值。 + CGRect superBounds = supv.bounds; + CGPoint superCenter = supv.center; + + if (supv.wrapContentHeight) + { + superBounds.size.height = lsc.myTop + newSelfSize.height + lsc.myBottom; + superCenter.y += (superBounds.size.height - supv.bounds.size.height) * supv.layer.anchorPoint.y; + } + + if (supv.wrapContentWidth) + { + superBounds.size.width = lsc.myLeading + newSelfSize.width + lsc.myTrailing; + superCenter.x += (superBounds.size.width - supv.bounds.size.width) * supv.layer.anchorPoint.x; + } + + if (!_myCGRectEqual(supv.bounds, superBounds)) + { + supv.center = superCenter; + supv.bounds = superBounds; + } + + } + } + + //处理父视图是滚动视图时动态调整滚动视图的contentSize + [self myAlterScrollViewContentSize:newSelfSize lsc:lsc]; + } + + + if (selfMyFrame.multiple) + selfMyFrame.sizeClass = [self myDefaultSizeClass]; + _isMyLayouting = NO; + + } + + if (self.endLayoutBlock != nil) self.endLayoutBlock(); - self.beginLayoutBlock = nil; - self.endLayoutBlock = nil; + self.endLayoutBlock = nil; + + //执行屏幕旋转的处理逻辑。 + if (currentScreenOrientation != 0 && self.rotationToDeviceOrientationBlock != nil) + { + if (_lastScreenOrientation == 0) + { + _lastScreenOrientation = currentScreenOrientation; + self.rotationToDeviceOrientationBlock(self,YES, currentScreenOrientation == 1); + } + else + { + if (_lastScreenOrientation != currentScreenOrientation) + { + _lastScreenOrientation = currentScreenOrientation; + self.rotationToDeviceOrientationBlock(self, NO, currentScreenOrientation == 1); + } + } + + _lastScreenOrientation = currentScreenOrientation; } -} + +} +#pragma mark -- Deprecated Method #pragma mark -- Private Method --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass -{ - CGRect selfRect; - if (isEstimate) - selfRect = self.absPos.frame; - else - { - selfRect = self.frame; - if (size.width != 0) - selfRect.size.width = size.width; - if (size.height != 0) - selfRect.size.height = size.height; - } - - if (pHasSubLayout != nil) - *pHasSubLayout = NO; - - return selfRect; - -} --(BOOL)isRelativeMargin:(CGFloat)margin +-(BOOL)myIsRelativePos:(CGFloat)margin { return margin > 0 && margin < 1; } +-(MyGravity)myGetSubviewVertGravity:(UIView*)sbv sbvsc:(UIView*)sbvsc vertGravity:(MyGravity)vertGravity +{ + MyGravity sbvVertAligement = sbvsc.myAlignment & MyGravity_Horz_Mask; + MyGravity sbvVertGravity = MyGravity_Vert_Top; + + if (vertGravity != MyGravity_None) + { + sbvVertGravity = vertGravity; + if (sbvVertAligement != MyGravity_None) + { + sbvVertGravity = sbvVertAligement; + } + } + else + { + + if (sbvVertAligement != MyGravity_None) + { + sbvVertGravity = sbvVertAligement; + } + + if (sbvsc.centerYPosInner.posVal != nil) + { + sbvVertGravity = MyGravity_Vert_Center; + } + else if (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) + { + sbvVertGravity = MyGravity_Vert_Fill; + } + else if (sbvsc.topPosInner.posVal != nil) + { + sbvVertGravity = MyGravity_Vert_Top; + } + else if (sbvsc.bottomPosInner.posVal != nil) + { + sbvVertGravity = MyGravity_Vert_Bottom; + } + } + + return sbvVertGravity; +} + --(void)vertGravity:(MyMarginGravity)vert - selfSize:(CGSize)selfSize +-(void)myCalcVertGravity:(MyGravity)vertGravity sbv:(UIView *)sbv - rect:(CGRect*)pRect + sbvsc:(UIView*)sbvsc + paddingTop:(CGFloat)paddingTop + paddingBottom:(CGFloat)paddingBottom + selfSize:(CGSize)selfSize + pRect:(CGRect*)pRect { - CGFloat fixedHeight = self.padding.top + self.padding.bottom; - - CGFloat topMargin = [self validMargin:sbv.topPos sbv:sbv calcPos:[sbv.topPos realMarginInSize:selfSize.height - fixedHeight] selfLayoutSize:selfSize]; + CGFloat topMargin = [self myValidMargin:sbvsc.topPosInner sbv:sbv calcPos:[sbvsc.topPosInner realPosIn:selfSize.height - paddingTop - paddingBottom] selfLayoutSize:selfSize]; - CGFloat centerMargin = [self validMargin:sbv.centerYPos sbv:sbv calcPos:[sbv.centerYPos realMarginInSize:selfSize.height - fixedHeight] selfLayoutSize:selfSize]; + CGFloat centerMargin = [self myValidMargin:sbvsc.centerYPosInner sbv:sbv calcPos:[sbvsc.centerYPosInner realPosIn:selfSize.height - paddingTop - paddingBottom] selfLayoutSize:selfSize]; - CGFloat bottomMargin = [self validMargin:sbv.bottomPos sbv:sbv calcPos:[sbv.bottomPos realMarginInSize:selfSize.height - fixedHeight] selfLayoutSize:selfSize]; + CGFloat bottomMargin = [self myValidMargin:sbvsc.bottomPosInner sbv:sbv calcPos:[sbvsc.bottomPosInner realPosIn:selfSize.height - paddingTop - paddingBottom] selfLayoutSize:selfSize]; - if (vert == MyMarginGravity_Vert_Fill) + if (vertGravity == MyGravity_Vert_Top) { - - pRect->origin.y = self.padding.top + topMargin; - pRect->size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:selfSize.height - self.padding.bottom - bottomMargin - pRect->origin.y sbvSize:pRect->size selfLayoutSize:selfSize]; + pRect->origin.y = paddingTop + topMargin; } - else if (vert == MyMarginGravity_Vert_Center) + else if (vertGravity == MyGravity_Vert_Bottom) { - - pRect->origin.y = (selfSize.height - self.padding.top - self.padding.bottom - topMargin - bottomMargin - pRect->size.height)/2 + self.padding.top + topMargin + centerMargin; + pRect->origin.y = selfSize.height - paddingBottom - bottomMargin - pRect->size.height; } - else if (vert == MyMarginGravity_Vert_Window_Center) + if (vertGravity == MyGravity_Vert_Fill) + { + pRect->origin.y = paddingTop + topMargin; + pRect->size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:selfSize.height - paddingTop - paddingBottom - topMargin - bottomMargin sbvSize:pRect->size selfLayoutSize:selfSize]; + } + else if (vertGravity == MyGravity_Vert_Center) + { + pRect->origin.y = (selfSize.height - paddingTop - paddingBottom - topMargin - bottomMargin - pRect->size.height)/2 + paddingTop + topMargin + centerMargin; + } + else if (vertGravity == MyGravity_Vert_Window_Center) { if (self.window != nil) { - pRect->origin.y = (self.window.frame.size.height - topMargin - bottomMargin - pRect->size.height)/2 + topMargin + centerMargin; - - CGPoint pt = pRect->origin; - pRect->origin.y = [self.window convertPoint:pt toView:self].y; + pRect->origin.y = (CGRectGetHeight(self.window.bounds) - topMargin - bottomMargin - pRect->size.height)/2 + topMargin + centerMargin; + pRect->origin.y = [self.window convertPoint:pRect->origin toView:self].y; } - } - else if (vert == MyMarginGravity_Vert_Bottom) + else { - - pRect->origin.y = selfSize.height - self.padding.bottom - bottomMargin - pRect->size.height; + ; } - else if (vert == MyMarginGravity_Vert_Top) + + +} + + +-(MyGravity)myGetSubviewHorzGravity:(UIView*)sbv sbvsc:(UIView*)sbvsc horzGravity:(MyGravity)horzGravity +{ + MyGravity sbvHorzAligement = [self myConvertLeftRightGravityToLeadingTrailing:sbvsc.myAlignment & MyGravity_Vert_Mask]; + MyGravity sbvHorzGravity = MyGravity_Horz_Leading; + + if (horzGravity != MyGravity_None) { - pRect->origin.y = self.padding.top + topMargin; + sbvHorzGravity = horzGravity; + if (sbvHorzAligement != MyGravity_None) + { + sbvHorzGravity = sbvHorzAligement; + } } else { - pRect->origin.y = self.padding.top + topMargin; + + if (sbvHorzAligement != MyGravity_None) + { + sbvHorzGravity = sbvHorzAligement; + } + + if (sbvsc.centerXPosInner.posVal != nil) + { + sbvHorzGravity = MyGravity_Horz_Center; + } + else if (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) + { + sbvHorzGravity = MyGravity_Horz_Fill; + } + else if (sbvsc.leadingPosInner.posVal != nil) + { + sbvHorzGravity = MyGravity_Horz_Leading; + } + else if (sbvsc.trailingPosInner.posVal != nil) + { + sbvHorzGravity = MyGravity_Horz_Trailing; + } } - + return sbvHorzGravity; } --(void)horzGravity:(MyMarginGravity)horz - selfSize:(CGSize)selfSize + +-(void)myCalcHorzGravity:(MyGravity)horzGravity sbv:(UIView *)sbv - rect:(CGRect*)pRect + sbvsc:(UIView*)sbvsc + paddingLeading:(CGFloat)paddingLeading + paddingTrailing:(CGFloat)paddingTrailing + selfSize:(CGSize)selfSize + pRect:(CGRect*)pRect { - CGFloat fixedWidth = self.padding.left + self.padding.right; + CGFloat paddingHorz = paddingLeading + paddingTrailing; - CGFloat leftMargin = [self validMargin:sbv.leftPos sbv:sbv calcPos:[sbv.leftPos realMarginInSize:selfSize.width - fixedWidth] selfLayoutSize:selfSize]; + CGFloat leadingMargin = [self myValidMargin:sbvsc.leadingPosInner sbv:sbv calcPos:[sbvsc.leadingPosInner realPosIn:selfSize.width - paddingHorz] selfLayoutSize:selfSize]; - CGFloat centerMargin = [self validMargin:sbv.centerXPos sbv:sbv calcPos:[sbv.centerXPos realMarginInSize:selfSize.width - fixedWidth] selfLayoutSize:selfSize]; + CGFloat centerMargin = [self myValidMargin:sbvsc.centerXPosInner sbv:sbv calcPos:[sbvsc.centerXPosInner realPosIn:selfSize.width - paddingHorz] selfLayoutSize:selfSize]; - CGFloat rightMargin = [self validMargin:sbv.rightPos sbv:sbv calcPos:[sbv.rightPos realMarginInSize:selfSize.width - fixedWidth] selfLayoutSize:selfSize]; + CGFloat trailingMargin = [self myValidMargin:sbvsc.trailingPosInner sbv:sbv calcPos:[sbvsc.trailingPosInner realPosIn:selfSize.width - paddingHorz] selfLayoutSize:selfSize]; - if (horz == MyMarginGravity_Horz_Fill) + if (horzGravity == MyGravity_Horz_Leading) + { + pRect->origin.x = paddingLeading + leadingMargin; + } + else if (horzGravity == MyGravity_Horz_Trailing) + { + pRect->origin.x = selfSize.width - paddingTrailing - trailingMargin - pRect->size.width; + } + if (horzGravity == MyGravity_Horz_Fill) { - pRect->origin.x = self.padding.left + leftMargin; - pRect->size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:selfSize.width - self.padding.right - rightMargin - pRect->origin.x sbvSize:pRect->size selfLayoutSize:selfSize]; + pRect->origin.x = paddingLeading + leadingMargin; + pRect->size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:selfSize.width - paddingHorz - leadingMargin - trailingMargin sbvSize:pRect->size selfLayoutSize:selfSize]; - } - else if (horz == MyMarginGravity_Horz_Center) + else if (horzGravity == MyGravity_Horz_Center) { - pRect->origin.x = (selfSize.width - self.padding.left - self.padding.right - leftMargin - rightMargin - pRect->size.width)/2 + self.padding.left + leftMargin + centerMargin; + pRect->origin.x = (selfSize.width - paddingHorz - leadingMargin - trailingMargin - pRect->size.width)/2 + paddingLeading + leadingMargin + centerMargin; } - else if (horz == MyMarginGravity_Horz_Window_Center) + else if (horzGravity == MyGravity_Horz_Window_Center) { if (self.window != nil) { - pRect->origin.x = (self.window.frame.size.width - leftMargin - rightMargin - pRect->size.width)/2 + leftMargin + centerMargin; + pRect->origin.x = (CGRectGetWidth(self.window.bounds) - leadingMargin - trailingMargin - pRect->size.width)/2 + leadingMargin + centerMargin; + pRect->origin.x = [self.window convertPoint:pRect->origin toView:self].x; - CGPoint pt = pRect->origin; - pRect->origin.x = [self.window convertPoint:pt toView:self].x; + //因为从右到左布局最后统一进行了转换,但是窗口居中是不按布局来控制的,所以这里为了保持不变需要进行特殊处理。 + if ([MyBaseLayout isRTL]) + { + pRect->origin.x = selfSize.width - pRect->origin.x - pRect->size.width; + } } - - } - else if (horz == MyMarginGravity_Horz_Right) - { - - pRect->origin.x = selfSize.width - self.padding.right - rightMargin - pRect->size.width; - } - else if (horz == MyMarginGravity_Horz_Left) - { - pRect->origin.x = self.padding.left + leftMargin; } else { - pRect->origin.x = self.padding.left + leftMargin; + ; } } --(void)setWrapContentWidthNoLayout:(BOOL)wrapContentWidth +-(void)myCalcSizeOfWrapContentSubview:(UIView*)sbv sbvsc:(UIView*)sbvsc sbvmyFrame:(MyFrame*)sbvmyFrame selfLayoutSize:(CGSize)selfLayoutSize { - MyBaseLayout *lsc = self.myCurrentSizeClass; - lsc.wrapContentWidth = wrapContentWidth; + BOOL isLayoutView = [sbv isKindOfClass:[MyBaseLayout class]]; + BOOL isWrapWidth = (sbvsc.widthSizeInner.dimeSelfVal != nil) || (!isLayoutView && sbvsc.wrapContentWidth); //宽度包裹特殊处理 + BOOL isWrapHeight = (sbvsc.heightSizeInner.dimeSelfVal != nil) || (!isLayoutView && sbvsc.wrapContentSize);//高度包裹也特殊处理 + + + if (isWrapWidth || isWrapHeight) + { + CGSize fitSize = [sbv sizeThatFits:CGSizeZero]; + if (isWrapWidth) + { + if (sbvsc.wrapContentWidth) + sbvmyFrame.width = fitSize.width; + else + sbvmyFrame.width = [sbvsc.widthSizeInner measureWith:fitSize.width]; + } + + if (isWrapHeight) + { + if (sbvsc.wrapContentHeight) + sbvmyFrame.height = fitSize.height; + else + sbvmyFrame.height = [sbvsc.heightSizeInner measureWith:fitSize.height]; + } + } } --(void)setWrapContentHeightNoLayout:(BOOL)wrapContentHeight -{ - MyBaseLayout *lsc = self.myCurrentSizeClass; - lsc.wrapContentHeight = wrapContentHeight; -} --(void)calcSizeOfWrapContentSubview:(UIView*)sbv +-(CGSize)myCalcSizeInNoLayoutSuperview:(UIView*)newSuperview currentSize:(CGSize)size { - if (sbv.widthDime.dimeSelfVal != nil || sbv.heightDime.dimeSelfVal != nil) + if (newSuperview == nil || [newSuperview isKindOfClass:[MyBaseLayout class]]) + return size; + + CGRect rectSuper = newSuperview.bounds; + UIView *ssc = newSuperview.myCurrentSizeClass; + UIView *lsc = self.myCurrentSizeClass; + + if (!ssc.wrapContentWidth) { - CGSize fitSize = [sbv sizeThatFits:CGSizeZero]; - if (sbv.widthDime.dimeSelfVal != nil) + if (lsc.widthSizeInner.dimeRelaVal.view == newSuperview) + { + size.width = [lsc.widthSizeInner measureWith:rectSuper.size.width]; + size.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:size.width sbvSize:size selfLayoutSize:rectSuper.size]; + } + + if (lsc.leadingPosInner.posVal != nil && lsc.trailingPosInner.posVal != nil) { - sbv.absPos.width = fitSize.width * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + CGFloat leadingMargin = [lsc.leadingPosInner realPosIn:rectSuper.size.width]; + CGFloat trailingMargin = [lsc.trailingPosInner realPosIn:rectSuper.size.width]; + size.width = rectSuper.size.width - leadingMargin - trailingMargin; + size.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:size.width sbvSize:size selfLayoutSize:rectSuper.size]; } - if (sbv.heightDime.dimeSelfVal != nil) + if (size.width < 0) { - sbv.absPos.height = fitSize.height * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + size.width = 0; + } + } + + if (!ssc.wrapContentHeight) + { + if (lsc.heightSizeInner.dimeRelaVal.view == newSuperview) + { + + size.height = [lsc.heightSizeInner measureWith:rectSuper.size.height]; + size.height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:size.height sbvSize:size selfLayoutSize:rectSuper.size]; + + } + + if (lsc.topPosInner.posVal != nil && lsc.bottomPosInner.posVal != nil) + { + CGFloat topMargin = [lsc.topPosInner realPosIn:rectSuper.size.height]; + CGFloat bottomMargin = [lsc.bottomPosInner realPosIn:rectSuper.size.height]; + size.height = rectSuper.size.height - topMargin - bottomMargin; + size.height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:size.height sbvSize:size selfLayoutSize:rectSuper.size]; + + } + + if (size.height < 0) + { + size.height = 0; } - } -} + } + + + return size; +} --(BOOL)setLayoutRectInNoLayoutSuperview:(UIView*)newSuperview +-(BOOL)myUpdateLayoutRectInNoLayoutSuperview:(UIView*)newSuperview { BOOL isAdjust = NO; CGRect rectSuper = newSuperview.bounds; - CGRect rectSelf = self.frame; + + UIView *lsc = self.myCurrentSizeClass; + + CGFloat leadingMargin = [lsc.leadingPosInner realPosIn:rectSuper.size.width]; + CGFloat trailingMargin = [lsc.trailingPosInner realPosIn:rectSuper.size.width]; + CGFloat topMargin = [lsc.topPosInner realPosIn:rectSuper.size.height]; + CGFloat bottomMargin = [lsc.bottomPosInner realPosIn:rectSuper.size.height]; + CGRect rectSelf = self.bounds; + + //得到在设置center后的原始值。 + rectSelf.origin.y = self.center.y - rectSelf.size.height * self.layer.anchorPoint.y; + rectSelf.origin.x = self.center.x - rectSelf.size.width * self.layer.anchorPoint.x; + CGRect oldRectSelf = rectSelf; //确定左右边距和宽度。 - if (self.widthDime.dimeVal != nil) + if (lsc.widthSizeInner.dimeVal != nil) { - [self setWrapContentWidthNoLayout:NO]; + lsc.wrapContentWidth = NO; - if (self.widthDime.dimeRelaVal != nil) + if (lsc.widthSizeInner.dimeRelaVal != nil) { - rectSelf.size.width = rectSuper.size.width*self.widthDime.mutilVal + self.widthDime.addVal; + if (lsc.widthSizeInner.dimeRelaVal.view == newSuperview) + { + rectSelf.size.width = [lsc.widthSizeInner measureWith:rectSuper.size.width]; + } + else + { + rectSelf.size.width = [lsc.widthSizeInner measureWith:lsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width]; + } isAdjust = YES; } else - rectSelf.size.width = self.widthDime.measure; - } + rectSelf.size.width = lsc.widthSizeInner.measure; + + } - rectSelf.size.width = [self validMeasure:self.widthDime sbv:self calcSize:rectSelf.size.width sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; + rectSelf.size.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:rectSelf.size.width sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; + + if ([MyBaseLayout isRTL]) + rectSelf.origin.x = rectSuper.size.width - rectSelf.origin.x - rectSelf.size.width; + - if (self.leftPos.posVal != nil && self.rightPos.posVal != nil) + if (lsc.leadingPosInner.posVal != nil && lsc.trailingPosInner.posVal != nil) { isAdjust = YES; - [self setWrapContentWidthNoLayout:NO]; - rectSelf.size.width = rectSuper.size.width - self.leftPos.margin - self.rightPos.margin; - rectSelf.size.width = [self validMeasure:self.widthDime sbv:self calcSize:rectSelf.size.width sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; + lsc.wrapContentWidth = NO; + rectSelf.size.width = rectSuper.size.width - leadingMargin - trailingMargin; + rectSelf.size.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:rectSelf.size.width sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; - rectSelf.origin.x = self.leftPos.margin; + rectSelf.origin.x = leadingMargin; } - else if (self.centerXPos.posVal != nil) + else if (lsc.centerXPosInner.posVal != nil) { isAdjust = YES; - rectSelf.origin.x = (rectSuper.size.width - rectSelf.size.width)/2 + self.centerXPos.margin; + rectSelf.origin.x = (rectSuper.size.width - rectSelf.size.width)/2; + rectSelf.origin.x += [lsc.centerXPosInner realPosIn:rectSuper.size.width]; } - else if (self.leftPos.posVal != nil) + else if (lsc.leadingPosInner.posVal != nil) { - rectSelf.origin.x = self.leftPos.margin; + rectSelf.origin.x = leadingMargin; } - else if (self.rightPos.posVal != nil) + else if (lsc.trailingPosInner.posVal != nil) { isAdjust = YES; - rectSelf.origin.x = rectSuper.size.width - rectSelf.size.width - self.rightPos.margin; + rectSelf.origin.x = rectSuper.size.width - rectSelf.size.width - trailingMargin; } else; - if (self.heightDime.dimeVal != nil) + if (lsc.heightSizeInner.dimeVal != nil) { - [self setWrapContentHeightNoLayout:NO]; + lsc.wrapContentHeight = NO; - if (self.heightDime.dimeRelaVal != nil) + if (lsc.heightSizeInner.dimeRelaVal != nil) { - rectSelf.size.height = rectSuper.size.height*self.heightDime.mutilVal + self.heightDime.addVal; + if (lsc.heightSizeInner.dimeRelaVal.view == newSuperview) + { + rectSelf.size.height = [lsc.heightSizeInner measureWith:rectSuper.size.height]; + } + else + { + rectSelf.size.height = [lsc.heightSizeInner measureWith:lsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height]; + } isAdjust = YES; } else - rectSelf.size.height = self.heightDime.measure; + rectSelf.size.height = lsc.heightSizeInner.measure; } - rectSelf.size.height = [self validMeasure:self.heightDime sbv:self calcSize:rectSelf.size.height sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; + rectSelf.size.height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:rectSelf.size.height sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; - if (self.topPos.posVal != nil && self.bottomPos.posVal != nil) + if (lsc.topPosInner.posVal != nil && lsc.bottomPosInner.posVal != nil) { isAdjust = YES; - [self setWrapContentHeightNoLayout:NO]; - rectSelf.size.height = rectSuper.size.height - self.topPos.margin - self.bottomPos.margin; - rectSelf.size.height = [self validMeasure:self.heightDime sbv:self calcSize:rectSelf.size.height sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; + lsc.wrapContentHeight = NO; + rectSelf.size.height = rectSuper.size.height - topMargin - bottomMargin; + rectSelf.size.height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:rectSelf.size.height sbvSize:rectSelf.size selfLayoutSize:rectSuper.size]; - rectSelf.origin.y = self.topPos.margin; + rectSelf.origin.y = topMargin; } - else if (self.centerYPos.posVal != nil) + else if (lsc.centerYPosInner.posVal != nil) { isAdjust = YES; - rectSelf.origin.y = (rectSuper.size.height - rectSelf.size.height)/2 + self.centerYPos.margin; + rectSelf.origin.y = (rectSuper.size.height - rectSelf.size.height)/2 + [lsc.centerYPosInner realPosIn:rectSuper.size.height]; } - else if (self.topPos.posVal != nil) + else if (lsc.topPosInner.posVal != nil) { - rectSelf.origin.y = self.topPos.margin; + rectSelf.origin.y = topMargin; } - else if (self.bottomPos.posVal != nil) + else if (lsc.bottomPosInner.posVal != nil) { isAdjust = YES; - rectSelf.origin.y = rectSuper.size.height - rectSelf.size.height - self.bottomPos.margin; + rectSelf.origin.y = rectSuper.size.height - rectSelf.size.height - bottomMargin; } else; - - - if (!CGRectEqualToRect(rectSelf, self.frame)) + if ([MyBaseLayout isRTL]) + rectSelf.origin.x = rectSuper.size.width - rectSelf.origin.x - rectSelf.size.width; + + rectSelf = _myRoundRect(rectSelf); + if (!_myCGRectEqual(rectSelf, oldRectSelf)) + { + if (rectSelf.size.width < 0) + { + rectSelf.size.width = 0; + } + if (rectSelf.size.height < 0) + { + rectSelf.size.height = 0; + } + + if (CGAffineTransformIsIdentity(self.transform)) + { + self.frame = rectSelf; + } + else + { + self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y,rectSelf.size.width, rectSelf.size.height); + self.center = CGPointMake(rectSelf.origin.x + self.layer.anchorPoint.x * rectSelf.size.width, rectSelf.origin.y + self.layer.anchorPoint.y * rectSelf.size.height); + } + } + else if (lsc.wrapContentWidth || lsc.wrapContentHeight) { - self.frame = rectSelf; + [self setNeedsLayout]; } + + return isAdjust; } --(CGFloat)heightFromFlexedHeightView:(UIView*)sbv inWidth:(CGFloat)width +-(CGFloat)myHeightFromFlexedHeightView:(UIView*)sbv sbvsc:(UIView*)sbvsc inWidth:(CGFloat)width { + CGFloat h = [sbv sizeThatFits:CGSizeMake(width, 0)].height; if ([sbv isKindOfClass:[UIImageView class]]) { //根据图片的尺寸进行等比缩放得到合适的高度。 UIImage *img = ((UIImageView*)sbv).image; if (img != nil && img.size.width != 0) { - return img.size.height * (width / img.size.width); + h = img.size.height * (width / img.size.width); } - else + } + else if ([sbv isKindOfClass:[UIButton class]]) + { + //按钮特殊处理多行的。。 + UIButton *button = (UIButton*)sbv; + + if (button.titleLabel != nil) { - CGSize sz = [sbv sizeThatFits:CGSizeMake(width, 0)]; - return sz.height; - + //得到按钮本身的高度,以及单行文本的高度,这样就能算出按钮和文本的间距 + CGSize buttonSize = [button sizeThatFits:CGSizeMake(0, 0)]; + CGSize buttonTitleSize = [button.titleLabel sizeThatFits:CGSizeMake(0, 0)]; + CGSize sz = [button.titleLabel sizeThatFits:CGSizeMake(width, 0)]; + h = sz.height + buttonSize.height - buttonTitleSize.height; //这个sz只是纯文本的高度,所以要加上原先按钮和文本的高度差。。 } } else - { - CGSize sz = [sbv sizeThatFits:CGSizeMake(width, 0)]; - return sz.height; - } + ; + + if (sbvsc.heightSizeInner == nil) + return h; + else + return [sbvsc.heightSizeInner measureWith:h]; } --(CGFloat)getBoundLimitMeasure:(MyLayoutDime*)boundDime sbv:(UIView*)sbv dimeType:(MyMarginGravity)dimeType sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize isUBound:(BOOL)isUBound +-(CGFloat)myGetBoundLimitMeasure:(MyLayoutSize*)boundDime sbv:(UIView*)sbv dimeType:(MyGravity)dimeType sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize isUBound:(BOOL)isUBound { CGFloat value = isUBound ? CGFLOAT_MAX : -CGFLOAT_MAX; + if (boundDime == nil) + return value; MyLayoutValueType lValueType = boundDime.dimeValType; if (lValueType == MyLayoutValueType_NSNumber) @@ -1787,12 +2557,12 @@ -(CGFloat)getBoundLimitMeasure:(MyLayoutDime*)boundDime sbv:(UIView*)sbv dimeTyp } else if (lValueType == MyLayoutValueType_LayoutDime) { - if (boundDime.dimeRelaVal.view == self || boundDime.dimeRelaVal.view == self.superview) + if (boundDime.dimeRelaVal.view == self) { - if (boundDime.dimeRelaVal.dime == MyMarginGravity_Horz_Fill) - value = selfLayoutSize.width - (boundDime.dimeRelaVal.view == self ? (self.leftPadding - self.rightPadding) : 0); + if (boundDime.dimeRelaVal.dime == MyGravity_Horz_Fill) + value = selfLayoutSize.width - (boundDime.dimeRelaVal.view == self ? (self.leadingPadding + self.trailingPadding) : 0); else - value = selfLayoutSize.height - (boundDime.dimeRelaVal.view == self ? (self.topPadding - self.bottomPadding) :0); + value = selfLayoutSize.height - (boundDime.dimeRelaVal.view == self ? (self.topPadding + self.bottomPadding) :0); } else if (boundDime.dimeRelaVal.view == sbv) { @@ -1803,23 +2573,28 @@ -(CGFloat)getBoundLimitMeasure:(MyLayoutDime*)boundDime sbv:(UIView*)sbv dimeTyp } else { - if (boundDime.dimeRelaVal.dime == MyMarginGravity_Horz_Fill) + if (boundDime.dimeRelaVal.dime == MyGravity_Horz_Fill) value = sbvSize.width; else value = sbvSize.height; } } + else if (boundDime.dimeSelfVal != nil) + { + if (dimeType == MyGravity_Horz_Fill) + value = sbvSize.width; + else + value = sbvSize.height; + } else { - if (boundDime.dimeRelaVal.dime == MyMarginGravity_Horz_Fill) + if (boundDime.dimeRelaVal.dime == MyGravity_Horz_Fill) { - if (boundDime.dimeRelaVal.view.absPos.width != CGFLOAT_MAX) - value = boundDime.dimeRelaVal.view.absPos.width; + value = boundDime.dimeRelaVal.view.estimatedRect.size.width; } else { - if (boundDime.dimeRelaVal.view.absPos.height != CGFLOAT_MAX) - value = boundDime.dimeRelaVal.view.absPos.height; + value = boundDime.dimeRelaVal.view.estimatedRect.size.height; } } @@ -1833,17 +2608,20 @@ -(CGFloat)getBoundLimitMeasure:(MyLayoutDime*)boundDime sbv:(UIView*)sbv dimeTyp if (value == CGFLOAT_MAX || value == -CGFLOAT_MAX) return value; - return value * boundDime.mutilVal + boundDime.addVal; + return [boundDime measureWith:value]; } --(CGFloat)validMeasure:(MyLayoutDime*)dime sbv:(UIView*)sbv calcSize:(CGFloat)calcSize sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize -{ +-(CGFloat)myValidMeasure:(MyLayoutSize*)dime sbv:(UIView*)sbv calcSize:(CGFloat)calcSize sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize +{ + if (dime == nil) + return calcSize; + //算出最大最小值。 - CGFloat min = [self getBoundLimitMeasure:dime.lBoundVal sbv:sbv dimeType:dime.dime sbvSize:sbvSize selfLayoutSize:selfLayoutSize isUBound:NO]; - CGFloat max = [self getBoundLimitMeasure:dime.uBoundVal sbv:sbv dimeType:dime.dime sbvSize:sbvSize selfLayoutSize:selfLayoutSize isUBound:YES]; + CGFloat min = dime.isActive? [self myGetBoundLimitMeasure:dime.lBoundValInner sbv:sbv dimeType:dime.dime sbvSize:sbvSize selfLayoutSize:selfLayoutSize isUBound:NO] : -CGFLOAT_MAX; + CGFloat max = dime.isActive ? [self myGetBoundLimitMeasure:dime.uBoundValInner sbv:sbv dimeType:dime.dime sbvSize:sbvSize selfLayoutSize:selfLayoutSize isUBound:YES] : CGFLOAT_MAX; calcSize = MAX(min, calcSize); calcSize = MIN(max, calcSize); @@ -1852,44 +2630,46 @@ -(CGFloat)validMeasure:(MyLayoutDime*)dime sbv:(UIView*)sbv calcSize:(CGFloat)ca } --(CGFloat)getBoundLimitMargin:(MyLayoutPos*)boundPos sbv:(UIView*)sbv selfLayoutSize:(CGSize)selfLayoutSize +-(CGFloat)myGetBoundLimitMargin:(MyLayoutPos*)boundPos sbv:(UIView*)sbv selfLayoutSize:(CGSize)selfLayoutSize { CGFloat value = 0; + if (boundPos == nil) + return value; MyLayoutValueType lValueType = boundPos.posValType; if (lValueType == MyLayoutValueType_NSNumber) value = boundPos.posNumVal.doubleValue; else if (lValueType == MyLayoutValueType_LayoutPos) { - CGRect rect = boundPos.posRelaVal.view.absPos.frame; + CGRect rect = boundPos.posRelaVal.view.myFrame.frame; - MyMarginGravity pos = boundPos.posRelaVal.pos; - if (pos == MyMarginGravity_Horz_Left) + MyGravity pos = boundPos.posRelaVal.pos; + if (pos == MyGravity_Horz_Leading) { if (rect.origin.x != CGFLOAT_MAX) value = CGRectGetMinX(rect); } - else if (pos == MyMarginGravity_Horz_Center) + else if (pos == MyGravity_Horz_Center) { if (rect.origin.x != CGFLOAT_MAX) value = CGRectGetMidX(rect); } - else if (pos == MyMarginGravity_Horz_Right) + else if (pos == MyGravity_Horz_Trailing) { if (rect.origin.x != CGFLOAT_MAX) value = CGRectGetMaxX(rect); } - else if (pos == MyMarginGravity_Vert_Top) + else if (pos == MyGravity_Vert_Top) { if (rect.origin.y != CGFLOAT_MAX) value = CGRectGetMinY(rect); } - else if (pos == MyMarginGravity_Vert_Center) + else if (pos == MyGravity_Vert_Center) { if (rect.origin.y != CGFLOAT_MAX) value = CGRectGetMidY(rect); } - else if (pos == MyMarginGravity_Vert_Bottom) + else if (pos == MyGravity_Vert_Bottom) { if (rect.origin.y != CGFLOAT_MAX) value = CGRectGetMaxY(rect); @@ -1905,69 +2685,642 @@ -(CGFloat)getBoundLimitMargin:(MyLayoutPos*)boundPos sbv:(UIView*)sbv selfLayout } --(CGFloat)validMargin:(MyLayoutPos*)pos sbv:(UIView*)sbv calcPos:(CGFloat)calcPos selfLayoutSize:(CGSize)selfLayoutSize +-(CGFloat)myValidMargin:(MyLayoutPos*)pos sbv:(UIView*)sbv calcPos:(CGFloat)calcPos selfLayoutSize:(CGSize)selfLayoutSize { + if (pos == nil) + return calcPos; + //算出最大最小值 - CGFloat min = [self getBoundLimitMargin:pos.lBoundVal sbv:sbv selfLayoutSize:selfLayoutSize]; - CGFloat max = [self getBoundLimitMargin:pos.uBoundVal sbv:sbv selfLayoutSize:selfLayoutSize]; + CGFloat min = (pos.isActive && pos.lBoundValInner != nil) ? [self myGetBoundLimitMargin:pos.lBoundValInner sbv:sbv selfLayoutSize:selfLayoutSize] : -CGFLOAT_MAX; + CGFloat max = (pos.isActive && pos.uBoundValInner != nil) ? [self myGetBoundLimitMargin:pos.uBoundValInner sbv:sbv selfLayoutSize:selfLayoutSize] : CGFLOAT_MAX; calcPos = MAX(min, calcPos); calcPos = MIN(max, calcPos); return calcPos; } - - -- (void)alterScrollViewContentSize:(CGRect)newRect +-(BOOL)myIsNoLayoutSubview:(UIView*)sbv { - if (self.adjustScrollViewContentSize && self.superview != nil && [self.superview isKindOfClass:[UIScrollView class]]) + UIView *sbvsc = sbv.myCurrentSizeClass; + + if (sbvsc.useFrame) + return YES; + + if (sbv.isHidden) { - UIScrollView *scrolv = (UIScrollView*)self.superview; - CGSize contsize = scrolv.contentSize; - - if (contsize.height != newRect.size.height) - contsize.height = newRect.size.height; - if (contsize.width != newRect.size.width) - contsize.width = newRect.size.width; - - scrolv.contentSize = contsize; - + return sbvsc.myVisibility != MyVisibility_Invisible; + } + else + { + return sbvsc.myVisibility == MyVisibility_Gone; } + +} + +-(NSMutableArray*)myGetLayoutSubviews +{ + return [self myGetLayoutSubviewsFrom:self.subviews]; } --(void)updateBorderLayer:(CAShapeLayer**)ppLayer withBorderLineDraw:(MyBorderLineDraw*)borderLineDraw +-(NSMutableArray*)myGetLayoutSubviewsFrom:(NSArray*)sbsFrom { - if (borderLineDraw == nil) + NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:sbsFrom.count]; + BOOL isReverseLayout = self.reverseLayout; + + if (isReverseLayout) { - - if (*ppLayer != nil) + [sbs addObjectsFromArray:[sbsFrom reverseObjectEnumerator].allObjects]; + } + else + { + [sbs addObjectsFromArray:sbsFrom]; + + } + + for (NSInteger i = sbs.count - 1; i >=0; i--) + { + UIView *sbv = sbs[i]; + if ([self myIsNoLayoutSubview:sbv]) + { + [sbs removeObjectAtIndex:i]; + } + } + + return sbs; + +} + +-(void)mySetSubviewRelativeDimeSize:(MyLayoutSize*)dime selfSize:(CGSize)selfSize lsc:(MyBaseLayout*)lsc pRect:(CGRect*)pRect +{ + if (dime.dimeRelaVal == nil) + return; + + if (dime.dime == MyGravity_Horz_Fill) + { + + if (dime.dimeRelaVal == lsc.widthSizeInner && !lsc.wrapContentWidth) + pRect->size.width = [dime measureWith:(selfSize.width - lsc.leadingPadding - lsc.trailingPadding)]; + else if (dime.dimeRelaVal == lsc.heightSizeInner) + pRect->size.width = [dime measureWith:(selfSize.height - lsc.topPadding - lsc.bottomPadding)]; + else if (dime.dimeRelaVal == dime.view.heightSizeInner) + pRect->size.width = [dime measureWith:pRect->size.height]; + else if (dime.dimeRelaVal.dime == MyGravity_Horz_Fill) + pRect->size.width = [dime measureWith:dime.dimeRelaVal.view.estimatedRect.size.width]; + else + pRect->size.width = [dime measureWith:dime.dimeRelaVal.view.estimatedRect.size.height]; + } + else + { + if (dime.dimeRelaVal == lsc.heightSizeInner && !lsc.wrapContentHeight) + pRect->size.height = [dime measureWith:(selfSize.height - lsc.topPadding - lsc.bottomPadding)]; + else if (dime.dimeRelaVal == lsc.widthSizeInner) + pRect->size.height = [dime measureWith:(selfSize.width - lsc.leadingPadding - lsc.trailingPadding)]; + else if (dime.dimeRelaVal == dime.view.widthSizeInner) + pRect->size.height = [dime measureWith:pRect->size.width]; + else if (dime.dimeRelaVal.dime == MyGravity_Horz_Fill) + pRect->size.height = [dime measureWith:dime.dimeRelaVal.view.estimatedRect.size.width]; + else + pRect->size.height = [dime measureWith:dime.dimeRelaVal.view.estimatedRect.size.height]; + } +} + +-(CGSize)myAdjustSizeWhenNoSubviews:(CGSize)size sbs:(NSArray *)sbs lsc:(MyBaseLayout*)lsc +{ + //如果没有子视图,并且padding不参与空子视图尺寸计算则尺寸应该扣除padding的值。 + if (sbs.count == 0 && !lsc.zeroPadding) + { + if (lsc.wrapContentWidth) + size.width -= (lsc.leadingPadding + lsc.trailingPadding); + if (lsc.wrapContentHeight) + size.height -= (lsc.topPadding + lsc.bottomPadding); + } + + return size; +} + +- (void)myAdjustLayoutSelfSize:(CGSize *)pSelfSize lsc:(MyBaseLayout*)lsc +{ + //调整自己的尺寸。 + pSelfSize->height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:pSelfSize->height sbvSize:*pSelfSize selfLayoutSize:self.superview.bounds.size]; + + pSelfSize->width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:pSelfSize->width sbvSize:*pSelfSize selfLayoutSize:self.superview.bounds.size]; +} + +-(void)myAdjustSubviewsRTLPos:(NSArray*)sbs selfWidth:(CGFloat)selfWidth +{ + if ([MyBaseLayout isRTL]) + { + for (UIView *sbv in sbs) + { + MyFrame *myFrame = sbv.myFrame; + + myFrame.leading = selfWidth - myFrame.leading - myFrame.width; + myFrame.trailing = myFrame.leading + myFrame.width; + } + } +} + +-(MyGravity)myConvertLeftRightGravityToLeadingTrailing:(MyGravity)horzGravity +{ + if (horzGravity == MyGravity_Horz_Left) + { + if ([MyBaseLayout isRTL]) + return MyGravity_Horz_Trailing; + else + return MyGravity_Horz_Leading; + } + else if (horzGravity == MyGravity_Horz_Right) + { + if ([MyBaseLayout isRTL]) + return MyGravity_Horz_Leading; + else + return MyGravity_Horz_Trailing; + } + else + return horzGravity; + +} + + + +- (void)myAlterScrollViewContentSize:(CGSize)newSize lsc:(MyBaseLayout*)lsc +{ + if (self.adjustScrollViewContentSizeMode == MyAdjustScrollViewContentSizeModeYes && self.superview != nil && [self.superview isKindOfClass:[UIScrollView class]]) + { + UIScrollView *scrolv = (UIScrollView*)self.superview; + CGSize contsize = scrolv.contentSize; + CGRect rectSuper = scrolv.bounds; + + //这里把自己在父视图中的上下左右边距也算在contentSize的包容范围内。 + CGFloat leadingMargin = [lsc.leadingPosInner realPosIn:rectSuper.size.width]; + CGFloat trailingMargin = [lsc.trailingPosInner realPosIn:rectSuper.size.width]; + CGFloat topMargin = [lsc.topPosInner realPosIn:rectSuper.size.height]; + CGFloat bottomMargin = [lsc.bottomPosInner realPosIn:rectSuper.size.height]; + + if (contsize.height != newSize.height + topMargin + bottomMargin) + contsize.height = newSize.height + topMargin + bottomMargin; + if (contsize.width != newSize.width + leadingMargin + trailingMargin) + contsize.width = newSize.width + leadingMargin + trailingMargin; + + scrolv.contentSize = contsize; + + } +} + +MySizeClass _myGlobalSizeClass = 0xFF; + +//获取全局的当前的SizeClass,减少获取次数的调用。 +-(MySizeClass)myGetGlobalSizeClass +{ + //找到最根部的父视图。 + if (_myGlobalSizeClass == 0xFF || ![self.superview isKindOfClass:[MyBaseLayout class]]) + { + MySizeClass sizeClass; + if ([UIDevice currentDevice].systemVersion.floatValue < 8) + sizeClass = MySizeClass_hAny | MySizeClass_wAny; + else + sizeClass = (MySizeClass)((self.traitCollection.verticalSizeClass << 2) | self.traitCollection.horizontalSizeClass); + + UIDeviceOrientation ori = [UIDevice currentDevice].orientation; + if (UIDeviceOrientationIsPortrait(ori)) + { + sizeClass |= MySizeClass_Portrait; + } + else if (UIDeviceOrientationIsLandscape(ori)) + { + sizeClass |= MySizeClass_Landscape; + } + else; + + _myGlobalSizeClass = sizeClass; + } + else + { + ; + } + + return _myGlobalSizeClass; +} + +-(void)myRemoveSubviewObserver:(UIView*)subview +{ + + MyFrame *sbvmyFrame = objc_getAssociatedObject(subview, ASSOCIATEDOBJECT_KEY_MYLAYOUT_FRAME); + if (sbvmyFrame != nil) + { + sbvmyFrame.sizeClass.viewLayoutCompleteBlock = nil; + if (sbvmyFrame.hasObserver) + { + [subview removeObserver:self forKeyPath:@"hidden"]; + [subview removeObserver:self forKeyPath:@"frame"]; + + if ([subview isKindOfClass:[MyBaseLayout class]]) + { + [subview removeObserver:self forKeyPath:@"center"]; + } + else if ([subview isKindOfClass:[UILabel class]]) + { + [subview removeObserver:self forKeyPath:@"text"]; + [subview removeObserver:self forKeyPath:@"attributedText"]; + } + else; + + sbvmyFrame.hasObserver = NO; + } + } +} + +-(void)myAddSubviewObserver:(UIView*)subview sbvmyFrame:(MyFrame*)sbvmyFrame +{ + + if (!sbvmyFrame.hasObserver) + { + //添加hidden, frame,center的属性通知。 + [subview addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew context:_myObserverContextA]; + [subview addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:_myObserverContextA]; + if ([subview isKindOfClass:[MyBaseLayout class]]) + { + [subview addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:_myObserverContextA]; + } + else if ([subview isKindOfClass:[UILabel class]]) + {//如果是UILabel则一旦设置了text和attributedText则 + + [subview addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:_myObserverContextB]; + [subview addObserver:self forKeyPath:@"attributedText" options:NSKeyValueObservingOptionNew context:_myObserverContextB]; + } + else; + + sbvmyFrame.hasObserver = YES; + + } +} + + + +@end + +//布局的事件处理委托对象 +@implementation MyTouchEventDelegate +{ + __weak MyBaseLayout *_layout; + __weak id _target; + SEL _action; + + __weak id _touchDownTarget; + SEL _touchDownAction; + + __weak id _touchCancelTarget; + SEL _touchCancelAction; + BOOL _hasDoCancel; + + + UIColor *_oldBackgroundColor; + UIImage *_oldBackgroundImage; + + CGFloat _oldAlpha; + + BOOL _forbidTouch; + BOOL _canCallAction; + CGPoint _beginPoint; + +} + +BOOL _hasBegin; + +-(instancetype)initWithLayout:(MyBaseLayout *)layout +{ + self = [self init]; + if (self != nil) + { + _layout = layout; + } + + return self; +} + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event +{ + UITouch *touch = [touches anyObject]; + + if (_layout != nil && _target != nil && !_forbidTouch && touch.tapCount == 1 && !_hasBegin) + { + _hasBegin = YES; + _canCallAction = YES; + _beginPoint = [touch locationInView:_layout]; + + [self mySetTouchHighlighted]; + + _hasDoCancel = NO; + [self myPerformTouch:_touchDownTarget withAction:_touchDownAction]; + } +} + +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event +{ + if (_layout != nil && _target != nil && _hasBegin) + { + if (_canCallAction) + { + CGPoint pt = [((UITouch*)[touches anyObject]) locationInView:_layout]; + if (fabs(pt.x - _beginPoint.x) > 2 || fabs(pt.y - _beginPoint.y) > 2) + { + _canCallAction = NO; + + if (!_hasDoCancel) + { + [self myPerformTouch:_touchCancelTarget withAction:_touchCancelAction]; + + _hasDoCancel = YES; + + } + + } + } + } +} + +-(void)doTargetAction:(UITouch*)touch +{ + + [self myResetTouchHighlighted]; + + //距离太远则不会处理 + CGPoint pt = [touch locationInView:_layout]; + if (CGRectContainsPoint(_layout.bounds, pt) && _action != nil && _canCallAction) + { + [self myPerformTouch:_target withAction:_action]; + + } + else + { + if (!_hasDoCancel) + { + [self myPerformTouch:_touchCancelTarget withAction:_touchCancelAction]; + _hasDoCancel = YES; + } + + } + + _forbidTouch = NO; + +} + + +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event +{ + + if (_layout != nil && _target != nil && _hasBegin) + { + //设置一个延时. + _forbidTouch = YES; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [self performSelector:@selector(doTargetAction:) withObject:[touches anyObject] afterDelay:0.12]; +#pragma clang diagnostic pop + + _hasBegin = NO; + } +} + +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event +{ + + if (_layout != nil && _target != nil && _hasBegin) + { + [self myResetTouchHighlighted]; + + _hasBegin = NO; + + if (!_hasDoCancel) + { + [self myPerformTouch:_touchCancelTarget withAction:_touchCancelAction]; + + _hasDoCancel = YES; + } + + } +} + + +///设置触摸时的高亮 +-(void)mySetTouchHighlighted +{ + if (_layout.highlightedOpacity != 0) + { + _oldAlpha = _layout.alpha; + _layout.alpha = 1 - _layout.highlightedOpacity; + } + + if (_layout.highlightedBackgroundColor != nil) + { + _oldBackgroundColor = _layout.backgroundColor; + _layout.backgroundColor = _layout.highlightedBackgroundColor; + } + + if (_layout.highlightedBackgroundImage != nil) + { + _oldBackgroundImage = _layout.backgroundImage; + _layout.backgroundImage = _layout.highlightedBackgroundImage; + } + +} + +//恢复触摸时的高亮。 +-(void)myResetTouchHighlighted +{ + if (_layout.highlightedOpacity != 0) + { + _layout.alpha = _oldAlpha; + _oldAlpha = 1; + } + + if (_layout.highlightedBackgroundColor != nil) + { + _layout.backgroundColor = _oldBackgroundColor; + _oldBackgroundColor = nil; + } + + + if (_layout.highlightedBackgroundImage != nil) + { + _layout.backgroundImage = _oldBackgroundImage; + _oldBackgroundImage = nil; + } + +} + +-(void)myPerformTouch:(id)target withAction:(SEL)action +{ + if (_layout != nil && target != nil && action != nil) + { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" + [target performSelector:action withObject:_layout]; +#pragma clang diagnostic pop + + } +} + +-(void)setTarget:(id)target action:(SEL)action +{ + _target = target; + _action = action; +} + + +-(void)setTouchDownTarget:(id)target action:(SEL)action +{ + _touchDownTarget = target; + _touchDownAction = action; +} + +-(void)setTouchCancelTarget:(id)target action:(SEL)action +{ + _touchCancelTarget = target; + _touchCancelAction = action; + +} + + +@end + + + +@implementation MyBorderlineLayerDelegate +{ + __weak MyBaseLayout *_layout; +} + +-(id)initWithLayout:(MyBaseLayout*)layout +{ + self = [self init]; + if (self != nil) + { + _layout = layout; + } + + return self; +} + + +-(void)setTopBorderline:(MyBorderline *)topBorderline +{ + if (_topBorderline != topBorderline) + { + _topBorderline = topBorderline; + + CAShapeLayer *borderLayer = _topBorderlineLayer; + [self myUpdateBorderLayer:&borderLayer withBorderline:_topBorderline]; + _topBorderlineLayer = borderLayer; + + } +} + +-(void)setLeadingBorderline:(MyBorderline *)leadingBorderline +{ + if (_leadingBorderline != leadingBorderline) + { + _leadingBorderline = leadingBorderline; + + CAShapeLayer *borderLayer = _leadingBorderlineLayer; + [self myUpdateBorderLayer:&borderLayer withBorderline:_leadingBorderline]; + _leadingBorderlineLayer = borderLayer; + } +} + +-(void)setBottomBorderline:(MyBorderline *)bottomBorderline +{ + if (_bottomBorderline != bottomBorderline) + { + _bottomBorderline = bottomBorderline; + + CAShapeLayer *borderLayer = _bottomBorderlineLayer; + [self myUpdateBorderLayer:&borderLayer withBorderline:_bottomBorderline]; + _bottomBorderlineLayer = borderLayer; + } +} + + +-(void)setTrailingBorderline:(MyBorderline *)trailingBorderline +{ + if (_trailingBorderline != trailingBorderline) + { + _trailingBorderline = trailingBorderline; + + CAShapeLayer *borderLayer = _trailingBorderlineLayer; + [self myUpdateBorderLayer:&borderLayer withBorderline:_trailingBorderline]; + _trailingBorderlineLayer = borderLayer; + } + +} + +-(MyBorderline*)leftBorderline +{ + if ([MyBaseLayout isRTL]) + return self.trailingBorderline; + else + return self.leadingBorderline; +} + +-(void)setLeftBorderline:(MyBorderline *)leftBorderline +{ + if ([MyBaseLayout isRTL]) + self.trailingBorderline = leftBorderline; + else + self.leadingBorderline = leftBorderline; +} + + +-(MyBorderline*)rightBorderline +{ + if ([MyBaseLayout isRTL]) + return self.leadingBorderline; + else + return self.trailingBorderline; +} + +-(void)setRightBorderline:(MyBorderline *)rightBorderline +{ + if ([MyBaseLayout isRTL]) + self.leadingBorderline = rightBorderline; + else + self.trailingBorderline = rightBorderline; +} + + + +-(void)myUpdateBorderLayer:(CAShapeLayer**)ppLayer withBorderline:(MyBorderline*)borderline +{ + + if (borderline == nil) + { + + if (*ppLayer != nil) { - (*ppLayer).delegate = nil; - [(*ppLayer) removeFromSuperlayer]; + [(*ppLayer) removeFromSuperlayer]; + (*ppLayer).delegate = nil; *ppLayer = nil; } } else { - if (_layerDelegate == nil) - _layerDelegate = [[MyBorderLineLayerDelegate alloc] initWithLayout:self]; if ( *ppLayer == nil) { *ppLayer = [[CAShapeLayer alloc] init]; - (*ppLayer).delegate = _layerDelegate; - [self.layer addSublayer:*ppLayer]; + (*ppLayer).delegate = self; + [_layout.layer addSublayer:*ppLayer]; } //如果是点线则是用path,否则就用背景色 - if (borderLineDraw.dash != 0) + if (borderline.dash != 0) { - (*ppLayer).lineDashPhase = borderLineDraw.dash / 2; - NSNumber *num = @(borderLineDraw.dash); + (*ppLayer).lineDashPhase = borderline.dash / 2; + NSNumber *num = @(borderline.dash); (*ppLayer).lineDashPattern = @[num,num]; - (*ppLayer).strokeColor = borderLineDraw.color.CGColor; - (*ppLayer).lineWidth = borderLineDraw.thick; + (*ppLayer).strokeColor = borderline.color.CGColor; + (*ppLayer).lineWidth = borderline.thick; (*ppLayer).backgroundColor = nil; } @@ -1978,7 +3331,7 @@ -(void)updateBorderLayer:(CAShapeLayer**)ppLayer withBorderLineDraw:(MyBorderLin (*ppLayer).strokeColor = nil; (*ppLayer).lineWidth = 0; - (*ppLayer).backgroundColor = borderLineDraw.color.CGColor; + (*ppLayer).backgroundColor = borderline.color.CGColor; } @@ -1988,4 +3341,293 @@ -(void)updateBorderLayer:(CAShapeLayer**)ppLayer withBorderLineDraw:(MyBorderLin } +-(void)layoutSublayersOfLayer:(CAShapeLayer *)layer +{ + if (_layout == nil) + return; + + CGSize layoutSize = _layout.layer.bounds.size; + + if (layoutSize.width == 0 || layoutSize.height == 0) + return; + + CGRect layerRect; + CGPoint fromPoint; + CGPoint toPoint; + CGFloat scale = [UIScreen mainScreen].scale; + + if (layer == self.leadingBorderlineLayer) + { + layerRect = CGRectMake(self.leadingBorderline.offset, self.leadingBorderline.headIndent, self.leadingBorderline.thick/scale, layoutSize.height - self.leadingBorderline.headIndent - self.leadingBorderline.tailIndent); + fromPoint = CGPointMake(0, 0); + toPoint = CGPointMake(0, layerRect.size.height); + + } + else if (layer == self.trailingBorderlineLayer) + { + layerRect = CGRectMake(layoutSize.width - self.trailingBorderline.thick / scale - self.trailingBorderline.offset, self.trailingBorderline.headIndent, self.trailingBorderline.thick / scale, layoutSize.height - self.trailingBorderline.headIndent - self.trailingBorderline.tailIndent); + fromPoint = CGPointMake(0, 0); + toPoint = CGPointMake(0, layerRect.size.height); + + } + else if (layer == self.topBorderlineLayer) + { + layerRect = CGRectMake(self.topBorderline.headIndent, self.topBorderline.offset, layoutSize.width - self.topBorderline.headIndent - self.topBorderline.tailIndent, self.topBorderline.thick/scale); + fromPoint = CGPointMake(0, 0); + toPoint = CGPointMake(layerRect.size.width, 0); + } + else if (layer == self.bottomBorderlineLayer) + { + layerRect = CGRectMake(self.bottomBorderline.headIndent, layoutSize.height - self.bottomBorderline.thick / scale - self.bottomBorderline.offset, layoutSize.width - self.bottomBorderline.headIndent - self.bottomBorderline.tailIndent, self.bottomBorderline.thick /scale); + fromPoint = CGPointMake(0, 0); + toPoint = CGPointMake(layerRect.size.width, 0); + + } + else + { + layerRect = CGRectZero; + fromPoint = CGPointZero; + toPoint = CGPointZero; + NSAssert(0, @"oops!"); + } + + if ([MyBaseLayout isRTL]) + { + layerRect.origin.x = layoutSize.width - layerRect.origin.x - layerRect.size.width; + } + + //把动画效果取消。 + + + if (!_myCGRectEqual(layer.frame, layerRect)) + { + if (layer.lineDashPhase == 0) + { + layer.path = nil; + } + else + { + CGMutablePathRef path = CGPathCreateMutable(); + CGPathMoveToPoint(path, nil, fromPoint.x, fromPoint.y); + CGPathAddLineToPoint(path, nil, toPoint.x,toPoint.y); + layer.path = path; + CGPathRelease(path); + } + layer.frame = layerRect; + + } + +} + + +- (nullable id)actionForLayer:(CALayer *)layer forKey:(NSString *)event +{ + return [NSNull null]; +} + + +-(void)setNeedsLayout +{ + if (_topBorderlineLayer != nil) + [_topBorderlineLayer setNeedsLayout]; + + if (_bottomBorderlineLayer != nil) + [_bottomBorderlineLayer setNeedsLayout]; + + + if (_leadingBorderlineLayer != nil) + [_leadingBorderlineLayer setNeedsLayout]; + + if (_trailingBorderlineLayer != nil) + [_trailingBorderlineLayer setNeedsLayout]; + +} + + +@end + + + + +@implementation MyFrame + +-(id)init +{ + self = [super init]; + if (self != nil) + { + _leading = CGFLOAT_MAX; + _trailing = CGFLOAT_MAX; + _top = CGFLOAT_MAX; + _bottom = CGFLOAT_MAX; + _width = CGFLOAT_MAX; + _height = CGFLOAT_MAX; + } + + return self; +} + +-(void)reset +{ + _leading = CGFLOAT_MAX; + _trailing = CGFLOAT_MAX; + _top = CGFLOAT_MAX; + _bottom = CGFLOAT_MAX; + _width = CGFLOAT_MAX; + _height = CGFLOAT_MAX; +} + + +-(CGRect)frame +{ + return CGRectMake(_leading, _top,_width, _height); +} + +-(void)setFrame:(CGRect)frame +{ + _leading = frame.origin.x; + _top = frame.origin.y; + _width = frame.size.width; + _height = frame.size.height; + _trailing = _leading + _width; + _bottom = _top + _height; +} + +-(BOOL)multiple +{ + return self.sizeClasses.count > 1; +} + +-(NSString*)description +{ + return [NSString stringWithFormat:@"leading:%g, top:%g, width:%g, height:%g, trailing:%g, bottom:%g",_leading,_top,_width,_height,_trailing,_bottom]; +} + + @end + + +BOOL _myCGFloatEqual(CGFloat f1, CGFloat f2) +{ +#if CGFLOAT_IS_DOUBLE == 1 + return fabs(f1 - f2) < 1e-7; +#else + return fabsf(f1 - f2) < 1e-4; +#endif +} + +BOOL _myCGFloatNotEqual(CGFloat f1, CGFloat f2) +{ +#if CGFLOAT_IS_DOUBLE == 1 + return fabs(f1 - f2) > 1e-7; +#else + return fabsf(f1 - f2) > 1e-4; +#endif +} + + +BOOL _myCGFloatLessOrEqual(CGFloat f1, CGFloat f2) +{ + +#if CGFLOAT_IS_DOUBLE == 1 + return f1 < f2 || fabs(f1 - f2) < 1e-7; +#else + return f1 < f2 || fabsf(f1 - f2) < 1e-4; +#endif +} + +BOOL _myCGFloatGreatOrEqual(CGFloat f1, CGFloat f2) +{ +#if CGFLOAT_IS_DOUBLE == 1 + return f1 > f2 || fabs(f1 - f2) < 1e-7; +#else + return f1 > f2 || fabsf(f1 - f2) < 1e-4; +#endif +} + +BOOL _myCGSizeEqual(CGSize sz1, CGSize sz2) +{ + return _myCGFloatEqual(sz1.width, sz2.width) && _myCGFloatEqual(sz1.height, sz2.height); +} + +BOOL _myCGPointEqual(CGPoint pt1, CGPoint pt2) +{ + return _myCGFloatEqual(pt1.x, pt2.x) && _myCGFloatEqual(pt1.y, pt2.y); +} + +BOOL _myCGRectEqual(CGRect rect1, CGRect rect2) +{ + return _myCGSizeEqual(rect1.size, rect2.size) && _myCGPointEqual(rect1.origin, rect2.origin); +} + + +CGFloat _myRoundNumber(CGFloat f) +{ + if (f == 0 || f == CGFLOAT_MAX || f == -CGFLOAT_MAX) + return f; + + int fi = (int)f; + if (f == fi) + return fi; + + //按精度四舍五入 + //正确的算法应该是。x = 0; y = 0; 0 + +#if TARGET_OS_IPHONE + #import + + /** *一个用于计算位置和尺寸在不同设备屏幕下缩放比例的辅助类,用于实现不同大小设备屏幕之间的位置和尺寸的适配。 *比如某个视图的宽度在iPhone6下是100,那么在iPhone6+上大概应该是110,而在iPhone5下则大概应该是85。 @@ -35,8 +40,41 @@ */ +(CGFloat)scaleH:(CGFloat)val; +/** + *根据屏幕清晰度将带小数的入参返回能转化为有效物理像素的最接近的设备点值。 + *比如当入参为1.3时,那么在1倍屏幕下的有效值就是1,而在2倍屏幕下的有效值就是1.5,而在3倍屏幕下的有效值就是1.3333333了 + */ ++(CGFloat)roundNumber:(CGFloat)number; + +/** + *根据屏幕清晰度将带小数的point入参返回能转化为有效物理像素的最接近的设备point点值。 + */ ++(CGPoint)roundPoint:(CGPoint)point; + + +/** + *根据屏幕清晰度将带小数的size入参返回能转化为有效物理像素的最接近的设备size点值。 + */ ++(CGSize)roundSize:(CGSize)size; + +/** + *根据屏幕清晰度将带小数的rect入参返回能转化为有效物理像素的最接近的设备rect点值。 + */ ++(CGRect)roundRect:(CGRect)rect; + + + @end #define MYDIMESCALE(val) ([MyDimeScale scale:val]) #define MYDIMESCALEW(val) ([MyDimeScale scaleW:val]) #define MYDIMESCALEH(val) ([MyDimeScale scaleH:val]) + +#elif TARGET_OS_MAC + +#define MYDIMESCALE(val) val +#define MYDIMESCALEW(val) val +#define MYDIMESCALEH(val) val + + +#endif diff --git a/Pods/MyLayout/MyLayout/Lib/MyDimeScale.m b/Pods/MyLayout/MyLayout/Lib/MyDimeScale.m index 12cad89..9c1692e 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyDimeScale.m +++ b/Pods/MyLayout/MyLayout/Lib/MyDimeScale.m @@ -8,6 +8,14 @@ #import "MyDimeScale.h" +#if TARGET_OS_IPHONE + +extern CGFloat _myRoundNumber(CGFloat); +extern CGPoint _myRoundPoint(CGPoint); +extern CGSize _myRoundSize(CGSize); +extern CGRect _myRoundRect(CGRect); + + @implementation MyDimeScale CGFloat _rate = 1; @@ -24,30 +32,44 @@ +(void)setUITemplateSize:(CGSize)size _rate = sqrt((screenSize.width * screenSize.width + screenSize.height * screenSize.height) / (size.width * size.width + size.height * size.height)); } -//保持缩放值精确到0.5 -+(CGFloat)roundNumber:(CGFloat)num ++(CGFloat)scale:(CGFloat)val { - num += 0.49999; - num *= 2; - return floor(num) / 2.0; + return _myRoundNumber(val * _rate); } ++(CGFloat)scaleW:(CGFloat)val +{ + return _myRoundNumber(val * _wrate); +} -+(CGFloat)scale:(CGFloat)val ++(CGFloat)scaleH:(CGFloat)val { - return [self roundNumber:val * _rate]; + return _myRoundNumber(val * _hrate); } -+(CGFloat)scaleW:(CGFloat)val ++(CGFloat)roundNumber:(CGFloat)number { - return [self roundNumber:val * _wrate]; + return _myRoundNumber(number); } -+(CGFloat)scaleH:(CGFloat)val ++(CGPoint)roundPoint:(CGPoint)point { - return [self roundNumber:val * _hrate]; + return _myRoundPoint(point); } ++(CGSize)roundSize:(CGSize)size +{ + return _myRoundSize(size); +} + ++(CGRect)roundRect:(CGRect)rect +{ + return _myRoundRect(rect); +} + + @end + +#endif diff --git a/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.h b/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.h index 384fa3c..ed9c3f4 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.h @@ -13,79 +13,139 @@ @interface UIView(MyFloatLayoutExt) /** - *是否反方向浮动,默认是NO表示正向浮动,具体方向则根据浮动布局视图的方向。如果是垂直布局则默认是向左浮动的,如果是水平布局则默认是向上浮动的。 - 如果这个值设置为YES则当布局是垂直布局时则向右浮动,而如果是水平布局则向下浮动。 + 是否反方向浮动,默认是NO表示正向浮动。正向浮动和反向浮动的意义根据所在的父浮动布局视图的方向的不同而不同: + + 1. 如果父视图是垂直浮动布局则默认正向浮动是向左浮动的,而反向浮动则是向右浮动。 + + @code + 下面是垂直浮动布局中的正向浮动和反向浮动的效果图(正向浮动:A,B,D; 反向浮动:C,E,F): + + |<--A-- <---B--- -C->| + |<-----D---- -F-> --E-->| + @endcode + + 2. 如果父视图是水平浮动布局则默认正向浮动是向上浮动的,而反向浮动则是向下浮动。 + + @code + 下面是水平浮动布局中的正向浮动和反向浮动的效果图(正向浮动:A,B,D; 反向浮动:C,E,F): + + ----------- + ↑ ↑ + | | + A | + | D + | + ↑ | + B + | F + ↓ + | | + C E + ↓ ↓ + ------------ + @endcode + + @note 这个属性的定义是完全参考CSS样式表中float属性的定义 */ @property(nonatomic,assign,getter=isReverseFloat) IBInspectable BOOL reverseFloat; -/** - *清除浮动,默认是NO。这个属性也跟布局视图的方向相关。如果设置为了清除浮动属性则表示本子视图不会在浮动方向上紧跟在前一个浮动子视图的后面,而是会另外新起一行或者一列来进行布局。reverseFloat和clearFloat这两个属性的定义是完全参考CSS样式表中浮动布局中的float和clear这两个属性。 - */ -@property(nonatomic,assign) IBInspectable BOOL clearFloat; - /** - *浮动视图的尺寸的比重。默认值是0, 值的设定指定在0和1之间。这个属性的意义根据浮动布局视图的方向而不同。 - *当浮动布局视图是垂直布局时,这个属性用来设置宽度占用当前的剩余宽度的比重,这样子视图就不需要明确的设定宽度值。 - *当浮动布局视图是水平布局时,这个属性用来设置高度占用当前的剩余高度的比重,这样子视图就不需要明确的设定高度值。 + 清除浮动,默认是NO。这个属性的意义也跟父浮动布局视图的方向相关。如果设置为了清除浮动属性则表示本子视图不会在浮动方向上紧跟在前一个浮动子视图的后面,而是会另外新起一行或者一列来重新排列。 + + @code + 垂直浮动布局下的浮动和清除浮动 + + |<--A-- <---B--- <-C--| + |<----D--- | + |<--E-- <---F-- | + |<-----G---- | + | ---I---> --H-->| + | -J-> | + + A(正向浮动);B(正向浮动);C(正向浮动);D(正向浮动);E(正向浮动);F(正向浮动);G(正向浮动,清除浮动);H(反向浮动);I(反向浮动);J(反向浮动,清除浮动) + @endcode + + @note 这个属性的定义是完全参考CSS样式表中clear属性的定义。 - 举例来说,假设布局视图的宽度是100,而当前视图的前面一个视图已经占据了20的宽度,那么当设置当前视图的weight为1时则当前视图的宽度就会被设定为80。这样当前视图是不会浮动 - 到一个新的行的。而如果设定为0.8则当前视图的宽度则为(100-20)*0.8 = 16了。 */ -@property(nonatomic, assign) IBInspectable CGFloat weight; - - +@property(nonatomic,assign) IBInspectable BOOL clearFloat; @end /** - * 浮动布局是一种里面的子视图按照约定的方向浮动停靠,当尺寸不足以被容纳时会自动寻找最佳的位置进行浮动停靠的布局视图。 - *浮动布局的理念源于HTML/CSS中的浮动定位技术,因此浮动布局可以专门用来实现那些不规则布局或者图文环绕的布局。 - *根据浮动的方向不同,浮动布局可以分为左右浮动布局和上下浮动布局。 + 浮动布局是一种里面的子视图按照约定的方向浮动停靠,当浮动布局的剩余空间不足容纳要加入的子视图的尺寸时会自动寻找最佳的位置进行浮动停靠的布局视图。浮动布局的理念源于HTML/CSS中的浮动定位技术,因此浮动布局可以专门用来实现那些不规则布局或者图文环绕的布局。 + + @note + 根据浮动的方向不同,浮动布局可以分为左右浮动布局和上下浮动布局。我们称左右浮动的浮动布局为垂直浮动布局,因为左右浮动时最终整个方向是从上到下的;称上下浮动的浮动布局为水平浮动布局,因为上下浮动时最终整个方向是从左到右的。 */ @interface MyFloatLayout : MyBaseLayout /** - *初始化一个浮动布局并指定布局的方向。当方向设置为MyLayoutViewOrientation_Vert时表示为左右浮动布局视图,而设置为MyLayoutViewOrientation_Horz则表示为上下浮动布局视图。 + 初始化一个浮动布局并指定布局的方向。当方向设置为MyOrientation_Vert时表示为左右浮动布局视图,而设置为MyOrientation_Horz则表示为上下浮动布局视图。 + + @param orientation 指定浮动布局的方向,要注意的这个方向是整体排列的方向。 + @return 返回浮动布局的实例对象。 */ --(id)initWithOrientation:(MyLayoutViewOrientation)orientation; -+(id)floatLayoutWithOrientation:(MyLayoutViewOrientation)orientation; ++(instancetype)floatLayoutWithOrientation:(MyOrientation)orientation; +-(instancetype)initWithOrientation:(MyOrientation)orientation; +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation; /** - *浮动布局的方向。 - *如果是MyLayoutViewOrientation_Vert则表示从左到右,从上到下的垂直布局方式,这个方式是默认方式。 - *如果是MyLayoutViewOrientation_Horz则表示从上到下,从左到右的水平布局方式 - */ -@property(nonatomic,assign) MyLayoutViewOrientation orientation; - + 浮动布局的方向。 + + 1.MyOrientation_Vert 表示里面的子视图可以进行左右的浮动,但整体从上到下进行排列的布局方式,这个方式是默认方式。 -/** - *浮动布局内所有子视图的整体停靠对齐位置设定,默认是MyMarginGravity_None - *如果视图方向为MyLayoutViewOrientation_Vert时则水平方向的停靠失效。只能设置MyMarginGravity_Vert_Top,MyMarginGravity_Vert_Center,MyMarginGravity_Vert_Bottom 三个值。 - *如果视图方向为MyLayoutViewOrientation_Horz时则垂直方向的停靠失效。只能设置MyMarginGravity_Horz_Left,MyMarginGravity_Horz_Center,MyMarginGravity_Horz_Right + 2.MyOrientation_Horz 表示里面的子视图可以进行上下的浮动,但整体从左到右进行排列的布局方式,这个方式是默认方式。 */ -@property(nonatomic,assign) IBInspectable MyMarginGravity gravity; +@property(nonatomic,assign) IBInspectable MyOrientation orientation; + /** - *子视图之间的垂直和水平的间距,默认为0。当子视图之间的间距是固定时可以通过直接设置这两个属性值来指定间距而不需要为每个子视图来设置margin值。 + 不做布局边界尺寸的限制,子视图不会自动换行。因此当设置为YES时,子视图需要明确设置clearFloat来实现主动换行的处理。默认为NO。这个属性设置的意义使得我们可以自定义子视图的换行,而不是让子视图根据布局视图的尺寸限制自动换行。 + + 1. 当布局的orientation为MyOrientation_Vert并且wrapContentWidth为YES时,这个属性设置为YES才生效。 + + 2. 当布局的orientation为MyOrientation_Horz并且wrapContentHeight为YES时,这个属性设置为YES才生效。 + + @note 当属性设置为YES时,子视图不能将扩展属性reverseFloat设置为YES,同时不能设置weight属性,否则将导致结果异常。 + @note 这个属性设置为YES时,在左右浮动布局中,子视图只能向左浮动,并且没有右边界的限制,因此如果子视图没有clearFloat时则总是排列在前一个子视图的右边,并不会自动换行,因此为了让这个属性生效,布局视图必须要同时设置wrapContentWidth为YES。 + @note 这个属性设置为YES时,在上下浮动布局中,子视图只能向上浮动,并且没有下边界的限制,因此如果子视图没有设置clearFloat时则总是排列在前一个子视图的下边,并不会自动换行,因此为了让这个属性生效,布局视图必须要同时设置wrapContentHeight为YES. */ -@property(nonatomic ,assign) IBInspectable CGFloat subviewVertMargin; -@property(nonatomic, assign) IBInspectable CGFloat subviewHorzMargin; -@property(nonatomic, assign) IBInspectable CGFloat subviewMargin; //同时设置水平和垂直间距。 +@property(nonatomic,assign) IBInspectable BOOL noBoundaryLimit; /** - *根据浮动视图的方向设置子视图的间距为浮动间距而不是上面确定的固定间距。在一些应用场景我们有时候希望某些子视图的宽度是固定的情况下,子视图的间距是浮动的而不是固定的。因此您可以通过如下方法来设置浮动间距。这个方法会根据您当前布局的orientation方向不同而意义不同: - 1.如果您的布局方向是MyLayoutViewOrientation_Vert表示设置的是子视图的水平间距,其中的subviewSize指定的是子视图的宽度,minMargin指定的是最小的水平间距。 - 2.如果您的布局方向是MyLayoutViewOrientation_Horz表示设置的是子视图的垂直间距,其中的subviewSize指定的是子视图的高度,minMargin指定的是最小的垂直间距。 - 3.如果您不想使用浮动间距则请将subviewSize设置为0就可以了。 + 在一些应用场景中我们希望子视图的宽度是固定的但间距是浮动的,这样就尽可能在一排中容纳更多的子视图。比如设置每个子视图的宽度固定为80,那么在小屏幕下每排只能放3个,而大屏幕则每排能放4个或者5个子视图。 因此您可以通过如下方法来设置子视图的固定尺寸和最小最大浮动间距。这个方法会根据您当前布局的方向不同而具有不同的意义: + + 1.如果您的布局方向是垂直的则设置的是每行内子视图的水平浮动间距,其中的subviewSize指定的是子视图的固定宽度;minSpace指定的是最小的水平间距;maxSpace指定的是最大的水平间距,如果指定的subviewSize计算出的间距大于最大间距maxSpace则会缩小subviewSize的宽度值。 + + 2.如果您的布局方向是水平的则设置的是每列内子视图的垂直浮动间距,其中的subviewSize指定的是子视图的固定高度;minSpace指定的是最小的垂直间距;maxSpace指定的是最大的垂直间距,如果指定的subviewSize计算出的间距大于最大间距maxSpace则会调整subviewSize的高度值。 + + @note 如果您不想使用浮动间距则请将subviewSize设置为0就可以了。 + + @param subviewSize 指定子视图的尺寸。 + @param minSpace 指定子视图之间的最小间距 + @param maxSpace 指定子视图之间的最大间距 */ --(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin; --(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin inSizeClass:(MySizeClass)sizeClass; +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace; +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace inSizeClass:(MySizeClass)sizeClass; + + + +@end + + + +@interface MyFloatLayout(MyFloatLayoutDeprecated) + +-(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin MYMETHODDEPRECATED("use method: setSubviews:minSpace:maxSpace to replace"); +-(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin inSizeClass:(MySizeClass)sizeClass MYMETHODDEPRECATED("use method: setSubviews:minSpace:maxSpace:inSizeClass to replace"); @end + diff --git a/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.m b/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.m index 608d412..70cbd43 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyFloatLayout.m @@ -14,9 +14,10 @@ @implementation UIView(MyFloatLayoutExt) -(void)setReverseFloat:(BOOL)reverseFloat { - if (self.myCurrentSizeClass.isReverseFloat != reverseFloat) + UIView *sc = self.myCurrentSizeClass; + if (sc.isReverseFloat != reverseFloat) { - self.myCurrentSizeClass.reverseFloat = reverseFloat; + sc.reverseFloat = reverseFloat; if (self.superview != nil) [self.superview setNeedsLayout]; } @@ -30,9 +31,10 @@ -(BOOL)isReverseFloat -(void)setClearFloat:(BOOL)clearFloat { - if (self.myCurrentSizeClass.clearFloat != clearFloat) + UIView *sc = self.myCurrentSizeClass; + if (sc.clearFloat != clearFloat) { - self.myCurrentSizeClass.clearFloat = clearFloat; + sc.clearFloat = clearFloat; if (self.superview != nil) [self.superview setNeedsLayout]; } @@ -43,24 +45,6 @@ -(BOOL)clearFloat return self.myCurrentSizeClass.clearFloat; } - --(CGFloat)weight -{ - return self.myCurrentSizeClass.weight; -} - --(void)setWeight:(CGFloat)weight -{ - if (self.myCurrentSizeClass.weight != weight) - { - self.myCurrentSizeClass.weight = weight; - if (self.superview != nil) - [self.superview setNeedsLayout]; - } -} - - - @end @@ -68,9 +52,9 @@ -(void)setWeight:(CGFloat)weight @implementation MyFloatLayout --(id)initWithOrientation:(MyLayoutViewOrientation)orientation +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation { - self = [super init]; + self = [super initWithFrame:frame]; if (self != nil) { self.myCurrentSizeClass.orientation = orientation; @@ -79,14 +63,19 @@ -(id)initWithOrientation:(MyLayoutViewOrientation)orientation return self; } +-(instancetype)initWithOrientation:(MyOrientation)orientation +{ + return [self initWithFrame:CGRectZero orientation:orientation]; +} -+(id)floatLayoutWithOrientation:(MyLayoutViewOrientation)orientation + ++(instancetype)floatLayoutWithOrientation:(MyOrientation)orientation { MyFloatLayout *layout = [[[self class] alloc] initWithOrientation:orientation]; return layout; } --(void)setOrientation:(MyLayoutViewOrientation)orientation +-(void)setOrientation:(MyOrientation)orientation { MyFloatLayout *lsc = self.myCurrentSizeClass; if (lsc.orientation != orientation) @@ -96,84 +85,54 @@ -(void)setOrientation:(MyLayoutViewOrientation)orientation } } --(MyLayoutViewOrientation)orientation +-(MyOrientation)orientation { return self.myCurrentSizeClass.orientation; } --(void)setGravity:(MyMarginGravity)gravity -{ - MyFloatLayout *lsc = self.myCurrentSizeClass; - if (lsc.gravity != gravity) - { - lsc.gravity = gravity; - [self setNeedsLayout]; - } -} - --(MyMarginGravity)gravity -{ - return self.myCurrentSizeClass.gravity; -} --(void)setSubviewHorzMargin:(CGFloat)subviewHorzMargin +-(void)setNoBoundaryLimit:(BOOL)noBoundaryLimit { MyFloatLayout *lsc = self.myCurrentSizeClass; - - if (lsc.subviewHorzMargin != subviewHorzMargin) + if (lsc.noBoundaryLimit != noBoundaryLimit) { - lsc.subviewHorzMargin = subviewHorzMargin; + lsc.noBoundaryLimit = noBoundaryLimit; [self setNeedsLayout]; } } --(CGFloat)subviewHorzMargin +-(BOOL)noBoundaryLimit { - return self.myCurrentSizeClass.subviewHorzMargin; + return self.myCurrentSizeClass.noBoundaryLimit; } --(void)setSubviewVertMargin:(CGFloat)subviewVertMargin -{ - MyFloatLayout *lsc = self.myCurrentSizeClass; - if (lsc.subviewVertMargin != subviewVertMargin) - { - lsc.subviewVertMargin = subviewVertMargin; - [self setNeedsLayout]; - } -} --(CGFloat)subviewVertMargin +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace { - return self.myCurrentSizeClass.subviewVertMargin; + [self setSubviewsSize:subviewSize minSpace:minSpace maxSpace:maxSpace inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; } --(CGFloat)subviewMargin +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace inSizeClass:(MySizeClass)sizeClass { - return self.myCurrentSizeClass.subviewMargin; + MyFloatLayoutViewSizeClass *lsc = (MyFloatLayoutViewSizeClass*)[self fetchLayoutSizeClass:sizeClass]; + lsc.subviewSize = subviewSize; + lsc.minSpace = minSpace; + lsc.maxSpace = maxSpace; + [self setNeedsLayout]; } --(void)setSubviewMargin:(CGFloat)subviewMargin -{ - MyFloatLayout *lsc = self.myCurrentSizeClass; - if (lsc.subviewMargin != subviewMargin) - { - lsc.subviewMargin = subviewMargin; - [self setNeedsLayout]; - } -} + +#pragma mark -- Deprecated Method --(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin; +-(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin { - [self setSubviewFloatMargin:subviewSize minMargin:minMargin inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; + [self setSubviewsSize:subviewSize minSpace:minMargin maxSpace:CGFLOAT_MAX]; } -(void)setSubviewFloatMargin:(CGFloat)subviewSize minMargin:(CGFloat)minMargin inSizeClass:(MySizeClass)sizeClass { - MyLayoutSizeClassFloatLayout *lsc = (MyLayoutSizeClassFloatLayout*)[self fetchLayoutSizeClass:sizeClass]; - lsc.subviewSize = subviewSize; - lsc.minMargin = minMargin; - [self setNeedsLayout]; + [self setSubviewsSize:subviewSize minSpace:minMargin maxSpace:CGFLOAT_MAX inSizeClass:sizeClass]; } @@ -187,53 +146,138 @@ - (void)drawRect:(CGRect)rect { } */ --(CGPoint)findRightCandidatePoint:(CGRect)leftCandidateRect width:(CGFloat)width rightBoundary:(CGFloat)rightBoundary rightCandidateRects:(NSArray*)rightCandidateRects hasWeight:(BOOL)hasWeight + +#pragma mark -- Override Method + +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs { + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; + + if (sbs == nil) + sbs = [self myGetLayoutSubviews]; + + MyFloatLayout *lsc = self.myCurrentSizeClass; - CGPoint retPoint = {rightBoundary,CGFLOAT_MAX}; + MyOrientation orientation = lsc.orientation; - CGFloat lastHeight = self.topPadding; - for (NSInteger i = rightCandidateRects.count - 1; i >= 0; i--) + for (UIView *sbv in sbs) { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; - CGRect rightCandidateRect = ((NSValue*)rightCandidateRects[i]).CGRectValue; + if (!isEstimate) + { + sbvmyFrame.frame = sbv.bounds; + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + } + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + + if (sbvsc.wrapContentWidth) + { + if (sbvsc.widthSizeInner.dimeVal != nil || (orientation == MyOrientation_Vert && sbvsc.weight != 0)) + { + sbvsc.wrapContentWidth = NO; + } + } + + if (sbvsc.wrapContentHeight) + { + if (sbvsc.heightSizeInner.dimeVal != nil || (orientation == MyOrientation_Horz && sbvsc.weight != 0)) + { + sbvsc.wrapContentHeight = NO; + } + } + + BOOL isSbvWrap = sbvsc.wrapContentHeight || sbvsc.wrapContentWidth; + + if (pHasSubLayout != nil && isSbvWrap) + *pHasSubLayout = YES; + + if (isEstimate && isSbvWrap) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } + } + + + if (orientation == MyOrientation_Vert) + selfSize = [self myLayoutSubviewsForVert:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; + else + selfSize = [self myLayoutSubviewsForHorz:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; + + + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + + [self myAdjustSubviewsRTLPos:sbs selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs lsc:lsc]; +} + +-(id)createSizeClassInstance +{ + return [MyFloatLayoutViewSizeClass new]; +} + +#pragma mark -- Private Method + +-(CGPoint)myFindTrailingCandidatePoint:(CGRect)leadingCandidateRect width:(CGFloat)width trailingBoundary:(CGFloat)trailingBoundary trailingCandidateRects:(NSArray*)trailingCandidateRects hasWeight:(BOOL)hasWeight paddingTop:(CGFloat)paddingTop +{ + + CGPoint retPoint = {trailingBoundary,CGFLOAT_MAX}; + + CGFloat lastHeight = paddingTop; + for (NSInteger i = trailingCandidateRects.count - 1; i >= 0; i--) + { + + CGRect trailingCandidateRect = ((NSValue*)trailingCandidateRects[i]).CGRectValue; //如果有比重则不能相等只能小于。 - if ((hasWeight ? CGRectGetMaxX(leftCandidateRect) + width < CGRectGetMinX(rightCandidateRect) : CGRectGetMaxX(leftCandidateRect) + width <= CGRectGetMinX(rightCandidateRect)) && - CGRectGetMaxY(leftCandidateRect) > lastHeight) + if ((hasWeight ? CGRectGetMaxX(leadingCandidateRect) + width < CGRectGetMinX(trailingCandidateRect) : _myCGFloatLessOrEqual(CGRectGetMaxX(leadingCandidateRect) + width, CGRectGetMinX(trailingCandidateRect)) + ) && + CGRectGetMaxY(leadingCandidateRect) > lastHeight) { - retPoint.y = MAX(CGRectGetMinY(leftCandidateRect),lastHeight); - retPoint.x = CGRectGetMinX(rightCandidateRect); + retPoint.y = MAX(CGRectGetMinY(leadingCandidateRect),lastHeight); + retPoint.x = CGRectGetMinX(trailingCandidateRect); break; } - lastHeight = CGRectGetMaxY(rightCandidateRect); + lastHeight = CGRectGetMaxY(trailingCandidateRect); } if (retPoint.y == CGFLOAT_MAX) { - if ((hasWeight ? CGRectGetMaxX(leftCandidateRect) + width < rightBoundary : CGRectGetMaxX(leftCandidateRect) + width <= rightBoundary ) && - CGRectGetMaxY(leftCandidateRect) > lastHeight) + if ((hasWeight ? CGRectGetMaxX(leadingCandidateRect) + width < trailingBoundary :_myCGFloatLessOrEqual(CGRectGetMaxX(leadingCandidateRect) + width, trailingBoundary) ) && + CGRectGetMaxY(leadingCandidateRect) > lastHeight) { - retPoint.y = MAX(CGRectGetMinY(leftCandidateRect),lastHeight); + retPoint.y = MAX(CGRectGetMinY(leadingCandidateRect),lastHeight); } } return retPoint; } --(CGPoint)findBottomCandidatePoint:(CGRect)topCandidateRect height:(CGFloat)height bottomBoundary:(CGFloat)bottomBoundary bottomCandidateRects:(NSArray*)bottomCandidateRects hasWeight:(BOOL)hasWeight +-(CGPoint)myFindBottomCandidatePoint:(CGRect)topCandidateRect height:(CGFloat)height bottomBoundary:(CGFloat)bottomBoundary bottomCandidateRects:(NSArray*)bottomCandidateRects hasWeight:(BOOL)hasWeight paddingLeading:(CGFloat)paddingLeading { CGPoint retPoint = {CGFLOAT_MAX,bottomBoundary}; - CGFloat lastWidth = self.leftPadding; + CGFloat lastWidth = paddingLeading; for (NSInteger i = bottomCandidateRects.count - 1; i >= 0; i--) { CGRect bottomCandidateRect = ((NSValue*)bottomCandidateRects[i]).CGRectValue; - if ((hasWeight ? CGRectGetMaxY(topCandidateRect) + height < CGRectGetMinY(bottomCandidateRect) : CGRectGetMaxY(topCandidateRect) + height <= CGRectGetMinY(bottomCandidateRect)) && + + if ((hasWeight ? CGRectGetMaxY(topCandidateRect) + height < CGRectGetMinY(bottomCandidateRect) : + _myCGFloatLessOrEqual(CGRectGetMaxY(topCandidateRect) + height, CGRectGetMinY(bottomCandidateRect))) && CGRectGetMaxX(topCandidateRect) > lastWidth) { retPoint.x = MAX(CGRectGetMinX(topCandidateRect),lastWidth); @@ -247,7 +291,7 @@ -(CGPoint)findBottomCandidatePoint:(CGRect)topCandidateRect height:(CGFloat)hei if (retPoint.x == CGFLOAT_MAX) { - if ((hasWeight ? CGRectGetMaxY(topCandidateRect) + height < bottomBoundary : CGRectGetMaxY(topCandidateRect) + height <= bottomBoundary ) && + if ((hasWeight ? CGRectGetMaxY(topCandidateRect) + height < bottomBoundary : _myCGFloatLessOrEqual(CGRectGetMaxY(topCandidateRect) + height, bottomBoundary) ) && CGRectGetMaxX(topCandidateRect) > lastWidth) { retPoint.x = MAX(CGRectGetMinX(topCandidateRect),lastWidth); @@ -258,51 +302,56 @@ -(CGPoint)findBottomCandidatePoint:(CGRect)topCandidateRect height:(CGFloat)hei } --(CGPoint)findLeftCandidatePoint:(CGRect)rightCandidateRect width:(CGFloat)width leftBoundary:(CGFloat)leftBoundary leftCandidateRects:(NSArray*)leftCandidateRects hasWeight:(BOOL)hasWeight +-(CGPoint)myFindLeadingCandidatePoint:(CGRect)trailingCandidateRect width:(CGFloat)width leadingBoundary:(CGFloat)leadingBoundary leadingCandidateRects:(NSArray*)leadingCandidateRects hasWeight:(BOOL)hasWeight paddingTop:(CGFloat)paddingTop { - CGPoint retPoint = {leftBoundary,CGFLOAT_MAX}; + CGPoint retPoint = {leadingBoundary,CGFLOAT_MAX}; - CGFloat lastHeight = self.topPadding; - for (NSInteger i = leftCandidateRects.count - 1; i >= 0; i--) + CGFloat lastHeight = paddingTop; + for (NSInteger i = leadingCandidateRects.count - 1; i >= 0; i--) { - CGRect leftCandidateRect = ((NSValue*)leftCandidateRects[i]).CGRectValue; - if ((hasWeight ? CGRectGetMinX(rightCandidateRect) - width > CGRectGetMaxX(leftCandidateRect) : CGRectGetMinX(rightCandidateRect) - width >= CGRectGetMaxX(leftCandidateRect)) && - CGRectGetMaxY(rightCandidateRect) > lastHeight) + CGRect leadingCandidateRect = ((NSValue*)leadingCandidateRects[i]).CGRectValue; + + if ((hasWeight ? CGRectGetMinX(trailingCandidateRect) - width > CGRectGetMaxX(leadingCandidateRect) : + _myCGFloatGreatOrEqual(CGRectGetMinX(trailingCandidateRect) - width, CGRectGetMaxX(leadingCandidateRect))) && + CGRectGetMaxY(trailingCandidateRect) > lastHeight) { - retPoint.y = MAX(CGRectGetMinY(rightCandidateRect),lastHeight); - retPoint.x = CGRectGetMaxX(leftCandidateRect); + retPoint.y = MAX(CGRectGetMinY(trailingCandidateRect),lastHeight); + retPoint.x = CGRectGetMaxX(leadingCandidateRect); break; } - lastHeight = CGRectGetMaxY(leftCandidateRect); + lastHeight = CGRectGetMaxY(leadingCandidateRect); } if (retPoint.y == CGFLOAT_MAX) { - if ((hasWeight ? CGRectGetMinX(rightCandidateRect) - width > leftBoundary : CGRectGetMinX(rightCandidateRect) - width >= leftBoundary) && - CGRectGetMaxY(rightCandidateRect) > lastHeight) + if ((hasWeight ? CGRectGetMinX(trailingCandidateRect) - width > leadingBoundary : + _myCGFloatGreatOrEqual(CGRectGetMinX(trailingCandidateRect) - width, leadingBoundary)) && + CGRectGetMaxY(trailingCandidateRect) > lastHeight) { - retPoint.y = MAX(CGRectGetMinY(rightCandidateRect),lastHeight); + retPoint.y = MAX(CGRectGetMinY(trailingCandidateRect),lastHeight); } } return retPoint; } --(CGPoint)findTopCandidatePoint:(CGRect)bottomCandidateRect height:(CGFloat)height topBoundary:(CGFloat)topBoundary topCandidateRects:(NSArray*)topCandidateRects hasWeight:(BOOL)hasWeight +-(CGPoint)myFindTopCandidatePoint:(CGRect)bottomCandidateRect height:(CGFloat)height topBoundary:(CGFloat)topBoundary topCandidateRects:(NSArray*)topCandidateRects hasWeight:(BOOL)hasWeight paddingLeading:(CGFloat)paddingLeading { CGPoint retPoint = {CGFLOAT_MAX, topBoundary}; - CGFloat lastWidth = self.leftPadding; + CGFloat lastWidth = paddingLeading; for (NSInteger i = topCandidateRects.count - 1; i >= 0; i--) { CGRect topCandidateRect = ((NSValue*)topCandidateRects[i]).CGRectValue; - if ((hasWeight ? CGRectGetMinY(bottomCandidateRect) - height > CGRectGetMaxY(topCandidateRect) : CGRectGetMinY(bottomCandidateRect) - height >= CGRectGetMaxY(topCandidateRect)) && + + if ((hasWeight ? CGRectGetMinY(bottomCandidateRect) - height > CGRectGetMaxY(topCandidateRect) : + _myCGFloatGreatOrEqual(CGRectGetMinY(bottomCandidateRect) - height, CGRectGetMaxY(topCandidateRect))) && CGRectGetMaxX(bottomCandidateRect) > lastWidth) { retPoint.x = MAX(CGRectGetMinX(bottomCandidateRect),lastWidth); @@ -316,7 +365,8 @@ -(CGPoint)findTopCandidatePoint:(CGRect)bottomCandidateRect height:(CGFloat)hei if (retPoint.x == CGFLOAT_MAX) { - if ((hasWeight ? CGRectGetMinY(bottomCandidateRect) - height > topBoundary : CGRectGetMinY(bottomCandidateRect) - height >= topBoundary) && + if ((hasWeight ? CGRectGetMinY(bottomCandidateRect) - height > topBoundary : + _myCGFloatGreatOrEqual(CGRectGetMinY(bottomCandidateRect) - height, topBoundary)) && CGRectGetMaxX(bottomCandidateRect) > lastWidth) { retPoint.x = MAX(CGRectGetMinX(bottomCandidateRect),lastWidth); @@ -328,163 +378,212 @@ -(CGPoint)findTopCandidatePoint:(CGRect)bottomCandidateRect height:(CGFloat)hei --(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs +-(CGSize)myLayoutSubviewsForVert:(CGSize)selfSize sbs:(NSArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFloatLayout*)lsc { - UIEdgeInsets padding = self.padding; + //对于垂直浮动布局来说,默认是左浮动,当设置为RTL时则默认是右浮动,因此我们只需要改变一下sbv.reverseFloat的定义就好了。 + + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + + BOOL hasBoundaryLimit = YES; + if (lsc.wrapContentWidth && lsc.noBoundaryLimit) + hasBoundaryLimit = NO; + + //如果没有边界限制我们将高度设置为最大。。 + if (!hasBoundaryLimit) + selfSize.width = CGFLOAT_MAX; //遍历所有的子视图,查看是否有子视图的宽度会比视图自身要宽,如果有且有包裹属性则扩充自身的宽度 - if (self.wrapContentWidth) + if (lsc.wrapContentWidth && hasBoundaryLimit) { - CGFloat maxContentWidth = selfRect.size.width - padding.left - padding.right; + CGFloat maxContentWidth = selfSize.width - paddingHorz; for (UIView *sbv in sbs) { - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; //因为这里是计算包裹宽度属性,所以只会计算那些设置了固定宽度的子视图 //这里有可能设置了固定的宽度 - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; //有可能宽度是和他的高度相等。 - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) { - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.heightDime.dimeRelaVal == self.heightDime) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:(selfSize.height - paddingVert) ]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - rect.size.width = rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height]; } - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - if (leftMargin + rect.size.width + rightMargin > maxContentWidth && - sbv.widthDime.dimeRelaVal != self.widthDime && - sbv.weight == 0) + if (leadingSpace + rect.size.width + trailingSpace > maxContentWidth && + (sbvsc.widthSizeInner.dimeRelaVal == nil || sbvsc.widthSizeInner.dimeRelaVal != lsc.widthSizeInner) && + sbvsc.weight == 0) { - maxContentWidth = leftMargin + rect.size.width + rightMargin; + maxContentWidth = leadingSpace + rect.size.width + trailingSpace; } } - selfRect.size.width = padding.left + maxContentWidth + padding.right; + selfSize.width = paddingHorz + maxContentWidth; } //支持浮动水平间距。 - CGFloat vertMargin = self.subviewVertMargin; - CGFloat horzMargin = self.subviewHorzMargin; - CGFloat subviewSize = ((MyLayoutSizeClassFloatLayout*)self.myCurrentSizeClass).subviewSize; + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat horzSpace = lsc.subviewHSpace; + CGFloat subviewSize = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).subviewSize; if (subviewSize != 0) { - CGFloat minMargin = ((MyLayoutSizeClassFloatLayout*)self.myCurrentSizeClass).minMargin; - NSInteger rowCount = floor((selfRect.size.width - padding.left - padding.right + minMargin) / (subviewSize + minMargin)); +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时,不能设置最小垂直间距。 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, vertical float layout:%@ can not set noBoundaryLimit to YES when call setSubviewsSize:minSpace:maxSpace method",self); +#endif + + + CGFloat minSpace = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).minSpace; + CGFloat maxSpace = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).maxSpace; + + NSInteger rowCount = floor((selfSize.width - paddingHorz + minSpace) / (subviewSize + minSpace)); if (rowCount > 1) { - horzMargin = (selfRect.size.width - padding.left - padding.right - subviewSize * rowCount)/(rowCount - 1); + horzSpace = (selfSize.width - paddingHorz - subviewSize * rowCount)/(rowCount - 1); + + //如果超过最大间距则调整子视图的宽度。 + if (horzSpace > maxSpace) + { + horzSpace = maxSpace; + + subviewSize = (selfSize.width - paddingHorz - horzSpace * (rowCount - 1)) / rowCount; + + } + } } - + //左边候选区域数组,保存的是CGRect值。 - NSMutableArray *leftCandidateRects = [NSMutableArray new]; + NSMutableArray *leadingCandidateRects = [NSMutableArray new]; //为了计算方便总是把最左边的个虚拟区域作为一个候选区域 - [leftCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(padding.left, padding.top, 0, CGFLOAT_MAX)]]; + [leadingCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(paddingLeading, paddingTop, 0, CGFLOAT_MAX)]]; //右边候选区域数组,保存的是CGRect值。 - NSMutableArray *rightCandidateRects = [NSMutableArray new]; + NSMutableArray *trailingCandidateRects = [NSMutableArray new]; //为了计算方便总是把最右边的个虚拟区域作为一个候选区域 - [rightCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(selfRect.size.width - padding.right, padding.top, 0, CGFLOAT_MAX)]]; + [trailingCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(selfSize.width - paddingTrailing, paddingTop, 0, CGFLOAT_MAX)]]; //分别记录左边和右边的最后一个视图在Y轴的偏移量 - CGFloat leftLastYOffset = padding.top; - CGFloat rightLastYOffset = padding.top; + CGFloat leadingLastYOffset = paddingTop; + CGFloat trailingLastYOffset = paddingTop; //分别记录左右边和全局浮动视图的最高占用的Y轴的值 - CGFloat leftMaxHeight = padding.top; - CGFloat rightMaxHeight = padding.top; - CGFloat maxHeight = padding.top; + CGFloat leadingMaxHeight = paddingTop; + CGFloat trailingMaxHeight = paddingTop; + CGFloat maxHeight = paddingTop; + CGFloat maxWidth = paddingLeading; for (UIView *sbv in sbs) { - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; + - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (subviewSize != 0) + rect.size.width = subviewSize; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner && !lsc.wrapContentHeight) + rect.size.height = [sbvsc.heightSizeInner measureWith:(selfSize.height - paddingVert) ]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:(selfSize.width - paddingHorz) ]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.widthDime.dimeRelaVal != nil && sbv.widthDime.dimeRelaVal.view != nil && sbv.widthDime.dimeRelaVal.view != self && sbv.widthDime.dimeRelaVal.view != sbv) + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height ]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal.view != nil && sbvsc.widthSizeInner.dimeRelaVal.view != self && sbvsc.widthSizeInner.dimeRelaVal.view != sbv) { - rect.size.width = sbv.widthDime.dimeRelaVal.view.absPos.width * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.width = [sbvsc.widthSizeInner measureWith:sbvsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width]; } - if (sbv.heightDime.dimeRelaVal != nil && sbv.heightDime.dimeRelaVal.view != nil && sbv.heightDime.dimeRelaVal.view != self && sbv.heightDime.dimeRelaVal.view != sbv) + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal.view != nil && sbvsc.heightSizeInner.dimeRelaVal.view != self && sbvsc.heightSizeInner.dimeRelaVal.view != sbv) { - rect.size.height = sbv.heightDime.dimeRelaVal.view.absPos.height * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.height = [sbvsc.heightSizeInner measureWith:sbvsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height]; } - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; //如果高度是浮动的则需要调整高度。 - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; - - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.reverseFloat) + //如果是RTL的场景则默认是右对齐的。 + if (sbvsc.isReverseFloat) { - CGPoint nextPoint = {selfRect.size.width - padding.right, leftLastYOffset}; - CGFloat leftCandidateXBoundary = padding.left; - if (sbv.clearFloat) +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时子视图不能设置逆向浮动 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, vertical float layout:%@ can not set noBoundaryLimit to YES when the subview:%@ set reverseFloat to YES.",self, sbv); +#endif + + CGPoint nextPoint = {selfSize.width - paddingTrailing, leadingLastYOffset}; + CGFloat leadingCandidateXBoundary = paddingLeading; + if (sbvsc.clearFloat) { //找到最底部的位置。 - nextPoint.y = MAX(rightMaxHeight, leftLastYOffset); - CGPoint leftPoint = [self findLeftCandidatePoint:CGRectMake(selfRect.size.width - padding.right, nextPoint.y, 0, CGFLOAT_MAX) width:leftMargin + (sbv.weight != 0 ? 0 : rect.size.width) + rightMargin leftBoundary:padding.left leftCandidateRects:leftCandidateRects hasWeight:NO]; - if (leftPoint.y != CGFLOAT_MAX) + nextPoint.y = MAX(trailingMaxHeight, leadingLastYOffset); + CGPoint leadingPoint = [self myFindLeadingCandidatePoint:CGRectMake(selfSize.width - paddingTrailing, nextPoint.y, 0, CGFLOAT_MAX) width:leadingSpace + (sbvsc.weight != 0 ? 0 : rect.size.width) + trailingSpace leadingBoundary:paddingLeading leadingCandidateRects:leadingCandidateRects hasWeight:NO paddingTop:paddingTop]; + if (leadingPoint.y != CGFLOAT_MAX) { - nextPoint.y = MAX(rightMaxHeight, leftPoint.y); - leftCandidateXBoundary = leftPoint.x; + nextPoint.y = MAX(trailingMaxHeight, leadingPoint.y); + leadingCandidateXBoundary = leadingPoint.x; } } else { //依次从后往前,每个都比较右边的。 - for (NSInteger i = rightCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = trailingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)rightCandidateRects[i]).CGRectValue; - CGPoint leftPoint = [self findLeftCandidatePoint:candidateRect width:leftMargin + (sbv.weight != 0 ? 0 : rect.size.width) + rightMargin leftBoundary:padding.left leftCandidateRects:leftCandidateRects hasWeight:sbv.weight != 0 ]; - if (leftPoint.y != CGFLOAT_MAX) + CGRect candidateRect = ((NSValue*)trailingCandidateRects[i]).CGRectValue; + CGPoint leadingPoint = [self myFindLeadingCandidatePoint:candidateRect width:leadingSpace + (sbvsc.weight != 0 ? 0 : rect.size.width) + trailingSpace leadingBoundary:paddingLeading leadingCandidateRects:leadingCandidateRects hasWeight:sbvsc.weight != 0 paddingTop:paddingTop]; + if (leadingPoint.y != CGFLOAT_MAX) { - nextPoint = CGPointMake(CGRectGetMinX(candidateRect), MAX(nextPoint.y, leftPoint.y)); - leftCandidateXBoundary = leftPoint.x; + nextPoint = CGPointMake(CGRectGetMinX(candidateRect), MAX(nextPoint.y, leadingPoint.y)); + leadingCandidateXBoundary = leadingPoint.x; break; } @@ -493,50 +592,57 @@ -(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs } //重新设置宽度 - if (sbv.weight != 0) + if (sbvsc.weight != 0) { - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:(nextPoint.x - leftCandidateXBoundary - leftMargin - rightMargin) * sbv.weight sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:(nextPoint.x - leadingCandidateXBoundary + sbvsc.widthSizeInner.addVal) * sbvsc.weight - leadingSpace - trailingSpace sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; } - rect.origin.x = nextPoint.x - rightMargin - rect.size.width; - rect.origin.y = MIN(nextPoint.y, maxHeight) + topMargin; + rect.origin.x = nextPoint.x - trailingSpace - rect.size.width; + rect.origin.y = MIN(nextPoint.y, maxHeight) + topSpace; //如果有智能边界线则找出所有智能边界线。 - if (self.IntelligentBorderLine != nil) + if (!isEstimate && self.intelligentBorderline != nil) { //优先绘制左边和上边的。绘制左边的和上边的。 if ([sbv isKindOfClass:[MyBaseLayout class]]) { MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) + if (!sbvl.notUseIntelligentBorderline) { - sbvl.bottomBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.leftBorderLine = nil; + sbvl.bottomBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.leadingBorderline = nil; - //如果自己的上边和左边有子视图。 - if (rect.origin.x + rect.size.width + rightMargin < selfRect.size.width - padding.right) + + if (rect.origin.x + rect.size.width + trailingSpace < selfSize.width - paddingTrailing) + { + + sbvl.trailingBorderline = self.intelligentBorderline; + } + + if (rect.origin.y + rect.size.height + bottomSpace < selfSize.height - paddingBottom) { - sbvl.rightBorderLine = self.IntelligentBorderLine; + sbvl.bottomBorderline = self.intelligentBorderline; } - if (rect.origin.y - topMargin > padding.top) + if (rect.origin.x > leadingCandidateXBoundary && sbvl == sbs.lastObject) { - sbvl.topBorderLine = self.IntelligentBorderLine; + sbvl.leadingBorderline = self.intelligentBorderline; } + } } @@ -544,62 +650,80 @@ -(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs //这里有可能子视图本身的宽度会超过布局视图本身,但是我们的候选区域则不存储超过的宽度部分。 - CGRect cRect = CGRectMake(MAX((rect.origin.x - leftMargin - horzMargin),padding.left), rect.origin.y - topMargin, MIN((rect.size.width + leftMargin + rightMargin),(selfRect.size.width - padding.left - padding.right)), rect.size.height + topMargin + bottomMargin + vertMargin); - + CGRect cRect = CGRectMake(MAX((rect.origin.x - leadingSpace - horzSpace),paddingLeading), rect.origin.y - topSpace, MIN((rect.size.width + leadingSpace + trailingSpace),(selfSize.width - paddingHorz)), rect.size.height + topSpace + bottomSpace + vertSpace); //把新的候选区域添加到数组中去。并删除高度小于新候选区域的其他区域 - for (NSInteger i = rightCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = trailingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)rightCandidateRects[i]).CGRectValue; + CGRect candidateRect = ((NSValue*)trailingCandidateRects[i]).CGRectValue; if (CGRectGetMaxY(candidateRect) <= CGRectGetMaxY(cRect)) - [rightCandidateRects removeObjectAtIndex:i]; + { + [trailingCandidateRects removeObjectAtIndex:i]; + } } //删除左边高度小于新添加区域的顶部的候选区域 - for (NSInteger i = leftCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = leadingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)leftCandidateRects[i]).CGRectValue; - if (CGRectGetMaxY(candidateRect) <= CGRectGetMinY(cRect)) - [leftCandidateRects removeObjectAtIndex:i]; - } + CGRect candidateRect = ((NSValue*)leadingCandidateRects[i]).CGRectValue; + + CGFloat candidateMaxY = CGRectGetMaxY(candidateRect); + CGFloat candidateMaxX = CGRectGetMaxX(candidateRect); + CGFloat cMinx = CGRectGetMinX(cRect); + + if (_myCGFloatLessOrEqual(candidateMaxY, CGRectGetMinY(cRect))) + { + [leadingCandidateRects removeObjectAtIndex:i]; + } + else if (_myCGFloatEqual(candidateMaxY, CGRectGetMaxY(cRect)) && _myCGFloatLessOrEqual(cMinx,candidateMaxX)) + { + [leadingCandidateRects removeObjectAtIndex:i]; + cRect = CGRectUnion(cRect, candidateRect); + cRect.size.width += candidateMaxX - cMinx; + + } + + } + - [rightCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; - rightLastYOffset = rect.origin.y - topMargin; + [trailingCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; + trailingLastYOffset = rect.origin.y - topSpace; - if (rect.origin.y + rect.size.height + bottomMargin + vertMargin > rightMaxHeight) - rightMaxHeight = rect.origin.y + rect.size.height + bottomMargin + vertMargin; + if (rect.origin.y + rect.size.height + bottomSpace + vertSpace > trailingMaxHeight) + trailingMaxHeight = rect.origin.y + rect.size.height + bottomSpace + vertSpace; } else { - CGPoint nextPoint = {padding.left, rightLastYOffset}; - CGFloat rightCandidateXBoundary = selfRect.size.width - padding.right; - + CGPoint nextPoint = {paddingLeading, trailingLastYOffset}; + CGFloat trailingCandidateXBoundary = selfSize.width - paddingTrailing; + //如果是清除了浮动则直换行移动到最下面。 - if (sbv.clearFloat) + if (sbvsc.clearFloat) { //找到最低点。 - nextPoint.y = MAX(leftMaxHeight, rightLastYOffset); + nextPoint.y = MAX(leadingMaxHeight, trailingLastYOffset); - CGPoint rightPoint = [self findRightCandidatePoint:CGRectMake(padding.left, nextPoint.y, 0, CGFLOAT_MAX) width:leftMargin + (sbv.weight != 0 ? 0 : rect.size.width) + rightMargin rightBoundary:selfRect.size.width - padding.right rightCandidateRects:rightCandidateRects hasWeight:NO ]; - if (rightPoint.y != CGFLOAT_MAX) + CGPoint trailingPoint = [self myFindTrailingCandidatePoint:CGRectMake(paddingLeading, nextPoint.y, 0, CGFLOAT_MAX) width:leadingSpace + (sbvsc.weight != 0 ? 0 : rect.size.width) + trailingSpace trailingBoundary:trailingCandidateXBoundary trailingCandidateRects:trailingCandidateRects hasWeight:NO paddingTop:paddingTop]; + if (trailingPoint.y != CGFLOAT_MAX) { - nextPoint.y = MAX(leftMaxHeight, rightPoint.y); - rightCandidateXBoundary = rightPoint.x; + nextPoint.y = MAX(leadingMaxHeight, trailingPoint.y); + trailingCandidateXBoundary = trailingPoint.x; } } else { //依次从后往前,每个都比较右边的。 - for (NSInteger i = leftCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = leadingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)leftCandidateRects[i]).CGRectValue; - CGPoint rightPoint = [self findRightCandidatePoint:candidateRect width:leftMargin + (sbv.weight != 0 ? 0 : rect.size.width) + rightMargin rightBoundary:selfRect.size.width - padding.right rightCandidateRects:rightCandidateRects hasWeight:sbv.weight != 0 ]; - if (rightPoint.y != CGFLOAT_MAX) + CGRect candidateRect = ((NSValue*)leadingCandidateRects[i]).CGRectValue; + + CGPoint trailingPoint = [self myFindTrailingCandidatePoint:candidateRect width:leadingSpace + (sbvsc.weight != 0 ? 0 : rect.size.width) + trailingSpace trailingBoundary:selfSize.width - paddingTrailing trailingCandidateRects:trailingCandidateRects hasWeight:sbvsc.weight != 0 paddingTop:paddingTop]; + if (trailingPoint.y != CGFLOAT_MAX) { - nextPoint = CGPointMake(CGRectGetMaxX(candidateRect), MAX(nextPoint.y, rightPoint.y)); - rightCandidateXBoundary = rightPoint.x; + nextPoint = CGPointMake(CGRectGetMaxX(candidateRect), MAX(nextPoint.y, trailingPoint.y)); + trailingCandidateXBoundary = trailingPoint.x; break; } @@ -608,105 +732,136 @@ -(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs } //重新设置宽度 - if (sbv.weight != 0) + if (sbvsc.weight != 0) { - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:(rightCandidateXBoundary - nextPoint.x - leftMargin - rightMargin) * sbv.weight sbvSize:rect.size selfLayoutSize:selfRect.size]; +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时子视图不能设置weight大于0 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, vertical float layout:%@ can not set noBoundaryLimit to YES when the subview:%@ set weight big than zero.",self, sbv); +#endif + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:(trailingCandidateXBoundary - nextPoint.x + sbvsc.widthSizeInner.addVal) * sbvsc.weight - leadingSpace - trailingSpace sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; } - rect.origin.x = nextPoint.x + leftMargin; - rect.origin.y = MIN(nextPoint.y,maxHeight) + topMargin; - - if (self.IntelligentBorderLine != nil) + rect.origin.x = nextPoint.x + leadingSpace; + rect.origin.y = MIN(nextPoint.y,maxHeight) + topSpace; + + if (!isEstimate && self.intelligentBorderline != nil) { //优先绘制左边和上边的。绘制左边的和上边的。 if ([sbv isKindOfClass:[MyBaseLayout class]]) { MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) + if (!sbvl.notUseIntelligentBorderline) { - sbvl.bottomBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.leftBorderLine = nil; + sbvl.bottomBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.leadingBorderline = nil; - //如果自己的上边和左边有子视图。 - if (rect.origin.x - leftMargin > padding.left) + if (rect.origin.x + rect.size.width + trailingSpace < selfSize.width - paddingTrailing) { - sbvl.leftBorderLine = self.IntelligentBorderLine; + + sbvl.trailingBorderline = self.intelligentBorderline; } - if (rect.origin.y - topMargin > padding.top) + if (rect.origin.y + rect.size.height + bottomSpace < selfSize.height - paddingBottom) { - sbvl.topBorderLine = self.IntelligentBorderLine; + sbvl.bottomBorderline = self.intelligentBorderline; } + + } } } - - CGRect cRect = CGRectMake(rect.origin.x - leftMargin, rect.origin.y - topMargin, MIN((rect.size.width + leftMargin + rightMargin + horzMargin),(selfRect.size.width - padding.left - padding.right)), rect.size.height + topMargin + bottomMargin + vertMargin); + + CGRect cRect = CGRectMake(rect.origin.x - leadingSpace, rect.origin.y - topSpace, MIN((rect.size.width + leadingSpace + trailingSpace + horzSpace),(selfSize.width - paddingHorz)), rect.size.height + topSpace + bottomSpace + vertSpace); //把新添加到候选中去。并删除高度小于的候选键。和高度 - for (NSInteger i = leftCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = leadingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)leftCandidateRects[i]).CGRectValue; - if (CGRectGetMaxY(candidateRect) <= CGRectGetMaxY(cRect)) - [leftCandidateRects removeObjectAtIndex:i]; + CGRect candidateRect = ((NSValue*)leadingCandidateRects[i]).CGRectValue; + + if (_myCGFloatLessOrEqual(CGRectGetMaxY(candidateRect), CGRectGetMaxY(cRect))) + { + [leadingCandidateRects removeObjectAtIndex:i]; + } } //删除右边高度小于新添加区域的顶部的候选区域 - for (NSInteger i = rightCandidateRects.count - 1; i >= 0; i--) + for (NSInteger i = trailingCandidateRects.count - 1; i >= 0; i--) { - CGRect candidateRect = ((NSValue*)rightCandidateRects[i]).CGRectValue; - if (CGRectGetMaxY(candidateRect) <= CGRectGetMinY(cRect)) - [rightCandidateRects removeObjectAtIndex:i]; + CGRect candidateRect = ((NSValue*)trailingCandidateRects[i]).CGRectValue; + CGFloat candidateMaxY = CGRectGetMaxY(candidateRect); + CGFloat candidateMinX = CGRectGetMinX(candidateRect); + CGFloat cMaxX = CGRectGetMaxX(cRect); + if (_myCGFloatLessOrEqual(candidateMaxY, CGRectGetMinY(cRect))) + { + [trailingCandidateRects removeObjectAtIndex:i]; + } + else if ( _myCGFloatEqual(candidateMaxY, CGRectGetMaxY(cRect)) && _myCGFloatLessOrEqual(candidateMinX, cMaxX)) + {//当右边的高度和cRect的高度相等,又有重合时表明二者可以合并为一个区域。 + [trailingCandidateRects removeObjectAtIndex:i]; + cRect = CGRectUnion(cRect, candidateRect); + cRect.size.width += cMaxX - candidateMinX; //要加上重叠部分来增加宽度,否则会出现宽度不正确的问题。 + } } - [leftCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; - leftLastYOffset = rect.origin.y - topMargin; + [leadingCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; + leadingLastYOffset = rect.origin.y - topSpace; - if (rect.origin.y + rect.size.height + bottomMargin + vertMargin > leftMaxHeight) - leftMaxHeight = rect.origin.y + rect.size.height + bottomMargin + vertMargin; + if (rect.origin.y + rect.size.height + bottomSpace + vertSpace > leadingMaxHeight) + leadingMaxHeight = rect.origin.y + rect.size.height + bottomSpace + vertSpace; } - if (rect.origin.y + rect.size.height + bottomMargin + vertMargin > maxHeight) - maxHeight = rect.origin.y + rect.size.height + bottomMargin + vertMargin; + if (rect.origin.y + rect.size.height + bottomSpace + vertSpace > maxHeight) + maxHeight = rect.origin.y + rect.size.height + bottomSpace + vertSpace; - sbv.absPos.frame = rect; + if (rect.origin.x + rect.size.width + trailingSpace + horzSpace > maxWidth) + maxWidth = rect.origin.x + rect.size.width + trailingSpace + horzSpace; + + sbvmyFrame.frame = rect; } if (sbs.count > 0) - maxHeight -= vertMargin; + { + maxHeight -= vertSpace; + maxWidth -= horzSpace; + } + + maxHeight += paddingBottom; + maxWidth += paddingTrailing; - maxHeight += padding.bottom; + if (!hasBoundaryLimit) + selfSize.width = maxWidth; - if (self.wrapContentHeight) - selfRect.size.height = maxHeight; + if (lsc.wrapContentHeight) + selfSize.height = maxHeight; else { CGFloat addYPos = 0; - MyMarginGravity mgvert = self.gravity & MyMarginGravity_Horz_Mask; - if (mgvert == MyMarginGravity_Vert_Center) + MyGravity mgvert = lsc.gravity & MyGravity_Horz_Mask; + if (mgvert == MyGravity_Vert_Center) { - addYPos = (selfRect.size.height - maxHeight) / 2; + addYPos = (selfSize.height - maxHeight) / 2; } - else if (mgvert == MyMarginGravity_Vert_Bottom) + else if (mgvert == MyGravity_Vert_Bottom) { - addYPos = selfRect.size.height - maxHeight; + addYPos = selfSize.height - maxHeight; } if (addYPos != 0) @@ -715,163 +870,208 @@ -(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs { UIView *sbv = sbs[i]; - sbv.absPos.topPos += addYPos; + sbv.myFrame.top += addYPos; } } } - - return selfRect; + + return selfSize; } --(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs +-(CGSize)myLayoutSubviewsForHorz:(CGSize)selfSize sbs:(NSArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFloatLayout*)lsc { - UIEdgeInsets padding = self.padding; + //对于水平浮动布局来说,最终是从左到右排列,而对于RTL则是从右到左排列,因此这里先抽象定义头尾的概念,然后最后再计算时统一将抽象位置转化为CGRect的左边值。 + + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + + BOOL hasBoundaryLimit = YES; + if (lsc.wrapContentHeight && lsc.noBoundaryLimit) + hasBoundaryLimit = NO; + + //如果没有边界限制我们将高度设置为最大。。 + if (!hasBoundaryLimit) + selfSize.height = CGFLOAT_MAX; //遍历所有的子视图,查看是否有子视图的宽度会比视图自身要宽,如果有且有包裹属性则扩充自身的宽度 - if (self.wrapContentHeight) + if (lsc.wrapContentHeight && hasBoundaryLimit) { - CGFloat maxContentHeight = selfRect.size.height - padding.top - padding.bottom; + CGFloat maxContentHeight = selfSize.height - paddingVert; for (UIView *sbv in sbs) { - CGFloat topMargin = sbv.topPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGRect rect = sbvmyFrame.frame; //这里有可能设置了固定的高度 - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; //有可能高度是和他的宽度相等。 - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) { - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:(selfSize.width - paddingHorz) ]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; } - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - if (topMargin + rect.size.height + bottomMargin > maxContentHeight && - sbv.heightDime.dimeRelaVal != self.heightDime && - sbv.weight == 0) + if (topSpace + rect.size.height + bottomSpace > maxContentHeight && + (sbvsc.heightSizeInner.dimeRelaVal == nil || sbvsc.heightSizeInner.dimeRelaVal != lsc.heightSizeInner) && + sbvsc.weight == 0) { - maxContentHeight = topMargin + rect.size.height + bottomMargin; + maxContentHeight = topSpace + rect.size.height + bottomSpace; } } - selfRect.size.height = padding.top + maxContentHeight + padding.bottom; + selfSize.height = paddingVert + maxContentHeight; } //支持浮动垂直间距。 - CGFloat horzMargin = self.subviewHorzMargin; - CGFloat vertMargin = self.subviewVertMargin; - CGFloat subviewSize = ((MyLayoutSizeClassFloatLayout*)self.myCurrentSizeClass).subviewSize; + CGFloat horzSpace = lsc.subviewHSpace; + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat subviewSize = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).subviewSize; if (subviewSize != 0) { - CGFloat minMargin = ((MyLayoutSizeClassFloatLayout*)self.myCurrentSizeClass).minMargin; - - NSInteger rowCount = floor((selfRect.size.height - padding.top - padding.bottom + minMargin) / (subviewSize + minMargin)); +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时,不能设置最小垂直间距。 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, horizontal float layout:%@ can not set noBoundaryLimit to YES when call setSubviewsSize:minSpace:maxSpace method",self); +#endif + + CGFloat minSpace = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).minSpace; + CGFloat maxSpace = ((MyFloatLayoutViewSizeClass*)self.myCurrentSizeClass).maxSpace; + + NSInteger rowCount = floor((selfSize.height - paddingVert + minSpace) / (subviewSize + minSpace)); if (rowCount > 1) { - vertMargin = (selfRect.size.height - padding.top - padding.bottom - subviewSize * rowCount)/(rowCount - 1); + vertSpace = (selfSize.height - paddingVert - subviewSize * rowCount)/(rowCount - 1); + + if (vertSpace > maxSpace) + { + vertSpace = maxSpace; + + subviewSize = (selfSize.height - paddingVert - vertSpace * (rowCount - 1)) / rowCount; + + } + } } - + //上边候选区域数组,保存的是CGRect值。 NSMutableArray *topCandidateRects = [NSMutableArray new]; //为了计算方便总是把最上边的个虚拟区域作为一个候选区域 - [topCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(padding.left, padding.top,CGFLOAT_MAX,0)]]; + [topCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(paddingLeading, paddingTop,CGFLOAT_MAX,0)]]; //右边候选区域数组,保存的是CGRect值。 NSMutableArray *bottomCandidateRects = [NSMutableArray new]; - //为了计算方便总是把最下边的个虚拟区域作为一个候选区域 - [bottomCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(padding.left, selfRect.size.height - padding.bottom,CGFLOAT_MAX, 0)]]; + //为了计算方便总是把最下边的个虚拟区域作为一个候选区域,如果没有边界限制则 + [bottomCandidateRects addObject:[NSValue valueWithCGRect:CGRectMake(paddingLeading, selfSize.height - paddingBottom, CGFLOAT_MAX, 0)]]; //分别记录上边和下边的最后一个视图在X轴的偏移量 - CGFloat topLastXOffset = padding.left; - CGFloat bottomLastXOffset = padding.left; + CGFloat topLastXOffset = paddingLeading; + CGFloat bottomLastXOffset = paddingLeading; //分别记录上下边和全局浮动视图的最宽占用的X轴的值 - CGFloat topMaxWidth = padding.left; - CGFloat bottomMaxWidth = padding.left; - CGFloat maxWidth = padding.left; + CGFloat topMaxWidth = paddingLeading; + CGFloat bottomMaxWidth = paddingLeading; + CGFloat maxWidth = paddingLeading; + CGFloat maxHeight = paddingTop; for (UIView *sbv in sbs) { - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (subviewSize != 0) + rect.size.height = subviewSize; - if (sbv.heightDime.dimeRelaVal == self.heightDime) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:(selfSize.height - paddingVert) ]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner && !lsc.wrapContentWidth) + rect.size.width = [sbvsc.widthSizeInner measureWith:(selfSize.width - paddingHorz) ]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.widthDime.dimeRelaVal != nil && sbv.widthDime.dimeRelaVal.view != nil && sbv.widthDime.dimeRelaVal.view != self && sbv.widthDime.dimeRelaVal.view != sbv) + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal.view != nil && sbvsc.widthSizeInner.dimeRelaVal.view != self && sbvsc.widthSizeInner.dimeRelaVal.view != sbv) { - rect.size.width = sbv.widthDime.dimeRelaVal.view.absPos.width * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.width = [sbvsc.widthSizeInner measureWith:sbvsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width]; } - if (sbv.heightDime.dimeRelaVal != nil && sbv.heightDime.dimeRelaVal.view != nil && sbv.heightDime.dimeRelaVal.view != self && sbv.heightDime.dimeRelaVal.view != sbv) + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal.view != nil && sbvsc.heightSizeInner.dimeRelaVal.view != self && sbvsc.heightSizeInner.dimeRelaVal.view != sbv) { - rect.size.height = sbv.heightDime.dimeRelaVal.view.absPos.height * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.height = [sbvsc.heightSizeInner measureWith:sbvsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height]; } - - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; //如果高度是浮动的则需要调整高度。 - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.reverseFloat) + if (sbvsc.reverseFloat) { - CGPoint nextPoint = {topLastXOffset, selfRect.size.height - padding.bottom}; - CGFloat topCandidateYBoundary = padding.top; - if (sbv.clearFloat) +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时子视图不能设置逆向浮动 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, horizontal float layout:%@ can not set noBoundaryLimit to YES when the subview:%@ set reverseFloat to YES.",self, sbv); +#endif + + CGPoint nextPoint = {topLastXOffset, selfSize.height - paddingBottom}; + CGFloat topCandidateYBoundary = paddingTop; + if (sbvsc.clearFloat) { //找到最底部的位置。 nextPoint.x = MAX(bottomMaxWidth, topLastXOffset); - CGPoint topPoint = [self findTopCandidatePoint:CGRectMake(nextPoint.x, selfRect.size.height - padding.bottom, CGFLOAT_MAX, 0) height:topMargin + (sbv.weight != 0 ? 0 : rect.size.height) + bottomMargin topBoundary:padding.top topCandidateRects:topCandidateRects hasWeight:NO ]; + CGPoint topPoint = [self myFindTopCandidatePoint:CGRectMake(nextPoint.x, selfSize.height - paddingBottom, CGFLOAT_MAX, 0) height:topSpace + (sbvsc.weight != 0 ? 0 : rect.size.height) + bottomSpace topBoundary:topCandidateYBoundary topCandidateRects:topCandidateRects hasWeight:NO paddingLeading:paddingLeading]; if (topPoint.x != CGFLOAT_MAX) { nextPoint.x = MAX(bottomMaxWidth, topPoint.x); @@ -884,7 +1084,8 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs for (NSInteger i = bottomCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)bottomCandidateRects[i]).CGRectValue; - CGPoint topPoint = [self findTopCandidatePoint:candidateRect height:topMargin + (sbv.weight != 0 ? 0 : rect.size.height) + bottomMargin topBoundary:padding.top topCandidateRects:topCandidateRects hasWeight:sbv.weight != 0 ]; + + CGPoint topPoint = [self myFindTopCandidatePoint:candidateRect height:topSpace + (sbvsc.weight != 0 ? 0 : rect.size.height) + bottomSpace topBoundary:paddingTop topCandidateRects:topCandidateRects hasWeight:sbvsc.weight != 0 paddingLeading:paddingLeading]; if (topPoint.x != CGFLOAT_MAX) { nextPoint = CGPointMake(MAX(nextPoint.x, topPoint.x),CGRectGetMinY(candidateRect)); @@ -896,86 +1097,108 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs } } - if (sbv.weight != 0) + if (sbvsc.weight != 0) { - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:(nextPoint.y - topCandidateYBoundary - topMargin - bottomMargin) * sbv.weight sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:(nextPoint.y - topCandidateYBoundary + sbvsc.heightSizeInner.addVal) * sbvsc.weight - topSpace - bottomSpace sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:[sbvsc.widthSizeInner measureWith: rect.size.height] sbvSize:rect.size selfLayoutSize:selfSize]; } - rect.origin.y = nextPoint.y - bottomMargin - rect.size.height; - rect.origin.x = MIN(nextPoint.x, maxWidth) + leftMargin; + rect.origin.y = nextPoint.y - bottomSpace - rect.size.height; + rect.origin.x = MIN(nextPoint.x, maxWidth) + leadingSpace; //如果有智能边界线则找出所有智能边界线。 - if (self.IntelligentBorderLine != nil) + if (!isEstimate && self.intelligentBorderline != nil) { //优先绘制左边和上边的。绘制左边的和上边的。 if ([sbv isKindOfClass:[MyBaseLayout class]]) { MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) + if (!sbvl.notUseIntelligentBorderline) { - sbvl.bottomBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.leftBorderLine = nil; + sbvl.bottomBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.leadingBorderline = nil; //如果自己的上边和左边有子视图。 - if (rect.origin.x - leftMargin > padding.left) + if (rect.origin.x + rect.size.width + trailingSpace < selfSize.width - paddingTrailing) + { + sbvl.trailingBorderline = self.intelligentBorderline; + } + + if (rect.origin.y + rect.size.height + bottomSpace < selfSize.height - paddingBottom) { - sbvl.leftBorderLine = self.IntelligentBorderLine; + sbvl.bottomBorderline = self.intelligentBorderline; } - if (rect.origin.y + rect.size.height + bottomMargin < selfRect.size.height - padding.bottom) + if (rect.origin.y > topCandidateYBoundary && sbvl == sbs.lastObject) { - sbvl.bottomBorderLine = self.IntelligentBorderLine; + sbvl.topBorderline = self.intelligentBorderline; } + } } } - + //这里有可能子视图本身的高度会超过布局视图本身,但是我们的候选区域则不存储超过的高度部分。 - CGRect cRect = CGRectMake(rect.origin.x - leftMargin, MAX((rect.origin.y - topMargin - vertMargin),padding.top), rect.size.width + leftMargin + rightMargin + horzMargin, MIN((rect.size.height + topMargin + bottomMargin),(selfRect.size.height - padding.top - padding.bottom))); + CGRect cRect = CGRectMake(rect.origin.x - leadingSpace, MAX((rect.origin.y - topSpace - vertSpace),paddingTop), rect.size.width + leadingSpace + trailingSpace + horzSpace, MIN((rect.size.height + topSpace + bottomSpace),(selfSize.height - paddingVert))); //把新的候选区域添加到数组中去。并删除高度小于新候选区域的其他区域 for (NSInteger i = bottomCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)bottomCandidateRects[i]).CGRectValue; - if (CGRectGetMaxX(candidateRect) <= CGRectGetMaxX(cRect)) + if (_myCGFloatLessOrEqual(CGRectGetMaxX(candidateRect), CGRectGetMaxX(cRect))) + { [bottomCandidateRects removeObjectAtIndex:i]; + } } //删除顶部宽度小于新添加区域的顶部的候选区域 for (NSInteger i = topCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)topCandidateRects[i]).CGRectValue; - if (CGRectGetMaxX(candidateRect) <= CGRectGetMinX(cRect)) + + CGFloat candidateMaxX = CGRectGetMaxX(candidateRect); + CGFloat candidateMaxY = CGRectGetMaxY(candidateRect); + CGFloat cMinY = CGRectGetMinY(cRect); + + if (_myCGFloatLessOrEqual(candidateMaxX, CGRectGetMinX(cRect))) + { [topCandidateRects removeObjectAtIndex:i]; + } + else if (_myCGFloatEqual(candidateMaxX, CGRectGetMaxX(cRect)) && _myCGFloatLessOrEqual(cMinY,candidateMaxY)) + { + [topCandidateRects removeObjectAtIndex:i]; + cRect = CGRectUnion(cRect, candidateRect); + cRect.size.height += candidateMaxY - cMinY; + } + } [bottomCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; - bottomLastXOffset = rect.origin.x - leftMargin; + bottomLastXOffset = rect.origin.x - leadingSpace; - if (rect.origin.x + rect.size.width + rightMargin + horzMargin > bottomMaxWidth) - bottomMaxWidth = rect.origin.x + rect.size.width + rightMargin + horzMargin; + if (rect.origin.x + rect.size.width + trailingSpace + horzSpace > bottomMaxWidth) + bottomMaxWidth = rect.origin.x + rect.size.width + trailingSpace + horzSpace; } else { - CGPoint nextPoint = {bottomLastXOffset,padding.top}; - CGFloat bottomCandidateYBoundary = selfRect.size.height - padding.bottom; + CGPoint nextPoint = {bottomLastXOffset,paddingTop}; + CGFloat bottomCandidateYBoundary = selfSize.height - paddingBottom; //如果是清除了浮动则直换行移动到最下面。 - if (sbv.clearFloat) + if (sbvsc.clearFloat) { //找到最低点。 nextPoint.x = MAX(topMaxWidth, bottomLastXOffset); - CGPoint bottomPoint = [self findBottomCandidatePoint:CGRectMake(nextPoint.x, padding.top,CGFLOAT_MAX,0) height:topMargin + (sbv.weight != 0 ? 0: rect.size.height) + bottomMargin bottomBoundary:selfRect.size.height - padding.bottom bottomCandidateRects:bottomCandidateRects hasWeight:NO]; + CGPoint bottomPoint = [self myFindBottomCandidatePoint:CGRectMake(nextPoint.x, paddingTop,CGFLOAT_MAX,0) height:topSpace + (sbvsc.weight != 0 ? 0: rect.size.height) + bottomSpace bottomBoundary:bottomCandidateYBoundary bottomCandidateRects:bottomCandidateRects hasWeight:NO paddingLeading:paddingLeading]; if (bottomPoint.x != CGFLOAT_MAX) { nextPoint.x = MAX(topMaxWidth, bottomPoint.x); @@ -989,7 +1212,7 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs for (NSInteger i = topCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)topCandidateRects[i]).CGRectValue; - CGPoint bottomPoint = [self findBottomCandidatePoint:candidateRect height:topMargin + (sbv.weight != 0 ? 0: rect.size.height) + bottomMargin bottomBoundary:selfRect.size.height - padding.bottom bottomCandidateRects:bottomCandidateRects hasWeight:sbv.weight != 0]; + CGPoint bottomPoint = [self myFindBottomCandidatePoint:candidateRect height:topSpace + (sbvsc.weight != 0 ? 0: rect.size.height) + bottomSpace bottomBoundary:selfSize.height - paddingBottom bottomCandidateRects:bottomCandidateRects hasWeight:sbvsc.weight != 0 paddingLeading:paddingLeading]; if (bottomPoint.x != CGFLOAT_MAX) { nextPoint = CGPointMake(MAX(nextPoint.x, bottomPoint.x),CGRectGetMaxY(candidateRect)); @@ -1001,101 +1224,135 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs } } - if (sbv.weight != 0) + if (sbvsc.weight != 0) { - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:(bottomCandidateYBoundary - nextPoint.y - topMargin - bottomMargin) * sbv.weight sbvSize:rect.size selfLayoutSize:selfRect.size]; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal sbvSize:rect.size selfLayoutSize:selfRect.size]; +#ifdef DEBUG + //异常崩溃:当布局视图设置了noBoundaryLimit为YES时子视图不能设置weight大于0 + NSCAssert(hasBoundaryLimit, @"Constraint exception!!, horizontal float layout:%@ can not set noBoundaryLimit to YES when the subview:%@ set weight big than zero.",self, sbv); +#endif + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:(bottomCandidateYBoundary - nextPoint.y + sbvsc.heightSizeInner.addVal) * sbvsc.weight - topSpace - bottomSpace sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:[sbvsc.widthSizeInner measureWith: rect.size.height] sbvSize:rect.size selfLayoutSize:selfSize]; } - rect.origin.y = nextPoint.y + topMargin; - rect.origin.x = MIN(nextPoint.x,maxWidth) + leftMargin; + rect.origin.y = nextPoint.y + topSpace; + rect.origin.x = MIN(nextPoint.x,maxWidth) + leadingSpace; //如果有智能边界线则找出所有智能边界线。 - if (self.IntelligentBorderLine != nil) + if (!isEstimate && self.intelligentBorderline != nil) { //优先绘制左边和上边的。绘制左边的和上边的。 if ([sbv isKindOfClass:[MyBaseLayout class]]) { MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) + if (!sbvl.notUseIntelligentBorderline) { - sbvl.bottomBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.leftBorderLine = nil; + sbvl.bottomBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.leadingBorderline = nil; //如果自己的上边和左边有子视图。 - if (rect.origin.x - leftMargin > padding.left) + if (rect.origin.x + rect.size.width + trailingSpace < selfSize.width - paddingTrailing) { - sbvl.leftBorderLine = self.IntelligentBorderLine; + sbvl.trailingBorderline = self.intelligentBorderline; } - if (rect.origin.y - topMargin > padding.top) + if (rect.origin.y + rect.size.height + bottomSpace < selfSize.height - paddingBottom) { - sbvl.topBorderLine = self.IntelligentBorderLine; + sbvl.bottomBorderline = self.intelligentBorderline; } } } } - - CGRect cRect = CGRectMake(rect.origin.x - leftMargin, rect.origin.y - topMargin,rect.size.width + leftMargin + rightMargin + horzMargin,MIN((rect.size.height + topMargin + bottomMargin + vertMargin),(selfRect.size.height - padding.top - padding.bottom))); + + CGRect cRect = CGRectMake(rect.origin.x - leadingSpace, rect.origin.y - topSpace,rect.size.width + leadingSpace + trailingSpace + horzSpace,MIN((rect.size.height + topSpace + bottomSpace + vertSpace),(selfSize.height - paddingVert))); //把新添加到候选中去。并删除宽度小于的最新候选区域的候选区域 for (NSInteger i = topCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)topCandidateRects[i]).CGRectValue; - if (CGRectGetMaxX(candidateRect) <= CGRectGetMaxX(cRect)) + + if (_myCGFloatLessOrEqual(CGRectGetMaxX(candidateRect), CGRectGetMaxX(cRect))) + { [topCandidateRects removeObjectAtIndex:i]; + } } //删除顶部宽度小于新添加区域的顶部的候选区域 for (NSInteger i = bottomCandidateRects.count - 1; i >= 0; i--) { CGRect candidateRect = ((NSValue*)bottomCandidateRects[i]).CGRectValue; - if (CGRectGetMaxX(candidateRect) <= CGRectGetMinX(cRect)) + + CGFloat candidateMaxX = CGRectGetMaxX(candidateRect); + CGFloat candidateMinY = CGRectGetMinY(candidateRect); + CGFloat cMaxY = CGRectGetMaxY(cRect); + if (_myCGFloatLessOrEqual(candidateMaxX, CGRectGetMinX(cRect))) + { [bottomCandidateRects removeObjectAtIndex:i]; - } + } + else if ( _myCGFloatEqual(candidateMaxX, CGRectGetMaxX(cRect)) && _myCGFloatLessOrEqual(candidateMinY, cMaxY)) + {//当右边的宽度和cRect的宽度相等,又有重合时表明二者可以合并为一个区域。 + [bottomCandidateRects removeObjectAtIndex:i]; + cRect = CGRectUnion(cRect, candidateRect); + cRect.size.height += cMaxY - candidateMinY; //要加上重叠部分来增加高度,否则会出现高度不正确的问题。 + } + + } + [topCandidateRects addObject:[NSValue valueWithCGRect:cRect]]; - topLastXOffset = rect.origin.x - leftMargin; + topLastXOffset = rect.origin.x - leadingSpace; - if (rect.origin.x + rect.size.width + rightMargin + horzMargin > topMaxWidth) - topMaxWidth = rect.origin.x + rect.size.width + rightMargin + horzMargin; + if (rect.origin.x + rect.size.width + trailingSpace + horzSpace > topMaxWidth) + topMaxWidth = rect.origin.x + rect.size.width + trailingSpace + horzSpace; } - if (rect.origin.x + rect.size.width + rightMargin + horzMargin > maxWidth) - maxWidth = rect.origin.x + rect.size.width + rightMargin + horzMargin; + if (rect.origin.x + rect.size.width + trailingSpace + horzSpace > maxWidth) + maxWidth = rect.origin.x + rect.size.width + trailingSpace + horzSpace; - sbv.absPos.frame = rect; + if (rect.origin.y + rect.size.height + bottomSpace + vertSpace > maxHeight) + maxHeight = rect.origin.y + rect.size.height + bottomSpace + vertSpace; + + sbvmyFrame.frame = rect; } if (sbs.count > 0) - maxWidth -= horzMargin; + { + maxWidth -= horzSpace; + maxHeight -= vertSpace; + } + + maxWidth += paddingTrailing; - maxWidth += padding.right; + maxHeight += paddingBottom; + if (!hasBoundaryLimit) + selfSize.height = maxHeight; - if (self.wrapContentWidth) - selfRect.size.width = maxWidth; + if (lsc.wrapContentWidth) + selfSize.width = maxWidth; else { CGFloat addXPos = 0; - MyMarginGravity mghorz = self.gravity & MyMarginGravity_Vert_Mask; - if (mghorz == MyMarginGravity_Horz_Center) + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + + if (horzGravity == MyGravity_Horz_Center) { - addXPos = (selfRect.size.width - maxWidth) / 2; + addXPos = (selfSize.width - maxWidth) / 2; } - else if (mghorz == MyMarginGravity_Horz_Right) + else if (horzGravity == MyGravity_Horz_Trailing) { - addXPos = selfRect.size.width - maxWidth; + addXPos = selfSize.width - maxWidth; } if (addXPos != 0) @@ -1104,88 +1361,13 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs { UIView *sbv = sbs[i]; - sbv.absPos.leftPos += addXPos; + sbv.myFrame.leading += addXPos; } } } - - - return selfRect; -} - - --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass -{ - CGRect selfRect = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass]; - - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - } - - - for (UIView *sbv in sbs) - { - if (!isEstimate) - { - sbv.absPos.frame = sbv.frame; - [self calcSizeOfWrapContentSubview:sbv]; - } - - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - if (pHasSubLayout != NULL) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - - if (sbvl.wrapContentWidth) - { - if (sbvl.widthDime.dimeVal != nil || (self.orientation == MyLayoutViewOrientation_Vert && sbvl.weight != 0)) - { - [sbvl setWrapContentWidthNoLayout:NO]; - } - } - - if (sbvl.wrapContentHeight) - { - if (sbvl.heightDime.dimeVal != nil || (self.orientation == MyLayoutViewOrientation_Horz && sbvl.weight != 0)) - { - [sbvl setWrapContentHeightNoLayout:NO]; - } - } - - - if (isEstimate) - { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 - } - } - } - - - if (self.orientation == MyLayoutViewOrientation_Vert) - selfRect = [self layoutSubviewsForVert:selfRect sbs:sbs]; - else - selfRect = [self layoutSubviewsForHorz:selfRect sbs:sbs]; - - - selfRect.size.height = [self validMeasure:self.heightDime sbv:self calcSize:selfRect.size.height sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - - selfRect.size.width = [self validMeasure:self.widthDime sbv:self calcSize:selfRect.size.width sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - return selfRect; -} - --(id)createSizeClassInstance -{ - return [MyLayoutSizeClassFloatLayout new]; + return selfSize; } diff --git a/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.h b/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.h index 435f8c5..b647493 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.h @@ -8,84 +8,236 @@ #import "MyBaseLayout.h" + + /** - *流式布局是一种里面的子视图按照添加的顺序依次排列,当遇到某种约束限制后会另起一行再重新排列的多行多列展示的布局视图。这里的约束限制主要有数量约束限制和内容尺寸约束限制两种,而换行的方向又分为垂直和水平方向,因此流式布局一共有垂直数量约束流式布局、垂直内容约束流式布局、水平数量约束流式布局、水平内容约束流式布局。流式布局主要应用于那些有规律排列的场景,在某种程度上可以作为UICollectionView的替代品。 - 1.垂直数量约束流式布局 - orientation为MyLayoutViewOrientation_Vert,arrangedCount不为0,支持wrapContentHeight,支持wrapContentWidth,支持averageArrange,不支持autoArrange。 + 流式布局是一种里面的子视图按照添加的顺序依次排列,当遇到某种约束限制后会另起一排再重新排列的多行多列展示的布局视图。这里的约束限制主要有数量约束限制和内容尺寸约束限制两种,排列的方向又分为垂直和水平方向,因此流式布局一共有垂直数量约束流式布局、垂直内容约束流式布局、水平数量约束流式布局、水平内容约束流式布局。流式布局主要应用于那些有规律排列的场景,在某种程度上可以作为UICollectionView的替代品,同时流式布局实现了CSS3的flexbox的几乎全部功能。 + 1.垂直数量约束流式布局 + orientation为MyOrientation_Vert,arrangedCount不为0,支持wrapContentHeight,支持wrapContentWidth,不支持autoArrange。 + + @code +每排数量为3的垂直数量约束流式布局 + => + +------+---+-----+ + | A | B | C | + +---+--+-+-+-----+ + | D | E | F | | + +---+-+--+--+----+ v + | G | H | I | + +-----+-----+----+ + + @endcode + 2.垂直内容约束流式布局. - orientation为MyLayoutViewOrientation_Vert,arrangedCount为0,支持wrapContentHeight,不支持wrapContentWidth,支持averageArrange,支持autoArrange。 + orientation为MyOrientation_Vert,arrangedCount为0,支持wrapContentHeight,不支持wrapContentWidth,支持autoArrange。 + @code + 垂直内容约束流式布局 + => + +-----+-----------+ + | A | B | + +-----+-----+-----+ + | C | D | E | | + +-----+-----+-----+ v + | F | + +-----------------+ + @endcode 3.水平数量约束流式布局。 - orientation为MyLayoutViewOrientation_Horz,arrangedCount不为0,支持wrapContentHeight,支持wrapContentWidth,支持averageArrange,不支持autoArrange。 + orientation为MyOrientation_Horz,arrangedCount不为0,支持wrapContentHeight,支持wrapContentWidth,不支持autoArrange。 + + @code + 每排数量为3的水平数量约束流式布局 + => + +-----+----+-----+ + | A | D | | + | |----| G | + |-----| | | + | | B | E |-----| + V |-----| | | + | |----| H | + | C | |-----| + | | F | I | + +-----+----+-----+ + + @endcode 4.水平内容约束流式布局 - orientation为MyLayoutViewOrientation_Horz,arrangedCount为0,不支持wrapContentHeight,支持wrapContentWidth,支持averageArrange,支持autoArrange。 + orientation为MyOrientation_Horz,arrangedCount为0,不支持wrapContentHeight,支持wrapContentWidth,支持autoArrange。 + + @code + 水平内容约束流式布局 + => + +-----+----+-----+ + | A | C | | + | |----| | + |-----| | | + | | | D | | + V | | | F | + | B |----| | + | | | | + | | E | | + +-----+----+-----+ + +@endcode + + @note + 流式布局中排的概念是一个通用的称呼,对于垂直方向的流式布局来说一排就是一行,垂直流式布局每排依次从上到下排列,每排内的子视图则是由左往右依次排列;对于水平方向的流式布局来说一排就是一列,水平流式布局每排依次从左到右排列,每排内的子视图则是由上往下依次排列 - 流式布局支持子视图的宽度依赖于高度或者高度依赖于宽度,以及高度或者宽度依赖于流式布局本身的高度或者宽度 */ @interface MyFlowLayout : MyBaseLayout /** - *初始化一个流式布局并指定布局的方向和布局的数量,如果数量为0则表示内容约束流式布局 + 初始化一个流式布局并指定布局的方向和布局的数量,如果数量为0则表示内容约束流式布局。 + + @param orientation 布局的方向,这个方向是指的排与排之间排列方向,而不是排内的子视图的排列方向。 + @param arrangedCount 每排内的子视图的数量,如果每排内的子视图的数量不固定则设置为0表示为内容约束流式布局。 + @return 返回流式布局对象实例。 */ --(id)initWithOrientation:(MyLayoutViewOrientation)orientation arrangedCount:(NSInteger)arrangedCount; -+(id)flowLayoutWithOrientation:(MyLayoutViewOrientation)orientation arrangedCount:(NSInteger)arrangedCount; +-(instancetype)initWithOrientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount; /** - *流式布局的方向: - *如果是MyLayoutViewOrientation_Vert则表示从左到右,从上到下的垂直布局方式,这个方式是默认方式。 - *如果是MyLayoutViewOrientation_Horz则表示从上到下,从左到右的水平布局方式 + 初始化一个流式布局并指定布局视图的frame值以及方向和布局的数量,如果数量为0则表示内容约束流式布局。 + + @param frame 布局视图的frame值,当布局视图的父视图是非布局视图时就可以用这个方法来初始化视图的frame。 + @param orientation 布局的方向,这个方向是指的排与排之间排列方向,而不是排内的子视图的排列方向。 + @param arrangedCount 每排内的子视图的数量,如果每排内的子视图的数量不固定则设置为0表示为内容约束流式布局。 + @return 返回流式布局对象实例 */ -@property(nonatomic,assign) IBInspectable MyLayoutViewOrientation orientation; +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount; /** - *流式布局内所有子视图的整体停靠对齐位置设定。 - *如果视图方向为MyLayoutViewOrientation_Vert时且averageArrange为YES时则水平方向的停靠失效。 - *如果视图方向为MyLayoutViewOrientation_Horz时且averageArrange为YES时则垂直方向的停靠失效。 - *对于内容填充布局来说如果设置为MyMarginGravity_Horz_Fill或者MyMarginGravity_Vert_Fill则表示间距的拉伸 + 初始化一个流式布局并指定布局的方向和布局的数量,如果数量为0则表示内容约束流式布局。 + + @param orientation 布局的方向,这个方向是指的排与排之间排列方向,而不是排内的子视图的排列方向。 + @param arrangedCount 每排内的子视图的数量,如果每排内的子视图的数量不固定则设置为0表示为内容约束流式布局。 + @return 返回流式布局对象实例。 */ -@property(nonatomic,assign) IBInspectable MyMarginGravity gravity; ++(instancetype)flowLayoutWithOrientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount; /** - *指定方向上的子视图的数量,默认是0表示为内容约束流式布局,当数量不为0时则是数量约束流式布局。当值为0时则表示当子视图在方向上的尺寸超过布局视图时则会新起一行或者一列。而如果数量不为0时则: - 如果方向为MyLayoutViewOrientation_Vert,则表示从左到右的数量,当子视图从左往右满足这个数量后新的子视图将会换行再排列 - 如果方向为MyLayoutViewOrientation_Horz,则表示从上到下的数量,当子视图从上往下满足这个数量后新的子视图将会换列再排列 + 流式布局的布局方向: + + 1. MyOrientation_Vert 表示排内子视图从左到右(RTL从右到左)水平排列,排与排之间依次从上到下垂直排列。这个方向是默认方向。 + + 2. MyOrientation_Horz 表示排内子视图从上到下垂直排列,排与排之间依次从左到右(RTL从右到左)水平排列。 */ -@property(nonatomic, assign) IBInspectable NSInteger arrangedCount; +@property(nonatomic,assign) IBInspectable MyOrientation orientation; + + /** - *指定是否均分布局方向上的子视图的宽度或者高度,或者拉伸子视图的尺寸,默认是NO。 - 如果是MyLayoutViewOrientation_Vert则表示每行的子视图的宽度会被均分,这样子视图不需要指定宽度,但是布局视图必须要指定一个明确的宽度值,如果设置为YES则wrapContentWidth会失效。 - 如果是MyLayoutViewOrientation_Horz则表示每列的子视图的高度会被均分,这样子视图不需要指定高度,但是布局视图必须要指定一个明确的高度值,如果设置为YES则wrapContentHeight会失效。 -内容填充约束流式布局下averageArrange设置为YES时表示拉伸子视图的宽度或者高度以便填充满整个布局视图。 + 每排内的子视图数量。默认是0表示每排内的子视图的数量不固定,而是根据子视图的尺寸自动换行或者换列处理。如果非0则每排内的子视图数量等于这个值后会自动换行或者换列 */ -@property(nonatomic,assign) IBInspectable BOOL averageArrange; +@property(nonatomic, assign) IBInspectable NSInteger arrangedCount; + + /** - *子视图自动排列,这个属性只有在内容填充约束流式布局下才有用,默认为NO.当设置为YES时则根据子视图的内容自动填充,而不是根据加入的顺序来填充,以便保证不会出现多余空隙的情况。 + 为流式布局提供分页展示的能力,默认是0表不支持分页展示。当设置为非0时则要求必须是arrangedCount的整数倍数,表示每页的子视图的数量。而arrangedCount则表示每排内的子视图的数量。当启用pagedCount时要求将流式布局加入到UIScrollView或者其派生类中才能生效。只有数量约束流式布局才支持分页展示的功能,通过pagedCount和wrapContentHeight以及wrapContentWidth配合使用能实现不同的分页展示能力: + @note + 1. 垂直数量约束流式布局的wrapContentHeight设置为YES时则以UIScrollView的尺寸作为一页展示的大小,因为指定了一页的子视图数量,以及指定了一排的子视图数量,因此默认也会自动计算出子视图的宽度和高度,而不需要单独指出高度和宽度(子视图的宽度你也可以自定义),整体的分页滚动是从上到下滚动。(每页布局时从左到右再从上到下排列,新页往下滚动继续排列): + @code + 1 2 3 + 4 5 6 + ------- ↓ + 7 8 9 + 10 11 12 + @endcode + + 2. 垂直数量约束流式布局的wrapContentWidth设置为YES时则以UIScrollView的尺寸作为一页展示的大小,因为指定了一页的子视图数量,以及指定了一排的子视图数量,因此默认也会自动计算出子视图的宽度和高度,而不需要单独指出高度和宽度(子视图的高度你也可以自定义),整体的分页滚动是从左到右滚动。(每页布局时从左到右再从上到下排列,新页往右滚动继续排列) + @code + 1 2 3 | 7 8 9 + 4 5 6 | 10 11 12 + → + @endcode + + 3. 水平数量约束流式布局的wrapContentWidth设置为YES时则以UIScrollView的尺寸作为一页展示的大小,因为指定了一页的子视图数量,以及指定了一排的子视图数量,因此默认也会自动计算出子视图的宽度和高度,而不需要单独指出高度和宽度(子视图的高度你也可以自定义),整体的分页滚动是从左到右滚动。(每页布局时从上到下再从左到右排列,新页往右滚动继续排列) + @code + 1 3 5 | 7 9 11 + 2 4 6 | 8 10 12 + → + @endcode + + 4. 水平数量约束流式布局的wrapContentHeight设置为YES时则以UIScrollView的尺寸作为一页展示的大小,因为指定了一页的子视图数量,以及指定了一排的子视图数量,因此默认也会自动计算出子视图的宽度和高度,而不需要单独指出高度和宽度(子视图的宽度你也可以自定义),整体的分页滚动是从上到下滚动。(每页布局时从上到下再从左到右排列,新页往下滚动继续排列) + @code + 1 3 5 + 2 4 6 + --------- ↓ + 7 9 11 + 8 10 12 + @endcode + */ +@property(nonatomic, assign) IBInspectable NSInteger pagedCount; + + + +/** + 布局内子视图自动排列。这个属性只有在内容填充约束流式布局下才有用,默认为NO。当设置为YES时则根据子视图的尺寸自动填充,而不是根据加入的顺序来填充,以便保证不会出现多余空隙的情况。 + + @note + 请在将所有子视图添加完毕并且初始布局完成后再设置这个属性,否则如果预先设置这个属性则在后续添加子视图时可能会非常耗性能。 */ @property(nonatomic,assign) IBInspectable BOOL autoArrange; /** - *流式布局中每排子视图的停靠对齐位置设定。 - 如果是MyLayoutViewOrientation_Vert则只用于表示每行子视图的上中下停靠对齐位置,这个属性只支持MyMarginGravity_Vert_Top,MyMarginGravity_Vert_Center,MyMarginGravity_Vert_Bottom,MyMarginGravity_Vert_Fill这里的对齐基础是以每行中的最高的子视图为基准。 - 如果是MyLayoutViewOrientation_Horz则只用于表示每列子视图的左中右停靠对齐位置,这个属性只支持MyMarginGravity_Horz_Left,MyMarginGravity_Horz_Center,MyMarginGravity_Horz_Right,MyMarginGravity_Horz_Fill这里的对齐基础是以每列中的最宽的子视图为基准。 + *设置流式布局中每排内所有子视图的对齐停靠方式。具体的对齐停靠方式依赖于布局视图的方向: + + 1. 如果是垂直流式布局则表示每排内子视图的上中下对齐方式,这里的对齐基础是以每排中的最高的子视图为基准。这个属性只支持: + @code + MyGravity_Vert_Top 顶部对齐 + MyGravity_Vert_Center 垂直居中对齐 + MyGravity_Vert_Bottom 底部对齐 + MyGravity_Vert_Fill 两端对齐 + @endcode + 2. 如果是水平流式布局则表示每排内子视图的左中右对齐方式,这里的对齐基础是以每排中的最宽的子视图为基准。这个属性只支持: + @code + MyGravity_Horz_Left 左边对齐 + MyGravity_Horz_Center 水平居中对齐 + MyGravity_Horz_Right 右边对齐 + MyGravity_Horz_Fill 两端对齐 + @endcode + @note 如果您想单独设置某个子视图在排内的对齐方式则请使用子视图的扩展属性myAlignment。 + */ -@property(nonatomic,assign) IBInspectable MyMarginGravity arrangedGravity; +@property(nonatomic,assign) MyGravity arrangedGravity; + + /** - *子视图之间的垂直和水平的间距,默认为0。当子视图之间的间距是固定时可以通过直接设置这两个属性值来指定间距而不需要为每个子视图来设置margin值。 + 在内容约束流式布局的一些应用场景中我们希望子视图的宽度是固定的但间距是浮动的,这样就尽可能在一排中容纳更多的子视图。比如设置每个子视图的宽度固定为80,那么在小屏幕下每排只能放3个,而大屏幕则每排能放4个或者5个子视图。 因此您可以通过如下方法来设置子视图的固定尺寸和最小最大浮动间距。这个方法会根据您当前布局的方向不同而具有不同的意义: + + 1.如果您的布局方向是垂直的则设置的是每排内子视图的水平浮动间距,其中的subviewSize指定的是子视图的固定宽度;minSpace指定的是最小的水平间距;maxSpace指定的是最大的水平间距,如果指定的subviewSize计算出的间距大于最大间距maxSpace则会缩小subviewSize的宽度值。 + + 2.如果您的布局方向是水平的则设置的是每排内子视图的垂直浮动间距,其中的subviewSize指定的是子视图的固定高度;minSpace指定的是最小的垂直间距;maxSpace指定的是最大的垂直间距,如果指定的subviewSize计算出的间距大于最大间距maxSpace则会调整subviewSize的高度值。 + + @note 如果您不想使用浮动间距则请将subviewSize设置为0就可以了。这个方法只在内容约束流式布局里面设置才有意义。 + + @param subviewSize 指定子视图的尺寸。 + @param minSpace 指定子视图之间的最小间距 + @param maxSpace 指定子视图之间的最大间距 */ -@property(nonatomic ,assign) IBInspectable CGFloat subviewVertMargin; -@property(nonatomic, assign) IBInspectable CGFloat subviewHorzMargin; -@property(nonatomic, assign) IBInspectable CGFloat subviewMargin; //同时设置水平和垂直间距。 +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace; +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace inSizeClass:(MySizeClass)sizeClass; + + +@end + + +@interface MyFlowLayout(MyFlowLayoutDeprecated) +/** + 指定是否均分布局方向上的子视图的宽度或者高度,或者拉伸子视图的尺寸,默认是NO。 + 如果是MyOrientation_Vert则表示每行的子视图的宽度会被均分,这样子视图不需要指定宽度,但是布局视图必须要指定一个明确的宽度值,如果设置为YES则wrapContentWidth会失效。 + 如果是MyOrientation_Horz则表示每列的子视图的高度会被均分,这样子视图不需要指定高度,但是布局视图必须要指定一个明确的高度值,如果设置为YES则wrapContentHeight会失效。 + 内容填充约束流式布局下averageArrange设置为YES时表示拉伸子视图的宽度或者高度以便填充满整个布局视图。 + */ +@property(nonatomic,assign) BOOL averageArrange MYMETHODDEPRECATED("use gravity = MyGravity_Horz_Fill or gravity = MyGravity_Vert_Fill to instead"); @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.m b/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.m index 4b0d5c3..5156d74 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyFlowLayout.m @@ -9,29 +9,35 @@ #import "MyFlowLayout.h" #import "MyLayoutInner.h" -IB_DESIGNABLE + @implementation MyFlowLayout --(id)initWithOrientation:(MyLayoutViewOrientation)orientation arrangedCount:(NSInteger)arrangedCount + +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount { - self = [super init]; + self = [super initWithFrame:frame]; if (self != nil) { self.myCurrentSizeClass.orientation = orientation; self.myCurrentSizeClass.arrangedCount = arrangedCount; } - return self; + return self; +} + +-(instancetype)initWithOrientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount +{ + return [self initWithFrame:CGRectZero orientation:orientation arrangedCount:arrangedCount]; } -+(id)flowLayoutWithOrientation:(MyLayoutViewOrientation)orientation arrangedCount:(NSInteger)arrangedCount ++(instancetype)flowLayoutWithOrientation:(MyOrientation)orientation arrangedCount:(NSInteger)arrangedCount { MyFlowLayout *layout = [[[self class] alloc] initWithOrientation:orientation arrangedCount:arrangedCount]; return layout; } --(void)setOrientation:(MyLayoutViewOrientation)orientation +-(void)setOrientation:(MyOrientation)orientation { MyFlowLayout *lsc = self.myCurrentSizeClass; if (lsc.orientation != orientation) @@ -41,11 +47,12 @@ -(void)setOrientation:(MyLayoutViewOrientation)orientation } } --(MyLayoutViewOrientation)orientation +-(MyOrientation)orientation { return self.myCurrentSizeClass.orientation; } + -(void)setArrangedCount:(NSInteger)arrangedCount { MyFlowLayout *lsc = self.myCurrentSizeClass; @@ -63,21 +70,22 @@ -(NSInteger)arrangedCount } --(void)setAverageArrange:(BOOL)averageArrange +-(NSInteger)pagedCount { MyFlowLayout *lsc = self.myCurrentSizeClass; + return lsc.pagedCount; +} - if (lsc.averageArrange != averageArrange) +-(void)setPagedCount:(NSInteger)pagedCount +{ + MyFlowLayout *lsc = self.myCurrentSizeClass; + if (lsc.pagedCount != pagedCount) { - lsc.averageArrange = averageArrange; + lsc.pagedCount = pagedCount; [self setNeedsLayout]; } } --(BOOL)averageArrange -{ - return self.myCurrentSizeClass.averageArrange; -} -(void)setAutoArrange:(BOOL)autoArrange { @@ -95,109 +103,248 @@ -(BOOL)autoArrange return self.myCurrentSizeClass.autoArrange; } --(void)setGravity:(MyMarginGravity)gravity + +-(void)setArrangedGravity:(MyGravity)arrangedGravity { MyFlowLayout *lsc = self.myCurrentSizeClass; - if (lsc.gravity != gravity) + if (lsc.arrangedGravity != arrangedGravity) { - lsc.gravity = gravity; + lsc.arrangedGravity = arrangedGravity; [self setNeedsLayout]; } } --(MyMarginGravity)gravity +-(MyGravity)arrangedGravity { - return self.myCurrentSizeClass.gravity; + return self.myCurrentSizeClass.arrangedGravity; } --(void)setArrangedGravity:(MyMarginGravity)arrangedGravity + +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace { - MyFlowLayout *lsc = self.myCurrentSizeClass; - if (lsc.arrangedGravity != arrangedGravity) - { - lsc.arrangedGravity = arrangedGravity; - [self setNeedsLayout]; - } + [self setSubviewsSize:subviewSize minSpace:minSpace maxSpace:maxSpace inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; } --(MyMarginGravity)arrangedGravity +-(void)setSubviewsSize:(CGFloat)subviewSize minSpace:(CGFloat)minSpace maxSpace:(CGFloat)maxSpace inSizeClass:(MySizeClass)sizeClass { - return self.myCurrentSizeClass.arrangedGravity; + MyFlowLayoutViewSizeClass *lsc = (MyFlowLayoutViewSizeClass*)[self fetchLayoutSizeClass:sizeClass]; + lsc.subviewSize = subviewSize; + lsc.maxSpace = maxSpace; + lsc.minSpace = minSpace; + [self setNeedsLayout]; } --(void)setSubviewHorzMargin:(CGFloat)subviewHorzMargin +#pragma mark -- Deprecated Method + + +-(void)setAverageArrange:(BOOL)averageArrange { MyFlowLayout *lsc = self.myCurrentSizeClass; - - if (lsc.subviewHorzMargin != subviewHorzMargin) + + if (lsc.orientation == MyOrientation_Vert) { - lsc.subviewHorzMargin = subviewHorzMargin; - [self setNeedsLayout]; + if (averageArrange) + lsc.gravity = (lsc.gravity & MyGravity_Horz_Mask) | MyGravity_Horz_Fill; + else + lsc.gravity = (lsc.gravity & MyGravity_Horz_Mask) | MyGravity_None; } + else + { + if (averageArrange) + lsc.gravity = (lsc.gravity & MyGravity_Vert_Mask) | MyGravity_Vert_Fill; + else + lsc.gravity = (lsc.gravity & MyGravity_Vert_Mask) | MyGravity_None; + } + } --(CGFloat)subviewHorzMargin +-(BOOL)averageArrange { - return self.myCurrentSizeClass.subviewHorzMargin; + MyFlowLayout *lsc = self.myCurrentSizeClass; + + if (lsc.orientation == MyOrientation_Vert) + return (lsc.gravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill; + else + return (lsc.gravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill; } --(void)setSubviewVertMargin:(CGFloat)subviewVertMargin + +#pragma mark -- Override Method + +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs { + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; + + if (sbs == nil) + sbs = [self myGetLayoutSubviews]; + MyFlowLayout *lsc = self.myCurrentSizeClass; - if (lsc.subviewVertMargin != subviewVertMargin) + + MyOrientation orientation = lsc.orientation; + MyGravity gravity = lsc.gravity; + MyGravity arrangedGravity = lsc.arrangedGravity; + + for (UIView *sbv in sbs) { - lsc.subviewVertMargin = subviewVertMargin; - [self setNeedsLayout]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (!isEstimate) + { + sbvmyFrame.frame = sbv.bounds; + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + } + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + + if (sbvsc.wrapContentWidth) + { + if (sbvsc.widthSizeInner.dimeVal != nil || + (orientation == MyOrientation_Horz && (arrangedGravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill) || + (orientation == MyOrientation_Vert && ((gravity & MyGravity_Vert_Mask) == MyGravity_Horz_Fill || sbvsc.weight != 0))) + { + sbvsc.wrapContentWidth = NO; + } + } + + if (sbvsc.wrapContentHeight) + { + if (sbvsc.heightSizeInner.dimeVal != nil || + (orientation == MyOrientation_Vert && (arrangedGravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill) || + (orientation == MyOrientation_Horz && ((gravity & MyGravity_Horz_Mask) == MyGravity_Vert_Fill || sbvsc.weight != 0))) + { + sbvsc.wrapContentHeight = NO; + } + } + + + BOOL isSbvWrap = sbvsc.wrapContentHeight || sbvsc.wrapContentWidth; + + if (pHasSubLayout != nil && isSbvWrap) + *pHasSubLayout = YES; + + if (isEstimate && isSbvWrap) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } + } + + + + if (orientation == MyOrientation_Vert) + { + if (lsc.arrangedCount == 0) + selfSize = [self myLayoutSubviewsForVertContent:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; + else + selfSize = [self myLayoutSubviewsForVert:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; + } + else + { + if (lsc.arrangedCount == 0) + selfSize = [self myLayoutSubviewsForHorzContent:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; + else + selfSize = [self myLayoutSubviewsForHorz:selfSize sbs:sbs isEstimate:isEstimate lsc:lsc]; } + + //调整布局视图自己的尺寸。 + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + //如果是反向则调整所有子视图的左右位置。 + [self myAdjustSubviewsRTLPos:sbs selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs lsc:lsc]; } --(CGFloat)subviewVertMargin +-(id)createSizeClassInstance { - return self.myCurrentSizeClass.subviewVertMargin; + return [MyFlowLayoutViewSizeClass new]; } --(CGFloat)subviewMargin +#pragma mark -- Private Method + + +- (void)myCalcVertLayoutSinglelineWeight:(CGSize)selfSize totalFloatWidth:(CGFloat)totalFloatWidth totalWeight:(CGFloat)totalWeight sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count { - return self.myCurrentSizeClass.subviewMargin; + for (NSInteger j = startIndex - count; j < startIndex; j++) + { + UIView *sbv = sbs[j]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (sbvsc.weight != 0) + { + CGFloat tempWidth = (totalFloatWidth * sbvsc.weight / totalWeight); + if (sbvsc.widthSizeInner != nil) + tempWidth = [sbvsc.widthSizeInner measureWith:tempWidth]; + + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:tempWidth sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; + } + } } --(void)setSubviewMargin:(CGFloat)subviewMargin +- (void)myCalcHorzLayoutSinglelineWeight:(CGSize)selfSize totalFloatHeight:(CGFloat)totalFloatHeight totalWeight:(CGFloat)totalWeight sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count { - MyFlowLayout *lsc = self.myCurrentSizeClass; - if (lsc.subviewMargin != subviewMargin) + for (NSInteger j = startIndex - count; j < startIndex; j++) { - lsc.subviewMargin = subviewMargin; - [self setNeedsLayout]; + UIView *sbv = sbs[j]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (sbvsc.weight != 0) + { + CGFloat tempHeight = (totalFloatHeight * sbvsc.weight / totalWeight); + if (sbvsc.heightSizeInner != nil) + tempHeight = [sbvsc.heightSizeInner measureWith:tempHeight]; + + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:tempHeight sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:[sbvsc.widthSizeInner measureWith: sbvmyFrame.height ] sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + + } } } -- (void)calcVertLayoutGravity:(CGSize)selfSize rowMaxHeight:(CGFloat)rowMaxHeight rowMaxWidth:(CGFloat)rowMaxWidth mg:(MyMarginGravity)mg amg:(MyMarginGravity)amg sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count +- (void)myCalcVertLayoutSinglelineAlignment:(CGSize)selfSize rowMaxHeight:(CGFloat)rowMaxHeight rowMaxWidth:(CGFloat)rowMaxWidth horzGravity:(MyGravity)horzGravity vertAlignment:(MyGravity)vertAlignment sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count vertSpace:(CGFloat)vertSpace horzSpace:(CGFloat)horzSpace isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc { - UIEdgeInsets padding = self.padding; - CGFloat addXPos = 0; - CGFloat addXFill = 0; - if (!self.averageArrange || self.arrangedCount == 0) + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + + CGFloat addXPos = 0; //多出来的空隙区域,用于停靠处理。 + CGFloat addXFill = 0; //多出来的平均区域,用于拉伸间距或者尺寸 + BOOL averageArrange = (horzGravity == MyGravity_Horz_Fill); + + if (!averageArrange || lsc.arrangedCount == 0) { - switch (mg) { - case MyMarginGravity_Horz_Center: + switch (horzGravity) { + case MyGravity_Horz_Center: { - addXPos = (selfSize.width - padding.left - padding.right - rowMaxWidth) / 2; + addXPos = (selfSize.width - paddingHorz - rowMaxWidth) / 2; } break; - case MyMarginGravity_Horz_Right: + case MyGravity_Horz_Trailing: { - addXPos = selfSize.width - padding.left - padding.right - rowMaxWidth; //因为具有不考虑左边距,而原来的位置增加了左边距,因此 + addXPos = selfSize.width - paddingHorz - rowMaxWidth; //因为具有不考虑左边距,而原来的位置增加了左边距,因此 } break; - case MyMarginGravity_Horz_Fill: + case MyGravity_Horz_Between: { - //总宽度减去最大的宽度。再除以数量表示每个应该扩展的空间。最后一行无效。 - if (startIndex != sbs.count && count > 1) + //总宽度减去最大的宽度。再除以数量表示每个应该扩展的空间。最后一行无效(如果最后一行的数量和其他行的数量一样除外)。 + if ((startIndex != sbs.count || count == lsc.arrangedCount) && count > 1) { - addXFill = (selfSize.width - padding.left - padding.right - rowMaxWidth) / (count - 1); + addXFill = (selfSize.width - paddingHorz - rowMaxWidth) / (count - 1); } } break; @@ -205,14 +352,15 @@ - (void)calcVertLayoutGravity:(CGSize)selfSize rowMaxHeight:(CGFloat)rowMaxHeigh break; } - //处理内容拉伸的情况。 - if (self.arrangedCount == 0 && self.averageArrange) + //处理内容拉伸的情况。这里是只有内容约束布局才支持尺寸拉伸。 + if (lsc.arrangedCount == 0 && averageArrange) { + //不是最后一行。。 if (startIndex != sbs.count) { - addXFill = (selfSize.width - padding.left - padding.right - rowMaxWidth) / count; + addXFill = (selfSize.width - paddingHorz - rowMaxWidth) / count; } - + } } @@ -222,71 +370,98 @@ - (void)calcVertLayoutGravity:(CGSize)selfSize rowMaxHeight:(CGFloat)rowMaxHeigh { UIView *sbv = sbs[j]; - if (self.IntelligentBorderLine != nil) + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (!isEstimate && self.intelligentBorderline != nil) { if ([sbv isKindOfClass:[MyBaseLayout class]]) { MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) + if (!sbvl.notUseIntelligentBorderline) { - sbvl.leftBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.bottomBorderLine = nil; + sbvl.leadingBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.bottomBorderline = nil; + + //如果不是最后一行就画下面, + if (startIndex != sbs.count) + { + sbvl.bottomBorderline = self.intelligentBorderline; + } + + //如果不是最后一列就画右边, + if (j < startIndex - 1) + { + sbvl.trailingBorderline = self.intelligentBorderline; + } - if (j != startIndex - count) + //如果最后一行的最后一个没有满列数时 + if (j == sbs.count - 1 && lsc.arrangedCount != count ) { - sbvl.leftBorderLine = self.IntelligentBorderLine; + sbvl.trailingBorderline = self.intelligentBorderline; } - if (startIndex - count != 0) + //如果有垂直间距则不是第一行就画上 + if (vertSpace != 0 && startIndex - count != 0) { - sbvl.topBorderLine = self.IntelligentBorderLine; + sbvl.topBorderline = self.intelligentBorderline; } + //如果有水平间距则不是第一列就画左 + if (horzSpace != 0 && j != startIndex - count) + { + sbvl.leadingBorderline = self.intelligentBorderline; + } } } } - if ((amg != MyMarginGravity_None && amg != MyMarginGravity_Vert_Top) || addXPos != 0 || addXFill != 0) + MyGravity sbvVertAlignment = sbvsc.myAlignment & MyGravity_Horz_Mask; + if (sbvVertAlignment != MyGravity_None) + vertAlignment = sbvVertAlignment; + + if ((vertAlignment != MyGravity_None && vertAlignment != MyGravity_Vert_Top) || _myCGFloatNotEqual(addXPos, 0) || _myCGFloatNotEqual(addXFill, 0)) { - sbv.absPos.leftPos += addXPos; + sbvmyFrame.leading += addXPos; - if (self.arrangedCount == 0 && self.averageArrange) + //内容约束布局并且是拉伸尺寸。。 + if (lsc.arrangedCount == 0 && averageArrange) { //只拉伸宽度不拉伸间距 - sbv.absPos.width += addXFill; + sbvmyFrame.width += addXFill; if (j != startIndex - count) { - sbv.absPos.leftPos += addXFill * (j - (startIndex - count)); + sbvmyFrame.leading += addXFill * (j - (startIndex - count)); } } else { - //只拉伸间距 - sbv.absPos.leftPos += addXFill * (j - (startIndex - count)); + //其他的只拉伸间距 + sbvmyFrame.leading += addXFill * (j - (startIndex - count)); } - switch (amg) { - case MyMarginGravity_Vert_Center: + switch (vertAlignment) { + case MyGravity_Vert_Center: { - sbv.absPos.topPos += (rowMaxHeight - sbv.topPos.margin - sbv.bottomPos.margin - sbv.absPos.height) / 2; + sbvmyFrame.top += (rowMaxHeight - sbvsc.topPosInner.absVal - sbvsc.bottomPosInner.absVal - sbvmyFrame.height) / 2; } break; - case MyMarginGravity_Vert_Bottom: + case MyGravity_Vert_Bottom: { - sbv.absPos.topPos += rowMaxHeight - sbv.topPos.margin - sbv.bottomPos.margin - sbv.absPos.height; + sbvmyFrame.top += rowMaxHeight - sbvsc.topPosInner.absVal - sbvsc.bottomPosInner.absVal - sbvmyFrame.height; } break; - case MyMarginGravity_Vert_Fill: + case MyGravity_Vert_Fill: { - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rowMaxHeight - sbv.topPos.margin - sbv.bottomPos.margin sbvSize:sbv.absPos.frame.size selfLayoutSize:selfSize]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rowMaxHeight - sbvsc.topPosInner.absVal - sbvsc.bottomPosInner.absVal sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } break; default: @@ -294,65 +469,227 @@ - (void)calcVertLayoutGravity:(CGSize)selfSize rowMaxHeight:(CGFloat)rowMaxHeigh } } } + +} +- (void)myCalcHorzLayoutSinglelineAlignment:(CGSize)selfSize colMaxWidth:(CGFloat)colMaxWidth colMaxHeight:(CGFloat)colMaxHeight vertGravity:(MyGravity)vertGravity horzAlignment:(MyGravity)horzAlignment sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count vertSpace:(CGFloat)vertSpace horzSpace:(CGFloat)horzSpace isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc +{ + + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingVert = paddingTop + paddingBottom; + + CGFloat addYPos = 0; + CGFloat addYFill = 0; + + BOOL averageArrange = (vertGravity == MyGravity_Vert_Fill); + + if (!averageArrange || lsc.arrangedCount == 0) + { + switch (vertGravity) { + case MyGravity_Vert_Center: + { + addYPos = (selfSize.height - paddingVert - colMaxHeight) / 2; + } + break; + case MyGravity_Vert_Bottom: + { + addYPos = selfSize.height - paddingVert - colMaxHeight; + } + break; + case MyGravity_Vert_Between: + { + //总宽度减去最大的宽度。再除以数量表示每个应该扩展的空间。最后一行无效(如果数量和单行的数量相等除外)。 + if ((startIndex != sbs.count || count == lsc.arrangedCount) && count > 1) + { + addYFill = (selfSize.height - paddingVert - colMaxHeight) / (count - 1); + } + + } + default: + break; + } + + //处理内容拉伸的情况。 + if (lsc.arrangedCount == 0 && averageArrange) + { + if (startIndex != sbs.count) + { + addYFill = (selfSize.height - paddingVert - colMaxHeight) / count; + } + + } + + } + + + + + //将整行的位置进行调整。 + for (NSInteger j = startIndex - count; j < startIndex; j++) + { + UIView *sbv = sbs[j]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + + if (!isEstimate && self.intelligentBorderline != nil) + { + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + MyBaseLayout *sbvl = (MyBaseLayout*)sbv; + if (!sbvl.notUseIntelligentBorderline) + { + sbvl.leadingBorderline = nil; + sbvl.topBorderline = nil; + sbvl.trailingBorderline = nil; + sbvl.bottomBorderline = nil; + + + //如果不是最后一行就画下面, + if (j < startIndex - 1) + { + sbvl.bottomBorderline = self.intelligentBorderline; + } + + //如果不是最后一列就画右边, + if (startIndex != sbs.count ) + { + sbvl.trailingBorderline = self.intelligentBorderline; + + } + + //如果最后一行的最后一个没有满列数时 + if (j == sbs.count - 1 && lsc.arrangedCount != count ) + { + sbvl.bottomBorderline = self.intelligentBorderline; + } + + //如果有垂直间距则不是第一行就画上 + if (vertSpace != 0 && j != startIndex - count) + { + sbvl.topBorderline = self.intelligentBorderline; + } + + //如果有水平间距则不是第一列就画左 + if (horzSpace != 0 && startIndex - count != 0 ) + { + sbvl.leadingBorderline = self.intelligentBorderline; + + } + + + + } + } + } + + CGFloat sbvHorzAlignment = [self myConvertLeftRightGravityToLeadingTrailing:sbvsc.myAlignment & MyGravity_Vert_Mask]; + if (sbvHorzAlignment != MyGravity_None) + horzAlignment = sbvHorzAlignment; + + if ((horzAlignment != MyGravity_None && horzAlignment != MyGravity_Horz_Leading) || _myCGFloatNotEqual(addYPos, 0) || _myCGFloatNotEqual(addYFill, 0) ) + { + sbvmyFrame.top += addYPos; + + if (lsc.arrangedCount == 0 && averageArrange) + { + //只拉伸宽度不拉伸间距 + sbvmyFrame.height += addYFill; + + if (j != startIndex - count) + { + sbvmyFrame.top += addYFill * (j - (startIndex - count)); + + } + } + else + { + //只拉伸间距 + sbvmyFrame.top += addYFill * (j - (startIndex - count)); + } + + + switch (horzAlignment) { + case MyGravity_Horz_Center: + { + sbvmyFrame.leading += (colMaxWidth - sbvsc.leadingPosInner.absVal - sbvsc.trailingPosInner.absVal - sbvmyFrame.width) / 2; + + } + break; + case MyGravity_Horz_Trailing: + { + sbvmyFrame.leading += colMaxWidth - sbvsc.leadingPosInner.absVal - sbvsc.trailingPosInner.absVal - sbvmyFrame.width; + } + break; + case MyGravity_Horz_Fill: + { + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:colMaxWidth - sbvsc.leadingPosInner.absVal - sbvsc.trailingPosInner.absVal sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + } + break; + default: + break; + } + } + } } --(CGFloat)calcSingleLineSize:(NSArray*)sbs margin:(CGFloat)margin +-(CGFloat)myCalcSinglelineSize:(NSArray*)sbs space:(CGFloat)space { CGFloat size = 0; for (UIView *sbv in sbs) { - size += sbv.absPos.rightPos; + size += sbv.myFrame.trailing; if (sbv != sbs.lastObject) - size += margin; + size += space; } return size; } --(NSArray*)getAutoArrangeSubviews:(NSMutableArray*)sbs selfSize:(CGFloat)selfSize margin:(CGFloat)margin +-(NSArray*)myGetAutoArrangeSubviews:(NSMutableArray*)sbs selfSize:(CGFloat)selfSize space:(CGFloat)space { NSMutableArray *retArray = [NSMutableArray arrayWithCapacity:sbs.count]; - NSMutableArray *bestSingleLineArray = [NSMutableArray arrayWithCapacity:sbs.count /2]; + NSMutableArray *bestSinglelineArray = [NSMutableArray arrayWithCapacity:sbs.count /2]; while (sbs.count) { - [self calcAutoArrangeSingleLineSubviews:sbs + [self myCalcAutoArrangeSinglelineSubviews:sbs index:0 calcArray:@[] selfSize:selfSize - margin:margin - bestSingleLineArray:bestSingleLineArray]; + space:space + bestSinglelineArray:bestSinglelineArray]; - [retArray addObjectsFromArray:bestSingleLineArray]; + [retArray addObjectsFromArray:bestSinglelineArray]; - [bestSingleLineArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * stop) { + [bestSinglelineArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * stop) { [sbs removeObject:obj]; }]; - [bestSingleLineArray removeAllObjects]; + [bestSinglelineArray removeAllObjects]; } return retArray; } --(void)calcAutoArrangeSingleLineSubviews:(NSMutableArray*)sbs - index:(NSInteger)index - calcArray:(NSArray*)calcArray -selfSize:(CGFloat)selfSize - margin:(CGFloat)margin -bestSingleLineArray:(NSMutableArray*)bestSingleLineArray +-(void)myCalcAutoArrangeSinglelineSubviews:(NSMutableArray*)sbs + index:(NSInteger)index + calcArray:(NSArray*)calcArray + selfSize:(CGFloat)selfSize + space:(CGFloat)space + bestSinglelineArray:(NSMutableArray*)bestSinglelineArray { if (index >= sbs.count) { - CGFloat s1 = [self calcSingleLineSize:calcArray margin:margin]; - CGFloat s2 = [self calcSingleLineSize:bestSingleLineArray margin:margin]; - if (fabs(selfSize - s1) < fabs(selfSize - s2) && s1 <= selfSize) + CGFloat s1 = [self myCalcSinglelineSize:calcArray space:space]; + CGFloat s2 = [self myCalcSinglelineSize:bestSinglelineArray space:space]; + if (fabs(selfSize - s1) < fabs(selfSize - s2) && /*s1 <= selfSize*/ _myCGFloatLessOrEqual(s1, selfSize) ) { - [bestSingleLineArray setArray:calcArray]; + [bestSinglelineArray setArray:calcArray]; } return; @@ -365,141 +702,202 @@ -(void)calcAutoArrangeSingleLineSubviews:(NSMutableArray*)sbs NSMutableArray *calcArray2 = [NSMutableArray arrayWithArray:calcArray]; [calcArray2 addObject:sbs[i]]; - CGFloat s1 = [self calcSingleLineSize:calcArray2 margin:margin]; - if (s1 <= selfSize) + CGFloat s1 = [self myCalcSinglelineSize:calcArray2 space:space]; + if (_myCGFloatLessOrEqual(s1, selfSize)) { - CGFloat s2 = [self calcSingleLineSize:bestSingleLineArray margin:margin]; + CGFloat s2 = [self myCalcSinglelineSize:bestSinglelineArray space:space]; if (fabs(selfSize - s1) < fabs(selfSize - s2)) { - [bestSingleLineArray setArray:calcArray2]; + [bestSinglelineArray setArray:calcArray2]; } - if (s1 == selfSize) + if (_myCGFloatEqual(s1, selfSize)) break; - [self calcAutoArrangeSingleLineSubviews:sbs + [self myCalcAutoArrangeSinglelineSubviews:sbs index:i + 1 calcArray:calcArray2 selfSize:selfSize - margin:margin - bestSingleLineArray:bestSingleLineArray]; + space:space + bestSinglelineArray:bestSinglelineArray]; } else break; } - + } --(CGRect)layoutSubviewsForVertContent:(CGRect)selfRect sbs:(NSMutableArray*)sbs +-(CGSize)myLayoutSubviewsForVertContent:(CGSize)selfSize sbs:(NSMutableArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc { - UIEdgeInsets padding = self.padding; - CGFloat xPos = padding.left; - CGFloat yPos = padding.top; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + + CGFloat xPos = paddingLeading; + CGFloat yPos = paddingTop; CGFloat rowMaxHeight = 0; //某一行的最高值。 CGFloat rowMaxWidth = 0; //某一行的最宽值 - MyMarginGravity mgvert = self.gravity & MyMarginGravity_Horz_Mask; - MyMarginGravity mghorz = self.gravity & MyMarginGravity_Vert_Mask; - MyMarginGravity amgvert = self.arrangedGravity & MyMarginGravity_Horz_Mask; + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + MyGravity vertAlign = lsc.arrangedGravity & MyGravity_Horz_Mask; + + //支持浮动水平间距。 + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat horzSpace = lsc.subviewHSpace; + CGFloat subviewSize = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).subviewSize; + if (subviewSize != 0) + { + + CGFloat minSpace = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).minSpace; + CGFloat maxSpace = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).maxSpace; + + NSInteger rowCount = floor((selfSize.width - paddingHorz + minSpace) / (subviewSize + minSpace)); + if (rowCount > 1) + { + horzSpace = (selfSize.width - paddingHorz - subviewSize * rowCount)/(rowCount - 1); + if (horzSpace > maxSpace) + { + horzSpace = maxSpace; + + subviewSize = (selfSize.width - paddingHorz - horzSpace * (rowCount - 1)) / rowCount; + + } + } + } + - if (self.autoArrange) + if (lsc.autoArrange) { //计算出每个子视图的宽度。 for (UIView* sbv in sbs) { - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + +#ifdef DEBUG + //约束异常:垂直流式布局设置autoArrange为YES时,子视图不能将weight设置为非0. + NSCAssert(sbvsc.weight == 0, @"Constraint exception!! vertical flow layout:%@ 's subview:%@ can't set weight when the autoArrange set to YES",self, sbv); +#endif + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - //暂时把宽度存放sbv.absPos.rightPos上。因为浮动布局来说这个属性无用。 - sbv.absPos.rightPos = leftMargin + rect.size.width + rightMargin; - if (sbv.absPos.rightPos > selfRect.size.width - self.leftPadding - self.rightPadding) - sbv.absPos.rightPos = selfRect.size.width - self.leftPadding - self.rightPadding; + //暂时把宽度存放sbv.myFrame.trailing上。因为浮动布局来说这个属性无用。 + sbvmyFrame.trailing = leadingSpace + rect.size.width + trailingSpace; + if (sbvmyFrame.trailing > selfSize.width - paddingHorz) + sbvmyFrame.trailing = selfSize.width - paddingHorz; } - [sbs setArray:[self getAutoArrangeSubviews:sbs selfSize:selfRect.size.width - self.leftPadding - self.rightPadding margin:self.subviewHorzMargin]]; + [sbs setArray:[self myGetAutoArrangeSubviews:sbs selfSize:selfSize.width - paddingHorz space:horzSpace]]; } + NSMutableIndexSet *arrangeIndexSet = [NSMutableIndexSet new]; NSInteger arrangedIndex = 0; NSInteger i = 0; for (; i < sbs.count; i++) { UIView *sbv = sbs[i]; - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (subviewSize != 0) + rect.size.width = subviewSize; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; - - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + [self mySetSubviewRelativeDimeSize:sbvsc.heightSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - //如果高度是浮动的则需要调整高度。 - if (sbv.isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + if (sbvsc.weight != 0) + { + //如果过了,则表示当前的剩余空间为0了,所以就按新的一行来算。。 + CGFloat floatWidth = selfSize.width - paddingHorz - rowMaxWidth; + if (_myCGFloatLessOrEqual(floatWidth, 0)) + { + floatWidth += rowMaxWidth; + arrangedIndex = 0; + } + + if (arrangedIndex != 0) + floatWidth -= horzSpace; + + rect.size.width = (floatWidth + sbvsc.widthSizeInner.addVal) * sbvsc.weight - leadingSpace - trailingSpace; + + } - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; - //计算xPos的值加上leftMargin + rect.size.width + rightMargin + self.subviewHorzMargin 的值要小于整体的宽度。 - CGFloat place = xPos + leftMargin + rect.size.width + rightMargin; - if (arrangedIndex != 0) - place += self.subviewHorzMargin; - place += padding.right; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - //sbv所占据的宽度要超过了视图的整体宽度,因此需要换行。但是如果arrangedIndex为0的话表示这个控件的整行的宽度和布局视图保持一致。 - if (place > selfRect.size.width) + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width ]; + + + //如果高度是浮动的则需要调整高度。 + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + //计算xPos的值加上leadingSpace + rect.size.width + trailingSpace 的值要小于整体的宽度。 + CGFloat place = xPos + leadingSpace + rect.size.width + trailingSpace; + if (arrangedIndex != 0) + place += horzSpace; + place += paddingTrailing; + + //sbv所占据的宽度要超过了视图的整体宽度,因此需要换行。但是如果arrangedIndex为0的话表示这个控件的整行的宽度和布局视图保持一致。 + if (place - selfSize.width > 0.0001) { - xPos = padding.left; - yPos += self.subviewVertMargin; + xPos = paddingLeading; + yPos += vertSpace; yPos += rowMaxHeight; - - + + + [arrangeIndexSet addIndex:i - arrangedIndex]; //计算每行的gravity情况。 - [self calcVertLayoutGravity:selfRect.size rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth mg:mghorz amg:amgvert sbs:sbs startIndex:i count:arrangedIndex]; - + [self myCalcVertLayoutSinglelineAlignment:selfSize rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth horzGravity:horzGravity vertAlignment:vertAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; + //计算单独的sbv的宽度是否大于整体的宽度。如果大于则缩小宽度。 - if (leftMargin + rightMargin + rect.size.width > selfRect.size.width - padding.left - padding.right) + if (leadingSpace + trailingSpace + rect.size.width > selfSize.width - paddingHorz) { - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:selfRect.size.width - padding.left - padding.right - leftMargin - rightMargin sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:selfSize.width - paddingHorz - leadingSpace - trailingSpace sbvSize:rect.size selfLayoutSize:selfSize]; - if (sbv.isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; } } @@ -511,452 +909,623 @@ -(CGRect)layoutSubviewsForVertContent:(CGRect)selfRect sbs:(NSMutableArray*)sbs } if (arrangedIndex != 0) - xPos += self.subviewHorzMargin; + xPos += horzSpace; - rect.origin.x = xPos + leftMargin; - rect.origin.y = yPos + topMargin; - xPos += leftMargin + rect.size.width + rightMargin; + rect.origin.x = xPos + leadingSpace; + rect.origin.y = yPos + topSpace; + xPos += leadingSpace + rect.size.width + trailingSpace; - if (rowMaxHeight < topMargin + bottomMargin + rect.size.height) - rowMaxHeight = topMargin + bottomMargin + rect.size.height; + if (rowMaxHeight < topSpace + bottomSpace + rect.size.height) + rowMaxHeight = topSpace + bottomSpace + rect.size.height; - if (rowMaxWidth < (xPos - padding.left)) - rowMaxWidth = (xPos - padding.left); - - - - sbv.absPos.frame = rect; + if (rowMaxWidth < (xPos - paddingLeading)) + rowMaxWidth = (xPos - paddingLeading); + + + + sbvmyFrame.frame = rect; arrangedIndex++; - - + + } //最后一行 - [self calcVertLayoutGravity:selfRect.size rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth mg:mghorz amg:amgvert sbs:sbs startIndex:i count:arrangedIndex]; - + [arrangeIndexSet addIndex:i - arrangedIndex]; + + [self myCalcVertLayoutSinglelineAlignment:selfSize rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth horzGravity:horzGravity vertAlignment:vertAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; + - if (self.wrapContentHeight) - selfRect.size.height = yPos + padding.bottom + rowMaxHeight; + if (lsc.wrapContentHeight) + selfSize.height = yPos + paddingBottom + rowMaxHeight; else { CGFloat addYPos = 0; - if (mgvert == MyMarginGravity_Vert_Center) + CGFloat between = 0; + CGFloat fill = 0; + + if (vertGravity == MyGravity_Vert_Center) + { + addYPos = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / 2; + } + else if (vertGravity == MyGravity_Vert_Bottom) { - addYPos = (selfRect.size.height - padding.bottom - rowMaxHeight - yPos) / 2; + addYPos = selfSize.height - paddingBottom - rowMaxHeight - yPos; } - else if (mgvert == MyMarginGravity_Vert_Bottom) + else if (vertGravity == MyGravity_Vert_Fill) { - addYPos = selfRect.size.height - padding.bottom - rowMaxHeight - yPos; + if (arrangeIndexSet.count > 0) + fill = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / arrangeIndexSet.count; + } + else if (vertGravity == MyGravity_Vert_Between) + { + if (arrangeIndexSet.count > 1) + between = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / (arrangeIndexSet.count - 1); } - if (addYPos != 0) + if (addYPos != 0 || between != 0 || fill != 0) { + int line = 0; + NSUInteger lastIndex = 0; for (int i = 0; i < sbs.count; i++) { UIView *sbv = sbs[i]; - sbv.absPos.topPos += addYPos; + MyFrame *sbvmyFrame = sbv.myFrame; + + sbvmyFrame.top += addYPos; + + //找到行的最初索引。 + NSUInteger index = [arrangeIndexSet indexLessThanOrEqualToIndex:i]; + if (lastIndex != index) + { + lastIndex = index; + line ++; + } + + sbvmyFrame.height += fill; + sbvmyFrame.top += fill * line; + + sbvmyFrame.top += between * line; + } } } - return selfRect; + return selfSize; } --(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSMutableArray*)sbs +-(CGSize)myLayoutSubviewsForVert:(CGSize)selfSize sbs:(NSMutableArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc { - UIEdgeInsets padding = self.padding; - NSInteger arrangedCount = self.arrangedCount; - CGFloat xPos = padding.left; - CGFloat yPos = padding.top; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + + NSInteger arrangedCount = lsc.arrangedCount; + CGFloat xPos = paddingLeading; + CGFloat yPos = paddingTop; CGFloat rowMaxHeight = 0; //某一行的最高值。 CGFloat rowMaxWidth = 0; //某一行的最宽值 - CGFloat maxWidth = padding.left; //全部行的最宽值 - MyMarginGravity mgvert = self.gravity & MyMarginGravity_Horz_Mask; - MyMarginGravity mghorz = self.gravity & MyMarginGravity_Vert_Mask; - MyMarginGravity amgvert = self.arrangedGravity & MyMarginGravity_Horz_Mask; + CGFloat maxWidth = paddingLeading; //全部行的最宽值 + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + MyGravity vertAlign = lsc.arrangedGravity & MyGravity_Horz_Mask; + + + + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat horzSpace = lsc.subviewHSpace; + + //判断父滚动视图是否分页滚动 + BOOL isPagingScroll = (self.superview != nil && + [self.superview isKindOfClass:[UIScrollView class]] && + ((UIScrollView*)self.superview).isPagingEnabled); + CGFloat pagingItemHeight = 0; + CGFloat pagingItemWidth = 0; + BOOL isVertPaging = NO; + BOOL isHorzPaging = NO; + if (lsc.pagedCount > 0 && self.superview != nil) + { + NSInteger rows = lsc.pagedCount / arrangedCount; //每页的行数。 + + //对于垂直流式布局来说,要求要有明确的宽度。因此如果我们启用了分页又设置了宽度包裹时则我们的分页是从左到右的排列。否则分页是从上到下的排列。 + if (lsc.wrapContentWidth) + { + isHorzPaging = YES; + if (isPagingScroll) + pagingItemWidth = (CGRectGetWidth(self.superview.bounds) - paddingHorz - (arrangedCount - 1) * horzSpace ) / arrangedCount; + else + pagingItemWidth = (CGRectGetWidth(self.superview.bounds) - paddingLeading - arrangedCount * horzSpace ) / arrangedCount; + + pagingItemHeight = (selfSize.height - paddingVert - (rows - 1) * vertSpace) / rows; + } + else + { + isVertPaging = YES; + pagingItemWidth = (selfSize.width - paddingHorz - (arrangedCount - 1) * horzSpace) / arrangedCount; + //分页滚动时和非分页滚动时的高度计算是不一样的。 + if (isPagingScroll) + pagingItemHeight = (CGRectGetHeight(self.superview.bounds) - paddingVert - (rows - 1) * vertSpace) / rows; + else + pagingItemHeight = (CGRectGetHeight(self.superview.bounds) - paddingTop - rows * vertSpace) / rows; + + } + + } + - CGFloat averageWidth = (selfRect.size.width - padding.left - padding.right - (arrangedCount - 1) * self.subviewHorzMargin) / arrangedCount; + BOOL averageArrange = (horzGravity == MyGravity_Horz_Fill); NSInteger arrangedIndex = 0; NSInteger i = 0; + CGFloat rowTotalWeight = 0; + CGFloat rowTotalFixedWidth = 0; + for (; i < sbs.count; i++) + { + UIView *sbv = sbs[i]; + + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (arrangedIndex >= arrangedCount) + { + arrangedIndex = 0; + + if (rowTotalWeight != 0 && !averageArrange) + { + [self myCalcVertLayoutSinglelineWeight:selfSize totalFloatWidth:selfSize.width - paddingHorz - rowTotalFixedWidth totalWeight:rowTotalWeight sbs:sbs startIndex:i count:arrangedCount]; + } + + rowTotalWeight = 0; + rowTotalFixedWidth = 0; + + } + + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; + + + if (sbvsc.weight != 0) + { + + rowTotalWeight += sbvsc.weight; + } + else + { + if (pagingItemWidth != 0) + rect.size.width = pagingItemWidth; + + if (sbvsc.widthSizeInner.dimeNumVal != nil && !averageArrange) + rect.size.width = sbvsc.widthSizeInner.measure; + + + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; + + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + + rowTotalFixedWidth += rect.size.width; + } + + rowTotalFixedWidth += leadingSpace + trailingSpace; + + if (arrangedIndex != (arrangedCount - 1)) + rowTotalFixedWidth += horzSpace; + + + sbvmyFrame.frame = rect; + + arrangedIndex++; + + } + + //最后一行。 + if (rowTotalWeight != 0 && !averageArrange) + { + if (arrangedIndex < arrangedCount) + rowTotalFixedWidth -= horzSpace; + + [self myCalcVertLayoutSinglelineWeight:selfSize totalFloatWidth:selfSize.width - paddingHorz - rowTotalFixedWidth totalWeight:rowTotalWeight sbs:sbs startIndex:i count:arrangedIndex]; + } + + + CGFloat pageWidth = 0; //页宽。 + CGFloat averageWidth = (selfSize.width - paddingHorz - (arrangedCount - 1) * horzSpace) / arrangedCount; + arrangedIndex = 0; + i = 0; for (; i < sbs.count; i++) { UIView *sbv = sbs[i]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; //新的一行 if (arrangedIndex >= arrangedCount) { arrangedIndex = 0; - xPos = padding.left; yPos += rowMaxHeight; - yPos += self.subviewVertMargin; + yPos += vertSpace; + + //分别处理水平分页和垂直分页。 + if (isHorzPaging) + { + if (i % lsc.pagedCount == 0) + { + pageWidth += CGRectGetWidth(self.superview.bounds); + + if (!isPagingScroll) + pageWidth -= paddingLeading; + + yPos = paddingTop; + } + + } + + if (isVertPaging) + { + //如果是分页滚动则要多添加垂直间距。 + if (i % lsc.pagedCount == 0) + { + + if (isPagingScroll) + { + yPos -= vertSpace; + yPos += paddingVert; + + } + } + } + + + xPos = paddingLeading + pageWidth; + //计算每行的gravity情况。 - [self calcVertLayoutGravity:selfRect.size rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth mg:mghorz amg:amgvert sbs:sbs startIndex:i count:arrangedCount]; + [self myCalcVertLayoutSinglelineAlignment:selfSize rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth horzGravity:horzGravity vertAlignment:vertAlign sbs:sbs startIndex:i count:arrangedCount vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; rowMaxHeight = 0; rowMaxWidth = 0; } - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; - - - BOOL isFlexedHeight = sbv.isFlexedHeight && !sbv.heightDime.isMatchParent; - if (self.averageArrange) - rect.size.width = averageWidth - leftMargin - rightMargin; + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; + BOOL isFlexedHeight = sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.heightSizeInner.dimeRelaVal.view != self; - if (sbv.widthDime.dimeNumVal != nil && !self.averageArrange) - rect.size.width = sbv.widthDime.measure; + if (pagingItemHeight != 0) + rect.size.height = pagingItemHeight; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; + + if (averageArrange) + { + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:averageWidth - leadingSpace - trailingSpace sbvSize:rect.size selfLayoutSize:selfSize]; + } - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; - - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; - if (sbv.heightDime.dimeRelaVal == sbv.widthDime) - rect.size.height = rect.size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + [self mySetSubviewRelativeDimeSize:sbvsc.heightSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; //如果高度是浮动的则需要调整高度。 if (isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; - - rect.origin.x = xPos + leftMargin; - rect.origin.y = yPos + topMargin; - xPos += leftMargin + rect.size.width + rightMargin; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + rect.origin.x = xPos + leadingSpace; + rect.origin.y = yPos + topSpace; + xPos += leadingSpace + rect.size.width + trailingSpace; if (arrangedIndex != (arrangedCount - 1)) - xPos += self.subviewHorzMargin; - + xPos += horzSpace; + - if (rowMaxHeight < topMargin + bottomMargin + rect.size.height) - rowMaxHeight = topMargin + bottomMargin + rect.size.height; + if (rowMaxHeight < topSpace + bottomSpace + rect.size.height) + rowMaxHeight = topSpace + bottomSpace + rect.size.height; - if (rowMaxWidth < (xPos - padding.left)) - rowMaxWidth = (xPos - padding.left); + if (rowMaxWidth < (xPos - paddingLeading)) + rowMaxWidth = (xPos - paddingLeading); if (maxWidth < xPos) maxWidth = xPos; - sbv.absPos.frame = rect; + sbvmyFrame.frame = rect; arrangedIndex++; } //最后一行 - [self calcVertLayoutGravity:selfRect.size rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth mg:mghorz amg:amgvert sbs:sbs startIndex:i count:arrangedIndex]; - - if (self.wrapContentHeight) - selfRect.size.height = yPos + padding.bottom + rowMaxHeight; + [self myCalcVertLayoutSinglelineAlignment:selfSize rowMaxHeight:rowMaxHeight rowMaxWidth:rowMaxWidth horzGravity:horzGravity vertAlignment:vertAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; + + if (lsc.wrapContentHeight) + { + selfSize.height = yPos + paddingBottom + rowMaxHeight; + + //只有在父视图为滚动视图,且开启了分页滚动时才会扩充具有包裹设置的布局视图的宽度。 + if (isVertPaging && isPagingScroll) + { + //算出页数来。如果包裹计算出来的宽度小于指定页数的宽度,因为要分页滚动所以这里会扩充布局的宽度。 + NSInteger totalPages = floor((sbs.count + lsc.pagedCount - 1.0 ) / lsc.pagedCount); + if (selfSize.height < totalPages * CGRectGetHeight(self.superview.bounds)) + selfSize.height = totalPages * CGRectGetHeight(self.superview.bounds); + } + + } else { CGFloat addYPos = 0; - if (mgvert == MyMarginGravity_Vert_Center) + CGFloat between = 0; + CGFloat fill = 0; + int arranges = floor((sbs.count + arrangedCount - 1.0) / arrangedCount); + + if (vertGravity == MyGravity_Vert_Center) + { + addYPos = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / 2; + } + else if (vertGravity == MyGravity_Vert_Bottom) + { + addYPos = selfSize.height - paddingBottom - rowMaxHeight - yPos; + } + else if (vertGravity == MyGravity_Vert_Fill) { - addYPos = (selfRect.size.height - padding.bottom - rowMaxHeight - yPos) / 2; + if (arranges > 0) + fill = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / arranges; } - else if (mgvert == MyMarginGravity_Vert_Bottom) + else if (vertGravity == MyGravity_Vert_Between) { - addYPos = selfRect.size.height - padding.bottom - rowMaxHeight - yPos; + + if (arranges > 1) + between = (selfSize.height - paddingBottom - rowMaxHeight - yPos) / (arranges - 1); } - if (addYPos != 0) + + if (addYPos != 0 || between != 0 || fill != 0) { for (int i = 0; i < sbs.count; i++) { UIView *sbv = sbs[i]; - sbv.absPos.topPos += addYPos; + MyFrame *sbvmyFrame = sbv.myFrame; + + int lines = i / arrangedCount; + sbvmyFrame.height += fill; + sbvmyFrame.top += fill * lines; + + sbvmyFrame.top += addYPos; + + sbvmyFrame.top += between * lines; + } } - + } - if (self.wrapContentWidth && !self.averageArrange) - selfRect.size.width = maxWidth + padding.right; - + if (lsc.wrapContentWidth && !averageArrange) + { + selfSize.width = maxWidth + paddingTrailing; + + //只有在父视图为滚动视图,且开启了分页滚动时才会扩充具有包裹设置的布局视图的宽度。 + if (isHorzPaging && isPagingScroll) + { + //算出页数来。如果包裹计算出来的宽度小于指定页数的宽度,因为要分页滚动所以这里会扩充布局的宽度。 + NSInteger totalPages = floor((sbs.count + lsc.pagedCount - 1.0 ) / lsc.pagedCount); + if (selfSize.width < totalPages * CGRectGetWidth(self.superview.bounds)) + selfSize.width = totalPages * CGRectGetWidth(self.superview.bounds); + } + + } - return selfRect; + return selfSize; } -- (void)calcHorzLayoutGravity:(CGSize)selfSize colMaxWidth:(CGFloat)colMaxWidth colMaxHeight:(CGFloat)colMaxHeight mg:(MyMarginGravity)mg amg:(MyMarginGravity)amg sbs:(NSArray *)sbs startIndex:(NSInteger)startIndex count:(NSInteger)count -{ - - CGFloat addYPos = 0; - CGFloat addYFill = 0; - UIEdgeInsets padding = self.padding; - if (!self.averageArrange || self.arrangedCount == 0) - { - switch (mg) { - case MyMarginGravity_Vert_Center: - { - addYPos = (selfSize.height - padding.top - padding.bottom - colMaxHeight) / 2; - } - break; - case MyMarginGravity_Vert_Bottom: - { - addYPos = selfSize.height - padding.top - padding.bottom - colMaxHeight; - } - break; - case MyMarginGravity_Vert_Fill: - { - //总宽度减去最大的宽度。再除以数量表示每个应该扩展的空间。最后一行无效。 - if (startIndex != sbs.count && count > 1) - { - addYFill = (selfSize.height - padding.top - padding.bottom - colMaxHeight) / (count - 1); - } - } - default: - break; - } - - //处理内容拉伸的情况。 - if (self.arrangedCount == 0 && self.averageArrange) - { - if (startIndex != sbs.count) - { - addYFill = (selfSize.height - padding.top - padding.bottom - colMaxHeight) / count; - } - - } - } - +-(CGSize)myLayoutSubviewsForHorzContent:(CGSize)selfSize sbs:(NSMutableArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc +{ + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingVert = paddingTop + paddingBottom; + + CGFloat xPos = paddingLeading; + CGFloat yPos = paddingTop; + CGFloat colMaxWidth = 0; //某一列的最宽值。 + CGFloat colMaxHeight = 0; //某一列的最高值 + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + MyGravity horzAlign = [self myConvertLeftRightGravityToLeadingTrailing:lsc.arrangedGravity & MyGravity_Vert_Mask]; + - //将整行的位置进行调整。 - for (NSInteger j = startIndex - count; j < startIndex; j++) + //支持浮动垂直间距。 + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat horzSpace = lsc.subviewHSpace; + CGFloat subviewSize = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).subviewSize; + if (subviewSize != 0) { - UIView *sbv = sbs[j]; - if (self.IntelligentBorderLine != nil) + CGFloat minSpace = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).minSpace; + CGFloat maxSpace = ((MyFlowLayoutViewSizeClass*)self.myCurrentSizeClass).maxSpace; + NSInteger rowCount = floor((selfSize.height - paddingVert + minSpace) / (subviewSize + minSpace)); + if (rowCount > 1) { - if ([sbv isKindOfClass:[MyBaseLayout class]]) + vertSpace = (selfSize.height - paddingVert - subviewSize * rowCount)/(rowCount - 1); + if (vertSpace > maxSpace) { - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) - { - sbvl.leftBorderLine = nil; - sbvl.topBorderLine = nil; - sbvl.rightBorderLine = nil; - sbvl.bottomBorderLine = nil; - - if (j != startIndex - count) - { - sbvl.topBorderLine = self.IntelligentBorderLine; - } - - if (startIndex - count != 0) - { - sbvl.leftBorderLine = self.IntelligentBorderLine; - } - - - } - } - } - - - if ((amg != MyMarginGravity_None && amg != MyMarginGravity_Horz_Left) || addYPos != 0 || addYFill != 0) - { - sbv.absPos.topPos += addYPos; - - if (self.arrangedCount == 0 && self.averageArrange) - { - //只拉伸宽度不拉伸间距 - sbv.absPos.height += addYFill; + vertSpace = maxSpace; + + subviewSize = (selfSize.height - paddingVert - vertSpace * (rowCount - 1)) / rowCount; - if (j != startIndex - count) - { - sbv.absPos.topPos += addYFill * (j - (startIndex - count)); - - } - } - else - { - //只拉伸间距 - sbv.absPos.topPos += addYFill * (j - (startIndex - count)); - } - - - switch (amg) { - case MyMarginGravity_Horz_Center: - { - sbv.absPos.leftPos += (colMaxWidth - sbv.leftPos.margin - sbv.rightPos.margin - sbv.absPos.width) / 2; - - } - break; - case MyMarginGravity_Horz_Right: - { - sbv.absPos.leftPos += colMaxWidth - sbv.leftPos.margin - sbv.rightPos.margin - sbv.absPos.width; - } - break; - case MyMarginGravity_Horz_Fill: - { - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:colMaxWidth - sbv.leftPos.margin - sbv.rightPos.margin sbvSize:sbv.absPos.frame.size selfLayoutSize:selfSize]; - } - break; - default: - break; } } } -} - - --(CGRect)layoutSubviewsForHorzContent:(CGRect)selfRect sbs:(NSMutableArray*)sbs -{ - - UIEdgeInsets padding = self.padding; - CGFloat xPos = padding.left; - CGFloat yPos = padding.top; - CGFloat colMaxWidth = 0; //某一列的最宽值。 - CGFloat colMaxHeight = 0; //某一列的最高值 - - MyMarginGravity mgvert = self.gravity & MyMarginGravity_Horz_Mask; - MyMarginGravity mghorz = self.gravity & MyMarginGravity_Vert_Mask; - MyMarginGravity amghorz = self.arrangedGravity & MyMarginGravity_Vert_Mask; - if (self.autoArrange) + if (lsc.autoArrange) { //计算出每个子视图的宽度。 for (UIView* sbv in sbs) { - - CGFloat topMargin = sbv.topPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; +#ifdef DEBUG + //约束异常:水平流式布局设置autoArrange为YES时,子视图不能将weight设置为非0. + NSCAssert(sbvsc.weight == 0, @"Constraint exception!! horizontal flow layout:%@ 's subview:%@ can't set weight when the autoArrange set to YES",self, sbv); +#endif - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + [self mySetSubviewRelativeDimeSize:sbvsc.heightSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; //如果高度是浮动的则需要调整高度。 - if (sbv.isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; } - - //暂时把宽度存放sbv.absPos.rightPos上。因为浮动布局来说这个属性无用。 - sbv.absPos.rightPos = topMargin + rect.size.height + bottomMargin; - if (sbv.absPos.rightPos > selfRect.size.height - self.topPadding - self.bottomPadding) - sbv.absPos.rightPos = selfRect.size.height - self.topPadding - self.bottomPadding; + + //暂时把宽度存放sbv.myFrame.trailing上。因为浮动布局来说这个属性无用。 + sbvmyFrame.trailing = topSpace + rect.size.height + bottomSpace; + if (sbvmyFrame.trailing > selfSize.height - paddingVert) + sbvmyFrame.trailing = selfSize.height - paddingVert; } - [sbs setArray:[self getAutoArrangeSubviews:sbs selfSize:selfRect.size.height - self.topPadding - self.bottomPadding margin:self.subviewVertMargin]]; + [sbs setArray:[self myGetAutoArrangeSubviews:sbs selfSize:selfSize.height - paddingVert space:vertSpace]]; } - + + NSMutableIndexSet *arrangeIndexSet = [NSMutableIndexSet new]; NSInteger arrangedIndex = 0; NSInteger i = 0; for (; i < sbs.count; i++) { UIView *sbv = sbs[i]; - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + [self mySetSubviewRelativeDimeSize:sbvsc.heightSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; - - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (subviewSize != 0) + rect.size.height = subviewSize; + + + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + + if (sbvsc.weight != 0) + { + //如果过了,则表示当前的剩余空间为0了,所以就按新的一行来算。。 + CGFloat floatHeight = selfSize.height - paddingVert - colMaxHeight; + if (_myCGFloatLessOrEqual(floatHeight, 0)) + { + floatHeight += colMaxHeight; + arrangedIndex = 0; + } + + if (arrangedIndex != 0) + floatHeight -= vertSpace; + + rect.size.height = (floatHeight + sbvsc.heightSizeInner.addVal) * sbvsc.weight - topSpace - bottomSpace; + + } + + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height ]; + + + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; //如果高度是浮动的则需要调整高度。 - if (sbv.isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; } - //计算yPos的值加上topMargin + rect.size.height + bottomMargin + self.subviewVertMargin 的值要小于整体的宽度。 - CGFloat place = yPos + topMargin + rect.size.height + bottomMargin; + //计算yPos的值加上topSpace + rect.size.height + bottomSpace的值要小于整体的高度。 + CGFloat place = yPos + topSpace + rect.size.height + bottomSpace; if (arrangedIndex != 0) - place += self.subviewVertMargin; - place += padding.bottom; + place += vertSpace; + place += paddingBottom; //sbv所占据的宽度要超过了视图的整体宽度,因此需要换行。但是如果arrangedIndex为0的话表示这个控件的整行的宽度和布局视图保持一致。 - if (place > selfRect.size.height) + if (place - selfSize.height > 0.0001) { - yPos = padding.top; - xPos += self.subviewHorzMargin; + yPos = paddingTop; + xPos += horzSpace; xPos += colMaxWidth; //计算每行的gravity情况。 - [self calcHorzLayoutGravity:selfRect.size colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight mg:mgvert amg:amghorz sbs:sbs startIndex:i count:arrangedIndex]; + [arrangeIndexSet addIndex:i - arrangedIndex]; + [self myCalcHorzLayoutSinglelineAlignment:selfSize colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight vertGravity:vertGravity horzAlignment:horzAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; //计算单独的sbv的高度是否大于整体的高度。如果大于则缩小高度。 - if (topMargin + bottomMargin + rect.size.height > selfRect.size.height - padding.top - padding.bottom) + if (topSpace + bottomSpace + rect.size.height > selfSize.height - paddingVert) { - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:selfRect.size.height - padding.top - padding.bottom - topMargin - bottomMargin sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:selfSize.height - paddingVert - topSpace - bottomSpace sbvSize:rect.size selfLayoutSize:selfSize]; } colMaxWidth = 0; @@ -966,22 +1535,22 @@ -(CGRect)layoutSubviewsForHorzContent:(CGRect)selfRect sbs:(NSMutableArray*)sbs } if (arrangedIndex != 0) - yPos += self.subviewVertMargin; + yPos += vertSpace; - rect.origin.x = xPos + leftMargin; - rect.origin.y = yPos + topMargin; - yPos += topMargin + rect.size.height + bottomMargin; + rect.origin.x = xPos + leadingSpace; + rect.origin.y = yPos + topSpace; + yPos += topSpace + rect.size.height + bottomSpace; - if (colMaxWidth < leftMargin + rightMargin + rect.size.width) - colMaxWidth = leftMargin + rightMargin + rect.size.width; + if (colMaxWidth < leadingSpace + trailingSpace + rect.size.width) + colMaxWidth = leadingSpace + trailingSpace + rect.size.width; - if (colMaxHeight < (yPos - padding.top)) - colMaxHeight = (yPos - padding.top); + if (colMaxHeight < (yPos - paddingTop)) + colMaxHeight = (yPos - paddingTop); - sbv.absPos.frame = rect; + sbvmyFrame.frame = rect; arrangedIndex++; @@ -990,135 +1559,327 @@ -(CGRect)layoutSubviewsForHorzContent:(CGRect)selfRect sbs:(NSMutableArray*)sbs } //最后一行 - [self calcHorzLayoutGravity:selfRect.size colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight mg:mgvert amg:amghorz sbs:sbs startIndex:i count:arrangedIndex]; + [arrangeIndexSet addIndex:i - arrangedIndex]; + [self myCalcHorzLayoutSinglelineAlignment:selfSize colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight vertGravity:vertGravity horzAlignment:horzAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; - if (self.wrapContentWidth) - selfRect.size.width = xPos + padding.right + colMaxWidth; + if (lsc.wrapContentWidth) + selfSize.width = xPos + paddingTrailing + colMaxWidth; else { CGFloat addXPos = 0; - if (mghorz == MyMarginGravity_Horz_Center) + CGFloat fill = 0; + CGFloat between = 0; + + if (horzGravity == MyGravity_Horz_Center) + { + addXPos = (selfSize.width - paddingTrailing - colMaxWidth - xPos) / 2; + } + else if (horzGravity == MyGravity_Horz_Trailing) { - addXPos = (selfRect.size.width - padding.right - colMaxWidth - xPos) / 2; + addXPos = selfSize.width - paddingTrailing - colMaxWidth - xPos; } - else if (mghorz == MyMarginGravity_Horz_Right) + else if (horzGravity == MyGravity_Horz_Fill) { - addXPos = selfRect.size.width - padding.right - colMaxWidth - xPos; + if (arrangeIndexSet.count > 0) + fill = (selfSize.width - paddingTrailing - colMaxWidth - xPos) / arrangeIndexSet.count; } + else if (horzGravity == MyGravity_Horz_Between) + { + if (arrangeIndexSet.count > 1) + between = (selfSize.width - paddingTrailing - colMaxWidth - xPos) / (arrangeIndexSet.count - 1); + } + - if (addXPos != 0) + if (addXPos != 0 || between != 0 || fill != 0) { + int line = 0; + NSUInteger lastIndex = 0; for (int i = 0; i < sbs.count; i++) { UIView *sbv = sbs[i]; + MyFrame *sbvmyFrame = sbv.myFrame; + + sbvmyFrame.leading += addXPos; + + //找到行的最初索引。 + NSUInteger index = [arrangeIndexSet indexLessThanOrEqualToIndex:i]; + if (lastIndex != index) + { + lastIndex = index; + line ++; + } + + sbvmyFrame.width += fill; + sbvmyFrame.leading += fill * line; + + sbvmyFrame.leading += between * line; - sbv.absPos.leftPos += addXPos; } } } - - return selfRect; + + return selfSize; } --(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSMutableArray*)sbs +-(CGSize)myLayoutSubviewsForHorz:(CGSize)selfSize sbs:(NSMutableArray*)sbs isEstimate:(BOOL)isEstimate lsc:(MyFlowLayout*)lsc { - UIEdgeInsets padding = self.padding; - - NSInteger arrangedIndex = 0; - NSInteger arrangedCount = self.arrangedCount; - CGFloat xPos = padding.left; - CGFloat yPos = padding.top; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + + NSInteger arrangedCount = lsc.arrangedCount; + CGFloat xPos = paddingLeading; + CGFloat yPos = paddingTop; CGFloat colMaxWidth = 0; //每列的最大宽度 CGFloat colMaxHeight = 0; //每列的最大高度 - CGFloat maxHeight = padding.top; + CGFloat maxHeight = paddingTop; + + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + MyGravity horzAlign = [self myConvertLeftRightGravityToLeadingTrailing:lsc.arrangedGravity & MyGravity_Vert_Mask]; - MyMarginGravity mgvert = self.gravity & MyMarginGravity_Horz_Mask; - MyMarginGravity mghorz = self.gravity & MyMarginGravity_Vert_Mask; - MyMarginGravity amghorz = self.arrangedGravity & MyMarginGravity_Vert_Mask; + CGFloat vertSpace = lsc.subviewVSpace; + CGFloat horzSpace = lsc.subviewHSpace; + + //父滚动视图是否分页滚动。 + BOOL isPagingScroll = (self.superview != nil && + [self.superview isKindOfClass:[UIScrollView class]] && + ((UIScrollView*)self.superview).isPagingEnabled); + + CGFloat pagingItemHeight = 0; + CGFloat pagingItemWidth = 0; + BOOL isVertPaging = NO; + BOOL isHorzPaging = NO; + if (lsc.pagedCount > 0 && self.superview != nil) + { + NSInteger cols = lsc.pagedCount / arrangedCount; //每页的列数。 + + //对于水平流式布局来说,要求要有明确的高度。因此如果我们启用了分页又设置了高度包裹时则我们的分页是从上到下的排列。否则分页是从左到右的排列。 + if (lsc.wrapContentHeight) + { + isVertPaging = YES; + if (isPagingScroll) + pagingItemHeight = (CGRectGetHeight(self.superview.bounds) - paddingVert - (arrangedCount - 1) * vertSpace ) / arrangedCount; + else + pagingItemHeight = (CGRectGetHeight(self.superview.bounds) - paddingTop - arrangedCount * vertSpace ) / arrangedCount; + + pagingItemWidth = (selfSize.width - paddingHorz - (cols - 1) * horzSpace) / cols; + } + else + { + isHorzPaging = YES; + pagingItemHeight = (selfSize.height - paddingVert - (arrangedCount - 1) * vertSpace) / arrangedCount; + //分页滚动时和非分页滚动时的宽度计算是不一样的。 + if (isPagingScroll) + pagingItemWidth = (CGRectGetWidth(self.superview.bounds) - paddingHorz - (cols - 1) * horzSpace) / cols; + else + pagingItemWidth = (CGRectGetWidth(self.superview.bounds) - paddingLeading - cols * horzSpace) / cols; + + } + + } - CGFloat averageHeight = (selfRect.size.height - padding.top - padding.bottom - (arrangedCount - 1) * self.subviewVertMargin) / arrangedCount; + BOOL averageArrange = (vertGravity == MyGravity_Vert_Fill); - int i = 0; + NSInteger arrangedIndex = 0; + NSInteger i = 0; + CGFloat rowTotalWeight = 0; + CGFloat rowTotalFixedHeight = 0; for (; i < sbs.count; i++) { UIView *sbv = sbs[i]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; - if (arrangedIndex >= arrangedCount) + if (arrangedIndex >= arrangedCount) { arrangedIndex = 0; - xPos += colMaxWidth; - xPos += self.subviewHorzMargin; - yPos = padding.top; - //计算每行的gravity情况。 - [self calcHorzLayoutGravity:selfRect.size colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight mg:mgvert amg:amghorz sbs:sbs startIndex:i count:arrangedCount]; + if (rowTotalWeight != 0 && !averageArrange) + { + [self myCalcHorzLayoutSinglelineWeight:selfSize totalFloatHeight:selfSize.height - paddingVert - rowTotalFixedHeight totalWeight:rowTotalWeight sbs:sbs startIndex:i count:arrangedCount]; + } + + rowTotalWeight = 0; + rowTotalFixedHeight = 0; - colMaxWidth = 0; - colMaxHeight = 0; } - CGFloat topMargin = sbv.topPos.margin; - CGFloat leftMargin = sbv.leftPos.margin; - CGFloat bottomMargin = sbv.bottomPos.margin; - CGFloat rightMargin = sbv.rightPos.margin; - CGRect rect = sbv.absPos.frame; + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGRect rect = sbvmyFrame.frame; - BOOL isFlexedHeight = sbv.isFlexedHeight && !sbv.heightDime.isMatchParent; + if (pagingItemWidth != 0) + rect.size.width = pagingItemWidth; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; - if (sbv.heightDime.dimeNumVal != nil && !self.averageArrange) - rect.size.height = sbv.heightDime.measure; + //当子视图的尺寸是相对依赖于其他尺寸的值。 + [self mySetSubviewRelativeDimeSize:sbvsc.widthSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; - if (sbv.widthDime.dimeRelaVal == self.widthDime && !self.wrapContentWidth) - rect.size.width = (selfRect.size.width - padding.left - padding.right) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; - if (sbv.heightDime.dimeRelaVal == self.heightDime && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - padding.top - padding.bottom) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (sbvsc.weight != 0) + { + + rowTotalWeight += sbvsc.weight; + } + else + { + + BOOL isFlexedHeight = sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.heightSizeInner.dimeRelaVal.view != self; + + if (pagingItemHeight != 0) + rect.size.height = pagingItemHeight; + + if (sbvsc.heightSizeInner.dimeNumVal != nil && !averageArrange) + rect.size.height = sbvsc.heightSizeInner.measure; + + //当子视图的尺寸是相对依赖于其他尺寸的值。 + [self mySetSubviewRelativeDimeSize:sbvsc.heightSizeInner selfSize:selfSize lsc:lsc pRect:&rect]; + + + //如果高度是浮动的则需要调整高度。 + if (isFlexedHeight) + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:[sbvsc.widthSizeInner measureWith: rect.size.height ] sbvSize:rect.size selfLayoutSize:selfSize]; + + rowTotalFixedHeight += rect.size.height; + } - //如果高度是浮动的则需要调整高度。 - if (isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rowTotalFixedHeight += topSpace + bottomSpace; - if (self.averageArrange) - rect.size.height = averageHeight - topMargin - bottomMargin; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + if (arrangedIndex != (arrangedCount - 1)) + rowTotalFixedHeight += vertSpace; - if (sbv.widthDime.dimeRelaVal == sbv.heightDime) - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal sbvSize:rect.size selfLayoutSize:selfRect.size]; - - rect.origin.y = yPos + topMargin; - rect.origin.x = xPos + leftMargin; - yPos += topMargin + rect.size.height + bottomMargin; + sbvmyFrame.frame = rect; + + arrangedIndex++; + + } + + //最后一行。 + if (rowTotalWeight != 0 && !averageArrange) + { + if (arrangedIndex < arrangedCount) + rowTotalFixedHeight -= vertSpace; + + [self myCalcHorzLayoutSinglelineWeight:selfSize totalFloatHeight:selfSize.height - paddingVert - rowTotalFixedHeight totalWeight:rowTotalWeight sbs:sbs startIndex:i count:arrangedIndex]; + } + + + CGFloat pageHeight = 0; //页高 + CGFloat averageHeight = (selfSize.height - paddingVert - (arrangedCount - 1) * vertSpace) / arrangedCount; + arrangedIndex = 0; + i = 0; + for (; i < sbs.count; i++) + { + UIView *sbv = sbs[i]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (arrangedIndex >= arrangedCount) + { + arrangedIndex = 0; + xPos += colMaxWidth; + xPos += horzSpace; + + //分别处理水平分页和垂直分页。 + if (isVertPaging) + { + if (i % lsc.pagedCount == 0) + { + pageHeight += CGRectGetHeight(self.superview.bounds); + + if (!isPagingScroll) + pageHeight -= paddingTop; + + xPos = paddingLeading; + } + + } + + if (isHorzPaging) + { + //如果是分页滚动则要多添加垂直间距。 + if (i % lsc.pagedCount == 0) + { + + if (isPagingScroll) + { + xPos -= horzSpace; + xPos += paddingTrailing; + xPos += paddingLeading; + } + } + } + + + yPos = paddingTop + pageHeight; + + + //计算每行的gravity情况。 + [self myCalcHorzLayoutSinglelineAlignment:selfSize colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight vertGravity:vertGravity horzAlignment:horzAlign sbs:sbs startIndex:i count:arrangedCount vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; + + colMaxWidth = 0; + colMaxHeight = 0; + } + + CGFloat topSpace = sbvsc.topPosInner.absVal; + CGFloat leadingSpace = sbvsc.leadingPosInner.absVal; + CGFloat bottomSpace = sbvsc.bottomPosInner.absVal; + CGFloat trailingSpace = sbvsc.trailingPosInner.absVal; + CGRect rect = sbvmyFrame.frame; + + + if (averageArrange) + { + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:averageHeight - topSpace - bottomSpace sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:[sbvsc.widthSizeInner measureWith: rect.size.height ] sbvSize:rect.size selfLayoutSize:selfSize]; + } + + + rect.origin.y = yPos + topSpace; + rect.origin.x = xPos + leadingSpace; + yPos += topSpace + rect.size.height + bottomSpace; if (arrangedIndex != (arrangedCount - 1)) - yPos += self.subviewVertMargin; - + yPos += vertSpace; - if (colMaxWidth < leftMargin + rightMargin + rect.size.width) - colMaxWidth = leftMargin + rightMargin + rect.size.width; - if (colMaxHeight < (yPos - padding.top)) - colMaxHeight = yPos - padding.top; + if (colMaxWidth < leadingSpace + trailingSpace + rect.size.width) + colMaxWidth = leadingSpace + trailingSpace + rect.size.width; + + if (colMaxHeight < (yPos - paddingTop)) + colMaxHeight = yPos - paddingTop; if (maxHeight < yPos) maxHeight = yPos; - sbv.absPos.frame = rect; + sbvmyFrame.frame = rect; arrangedIndex++; @@ -1126,135 +1887,88 @@ -(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSMutableArray*)sbs } //最后一列 - [self calcHorzLayoutGravity:selfRect.size colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight mg:mgvert amg:amghorz sbs:sbs startIndex:i count:arrangedIndex]; - - if (self.wrapContentHeight && !self.averageArrange) - selfRect.size.height = maxHeight + padding.bottom; + [self myCalcHorzLayoutSinglelineAlignment:selfSize colMaxWidth:colMaxWidth colMaxHeight:colMaxHeight vertGravity:vertGravity horzAlignment:horzAlign sbs:sbs startIndex:i count:arrangedIndex vertSpace:vertSpace horzSpace:horzSpace isEstimate:isEstimate lsc:lsc]; - if (self.wrapContentWidth) - selfRect.size.width = xPos + padding.right + colMaxWidth; - else + if (lsc.wrapContentHeight && !averageArrange) { - - CGFloat addXPos = 0; - if (mghorz == MyMarginGravity_Horz_Center) - { - addXPos = (selfRect.size.width - padding.right - colMaxWidth - xPos) / 2; - } - else if (mghorz == MyMarginGravity_Horz_Right) - { - addXPos = selfRect.size.width - padding.right - colMaxWidth - xPos; - } + selfSize.height = maxHeight + paddingBottom; - if (addXPos != 0) + //只有在父视图为滚动视图,且开启了分页滚动时才会扩充具有包裹设置的布局视图的宽度。 + if (isVertPaging && isPagingScroll) { - for (int i = 0; i < sbs.count; i++) - { - UIView *sbv = sbs[i]; - - sbv.absPos.leftPos += addXPos; - } + //算出页数来。如果包裹计算出来的宽度小于指定页数的宽度,因为要分页滚动所以这里会扩充布局的宽度。 + NSInteger totalPages = floor((sbs.count + lsc.pagedCount - 1.0 ) / lsc.pagedCount); + if (selfSize.height < totalPages * CGRectGetHeight(self.superview.bounds)) + selfSize.height = totalPages * CGRectGetHeight(self.superview.bounds); } + + } - - - - return selfRect; - -} - --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass -{ - CGRect selfRect = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass]; - - - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) + if (lsc.wrapContentWidth) { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; + selfSize.width = xPos + paddingTrailing + colMaxWidth; + + //只有在父视图为滚动视图,且开启了分页滚动时才会扩充具有包裹设置的布局视图的宽度。 + if (isHorzPaging && isPagingScroll) + { + //算出页数来。如果包裹计算出来的宽度小于指定页数的宽度,因为要分页滚动所以这里会扩充布局的宽度。 + NSInteger totalPages = floor((sbs.count + lsc.pagedCount - 1.0 ) / lsc.pagedCount); + if (selfSize.width < totalPages * CGRectGetWidth(self.superview.bounds)) + selfSize.width = totalPages * CGRectGetWidth(self.superview.bounds); + } - [sbs addObject:sbv]; } - - - - for (UIView *sbv in sbs) + else { - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - continue; - if (!isEstimate) + CGFloat addXPos = 0; + CGFloat between = 0; + CGFloat fill = 0; + int arranges = floor((sbs.count + arrangedCount - 1.0) / arrangedCount); + + if (horzGravity == MyGravity_Horz_Center) { - sbv.absPos.frame = sbv.frame; - [self calcSizeOfWrapContentSubview:sbv]; + addXPos = (selfSize.width - paddingTrailing - colMaxWidth - xPos) / 2; + } + else if (horzGravity == MyGravity_Horz_Trailing) + { + addXPos = selfSize.width - paddingTrailing - colMaxWidth - xPos; + } + else if (horzGravity == MyGravity_Horz_Fill) + { + if (arranges > 0) + fill = (selfSize.width - paddingTrailing - colMaxWidth - xPos) / arranges; + } + else if (horzGravity == MyGravity_Horz_Between) + { + if (arranges > 1) + between = (selfSize.width - paddingLeading - colMaxWidth - xPos) / (arranges - 1); } - if ([sbv isKindOfClass:[MyBaseLayout class]]) + if (addXPos != 0 || between != 0 || fill != 0) { - if (pHasSubLayout != NULL) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - - if (sbvl.wrapContentWidth) - { - if (sbvl.widthDime.dimeVal != nil || - (self.orientation == MyLayoutViewOrientation_Horz && (self.arrangedGravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Fill) || - (self.orientation == MyLayoutViewOrientation_Vert && self.averageArrange)) - { - [sbvl setWrapContentWidthNoLayout:NO]; - } - } - - if (sbvl.wrapContentHeight) - { - if (sbvl.heightDime.dimeVal != nil || - (self.orientation == MyLayoutViewOrientation_Vert && (self.arrangedGravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Fill) || - (self.orientation == MyLayoutViewOrientation_Horz && self.averageArrange)) - { - [sbvl setWrapContentHeightNoLayout:NO]; - } - } - - - - if (isEstimate) + for (int i = 0; i < sbs.count; i++) { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + UIView *sbv = sbs[i]; + + MyFrame *sbvmyFrame = sbv.myFrame; + + int lines = i / arrangedCount; + sbvmyFrame.width += fill; + sbvmyFrame.leading += fill * lines; + + sbvmyFrame.leading += addXPos; + + sbvmyFrame.leading += between * lines; + } } } - - - - if (self.orientation == MyLayoutViewOrientation_Vert) - { - if (self.arrangedCount == 0) - selfRect = [self layoutSubviewsForVertContent:selfRect sbs:sbs]; - else - selfRect = [self layoutSubviewsForVert:selfRect sbs:sbs]; - } - else - { - if (self.arrangedCount == 0) - selfRect = [self layoutSubviewsForHorzContent:selfRect sbs:sbs]; - else - selfRect = [self layoutSubviewsForHorz:selfRect sbs:sbs]; - } - selfRect.size.height = [self validMeasure:self.heightDime sbv:self calcSize:selfRect.size.height sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - selfRect.size.width = [self validMeasure:self.widthDime sbv:self calcSize:selfRect.size.width sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; + return selfSize; - return selfRect; -} - --(id)createSizeClassInstance -{ - return [MyLayoutSizeClassFlowLayout new]; } diff --git a/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.h b/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.h index 45a970f..fb35c7c 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.h @@ -8,20 +8,29 @@ #import "MyBaseLayout.h" - +/* @interface UIView(MyFrameLayoutExt) -/** - *设置当子视图添加到框架布局时垂直和水平所停靠的位置。默认是左上角停靠 - */ -@property(nonatomic, assign) IBInspectable MyMarginGravity marginGravity; +//新版本1.3.3以后的版本将不再提供框架布局对子视图的这个扩展属性的支持。 +@property(nonatomic, assign) MyGravity marginGravity; + + 1.如果您想让子视图右对齐框架布局,则只需要设置myRight = 数值 和宽度即可 不再需要设置marginGravity = MyGravity_Horz_Right + 2.如果您想让子视图底对齐框架布局,则只需要设置myBottom = 数值 和高度即可,不再需要设置marginGravity = MyGravity_Vert_Bottom + 3.如果您想让子视图在框架布局中垂直居中,则只需要设置myCenterY = 数值 和高度即可,不再需要设置marginGravity = MyGravity_Vert_Center + 4.如果您想让子视图在框架布局中水平居中,则只需要设置myCenterX = 数值 和宽度即可,不再需要设置marginGravity = MyGravity_Horz_Center + 5.如果您想让子视图在框架布局中宽度填满,则只需要设置myHorzMargin = 0,不再需要设置marginGravity = MyGravity_Horz_Fill + 6.如果您想让子视图在框架布局中高度填满,则只需要设置myVertMargin = 0, 不再需要设置marginGravity = MyGravity_Vert_Fill + 7.如果你要水平和垂直方向都设置,则请同时设置对应位置对象的值。 + 8.新版本将不再支持让框架布局中的子视图在窗口中居中了。 + + + 请使用了marginGravity属性的代码进行对应的代码变更!!! @end - +*/ /** - *框架布局是一种里面的子视图停靠在父视图特定方位并且可以重叠的布局视图。框架布局里面的子视图的布局位置和添加的顺序无关,只跟父视图建立布局约束依赖关系。 - *框架布局将垂直方向上分为上、中、下三个方位,而水平方向上则分为左、中、右三个方位,任何一个子视图都只能定位在垂直方向和水平方向上的一个方位上。 + 框架布局是一种里面的子视图停靠在父视图特定方位并且可以重叠的布局视图。框架布局里面的子视图的布局位置和添加的顺序无关,框架布局中的所有子视图的约束依赖都只是针对于和父布局视图的。框架布局是一种特殊的相对布局,因此如果某些布局里面的子视图只依赖于父视图的边界时则可以用框架布局来代替,从而加快布局的速度。 */ @interface MyFrameLayout : MyBaseLayout diff --git a/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.m b/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.m index 98bae27..76ea145 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyFrameLayout.m @@ -11,216 +11,274 @@ #import -@implementation UIView(MyFrameLayoutExt) +@implementation MyFrameLayout --(MyMarginGravity)marginGravity -{ - return self.myCurrentSizeClass.marginGravity; -} +/* + // Only override drawRect: if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + - (void)drawRect:(CGRect)rect { + // Drawing code + } + */ --(void)setMarginGravity:(MyMarginGravity)marginGravity +#pragma mark -- Override Method + +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray *)sbs { - if (self.myCurrentSizeClass.marginGravity != marginGravity) + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; + + if (sbs == nil) + sbs = [self myGetLayoutSubviews]; + + MyFrameLayout *lsc = self.myCurrentSizeClass; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + + + CGSize maxWrapSize = CGSizeMake(paddingLeading + paddingTrailing, paddingTop + paddingBottom); + CGSize *pMaxWrapSize = &maxWrapSize; + if (!lsc.wrapContentHeight && !lsc.wrapContentWidth) + pMaxWrapSize = NULL; + + for (UIView *sbv in sbs) + { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (!isEstimate) + { + sbvmyFrame.frame = sbv.bounds; + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + } + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + + if (sbvsc.wrapContentHeight && (sbvsc.heightSizeInner.dimeVal != nil || (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil))) + { + sbvsc.wrapContentHeight = NO; + } + + if (sbvsc.wrapContentWidth && (sbvsc.widthSizeInner.dimeVal != nil || (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil))) + { + sbvsc.wrapContentWidth = NO; + } + + + if (pHasSubLayout != nil && (sbvsc.wrapContentHeight || sbvsc.wrapContentWidth)) + *pHasSubLayout = YES; + + if (isEstimate && (sbvsc.wrapContentHeight || sbvsc.wrapContentWidth)) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } + + + //计算自己的位置和高宽 + [self myCalcSubViewRect:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame lsc:lsc vertGravity:vertGravity horzGravity:horzGravity inSelfSize:selfSize paddingTop:paddingTop paddingLeading:paddingLeading paddingBottom:paddingBottom paddingTrailing:paddingTrailing pMaxWrapSize:pMaxWrapSize]; + + } + + if (lsc.wrapContentWidth) + { + selfSize.width = maxWrapSize.width; + } + + if (lsc.wrapContentHeight) + { + selfSize.height = maxWrapSize.height; + } + + //调整布局视图自己的尺寸。 + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + + //如果布局视图具有包裹属性这里要调整那些依赖父视图宽度和高度的子视图的位置和尺寸。 + if ((lsc.wrapContentWidth && horzGravity != MyGravity_Horz_Fill) || (lsc.wrapContentHeight && vertGravity != MyGravity_Vert_Fill)) { - self.myCurrentSizeClass.marginGravity = marginGravity; - if (self.superview != nil) - [self.superview setNeedsLayout]; + for (UIView *sbv in sbs) + { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + + //只有子视图的尺寸或者位置依赖父视图的情况下才需要重新计算位置和尺寸。 + if ((sbvsc.trailingPosInner.posVal != nil) || + (sbvsc.bottomPosInner.posVal != nil) || + (sbvsc.centerXPosInner.posVal != nil) || + (sbvsc.centerYPosInner.posVal != nil) || + (sbvsc.widthSizeInner.dimeRelaVal.view == self) || + (sbvsc.heightSizeInner.dimeRelaVal.view == self) + ) + { + [self myCalcSubViewRect:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame lsc:lsc vertGravity:vertGravity horzGravity:horzGravity inSelfSize:selfSize paddingTop:paddingTop paddingLeading:paddingLeading paddingBottom:paddingBottom paddingTrailing:paddingTrailing pMaxWrapSize:NULL]; + } + + } } + + + //如果是反向则调整左右位置。 + [self myAdjustSubviewsRTLPos:sbs selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs lsc:lsc]; + } -@end +-(id)createSizeClassInstance +{ + return [MyFrameLayoutViewSizeClass new]; +} -IB_DESIGNABLE -@implementation MyFrameLayout -/* -// Only override drawRect: if you perform custom drawing. -// An empty implementation adversely affects performance during animation. -- (void)drawRect:(CGRect)rect { - // Drawing code -} -*/ +#pragma mark -- Private Method --(void)calcSubView:(UIView*)sbv pRect:(CGRect*)pRect inSize:(CGSize)selfSize +-(void)myCalcSubViewRect:(UIView*)sbv + sbvsc:(UIView*)sbvsc + sbvmyFrame:(MyFrame*)sbvmyFrame + lsc:(MyFrameLayout*)lsc + vertGravity:(MyGravity)vertGravity + horzGravity:(MyGravity)horzGravity + inSelfSize:(CGSize)selfSize + paddingTop:(CGFloat)paddingTop + paddingLeading:(CGFloat)paddingLeading + paddingBottom:(CGFloat)paddingBottom + paddingTrailing:(CGFloat)paddingTrailing + pMaxWrapSize:(CGSize*)pMaxWrapSize { - MyMarginGravity gravity = sbv.marginGravity; - MyMarginGravity vert = gravity & MyMarginGravity_Horz_Mask; - MyMarginGravity horz = gravity & MyMarginGravity_Vert_Mask; - - //优先用设定的宽度尺寸。 - if (sbv.widthDime.dimeNumVal != nil) - pRect->size.width = sbv.widthDime.measure; + CGRect rect = sbvmyFrame.frame; - if (sbv.heightDime.dimeNumVal != nil) - pRect->size.height = sbv.heightDime.measure; - - if (sbv.widthDime.dimeRelaVal != nil && sbv.widthDime.dimeRelaVal.view != sbv) - { - if (sbv.widthDime.dimeRelaVal.view == self) - pRect->size.width = (selfSize.width - self.leftPadding - self.rightPadding) * sbv.widthDime.mutilVal + sbv.widthDime.addVal; - else - pRect->size.width = sbv.widthDime.dimeRelaVal.view.absPos.width * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + {//宽度等于固定的值。 + + rect.size.width = sbvsc.widthSizeInner.measure; } - - if (sbv.heightDime.dimeRelaVal != nil && sbv.heightDime.dimeRelaVal.view != sbv) - { - if (sbv.heightDime.dimeRelaVal.view == self) - pRect->size.height = (selfSize.height - self.topPadding - self.bottomPadding) * sbv.heightDime.mutilVal + sbv.heightDime.addVal; - else - pRect->size.height = sbv.heightDime.dimeRelaVal.view.absPos.height * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + else if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal.view != sbv) + {//宽度等于其他的依赖的视图。 + if (sbvsc.widthSizeInner.dimeRelaVal == self.widthSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:selfSize.width - paddingLeading - paddingTrailing]; + else + rect.size.width = [sbvsc.widthSizeInner measureWith:sbvsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width]; } - pRect->size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:pRect->size.width sbvSize:pRect->size selfLayoutSize:selfSize]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + [self myCalcHorzGravity:[self myGetSubviewHorzGravity:sbv sbvsc:sbvsc horzGravity:horzGravity] sbv:sbv sbvsc:sbvsc paddingLeading:paddingLeading paddingTrailing:paddingTrailing selfSize:selfSize pRect:&rect]; - - //特殊处理如果设置了左右边距则确定了视图的宽度 - if (sbv.leftPos.posVal != nil && sbv.rightPos.posVal != nil) - horz = MyMarginGravity_Horz_Fill; - [self horzGravity:horz selfSize:selfSize sbv:sbv rect:pRect]; - - - if (sbv.isFlexedHeight) - { - pRect->size.height = [self heightFromFlexedHeightView:sbv inWidth:pRect->size.width]; - + if (sbvsc.heightSizeInner.dimeNumVal != nil) + {//高度等于固定的值。 + rect.size.height = sbvsc.heightSizeInner.measure; + } + else if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal.view != sbv) + {//高度等于其他依赖的视图 + if (sbvsc.heightSizeInner.dimeRelaVal == self.heightSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:selfSize.height - paddingTop - paddingBottom]; + else + rect.size.height = [sbvsc.heightSizeInner measureWith:sbvsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height]; } - pRect->size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:pRect->size.height sbvSize:pRect->size selfLayoutSize:selfSize]; - - if (sbv.topPos.posVal != nil && sbv.bottomPos.posVal != nil) - vert = MyMarginGravity_Vert_Fill; + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + {//高度等于内容的高度 + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + } - [self vertGravity:vert selfSize:selfSize sbv:sbv rect:pRect]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + [self myCalcVertGravity:[self myGetSubviewVertGravity:sbv sbvsc:sbvsc vertGravity:vertGravity] sbv:sbv sbvsc:sbvsc paddingTop:paddingTop paddingBottom:paddingBottom selfSize:selfSize pRect:&rect]; - if (sbv.widthDime.dimeRelaVal != nil && sbv.widthDime.dimeRelaVal.view == sbv && sbv.widthDime.dimeRelaVal.dime == MyMarginGravity_Vert_Fill) + //特殊处理宽度等于高度 + if (sbvsc.widthSizeInner.dimeRelaVal.view == sbv && sbvsc.widthSizeInner.dimeRelaVal.dime == MyGravity_Vert_Fill) { + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; - pRect->size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:pRect->size.height * sbv.widthDime.mutilVal + sbv.widthDime.addVal sbvSize:pRect->size selfLayoutSize:selfSize]; - + [self myCalcHorzGravity:[self myGetSubviewHorzGravity:sbv sbvsc:sbvsc horzGravity:horzGravity] sbv:sbv sbvsc:sbvsc paddingLeading:paddingLeading paddingTrailing:paddingTrailing selfSize:selfSize pRect:&rect]; } - if (sbv.heightDime.dimeRelaVal != nil && sbv.heightDime.dimeRelaVal.view == sbv && sbv.heightDime.dimeRelaVal.dime == MyMarginGravity_Horz_Fill) + //特殊处理高度等于宽度。 + if (sbvsc.heightSizeInner.dimeRelaVal.view == sbv && sbvsc.heightSizeInner.dimeRelaVal.dime == MyGravity_Horz_Fill) { - pRect->size.height = pRect->size.width * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; - if (sbv.isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) { - pRect->size.height = [self heightFromFlexedHeightView:sbv inWidth:pRect->size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; } - pRect->size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:pRect->size.height sbvSize:pRect->size selfLayoutSize:selfSize]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + [self myCalcVertGravity:[self myGetSubviewVertGravity:sbv sbvsc:sbvsc vertGravity:vertGravity] sbv:sbv sbvsc:sbvsc paddingTop:paddingTop paddingBottom:paddingBottom selfSize:selfSize pRect:&rect]; } - - + sbvmyFrame.frame = rect; -} - --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass -{ - - CGRect selfRect = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass]; - CGSize selfSize = selfRect.size; - NSArray *sbs = self.subviews; - CGFloat maxWidth = self.leftPadding; - CGFloat maxHeight = self.topPadding; - for (UIView *sbv in sbs) + if (pMaxWrapSize != NULL) { - - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - if (!isEstimate) + if (lsc.wrapContentWidth) { - sbv.absPos.frame = sbv.frame; - [self calcSizeOfWrapContentSubview:sbv]; - } - - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - if (pHasSubLayout != nil) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - - if (sbvl.wrapContentHeight && ((sbvl.marginGravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Fill || sbvl.heightDime.dimeVal != nil || (sbvl.topPos.posVal != nil && sbvl.bottomPos.posVal != nil))) + //如果同时设置左右边界则左右边界为最小的宽度 + if (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) { - [sbvl setWrapContentHeightNoLayout:NO]; + if (pMaxWrapSize->width < sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + paddingLeading + paddingTrailing) + pMaxWrapSize->width = sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + paddingLeading + paddingTrailing; } - if (sbvl.wrapContentWidth && ((sbvl.marginGravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Fill || sbvl.widthDime.dimeVal != nil || (sbvl.leftPos.posVal != nil && sbvl.rightPos.posVal != nil))) + //宽度不依赖布局并且没有同时设置左右边距则参与最大宽度计算。 + if ((sbvsc.widthSizeInner.dimeRelaVal.view != self) && + (sbvsc.leadingPosInner.posVal == nil || sbvsc.trailingPosInner.posVal == nil)) { - [sbvl setWrapContentWidthNoLayout:NO]; + + if (pMaxWrapSize->width < sbvmyFrame.width + sbvsc.leadingPosInner.absVal + sbvsc.centerXPosInner.absVal + sbvsc.trailingPosInner.absVal + paddingLeading + paddingTrailing) + pMaxWrapSize->width = sbvmyFrame.width + sbvsc.leadingPosInner.absVal + sbvsc.centerXPosInner.absVal + sbvsc.trailingPosInner.absVal + paddingLeading + paddingTrailing; + + if (pMaxWrapSize->width < sbvmyFrame.trailing + sbvsc.trailingPosInner.absVal + paddingTrailing) + pMaxWrapSize->width = sbvmyFrame.trailing + sbvsc.trailingPosInner.absVal + paddingTrailing; + } - - if (isEstimate) - { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 - } - } - - - //计算自己的位置和高宽 - CGRect rect = sbv.absPos.frame; - [self calcSubView:sbv pRect:&rect inSize:selfSize]; - sbv.absPos.frame = rect; - - if ((sbv.marginGravity & MyMarginGravity_Vert_Mask) != MyMarginGravity_Horz_Fill && sbv.widthDime.dimeRelaVal != self.widthDime) - { - if (maxWidth < CGRectGetMaxX(rect)) - maxWidth = CGRectGetMaxX(rect); } - if ((sbv.marginGravity & MyMarginGravity_Horz_Mask) != MyMarginGravity_Vert_Fill && sbv.heightDime.dimeRelaVal != self.heightDime) + if (lsc.wrapContentHeight) { - if (maxHeight < CGRectGetMaxY(rect)) - maxHeight = CGRectGetMaxY(rect); + //如果同时设置上下边界则上下边界为最小的高度 + if (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) + { + if (pMaxWrapSize->height < sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + paddingTop + paddingBottom) + pMaxWrapSize->height = sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + paddingTop + paddingBottom; + } + + //高度不依赖布局并且没有同时设置上下边距则参与最大高度计算。 + if ((sbvsc.heightSizeInner.dimeRelaVal.view != self) && + (sbvsc.topPosInner.posVal == nil || sbvsc.bottomPosInner.posVal == nil)) + { + if (pMaxWrapSize->height < sbvmyFrame.height + sbvsc.topPosInner.absVal + sbvsc.centerYPosInner.absVal + sbvsc.bottomPosInner.absVal + paddingTop + paddingBottom) + pMaxWrapSize->height = sbvmyFrame.height + sbvsc.topPosInner.absVal + sbvsc.centerYPosInner.absVal + sbvsc.bottomPosInner.absVal + paddingTop + paddingBottom; + + if (pMaxWrapSize->height < sbvmyFrame.bottom + sbvsc.bottomPosInner.absVal + paddingBottom) + pMaxWrapSize->height = sbvmyFrame.bottom + sbvsc.bottomPosInner.absVal + paddingBottom; + } } - } - if (self.wrapContentWidth) - { - selfRect.size.width = maxWidth + self.rightPadding; - } - if (self.wrapContentHeight) - { - selfRect.size.height = maxHeight + self.bottomPadding; - } - - selfRect.size.height = [self validMeasure:self.heightDime sbv:self calcSize:selfRect.size.height sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - - selfRect.size.width = [self validMeasure:self.widthDime sbv:self calcSize:selfRect.size.width sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - - //调整尺寸和父布局相等的视图的尺寸。 - for (UIView *sbv in sbs) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - if ((sbv.marginGravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Fill || (sbv.marginGravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Fill) - { - CGRect rect = sbv.absPos.frame; - [self calcSubView:sbv pRect:&rect inSize:selfRect.size]; - sbv.absPos.frame = rect; - } - - } - - return selfRect; - } + @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayout.h b/Pods/MyLayout/MyLayout/Lib/MyLayout.h index 4346290..3edae8c 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayout.h @@ -7,8 +7,10 @@ // Email: obq0387_cn@sina.com // QQ: 156355113 // QQ群: 178573773 -// Github: https://github.com/youngsoft/MyLinearLayout -// 个人主页: http://www.jianshu.com/users/3c9287519f58/latest_articles http://blog.csdn.net/yangtiang +// Github: https://github.com/youngsoft/MyLinearLayout forObjective-C +// Github: https://github.com/youngsoft/TangramKit forSwift +// HomePage: http://www.jianshu.com/users/3c9287519f58 +// HomePage: http://blog.csdn.net/yangtiang // /* The MIT License (MIT) @@ -34,59 +36,25 @@ SOFTWARE. */ -/* - version1.1.8 - - New: - 1.优化了表格布局MyTableLayout和智能边界线的结合的问题。(具体见:TLTest3ViewController) - 2. 增加了浮动布局MyFloatLayout设置浮动间距的方法setSubviewFloatMargin (具体见:FOLTest4ViewController) - - - */ - -/* - version1.1.7 - - New: - - 1.修改表格布局的addRow:colSize:以及insertRow:colSize:atIndex的方法名,将原来的colWidth改为了colSize。 (具体见:TLTest2ViewController) - 2.修改了表格布局的特殊尺寸的宏定义:MTLSIZE_XXXX (具体见:TLTest1ViewController,TLTest2ViewController) - 3.为表格布局添加行间距:rowSpacing和列间距:colSpacing两个属性,用来设置表格的行和列之间的间距。 (具体见:TLTest2ViewController) - 4.为布局添加方法:layoutAnimationWithDuration用来实现布局时的动画效果。 (具体见:各个DEMO) - 5.扩展flexedHeight属性对于UIImageView的支持。当对一个UIImageView设置flexedHeight为YES时则其在布局时会自动根据UIImageView设置的宽度等比例缩放其高度。这个特性在瀑布流实现中非常实用。 (具体见:TLTest2ViewController) - 6.为浮动布局MyFloat提供subviewMargin、subviewVertMargin、subviewHorzMargin三个新属性,用来设置浮动布局中各视图的水平和垂直间距。 (具体见:FOLTest4ViewController,FOLTest5ViewController) - 7.为布局视图下的子视图的尺寸提供了设置最大尺寸以及最小尺寸的新功能,原先的MyLayoutDime中的min,max两个方法只能用来设置最小最大的常数值。MyLayoutDime新增加的方法lBound,uBound则功能更加强大。除了可以设置常数限制尺寸外,还可以设置对象限制尺寸。(具体见:AllTest2ViewController,AllTest3ViewController) - 8.对线性布局中的浮动间距进行优化,支持宽度自动调整的能力.(具体见:AllTest3ViewController) - 9.完善了将布局视图加入到非布局父视图时的位置和尺寸设置。您可以用myXXXMargin方法以及myHeight,myWidth方法设置其在非布局父视图上的位置和尺寸。 - 10.系统自动处理了大部分可能出现布局约束冲突的地方,减少了约束冲突出现的可能性。以及出现了约束冲突时告警以及crash的提示。 - 11.所有代码部分的注释重新编写,更加有利于大家的理解。 - 12.重新编写了大部分的DEMO例子。 - - Bug: - 1.修复了浮动布局加入到UIScrollview中不能自动固定的问题。 - 2.修正了相对布局嵌套其他布局时,高度评估方法可能不正确的问题。 - 3.修正了线性布局在计算高度和宽度时的一个问题。 - - QA: - 1.在布局中,最容易出现约束冲突的情况是某个布局视图设置了wrapContentWidth或者wrapContentHeight,但是在加入到其他布局视图时又被动或者主动设置了明确的高度或者宽度这样导致的约束冲突最多。 - - */ +//Current version is 1.3.9, please open: https://github.com/youngsoft/MyLinearLayout/blob/master/CHANGELOG.md to show the changes. #ifndef MyLayout_MyLayout_h #define MyLayout_MyLayout_h + #import "MyLayoutDef.h" #import "MyDimeScale.h" #import "MyLayoutPos.h" -#import "MyLayoutDime.h" +#import "MyLayoutSize.h" #import "MyLinearLayout.h" #import "MyFrameLayout.h" #import "MyRelativeLayout.h" #import "MyTableLayout.h" #import "MyFlowLayout.h" #import "MyFloatLayout.h" +#import "MyPathLayout.h" #import "MyMaker.h" #endif diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutDef.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutDef.h index 5a424b3..0a80d8d 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutDef.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutDef.h @@ -6,28 +6,18 @@ // Copyright (c) 2015年 YoungSoft. All rights reserved. // +#import #import + #ifndef MYDEPRECATED #define MYDEPRECATED(desc) __attribute__((deprecated(desc))) #endif -//如果想使用老的枚举类型的定义而不报警请定义MY_USEOLDENUMNOWARNING这个宏 -#ifdef MY_USEOLDENUMNOWARNING - - #define MYENUMDEPRECATED(desc) - -#else - - #define MYENUMDEPRECATED(desc) MYDEPRECATED(desc) - -#endif - - -//如果定义了这个宏则使用老的方法不告警 +//如果定义了这个宏则使用老的方法不告警,这个宏用于那些升级功能使用来老方法而不出现告警提示的场景。 #ifdef MY_USEOLDMETHODNOWARNING #define MYMETHODDEPRECATED(desc) @@ -38,49 +28,146 @@ #endif +/** + *布局视图方向的枚举类型定义。用来指定布局内子视图的整体排列布局方向。 + */ +typedef enum : unsigned char { + MyOrientation_Vert = 0, /**垂直方向,布局视图内所有子视图整体从上到下排列布局*/ + MyOrientation_Horz = 1, /**水平方向,布局视图内所有子视图整体从左到右排列布局*/ + + + //兼容老版本而定义,请使用新的定义值。 + MyLayoutViewOrientation_Vert MYMETHODDEPRECATED("use MyOrientation_Vert to instead") = MyOrientation_Vert, + MyLayoutViewOrientation_Horz MYMETHODDEPRECATED("use MyOrientation_Horz to instead") = MyOrientation_Horz, + +} MyOrientation; + +//为了兼容老版本而定义 +typedef MyOrientation MyLayoutViewOrientation MYMETHODDEPRECATED("use MyOrientation to instead"); + + +/** + *视图的可见性枚举类型定义。用来指定视图是否在布局中可见,他是对hidden属性的扩展设置。 + */ +typedef enum : unsigned char { + + MyVisibility_Visible, /**视图可见,等价于hidden = false*/ + MyVisibility_Invisible, /**视图隐藏,等价于hidden = true, 但是会在父布局视图中占位空白区域*/ + MyVisibility_Gone /**视图隐藏,等价于hidden = true, 但是不会在父视图中占位空白区域*/ + +}MyVisibility; /** - *视图在布局视图中的停靠和填充属性。所谓停靠就是指子视图定位在布局视图中的水平左、中、右和垂直上、中、下的某个方位上的位置。而所谓填充则让布局视图里面的子视图的宽度和高度和自己相等。 + *布局视图内所有子视图的停靠方向和填充拉伸属性以及对齐方式的枚举类型定义。 + 所谓停靠方向就是指子视图停靠在布局视图中水平方向和垂直方向的位置。水平方向一共有左、水平中心、右、窗口水平中心四个位置,垂直方向一共有上、垂直中心、下、窗口垂直中心四个位置。 + 所谓填充拉伸属性就是指子视图的尺寸填充或者子视图的间距拉伸满整个布局视图。一共有水平宽度、垂直高度两种尺寸填充,水平间距、垂直间距两种间距拉伸。 + 所谓对齐方式就是指多个子视图之间的对齐位置。水平方向一共有左、水平居中、右、左右两端对齐四种对齐方式,垂直方向一共有上、垂直居中、下、向下两端对齐四种方式。 + 在线性布局、流式布局、浮动布局中有一个gravity属性用来表示布局内所有子视图的停靠方向和填充拉伸属性;在流式布局中有一个arrangedGravity属性用来表示布局内每排子视图的对齐方式。 */ typedef enum : unsigned short { - //不停靠 - MyMarginGravity_None = 0, + + + + MyGravity_None = 0, /**默认值,不停靠、不填充、不对齐。*/ - //水平 - MyMarginGravity_Horz_Left = 1, - MyMarginGravity_Horz_Center = 2, - MyMarginGravity_Horz_Right = 4, - MyMarginGravity_Horz_Window_Center = 8, //屏幕水平居中 - MyMarginGravity_Horz_Fill = MyMarginGravity_Horz_Left | MyMarginGravity_Horz_Center | MyMarginGravity_Horz_Right, - MyMarginGravity_Horz_Mask = 0xFF00, + + //水平方向 + MyGravity_Horz_Left = 1, /**左边停靠或者左对齐*/ + MyGravity_Horz_Center = 2, /**水平中心停靠或者水平居中对齐*/ + MyGravity_Horz_Right = 4, /**右边停靠或者右对齐*/ + MyGravity_Horz_Window_Center = 8, /**窗口水平中心停靠,表示在屏幕窗口的水平中心停靠*/ + MyGravity_Horz_Between = 16, /**水平间距拉伸*/ + MyGravity_Horz_Leading = 32, /**头部对齐,对于阿拉伯国家来说是和Right等价的,对于非阿拉伯国家则是和Left等价的*/ + MyGravity_Horz_Trailing = 64, /**尾部对齐,对于阿拉伯国家来说是和Left等价的,对于非阿拉伯国家则是和Right等价的*/ + MyGravity_Horz_Fill = MyGravity_Horz_Left | MyGravity_Horz_Center | MyGravity_Horz_Right, /**水平宽度填充*/ + MyGravity_Horz_Mask = 0xFF00, /**水平掩码,用来获取水平方向的枚举值*/ + + //垂直方向 + MyGravity_Vert_Top = 1 << 8, /**上边停靠或者上对齐*/ + MyGravity_Vert_Center = 2 << 8, /**垂直中心停靠或者垂直居中对齐*/ + MyGravity_Vert_Bottom = 4 << 8, /**下边停靠或者下边对齐*/ + MyGravity_Vert_Window_Center = 8 << 8, /**窗口垂直中心停靠,表示在屏幕窗口的垂直中心停靠*/ + MyGravity_Vert_Between = 16 << 8, /**垂直间距拉伸*/ + MyGravity_Vert_Fill = MyGravity_Vert_Top | MyGravity_Vert_Center | MyGravity_Vert_Bottom, /**垂直高度填充*/ + MyGravity_Vert_Mask = 0x00FF, /**垂直掩码,用来获取垂直方向的枚举值*/ - //垂直 - MyMarginGravity_Vert_Top = 1 << 8, - MyMarginGravity_Vert_Center = 2 << 8, - MyMarginGravity_Vert_Bottom = 4 << 8, - MyMarginGravity_Vert_Window_Center = 8 << 8, //屏幕垂直居中 - MyMarginGravity_Vert_Fill = MyMarginGravity_Vert_Top | MyMarginGravity_Vert_Center | MyMarginGravity_Vert_Bottom, - MyMarginGravity_Vert_Mask = 0x00FF, + + MyGravity_Center = MyGravity_Horz_Center | MyGravity_Vert_Center, /**整体居中*/ - //居中 - MyMarginGravity_Center = MyMarginGravity_Horz_Center | MyMarginGravity_Vert_Center, + + MyGravity_Fill = MyGravity_Horz_Fill | MyGravity_Vert_Fill, /**全部填充*/ + + + MyGravity_Between = MyGravity_Horz_Between | MyGravity_Vert_Between, /**全部拉伸*/ + + //基线对齐,只用在水平线性布局和垂直流式布局中,暂时不支持。 + MyGravity_Baseline = 32 << 8, //基线对齐,只支持水平线性布局和垂直流式布局,指定基线对齐必须要指定出一个基线标准的子视图,如果不指定默认是第一个。 + + + //为了更正确的统一命名规范以及和TangramKit保持一致,下列属性定义设置为过期!!。您在更新版本后只需要统一将MyMarginGravity替换为MyGravity 即可 + MyMarginGravity_None MYMETHODDEPRECATED("use MyGravity_None to instead") = MyGravity_None, + MyMarginGravity_Horz_Left MYMETHODDEPRECATED("use MyGravity_Horz_Left to instead") = MyGravity_Horz_Left, + MyMarginGravity_Horz_Center MYMETHODDEPRECATED("use MyGravity_Horz_Center to instead") = MyGravity_Horz_Center, + MyMarginGravity_Horz_Right MYMETHODDEPRECATED("use MyGravity_Horz_Right to instead") = MyGravity_Horz_Right, + MyMarginGravity_Horz_Window_Center MYMETHODDEPRECATED("use MyGravity_Horz_Window_Center to instead") = MyGravity_Horz_Window_Center, + MyMarginGravity_Horz_Between MYMETHODDEPRECATED("use MyGravity_Horz_Between to instead") = MyGravity_Horz_Between, + MyMarginGravity_Horz_Fill MYMETHODDEPRECATED("use MyGravity_Horz_Fill to instead") = MyGravity_Horz_Fill, + MyMarginGravity_Horz_Mask MYMETHODDEPRECATED("use MyGravity_Horz_Mask to instead") = MyGravity_Horz_Mask, + MyMarginGravity_Vert_Top MYMETHODDEPRECATED("use MyGravity_Vert_Top to instead") = MyGravity_Vert_Top, + MyMarginGravity_Vert_Center MYMETHODDEPRECATED("use MyGravity_Vert_Center to instead") = MyGravity_Vert_Center, + MyMarginGravity_Vert_Bottom MYMETHODDEPRECATED("use MyGravity_Vert_Bottom to instead") = MyGravity_Vert_Bottom, + MyMarginGravity_Vert_Window_Center MYMETHODDEPRECATED("use MyGravity_Vert_Window_Center to instead") = MyGravity_Vert_Window_Center, + MyMarginGravity_Vert_Between MYMETHODDEPRECATED("use MyGravity_Vert_Between to instead") = MyGravity_Vert_Between, + MyMarginGravity_Vert_Fill MYMETHODDEPRECATED("use MyGravity_Vert_Fill to instead") = MyGravity_Vert_Fill, + MyMarginGravity_Vert_Mask MYMETHODDEPRECATED("use MyGravity_Vert_Mask to instead") = MyGravity_Vert_Mask, + MyMarginGravity_Center MYMETHODDEPRECATED("use MyGravity_Center to instead") = MyGravity_Center, + MyMarginGravity_Fill MYMETHODDEPRECATED("use MyGravity_Fill to instead") = MyGravity_Fill, + MyMarginGravity_Between MYMETHODDEPRECATED("use MyGravity_Between to instead") = MyGravity_Between + +} MyGravity; - //填充 - MyMarginGravity_Fill = MyMarginGravity_Horz_Fill | MyMarginGravity_Vert_Fill, +//为了兼容老版本出现告警而定义。 +typedef MyGravity MyMarginGravity MYMETHODDEPRECATED("use MyGravity to instead"); + + +/** + *设置当将布局视图嵌入到UIScrollView以及其派生类时对UIScrollView的contentSize的调整设置模式的枚举类型定义。 + *当将一个布局视图作为子视图添加到UIScrollView或者其派生类时(UITableView,UICollectionView除外)系统会自动调整和计算并设置其中的contentSize值。您可以使用布局视图的属性adjustScrollViewContentSizeMode来进行设置定义的枚举值。 + */ +typedef enum :unsigned char +{ + MyAdjustScrollViewContentSizeModeAuto = 0, /**自动调整,在添加到UIScrollView之前(UITableView, UICollectionView除外)。如果值被设置Auto则在添加到父视图后自动会变为YES。*/ + MyAdjustScrollViewContentSizeModeNo = 1, /**不调整,任何加入到UIScrollView中的布局视图在尺寸变化时都不会调整和设置contentSize的值。*/ + MyAdjustScrollViewContentSizeModeYes = 2, /**会调整,任何加入到UIScrollView中的布局视图在尺寸变化时都会调整和设置contentSize的值。*/ + //下面为兼容老版本而定义,请使用新属性 + MyLayoutAdjustScrollViewContentSizeModeAuto MYMETHODDEPRECATED("use MyAdjustScrollViewContentSizeModeAuto to instead") = MyAdjustScrollViewContentSizeModeAuto, + MyLayoutAdjustScrollViewContentSizeModeNo MYMETHODDEPRECATED("use MyAdjustScrollViewContentSizeModeNo to instead") = MyAdjustScrollViewContentSizeModeNo, + MyLayoutAdjustScrollViewContentSizeModeYes MYMETHODDEPRECATED("use MyAdjustScrollViewContentSizeModeYes to instead") = MyAdjustScrollViewContentSizeModeYes, -} MyMarginGravity; +}MyAdjustScrollViewContentSizeMode; +//为兼容老版本而定义 +typedef MyAdjustScrollViewContentSizeMode MyLayoutAdjustScrollViewContentSizeMode MYMETHODDEPRECATED("use MyAdjustScrollViewContentSizeMode to instead"); -//布局视图排列的方向定义 +/** + *用来设置当线性布局中的子视图的尺寸大于线性布局的尺寸时的子视图的压缩策略和压缩内容枚举类型定义。请参考线性布局的shrinkType属性的定义。 + */ typedef enum : NSUInteger { - MyLayoutViewOrientation_Vert = 0, //整体从上到下 - MyLayoutViewOrientation_Horz = 1, //整体从左到右 -} MyLayoutViewOrientation; - + MySubviewsShrink_None = 0, /**不压缩。*/ + MySubviewsShrink_Average = 1, /**平均压缩。*/ + MySubviewsShrink_Weight = 2, /**比例压缩。*/ + MySubviewsShrink_Auto = 4, /**自动压缩。这个属性只有在水平线性布局里面并且只有2个子视图的宽度等于自身时才有用。这个属性主要用来实现左右两个子视图根据自身内容来进行缩放,以便实现最佳的宽度空间利用。*/ + + //上面部分是压缩的策略,下面部分指定压缩的内容,因此一个shrinkType的指定时上面部分和下面部分的 | 操作。比如让间距平均压缩:MySubviewsShrink_Average | MySubviewsShrink_Space + MySubviewsShrink_Size = 0 << 4, /**只压缩尺寸,因为这里是0所以这部分可以不设置,为默认。*/ + MySubviewsShrink_Space = 1 << 4, /**只压缩间距。*/ + MySubviewsShrink_SizeAndSpace = 2 << 4 /**压缩尺寸和间距。暂时不支持!!!*/ + +} MySubviewsShrinkType; //内部使用 @@ -90,5 +177,6 @@ typedef enum : unsigned char MyLayoutValueType_NSNumber, MyLayoutValueType_LayoutDime, MyLayoutValueType_LayoutPos, - MyLayoutValueType_Array + MyLayoutValueType_Array, + MyLayoutValueType_UILayoutSupport }MyLayoutValueType; diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.h deleted file mode 100644 index 0071713..0000000 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// MyLayoutDime.h -// MyLayout -// -// Created by oybq on 15/6/14. -// Copyright (c) 2015年 YoungSoft. All rights reserved. -// - -#import "MyLayoutDef.h" - -/** - *视图的布局尺寸类,用来设置视图在布局视图中的宽度和高度的尺寸值 - */ -@interface MyLayoutDime : NSObject - - -/** - *设置尺寸的具体值,这个具体值可以设置为NSNumber, MyLayoutDime以及NSArray数组和nil值。 - 设置为NSNumber值表示指定具体的宽度或者高度数值 - 设置为MyLayoutDime值表示宽度和高度与设置的对象有依赖关系, 甚至可以依赖对象本身 - 设置为NSArray数组的概念就是所有数组里面的子视图的尺寸平分父视图的尺寸。只有相对布局里面的子视图才支持这种设置。 - 设置为nil时则清除设置的具体值。 - */ --(MyLayoutDime* (^)(id val))equalTo; - -/** - *设置尺寸增加值。 - */ --(MyLayoutDime* (^)(CGFloat val))add; - - -/** - * 设置尺寸的倍数 - */ --(MyLayoutDime* (^)(CGFloat val))multiply; - - -/** - *设置尺寸的最小值。如果设置了则最小不能低于这个值。A.min(10) <==> A.lBound(@10, 0, 1)。min方法是lBound方法的简化版本。 - */ --(MyLayoutDime* (^)(CGFloat val))min; -/** - * 设置尺寸的最小边界值。min方法只能设置最小的数值,但是lBound方法除了能将最小值设置为数值外,还可以设置为MyLayoutDime值。并且还可以指定增加的偏移值和放大的偏移值。 - *@sizeVal:指定边界的值类型,方法可以支持NSNumber和MyLayoutDime类型,前者表示最小限制为某个常量值,而后者表示最小限制为某个关联的视图的布局尺寸。 - *@addVal: 指定边界值限制的增量,如果没有增量请设置为0 - *@multiVal: 指定边界值限制的倍数,如果没有倍数请设置为1 - *最终限制的尺寸为: sizeVal的真实尺寸 * multiVal + addVal - *1.比如我们有一个UILabel的宽度是由内容决定的,但是最小的宽度不能低于B视图的宽度,则设置为: - A.widthDime.equalTo(A.widthDime).lBound(B.widthDime, 0, 1); - *2.比如我们有一个视图的宽度也是由内容决定的,但是最小的宽度不能低于父视图宽度的1/2,则设置为: - A.widthDime.equalTo(A.widthDime).lBound(superview.widthDime, 0, 0.5); - *3.比如我们有一个视图的宽度也是由内容决定的,但是最小的宽度是父视图的宽度-30,则设置为: - A.widthDime.equalTo(A.widthDime).lBound(superview.widthDime, -30, 1); - */ --(MyLayoutDime* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))lBound; - - -/** - *设置尺寸的最大值。如果设置了则最大不能超过这个值。A.max(10) <==> A.uBound(@10, 0, 1)。max方法是uBound方法的简化版本。 - */ --(MyLayoutDime* (^)(CGFloat val))max; -/** - * 设置尺寸的最小边界值。min方法只能设置最小的数值,但是lBound方法除了能将最小值设置为数值外,还可以设置为MyLayoutDime值。并且还可以指定增加的偏移值和放大的偏移值。 - *@sizeVal:指定边界的值类型,方法可以支持NSNumber和MyLayoutDime类型,前者表示最小限制为某个常量值,而后者表示最小限制为某个关联的视图的布局尺寸。 - *@addVal: 指定边界值限制的增量,如果没有增量请设置为0 - *@multiVal: 指定边界值限制的倍数,如果没有倍数请设置为1 - *最终限制的尺寸为: sizeVal的真实尺寸 * multiVal + addVal - *1.比如我们有一个UILabel的宽度是由内容决定的,但是最大的宽度不能超过父视图的宽度,则设置为: - A.widthDime.equalTo(A.widthDime).uBound(superview.widthDime, 0, 1); - *2.比如我们有一个视图的宽度也是由内容决定的,但是最大的宽度不能超过父视图宽度的1/2,则设置为: - A.widthDime.equalTo(A.widthDime).uBound(superview.widthDime, 0, 0.5); - *3.比如我们有一个视图的宽度也是由内容决定的,但是最大的宽度不能超过父视图的宽度-30,则设置为: - A.widthDime.equalTo(A.widthDime).uBound(superview.widthDime, -30, 1); - */ --(MyLayoutDime* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))uBound; - - -/** - *清除上面的所有设置的尺寸信息 - */ --(void)clear; - - -//上面方法设置的属性的获取。 -@property(nonatomic, strong, readonly) id dimeVal; -@property(nonatomic, assign, readonly) CGFloat addVal; -@property(nonatomic, assign, readonly) CGFloat mutilVal; -@property(nonatomic, assign, readonly) CGFloat minVal; -@property(nonatomic, assign, readonly) CGFloat maxVal; - - - -@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.m b/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.m deleted file mode 100644 index 72f329b..0000000 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutDime.m +++ /dev/null @@ -1,392 +0,0 @@ -// -// MyLayoutDime.m -// MyLayout -// -// Created by oybq on 15/6/14. -// Copyright (c) 2015年 YoungSoft. All rights reserved. -// - -#import "MyLayoutDime.h" -#import "MyLayoutDimeInner.h" -#import "MyBaseLayout.h" - -@implementation MyLayoutDime -{ - id _dimeVal; - CGFloat _addVal; - CGFloat _mutilVal; - MyLayoutDime *_lBoundVal; - MyLayoutDime *_uBoundVal; -} - --(id)init -{ - self= [super init]; - if (self !=nil) - { - _view = nil; - _dime = MyMarginGravity_None; - _dimeVal = nil; - _dimeValType = MyLayoutValueType_Nil; - _addVal = 0; - _mutilVal = 1; - _lBoundVal = [[MyLayoutDime alloc] initWithNoBound]; - _lBoundVal.equalTo(@(-CGFLOAT_MAX)); - _uBoundVal = [[MyLayoutDime alloc] initWithNoBound]; - _uBoundVal.equalTo(@(CGFLOAT_MAX)); - - } - - return self; -} - --(id)initWithNoBound -{ - self = [super init]; - if (self !=nil) - { - _view = nil; - _dime = MyMarginGravity_None; - _dimeVal = nil; - _dimeValType = MyLayoutValueType_Nil; - _addVal = 0; - _mutilVal = 1; - _lBoundVal = nil; - _uBoundVal = nil; - } - - return self; -} - - --(MyLayoutDime* (^)(id val))equalTo -{ - return ^id(id val){ - - if (![_dimeVal isEqual:val]) - { - _dimeVal = val; - - if ([val isKindOfClass:[NSNumber class]]) - { - _dimeValType = MyLayoutValueType_NSNumber; - } - else if ([val isKindOfClass:[MyLayoutDime class]]) - { - _dimeValType = MyLayoutValueType_LayoutDime; - - //我们支持尺寸等于自己的情况,用来支持那些尺寸包裹内容但又想扩展尺寸的场景,为了不造成循环引用这里做特殊处理 - //当尺寸等于自己时,我们只记录_dimeValType,而把值设置为nil - if (val == self) - _dimeVal = nil; - } - else if ([val isKindOfClass:[NSArray class]]) - { - _dimeValType = MyLayoutValueType_Array; - } - else - { - _dimeValType = MyLayoutValueType_Nil; - } - - [self setNeedLayout]; - } - else - { - //参考上面自己等于自己的特殊情况需要特殊处理。 - if (val == nil && _dimeVal == nil && _dimeValType == MyLayoutValueType_LayoutDime) - { - _dimeValType = MyLayoutValueType_Nil; - [self setNeedLayout]; - } - } - - return self; - }; - -} - -//加 --(MyLayoutDime* (^)(CGFloat val))add -{ - return ^id(CGFloat val){ - - if (_addVal != val) - { - _addVal = val; - [self setNeedLayout]; - } - - return self; - - }; - -} - - -//乘 --(MyLayoutDime* (^)(CGFloat val))multiply -{ - return ^id(CGFloat val){ - - if (_mutilVal != val) - { - _mutilVal = val; - [self setNeedLayout]; - } - - return self; - }; - -} - - --(MyLayoutDime* (^)(CGFloat val))min -{ - return ^id(CGFloat val){ - - if (_lBoundVal.dimeNumVal.doubleValue != val) - { - _lBoundVal.equalTo(@(val)); - [self setNeedLayout]; - } - - return self; - }; -} - --(MyLayoutDime* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))lBound -{ - return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ - - _lBoundVal.equalTo(sizeVal).add(addVal).multiply(multiVal); - [self setNeedLayout]; - - return self; - }; - -} - - --(MyLayoutDime* (^)(CGFloat val))max -{ - return ^id(CGFloat val){ - - if (_uBoundVal.dimeNumVal.doubleValue != val) - { - _uBoundVal.equalTo(@(val)); - [self setNeedLayout]; - } - - return self; - }; -} - --(MyLayoutDime* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))uBound -{ - return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ - - _uBoundVal.equalTo(sizeVal).add(addVal).multiply(multiVal); - [self setNeedLayout]; - - return self; - }; -} - - - --(void)clear -{ - _addVal = 0; - _mutilVal = 1; - _lBoundVal.equalTo(@(-CGFLOAT_MAX)).add(0).multiply(1); - _uBoundVal.equalTo(@(CGFLOAT_MAX)).add(0).multiply(1); - _dimeVal = nil; - _dimeValType = MyLayoutValueType_Nil; - - [self setNeedLayout]; -} - - - --(id)dimeVal -{ - if (_dimeValType == MyLayoutValueType_LayoutDime && _dimeVal == nil) - return self; - - return _dimeVal; -} - --(NSNumber*)dimeNumVal -{ - if (_dimeVal == nil) - return nil; - if (_dimeValType == MyLayoutValueType_NSNumber) - return _dimeVal; - return nil; -} - --(MyLayoutDime*)dimeRelaVal -{ - if (_dimeVal == nil) - return nil; - if (_dimeValType == MyLayoutValueType_LayoutDime) - return _dimeVal; - return nil; - -} - - --(NSArray*)dimeArrVal -{ - if (_dimeVal == nil) - return nil; - if (_dimeValType == MyLayoutValueType_Array) - return _dimeVal; - return nil; - -} - - --(MyLayoutDime*)dimeSelfVal -{ - if (_dimeValType == MyLayoutValueType_LayoutDime && _dimeVal == nil) - return self; - - return nil; -} - - --(MyLayoutDime*)lBoundVal -{ - return _lBoundVal; -} - --(MyLayoutDime*)uBoundVal -{ - return _uBoundVal; -} - - --(BOOL)isMatchParent -{ - return self.dimeRelaVal != nil && self.dimeRelaVal.view == _view.superview; -} - - --(BOOL)isMatchView:(UIView*)v -{ - return self.dimeRelaVal != nil && self.dimeRelaVal.view == v; -} - - --(CGFloat) measure -{ - return self.dimeNumVal.doubleValue * _mutilVal + _addVal; -} - -#pragma mark -- NSCopying - --(id)copyWithZone:(NSZone *)zone -{ - MyLayoutDime *ld = [[[self class] allocWithZone:zone] init]; - ld.view = self.view; - ld.dime = self.dime; - ld->_addVal = self.addVal; - ld->_lBoundVal.equalTo(_lBoundVal.dimeVal).add(_lBoundVal.addVal).multiply(_lBoundVal.mutilVal); - ld->_uBoundVal.equalTo(_uBoundVal.dimeVal).add(_uBoundVal.addVal).multiply(_uBoundVal.mutilVal); - ld->_mutilVal = self.mutilVal; - ld->_dimeVal = self->_dimeVal; - ld.dimeValType = self.dimeValType; - - return self; -} - -#pragma mark -- Private Method - --(void)setNeedLayout -{ - if (_view != nil && _view.superview != nil && [_view.superview isKindOfClass:[MyBaseLayout class]]) - { - MyBaseLayout* lb = (MyBaseLayout*)_view.superview; - if (!lb.isMyLayouting) - [_view.superview setNeedsLayout]; - } - -} - - -+(NSString*)dimestrFromDime:(MyLayoutDime*)dimeobj showView:(BOOL)showView -{ - - NSString *viewstr = @""; - if (showView) - { - viewstr = [NSString stringWithFormat:@"View:%p.", dimeobj.view]; - } - - NSString *dimeStr = @""; - - switch (dimeobj.dime) { - case MyMarginGravity_Horz_Fill: - dimeStr = @"WidthDime"; - break; - case MyMarginGravity_Vert_Fill: - dimeStr = @"HeightDime"; - break; - default: - break; - } - - return [NSString stringWithFormat:@"%@%@",viewstr,dimeStr]; - -} - --(NSString*)description -{ - NSString *dimeValStr = @""; - switch (_dimeValType) { - case MyLayoutValueType_Nil: - dimeValStr = @"nil"; - break; - case MyLayoutValueType_NSNumber: - dimeValStr = [_dimeVal description]; - break; - case MyLayoutValueType_LayoutDime: - dimeValStr = [MyLayoutDime dimestrFromDime:_dimeVal showView:YES]; - break; - case MyLayoutValueType_Array: - { - dimeValStr = @"["; - for (NSObject *obj in _dimeVal) - { - if ([obj isKindOfClass:[MyLayoutDime class]]) - { - dimeValStr = [dimeValStr stringByAppendingString:[MyLayoutDime dimestrFromDime:(MyLayoutDime*)obj showView:YES]]; - } - else - { - dimeValStr = [dimeValStr stringByAppendingString:[obj description]]; - - } - - if (obj != [_dimeVal lastObject]) - dimeValStr = [dimeValStr stringByAppendingString:@", "]; - - } - - dimeValStr = [dimeValStr stringByAppendingString:@"]"]; - - } - default: - break; - } - - return [NSString stringWithFormat:@"%@=%@, Multiply=%g, Add=%g, Max=%g, Min=%g",[MyLayoutDime dimestrFromDime:self showView:NO], dimeValStr, _mutilVal, _addVal, _uBoundVal.dimeNumVal.doubleValue == CGFLOAT_MAX ? NAN : _uBoundVal.dimeNumVal.doubleValue , _lBoundVal.dimeNumVal.doubleValue == -CGFLOAT_MAX ? NAN : _lBoundVal.dimeNumVal.doubleValue]; - -} - - - -@end - diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutDimeInner.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutDimeInner.h deleted file mode 100644 index 20dde67..0000000 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutDimeInner.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// MyLayoutDimeInner.h -// MyLayout -// -// Created by oybq on 15/6/14. -// Copyright (c) 2015年 YoungSoft. All rights reserved. -// - -#import "MyLayoutDime.h" - - -//尺寸对象内部定义 -@interface MyLayoutDime() - -@property(nonatomic, weak) UIView *view; -@property(nonatomic, assign) MyMarginGravity dime; -@property(nonatomic, assign) MyLayoutValueType dimeValType; - -@property(nonatomic, readonly, strong) NSNumber *dimeNumVal; -@property(nonatomic, readonly, strong) MyLayoutDime *dimeRelaVal; -@property(nonatomic, readonly, strong) NSArray *dimeArrVal; -@property(nonatomic, readonly, strong) MyLayoutDime *dimeSelfVal; - -@property(nonatomic, readonly, strong) MyLayoutDime *lBoundVal; -@property(nonatomic, readonly, strong) MyLayoutDime *uBoundVal; - - -//是否跟父视图相关 -@property(nonatomic, readonly,assign) BOOL isMatchParent; - --(BOOL)isMatchView:(UIView*)v; - -//只有为数值时才有意义。 -@property(nonatomic, readonly, assign) CGFloat measure; - - -@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutInner.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutInner.h index 1d35d7c..3a66fa3 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutInner.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutInner.h @@ -8,64 +8,171 @@ #import "MyLayoutDef.h" #import "MyLayoutPosInner.h" -#import "MyLayoutDimeInner.h" -#import "MyLayoutMeasure.h" +#import "MyLayoutSizeInner.h" #import "MyLayoutSizeClass.h" -@interface MyBaseLayout() +//视图在布局中的评估测量值 +@interface MyFrame : NSObject + +@property(nonatomic, assign) CGFloat top; +@property(nonatomic, assign) CGFloat leading; +@property(nonatomic, assign) CGFloat bottom; +@property(nonatomic, assign) CGFloat trailing; +@property(nonatomic, assign) CGFloat width; +@property(nonatomic, assign) CGFloat height; + +@property(nonatomic, weak) UIView *sizeClass; + +@property(nonatomic, assign, readonly) BOOL multiple; //是否设置了多个sizeclass + +@property(nonatomic, strong) NSMutableDictionary *sizeClasses; + +@property(nonatomic, assign) BOOL hasObserver; + +-(void)reset; +@property(nonatomic,assign) CGRect frame; + +@end + + + +@interface MyTouchEventDelegate : NSObject + +-(instancetype)initWithLayout:(MyBaseLayout*)layout; + +- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; +- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; +- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; +- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; + +-(void)setTarget:(id)target action:(SEL)action; +-(void)setTouchDownTarget:(id)target action:(SEL)action; +-(void)setTouchCancelTarget:(id)target action:(SEL)action; + +@end + + +/**绘制线条层委托实现类**/ +#ifdef MAC_OS_X_VERSION_10_12 +@interface MyBorderlineLayerDelegate : NSObject +#else +@interface MyBorderlineLayerDelegate : NSObject +#endif + +@property(nonatomic, strong) MyBorderline *topBorderline; /**顶部边界线*/ +@property(nonatomic, strong) MyBorderline *leadingBorderline; /**头部边界线*/ +@property(nonatomic, strong) MyBorderline *bottomBorderline; /**底部边界线*/ +@property(nonatomic, strong) MyBorderline *trailingBorderline; /**尾部边界线*/ +@property(nonatomic, strong) MyBorderline *leftBorderline; /**左边边界线*/ +@property(nonatomic, strong) MyBorderline *rightBorderline; /**左边边界线*/ + + +@property(nonatomic ,weak) CAShapeLayer *topBorderlineLayer; +@property(nonatomic ,weak) CAShapeLayer *leadingBorderlineLayer; +@property(nonatomic ,weak) CAShapeLayer *bottomBorderlineLayer; +@property(nonatomic ,weak) CAShapeLayer *trailingBorderlineLayer; + + +-(instancetype)initWithLayout:(MyBaseLayout*)layout; + +-(void)setNeedsLayout; + +@end + + +@interface MyBaseLayout() -@property(nonatomic ,strong) CAShapeLayer *leftBorderLineLayer; -@property(nonatomic ,strong) CAShapeLayer *rightBorderLineLayer; -@property(nonatomic ,strong) CAShapeLayer *topBorderLineLayer; -@property(nonatomic ,strong) CAShapeLayer *bottomBorderLineLayer; //派生类重载这个函数进行布局 --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass; +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs; + +-(id)createSizeClassInstance; //判断margin是否是相对margin --(BOOL)isRelativeMargin:(CGFloat)margin; +-(BOOL)myIsRelativePos:(CGFloat)margin; + +-(MyGravity)myGetSubviewVertGravity:(UIView*)sbv sbvsc:(UIView*)sbvsc vertGravity:(MyGravity)vertGravity; + +-(void)myCalcVertGravity:(MyGravity)vert + sbv:(UIView *)sbv + sbvsc:(UIView*)sbvsc + paddingTop:(CGFloat)paddingTop + paddingBottom:(CGFloat)paddingBottom + selfSize:(CGSize)selfSize + pRect:(CGRect*)pRect; --(void)vertGravity:(MyMarginGravity)vert - selfSize:(CGSize)selfSize - sbv:(UIView*)sbv - rect:(CGRect*)pRect; +-(MyGravity)myGetSubviewHorzGravity:(UIView*)sbv sbvsc:(UIView*)sbvsc horzGravity:(MyGravity)horzGravity; --(void)horzGravity:(MyMarginGravity)horz - selfSize:(CGSize)selfSize - sbv:(UIView*)sbv - rect:(CGRect*)pRect; +-(void)myCalcHorzGravity:(MyGravity)horz + sbv:(UIView *)sbv + sbvsc:(UIView*)sbvsc + paddingLeading:(CGFloat)paddingLeading + paddingTrailing:(CGFloat)paddingTrailing + selfSize:(CGSize)selfSize + pRect:(CGRect*)pRect; +-(void)myCalcSizeOfWrapContentSubview:(UIView*)sbv sbvsc:(UIView*)sbvsc sbvmyFrame:(MyFrame*)sbvmyFrame selfLayoutSize:(CGSize)selfLayoutSize; --(void)setWrapContentWidthNoLayout:(BOOL)wrapContentWidth; +-(CGFloat)myHeightFromFlexedHeightView:(UIView*)sbv sbvsc:(UIView*)sbvsc inWidth:(CGFloat)width; --(void)setWrapContentHeightNoLayout:(BOOL)wrapContentHeight; +-(CGFloat)myValidMeasure:(MyLayoutSize*)dime sbv:(UIView*)sbv calcSize:(CGFloat)calcSize sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize; --(void)calcSizeOfWrapContentSubview:(UIView*)sbv; +-(CGFloat)myValidMargin:(MyLayoutPos*)pos sbv:(UIView*)sbv calcPos:(CGFloat)calcPos selfLayoutSize:(CGSize)selfLayoutSize; +-(BOOL)myIsNoLayoutSubview:(UIView*)sbv; --(CGFloat)heightFromFlexedHeightView:(UIView*)sbv inWidth:(CGFloat)width; +-(NSMutableArray*)myGetLayoutSubviews; +-(NSMutableArray*)myGetLayoutSubviewsFrom:(NSArray*)sbsFrom; --(CGFloat)validMeasure:(MyLayoutDime*)dime sbv:(UIView*)sbv calcSize:(CGFloat)calcSize sbvSize:(CGSize)sbvSize selfLayoutSize:(CGSize)selfLayoutSize; +//设置子视图的相对依赖的尺寸 +-(void)mySetSubviewRelativeDimeSize:(MyLayoutSize*)dime selfSize:(CGSize)selfSize lsc:(MyBaseLayout*)lsc pRect:(CGRect*)pRect; --(CGFloat)validMargin:(MyLayoutPos*)pos sbv:(UIView*)sbv calcPos:(CGFloat)calcPos selfLayoutSize:(CGSize)selfLayoutSize; +-(CGSize)myAdjustSizeWhenNoSubviews:(CGSize)size sbs:(NSArray*)sbs lsc:(MyBaseLayout*)lsc; + +- (void)myAdjustLayoutSelfSize:(CGSize *)pSelfSize lsc:(MyBaseLayout*)lsc; + +-(void)myAdjustSubviewsRTLPos:(NSArray*)sbs selfWidth:(CGFloat)selfWidth; + +-(MyGravity)myConvertLeftRightGravityToLeadingTrailing:(MyGravity)horzGravity; @end +@interface MyViewSizeClass() + +@property(nonatomic, strong,readonly) MyLayoutPos *topPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *leadingPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *bottomPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *trailingPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *centerXPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *centerYPosInner; +@property(nonatomic, strong,readonly) MyLayoutSize *widthSizeInner; +@property(nonatomic, strong,readonly) MyLayoutSize *heightSizeInner; + +@property(nonatomic, strong,readonly) MyLayoutPos *leftPosInner; +@property(nonatomic, strong,readonly) MyLayoutPos *rightPosInner; + +#if UIKIT_DEFINE_AS_PROPERTIES +@property(class, nonatomic, assign) BOOL isRTL; +#else ++(BOOL)isRTL; ++(void)setIsRTL:(BOOL)isRTL; +#endif +@end @interface UIView(MyLayoutExtInner) -@property(nonatomic, strong, readonly) MyLayoutMeasure *absPos; +@property(nonatomic, strong, readonly) MyFrame *myFrame; -(instancetype)myDefaultSizeClass; @@ -74,7 +181,43 @@ -(instancetype)myCurrentSizeClass; +-(instancetype)myCurrentSizeClassInner; + + +-(instancetype)myCurrentSizeClassFrom:(MyFrame*)myFrame; + -(id)createSizeClassInstance; + +@property(nonatomic, readonly) MyLayoutPos *topPosInner; +@property(nonatomic, readonly) MyLayoutPos *leadingPosInner; +@property(nonatomic, readonly) MyLayoutPos *bottomPosInner; +@property(nonatomic, readonly) MyLayoutPos *trailingPosInner; +@property(nonatomic, readonly) MyLayoutPos *centerXPosInner; +@property(nonatomic, readonly) MyLayoutPos *centerYPosInner; +@property(nonatomic, readonly) MyLayoutSize *widthSizeInner; +@property(nonatomic, readonly) MyLayoutSize *heightSizeInner; + +@property(nonatomic, readonly) MyLayoutPos *leftPosInner; +@property(nonatomic, readonly) MyLayoutPos *rightPosInner; + + + @end + +extern BOOL _myCGFloatEqual(CGFloat f1, CGFloat f2); +extern BOOL _myCGFloatNotEqual(CGFloat f1, CGFloat f2); +extern BOOL _myCGFloatLessOrEqual(CGFloat f1, CGFloat f2); +extern BOOL _myCGFloatGreatOrEqual(CGFloat f1, CGFloat f2); +extern BOOL _myCGSizeEqual(CGSize sz1, CGSize sz2); +extern BOOL _myCGPointEqual(CGPoint pt1, CGPoint pt2); +extern BOOL _myCGRectEqual(CGRect rect1, CGRect rect2); + + +extern CGFloat _myRoundNumber(CGFloat f); +extern CGRect _myRoundRect(CGRect rect); +extern CGSize _myRoundSize(CGSize size); +extern CGPoint _myRoundPoint(CGPoint point); +extern CGRect _myRoundRectForLayout(CGRect rect); + diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.h deleted file mode 100644 index 319f0e6..0000000 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// MyLayoutMeasure.h -// MyLayout -// -// Created by oybq on 15/6/14. -// Copyright (c) 2015年 YoungSoft. All rights reserved. -// - -#import "MyLayoutDef.h" -#import "MyLayoutSizeClass.h" - - -//视图在布局中的评估测量值 -@interface MyLayoutMeasure : NSObject - -@property(nonatomic, assign) CGFloat leftPos; -@property(nonatomic, assign) CGFloat rightPos; -@property(nonatomic, assign) CGFloat topPos; -@property(nonatomic, assign) CGFloat bottomPos; -@property(nonatomic, assign) CGFloat width; -@property(nonatomic, assign) CGFloat height; - -@property(nonatomic, weak) UIView *sizeClass; - - --(void)reset; - -@property(nonatomic,assign) CGRect frame; - -@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.m b/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.m deleted file mode 100644 index fe6c355..0000000 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutMeasure.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// MyLayoutMeasure.m -// MyLayout -// -// Created by oybq on 15/6/14. -// Copyright (c) 2015年 YoungSoft. All rights reserved. -// - -#import "MyLayoutMeasure.h" - -@implementation MyLayoutMeasure - --(id)init -{ - self = [super init]; - if (self != nil) - { - _leftPos = CGFLOAT_MAX; - _rightPos = CGFLOAT_MAX; - _topPos = CGFLOAT_MAX; - _bottomPos = CGFLOAT_MAX; - _width = CGFLOAT_MAX; - _height = CGFLOAT_MAX; - - } - - return self; -} - --(void)reset -{ - _leftPos = CGFLOAT_MAX; - _rightPos = CGFLOAT_MAX; - _topPos = CGFLOAT_MAX; - _bottomPos = CGFLOAT_MAX; - _width = CGFLOAT_MAX; - _height = CGFLOAT_MAX; -} - - --(CGRect)frame -{ - return CGRectMake(_leftPos, _topPos,_width, _height); -} - --(void)setFrame:(CGRect)frame -{ - _leftPos = frame.origin.x; - _topPos = frame.origin.y; - _width = frame.size.width; - _height = frame.size.height; - _rightPos = _leftPos + _width; - _bottomPos = _topPos + _height; -} - --(NSString*)description -{ - return [NSString stringWithFormat:@"LeftPos:%g, TopPos:%g, Width:%g, Height:%g, RightPos:%g, BottomPos:%g",_leftPos,_topPos,_width,_height,_rightPos,_bottomPos]; -} - - -@end - diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.h index 1dd30c4..8fe2523 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.h @@ -16,21 +16,22 @@ 下面的表格描述了各种布局下的子视图的布局位置对象的equalTo方法可以设置的值。 为了表示方便我们把:线性布局简写为L、相对布局简写为R、表格布局简写为T、框架布局简写为FR、流式布局简写为FL、浮动布局简写为FO、全部简写为ALL,不支持为- - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - |method\val|NSNumber|NSArray|leftPos|topPos|rightPos|bottomPos|centerXPos|centerYPos| - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - | leftPos | ALL | - | R | - | R | - | R | - | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - | topPos | ALL | - | - | R | - | R | - | R | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - |rightPos | ALL | - | R | - | R | - | R | - | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - |bottomPos | ALL | - | - | R | - | R | - | R | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - |centerXPos| ALL | R | R | - | R | - | R | - | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ - |centerYPos| ALL | R | - | R | - | R | - | R | - +----------+--------+---------------------+-------+------+--------+---------+----------+----------+ + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |method\val |NSNumber|NSArray|leftPos|topPos|rightPos|bottomPos|centerXPos|centerYPos|UILayoutSupport|UIView| + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + | topPos | ALL | - | - | R | - | R | - | R | L/R/FR/FO/FL |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |leftPos | ALL | - | R | - | R | - | R | - | - |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |bottomPos | ALL | - | - | R | - | R | - | R | L/R/FR/FO/FL |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |rightPos | ALL | - | R | - | R | - | R | - | - |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |centerXPos | ALL | R | R | - | R | - | R | - | - |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + |centerYPos | ALL | R | - | R | - | R | - | R | - |ALL | + +-----------+--------+---------------------+-------+------+--------+---------+----------+----------+---------------+------+ + 上表中所有布局下的子视图的布局位置都支持设置为数值,而数值对于线性布局,表格布局,框架布局这三种布局来说当设置的结果>0且<1时表示的是相对的边界值 比如一个框架布局的宽度是100,而其中的一个子视图的leftPos.equalTo(@0.1)则表示这个子视图左边距离框架布局的左边的宽度是100*0.1 @@ -43,7 +44,9 @@ 1.NSNumber: the layout position is equal to a number. e.g. leftPos.equalTo (@100) indicates that the value of the left boundary is 100. 2.MyLayoutPos: the layout position depends on aother layout position. e.g. A.leftPos.equalTo(B.rightPos) indicates that A is on the right side of B. 3.NSArray: all views in the array and View are centered. e.g. A.centerXPos.equalTo(@[B.centerXPos, C.centerXPos]) indicates that A,B,C are overall horizontal centered. - 4.nil: the layout position value is clear. + 4.id: you can only set topPos equalTo UIViewController‘s topLayoutGuide or bottomPos equalTo UIViewController‘s bottomLayoutGuide, then the view will always below the nav。 + 5.UIView: the layout position is depends view's relevant position. + 6.nil: the layout position value is clear. you can use offset() method of MyLayoutPos to set offset of the layout position,but it is generally used together when equalTo() is set at MyLayoutPos or NSArray. e.g. A.leftPos.equalTo(B.rightPos).offset(5) indicates that A is on the right side of B and increase 5 point offset. @@ -56,47 +59,143 @@ */ -/* +/** 视图的布局位置类是用来描述视图与其他视图之间的位置关系的类。视图在进行定位时需要明确的指出其在父视图坐标轴上的水平位置(x轴上的位置)和垂直位置(y轴上的位置)。 视图的水平位置可以用左、水平中、右三个方位的值来描述,垂直位置则可以用上、垂直中、下三个方位的值来描述。 也就是说一个视图的位置需要用水平的某个方位的值以及垂直的某个方位的值来确定。一个位置的值可以是一个具体的数值,也可以依赖于另外一个视图的位置来确定。 + + @code + 一个布局位置对象的最终位置值 = min(max(posVal + offsetVal, lBound.posVal+lBound.offsetVal), uBound.posVal+uBound.offsetVal) + 其中: + posVal是通过equalTo方法设置。 + offsetVal是通过offset方法设置。 + lBound.posVal,lBound.offsetVal是通过lBound方法设置。 + uBound.posVal,uBound.offsetVal是通过uBound方法设置。 + @endcode */ @interface MyLayoutPos : NSObject +//because masonry defined macro MAS_SHORTHAND_GLOBALS. the equalTo, offset may conflict with below method. so +//if you used MyLayout and Masonry concurrently and you defined MAS_SHORTHAND_GLOBALS in masonry, then you can define MY_USEPREFIXMETHOD to solve the conflict. +#ifdef MY_USEPREFIXMETHOD +-(MyLayoutPos* (^)(id val))myEqualTo; +-(MyLayoutPos* (^)(CGFloat val))myOffset; +-(MyLayoutPos* (^)(CGFloat val))myMin; +-(MyLayoutPos* (^)(id posVal, CGFloat offset))myLBound; +-(MyLayoutPos* (^)(CGFloat val))myMax; +-(MyLayoutPos* (^)(id posVal, CGFloat offset))myUBound; +-(void)myClear; + +#else /** - *设置布局位置的值。参数val可以接收下面四种类型的值: - *1.NSNumber表示位置是一个具体的数值。 - *2.MyLayoutPos表示位置依赖于另外一个位置。 - *3.NSArray表示位置和数组里面的其他位置整体居中。 - *4.nil表示位置的值被清除。 + 设置布局位置的值。参数val可以接收下面六种类型的值: + + 1. NSNumber表示位置是一个具体的数值。 + 对于框架布局和线性布局中的子视图来说,如果数值是一个大于0而小于1的数值时表示的是相对的间距或者边距。如果是相对边距那么真实的位置 = 布局视图尺寸*相对边距值;如果是相对间距那么真实的位置 = 布局视图剩余尺寸 * 相对间距值 /(所有相对间距值的总和)。 + + 2. MyLayoutPos表示位置依赖于另外一个位置。 + + 3. NSArray表示位置和数组里面的其他位置整体居中。 + + 4. id 对于iOS7以后视图控制器会根据导航条是否半透明而确定是占据整个屏幕。因此当topPos,bottomPos设置为视图控制器的topLayoutGuide或者bottomLayoutGuide时这样子视图就会偏移出导航条的高度,而如果没有导航条时则不会偏移出导航条的高度。注意的是这个值不能设置在非布局父视图的布局视图中。 + + 5. UIView表示位置依赖指定视图的对应位置。 + + 6. nil表示位置的值被清除。 */ -(MyLayoutPos* (^)(id val))equalTo; /** - *设置布局位置值的偏移量。 所谓偏移量是指布局位置在设置了某种值后增加或减少的偏移值。 - *比如:A.leftPos.equalTo(@10).offset(5)表示A视图的左边位置等于10再往右偏移5,也就是最终的左边位置是15。 - *比如:A.leftPos.equalTo(B.rightPos).offset(5)表示A视图的左边位置等于B视图的右边位置再往右偏移5. + 设置布局位置值的偏移量。 所谓偏移量是指布局位置在设置了某种值后增加或减少的偏移值。 + 这里偏移值的正负值所表示的意义是根据位置的不同而不同的: + + 1.如果是leftPos和centerXPos那么正数表示往右偏移,负数表示往左偏移。 + + 2.如果是topPos和centerYPos那么正数表示往下偏移,负数表示往上偏移。 + + 3.如果是rightPos那么正数表示往左偏移,负数表示往右偏移。 + + 4.如果是bottomPos那么正数表示往上偏移,负数表示往下偏移。 + + @code + 示例代码: + 1.比如:A.leftPos.equalTo(@10).offset(5)表示A视图的左边边距等于10再往右偏移5,也就是最终的左边边距是15。 + 2.比如:A.rightPos.equalTo(B.rightPos).offset(5)表示A视图的右边位置等于B视图的右边位置再往左偏移5。 + @endcode */ -(MyLayoutPos* (^)(CGFloat val))offset; + /** - *设置布局位置的最小值。这个方法一般和相对位置值配合使用。 + *设置位置的最小边界数值,min方法是lBound方法的简化版本。比如:A.min(10) <==> A.lBound(@10, 0) */ -(MyLayoutPos* (^)(CGFloat val))min; /** - *设置布局位置的最大值。这个方法一般和相对位置值配合使用。 + *设置布局位置的最小边界值。 如果位置对象没有设置最小边界值,那么最小边界默认就是无穷小-CGFLOAT_MAX。lBound方法除了能设置为NSNumber外,还可以设置为MyLayoutPos值,并且还可以指定最小位置的偏移量值。只有在相对布局中的子视图的位置对象才能设置最小边界值为MyLayoutPos类型的值,其他类型布局中的子视图只支持NSNumber类型的最小边界值。 + + posVal: 指定位置边界值。可设置的类型有NSNumber和MyLayoutPos类型,前者表示最小位置不能小于某个常量值,而后者表示最小位置不能小于另外一个位置对象所表示的位置值。 + + offsetVal: 指定位置边界值的偏移量。 + + 1.比如某个视图A的左边位置最小不能小于30则设置为: + @code + A.leftPos.lBound(30,0); 或者A.leftPos.lBound(20,10); + @endcode + + 2.对于相对布局中的子视图来说可以通过lBound值来实现那些尺寸不确定但是最小边界不能低于某个关联的视图的位置的场景,比如说视图B的位置和宽度固定,而A视图的右边位置固定,但是A视图的宽度不确定,且A的最左边不能小于B视图的右边边界加20,那么A就可以设置为: + @code + A.leftPos.lBound(B.rightPos, 20); //这时A是不必要指定明确的宽度的。 + @endcode + */ +-(MyLayoutPos* (^)(id posVal, CGFloat offsetVal))lBound; + + +/** + *设置位置的最大边界数值,max方法是uBound方法的简化版本。比如:A.max(10) <==> A.uBound(@10, 0) */ -(MyLayoutPos* (^)(CGFloat val))max; +/** + 设置布局位置的最大边界值。 如果位置对象没有设置最大边界值,那么最大边界默认就是无穷大CGFLOAT_MAX。uBound方法除了能设置为NSNumber外,还可以设置为MyLayoutPos值,并且还可以指定最大位置的偏移量值。只有在相对布局中的子视图的位置对象才能设置最大边界值为MyLayoutPos类型的值,其他类型布局中的子视图只支持NSNumber类型的最大边界值。 + + 1.比如某个视图A的左边位置最大不能超过30则设置为: + @code + A.leftPos.uBound(30,0); 或者A.leftPos.uBound(30,10); + @endcode + 2.对于相对布局中的子视图来说可以通过uBound值来实现那些尺寸不确定但是最大边界不能超过某个关联的视图的位置的场景,比如说视图B的位置和宽度固定,而A视图的左边位置固定,但是A视图的宽度不确定,且A的最右边不能超过B视图的左边边界减20,那么A就可以设置为: + @code + A.reftPos.uBound(B.leftPos, -20); //这时A是不必要指定明确的宽度的。 + @endcode + + 3.对于相对布局中的子视图来说可以同时通过lBound,uBound方法的设置来实现某个子视图总是在对应的两个其他的子视图中央显示且尺寸不能超过其他两个子视图边界的场景。比如说视图B要放置在A和C之间水平居中显示且不能超过A和C的边界。那么就可以设置为: + @code + B.leftPos.lBound(A.rightPos,0); B.rightPos.uBound(C.leftPos,0); //这时B不用指定宽度,而且总是在A和C的水平中间显示。 + @endcode + + posVal 指定位置边界值。可设置的类型有NSNumber和MyLayoutPos类型,前者表示最大位置不能大于某个常量值,而后者表示最大位置不能大于另外一个位置对象所表示的位置值。 + + offsetVal 指定位置边界值的偏移量。 + */ +-(MyLayoutPos* (^)(id posVal, CGFloat offsetVal))uBound; + /** - *清除上面方法设置的值 + *清除所有设置的约束值,这样位置对象将不会再生效了。 */ -(void)clear; +#endif + +/** + *设置布局位置是否是活动的,默认是YES表示活动的,如果设置为NO则表示这个布局位置对象设置的约束值将不会起作用。 + *active设置为YES和clear的相同点是位置对象设置的约束值都不会生效了,区别是前者不会清除所有设置的约束,而后者则会清除所有设置的约束。 + */ +@property(nonatomic, assign, getter=isActive) BOOL active; + + //通过如下属性获取上面方法设置的值。 @property(nonatomic, strong, readonly) id posVal; @property(nonatomic, assign, readonly) CGFloat offsetVal; diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.m b/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.m index d954f4d..249c5fe 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.m +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutPos.m @@ -25,86 +25,105 @@ -(id)init self = [super init]; if (self != nil) { + _active = YES; _view = nil; - _pos = MyMarginGravity_None; + _pos = MyGravity_None; _posVal = nil; _posValType = MyLayoutValueType_Nil; _offsetVal = 0; - _lBoundVal = [[MyLayoutPos alloc] initWithNoBound]; - _lBoundVal.equalTo(@(-CGFLOAT_MAX)); - _uBoundVal = [[MyLayoutPos alloc] initWithNoBound]; - _uBoundVal.equalTo(@(CGFLOAT_MAX)); + _lBoundVal = nil; + _uBoundVal = nil; } return self; } --(id)initWithNoBound + + +-(MyLayoutPos* (^)(id val))myEqualTo { - self = [super init]; - if (self !=nil) - { - _view = nil; - _pos = MyMarginGravity_None; - _posVal = nil; - _posValType = MyLayoutValueType_Nil; - _offsetVal = 0; - } - - return self; + return ^id(id val){ + + return [self __equalTo:val]; + }; } --(MyLayoutPos* (^)(id val))equalTo +-(MyLayoutPos* (^)(CGFloat val))myOffset { - return ^id(id val){ + return ^id(CGFloat val){ - if (![_posVal isEqual:val]) - { - _posVal = val; - if ([val isKindOfClass:[NSNumber class]]) - _posValType = MyLayoutValueType_NSNumber; - else if ([val isKindOfClass:[MyLayoutPos class]]) - _posValType = MyLayoutValueType_LayoutPos; - else if ([val isKindOfClass:[NSArray class]]) - _posValType = MyLayoutValueType_Array; - else - _posValType = MyLayoutValueType_Nil; - - [self setNeedLayout]; - } + return [self __offset:val]; + }; +} + + +-(MyLayoutPos* (^)(CGFloat val))myMin +{ + return ^id(CGFloat val){ - return self; + return [self __min:val]; }; - } --(MyLayoutPos* (^)(CGFloat val))offset + +-(MyLayoutPos* (^)(CGFloat val))myMax { return ^id(CGFloat val){ - if (_offsetVal != val) - { - _offsetVal = val; - [self setNeedLayout]; - } + return [self __max:val]; + }; +} + +-(MyLayoutPos* (^)(id posVal, CGFloat offset))myLBound +{ + return ^id(id posVal, CGFloat offset){ - return self; + return [self __lBound:posVal offsetVal:offset]; }; } --(MyLayoutPos* (^)(CGFloat val))min +-(MyLayoutPos* (^)(id posVal, CGFloat offset))myUBound { - return ^id(CGFloat val){ + return ^id(id posVal, CGFloat offset){ - if (_lBoundVal.posNumVal.doubleValue != val) - { - _lBoundVal.equalTo(@(val)); - - [self setNeedLayout]; - } + return [self __uBound:posVal offsetVal:offset]; + }; +} + + + + + +-(void)myClear +{ + [self __clear]; +} + + +-(MyLayoutPos* (^)(id val))equalTo +{ + return ^id(id val){ - return self; + return [self __equalTo:val]; + }; +} + + +-(MyLayoutPos* (^)(CGFloat val))offset +{ + return ^id(CGFloat val){ + + return [self __offset:val]; + }; +} + + +-(MyLayoutPos* (^)(CGFloat val))min +{ + return ^id(CGFloat val){ + + return [self __min:val]; }; } @@ -112,27 +131,16 @@ -(id)initWithNoBound { return ^id(id posVal, CGFloat offsetVal){ - _lBoundVal.equalTo(posVal).offset(offsetVal); - - [self setNeedLayout]; - - return self; + return [self __lBound:posVal offsetVal:offsetVal]; }; - } -(MyLayoutPos* (^)(CGFloat val))max { return ^id(CGFloat val){ - - if (_uBoundVal.posNumVal.doubleValue != val) - { - _uBoundVal.equalTo(@(val)); - [self setNeedLayout]; - } - - return self; + + return [self __max:val]; }; } @@ -140,37 +148,95 @@ -(id)initWithNoBound { return ^id(id posVal, CGFloat offsetVal){ - _uBoundVal.equalTo(posVal).offset(offsetVal); - - [self setNeedLayout]; - - return self; + return [self __uBound:posVal offsetVal:offsetVal]; }; - } + -(void)clear { - _posVal = nil; - _posValType = MyLayoutValueType_Nil; - _offsetVal = 0; - _lBoundVal.equalTo(@(-CGFLOAT_MAX)).offset(0); - _uBoundVal.equalTo(@(CGFLOAT_MAX)).offset(0); - [self setNeedLayout]; + [self __clear]; +} + + +-(void)setActive:(BOOL)active +{ + if (_active != active) + { + _active = active; + _lBoundVal.active = active; + _uBoundVal.active = active; + [self setNeedsLayout]; + } } +-(id)posVal +{ + return self.isActive ? _posVal : nil; +} + +-(CGFloat)offsetVal +{ + return self.isActive? _offsetVal : 0; +} + +-(CGFloat)minVal +{ + return self.isActive && _lBoundVal != nil ? _lBoundVal.posNumVal.doubleValue : -CGFLOAT_MAX; +} + +-(CGFloat)maxVal +{ + return self.isActive && _uBoundVal != nil ? _uBoundVal.posNumVal.doubleValue : CGFLOAT_MAX; +} + + + +#pragma mark -- NSCopying + +-(id)copyWithZone:(NSZone *)zone +{ + MyLayoutPos *lp = [[[self class] allocWithZone:zone] init]; + lp.view = self.view; + lp->_active = _active; + lp->_pos = _pos; + lp->_posValType = _posValType; + lp->_posVal = _posVal; + lp->_offsetVal = _offsetVal; + if (_lBoundVal != nil) + { + lp->_lBoundVal = [[[self class] allocWithZone:zone] init]; + lp->_lBoundVal->_active = _active; + [[lp->_lBoundVal __equalTo:_lBoundVal.posVal] __offset:_lBoundVal.offsetVal]; + } + if (_uBoundVal != nil) + { + lp->_uBoundVal = [[[self class] allocWithZone:zone] init]; + lp->_uBoundVal->_active = _active; + [[lp->_uBoundVal __equalTo:_uBoundVal.posVal] __offset:_uBoundVal.offsetVal]; + } + + return lp; + +} + + +#pragma mark -- Private Method -(NSNumber*)posNumVal { - if (_posVal == nil) + if (_posVal == nil || !self.isActive) return nil; if (_posValType == MyLayoutValueType_NSNumber) return _posVal; - + else if (_posValType == MyLayoutValueType_UILayoutSupport) + return @([((id)_posVal) length]); + + return nil; } @@ -179,7 +245,7 @@ -(NSNumber*)posNumVal -(MyLayoutPos*)posRelaVal { - if (_posVal == nil) + if (_posVal == nil || !self.isActive) return nil; if (_posValType == MyLayoutValueType_LayoutPos) @@ -192,7 +258,7 @@ -(MyLayoutPos*)posRelaVal -(NSArray*)posArrVal { - if (_posVal == nil) + if (_posVal == nil || !self.isActive) return nil; if (_posValType == MyLayoutValueType_Array) @@ -204,64 +270,232 @@ -(NSArray*)posArrVal -(MyLayoutPos*)lBoundVal { + if (_lBoundVal == nil) + { + _lBoundVal = [[MyLayoutPos alloc] init]; + _lBoundVal->_active = _active; + [_lBoundVal __equalTo:@(-CGFLOAT_MAX)]; + } return _lBoundVal; } -(MyLayoutPos*)uBoundVal { + if (_uBoundVal == nil) + { + _uBoundVal = [[MyLayoutPos alloc] init]; + _uBoundVal->_active = _active; + [_uBoundVal __equalTo:@(CGFLOAT_MAX)]; + } + return _uBoundVal; } +-(MyLayoutPos*)lBoundValInner +{ + return _lBoundVal; +} + +-(MyLayoutPos*)uBoundValInner +{ + return _uBoundVal; +} --(CGFloat)margin +-(MyLayoutPos*)__equalTo:(id)val { - CGFloat retVal = _offsetVal; - if (self.posNumVal != nil) - retVal +=self.posNumVal.doubleValue; + if (![_posVal isEqual:val]) + { + if ([val isKindOfClass:[NSNumber class]]) + _posValType = MyLayoutValueType_NSNumber; + else if ([val isKindOfClass:[MyLayoutPos class]]) + _posValType = MyLayoutValueType_LayoutPos; + else if ([val isKindOfClass:[NSArray class]]) + _posValType = MyLayoutValueType_Array; + else if ([val conformsToProtocol:@protocol(UILayoutSupport)]) + { + //这里只有上边和下边支持,其他不支持。。 + if (_pos != MyGravity_Vert_Top && _pos != MyGravity_Vert_Bottom) + { + NSAssert(0, @"oops! only topPos or bottomPos can set to id"); + } + + _posValType = MyLayoutValueType_UILayoutSupport; + } + else if ([val isKindOfClass:[UIView class]]) + { + UIView *rview = (UIView*)val; + _posValType = MyLayoutValueType_LayoutPos; + + switch (_pos) { + case MyGravity_Horz_Leading: + val = rview.leadingPos; + break; + case MyGravity_Horz_Center: + val = rview.centerXPos; + break; + case MyGravity_Horz_Trailing: + val = rview.trailingPos; + break; + case MyGravity_Vert_Top: + val = rview.topPos; + break; + case MyGravity_Vert_Center: + val = rview.centerYPos; + break; + case MyGravity_Vert_Bottom: + val = rview.bottomPos; + break; + default: + NSAssert(0, @"oops!"); + break; + } + + } + else + _posValType = MyLayoutValueType_Nil; + + _posVal = val; + [self setNeedsLayout]; + } - retVal = MIN(_uBoundVal.posNumVal.doubleValue, retVal); - retVal = MAX(_lBoundVal.posNumVal.doubleValue, retVal); - return retVal; + return self; } --(BOOL)isRelativeMargin:(CGFloat)margin +-(MyLayoutPos*)__offset:(CGFloat)val { - return margin > 0 && margin < 1; + + if (_offsetVal != val) + { + _offsetVal = val; + [self setNeedsLayout]; + } + + return self; } --(CGFloat)realMarginInSize:(CGFloat)size +-(MyLayoutPos*)__min:(CGFloat)val { - CGFloat realMargin = self.posNumVal.doubleValue; - if ([self isRelativeMargin:realMargin]) - realMargin *= size; - return realMargin + _offsetVal; + if (self.lBoundVal.posNumVal.doubleValue != val) + { + [self.lBoundVal __equalTo:@(val)]; + + [self setNeedsLayout]; + } + + return self; +} + +-(MyLayoutPos*)__lBound:(id)posVal offsetVal:(CGFloat)offsetVal +{ + + [[self.lBoundVal __equalTo:posVal] __offset:offsetVal]; + + [self setNeedsLayout]; + + return self; } -#pragma mark -- NSCopying +-(MyLayoutPos*)__max:(CGFloat)val +{ + + if (self.uBoundVal.posNumVal.doubleValue != val) + { + [self.uBoundVal __equalTo:@(val)]; + [self setNeedsLayout]; + } + + return self; +} --(id)copyWithZone:(NSZone *)zone +-(MyLayoutPos*)__uBound:(id)posVal offsetVal:(CGFloat)offsetVal { - MyLayoutPos *lp = [[[self class] allocWithZone:zone] init]; - lp.view = self.view; - lp.pos = self.pos; - lp.posValType = self.posValType; - lp->_offsetVal = self.offsetVal; - lp->_lBoundVal.equalTo(_lBoundVal.posVal).offset(_lBoundVal.offsetVal); - lp->_uBoundVal.equalTo(_uBoundVal.posVal).offset(_uBoundVal.offsetVal); - lp->_posVal = self->_posVal; - return lp; + [[self.uBoundVal __equalTo:posVal] __offset:offsetVal]; + + [self setNeedsLayout]; + + return self; +} + + +-(void)__clear +{ + _active = YES; + _posVal = nil; + _posValType = MyLayoutValueType_Nil; + _offsetVal = 0; + _lBoundVal = nil; + _uBoundVal = nil; + [self setNeedsLayout]; } -#pragma mark -- Private Method --(void)setNeedLayout + + +-(CGFloat)absVal +{ + if (self.isActive) + { + CGFloat retVal = _offsetVal; + + if (self.posNumVal != nil) + retVal +=self.posNumVal.doubleValue; + + if (_uBoundVal != nil) + retVal = MIN(_uBoundVal.posNumVal.doubleValue, retVal); + + if (_lBoundVal != nil) + retVal = MAX(_lBoundVal.posNumVal.doubleValue, retVal); + + return retVal; + } + else + return 0; +} + +-(BOOL)isRelativePos +{ + if (self.isActive) + { + CGFloat realPos = self.posNumVal.doubleValue; + return realPos > 0 && realPos < 1; + + } + else + return NO; +} + +-(CGFloat)realPosIn:(CGFloat)size +{ + if (self.isActive) + { + CGFloat realPos = self.posNumVal.doubleValue; + if (realPos > 0 && realPos < 1) + realPos *= size; + + realPos += _offsetVal; + + if (_uBoundVal != nil) + realPos = MIN(_uBoundVal.posNumVal.doubleValue, realPos); + + if (_lBoundVal != nil) + realPos = MAX(_lBoundVal.posNumVal.doubleValue, realPos); + + return realPos; + } + else + return 0; + +} + + +-(void)setNeedsLayout { if (_view != nil && _view.superview != nil && [_view.superview isKindOfClass:[MyBaseLayout class]]) { @@ -286,23 +520,23 @@ +(NSString*)posstrFromPos:(MyLayoutPos*)posobj showView:(BOOL)showView NSString *posStr = @""; switch (posobj.pos) { - case MyMarginGravity_Horz_Left: - posStr = @"LeftPos"; + case MyGravity_Horz_Leading: + posStr = @"leadingPos"; break; - case MyMarginGravity_Horz_Center: - posStr = @"CenterXPos"; + case MyGravity_Horz_Center: + posStr = @"centerXPos"; break; - case MyMarginGravity_Horz_Right: - posStr = @"RightPos"; + case MyGravity_Horz_Trailing: + posStr = @"trailingPos"; break; - case MyMarginGravity_Vert_Top: - posStr = @"TopPos"; + case MyGravity_Vert_Top: + posStr = @"topPos"; break; - case MyMarginGravity_Vert_Center: - posStr = @"CenterYPos"; + case MyGravity_Vert_Center: + posStr = @"centerYPos"; break; - case MyMarginGravity_Vert_Bottom: - posStr = @"BottomPos"; + case MyGravity_Vert_Bottom: + posStr = @"bottomPos"; break; default: break; @@ -313,6 +547,9 @@ +(NSString*)posstrFromPos:(MyLayoutPos*)posobj showView:(BOOL)showView } + +#pragma mark -- Override Method + -(NSString*)description { NSString *posValStr = @""; diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutPosInner.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutPosInner.h index 852d878..8de3b49 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutPosInner.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutPosInner.h @@ -13,7 +13,7 @@ @interface MyLayoutPos() @property(nonatomic, weak) UIView *view; -@property(nonatomic, assign) MyMarginGravity pos; +@property(nonatomic, assign) MyGravity pos; @property(nonatomic, assign) MyLayoutValueType posValType; @property(nonatomic, readonly, strong) NSNumber *posNumVal; @@ -23,13 +23,29 @@ @property(nonatomic, readonly, strong) MyLayoutPos *lBoundVal; @property(nonatomic, readonly, strong) MyLayoutPos *uBoundVal; +@property(nonatomic, readonly, strong) MyLayoutPos *lBoundValInner; +@property(nonatomic, readonly, strong) MyLayoutPos *uBoundValInner; + + + +-(MyLayoutPos*)__equalTo:(id)val; +-(MyLayoutPos*)__offset:(CGFloat)val; +-(MyLayoutPos*)__min:(CGFloat)val; +-(MyLayoutPos*)__lBound:(id)posVal offsetVal:(CGFloat)offsetVal; +-(MyLayoutPos*)__max:(CGFloat)val; +-(MyLayoutPos*)__uBound:(id)posVal offsetVal:(CGFloat)offsetVal; +-(void)__clear; + + // minVal <= posNumVal + offsetVal <=maxVal . 注意这个只试用于相对布局。对于线性布局和框架布局来说,因为可以支持相对边距。 // 所以线性布局和框架布局不能使用这个属性。 -@property(nonatomic,readonly, assign) CGFloat margin; +@property(nonatomic,readonly, assign) CGFloat absVal; //获取真实的位置值 --(CGFloat)realMarginInSize:(CGFloat)size; +-(CGFloat)realPosIn:(CGFloat)size; + +-(BOOL)isRelativePos; @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.h new file mode 100644 index 0000000..9c03330 --- /dev/null +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.h @@ -0,0 +1,172 @@ +// +// MyLayoutSize.h +// MyLayout +// +// Created by oybq on 15/6/14. +// Copyright (c) 2015年 YoungSoft. All rights reserved. +// + +#import "MyLayoutDef.h" + + +/** + *视图的布局尺寸类,用来设置视图在布局视图中宽度和高度的尺寸值。布局尺寸类是对尺寸的一个抽象,一个尺寸不一定描述为一个具体的数值,也有可能描述为和另外一个尺寸相等也就是依赖另外一个尺寸,同时一个尺寸可能也会有最大和最小值的限制等等。因此用MyLayoutSize类来描述这种尺寸的抽象概念。 + + @code + 一个尺寸对象的最终尺寸值 = min(max(sizeVal * multiVal + addVal, lBound.sizeVal * lBound.multiVal + lBound.addVal), uBound.sizeVal * uBound.multiVal + uBound.addVal) + 其中: + sizeVal是通过equalTo方法设置的值。 + multiVal是通过multiply方法设置的值。 + addVal是通过add方法设置的值。 + lBound.sizeVal,lBound.multiVal,lBound.addVal是通过lBound方法设置的值。他表示尺寸的最小边界值。 + uBound.sizeVal,uBound.multiVal,uBound.addVal是通过uBound方法设置的值。他表示尺寸的最大边界值。 + @endcode + */ +@interface MyLayoutSize : NSObject + +//because masonry defined macro MAS_SHORTHAND_GLOBALS. the equalTo, offset may conflict with below method. so +//if you used MyLayout and Masonry concurrently and you defined MAS_SHORTHAND_GLOBALS in masonry, then you can define MY_USEPREFIXMETHOD to solve the conflict. +#ifdef MY_USEPREFIXMETHOD + +-(MyLayoutSize* (^)(id val))myEqualTo; +-(MyLayoutSize* (^)(CGFloat val))myAdd; +-(MyLayoutSize* (^)(CGFloat val))myMultiply; +-(MyLayoutSize* (^)(CGFloat val))myMin; +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myLBound; +-(MyLayoutSize* (^)(CGFloat val))myMax; +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myUBound; +-(void)myClear; + + +#else + + + +/** + 设置尺寸的具体值,这个具体值可以设置为NSNumber, MyLayoutSize以及NSArray数组,UIView和nil值。 + + 1. 设置为NSNumber值表示指定具体的宽度或者高度数值 + + 2. 设置为MyLayoutSize值表示宽度和高度与设置的对象有依赖关系, 甚至可以依赖对象本身 + + 3. 设置为NSArray数组的概念就是所有数组里面的子视图的尺寸平分父视图的尺寸。只有相对布局里面的子视图才支持这种设置。 + + 4. 设置为UIView的概念就是尺寸依赖于指定视图的相对应的尺寸。 + + 5. 设置为nil时则清除设置的具体值。 + */ +-(MyLayoutSize* (^)(id val))equalTo; + +/** + *设置尺寸增加值,默认值是0。如果设置为负数则表示减少值 + */ +-(MyLayoutSize* (^)(CGFloat val))add; + + +/** + * 设置尺寸的放大缩小倍数,默认值是1。 + */ +-(MyLayoutSize* (^)(CGFloat val))multiply; + + +/** + *设置尺寸的最小边界数值。min方法是lBound方法的简化版本。比如:A.min(10) <==> A.lBound(@10, 0, 1) + */ +-(MyLayoutSize* (^)(CGFloat val))min; + +/** + 设置尺寸的最小边界值,如果尺寸对象没有设置最小边界值,那么最小边界默认就是无穷小-CGFLOAT_MAX。lBound方法除了能设置为数值外,还可以设置为MyLayoutSize值,并且还可以指定增量值和倍数值。 + + 1. 比如我们有一个UILabel的宽度是由内容决定的,但是最小的宽度大于等于父视图的宽度,则设置为: + @code + A.widthSize.equalTo(A.widthSize).lBound(superview.widthSize, 0, 1); + @endcode + + 2. 比如我们有一个视图的宽度也是由内容决定的,但是最小的宽度大于等于父视图宽度的1/2,则设置为: + @code + A.widthSize.equalTo(A.widthSize).lBound(superview.widthSize, 0, 0.5); + @endcode + + 3. 比如我们有一个视图的宽度也是由内容决定的,但是最小的宽度大于等于父视图的宽度-30,则设置为: + @code + A.widthSize.equalTo(A.widthSize).lBound(superview.widthSize, -30, 1); + @endcode + + 4. 比如我们有一个视图的宽度也是由内容决定的,但是最小的宽度不能低于100,则设置为: + @code + A.widthSize.equalTo(A.widthSize).lBound(@100, 0, 1); + @endcode + + sizeVal 指定边界的值。可设置的类型有NSNumber和MyLayoutSize类型,前者表示最小限制不能小于某个常量值,而后者表示最小限制不能小于另外一个尺寸对象所表示的尺寸值。 + + addVal 指定边界值的增量值,如果没有增量请设置为0。 + + multiVal 指定边界值的倍数值,如果没有倍数请设置为1。 + */ +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))lBound; + + +/** + *设置尺寸的最大边界数值。max方法是uBound方法的简化版本。比如:A.max(10) <==> A.uBound(@10, 0, 1) + */ +-(MyLayoutSize* (^)(CGFloat val))max; + + +/** + 设置尺寸的最大边界值,如果尺寸对象没有设置最大边界值,那么最大边界默认就是无穷大CGFLOAT_MAX。uBound方法除了能设置为数值外,还可以设置为MyLayoutSize值和nil值,并且还可以指定增量值和倍数值。 + + 1. 比如我们有一个UILabel的宽度是由内容决定的,但是最大的宽度小于等于父视图的宽度,则设置为: + @code + A.widthSize.equalTo(A.widthSize).uBound(superview.widthSize, 0, 1); + @endcode + + 2. 比如我们有一个视图的宽度也是由内容决定的,但是最大的宽度小于等于父视图宽度的1/2,则设置为: + @code + A.widthSize.equalTo(A.widthSize).uBound(superview.widthSize, 0, 0.5); + @endcode + + 3. 比如我们有一个视图的宽度也是由内容决定的,但是最大的宽度小于等于父视图的宽度-30,则设置为: + + @code + A.widthSize.equalTo(A.widthSize).uBound(superview.widthSize, -30, 1); + @endcode + + 4. 比如我们有一个视图的宽度也是由内容决定的,但是最大的宽度小于等于100,则设置为: + @code + A.widthSize.equalTo(A.widthSize).uBound(@100, 0, 1); + @endcode + sizeVal 指定边界的值。可设置的类型有NSNumber和MyLayoutSize类型,前者表示最大限制不能超过某个常量值,而后者表示最大限制不能超过另外一个尺寸对象所表示的尺寸值。 + + addVal 指定边界值的增量值,如果没有增量请设置为0。 + + multiVal 指定边界值的倍数值,如果没有倍数请设置为1。 + */ +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))uBound; + + +/** + *清除所有设置的约束值,这样尺寸对象将不会再生效了。 + */ +-(void)clear; + +#endif + +/** + *设置布局尺寸是否是活动的,默认是YES表示活动的,如果设置为NO则表示这个布局尺寸对象设置的约束值将不会起作用。 + *active设置为YES和clear的相同点是尺寸对象设置的约束值都不会生效了,区别是前者不会清除所有设置的约束,而后者则会清除所有设置的约束。 + */ +@property(nonatomic, assign, getter=isActive) BOOL active; + + +//上面方法设置的属性的获取。 +@property(nonatomic, strong, readonly) id dimeVal; +@property(nonatomic, assign, readonly) CGFloat addVal; +@property(nonatomic, assign, readonly) CGFloat multiVal; +@property(nonatomic, assign, readonly) CGFloat minVal; +@property(nonatomic, assign, readonly) CGFloat maxVal; + + + + + +@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.m b/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.m new file mode 100644 index 0000000..431cedf --- /dev/null +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutSize.m @@ -0,0 +1,582 @@ +// +// MyLayoutSize.m +// MyLayout +// +// Created by oybq on 15/6/14. +// Copyright (c) 2015年 YoungSoft. All rights reserved. +// + +#import "MyLayoutSize.h" +#import "MyLayoutSizeInner.h" +#import "MyBaseLayout.h" + + +@implementation MyLayoutSize +{ + id _dimeVal; + CGFloat _addVal; + CGFloat _multiVal; + MyLayoutSize *_lBoundVal; + MyLayoutSize *_uBoundVal; +} + +-(id)init +{ + self= [super init]; + if (self !=nil) + { + _active = YES; + _view = nil; + _dime = MyGravity_None; + _dimeVal = nil; + _dimeValType = MyLayoutValueType_Nil; + _addVal = 0; + _multiVal = 1; + _lBoundVal = nil; + _uBoundVal = nil; + } + + return self; +} + + +-(MyLayoutSize* (^)(id val))myEqualTo +{ + return ^id(id val){ + + return [self __equalTo:val]; + }; +} + +-(MyLayoutSize* (^)(CGFloat val))myAdd +{ + return ^id(CGFloat val){ + + return [self __add:val]; + }; +} + +-(MyLayoutSize* (^)(CGFloat val))myMultiply +{ + return ^id(CGFloat val){ + + return [self __multiply:val]; + }; + +} + +-(MyLayoutSize* (^)(CGFloat val))myMin +{ + return ^id(CGFloat val){ + + return [self __min:val]; + }; + +} + +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myLBound +{ + + return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ + + return [self __lBound:sizeVal addVal:addVal multiVal:multiVal]; + + }; +} + +-(MyLayoutSize* (^)(CGFloat val))myMax +{ + return ^id(CGFloat val){ + + return [self __max:val]; + }; +} + +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))myUBound +{ + return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ + + return [self __uBound:sizeVal addVal:addVal multiVal:multiVal]; + }; + +} + +-(void)myClear +{ + [self __clear]; +} + + +-(MyLayoutSize* (^)(id val))equalTo +{ + return ^id(id val){ + + return [self __equalTo:val]; + }; +} + +-(MyLayoutSize* (^)(CGFloat val))add +{ + return ^id(CGFloat val){ + + return [self __add:val]; + }; +} + +-(MyLayoutSize* (^)(CGFloat val))multiply +{ + return ^id(CGFloat val){ + + return [self __multiply:val]; + }; + +} + +-(MyLayoutSize* (^)(CGFloat val))min +{ + return ^id(CGFloat val){ + + return [self __min:val]; + }; + +} + +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))lBound +{ + + return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ + + return [self __lBound:sizeVal addVal:addVal multiVal:multiVal]; + + }; +} + +-(MyLayoutSize* (^)(CGFloat val))max +{ + return ^id(CGFloat val){ + + return [self __max:val]; + }; +} + +-(MyLayoutSize* (^)(id sizeVal, CGFloat addVal, CGFloat multiVal))uBound +{ + return ^id(id sizeVal, CGFloat addVal, CGFloat multiVal){ + + return [self __uBound:sizeVal addVal:addVal multiVal:multiVal]; + }; + +} + +-(void)clear +{ + [self __clear]; +} + +-(void)setActive:(BOOL)active +{ + if (_active != active) + { + _active = active; + _lBoundVal.active = active; + _uBoundVal.active = active; + [self setNeedsLayout]; + } +} + + + +-(id)dimeVal +{ + if (self.isActive) + { + if (_dimeValType == MyLayoutValueType_LayoutDime && _dimeVal == nil) + return self; + + return _dimeVal; + } + else + return nil; + +} + +-(CGFloat)minVal +{ + return (self.isActive && _lBoundVal != nil) ? _lBoundVal.dimeNumVal.doubleValue : -CGFLOAT_MAX; +} + +-(CGFloat)maxVal +{ + return (self.isActive && _uBoundVal != nil) ? _uBoundVal.dimeNumVal.doubleValue : CGFLOAT_MAX; +} + + +#pragma mark -- NSCopying + +-(id)copyWithZone:(NSZone *)zone +{ + MyLayoutSize *ld = [[[self class] allocWithZone:zone] init]; + ld.view = self.view; + ld->_active = _active; + ld->_dime = _dime; + ld->_addVal = _addVal; + ld->_multiVal = _multiVal; + ld->_dimeVal = _dimeVal; + ld->_dimeValType = _dimeValType; + if (_lBoundVal != nil) + { + ld->_lBoundVal = [[[self class] allocWithZone:zone] init]; + ld->_lBoundVal->_active = _active; + [[[ld->_lBoundVal __equalTo:_lBoundVal.dimeVal] __add:_lBoundVal.addVal] __multiply:_lBoundVal.multiVal]; + + } + + if (_uBoundVal != nil) + { + ld->_uBoundVal = [[[self class] allocWithZone:zone] init]; + ld->_uBoundVal->_active = _active; + [[[ld->_uBoundVal __equalTo:_uBoundVal.dimeVal] __add:_uBoundVal.addVal] __multiply:_uBoundVal.multiVal]; + + } + + + return self; +} + +#pragma mark -- Private Method + + +-(NSNumber*)dimeNumVal +{ + if (_dimeVal == nil || !self.isActive) + return nil; + + if (_dimeValType == MyLayoutValueType_NSNumber) + return _dimeVal; + return nil; +} + +-(MyLayoutSize*)dimeRelaVal +{ + if (_dimeVal == nil || !self.isActive) + return nil; + if (_dimeValType == MyLayoutValueType_LayoutDime) + return _dimeVal; + return nil; + +} + + +-(NSArray*)dimeArrVal +{ + if (_dimeVal == nil || !self.isActive) + return nil; + if (_dimeValType == MyLayoutValueType_Array) + return _dimeVal; + return nil; + +} + + +-(MyLayoutSize*)dimeSelfVal +{ + if (_dimeValType == MyLayoutValueType_LayoutDime && _dimeVal == nil && self.isActive) + return self; + + return nil; +} + + +-(MyLayoutSize*)lBoundVal +{ + if (_lBoundVal == nil) + { + _lBoundVal = [[MyLayoutSize alloc] init]; + _lBoundVal->_active = _active; + [_lBoundVal __equalTo:@(-CGFLOAT_MAX)]; + } + + return _lBoundVal; +} + +-(MyLayoutSize*)uBoundVal +{ + + if (_uBoundVal == nil) + { + _uBoundVal = [[MyLayoutSize alloc] init]; + _uBoundVal->_active = _active; + [_uBoundVal __equalTo:@(CGFLOAT_MAX)]; + } + return _uBoundVal; +} + +-(MyLayoutSize*)lBoundValInner +{ + return _lBoundVal; +} + +-(MyLayoutSize*)uBoundValInner +{ + return _uBoundVal; +} + + +-(MyLayoutSize*)__equalTo:(id)val +{ + + if (![_dimeVal isEqual:val]) + { + if ([val isKindOfClass:[NSNumber class]]) + { + _dimeValType = MyLayoutValueType_NSNumber; + } + else if ([val isMemberOfClass:[MyLayoutSize class]]) + { + _dimeValType = MyLayoutValueType_LayoutDime; + + //我们支持尺寸等于自己的情况,用来支持那些尺寸包裹内容但又想扩展尺寸的场景,为了不造成循环引用这里做特殊处理 + //当尺寸等于自己时,我们只记录_dimeValType,而把值设置为nil + if (val == self) + { + val = nil; + } + } + else if ([val isKindOfClass:[UIView class]]) + { + + UIView *rview = (UIView*)val; + _dimeValType = MyLayoutValueType_LayoutDime; + + switch (_dime) { + case MyGravity_Horz_Fill: + val = rview.widthSize; + break; + case MyGravity_Vert_Fill: + val = rview.heightSize; + break; + default: + NSAssert(0, @"oops!"); + break; + } + + } + else if ([val isKindOfClass:[NSArray class]]) + { + _dimeValType = MyLayoutValueType_Array; + } + else + { + _dimeValType = MyLayoutValueType_Nil; + } + + _dimeVal = val; + [self setNeedsLayout]; + } + else + { + //参考上面自己等于自己的特殊情况需要特殊处理。 + if (val == nil && _dimeVal == nil && _dimeValType == MyLayoutValueType_LayoutDime) + { + _dimeValType = MyLayoutValueType_Nil; + [self setNeedsLayout]; + } + } + + return self; +} + +//加 +-(MyLayoutSize*)__add:(CGFloat)val +{ + + if (_addVal != val) + { + _addVal = val; + [self setNeedsLayout]; + } + + return self; +} + + +//乘 +-(MyLayoutSize*)__multiply:(CGFloat)val +{ + + if (_multiVal != val) + { + _multiVal = val; + [self setNeedsLayout]; + } + + return self; + +} + + +-(MyLayoutSize*)__min:(CGFloat)val +{ + if (self.lBoundVal.dimeNumVal.doubleValue != val) + { + [self.lBoundVal __equalTo:@(val)]; + [self setNeedsLayout]; + } + + return self; +} + + +-(MyLayoutSize*)__lBound:(id)sizeVal addVal:(CGFloat)addVal multiVal:(CGFloat)multiVal +{ + if (sizeVal == self) + sizeVal = self.lBoundVal; + + [[[self.lBoundVal __equalTo:sizeVal] __add:addVal] __multiply:multiVal]; + [self setNeedsLayout]; + + return self; +} + + +-(MyLayoutSize*)__max:(CGFloat)val +{ + if (self.uBoundVal.dimeNumVal.doubleValue != val) + { + [self.uBoundVal __equalTo:@(val)]; + [self setNeedsLayout]; + } + + return self; +} + +-(MyLayoutSize*)__uBound:(id)sizeVal addVal:(CGFloat)addVal multiVal:(CGFloat)multiVal +{ + if (sizeVal == self) + sizeVal = self.uBoundVal; + + [[[self.uBoundVal __equalTo:sizeVal] __add:addVal] __multiply:multiVal]; + [self setNeedsLayout]; + + return self; +} + + + +-(void)__clear +{ + _active = YES; + _addVal = 0; + _multiVal = 1; + _lBoundVal = nil; + _uBoundVal = nil; + _dimeVal = nil; + _dimeValType = MyLayoutValueType_Nil; + + [self setNeedsLayout]; +} + + + + + +-(CGFloat) measure +{ + return self.isActive ? self.dimeNumVal.doubleValue * _multiVal + _addVal : 0; +} + +-(CGFloat)measureWith:(CGFloat)size +{ + return self.isActive ? size * _multiVal + _addVal : size; +} + + + +-(void)setNeedsLayout +{ + if (_view != nil && _view.superview != nil && [_view.superview isKindOfClass:[MyBaseLayout class]]) + { + MyBaseLayout* lb = (MyBaseLayout*)_view.superview; + if (!lb.isMyLayouting) + [_view.superview setNeedsLayout]; + } + +} + + ++(NSString*)dimestrFromDime:(MyLayoutSize*)dimeobj showView:(BOOL)showView +{ + + NSString *viewstr = @""; + if (showView) + { + viewstr = [NSString stringWithFormat:@"View:%p.", dimeobj.view]; + } + + NSString *dimeStr = @""; + + switch (dimeobj.dime) { + case MyGravity_Horz_Fill: + dimeStr = @"widthSize"; + break; + case MyGravity_Vert_Fill: + dimeStr = @"heightSize"; + break; + default: + break; + } + + return [NSString stringWithFormat:@"%@%@",viewstr,dimeStr]; + +} + +#pragma mark -- Override Method + +-(NSString*)description +{ + NSString *dimeValStr = @""; + switch (_dimeValType) { + case MyLayoutValueType_Nil: + dimeValStr = @"nil"; + break; + case MyLayoutValueType_NSNumber: + dimeValStr = [_dimeVal description]; + break; + case MyLayoutValueType_LayoutDime: + dimeValStr = [MyLayoutSize dimestrFromDime:_dimeVal showView:YES]; + break; + case MyLayoutValueType_Array: + { + dimeValStr = @"["; + for (NSObject *obj in _dimeVal) + { + if ([obj isMemberOfClass:[MyLayoutSize class]]) + { + dimeValStr = [dimeValStr stringByAppendingString:[MyLayoutSize dimestrFromDime:(MyLayoutSize*)obj showView:YES]]; + } + else + { + dimeValStr = [dimeValStr stringByAppendingString:[obj description]]; + + } + + if (obj != [_dimeVal lastObject]) + dimeValStr = [dimeValStr stringByAppendingString:@", "]; + + } + + dimeValStr = [dimeValStr stringByAppendingString:@"]"]; + + } + default: + break; + } + + return [NSString stringWithFormat:@"%@=%@, Multiply=%g, Add=%g, Max=%g, Min=%g",[MyLayoutSize dimestrFromDime:self showView:NO], dimeValStr, _multiVal, _addVal, _uBoundVal.dimeNumVal.doubleValue == CGFLOAT_MAX ? NAN : _uBoundVal.dimeNumVal.doubleValue , _lBoundVal.dimeNumVal.doubleValue == -CGFLOAT_MAX ? NAN : _lBoundVal.dimeNumVal.doubleValue]; + +} + + + +@end + diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.h index 84b1231..ccf5daa 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.h @@ -9,8 +9,9 @@ #import "MyLayoutDef.h" #import "MyLayoutPos.h" -#import "MyLayoutDime.h" +#import "MyLayoutSize.h" +@class MyBaseLayout; /* SizeClass的尺寸定义,用于定义苹果设备的各种屏幕的尺寸,对于任意一种设备来说某个纬度的尺寸都可以描述为:Any任意,Compact压缩,Regular常规 @@ -102,57 +103,67 @@ typedef enum : unsigned char{ SizeClass,以及MySizeClass_Portrait或者MySizeClass_Landscape 也就是设置布局默认的约束。而iOS8以上的系统则能支持所有的SizeClass. */ -@interface MyLayoutSizeClass:NSObject +@interface MyViewSizeClass:NSObject +@property(nonatomic, weak) UIView *view; //所有视图通用 -@property(nonatomic, strong) MyLayoutPos *leftPos; @property(nonatomic, strong) MyLayoutPos *topPos; -@property(nonatomic, strong) MyLayoutPos *rightPos; +@property(nonatomic, strong) MyLayoutPos *leadingPos; @property(nonatomic, strong) MyLayoutPos *bottomPos; +@property(nonatomic, strong) MyLayoutPos *trailingPos; @property(nonatomic, strong) MyLayoutPos *centerXPos; @property(nonatomic, strong) MyLayoutPos *centerYPos; -@property(nonatomic, assign) CGFloat myLeftMargin; -@property(nonatomic, assign) CGFloat myTopMargin; -@property(nonatomic, assign) CGFloat myRightMargin; -@property(nonatomic, assign) CGFloat myBottomMargin; +@property(nonatomic, strong,readonly) MyLayoutPos *leftPos; +@property(nonatomic, strong,readonly) MyLayoutPos *rightPos; + + + +@property(nonatomic, assign) CGFloat myTop; +@property(nonatomic, assign) CGFloat myLeading; +@property(nonatomic, assign) CGFloat myBottom; +@property(nonatomic, assign) CGFloat myTrailing; +@property(nonatomic, assign) CGFloat myCenterX; +@property(nonatomic, assign) CGFloat myCenterY; +@property(nonatomic, assign) CGPoint myCenter; + + +@property(nonatomic, assign) CGFloat myLeft; +@property(nonatomic, assign) CGFloat myRight; + + + @property(nonatomic, assign) CGFloat myMargin; -@property(nonatomic, assign) CGFloat myCenterXOffset; -@property(nonatomic, assign) CGFloat myCenterYOffset; -@property(nonatomic, assign) CGPoint myCenterOffset; +@property(nonatomic, assign) CGFloat myHorzMargin; +@property(nonatomic, assign) CGFloat myVertMargin; +@property(nonatomic, strong) MyLayoutSize *widthSize; +@property(nonatomic, strong) MyLayoutSize *heightSize; -@property(nonatomic, strong) MyLayoutDime *widthDime; -@property(nonatomic, strong) MyLayoutDime *heightDime; +@property(nonatomic, assign) CGFloat myWidth; +@property(nonatomic, assign) CGFloat myHeight; +@property(nonatomic, assign) CGSize mySize; -@property(nonatomic,assign) CGFloat myWidth; -@property(nonatomic,assign) CGFloat myHeight; -@property(nonatomic,assign) CGSize mySize; +@property(nonatomic, assign) BOOL wrapContentWidth; +@property(nonatomic, assign) BOOL wrapContentHeight; -@property(nonatomic, assign,getter=isFlexedHeight) BOOL flexedHeight; +@property(nonatomic, assign) BOOL wrapContentSize; @property(nonatomic, assign) BOOL useFrame; @property(nonatomic, assign) BOOL noLayout; -/* - 隐藏不参与布局,这个属性是默认sizeClass外可以用来设置某个视图是否参与布局的标志,如果设置为YES则表示不参与布局。默认是NO。 - 对于默认的sizeClass来说,就可以直接使用子视图本身的hidden属性来设置。 - 不参与布局的意思是在这种sizeClass下的frame会被设置为CGRectZero。而不是不加入到视图体系中去。 - 如果视图真设置了隐藏属性则这个属性设置无效。 - */ -@property(nonatomic, assign, getter=isHidden) BOOL hidden; +@property(nonatomic, assign) MyVisibility myVisibility; +@property(nonatomic, assign) MyGravity myAlignment; +@property(nonatomic, copy) void (^viewLayoutCompleteBlock)(MyBaseLayout* layout, UIView *v); //线性布局和浮动布局子视图专用 @property(nonatomic, assign) CGFloat weight; -//框架布局子视图专用 -@property(nonatomic, assign) MyMarginGravity marginGravity; - //浮动布局子视图专用 @property(nonatomic,assign,getter=isReverseFloat) BOOL reverseFloat; @property(nonatomic,assign) BOOL clearFloat; @@ -160,69 +171,99 @@ typedef enum : unsigned char{ @end -@interface MyLayoutSizeClassLayout : MyLayoutSizeClass +@interface MyLayoutViewSizeClass : MyViewSizeClass -@property(nonatomic,assign) UIEdgeInsets padding; @property(nonatomic, assign) CGFloat topPadding; -@property(nonatomic, assign) CGFloat leftPadding; +@property(nonatomic, assign) CGFloat leadingPadding; @property(nonatomic, assign) CGFloat bottomPadding; +@property(nonatomic, assign) CGFloat trailingPadding; +@property(nonatomic, assign) UIEdgeInsets padding; + + +@property(nonatomic, assign) CGFloat leftPadding; @property(nonatomic, assign) CGFloat rightPadding; -@property(nonatomic,assign) BOOL wrapContentWidth; -@property(nonatomic,assign) BOOL wrapContentHeight; -@property(nonatomic, assign) BOOL hideSubviewReLayout; +@property(nonatomic, assign) BOOL zeroPadding; + +@property(nonatomic ,assign) CGFloat subviewVSpace; +@property(nonatomic, assign) CGFloat subviewHSpace; +@property(nonatomic, assign) CGFloat subviewSpace; + +@property(nonatomic, assign) MyGravity gravity; + +@property(nonatomic, assign) BOOL reverseLayout; //逆序布局,子视图从后往前。 + @end -@interface MyLayoutSizeClassLinearLayout : MyLayoutSizeClassLayout +@interface MySequentLayoutViewSizeClass : MyLayoutViewSizeClass -@property(nonatomic,assign) MyLayoutViewOrientation orientation; -@property(nonatomic, assign) MyMarginGravity gravity; +@property(nonatomic,assign) MyOrientation orientation; -@property(nonatomic ,assign) CGFloat subviewVertMargin; -@property(nonatomic, assign) CGFloat subviewHorzMargin; -@property(nonatomic, assign) CGFloat subviewMargin; + + +@end + + + + +@interface MyLinearLayoutViewSizeClass : MySequentLayoutViewSizeClass + +@property(nonatomic, assign) MySubviewsShrinkType shrinkType; @end -@interface MyLayoutSizeClassTableLayout : MyLayoutSizeClassLinearLayout -@property(nonatomic, assign) CGFloat rowSpacing; -@property(nonatomic, assign) CGFloat colSpacing; + +@interface MyTableLayoutViewSizeClass : MyLinearLayoutViewSizeClass @end -@interface MyLayoutSizeClassFlowLayout : MyLayoutSizeClassLinearLayout +@interface MyFlowLayoutViewSizeClass : MySequentLayoutViewSizeClass @property(nonatomic,assign) NSInteger arrangedCount; -@property(nonatomic,assign) BOOL averageArrange; +@property(nonatomic, assign) NSInteger pagedCount; @property(nonatomic,assign) BOOL autoArrange; -@property(nonatomic,assign) MyMarginGravity arrangedGravity; +@property(nonatomic,assign) MyGravity arrangedGravity; + +@property(nonatomic, assign) CGFloat subviewSize; +@property(nonatomic, assign) CGFloat minSpace; +@property(nonatomic, assign) CGFloat maxSpace; + @end -@interface MyLayoutSizeClassFloatLayout : MyLayoutSizeClassLinearLayout +@interface MyFloatLayoutViewSizeClass : MySequentLayoutViewSizeClass @property(nonatomic, assign) CGFloat subviewSize; -@property(nonatomic, assign) CGFloat minMargin; +@property(nonatomic, assign) CGFloat minSpace; +@property(nonatomic, assign) CGFloat maxSpace; +@property(nonatomic,assign) BOOL noBoundaryLimit; @end -@interface MyLayoutSizeClassRelativeLayout : MyLayoutSizeClassLayout +@interface MyRelativeLayoutViewSizeClass : MyLayoutViewSizeClass + + +@end -@property(nonatomic, assign) BOOL flexOtherViewWidthWhenSubviewHidden; -@property(nonatomic, assign) BOOL flexOtherViewHeightWhenSubviewHidden; + +@interface MyFrameLayoutViewSizeClass : MyLayoutViewSizeClass @end +@interface MyPathLayoutViewSizeClass : MyLayoutViewSizeClass + + +@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.m b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.m index 8c26cff..0a9b74d 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.m +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeClass.m @@ -8,54 +8,128 @@ #import "MyLayoutSizeClass.h" #import "MyLayoutPosInner.h" -#import "MyLayoutDimeInner.h" +#import "MyLayoutSizeInner.h" -@implementation MyLayoutSizeClass +@interface MyViewSizeClass() +@property(nonatomic, assign) BOOL wrapWidth; +@property(nonatomic, assign) BOOL wrapHeight; --(MyLayoutPos*)leftPos +@end + +@implementation MyViewSizeClass + +BOOL _myisRTL = NO; + ++(BOOL)isRTL { - if (_leftPos == nil) - { - _leftPos = [MyLayoutPos new]; - _leftPos.pos = MyMarginGravity_Horz_Left; - - } - - return _leftPos; - + return _myisRTL; +} + ++(void)setIsRTL:(BOOL)isRTL +{ + _myisRTL = isRTL; } +-(id)init +{ + return [super init]; +} + + + + + +-(MyLayoutPos*)topPosInner +{ + return _topPos; +} + +-(MyLayoutPos*)leadingPosInner +{ + return _leadingPos; +} + + +-(MyLayoutPos*)bottomPosInner +{ + return _bottomPos; +} + +-(MyLayoutPos*)trailingPosInner +{ + return _trailingPos; +} + +-(MyLayoutPos*)centerXPosInner +{ + return _centerXPos; +} + +-(MyLayoutPos*)centerYPosInner +{ + return _centerYPos; +} + +-(MyLayoutPos*)leftPosInner +{ + return [MyViewSizeClass isRTL] ? self.trailingPosInner : self.leadingPosInner; +} + +-(MyLayoutPos*)rightPosInner +{ + return [MyViewSizeClass isRTL] ? self.leadingPosInner : self.trailingPosInner; +} + + +-(MyLayoutSize*)widthSizeInner +{ + return _widthSize; +} + + +-(MyLayoutSize*)heightSizeInner +{ + return _heightSize; +} + + + +//.. + -(MyLayoutPos*)topPos { if (_topPos == nil) { _topPos = [MyLayoutPos new]; - _topPos.pos = MyMarginGravity_Vert_Top; + _topPos.view = self.view; + _topPos.pos = MyGravity_Vert_Top; } return _topPos; } --(MyLayoutPos*)rightPos +-(MyLayoutPos*)leadingPos { - if (_rightPos == nil) + if (_leadingPos == nil) { - _rightPos = [MyLayoutPos new]; - _rightPos.pos = MyMarginGravity_Horz_Right; - + _leadingPos = [MyLayoutPos new]; + _leadingPos.view = self.view; + _leadingPos.pos = MyGravity_Horz_Leading; } - return _rightPos; + return _leadingPos; } + -(MyLayoutPos*)bottomPos { if (_bottomPos == nil) { _bottomPos = [MyLayoutPos new]; - _bottomPos.pos = MyMarginGravity_Vert_Bottom; + _bottomPos.view = self.view; + _bottomPos.pos = MyGravity_Vert_Bottom; } @@ -63,12 +137,27 @@ -(MyLayoutPos*)bottomPos } +-(MyLayoutPos*)trailingPos +{ + if (_trailingPos == nil) + { + _trailingPos = [MyLayoutPos new]; + _trailingPos.view = self.view; + _trailingPos.pos = MyGravity_Horz_Trailing; + } + + return _trailingPos; + +} + + -(MyLayoutPos*)centerXPos { if (_centerXPos == nil) { _centerXPos = [MyLayoutPos new]; - _centerXPos.pos = MyMarginGravity_Horz_Center; + _centerXPos.view = self.view; + _centerXPos.pos = MyGravity_Horz_Center; } @@ -80,7 +169,8 @@ -(MyLayoutPos*)centerYPos if (_centerYPos == nil) { _centerYPos = [MyLayoutPos new]; - _centerYPos.pos = MyMarginGravity_Vert_Center; + _centerYPos.view = self.view; + _centerYPos.pos = MyGravity_Vert_Center; } @@ -88,138 +178,207 @@ -(MyLayoutPos*)centerYPos } --(CGFloat)myLeftMargin + +-(MyLayoutPos*)leftPos { - return self.leftPos.margin; + return [MyViewSizeClass isRTL] ? self.trailingPos : self.leadingPos; } --(void)setMyLeftMargin:(CGFloat)leftMargin +-(MyLayoutPos*)rightPos { - self.leftPos.equalTo(@(leftMargin)); - + return [MyViewSizeClass isRTL] ? self.leadingPos : self.trailingPos; } --(CGFloat)myTopMargin + + + +-(CGFloat)myTop { - return self.topPos.margin; + return self.topPosInner.absVal; } --(void)setMyTopMargin:(CGFloat)topMargin +-(void)setMyTop:(CGFloat)myTop { - self.topPos.equalTo(@(topMargin)); + [self.topPos __equalTo:@(myTop)]; } --(CGFloat)myRightMargin + +-(CGFloat)myLeading { - return self.rightPos.margin; + return self.leadingPosInner.absVal; } --(void)setMyRightMargin:(CGFloat)rightMargin +-(void)setMyLeading:(CGFloat)myLeading { - self.rightPos.equalTo(@(rightMargin)); + [self.leadingPos __equalTo:@(myLeading)]; } --(CGFloat)myBottomMargin + +-(CGFloat)myBottom { - return self.bottomPos.margin; + return self.bottomPosInner.absVal; } --(void)setMyBottomMargin:(CGFloat)bottomMargin +-(void)setMyBottom:(CGFloat)myBottom { - self.bottomPos.equalTo(@(bottomMargin)); + [self.bottomPos __equalTo:@(myBottom)]; } --(CGFloat)myMargin + +-(CGFloat)myTrailing { - return self.leftPos.margin; + return self.trailingPosInner.absVal; } --(void)setMyMargin:(CGFloat)myMargin +-(void)setMyTrailing:(CGFloat)myTrailing +{ + [self.trailingPos __equalTo:@(myTrailing)]; +} + + +-(CGFloat)myCenterX +{ + return self.centerXPosInner.absVal; +} + +-(void)setMyCenterX:(CGFloat)myCenterX { - self.topPos.equalTo(@(myMargin)); - self.leftPos.equalTo(@(myMargin)); - self.rightPos.equalTo(@(myMargin)); - self.bottomPos.equalTo(@(myMargin)); + [self.centerXPos __equalTo:@(myCenterX)]; } +-(CGFloat)myCenterY +{ + return self.centerYPosInner.absVal; +} + +-(void)setMyCenterY:(CGFloat)myCenterY +{ + [self.centerYPos __equalTo:@(myCenterY)]; +} + + +-(CGPoint)myCenter +{ + return CGPointMake(self.myCenterX, self.myCenterY); +} + +-(void)setMyCenter:(CGPoint)myCenter +{ + self.myCenterX = myCenter.x; + self.myCenterY = myCenter.y; +} + + + +-(CGFloat)myLeft +{ + return self.leftPosInner.absVal; +} --(CGFloat)myCenterXOffset +-(void)setMyLeft:(CGFloat)myLeft { - return self.centerXPos.margin; + [self.leftPos __equalTo:@(myLeft)]; + } --(void)setMyCenterXOffset:(CGFloat)centerXOffset +-(CGFloat)myRight { - self.centerXPos.equalTo(@(centerXOffset)); + return self.rightPosInner.absVal; } --(CGFloat)myCenterYOffset +-(void)setMyRight:(CGFloat)myRight { - return self.centerYPos.margin; + [self.rightPos __equalTo:@(myRight)]; } --(void)setMyCenterYOffset:(CGFloat)centerYOffset + + + +-(CGFloat)myMargin +{ + return self.leftPosInner.absVal; +} + +-(void)setMyMargin:(CGFloat)myMargin +{ + [self.topPos __equalTo:@(myMargin)]; + [self.leftPos __equalTo:@(myMargin)]; + [self.rightPos __equalTo:@(myMargin)]; + [self.bottomPos __equalTo:@(myMargin)]; +} + + +-(CGFloat)myHorzMargin { - self.centerYPos.equalTo(@(centerYOffset)); + return self.leftPosInner.absVal; } +-(void)setMyHorzMargin:(CGFloat)myHorzMargin +{ + [self.leftPos __equalTo:@(myHorzMargin)]; + [self.rightPos __equalTo:@(myHorzMargin)]; +} --(CGPoint)myCenterOffset +-(CGFloat)myVertMargin { - return CGPointMake(self.myCenterXOffset, self.myCenterYOffset); + return self.topPosInner.absVal; } --(void)setMyCenterOffset:(CGPoint)centerOffset +-(void)setMyVertMargin:(CGFloat)myVertMargin { - self.myCenterXOffset = centerOffset.x; - self.myCenterYOffset = centerOffset.y; + [self.topPos __equalTo:@(myVertMargin)]; + [self.bottomPos __equalTo:@(myVertMargin)]; } --(MyLayoutDime*)widthDime + + +-(MyLayoutSize*)widthSize { - if (_widthDime == nil) + if (_widthSize == nil) { - _widthDime = [MyLayoutDime new]; - _widthDime.dime = MyMarginGravity_Horz_Fill; + _widthSize = [MyLayoutSize new]; + _widthSize.view = self.view; + _widthSize.dime = MyGravity_Horz_Fill; } - return _widthDime; + return _widthSize; } --(MyLayoutDime*)heightDime +-(MyLayoutSize*)heightSize { - if (_heightDime == nil) + if (_heightSize == nil) { - _heightDime = [MyLayoutDime new]; - _heightDime.dime = MyMarginGravity_Vert_Fill; + _heightSize = [MyLayoutSize new]; + _heightSize.view = self.view; + _heightSize.dime = MyGravity_Vert_Fill; } - return _heightDime; + return _heightSize; } -(CGFloat)myWidth { - return self.widthDime.measure; + return self.widthSizeInner.measure; } -(void)setMyWidth:(CGFloat)width { - self.widthDime.equalTo(@(width)); + [self.widthSize __equalTo:@(width)]; } -(CGFloat)myHeight { - return self.heightDime.measure; + return self.heightSizeInner.measure; } -(void)setMyHeight:(CGFloat)height { - self.heightDime.equalTo(@(height)); + [self.heightSize __equalTo:@(height)]; } -(CGSize)mySize @@ -244,30 +403,117 @@ -(void)setWeight:(CGFloat)weight _weight = weight; } +-(BOOL)wrapContentWidth +{ + return self.wrapWidth; +} + +-(BOOL)wrapContentHeight +{ + return self.wrapHeight; +} + +-(void)setWrapContentWidth:(BOOL)wrapContentWidth +{ + if (self.wrapWidth != wrapContentWidth) + { + self.wrapWidth = wrapContentWidth; + + if (wrapContentWidth) + { + self.widthSize.equalTo(self.widthSize); + } + else + { + if (self.widthSizeInner.dimeSelfVal != nil) + self.widthSizeInner.equalTo(nil); + } + + } +} + +-(void)setWrapContentHeight:(BOOL)wrapContentHeight +{ + if (self.wrapHeight != wrapContentHeight) + { + self.wrapHeight = wrapContentHeight; + + if (wrapContentHeight) + { + if([_view isKindOfClass:[UILabel class]]) + { + if (((UILabel*)_view).numberOfLines == 1) + ((UILabel*)_view).numberOfLines = 0; + } + } + } +} + +-(BOOL)wrapContentSize +{ + return self.wrapContentWidth && self.wrapContentHeight; +} + + +-(void)setWrapContentSize:(BOOL)wrapContentSize +{ + self.wrapContentWidth = self.wrapContentHeight = wrapContentSize; +} + + + + +-(NSString*)debugDescription +{ + + NSString*dbgDesc = [NSString stringWithFormat:@"\nView:\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\nweight=%f\nuseFrame=%@\nnoLayout=%@\nmyVisibility=%c\nmyAlignment=%hu\nwrapContentWidth=%@\nwrapContentHeight=%@\nreverseFloat=%@\nclearFloat=%@", + self.topPosInner, + self.leadingPosInner, + self.bottomPosInner, + self.trailingPosInner, + self.centerXPosInner, + self.centerYPosInner, + self.widthSizeInner, + self.heightSizeInner, + self.weight, + self.useFrame ? @"YES":@"NO", + self.noLayout? @"YES":@"NO", + self.myVisibility, + self.myAlignment, + self.wrapContentWidth ? @"YES":@"NO", + self.wrapContentHeight ? @"YES":@"NO", + self.reverseFloat ? @"YES":@"NO", + self.clearFloat ? @"YES":@"NO"]; + + + return dbgDesc; +} #pragma mark -- NSCopying - (id)copyWithZone:(NSZone *)zone { - MyLayoutSizeClass *lsc = [[[self class] allocWithZone:zone] init]; + MyViewSizeClass *lsc = [[[self class] allocWithZone:zone] init]; //这里不会复制hidden属性 - lsc->_leftPos = [self.leftPos copy]; - lsc->_topPos = [self.topPos copy]; - lsc->_rightPos = [self.rightPos copy]; - lsc->_bottomPos = [self.bottomPos copy]; - lsc->_centerXPos = [self.centerXPos copy]; - lsc->_centerYPos = [self.centerYPos copy]; - lsc->_widthDime = [self.widthDime copy]; - lsc->_heightDime = [self.heightDime copy]; - lsc.flexedHeight = self.isFlexedHeight; + lsc->_view = _view; + lsc->_topPos = [self.topPosInner copy]; + lsc->_leadingPos = [self.leadingPosInner copy]; + lsc->_bottomPos = [self.bottomPosInner copy]; + lsc->_trailingPos = [self.trailingPosInner copy]; + lsc->_centerXPos = [self.centerXPosInner copy]; + lsc->_centerYPos = [self.centerYPosInner copy]; + lsc->_widthSize = [self.widthSizeInner copy]; + lsc->_heightSize = [self.heightSizeInner copy]; + lsc->_wrapWidth = self.wrapWidth; + lsc->_wrapHeight = self.wrapHeight; lsc.useFrame = self.useFrame; lsc.noLayout = self.noLayout; - lsc.hidden = self.hidden; + lsc.myVisibility = self.myVisibility; + lsc.myAlignment = self.myAlignment; lsc.weight = self.weight; - lsc.marginGravity = self.marginGravity; lsc.reverseFloat = self.isReverseFloat; lsc.clearFloat = self.clearFloat; @@ -278,176 +524,282 @@ - (id)copyWithZone:(NSZone *)zone @end -@implementation MyLayoutSizeClassLayout +@implementation MyLayoutViewSizeClass -(id)init { self = [super init]; if (self != nil) { - self.hideSubviewReLayout = YES; + _zeroPadding = YES; + } return self; } --(CGFloat)topPadding +-(void)setWrapContentWidth:(BOOL)wrapContentWidth { - return self.padding.top; + if (self.wrapWidth != wrapContentWidth) + { + self.wrapWidth = wrapContentWidth; + } + } --(void)setTopPadding:(CGFloat)topPadding +-(void)setWrapContentHeight:(BOOL)wrapContentHeight { - self->_padding.top = topPadding; + if (self.wrapHeight != wrapContentHeight) + { + self.wrapHeight = wrapContentHeight; + } + } --(CGFloat)leftPadding + + +-(UIEdgeInsets)padding { - return self.padding.left; + return UIEdgeInsetsMake(self.topPadding, self.leftPadding, self.bottomPadding, self.rightPadding); } --(void)setLeftPadding:(CGFloat)leftPadding +-(void)setPadding:(UIEdgeInsets)padding { - self->_padding.left = leftPadding; + self.topPadding = padding.top; + self.leftPadding = padding.left; + self.bottomPadding = padding.bottom; + self.rightPadding = padding.right; } --(CGFloat)bottomPadding +-(CGFloat)leftPadding { - return self.padding.bottom; + return [MyViewSizeClass isRTL] ? self.trailingPadding : self.leadingPadding; } --(void)setBottomPadding:(CGFloat)bottomPadding +-(void)setLeftPadding:(CGFloat)leftPadding { - self->_padding.bottom = bottomPadding; + if ([MyViewSizeClass isRTL]) + { + self.trailingPadding = leftPadding; + } + else + { + self.leadingPadding = leftPadding; + } } -(CGFloat)rightPadding { - return self.padding.right; + return [MyViewSizeClass isRTL] ? self.leadingPadding : self.trailingPadding; } -(void)setRightPadding:(CGFloat)rightPadding { - self->_padding.right = rightPadding; + if ([MyViewSizeClass isRTL]) + { + self.leadingPadding = rightPadding; + } + else + { + self.trailingPadding = rightPadding; + } } -- (id)copyWithZone:(NSZone *)zone -{ - MyLayoutSizeClassLayout *lsc = [super copyWithZone:zone]; - lsc.padding = self.padding; - lsc.wrapContentWidth = self.wrapContentWidth; - lsc.wrapContentHeight = self.wrapContentHeight; - lsc.hideSubviewReLayout = self.hideSubviewReLayout; - - return lsc; -} -@end - -@implementation MyLayoutSizeClassLinearLayout - --(CGFloat)subviewMargin +-(CGFloat)subviewSpace { - return self.subviewVertMargin; + return self.subviewVSpace; } --(void)setSubviewMargin:(CGFloat)subviewMargin +-(void)setSubviewSpace:(CGFloat)subviewSpace { - self.subviewVertMargin = subviewMargin; - self.subviewHorzMargin = subviewMargin; + self.subviewVSpace = subviewSpace; + self.subviewHSpace = subviewSpace; } - (id)copyWithZone:(NSZone *)zone { - MyLayoutSizeClassLinearLayout *lsc = [super copyWithZone:zone]; - - lsc.orientation = self.orientation; + MyLayoutViewSizeClass *lsc = [super copyWithZone:zone]; + lsc.topPadding = self.topPadding; + lsc.leadingPadding = self.leadingPadding; + lsc.bottomPadding = self.bottomPadding; + lsc.trailingPadding = self.trailingPadding; + lsc.zeroPadding = self.zeroPadding; lsc.gravity = self.gravity; - lsc.subviewVertMargin = self.subviewVertMargin; - lsc.subviewHorzMargin = self.subviewHorzMargin; + lsc.reverseLayout = self.reverseLayout; + lsc.subviewVSpace = self.subviewVSpace; + lsc.subviewHSpace = self.subviewHSpace; - return lsc; + return lsc; } +-(NSString*)debugDescription +{ + NSString *dbgDesc = [super debugDescription]; + + dbgDesc = [NSString stringWithFormat:@"%@\nLayout:\npadding=%@\nzeroPadding=%@\ngravity=%hu\nreverseLayout=%@\nsubviewVertSpace=%f\nsubviewHorzSpace=%f", + dbgDesc, + NSStringFromUIEdgeInsets(self.padding), + self.zeroPadding?@"YES":@"NO", + self.gravity, + self.reverseLayout ? @"YES":@"NO", + self.subviewVSpace, + self.subviewHSpace + ]; + + + return dbgDesc; +} @end -@implementation MyLayoutSizeClassTableLayout + +@implementation MySequentLayoutViewSizeClass --(CGFloat)rowSpacing + +- (id)copyWithZone:(NSZone *)zone { - return self.subviewMargin; + MySequentLayoutViewSizeClass *lsc = [super copyWithZone:zone]; + lsc.orientation = self.orientation; + + + return lsc; } --(void)setRowSpacing:(CGFloat)rowSpacing +-(NSString*)debugDescription { - self.subviewMargin = rowSpacing; + NSString *dbgDesc = [super debugDescription]; + + dbgDesc = [NSString stringWithFormat:@"%@\nSequentLayout: \norientation=%lu", + dbgDesc, + (unsigned long)self.orientation + ]; + + + return dbgDesc; } + +@end + + +@implementation MyLinearLayoutViewSizeClass + - (id)copyWithZone:(NSZone *)zone { - MyLayoutSizeClassTableLayout *lsc = [super copyWithZone:zone]; + MyLinearLayoutViewSizeClass *lsc = [super copyWithZone:zone]; - lsc.rowSpacing = self.rowSpacing; - lsc.colSpacing = self.colSpacing; + lsc.shrinkType = self.shrinkType; return lsc; } +-(NSString*)debugDescription +{ + NSString *dbgDesc = [super debugDescription]; + + dbgDesc = [NSString stringWithFormat:@"%@\nLinearLayout: \nshrinkType=%lu", + dbgDesc, + (unsigned long)self.shrinkType + ]; + + + return dbgDesc; +} + + + +@end + +@implementation MyTableLayoutViewSizeClass @end -@implementation MyLayoutSizeClassFloatLayout +@implementation MyFloatLayoutViewSizeClass - (id)copyWithZone:(NSZone *)zone { - MyLayoutSizeClassFloatLayout *lsc = [super copyWithZone:zone]; + MyFloatLayoutViewSizeClass *lsc = [super copyWithZone:zone]; lsc.subviewSize = self.subviewSize; - lsc.minMargin = self.minMargin; + lsc.minSpace = self.minSpace; + lsc.maxSpace = self.maxSpace; + lsc.noBoundaryLimit = self.noBoundaryLimit; return lsc; } +-(NSString*)debugDescription +{ + NSString *dbgDesc = [super debugDescription]; + + dbgDesc = [NSString stringWithFormat:@"%@\nFloatLayout: \nnoBoundaryLimit=%@", + dbgDesc, + self.noBoundaryLimit ? @"YES":@"NO"]; + + return dbgDesc; +} + + + @end -@implementation MyLayoutSizeClassFlowLayout +@implementation MyFlowLayoutViewSizeClass - (id)copyWithZone:(NSZone *)zone { - MyLayoutSizeClassFlowLayout *lsc = [super copyWithZone:zone]; + MyFlowLayoutViewSizeClass *lsc = [super copyWithZone:zone]; lsc.arrangedCount = self.arrangedCount; - lsc.averageArrange = self.averageArrange; lsc.autoArrange = self.autoArrange; lsc.arrangedGravity = self.arrangedGravity; + lsc.subviewSize = self.subviewSize; + lsc.minSpace = self.minSpace; + lsc.maxSpace = self.maxSpace; + lsc.pagedCount = self.pagedCount; return lsc; } +-(NSString*)debugDescription +{ + NSString *dbgDesc = [super debugDescription]; + + dbgDesc = [NSString stringWithFormat:@"%@\nFlowLayout: \narrangedCount=%ld\nautoArrange=%@\narrangedGravity=%hu\npagedCount=%ld", + dbgDesc, + (long)self.arrangedCount, + self.autoArrange ? @"YES":@"NO", + self.arrangedGravity, + (long)self.pagedCount + ]; + + return dbgDesc; +} + + @end -@implementation MyLayoutSizeClassRelativeLayout +@implementation MyRelativeLayoutViewSizeClass -- (id)copyWithZone:(NSZone *)zone -{ - MyLayoutSizeClassRelativeLayout *lsc = [super copyWithZone:zone]; - lsc.flexOtherViewWidthWhenSubviewHidden = self.flexOtherViewWidthWhenSubviewHidden; - lsc.flexOtherViewHeightWhenSubviewHidden = self.flexOtherViewHeightWhenSubviewHidden; - - return lsc; -} +@end + +@implementation MyFrameLayoutViewSizeClass + + + +@end +@implementation MyPathLayoutViewSizeClass @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeInner.h b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeInner.h new file mode 100644 index 0000000..3fd7990 --- /dev/null +++ b/Pods/MyLayout/MyLayout/Lib/MyLayoutSizeInner.h @@ -0,0 +1,49 @@ +// +// MyLayoutDimeInner.h +// MyLayout +// +// Created by oybq on 15/6/14. +// Copyright (c) 2015年 YoungSoft. All rights reserved. +// + +#import "MyLayoutSize.h" + + +//尺寸对象内部定义 +@interface MyLayoutSize() + +@property(nonatomic, weak) UIView *view; +@property(nonatomic, assign) MyGravity dime; +@property(nonatomic, assign) MyLayoutValueType dimeValType; + +@property(nonatomic, readonly, strong) NSNumber *dimeNumVal; +@property(nonatomic, readonly, strong) MyLayoutSize *dimeRelaVal; +@property(nonatomic, readonly, strong) NSArray *dimeArrVal; +@property(nonatomic, readonly, strong) MyLayoutSize *dimeSelfVal; + +@property(nonatomic, readonly, strong) MyLayoutSize *lBoundVal; +@property(nonatomic, readonly, strong) MyLayoutSize *uBoundVal; + +@property(nonatomic, readonly, strong) MyLayoutSize *lBoundValInner; +@property(nonatomic, readonly, strong) MyLayoutSize *uBoundValInner; + + + +-(MyLayoutSize*)__equalTo:(id)val; +-(MyLayoutSize*)__add:(CGFloat)val; +-(MyLayoutSize*)__multiply:(CGFloat)val; +-(MyLayoutSize*)__min:(CGFloat)val; +-(MyLayoutSize*)__lBound:(id)sizeVal addVal:(CGFloat)addVal multiVal:(CGFloat)multiVal; +-(MyLayoutSize*)__max:(CGFloat)val; +-(MyLayoutSize*)__uBound:(id)sizeVal addVal:(CGFloat)addVal multiVal:(CGFloat)multiVal; +-(void)__clear; + + + +//只有为数值时才有意义。 +@property(nonatomic, readonly, assign) CGFloat measure; + + +-(CGFloat)measureWith:(CGFloat)size; + +@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.h b/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.h index a1acb78..2e865fa 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.h @@ -9,77 +9,195 @@ #import "MyBaseLayout.h" -@interface UIView(MyLinearLayoutExt) - -/** - *设置子视图在垂直线性布局中的高度尺寸比重值和在水平线性布局下的宽度尺寸比重值。设置的范围是 0<=weight<=1。所谓比重指的是一个相对的尺寸值,视图的真实尺寸会根据布局视图的剩余尺寸乘以这个比重值所占的比例来得到真实的尺寸。假如一个垂直线性布局的高度为100,里面有A,B,C三个子视图。其中A视图的高度为20,B视图的高度比重值为0.4,C视图的高度比重值为0.6。那么最终视图A的高度是20,而视图B的高度就是(100 - 20)*(0.4/(0.4+0.6))=32,而视图C的高度就是(100 - 20)*(0.6/(0.4+0.6))=48。可以看到通过比重值的设置我们不需要明确的指定具体的尺寸,而是根据布局视图的尺寸大小来动态的决定自己的尺寸。使用比重时需要注意的几个点: - 1.垂直线性布局必须指定明确的高度,而不能使用wrapContentHeight属性;水平线性布局必须指定明确的宽度,而不能使用wrapContentWidth属性; - 2.如果比重属性如果设置为0的话则表示视图的尺寸必须要明确的被指定,这也是默认值。 - 3.线性布局里面的子视图的比重值的和不一定要求是1,比如线性布局里面两个视图的比重都设置为1和都设置为0.5以及都设置为0.1的意义是一样的,都是占用50%。 - * - */ -@property(nonatomic, assign) IBInspectable CGFloat weight; - -@end - - - /** - *线性布局是一种里面的子视图按添加的顺序从上到下或者从左到右依次排列的单列(单行)布局视图,因此里面的子视图是通过添加的顺序建立约束和依赖关系的。 - *子视图从上到下依次排列的线性布局视图称为垂直线性布局视图,而子视图从左到右依次排列的线性布局视图则称为水平线性布局。 + 线性布局是一种里面的子视图按添加的顺序从上到下或者从左到右依次排列的单行(单列)布局视图。线性布局里面的子视图是通过添加的顺序建立约束和依赖关系的。 + + @note + 根据排列的方向我们把子视图从上到下依次排列的线性布局视图称为垂直线性布局视图,而把子视图从左到右依次排列的线性布局视图则称为水平线性布局。 + + @code + 垂直线性布局 + +-------+ + | A | + +-------+ + | B | + +-------+ ⥥ + | C | + +-------+ + | ... | + +-------+ + + 水平线性布局 + +-----+-----+-----+-----+ + | A | B | C | ... | + +-----+-----+-----+-----+ + ⥤ + @endcode */ @interface MyLinearLayout : MyBaseLayout /** - *初始化一个线性布局,并指定子视图布局的方向。如果不明确指定方向则默认是建立一个垂直线性布局。建立一个垂直线性布局时默认的wrapContentHeight设置为YES,而建立一个水平线性布局时默认的wrapContentWidth设置为YES。 + 初始化一个线性布局,并指定子视图排列的方向。如果不明确指定方向则默认是建立一个垂直线性布局。 + @note 建立一个垂直线性布局时默认的wrapContentHeight设置为YES,表示高度默认由所有子视图的高度决定;而建立一个水平线性布局时默认的wrapContentWidth设置为YES,表示宽度默认由所有子视图的宽度决定。 + + @param orientation 布局视图内子视图的排列方向。 + @return 返回线性布局对象实例。 */ --(id)initWithOrientation:(MyLayoutViewOrientation)orientation; -+(id)linearLayoutWithOrientation:(MyLayoutViewOrientation)orientation; ++(instancetype)linearLayoutWithOrientation:(MyOrientation)orientation; +-(instancetype)initWithOrientation:(MyOrientation)orientation; +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation; /** - *线性布局的布局方向。 + 线性布局的布局方向: + + 1. MyOrientation_Vert 表示布局内子视图依次从上到下垂直排列。这个方向是默认方向。 + + 2. MyOrientation_Horz 表示布局内子视图依次从左到右(RTL从右到左)水平排列。 */ -@property(nonatomic,assign) IBInspectable MyLayoutViewOrientation orientation; +@property(nonatomic,assign) IBInspectable MyOrientation orientation; + + + + /** - *线性布局里面的所有子视图的整体停靠方向以及填充,所谓停靠是指布局视图里面的所有子视图整体在布局视图中的位置,系统默认的停靠是在布局视图的左上角。 + 用来设置当线性布局中的所有子视图的尺寸和间距的和大于线性布局的尺寸时子视图压缩策略。默认值是MySubviewsShrink_None,表示什么不压缩子视图的尺寸和间距。 + 这个属性定义了在线性布局里面当某个子视图的尺寸设置为weight比重值或者间距为相对间距时,并且其他剩余的子视图的尺寸和间距的总和要大于布局视图本身的尺寸时,对那些具有固定尺寸的子视图的处理方式。需要强调的是只有当子视图的尺寸和间距总和大于布局视图的尺寸时才有意义,否则无意义。 + + 我们定义了4种压缩策略和2种压缩内容。 + + 4种压缩策略分别是:不压缩、平均压缩多余的值、按比例压缩多余的值、自动压缩多余的值。 + + 2种压缩内容是:压缩子视图的尺寸、压缩子视图之间的间距。 + + 下面分别描述压缩策略和压缩内容的组合,比如某个垂直线性布局的高度是100。 里面分别有A,B,C,D四个子视图。其中: + @code + A.topPos = 10 + A.height = 50 + B.topPos = 0.1 + B.weight = 0.2 + C.height = 60 + D.topPos = 20 + D.weight = 0.7 + + @endcode + + 那么这时候所有具有固定尺寸和间距的子视图高度总和 = A.topPos + A.height + C.height +D.topPos = 140 > 100。 + 这里面多出了40的高度值,并且B和D设置了尺寸和间距的相对值,因此满足压缩条件。那么这时候我们可以用如下压缩策略来处理所有具有固定尺寸的子视图: + + 1. MySubviewsShrink_None | MySubviewsShrink_Size(这是布局的默认设置属性): + + 这种情况下即使是固定的视图的尺寸超出也不会进行任何压缩!!!! + + 2. MySubviewsShrink_Average | MySubviewsShrink_Size (平均压缩) + 这种情况下,我们只会压缩那些具有固定尺寸的子视图A和C的高度,每个子视图被压缩的值是:剩余的尺寸40 / 固定尺寸的子视图数量2 = 20。 这样: + @code + A的最终高度 = 50 - 20 = 30 + C的最终高度 = 60 - 20 = 40 + @endcode + + 3. MySubviewsShrink_Weight | MySubviewsShrink_Size(按比例压缩) + 这种情况下,我们只会压缩那些具有固定尺寸的子视图A和C的高度,这些固定尺寸的子视图高度总和为50 + 60 = 110. 这样: + @code + A的最终高度 = 50 - 40 *(50/110) = 32 + C的最终高度 = 60 - 40 *(60/110) = 38 + @endcode + + 4.MySubviewsShrink_Auto (自动压缩,只对水平线性布局有效) + 假如某个水平线性布局里面里面有左右2个UILabel A和B。A和B的宽度都不确定,但是二者不能覆盖重叠,而且当间距小于一个值后要求自动换行。因为宽度都不确定所以不能为子视图指定具体的宽度值和最大最小的宽度值,但是又要利用好剩余的空间,这时候就可以用这个属性。比如下面的例子: + @code + MyLinearLayout *horzLayout = [MyLinearLayout linearLayoutWithOrientation:MyOrientation_Horz]; + horzLayout.myHorzMargin = 0; + horzLayout.wrapContentHeight = YES; + horzLayout.subviewSpace = 10; //二者的最小间距不能小于20 + horzLayout.shrinkType = MySubviewsShrink_Auto; + + UILabel *A = [UILabel new]; + A.text = @"xxxxxxx"; + A.widthSize.equalTo(A.widthSize); //宽度等于自身内容的宽度,必须要这么设置和 MySubviewsShrink_Auto 结合使用。 + A.wrapContentHeight = YES; //自动换行 + A.rightPos.equalTo(@0.5); //右边间距是剩余的50% + [horzLayout addSubview:A]; + + + UILabel *B = [UILabel new]; + B.text = @"XXXXXXXX"; + B.widthSize.equalTo(B.widthSize); //宽度等于自身内容的宽度,必须要这么设置和 MySubviewsShrink_Auto 结合使用。 + B.wrapContentHeight = YES; //自动换行 + B.leftPos.equalTo(@0.5); //左边间距是剩余的50% + [horzLayout addSubview:B]; + @endcode + + 5. MySubviewsShrink_Average | MySubviewsShrink_Space (平均压缩间距) + 这种情况下,我们只会压缩那些具有固定间距的视图:A,D的间距,每个子视图的压缩的值是:剩余的尺寸40 / 固定间距的视图的数量2 = 20。 这样: + @code + A的最终topPos = 10 - 20 = -10 + D的最终topPos = 20 - 20 = 0 + @endcode + + 6. MySubviewsShrink_Weight | MySubviewsShrink_Space: (按比重压缩间距) + 这种情况下,我们只会压缩那些具有固定间距的视图:A,D的间距,这些总的间距为10+20 = 30. 这样: + @code + A的最终topPos = 10 - 40 *(10/30) = -3 + D的最终topPos = 20 - 40 *(20/30) = -7 + @endcode */ -@property(nonatomic, assign) IBInspectable MyMarginGravity gravity; +@property(nonatomic, assign) MySubviewsShrinkType shrinkType; /** - *设置布局视图里面子视图之间的间距。如果是垂直线性布局则设置的是垂直间距,如果是水平线性布局则设置的是水平间距。两个视图之间的最终间距等于MyLayoutPos设置的间距加上subviewMargin设置的间距的和。 + 均分子视图的尺寸和间距。布局会根据里面的子视图的数量来平均分配子视图的高度或者宽度以及间距。 + + @note 这个方法只对已经加入布局的视图有效,方法调用后新加入的子视图无效。 + + @param centered 指定是否所有子视图居中,当居中时对于垂直线性布局来说顶部和底部会保留出间距,而不居中时则顶部和底部不留出间距。水平线性布局则是指头部和尾部。 */ -@property(nonatomic, assign) IBInspectable CGFloat subviewMargin; +-(void)equalizeSubviews:(BOOL)centered; +-(void)equalizeSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass; + /** - *均分子视图和间距,布局会根据里面的子视图的数量来平均分配子视图的高度或者宽度以及间距。 - *这个函数只对已经加入布局的视图有效,函数调用后新加入的子视图无效。 - *@centered参数描述是否所有子视图居中,当居中时对于垂直线性布局来说顶部和底部会保留出间距,而不居中时则顶部和底部不保持间距 - *@sizeClass参数表示设置在指定sizeClass下进行子视图和间距的均分 + 均分子视图尺寸,并指定固定的间距。上面的方法会导致子视图的高度或者宽度和他们之间的间距相等,而这个方法则指定间距为一个固定的值而子视图的高度或者宽度则会被均分。 + + @note 这个方法只对已经加入布局的视图有效,方法调用后加入的子视图无效。 + @param centered 指定是否所有子视图居中,当居中时对于垂直线性布局来说顶部和底部会保留出间距,而不居中时则顶部和底部不留出间距。水平线性布局则是指头部和尾部 + @param space 子视图之间的间距。 */ --(void)averageSubviews:(BOOL)centered; --(void)averageSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass; +-(void)equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space; +-(void)equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space inSizeClass:(MySizeClass)sizeClass; + + /** - *均分子视图,并指定固定的边距。上面的函数会导致子视图的高度或者宽度和他们之间的间距相等,而这个函数则表示间距是一个指定的值而子视图的高度或者宽度则会被均分。 - *这个函数只对已经加入布局的视图有效,函数调用后加入的子视图无效。 - *@centered参数描述是否所有子视图居中,当居中时对于垂直线性布局来说顶部和底部会保留出间距,而不居中时则顶部和底部不保持间距 - *@sizeClass参数表示设置在指定sizeClass下进行子视图高度或者宽度的均分以及间距的指定 + 均分子视图之间的间距,上面方法会均分子视图的尺寸以及间距,而这个方法则子视图的尺寸保持不变而间距自动平均分配,也就是用布局视图的剩余空间来均分间距 + + @note 这个方法只对已经加入布局的视图有效,方法调用后加入的子视图无效。 + + @param centered 参数描述是否所有子视图居中,当居中时对于垂直线性布局来说顶部和底部会保留出间距,而不居中时则顶部和底部不保持间距。水平线性布局则是指头部和尾部 */ --(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin; --(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin inSizeClass:(MySizeClass)sizeClass; +-(void)equalizeSubviewsSpace:(BOOL)centered; +-(void)equalizeSubviewsSpace:(BOOL)centered inSizeClass:(MySizeClass)sizeClass; + + +@end + + +@interface MyLinearLayout(MyLinearLayoutDeprecated) /** - *均分子视图的间距,上面函数会调整子视图的尺寸以及间距,而这个函数则是子视图的尺寸保持不变而间距自动平均分配,也就是用布局视图的剩余空间来均分间距 - *@centered参数意义同上。 - *@sizeClass参数的意义同上。 + * 过期的方法,这些过期的方法名取名不规范,因此为了和TangramKit统一,这里将这些不规范的方法设置为过期。 */ --(void)averageMargin:(BOOL)centered; --(void)averageMargin:(BOOL)centered inSizeClass:(MySizeClass)sizeClass; +-(void)averageSubviews:(BOOL)centered MYMETHODDEPRECATED("use ’equalizeSubviews:(BOOL)centered‘ to instead"); +-(void)averageSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass MYMETHODDEPRECATED("use ‘equalizeSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass’ to instead"); + +-(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin MYMETHODDEPRECATED("use ‘equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space’ to instead"); +-(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin inSizeClass:(MySizeClass)sizeClass MYMETHODDEPRECATED("use ‘equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space inSizeClass:(MySizeClass)sizeClass’ to instead"); + +-(void)averageMargin:(BOOL)centered MYMETHODDEPRECATED("use ‘equalizeSubviewsSpace:(BOOL)centered’ to instead"); +-(void)averageMargin:(BOOL)centered inSizeClass:(MySizeClass)sizeClass MYMETHODDEPRECATED("use ‘equalizeSubviewsSpace:(BOOL)centered inSizeClass:(MySizeClass)sizeClass’ to instead"); @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.m b/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.m index fe591ea..4eec66d 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyLinearLayout.m @@ -8,704 +8,1275 @@ #import "MyLinearLayout.h" #import "MyLayoutInner.h" -#import -@implementation UIView(MyLinearLayoutExt) - --(CGFloat)weight -{ - return self.myCurrentSizeClass.weight; -} - --(void)setWeight:(CGFloat)weight -{ - if (self.myCurrentSizeClass.weight != weight) - { - self.myCurrentSizeClass.weight = weight; - if (self.superview != nil) - [self.superview setNeedsLayout]; - } -} - - - - -@end - -IB_DESIGNABLE @implementation MyLinearLayout - --(id)initWithOrientation:(MyLayoutViewOrientation)orientation +-(instancetype)initWithFrame:(CGRect)frame orientation:(MyOrientation)orientation { - self = [super init]; + self = [super initWithFrame:frame]; if (self) { - if (orientation == MyLayoutViewOrientation_Vert) - self.myCurrentSizeClass.wrapContentHeight = YES; + MyLinearLayout *lsc = self.myCurrentSizeClass; + if (orientation == MyOrientation_Vert) + lsc.wrapContentHeight = YES; else - self.myCurrentSizeClass.wrapContentWidth = YES; - self.myCurrentSizeClass.orientation = orientation; - + lsc.wrapContentWidth = YES; + lsc.orientation = orientation; } - + return self; } -+(id)linearLayoutWithOrientation:(MyLayoutViewOrientation)orientation + +-(instancetype)initWithOrientation:(MyOrientation)orientation +{ + return [self initWithFrame:CGRectZero orientation:orientation]; +} + ++(instancetype)linearLayoutWithOrientation:(MyOrientation)orientation { return [[[self class] alloc] initWithOrientation:orientation]; } --(void)setOrientation:(MyLayoutViewOrientation)orientation +-(void)setOrientation:(MyOrientation)orientation { - if (self.myCurrentSizeClass.orientation != orientation) + MyLinearLayout *lsc = self.myCurrentSizeClass; + if (lsc.orientation != orientation) { - self.myCurrentSizeClass.orientation = orientation; + lsc.orientation = orientation; [self setNeedsLayout]; } } --(MyLayoutViewOrientation)orientation +-(MyOrientation)orientation { return self.myCurrentSizeClass.orientation; } --(void)setGravity:(MyMarginGravity)gravity +-(void)setShrinkType:(MySubviewsShrinkType)shrinkType { - MyLinearLayout *lsc = self.myCurrentSizeClass; - if (lsc.gravity != gravity) + if (lsc.shrinkType != shrinkType) { - lsc.gravity = gravity; + lsc.shrinkType = shrinkType; [self setNeedsLayout]; } } --(MyMarginGravity)gravity +-(MySubviewsShrinkType)shrinkType { - return self.myCurrentSizeClass.gravity; + return self.myCurrentSizeClass.shrinkType; } --(void)setSubviewMargin:(CGFloat)subviewMargin + +-(void)equalizeSubviews:(BOOL)centered { - MyLinearLayout *lsc = self.myCurrentSizeClass; + [self equalizeSubviews:centered withSpace:CGFLOAT_MAX]; +} + +-(void)equalizeSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass +{ + [self equalizeSubviews:centered withSpace:CGFLOAT_MAX inSizeClass:sizeClass]; +} + +-(void)equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space +{ + [self equalizeSubviews:centered withSpace:space inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; + [self setNeedsLayout]; +} + +-(void)equalizeSubviews:(BOOL)centered withSpace:(CGFloat)space inSizeClass:(MySizeClass)sizeClass +{ + self.myFrame.sizeClass = [self fetchLayoutSizeClass:sizeClass]; + for (UIView *sbv in self.subviews) + sbv.myFrame.sizeClass = [sbv fetchLayoutSizeClass:sizeClass]; - if (lsc.subviewMargin != subviewMargin) + if (self.orientation == MyOrientation_Vert) { - lsc.subviewMargin = subviewMargin; - [self setNeedsLayout]; + [self myEqualizeSubviewsForVert:centered withSpace:space]; } + else + { + [self myEqualizeSubviewsForHorz:centered withSpace:space]; + } + + self.myFrame.sizeClass = self.myDefaultSizeClass; + for (UIView *sbv in self.subviews) + sbv.myFrame.sizeClass = sbv.myDefaultSizeClass; + } --(CGFloat)subviewMargin +-(void)equalizeSubviewsSpace:(BOOL)centered { - return self.myCurrentSizeClass.subviewMargin; + [self equalizeSubviewsSpace:centered inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; + [self setNeedsLayout]; + } +-(void)equalizeSubviewsSpace:(BOOL)centered inSizeClass:(MySizeClass)sizeClass +{ + + self.myFrame.sizeClass = [self fetchLayoutSizeClass:sizeClass]; + for (UIView *sbv in self.subviews) + sbv.myFrame.sizeClass = [sbv fetchLayoutSizeClass:sizeClass]; + + if (self.orientation == MyOrientation_Vert) + { + [self myEqualizeSubviewsSpaceForVert:centered]; + } + else + { + [self myEqualizeSubviewsSpaceForHorz:centered]; + } + + self.myFrame.sizeClass = self.myDefaultSizeClass; + for (UIView *sbv in self.subviews) + sbv.myFrame.sizeClass = sbv.myDefaultSizeClass; + +} + + +#pragma mark -- Deprecated Method -(void)averageSubviews:(BOOL)centered { - [self averageSubviews:centered withMargin:CGFLOAT_MAX]; + [self equalizeSubviews:centered]; } -(void)averageSubviews:(BOOL)centered inSizeClass:(MySizeClass)sizeClass { - [self averageSubviews:centered withMargin:CGFLOAT_MAX inSizeClass:sizeClass]; + [self equalizeSubviews:centered inSizeClass:sizeClass]; } -(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin { - [self averageSubviews:centered withMargin:margin inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; - [self setNeedsLayout]; + [self equalizeSubviews:centered withSpace:margin]; } -(void)averageSubviews:(BOOL)centered withMargin:(CGFloat)margin inSizeClass:(MySizeClass)sizeClass { - self.absPos.sizeClass = [self fetchLayoutSizeClass:sizeClass]; - for (UIView *sbv in self.subviews) - sbv.absPos.sizeClass = [sbv fetchLayoutSizeClass:sizeClass]; + [self equalizeSubviews:centered withSpace:margin inSizeClass:sizeClass]; +} + + + +-(void)averageMargin:(BOOL)centered +{ + [self equalizeSubviewsSpace:centered]; +} + +-(void)averageMargin:(BOOL)centered inSizeClass:(MySizeClass)sizeClass +{ + [self equalizeSubviewsSpace:centered inSizeClass:sizeClass]; +} + + +#pragma mark -- Override Method + +- (void)willMoveToSuperview:(UIView*)newSuperview +{ + //减少约束冲突的提示。。 + MyLinearLayout *lsc = self.myCurrentSizeClass; - if (self.orientation == MyLayoutViewOrientation_Vert) + if (lsc.orientation == MyOrientation_Vert) { - [self averageSubviewsForVert:centered withMargin:margin]; + if (lsc.heightSizeInner.dimeVal != nil && lsc.wrapContentHeight) + { + lsc.wrapContentHeight = NO; + } + } else { - [self averageSubviewsForHorz:centered withMargin:margin]; + if (lsc.widthSizeInner.dimeVal != nil && lsc.wrapContentWidth) + { + lsc.wrapContentWidth = NO; + } + } - self.absPos.sizeClass = self.myDefaultSizeClass; - for (UIView *sbv in self.subviews) - sbv.absPos.sizeClass = sbv.myDefaultSizeClass; + [super willMoveToSuperview:newSuperview]; } --(void)averageMargin:(BOOL)centered +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray *)sbs { - [self averageMargin:centered inSizeClass:MySizeClass_hAny | MySizeClass_wAny]; - [self setNeedsLayout]; + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; -} - --(void)averageMargin:(BOOL)centered inSizeClass:(MySizeClass)sizeClass -{ - self.absPos.sizeClass = [self fetchLayoutSizeClass:sizeClass]; - for (UIView *sbv in self.subviews) - sbv.absPos.sizeClass = [sbv fetchLayoutSizeClass:sizeClass]; + if (sbs == nil) + sbs = [self myGetLayoutSubviews]; + + + MyLinearLayout *lsc = self.myCurrentSizeClass; + + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = lsc.gravity & MyGravity_Vert_Mask; + MyOrientation oreintation = lsc.orientation; + + for (UIView *sbv in sbs) + { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (!isEstimate) + { + sbvmyFrame.frame = sbv.bounds; + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + } + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + [self myAdjustSubviewWrapContent:sbv sbvsc:sbvsc orientation:oreintation gravity:(oreintation == MyOrientation_Vert)? horzGravity : vertGravity]; + + BOOL isSbvWrap = sbvsc.wrapContentHeight || sbvsc.wrapContentWidth; + if (pHasSubLayout != nil && isSbvWrap) + *pHasSubLayout = YES; + + if (isEstimate && isSbvWrap) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } + } - if (self.orientation == MyLayoutViewOrientation_Vert) + if (oreintation == MyOrientation_Vert) { - [self averageMarginForVert:centered]; + if (vertGravity != MyGravity_None) + selfSize = [self myLayoutSubviewsForVertGravity:selfSize sbs:sbs lsc:lsc]; + else + selfSize = [self myLayoutSubviewsForVert:selfSize sbs:sbs lsc:lsc]; } else { - [self averageMarginForHorz:centered]; + if (horzGravity != MyGravity_None) + selfSize = [self myLayoutSubviewsForHorzGravity:selfSize sbs:sbs lsc:lsc]; + else + selfSize = [self myLayoutSubviewsForHorz:selfSize sbs:sbs lsc:lsc]; } - self.absPos.sizeClass = self.myDefaultSizeClass; - for (UIView *sbv in self.subviews) - sbv.absPos.sizeClass = sbv.myDefaultSizeClass; + //绘制智能线。 + if (!isEstimate) + { + [self mySetLayoutIntelligentBorderline:sbs lsc:lsc]; + } -} + //调整布局视图自己的尺寸。 + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + //如果是反向则调整所有子视图的左右位置。 + [self myAdjustSubviewsRTLPos:sbs selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs lsc:lsc]; + +} -/* - // Only override drawRect: if you perform custom drawing. - // An empty implementation adversely affects performance during animation. - - (void)drawRect:(CGRect)rect - { - // Drawing code - } - */ +-(id)createSizeClassInstance +{ + return [MyLinearLayoutViewSizeClass new]; +} #pragma mark -- Private Method +//调整子视图的wrapContent设置 +- (void)myAdjustSubviewWrapContent:(UIView*)sbv sbvsc:(UIView*)sbvsc orientation:(MyOrientation)orientation gravity:(MyGravity)gravity +{ + if (orientation == MyOrientation_Vert) + { + if (sbvsc.wrapContentWidth) + { + //只要同时设置了左右边距或者设置了宽度或者设置了子视图宽度填充则应该把wrapContentWidth置为NO + if ((sbvsc.widthSizeInner.dimeVal != nil) || + (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) || + (gravity == MyGravity_Horz_Fill) + ) + { + sbvsc.wrapContentWidth = NO; + } + } + + if (sbvsc.wrapContentHeight) + { + //只要同时设置了高度或者比重属性则应该把wrapContentHeight置为NO + if ((sbvsc.heightSizeInner.dimeVal != nil) || + (sbvsc.weight != 0)) + { + sbvsc.wrapContentHeight = NO; + } + } + + } + else + { + + if (sbvsc.wrapContentHeight) + { + //只要同时设置了高度或者上下边距或者父视图的填充属性则应该把wrapContentHeight置为NO + if ((sbvsc.heightSizeInner.dimeVal != nil) || + (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) || + (gravity == MyGravity_Vert_Fill) + ) + { + sbvsc.wrapContentHeight = NO; + } + } + + if (sbvsc.wrapContentWidth) + { + //只要同时设置了宽度或者比重属性则应该把wrapContentWidth置为NO + if (sbvsc.widthSizeInner.dimeVal != nil || sbvsc.weight != 0) + { + sbvsc.wrapContentWidth = NO; + } + } + } +} -- (CGRect)AdjustSelfWidth:(NSArray *)sbs selfRect:(CGRect)selfRect +//设置智能边界线 +-(void)mySetLayoutIntelligentBorderline:(NSArray*)sbs lsc:(MyLinearLayout*)lsc { + if (self.intelligentBorderline == nil) + return; - CGFloat maxSubviewWidth = 0; - - //计算出最宽的子视图所占用的宽度 - if (self.wrapContentWidth) + BOOL isVert = (lsc.orientation == MyOrientation_Vert); + CGFloat subviewSpace = (lsc.orientation == MyOrientation_Vert) ? lsc.subviewVSpace : lsc.subviewHSpace; + for (int i = 0; i < sbs.count; i++) + { + UIView *sbv = sbs[i]; + if (![sbv isKindOfClass:[MyBaseLayout class]]) + continue; + + MyBaseLayout *sbvl = (MyBaseLayout*)sbv; + if (sbvl.notUseIntelligentBorderline) + continue; + + if (isVert) + { + sbvl.topBorderline = nil; + sbvl.bottomBorderline = nil; + } + else + { + sbvl.leadingBorderline = nil; + sbvl.trailingBorderline = nil; + } + + UIView *prevSiblingView = nil; + UIView *nextSiblingView = nil; + + if (i != 0) + { + prevSiblingView = sbs[i - 1]; + } + + if (i + 1 != sbs.count) + { + nextSiblingView = sbs[i + 1]; + } + + if (prevSiblingView != nil) + { + BOOL ok = YES; + if ([prevSiblingView isKindOfClass:[MyBaseLayout class]] && subviewSpace == 0) + { + MyBaseLayout *prevSiblingLayout = (MyBaseLayout*)prevSiblingView; + if (prevSiblingLayout.notUseIntelligentBorderline) + ok = NO; + } + + if (ok) + { + if (isVert) + sbvl.topBorderline = self.intelligentBorderline; + else + sbvl.leadingBorderline = self.intelligentBorderline; + } + } + + if (nextSiblingView != nil && (![nextSiblingView isKindOfClass:[MyBaseLayout class]] || subviewSpace != 0)) + { + if (isVert) + sbvl.bottomBorderline = self.intelligentBorderline; + else + sbvl.trailingBorderline = self.intelligentBorderline; + } + } +} + +//计算得到最大的包裹宽度 +- (CGSize)myCalcMaxWrapWidth:(NSArray *)sbs selfSize:(CGSize)selfSize paddingHorz:(CGFloat)paddingHorz lsc:(MyLinearLayout*)lsc +{ + CGFloat maxWrapWidth = 0; + if (lsc.wrapContentWidth) { for (UIView *sbv in sbs) { - if (!sbv.widthDime.isMatchParent && (sbv.leftPos.posVal == nil || sbv.rightPos.posVal == nil)) + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + //只有宽度不依赖于父视图并且没有设置左右边距则参与最大包裹宽度计算。 + if (sbvsc.widthSizeInner.dimeRelaVal.view != self && (sbvsc.leadingPosInner.posVal == nil || sbvsc.trailingPosInner.posVal == nil)) { - CGFloat vWidth = sbv.absPos.width; - if (sbv.widthDime.dimeNumVal != nil) - vWidth = sbv.widthDime.measure; + CGFloat subviewWidth = sbvmyFrame.width; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + subviewWidth = sbvsc.widthSizeInner.measure; - vWidth = [self validMeasure:sbv.widthDime sbv:sbv calcSize:vWidth sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; - - //左边 + 中间偏移+ 宽度 + 右边 - maxSubviewWidth = [self calcSelfMeasure:maxSubviewWidth - subviewMeasure:vWidth - headPos:sbv.leftPos - centerPos:sbv.centerXPos - tailPos:sbv.rightPos]; + //头部 + 中间偏移 + 宽度 + 尾部。 这里要进行计算的原因是有可能左边距或者右边距设置的是相对边距,因此这里要推导出布局视图的宽度。 + maxWrapWidth = [self myCalcSelfSize:maxWrapWidth + subviewSize:subviewWidth + headPos:sbvsc.leadingPosInner + centerPos:sbvsc.centerXPosInner + tailPos:sbvsc.trailingPosInner]; } } - selfRect.size.width = maxSubviewWidth + self.leftPadding + self.rightPadding; + selfSize.width = maxWrapWidth + paddingHorz; } - return selfRect; + return selfSize; } --(CGRect)layoutSubviewsForVert:(CGRect)selfRect sbs:(NSArray*)sbs +-(CGSize)myLayoutSubviewsForVert:(CGSize)selfSize sbs:(NSArray*)sbs lsc:(MyLinearLayout*)lsc { + CGFloat subviewSpace = lsc.subviewVSpace; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; CGFloat fixedHeight = 0; //计算固定部分的高度 - CGFloat floatingHeight = 0; //浮动的高度。 CGFloat totalWeight = 0; //剩余部分的总比重 - selfRect = [self AdjustSelfWidth:sbs selfRect:selfRect]; //调整自身的宽度 + CGFloat addSpace = 0; //用于压缩时的间距压缩增量。 + + selfSize = [self myCalcMaxWrapWidth:sbs selfSize:selfSize paddingHorz:paddingHorz lsc:lsc]; //调整自身的宽度 - NSMutableArray *fixedSbs = [NSMutableArray new]; - for (UIView *sbv in sbs) + NSMutableArray *fixedSizeSbs = [NSMutableArray new]; + CGFloat fixedSizeHeight = 0; + NSInteger fixedSpaceCount = 0; //固定间距的子视图数量。 + CGFloat fixedSpaceHeight = 0; //固定间距的子视图的宽度。 + CGFloat pos = paddingTop; + for (UIView *sbv in sbs) { - CGRect rect = sbv.absPos.frame; - - CGFloat tm = sbv.topPos.posNumVal.doubleValue; - CGFloat bm = sbv.bottomPos.posNumVal.doubleValue; - BOOL isFlexedHeight = sbv.isFlexedHeight && sbv.weight == 0; - - - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; - - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGRect rect = sbvmyFrame.frame; + + [self myCalcLeadingTrailingRect:horzGravity + selfSize:selfSize + rect_p:&rect + sbv:sbv + paddingTrailing:paddingTrailing + paddingLeading:paddingLeading + sbvsc:sbvsc + lsc:lsc]; + + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.weight == 0) + {//特殊处理高度等于wrap的情况。 + + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + } + else if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + {//特殊处理高度等于宽度的情况 + + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; + } + else if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + {//高度依赖父视图高度 + rect.size.height = [sbvsc.heightSizeInner measureWith:selfSize.height - paddingVert]; + } + else if (sbvsc.heightSizeInner.dimeNumVal != nil) + { //计算出相对高度和上下位置。 + rect.size.height = sbvsc.heightSizeInner.measure; + } + else; - if (sbv.heightDime.isMatchParent && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; - //调整子视图的宽度,如果子视图为matchParent的话 - if (sbv.widthDime.isMatchParent) - rect.size.width = (selfRect.size.width - self.leftPadding - self.rightPadding)*sbv.widthDime.mutilVal + sbv.widthDime.addVal; + //计算固定高度尺寸和浮动高度尺寸部分 - MyMarginGravity mg = MyMarginGravity_Horz_Left; - if ((self.gravity & MyMarginGravity_Vert_Mask)!= MyMarginGravity_None) - mg =self.gravity & MyMarginGravity_Vert_Mask; + if (sbvsc.topPosInner.isRelativePos) + { + totalWeight += sbvsc.topPosInner.posNumVal.doubleValue; + + fixedHeight += sbvsc.topPosInner.offsetVal; + } else { - if (sbv.centerXPos.posVal != nil) - mg = MyMarginGravity_Horz_Center; - else if (sbv.leftPos.posVal != nil && sbv.rightPos.posVal != nil) - mg = MyMarginGravity_Horz_Fill; - else if (sbv.leftPos.posVal != nil) - mg = MyMarginGravity_Horz_Left; - else if (sbv.rightPos.posVal != nil) - mg = MyMarginGravity_Horz_Right; + fixedHeight += sbvsc.topPosInner.absVal; + + if (sbvsc.topPosInner.absVal != 0) + { + fixedSpaceCount += 1; + fixedSpaceHeight += sbvsc.topPosInner.absVal; + } + } - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; - - [self horzGravity:mg selfSize:selfRect.size sbv:sbv rect:&rect]; - - - - //如果子视图需要调整高度则调整高度 - if (isFlexedHeight) - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; - - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + pos += sbvsc.topPosInner.absVal; + rect.origin.y = pos; - //计算固定高度和浮动高度。 - if ([self isRelativeMargin:tm]) + if (sbvsc.weight > 0.0) { - totalWeight += tm; - fixedHeight += sbv.topPos.offsetVal; + totalWeight += sbvsc.weight; } else - fixedHeight += sbv.topPos.margin; - - - - if ([self isRelativeMargin:bm]) { - totalWeight += bm; - fixedHeight += sbv.bottomPos.offsetVal; + fixedHeight += rect.size.height; + + //如果最小高度不为自身并且高度不是包裹的则可以进行缩小。 + if (sbvsc.heightSizeInner.lBoundValInner.dimeSelfVal == nil) + { + fixedSizeHeight += rect.size.height; + [fixedSizeSbs addObject:sbv]; + } } - else - fixedHeight += sbv.bottomPos.margin; - + + pos += rect.size.height; - if (sbv.weight > 0.0) + if (sbvsc.bottomPosInner.isRelativePos) { - totalWeight += sbv.weight; + totalWeight += sbvsc.bottomPosInner.posNumVal.doubleValue; + fixedHeight += sbvsc.bottomPosInner.offsetVal; } else { - fixedHeight += rect.size.height; - [fixedSbs addObject:sbv]; + fixedHeight += sbvsc.bottomPosInner.absVal; + + if (sbvsc.bottomPosInner.absVal != 0) + { + fixedSpaceCount += 1; + fixedSpaceHeight += sbvsc.bottomPosInner.absVal; + } + } + pos += sbvsc.bottomPosInner.absVal; + if (sbv != sbs.lastObject) - fixedHeight += self.subviewMargin; + { + fixedHeight += subviewSpace; + + pos += subviewSpace; + + if (subviewSpace != 0) + { + fixedSpaceCount += 1; + fixedSpaceHeight += subviewSpace; + } + } - sbv.absPos.frame = rect; + sbvmyFrame.frame = rect; } - //剩余的可浮动的高度,那些weight不为0的从这个高度来进行分发 - floatingHeight = selfRect.size.height - fixedHeight - self.topPadding - self.bottomPadding; - if (floatingHeight <= 0 || floatingHeight == -0.0) + //在包裹宽度且总体比重不为0时则,则需要还原最小的宽度,这样就不会使得宽度在横竖屏或者多次计算后越来越宽。 + if (lsc.wrapContentHeight && totalWeight != 0) { - if (fixedSbs.count > 0 && totalWeight != 0 && floatingHeight < 0) + CGFloat tempSelfHeight = paddingVert; + if (sbs.count > 1) + tempSelfHeight += (sbs.count - 1) * subviewSpace; + + selfSize.height = [self myValidMeasure:lsc.heightSizeInner sbv:self calcSize:tempSelfHeight sbvSize:selfSize selfLayoutSize:self.superview.bounds.size]; + + } + + //这里需要特殊处理当子视图的尺寸高度大于布局视图的高度的情况。 + + BOOL isWeightShrinkSpace = NO; //是否按比重缩小间距。 + CGFloat weightShrinkSpaceTotalHeight = 0; + CGFloat floatingHeight = selfSize.height - fixedHeight - paddingVert; //剩余的可浮动的高度,那些weight不为0的从这个高度来进行分发 + //取出shrinkType中的模式和内容类型: + MySubviewsShrinkType sstMode = lsc.shrinkType & 0x0F; //压缩的模式 + MySubviewsShrinkType sstContent = lsc.shrinkType & 0xF0; //压缩内容 + if (_myCGFloatLessOrEqual(floatingHeight, 0)) + { + if (sstMode != MySubviewsShrink_None) { - CGFloat averageHeight = floatingHeight / fixedSbs.count; - for (UIView *fsbv in fixedSbs) - { - fsbv.absPos.height += averageHeight; + if (sstContent == MySubviewsShrink_Size) + {//压缩尺寸 + if (fixedSizeSbs.count > 0 && totalWeight != 0 && floatingHeight < 0 && selfSize.height > 0) + { + if (sstMode == MySubviewsShrink_Average) + {//均分。 + CGFloat averageHeight = floatingHeight / fixedSizeSbs.count; + + for (UIView *fsbv in fixedSizeSbs) + { + fsbv.myFrame.height += averageHeight; + } + } + else if (_myCGFloatNotEqual(fixedSizeHeight, 0)) + {//按比例分配。 + for (UIView *fsbv in fixedSizeSbs) + { + fsbv.myFrame.height += floatingHeight * (fsbv.myFrame.height / fixedSizeHeight); + } + + } + } + } + else if (sstContent == MySubviewsShrink_Space) + {//压缩间距 + if (fixedSpaceCount > 0 && floatingHeight < 0 && selfSize.height > 0 && fixedSpaceHeight > 0) + { + if (sstMode == MySubviewsShrink_Average) + { + addSpace = floatingHeight / fixedSpaceCount; + } + else if (sstMode == MySubviewsShrink_Weight) + { + isWeightShrinkSpace = YES; + weightShrinkSpaceTotalHeight = floatingHeight; + } + } } + else + { + ; + } + } floatingHeight = 0; } - CGFloat pos = self.topPadding; - for (UIView *sbv in sbs) { - - - CGFloat topMargin = sbv.topPos.posNumVal.doubleValue; - CGFloat bottomMargin = sbv.bottomPos.posNumVal.doubleValue; - CGFloat weight = sbv.weight; - CGRect rect = sbv.absPos.frame; - - //分别处理相对顶部边距和绝对顶部边距 - if ([self isRelativeMargin:topMargin]) - { - CGFloat th = (topMargin / totalWeight) * floatingHeight; - if (th <= 0 || th == -0.0) - th = 0; + //如果有浮动尺寸或者有压缩模式 + if (totalWeight != 0 || (sstMode != MySubviewsShrink_None && _myCGFloatLessOrEqual(floatingHeight, 0))) + { + pos = paddingTop; + for (UIView *sbv in sbs) { - pos += [self validMargin:sbv.topPos sbv:sbv calcPos:th + sbv.topPos.offsetVal selfLayoutSize:selfRect.size]; - } - else - pos += [self validMargin:sbv.topPos sbv:sbv calcPos:topMargin + sbv.topPos.offsetVal selfLayoutSize:selfRect.size]; - - //分别处理相对高度和绝对高度 - if (weight > 0) - { - CGFloat h = (weight / totalWeight) * floatingHeight; - if (h <= 0 || h == -0.0) - h = 0; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat topSpace = sbvsc.topPosInner.posNumVal.doubleValue; + CGFloat bottomSpace = sbvsc.bottomPosInner.posNumVal.doubleValue; + CGFloat weight = sbvsc.weight; + CGRect rect = sbvmyFrame.frame; + + //分别处理相对顶部间距和绝对顶部间距 + if ([self myIsRelativePos:topSpace]) + { + topSpace = (topSpace / totalWeight) * floatingHeight; + if (_myCGFloatLessOrEqual(topSpace, 0)) + topSpace = 0; + } + else + { + if (topSpace + sbvsc.topPosInner.offsetVal != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalHeight * (topSpace + sbvsc.topPosInner.offsetVal) / fixedSpaceHeight; + } + } + + } + + pos += [self myValidMargin:sbvsc.topPosInner sbv:sbv calcPos:topSpace + sbvsc.topPosInner.offsetVal selfLayoutSize:selfSize]; rect.origin.y = pos; - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:h sbvSize:rect.size selfLayoutSize:selfRect.size]; - } - else - { - rect.origin.y = pos; - } - - pos += rect.size.height; - - //分别处理相对底部边距和绝对底部边距 - if ([self isRelativeMargin:bottomMargin]) - { - CGFloat bh = (bottomMargin / totalWeight) * floatingHeight; - if (bh <= 0 || bh == -0.0) - bh = 0; - pos += [self validMargin:sbv.bottomPos sbv:sbv calcPos:bh + sbv.bottomPos.offsetVal selfLayoutSize:selfRect.size]; + //分别处理相对高度和绝对高度 + if (weight > 0) + { + CGFloat h = (weight / totalWeight) * floatingHeight; + if (_myCGFloatLessOrEqual(h, 0)) + h = 0; + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:h sbvSize:rect.size selfLayoutSize:selfSize]; + } + + pos += rect.size.height; + //分别处理相对底部间距和绝对底部间距 + if ([self myIsRelativePos:bottomSpace]) + { + bottomSpace = (bottomSpace / totalWeight) * floatingHeight; + if ( _myCGFloatLessOrEqual(bottomSpace, 0)) + bottomSpace = 0; + + } + else + { + if (bottomSpace + sbvsc.bottomPosInner.offsetVal != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalHeight * (bottomSpace + sbvsc.bottomPosInner.offsetVal) / fixedSpaceHeight; + } + } + + } + + pos += [self myValidMargin:sbvsc.bottomPosInner sbv:sbv calcPos:bottomSpace + sbvsc.bottomPosInner.offsetVal selfLayoutSize:selfSize]; + + //添加共有的子视图间距 + if (sbv != sbs.lastObject) + { + pos += subviewSpace; + + if (subviewSpace != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalHeight * subviewSpace / fixedSpaceHeight; + } + } + + } + + sbvmyFrame.frame = rect; } - else - pos += [self validMargin:sbv.bottomPos sbv:sbv calcPos:bottomMargin + sbv.bottomPos.offsetVal selfLayoutSize:selfRect.size]; - if (sbv != sbs.lastObject) - pos += self.subviewMargin; - - sbv.absPos.frame = rect; } - pos += self.bottomPadding; - - - if (self.wrapContentHeight && totalWeight == 0) + pos += paddingBottom; + + if (lsc.wrapContentHeight) { - selfRect.size.height = pos; + selfSize.height = pos; } - return selfRect; + return selfSize; } --(CGRect)layoutSubviewsForHorz:(CGRect)selfRect sbs:(NSArray*)sbs +-(CGSize)myLayoutSubviewsForHorz:(CGSize)selfSize sbs:(NSArray*)sbs lsc:(MyLinearLayout*)lsc { - + + CGFloat subviewSpace = lsc.subviewHSpace; + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + CGFloat fixedWidth = 0; //计算固定部分的高度 CGFloat floatingWidth = 0; //浮动的高度。 CGFloat totalWeight = 0; CGFloat maxSubviewHeight = 0; - + CGFloat addSpace = 0; //用于压缩时的间距压缩增量。 + //计算出固定的子视图宽度的总和以及宽度比例总和 - NSMutableArray *fixedSbs = [NSMutableArray new]; + NSMutableArray *fixedSizeSbs = [NSMutableArray new]; + NSMutableArray *flexedSizeSbs = [NSMutableArray new]; + CGFloat fixedSizeWidth = 0; //固定尺寸的宽度 + NSInteger fixedSpaceCount = 0; //固定间距的子视图数量。 + CGFloat fixedSpaceWidth = 0; //固定间距的子视图的宽度。 for (UIView *sbv in sbs) { - - if ([self isRelativeMargin:sbv.leftPos.posNumVal.doubleValue]) + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (sbvsc.leadingPosInner.isRelativePos) { - totalWeight += sbv.leftPos.posNumVal.doubleValue; - fixedWidth += sbv.leftPos.offsetVal; + totalWeight += sbvsc.leadingPosInner.posNumVal.doubleValue; + fixedWidth += sbvsc.leadingPosInner.offsetVal; } else - fixedWidth += sbv.leftPos.margin; + { + fixedWidth += sbvsc.leadingPosInner.absVal; + if (sbvsc.leadingPosInner.absVal != 0) + { + fixedSpaceCount += 1; + fixedSpaceWidth += sbvsc.leadingPosInner.absVal; + } + } - if ([self isRelativeMargin:sbv.rightPos.posNumVal.doubleValue]) + if (sbvsc.trailingPosInner.isRelativePos) { - totalWeight += sbv.rightPos.posNumVal.doubleValue; - fixedWidth += sbv.rightPos.offsetVal; + totalWeight += sbvsc.trailingPosInner.posNumVal.doubleValue; + fixedWidth += sbvsc.trailingPosInner.offsetVal; } else - fixedWidth += sbv.rightPos.margin; + { + fixedWidth += sbvsc.trailingPosInner.absVal; + if (sbvsc.trailingPosInner.absVal != 0) + { + fixedSpaceCount += 1; + fixedSpaceWidth += sbvsc.trailingPosInner.absVal; + } + + } - if (sbv.weight > 0.0) + if (sbvsc.weight > 0.0) { - totalWeight += sbv.weight; + totalWeight += sbvsc.weight; } else { - CGFloat vWidth = sbv.absPos.width; - if (sbv.widthDime.dimeNumVal != nil) - vWidth = sbv.widthDime.measure; + CGFloat vWidth = sbvmyFrame.width; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + vWidth = sbvsc.widthSizeInner.measure; - if (sbv.widthDime.isMatchParent) - vWidth = (selfRect.size.width - self.leftPadding - self.rightPadding)*sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + vWidth = [sbvsc.widthSizeInner measureWith:selfSize.width - paddingHorz]; - fixedWidth += [self validMeasure:sbv.widthDime sbv:sbv calcSize:vWidth sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; - [fixedSbs addObject:sbv]; + vWidth = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:vWidth sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + sbvmyFrame.width = vWidth; + fixedWidth += vWidth; + + //如果最小宽度不为自身并且宽度不是包裹的则可以进行缩小。 + if (sbvsc.widthSizeInner.lBoundValInner.dimeSelfVal == nil) + { + fixedSizeWidth += vWidth; + [fixedSizeSbs addObject:sbv]; + } + + if (sbvsc.widthSizeInner.dimeSelfVal != nil) + { + [flexedSizeSbs addObject:sbv]; + } } if (sbv != sbs.lastObject) - fixedWidth += self.subviewMargin; + { + fixedWidth += subviewSpace; + if (subviewSpace != 0) + { + fixedSpaceCount += 1; + fixedSpaceWidth += subviewSpace; + } + } + } + + //在包裹宽度且总体比重不为0时则,则需要还原最小的宽度,这样就不会使得宽度在横竖屏或者多次计算后越来越宽。 + if (lsc.wrapContentWidth && totalWeight != 0) + { + CGFloat tempSelfWidth = paddingHorz; + if (sbs.count > 1) + tempSelfWidth += (sbs.count - 1) * subviewSpace; + + selfSize.width = [self myValidMeasure:lsc.widthSizeInner sbv:self calcSize:tempSelfWidth sbvSize:selfSize selfLayoutSize:self.superview.bounds.size]; + } //剩余的可浮动的宽度,那些weight不为0的从这个高度来进行分发 - floatingWidth = selfRect.size.width - fixedWidth - self.leftPadding - self.rightPadding; - if (floatingWidth <= 0 || floatingWidth == -0.0) + BOOL isWeightShrinkSpace = NO; //是否按比重缩小间距。。。 + CGFloat weightShrinkSpaceTotalWidth = 0; + floatingWidth = selfSize.width - fixedWidth - paddingHorz; + if (_myCGFloatLessOrEqual(floatingWidth, 0)) { - if (fixedSbs.count > 0 && totalWeight != 0 && floatingWidth < 0) + //取出shrinkType中的模式和内容类型: + MySubviewsShrinkType sstMode = lsc.shrinkType & 0x0F; //压缩的模式 + MySubviewsShrinkType sstContent = lsc.shrinkType & 0xF0; //压缩内容 + //如果压缩方式为自动,但是浮动宽度子视图数量不为2则压缩类型无效。 + if (sstMode == MySubviewsShrink_Auto && flexedSizeSbs.count != 2) + sstMode = MySubviewsShrink_None; + + if (sstMode != MySubviewsShrink_None) { - CGFloat averageWidth = floatingWidth / fixedSbs.count; - for (UIView *fsbv in fixedSbs) + if (sstContent == MySubviewsShrink_Size) { - fsbv.absPos.width += averageWidth; + if (fixedSizeSbs.count > 0 && totalWeight != 0 && floatingWidth < 0 && selfSize.width > 0) + { + //均分。 + if (sstMode == MySubviewsShrink_Average) + { + CGFloat averageWidth = floatingWidth / fixedSizeSbs.count; + + for (UIView *fsbv in fixedSizeSbs) + { + fsbv.myFrame.width += averageWidth; + + } + } + else if (sstMode == MySubviewsShrink_Auto) + { + + UIView *leadingView = flexedSizeSbs[0]; + UIView *trailingView = flexedSizeSbs[1]; + + CGFloat leadingWidth = leadingView.myFrame.width; + CGFloat trailingWidth = trailingView.myFrame.width; + + //如果2个都超过一半则总是一半显示。 + //如果1个超过了一半则 如果两个没有超过总宽度则正常显示,如果超过了总宽度则超过一半的视图的宽度等于总宽度减去未超过一半的视图的宽度。 + //如果没有一个超过一半。则正常显示 + CGFloat layoutWidth = floatingWidth + leadingWidth + trailingWidth; + CGFloat halfLayoutWidth = layoutWidth / 2; + + if (leadingWidth > halfLayoutWidth && trailingWidth > halfLayoutWidth) + { + leadingView.myFrame.width = halfLayoutWidth; + trailingView.myFrame.width = halfLayoutWidth; + } + else if ((leadingWidth > halfLayoutWidth || trailingWidth > halfLayoutWidth) && (leadingWidth + trailingWidth > layoutWidth)) + { + + if (leadingWidth > halfLayoutWidth) + { + trailingView.myFrame.width = trailingWidth; + leadingView.myFrame.width = layoutWidth - trailingWidth; + } + else + { + leadingView.myFrame.width = leadingWidth; + trailingView.myFrame.width = layoutWidth - leadingWidth; + } + + } + else ; + + + } + else if (_myCGFloatNotEqual(fixedSizeWidth, 0)) + {//按比例分配。 + for (UIView *fsbv in fixedSizeSbs) + { + fsbv.myFrame.width += floatingWidth * (fsbv.myFrame.width / fixedSizeWidth); + } + + } + } + } + else if (sstContent == MySubviewsShrink_Space) + { + if (fixedSpaceCount > 0 && floatingWidth < 0 && selfSize.width > 0 && fixedSpaceWidth > 0) + { + if (sstMode == MySubviewsShrink_Average) + { + addSpace = floatingWidth / fixedSpaceCount; + } + else if (sstMode == MySubviewsShrink_Weight) + { + isWeightShrinkSpace = YES; + weightShrinkSpaceTotalWidth = floatingWidth; + } + } } + else + { + ; + } + } + floatingWidth = 0; } //调整所有子视图的宽度 - CGFloat pos = self.leftPadding; + CGFloat pos = paddingLeading; for (UIView *sbv in sbs) { - CGFloat leftMargin = sbv.leftPos.posNumVal.doubleValue; - CGFloat rightMargin = sbv.rightPos.posNumVal.doubleValue; - CGFloat weight = sbv.weight; - BOOL isFlexedHeight = sbv.isFlexedHeight && !sbv.heightDime.isMatchParent; - CGRect rect = sbv.absPos.frame; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGFloat leadingSpace = sbvsc.leadingPosInner.posNumVal.doubleValue; + CGFloat trailingSpace = sbvsc.trailingPosInner.posNumVal.doubleValue; + CGFloat weight = sbvsc.weight; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + CGRect rect = sbvmyFrame.frame; - if (sbv.widthDime.isMatchParent) - rect.size.width= (selfRect.size.width - self.leftPadding - self.rightPadding)*sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.heightDime.isMatchParent) - rect.size.height= (selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + rect.size.height= [sbvsc.heightSizeInner measureWith:selfSize.height - paddingVert]; //计算出先对左边边距和绝对左边边距 - if ([self isRelativeMargin:leftMargin]) + if ([self myIsRelativePos:leadingSpace]) { - CGFloat lw = (leftMargin / totalWeight) * floatingWidth; - if (lw <= 0 || lw == -0.0) - lw = 0; + leadingSpace = (leadingSpace / totalWeight) * floatingWidth; + if (_myCGFloatLessOrEqual(leadingSpace, 0)) + leadingSpace = 0; - pos += [self validMargin:sbv.leftPos sbv:sbv calcPos:lw + sbv.leftPos.offsetVal selfLayoutSize:selfRect.size]; } else - pos += [self validMargin:sbv.leftPos sbv:sbv calcPos:leftMargin + sbv.leftPos.offsetVal selfLayoutSize:selfRect.size]; + { + if (leadingSpace + sbvsc.leadingPosInner.offsetVal != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalWidth * (leadingSpace + sbvsc.leadingPosInner.offsetVal) / fixedSpaceWidth; + } + } + + } + + pos += [self myValidMargin:sbvsc.leadingPosInner sbv:sbv calcPos:leadingSpace + sbvsc.leadingPosInner.offsetVal selfLayoutSize:selfSize]; + + rect.origin.x = pos; + - //计算出相对宽度和绝对宽度 if (weight > 0) { CGFloat w = (weight / totalWeight) * floatingWidth; - if (w <= 0 || w == -0.0) + if (_myCGFloatLessOrEqual(w, 0)) w = 0; - rect.origin.x = pos; rect.size.width = w; } + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + + pos += rect.size.width; + + //计算相对的右边边距和绝对的右边边距 + if ([self myIsRelativePos:trailingSpace]) + { + trailingSpace = (trailingSpace / totalWeight) * floatingWidth; + if (_myCGFloatLessOrEqual(trailingSpace, 0)) + trailingSpace = 0; + } else { - rect.origin.x = pos; + if (trailingSpace + sbvsc.trailingPosInner.offsetVal != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalWidth * (trailingSpace + sbvsc.trailingPosInner.offsetVal) / fixedSpaceWidth; + } + } } - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + pos += [self myValidMargin:sbvsc.trailingPosInner sbv:sbv calcPos:trailingSpace + sbvsc.trailingPosInner.offsetVal selfLayoutSize:selfSize]; - pos += rect.size.width; - //计算相对的右边边距和绝对的右边边距 - if ([self isRelativeMargin:rightMargin]) + if (sbv != sbs.lastObject) { - CGFloat rw = (rightMargin / totalWeight) * floatingWidth; - if (rw <= 0 || rw == -0.0) - rw = 0; - - pos += [self validMargin:sbv.rightPos sbv:sbv calcPos:rw + sbv.rightPos.offsetVal selfLayoutSize:selfRect.size]; + pos += subviewSpace; + if (subviewSpace != 0) + { + pos += addSpace; + + if (isWeightShrinkSpace) + { + pos += weightShrinkSpaceTotalWidth * subviewSpace / fixedSpaceWidth; + } + } } - else - pos += [self validMargin:sbv.rightPos sbv:sbv calcPos:rightMargin + sbv.rightPos.offsetVal selfLayoutSize:selfRect.size]; - if (sbv != sbs.lastObject) - pos += self.subviewMargin; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width ]; + //如果高度是浮动的则需要调整高度。 - if (isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.heightSizeInner.dimeRelaVal.view != self) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; } - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; //计算最高的高度。 - if (self.wrapContentHeight && !sbv.heightDime.isMatchParent && (sbv.topPos.posVal == nil || sbv.bottomPos.posVal == nil)) + if (lsc.wrapContentHeight) { - maxSubviewHeight = [self calcSelfMeasure:maxSubviewHeight subviewMeasure:rect.size.height headPos:sbv.topPos centerPos:sbv.centerYPos tailPos:sbv.bottomPos]; - + if (sbvsc.heightSizeInner.dimeRelaVal.view != self && (sbvsc.topPosInner.posVal == nil || sbvsc.bottomPosInner.posVal == nil)) + { + maxSubviewHeight = [self myCalcSelfSize:maxSubviewHeight subviewSize:rect.size.height headPos:sbvsc.topPosInner centerPos:sbvsc.centerYPosInner tailPos:sbvsc.bottomPosInner]; + } + } + else + { + [self myCalcSubviewTopBottomRect:vertGravity + selfSize:selfSize + rect_p:&rect + sbv:sbv + paddingBottom:paddingBottom + paddingTop:paddingTop + sbvsc:sbvsc + lsc:lsc]; + } - sbv.absPos.frame = rect; + sbvmyFrame.frame = rect; } - if (self.wrapContentHeight) + pos += paddingTrailing; + + if (lsc.wrapContentWidth) { - selfRect.size.height = maxSubviewHeight + self.topPadding + self.bottomPadding; + selfSize.width = pos; } - - //调整所有子视图的高度 - for (UIView *sbv in sbs) + //调整所有子视图的高度。 + if (lsc.wrapContentHeight) { + selfSize.height = maxSubviewHeight + paddingVert; - CGRect rect = sbv.absPos.frame; - - //计算高度 - if (sbv.heightDime.isMatchParent) - { - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:(selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal sbvSize:rect.size selfLayoutSize:selfRect.size]; - } - - //优先以容器中的指定为标准 - MyMarginGravity mg = MyMarginGravity_Vert_Top; - if ((self.gravity & MyMarginGravity_Horz_Mask)!= MyMarginGravity_None) - mg =self.gravity & MyMarginGravity_Horz_Mask; - else + for (UIView *sbv in sbs) { - if (sbv.centerYPos.posVal != nil) - mg = MyMarginGravity_Vert_Center; - else if (sbv.topPos.posVal != nil && sbv.bottomPos.posVal != nil) - mg = MyMarginGravity_Vert_Fill; - else if (sbv.topPos.posVal != nil) - mg = MyMarginGravity_Vert_Top; - else if (sbv.bottomPos.posVal != nil) - mg = MyMarginGravity_Vert_Bottom; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGRect rect = sbvmyFrame.frame; + + [self myCalcSubviewTopBottomRect:vertGravity + selfSize:selfSize + rect_p:&rect + sbv:sbv + paddingBottom:paddingBottom + paddingTop:paddingTop + sbvsc:sbvsc + lsc:lsc]; + + sbvmyFrame.frame = rect; + } - - [self vertGravity:mg selfSize:selfRect.size sbv:sbv rect:&rect]; - - sbv.absPos.frame = rect; - } - - pos += self.rightPadding; - - if (self.wrapContentWidth && totalWeight == 0) - { - selfRect.size.width = pos; + } - return selfRect; + + return selfSize; } --(CGRect)layoutSubviewsForVertGravity:(CGRect)selfRect sbs:(NSArray*)sbs + +-(CGSize)myLayoutSubviewsForVertGravity:(CGSize)selfSize sbs:(NSArray*)sbs lsc:(MyLinearLayout*)lsc { + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + CGFloat subviewSpace = lsc.subviewVSpace; + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + CGFloat totalHeight = 0; if (sbs.count > 1) - totalHeight += (sbs.count - 1) * self.subviewMargin; + totalHeight += (sbs.count - 1) * subviewSpace; - selfRect = [self AdjustSelfWidth:sbs selfRect:selfRect]; + selfSize = [self myCalcMaxWrapWidth:sbs selfSize:selfSize paddingHorz:paddingHorz lsc:lsc]; - CGFloat floatingHeight = selfRect.size.height - self.topPadding - self.bottomPadding - totalHeight; - if (floatingHeight <=0) + CGFloat floatingHeight = selfSize.height - paddingVert - totalHeight; + if (_myCGFloatLessOrEqual(floatingHeight, 0)) floatingHeight = 0; //调整子视图的宽度。并根据情况调整子视图的高度。并计算出固定高度和浮动高度。 + NSMutableSet *noWrapsbsSet = [NSMutableSet new]; for (UIView *sbv in sbs) { - - CGRect rect = sbv.absPos.frame; - BOOL isFlexedHeight = sbv.isFlexedHeight && sbv.weight == 0; - - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; - - if (sbv.heightDime.isMatchParent && !self.wrapContentHeight) - rect.size.height = (selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal; - - //调整子视图的宽度,如果子视图为matchParent的话 - if (sbv.widthDime.isMatchParent) + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + BOOL canAddToNoWrapSbs = YES; + CGRect rect = sbvmyFrame.frame; + + [self myCalcLeadingTrailingRect:horzGravity + selfSize:selfSize + rect_p:&rect + sbv:sbv + paddingTrailing:paddingTrailing + paddingLeading:paddingLeading + sbvsc:sbvsc + lsc:lsc]; + + + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; + + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) { - rect.size.width = (selfRect.size.width - self.leftPadding - self.rightPadding)*sbv.widthDime.mutilVal + sbv.widthDime.addVal; + rect.size.height = [sbvsc.heightSizeInner measureWith:selfSize.height - paddingVert]; + canAddToNoWrapSbs = NO; } - //优先以容器中的对齐方式为标准,否则以自己的停靠方式为标准 - MyMarginGravity mg = MyMarginGravity_Horz_Left; - if ((self.gravity & MyMarginGravity_Vert_Mask)!= MyMarginGravity_None) - mg =self.gravity & MyMarginGravity_Vert_Mask; - else + //高度等于宽度的情况。 + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) { - if (sbv.centerXPos.posVal != nil) - mg = MyMarginGravity_Horz_Center; - else if (sbv.leftPos.posVal != nil && sbv.rightPos.posVal != nil) - mg = MyMarginGravity_Horz_Fill; - else if (sbv.leftPos.posVal != nil) - mg = MyMarginGravity_Horz_Left; - else if (sbv.rightPos.posVal != nil) - mg = MyMarginGravity_Horz_Right; + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; } - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; - - - [self horzGravity:mg selfSize:selfRect.size sbv:sbv rect:&rect]; - - //如果子视图需要调整高度则调整高度 - if (isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.weight == 0) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + canAddToNoWrapSbs = NO; } - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + //如果子视图的最小高度就是自身则也不进行扩展。 + if (sbvsc.heightSizeInner.lBoundValInner.dimeSelfVal != nil) + { + canAddToNoWrapSbs = NO; + } + - totalHeight += [self validMargin:sbv.topPos sbv:sbv calcPos:[sbv.topPos realMarginInSize:floatingHeight] selfLayoutSize:selfRect.size]; + totalHeight += [self myValidMargin:sbvsc.topPosInner sbv:sbv calcPos:[sbvsc.topPosInner realPosIn:floatingHeight] selfLayoutSize:selfSize]; totalHeight += rect.size.height; - totalHeight += [self validMargin:sbv.bottomPos sbv:sbv calcPos:[sbv.bottomPos realMarginInSize:floatingHeight] selfLayoutSize:selfRect.size]; + totalHeight += [self myValidMargin:sbvsc.bottomPosInner sbv:sbv calcPos:[sbvsc.bottomPosInner realPosIn:floatingHeight] selfLayoutSize:selfSize]; + + sbvmyFrame.frame = rect; + + //如果子布局视图是wrap属性则不进行扩展。 + if (vertGravity == MyGravity_Vert_Fill && [sbv isKindOfClass:[MyBaseLayout class]]) + { + if (sbvsc.wrapContentHeight) + { + canAddToNoWrapSbs = NO; + } + } + + if (canAddToNoWrapSbs) + [noWrapsbsSet addObject:sbv]; - sbv.absPos.frame = rect; } //根据对齐的方位来定位子视图的布局对齐 - CGFloat pos = 0; - if ((self.gravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Top) + CGFloat pos = 0; //位置偏移 + CGFloat between = 0; //间距扩充 + CGFloat fill = 0; //尺寸扩充 + if (vertGravity == MyGravity_Vert_Top) { - pos = self.topPadding; + pos = paddingTop; } - else if ((self.gravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Center) + else if (vertGravity == MyGravity_Vert_Center) { - pos = (selfRect.size.height - totalHeight - self.bottomPadding - self.topPadding)/2.0; - pos += self.topPadding; + pos = (selfSize.height - totalHeight - paddingVert)/2.0 + paddingTop; } - else if ((self.gravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Window_Center) + else if (vertGravity == MyGravity_Vert_Window_Center) { if (self.window != nil) { - pos = (self.window.frame.size.height - totalHeight)/2.0; + pos = (CGRectGetHeight(self.window.bounds) - totalHeight)/2.0; CGPoint pt = CGPointMake(0, pos); pos = [self.window convertPoint:pt toView:self].y; @@ -713,498 +1284,364 @@ -(CGRect)layoutSubviewsForVertGravity:(CGRect)selfRect sbs:(NSArray*)sbs } } + else if (vertGravity == MyGravity_Vert_Bottom) + { + pos = selfSize.height - totalHeight - paddingBottom; + } + else if (vertGravity == MyGravity_Vert_Between) + { + pos = paddingTop; + + if (sbs.count > 1) + between = (selfSize.height - totalHeight - paddingVert) / (sbs.count - 1); + } + else if (vertGravity == MyGravity_Vert_Fill) + { + pos = paddingTop; + if (noWrapsbsSet.count > 0) + fill = (selfSize.height - totalHeight - paddingVert) / noWrapsbsSet.count; + } else { - pos = selfRect.size.height - totalHeight - self.bottomPadding; + pos = paddingTop; } + for (UIView *sbv in sbs) { - pos += [self validMargin:sbv.topPos sbv:sbv calcPos:[sbv.topPos realMarginInSize:floatingHeight] selfLayoutSize:selfRect.size]; - sbv.absPos.topPos = pos; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + pos += [self myValidMargin:sbvsc.topPosInner sbv:sbv calcPos:[sbvsc.topPosInner realPosIn:floatingHeight] selfLayoutSize:selfSize]; - pos += sbv.absPos.height; + sbvmyFrame.top = pos; + + //加上扩充的宽度。 + if (fill != 0 && [noWrapsbsSet containsObject:sbv]) + sbvmyFrame.height += fill; + + pos += sbvmyFrame.height; - pos += [self validMargin:sbv.bottomPos sbv:sbv calcPos:[sbv.bottomPos realMarginInSize:floatingHeight] selfLayoutSize:selfRect.size]; + + pos += [self myValidMargin:sbvsc.bottomPosInner sbv:sbv calcPos:[sbvsc.bottomPosInner realPosIn:floatingHeight] selfLayoutSize:selfSize]; if (sbv != sbs.lastObject) - pos += self.subviewMargin; + pos += subviewSpace; + + pos += between; //只有mgvert为between才加这个间距拉伸。 } - return selfRect; + return selfSize; } --(CGRect)layoutSubviewsForHorzGravity:(CGRect)selfRect sbs:(NSArray*)sbs + + +-(CGSize)myLayoutSubviewsForHorzGravity:(CGSize)selfSize sbs:(NSArray*)sbs lsc:(MyLinearLayout*)lsc { + CGFloat paddingTop = lsc.topPadding; + CGFloat paddingBottom = lsc.bottomPadding; + CGFloat paddingLeading = lsc.leadingPadding; + CGFloat paddingTrailing = lsc.trailingPadding; + CGFloat paddingHorz = paddingLeading + paddingTrailing; + CGFloat paddingVert = paddingTop + paddingBottom; + CGFloat subviewSpace = lsc.subviewHSpace; + MyGravity vertGravity = lsc.gravity & MyGravity_Horz_Mask; + MyGravity horzGravity = [self myConvertLeftRightGravityToLeadingTrailing:lsc.gravity & MyGravity_Vert_Mask]; + CGFloat totalWidth = 0; if (sbs.count > 1) - totalWidth += (sbs.count - 1) * self.subviewMargin; + totalWidth += (sbs.count - 1) * subviewSpace; CGFloat floatingWidth = 0; - CGFloat maxSubviewHeight = 0; - floatingWidth = selfRect.size.width - self.leftPadding - self.rightPadding - totalWidth; - if (floatingWidth <= 0) + floatingWidth = selfSize.width - paddingHorz - totalWidth; + if (_myCGFloatLessOrEqual(floatingWidth, 0)) floatingWidth = 0; //计算出固定的高度 + NSMutableSet *noWrapsbsSet = [NSMutableSet new]; for (UIView *sbv in sbs) { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + BOOL canAddToNoWrapSbs = YES; + CGRect rect = sbvmyFrame.frame; - CGRect rect = sbv.absPos.frame; - BOOL isFlexedHeight = sbv.isFlexedHeight && !sbv.heightDime.isMatchParent; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; - if (sbv.widthDime.dimeNumVal != nil) - rect.size.width = sbv.widthDime.measure; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + { + rect.size.width= [sbvsc.widthSizeInner measureWith:selfSize.width - paddingHorz]; + canAddToNoWrapSbs = NO; + } - if (sbv.heightDime.dimeNumVal != nil) - rect.size.height = sbv.heightDime.measure; + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + rect.size.height= [sbvsc.heightSizeInner measureWith:selfSize.height - paddingVert]; - if (sbv.widthDime.isMatchParent) - rect.size.width= (selfRect.size.width - self.leftPadding - self.rightPadding)*sbv.widthDime.mutilVal + sbv.widthDime.addVal; + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height]; - if (sbv.heightDime.isMatchParent) - rect.size.height= (selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal; - - rect.size.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + //如果最小宽度不能被缩小则不加入。 + if (sbvsc.widthSizeInner.lBoundValInner.dimeSelfVal != nil) + { + canAddToNoWrapSbs = NO; + } + + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; //如果高度是浮动的则需要调整高度。 - if (isFlexedHeight) + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && sbvsc.heightSizeInner.dimeRelaVal.view != self) { - rect.size.height = [self heightFromFlexedHeightView:sbv inWidth:rect.size.width]; + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; } - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfRect.size]; + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; //计算以子视图为大小的情况 - if (self.wrapContentHeight && !sbv.heightDime.isMatchParent && (sbv.topPos.posVal == nil || sbv.bottomPos.posVal == nil)) + if (lsc.wrapContentHeight && sbvsc.heightSizeInner.dimeRelaVal.view != self && (sbvsc.topPosInner.posVal == nil || sbvsc.bottomPosInner.posVal == nil)) { - maxSubviewHeight = [self calcSelfMeasure:maxSubviewHeight subviewMeasure:rect.size.height headPos:sbv.topPos centerPos:sbv.centerYPos tailPos:sbv.bottomPos]; + maxSubviewHeight = [self myCalcSelfSize:maxSubviewHeight subviewSize:rect.size.height headPos:sbvsc.topPosInner centerPos:sbvsc.centerYPosInner tailPos:sbvsc.bottomPosInner]; } - - totalWidth += [self validMargin:sbv.leftPos sbv:sbv calcPos:[sbv.leftPos realMarginInSize:floatingWidth] selfLayoutSize:selfRect.size]; + + totalWidth += [self myValidMargin:sbvsc.leadingPosInner sbv:sbv calcPos:[sbvsc.leadingPosInner realPosIn:floatingWidth] selfLayoutSize:selfSize]; totalWidth += rect.size.width; - totalWidth += [self validMargin:sbv.rightPos sbv:sbv calcPos:[sbv.rightPos realMarginInSize:floatingWidth] selfLayoutSize:selfRect.size]; + + totalWidth += [self myValidMargin:sbvsc.trailingPosInner sbv:sbv calcPos:[sbvsc.trailingPosInner realPosIn:floatingWidth] selfLayoutSize:selfSize]; + + sbvmyFrame.frame = rect; + + //如果子视图是包裹属性则也不加入。 + if (horzGravity == MyGravity_Horz_Fill && [sbv isKindOfClass:[MyBaseLayout class]]) + { + if (sbvsc.wrapContentWidth) + { + canAddToNoWrapSbs = NO; + } + } - sbv.absPos.frame = rect; + if (canAddToNoWrapSbs) + [noWrapsbsSet addObject:sbv]; + } //调整自己的高度。 - if (self.wrapContentHeight) + if (lsc.wrapContentHeight) { - selfRect.size.height = maxSubviewHeight + self.topPadding + self.bottomPadding; + selfSize.height = maxSubviewHeight + paddingVert; } //根据对齐的方位来定位子视图的布局对齐 CGFloat pos = 0; - if ((self.gravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Left) + CGFloat between = 0; + CGFloat fill = 0; + + if (horzGravity == MyGravity_Horz_Leading) { - pos = self.leftPadding; + pos = paddingLeading; } - else if ((self.gravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Center) + else if (horzGravity == MyGravity_Horz_Center) { - pos = (selfRect.size.width - totalWidth - self.leftPadding - self.rightPadding)/2.0; - pos += self.leftPadding; + pos = (selfSize.width - totalWidth - paddingHorz)/2.0; + pos += paddingLeading; } - else if ((self.gravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Window_Center) + else if (horzGravity == MyGravity_Horz_Window_Center) { if (self.window != nil) { - pos = (self.window.frame.size.width - totalWidth)/2.0; + pos = (CGRectGetWidth(self.window.bounds) - totalWidth)/2.0; CGPoint pt = CGPointMake(pos, 0); pos = [self.window convertPoint:pt toView:self].x; + + //特殊处理窗口水平居中的场景。 + if ([MyBaseLayout isRTL]) + { + pos += (selfSize.width - CGRectGetWidth(self.window.bounds)); + } + } } + else if (horzGravity == MyGravity_Horz_Trailing) + { + pos = selfSize.width - totalWidth - paddingTrailing; + } + else if (horzGravity == MyGravity_Horz_Between) + { + pos = paddingLeading; + + if (sbs.count > 1) + between = (selfSize.width - totalWidth - paddingHorz) / (sbs.count - 1); + } + else if (horzGravity == MyGravity_Horz_Fill) + { + pos = paddingLeading; + if (noWrapsbsSet.count > 0) + fill = (selfSize.width - totalWidth - paddingHorz) / noWrapsbsSet.count; + } else { - pos = selfRect.size.width - totalWidth - self.rightPadding; + pos = paddingLeading; } - + for (UIView *sbv in sbs) { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + pos += [self myValidMargin:sbvsc.leadingPosInner sbv:sbv calcPos:[sbvsc.leadingPosInner realPosIn:floatingWidth] selfLayoutSize:selfSize]; - pos += [self validMargin:sbv.leftPos sbv:sbv calcPos:[sbv.leftPos realMarginInSize:floatingWidth] selfLayoutSize:selfRect.size]; + CGRect rect = sbvmyFrame.frame; - CGRect rect = sbv.absPos.frame; rect.origin.x = pos; - //计算高度 - if (sbv.heightDime.isMatchParent) - { - rect.size.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:(selfRect.size.height - self.topPadding - self.bottomPadding)*sbv.heightDime.mutilVal + sbv.heightDime.addVal sbvSize:rect.size selfLayoutSize:selfRect.size]; - } - - MyMarginGravity mg = MyMarginGravity_Vert_Top; - if ((self.gravity & MyMarginGravity_Horz_Mask)!= MyMarginGravity_None) - mg =self.gravity & MyMarginGravity_Horz_Mask; - else - { - if (sbv.centerYPos.posVal != nil) - mg = MyMarginGravity_Vert_Center; - else if (sbv.topPos.posVal != nil && sbv.bottomPos.posVal != nil) - mg = MyMarginGravity_Vert_Fill; - else if (sbv.topPos.posVal != nil) - mg = MyMarginGravity_Vert_Top; - else if (sbv.bottomPos.posVal != nil) - mg = MyMarginGravity_Vert_Bottom; - } + [self myCalcSubviewTopBottomRect:vertGravity selfSize:selfSize rect_p:&rect sbv:sbv paddingBottom:paddingBottom paddingTop:paddingTop sbvsc:sbvsc lsc:lsc]; - [self vertGravity:mg selfSize:selfRect.size sbv:sbv rect:&rect]; - - sbv.absPos.frame = rect; + if (fill != 0 && [noWrapsbsSet containsObject:sbv]) + rect.size.width += fill; + pos += rect.size.width; - pos += [self validMargin:sbv.rightPos sbv:sbv calcPos:[sbv.rightPos realMarginInSize:floatingWidth] selfLayoutSize:selfRect.size]; + pos += [self myValidMargin:sbvsc.trailingPosInner sbv:sbv calcPos:[sbvsc.trailingPosInner realPosIn:floatingWidth] selfLayoutSize:selfSize]; + + sbvmyFrame.frame = rect; + if (sbv != sbs.lastObject) - pos += self.subviewMargin; + pos += subviewSpace; + + pos += between; //只有mghorz为between才加这个间距拉伸。 + } - return selfRect; + return selfSize; } --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass + +- (void)myCalcLeadingTrailingRect:(MyGravity)horzGravity selfSize:(CGSize)selfSize rect_p:(CGRect *)rect_p sbv:(UIView *)sbv paddingTrailing:(CGFloat)paddingTrailing paddingLeading:(CGFloat)paddingLeading sbvsc:(UIView *)sbvsc lsc:(MyLinearLayout*)lsc { - CGRect selfRect = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass]; + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect_p->size.width = sbvsc.widthSizeInner.measure; - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - } + //调整子视图的宽度,如果子视图为matchParent的话 + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + rect_p->size.width = [sbvsc.widthSizeInner measureWith:selfSize.width - paddingLeading - paddingTrailing]; + if (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) + rect_p->size.width = selfSize.width - paddingLeading - paddingTrailing - sbvsc.leadingPosInner.absVal - sbvsc.trailingPosInner.absVal; - if (self.orientation == MyLayoutViewOrientation_Vert) - { - - //如果是垂直的布局,但是子视图设置了左右的边距或者设置了宽度则wrapContentWidth应该设置为NO - for (UIView *sbv in sbs) - { - - if (!isEstimate) - { - sbv.absPos.frame = sbv.frame; - [self calcSizeOfWrapContentSubview:sbv]; - - } - - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - if (pHasSubLayout != nil) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (sbvl.wrapContentWidth) - { - //只要同时设置了左右边距或者设置了宽度或者设置了子视图宽度填充则应该把wrapContentWidth置为NO - if ((sbvl.leftPos.posVal != nil && sbvl.rightPos.posVal != nil) || - sbvl.widthDime.dimeVal != nil || - (self.gravity & MyMarginGravity_Vert_Mask) == MyMarginGravity_Horz_Fill) - { - [sbvl setWrapContentWidthNoLayout:NO]; - } - } - - if (sbvl.wrapContentHeight) - { - if (sbvl.heightDime.dimeVal != nil || sbvl.weight != 0) - { - [sbvl setWrapContentHeightNoLayout:NO]; - } - } - - if (isEstimate) - { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 - } - } - - } - -#ifdef DEBUG - //"布局约束冲突:垂直线性布局不能将gravity的垂直停靠值设置为MyMarginGravity_Vert_Fill。" - NSCAssert((self.gravity & MyMarginGravity_Horz_Mask) != MyMarginGravity_Vert_Fill , @"Constraint exception!!, vertical linear layout:%@ can not set gravity to MyMarginGravity_Vert_Fill.",self); -#endif - if ((self.gravity & MyMarginGravity_Horz_Mask) != MyMarginGravity_None) - { - selfRect = [self layoutSubviewsForVertGravity:selfRect sbs:sbs]; - } - else - { - selfRect = [self layoutSubviewsForVert:selfRect sbs:sbs]; - } - - //绘制智能线。 - if (!isEstimate && self.IntelligentBorderLine != nil) - { - for (int i = 0; i < sbs.count; i++) - { - UIView *sbv = sbs[i]; - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) - { - sbvl.topBorderLine = nil; - sbvl.bottomBorderLine = nil; - - //取前一个视图和后一个视图。 - UIView *prevSiblingView = nil; - UIView *nextSiblingView = nil; - - if (i != 0) - { - prevSiblingView = sbs[i - 1]; - } - - if (i + 1 != sbs.count) - { - nextSiblingView = sbs[i + 1]; - } - - if (prevSiblingView != nil) - { - BOOL ok = YES; - if ([prevSiblingView isKindOfClass:[MyBaseLayout class]]) - { - MyBaseLayout *prevSiblingLayout = (MyBaseLayout*)prevSiblingView; - if (prevSiblingLayout.notUseIntelligentBorderLine) - ok = NO; - } - - if (ok) - sbvl.topBorderLine = self.IntelligentBorderLine; - } - - if (nextSiblingView != nil && ![nextSiblingView isKindOfClass:[MyBaseLayout class]]) - { - sbvl.bottomBorderLine = self.IntelligentBorderLine; - } - } - } - - } - } - - } - else - { - for (UIView *sbv in sbs) - { - - if (!isEstimate) - { - sbv.absPos.frame = sbv.frame; - [self calcSizeOfWrapContentSubview:sbv]; - } - - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - if (pHasSubLayout != nil) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (sbvl.wrapContentHeight) - { - //只要同时设置了上下边距或者设置了高度或者设置了比重或者父视图的填充属性则应该把wrapContentHeight置为NO - if ((sbvl.topPos.posVal != nil && sbvl.bottomPos.posVal != nil) || - sbvl.heightDime.dimeVal != nil || - (self.gravity & MyMarginGravity_Horz_Mask) == MyMarginGravity_Vert_Fill) - { - [sbvl setWrapContentHeightNoLayout:NO]; - } - } - - if (sbvl.wrapContentWidth) - { - if (sbvl.widthDime.dimeVal != nil || sbvl.weight != 0) - { - [sbvl setWrapContentWidthNoLayout:NO]; - } - } - - if (isEstimate) - { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 - - } - } - - } - -#ifdef DEBUG - //布局约束冲突:水平线性布局:%@不能将gravity的水平停靠值设置为MyMarginGravity_Horz_Fill。" - NSCAssert((self.gravity & MyMarginGravity_Vert_Mask) != MyMarginGravity_Horz_Fill , @"Constraint exception!! horizontal linear layout:%@ can not set gravity to MyMarginGravity_Horz_Fill",self); -#endif - - if ((self.gravity & MyMarginGravity_Vert_Mask) != MyMarginGravity_None) - selfRect = [self layoutSubviewsForHorzGravity:selfRect sbs:sbs]; - else - selfRect = [self layoutSubviewsForHorz:selfRect sbs:sbs]; - - //绘制智能线。 - if (!isEstimate && self.IntelligentBorderLine != nil) - { - for (int i = 0; i < sbs.count; i++) - { - UIView *sbv = sbs[i]; - if ([sbv isKindOfClass:[MyBaseLayout class]]) - { - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - if (!sbvl.notUseIntelligentBorderLine) - { - sbvl.leftBorderLine = nil; - sbvl.rightBorderLine = nil; - - //取前一个视图和后一个视图。 - UIView *prevSiblingView = nil; - UIView *nextSiblingView = nil; - - if (i != 0) - { - prevSiblingView = sbs[i - 1]; - } - - if (i + 1 != sbs.count) - { - nextSiblingView = sbs[i + 1]; - } - - if (prevSiblingView != nil) - { - BOOL ok = YES; - if ([prevSiblingView isKindOfClass:[MyBaseLayout class]]) - { - MyBaseLayout *prevSiblingLayout = (MyBaseLayout*)prevSiblingView; - if (prevSiblingLayout.notUseIntelligentBorderLine) - ok = NO; - } - - if (ok) - sbvl.leftBorderLine = self.IntelligentBorderLine; - } - - if (nextSiblingView != nil && ![nextSiblingView isKindOfClass:[MyBaseLayout class]]) - { - sbvl.rightBorderLine = self.IntelligentBorderLine; - } - } - } - - } - } + rect_p->size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect_p->size.width sbvSize:rect_p->size selfLayoutSize:selfSize]; + + + [self myCalcHorzGravity:[self myGetSubviewHorzGravity:sbv sbvsc:sbvsc horzGravity:horzGravity] sbv:sbv sbvsc:sbvsc paddingLeading:paddingLeading paddingTrailing:paddingTrailing selfSize:selfSize pRect:rect_p]; +} - +- (void)myCalcSubviewTopBottomRect:(MyGravity)vertGravity selfSize:(CGSize)selfSize rect_p:(CGRect *)rect_p sbv:(UIView *)sbv paddingBottom:(CGFloat)paddingBottom paddingTop:(CGFloat)paddingTop sbvsc:(UIView *)sbvsc lsc:(MyLinearLayout*)lsc +{ + //计算高度 + if (sbvsc.heightSizeInner.dimeRelaVal != nil && sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + { + rect_p->size.height = [sbvsc.heightSizeInner measureWith:selfSize.height - paddingTop - paddingBottom]; } - selfRect.size.height = [self validMeasure:self.heightDime sbv:self calcSize:selfRect.size.height sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - selfRect.size.width = [self validMeasure:self.widthDime sbv:self calcSize:selfRect.size.width sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; + if (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) + rect_p->size.height = selfSize.height - paddingTop - paddingBottom - sbvsc.topPosInner.absVal - sbvsc.bottomPosInner.absVal; - return selfRect; + rect_p->size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect_p->size.height sbvSize:rect_p->size selfLayoutSize:selfSize]; + [self myCalcVertGravity:[self myGetSubviewVertGravity:sbv sbvsc:sbvsc vertGravity:vertGravity] sbv:sbv sbvsc:sbvsc paddingTop:paddingTop paddingBottom:paddingBottom selfSize:selfSize pRect:rect_p]; } - --(CGFloat)calcSelfMeasure:(CGFloat)selfMeasure subviewMeasure:(CGFloat)subviewMeasure headPos:(MyLayoutPos*)headPos centerPos:(MyLayoutPos*)centerPos tailPos:(MyLayoutPos*)tailPos +-(CGFloat)myCalcSelfSize:(CGFloat)selfSize subviewSize:(CGFloat)subviewSize headPos:(MyLayoutPos*)headPos centerPos:(MyLayoutPos*)centerPos tailPos:(MyLayoutPos*)tailPos { - CGFloat temp = subviewMeasure; - CGFloat tempWeight = 0; - + CGFloat totalWeight = 0; + CGFloat tempSize = subviewSize; CGFloat hm = headPos.posNumVal.doubleValue; CGFloat cm = centerPos.posNumVal.doubleValue; CGFloat tm = tailPos.posNumVal.doubleValue; //这里是求父视图的最大尺寸,因此如果使用了相对边距的话,最大最小要参与计算。 - - if (![self isRelativeMargin:hm]) - temp += hm; + if (![self myIsRelativePos:hm]) + tempSize += hm; else - tempWeight += hm; + totalWeight += hm; + + tempSize += headPos.offsetVal; - temp += headPos.offsetVal; - if (![self isRelativeMargin:cm]) - temp += cm; + if (![self myIsRelativePos:cm]) + tempSize += cm; else - tempWeight += cm; + totalWeight += cm; - temp += centerPos.offsetVal; + tempSize += centerPos.offsetVal; - if (![self isRelativeMargin:tm]) - temp += tm; - else - tempWeight += tm; - temp += tailPos.offsetVal; + if (![self myIsRelativePos:tm]) + tempSize += tm; + else + totalWeight += tm; + tempSize += tailPos.offsetVal; - if (1 <= tempWeight) - temp = 0; + //如果3个比重之和小于等于1则表示按比重分配宽度。 + if (_myCGFloatLessOrEqual(1, totalWeight)) + tempSize = 0; else - temp /=(1 - tempWeight); //在有相对 + tempSize /=(1 - totalWeight); - CGFloat headMargin = [self validMargin:headPos sbv:headPos.view calcPos:[headPos realMarginInSize:temp] selfLayoutSize:CGSizeZero]; + CGFloat leadingMargin = [self myValidMargin:headPos sbv:headPos.view calcPos:[headPos realPosIn:tempSize] selfLayoutSize:CGSizeZero]; - CGFloat centerMargin = [self validMargin:centerPos sbv:centerPos.view calcPos:[centerPos realMarginInSize:temp] selfLayoutSize:CGSizeZero]; + CGFloat centerMargin = [self myValidMargin:centerPos sbv:centerPos.view calcPos:[centerPos realPosIn:tempSize] selfLayoutSize:CGSizeZero]; - CGFloat tailMargin = [self validMargin:tailPos sbv:tailPos.view calcPos:[tailPos realMarginInSize:temp] selfLayoutSize:CGSizeZero]; + CGFloat trailingMargin = [self myValidMargin:tailPos sbv:tailPos.view calcPos:[tailPos realPosIn:tempSize] selfLayoutSize:CGSizeZero]; - temp = subviewMeasure + headMargin + centerMargin + tailMargin; - if (temp > selfMeasure) + tempSize = subviewSize + leadingMargin + centerMargin + trailingMargin; + if (tempSize > selfSize) { - selfMeasure = temp; + selfSize = tempSize; } - return selfMeasure; + return selfSize; } --(void)averageSubviewsForVert:(BOOL)centered withMargin:(CGFloat)margin +-(void)myEqualizeSubviewsForVert:(BOOL)centered withSpace:(CGFloat)margin { - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - - } //如果居中和不居中则拆分出来的片段是不一样的。 CGFloat scale; CGFloat scale2; - + NSArray *sbs = [self myGetLayoutSubviews]; if (margin == CGFLOAT_MAX) { CGFloat fragments = centered ? sbs.count * 2 + 1 : sbs.count * 2 - 1; @@ -1219,41 +1656,33 @@ -(void)averageSubviewsForVert:(BOOL)centered withMargin:(CGFloat)margin } - for (int i = 0; i < sbs.count; i++) + for (UIView *sbv in sbs) { - UIView *sbv = [sbs objectAtIndex:i]; + UIView *sbvsc = sbv.myCurrentSizeClass; - sbv.bottomPos.equalTo(@0); - sbv.topPos.equalTo(@(scale2)); - sbv.weight = scale; + [sbvsc.bottomPos __equalTo:@0]; + [sbvsc.topPos __equalTo:@(scale2)]; + sbvsc.weight = scale; - if (i == 0 && !centered) - sbv.topPos.equalTo(@0); + if (sbv == sbs.firstObject && !centered) + [sbvsc.topPos __equalTo:@0]; - if (i == sbs.count - 1 && centered) - sbv.bottomPos.equalTo(@(scale2)); + if (sbv == sbs.lastObject && centered) + [sbvsc.bottomPos __equalTo:@(scale2)]; } } --(void)averageSubviewsForHorz:(BOOL)centered withMargin:(CGFloat)margin +-(void)myEqualizeSubviewsForHorz:(BOOL)centered withSpace:(CGFloat)space { - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - - } + NSArray *sbs = [self myGetLayoutSubviews]; //如果居中和不居中则拆分出来的片段是不一样的。 CGFloat scale; CGFloat scale2; - if (margin == CGFLOAT_MAX) + if (space == CGFLOAT_MAX) { CGFloat fragments = centered ? sbs.count * 2 + 1 : sbs.count * 2 - 1; scale = 1 / fragments; @@ -1263,95 +1692,76 @@ -(void)averageSubviewsForHorz:(BOOL)centered withMargin:(CGFloat)margin else { scale = 1.0; - scale2 = margin; + scale2 = space; } - - for (int i = 0; i < sbs.count; i++) + for (UIView *sbv in sbs) { - UIView *sbv = [sbs objectAtIndex:i]; + UIView *sbvsc = sbv.myCurrentSizeClass; - sbv.leftPos.equalTo(@(scale2)); - sbv.weight = scale; + [sbvsc.trailingPos __equalTo:@0]; + [sbvsc.leadingPos __equalTo:@(scale2)]; + sbvsc.weight = scale; - if (i == 0 && !centered) - sbv.leftPos.equalTo(@0); + if (sbv == sbs.firstObject && !centered) + [sbvsc.leadingPos __equalTo:@0]; - if (i == sbs.count - 1 && centered) - sbv.rightPos.equalTo(@(scale2)); + if (sbv == sbs.lastObject && centered) + [sbvsc.trailingPos __equalTo:@(scale2)]; } } --(void)averageMarginForVert:(BOOL)centered +-(void)myEqualizeSubviewsSpaceForVert:(BOOL)centered { - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - - } + //如果居中和不居中则拆分出来的片段是不一样的。 + NSArray *sbs = [self myGetLayoutSubviews]; CGFloat fragments = centered ? sbs.count + 1 : sbs.count - 1; CGFloat scale = 1 / fragments; - for (int i = 0; i < sbs.count; i++) + for (UIView *sbv in sbs) { - UIView *sbv = [sbs objectAtIndex:i]; - - sbv.topPos.equalTo(@(scale)); + UIView *sbvsc = sbv.myCurrentSizeClass; + + [sbvsc.topPos __equalTo:@(scale)]; - if (i == 0 && !centered) - sbv.topPos.equalTo(@0); + if (sbv == sbs.firstObject && !centered) + [sbvsc.topPos __equalTo:@0]; - if (i == sbs.count - 1 && centered) - sbv.bottomPos.equalTo(@(scale)); + if (sbv == sbs.lastObject) + [sbvsc.bottomPos __equalTo: centered? @(scale) : @0]; } } --(void)averageMarginForHorz:(BOOL)centered +-(void)myEqualizeSubviewsSpaceForHorz:(BOOL)centered { - NSMutableArray *sbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; - for (UIView *sbv in self.subviews) - { - if ((sbv.isHidden && self.hideSubviewReLayout) || sbv.useFrame || sbv.absPos.sizeClass.isHidden) - continue; - - [sbs addObject:sbv]; - - } - //如果居中和不居中则拆分出来的片段是不一样的。 + NSArray *sbs = [self myGetLayoutSubviews]; CGFloat fragments = centered ? sbs.count + 1 : sbs.count - 1; CGFloat scale = 1 / fragments; - for (int i = 0; i < sbs.count; i++) + for (UIView *sbv in sbs) { - UIView *sbv = [sbs objectAtIndex:i]; - - sbv.leftPos.equalTo(@(scale)); + UIView *sbvsc = sbv.myCurrentSizeClass; + + [sbvsc.leadingPos __equalTo:@(scale)]; - if (i == 0 && !centered) - sbv.leftPos.equalTo(@0); + if (sbv == sbs.firstObject && !centered) + [sbvsc.leadingPos __equalTo:@0]; - if (i == sbs.count - 1 && centered) - sbv.rightPos.equalTo(@(scale)); + if (sbv == sbs.lastObject) + [sbvsc.trailingPos __equalTo:centered? @(scale) : @0]; } } --(id)createSizeClassInstance -{ - return [MyLayoutSizeClassLinearLayout new]; -} + diff --git a/Pods/MyLayout/MyLayout/Lib/MyMaker.h b/Pods/MyLayout/MyLayout/Lib/MyMaker.h index 00fe7c9..d6edcb7 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyMaker.h +++ b/Pods/MyLayout/MyLayout/Lib/MyMaker.h @@ -8,9 +8,10 @@ #import "MyLayoutDef.h" +#if TARGET_OS_IPHONE /** - *专门为布局设置的简化操作类,以便在统一的地方进行布局设置 + *专门为布局设置的简化操作类,以便在统一的地方进行布局设置,MyLayout提供了类似masonry的布局设置语法。 */ @interface MyMaker : NSObject @@ -20,14 +21,24 @@ -(MyMaker*)right; -(MyMaker*)margin; +-(MyMaker*)leading; +-(MyMaker*)trailing; + + +-(MyMaker*)wrapContentHeight; +-(MyMaker*)wrapContentWidth; + -(MyMaker*)height; -(MyMaker*)width; --(MyMaker*)flexedHeight; -(MyMaker*)useFrame; -(MyMaker*)noLayout; -(MyMaker*)centerX; -(MyMaker*)centerY; +-(MyMaker*)center; + +-(MyMaker*)visibility; +-(MyMaker*)alignment; -(MyMaker*)sizeToFit; @@ -37,31 +48,32 @@ -(MyMaker*)leftPadding; -(MyMaker*)bottomPadding; -(MyMaker*)rightPadding; --(MyMaker*)wrapContentHeight; --(MyMaker*)wrapContentWidth; - +-(MyMaker*)leadingPadding; +-(MyMaker*)trailingPadding; +-(MyMaker*)padding; +-(MyMaker*)zeroPadding; +-(MyMaker*)reverseLayout; +-(MyMaker*)vertSpace; +-(MyMaker*)horzSpace; +-(MyMaker*)space; -//框架布局子视图独有 --(MyMaker*)marginGravity; //线性布局和流式布局独有 -(MyMaker*)orientation; -(MyMaker*)gravity; --(MyMaker*)subviewMargin; +//线性布局独有 +-(MyMaker*)shrinkType; //流式布局独有 -(MyMaker*)arrangedCount; --(MyMaker*)averageArrange; -(MyMaker*)autoArrange; -(MyMaker*)arrangedGravity; --(MyMaker*)subviewVertMargin; --(MyMaker*)subviewHorzMargin; +-(MyMaker*)pagedCount; - -//线性布局和浮动布局子视图独有 +//线性布局和浮动布局和流式布局子视图独有 -(MyMaker*)weight; //浮动布局子视图独有 @@ -69,15 +81,18 @@ -(MyMaker*)clearFloat; +//浮动布局独有。 +-(MyMaker*)noBoundaryLimit; -//赋值操支持NSNumber,UIView,MyLayoutPos,MyLayoutDime, NSArray[MyLayoutDime] +//赋值操支持NSNumber,UIView,MyLayoutPos,MyLayoutSize, NSArray[MyLayoutSize] -(MyMaker* (^)(id val))equalTo; +-(MyMaker* (^)(id val))min; +-(MyMaker* (^)(id val))max; -(MyMaker* (^)(CGFloat val))offset; -(MyMaker* (^)(CGFloat val))multiply; -(MyMaker* (^)(CGFloat val))add; --(MyMaker* (^)(CGFloat val))min; --(MyMaker* (^)(CGFloat val))max; + @@ -95,5 +110,6 @@ @end +#endif diff --git a/Pods/MyLayout/MyLayout/Lib/MyMaker.m b/Pods/MyLayout/MyLayout/Lib/MyMaker.m index 7ddf9fa..4f06292 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyMaker.m +++ b/Pods/MyLayout/MyLayout/Lib/MyMaker.m @@ -7,8 +7,13 @@ // #import "MyMaker.h" + +#if TARGET_OS_IPHONE + #import "MyLayoutPos.h" -#import "MyLayoutDime.h" +#import "MyLayoutSize.h" +#import "MyLayoutPosInner.h" +#import "MyLayoutSizeInner.h" @implementation MyMaker { @@ -70,22 +75,27 @@ -(MyMaker*)margin return [self bottom]; } - --(MyMaker*)height +-(MyMaker*)leading { - return [self addMethod:@"heightDime"]; + return [self addMethod:@"leadingPos"]; + } --(MyMaker*)width +-(MyMaker*)trailing { - return [self addMethod:@"widthDime"]; + return [self addMethod:@"trailingPos"]; + } +-(MyMaker*)height +{ + return [self addMethod:@"heightSize"]; +} --(MyMaker*)flexedHeight +-(MyMaker*)width { - return [self addMethod:@"flexedHeight"]; + return [self addMethod:@"widthSize"]; } -(MyMaker*)useFrame @@ -110,6 +120,12 @@ -(MyMaker*)wrapContentWidth return [self addMethod:@"wrapContentWidth"]; } +-(MyMaker*)reverseLayout +{ + return [self addMethod:@"reverseLayout"]; +} + + -(MyMaker*)weight { @@ -127,6 +143,10 @@ -(MyMaker*)clearFloat return [self addMethod:@"clearFloat"]; } +-(MyMaker*)noBoundaryLimit +{ + return [self addMethod:@"noBoundaryLimit"]; +} -(MyMaker*)topPadding { @@ -154,6 +174,32 @@ -(MyMaker*)rightPadding } +-(MyMaker*)leadingPadding +{ + + return [self addMethod:@"leadingPadding"]; + +} + +-(MyMaker*)trailingPadding +{ + return [self addMethod:@"trailingPadding"]; + +} + + +-(MyMaker*)padding +{ + [self addMethod:@"topPadding"]; + [self addMethod:@"leftPadding"]; + [self addMethod:@"bottomPadding"]; + return [self addMethod:@"rightPadding"]; +} + +-(MyMaker*)zeroPadding +{ + return [self addMethod:@"zeroPadding"]; +} -(MyMaker*)orientation { @@ -178,6 +224,24 @@ -(MyMaker*)centerY return [self addMethod:@"centerYPos"]; } +-(MyMaker*)center +{ + [self addMethod:@"centerXPos"]; + return [self addMethod:@"centerYPos"]; +} + +-(MyMaker*)visibility +{ + return [self addMethod:@"myVisibility"]; +} + +-(MyMaker*)alignment +{ + return [self addMethod:@"myAlignment"]; +} + + + -(MyMaker*)sizeToFit { for (UIView *myView in _myViews) @@ -189,28 +253,25 @@ -(MyMaker*)sizeToFit } --(MyMaker*)marginGravity -{ - return [self addMethod:@"marginGravity"]; +-(MyMaker*)space +{ + return [self addMethod:@"subviewSpace"]; + } --(MyMaker*)subviewMargin +-(MyMaker*)shrinkType { - return [self addMethod:@"subviewMargin"]; + return [self addMethod:@"shrinkType"]; } + -(MyMaker*)arrangedCount { return [self addMethod:@"arrangedCount"]; } --(MyMaker*)averageArrange -{ - return [self addMethod:@"averageArrange"]; -} - -(MyMaker*)autoArrange { return [self addMethod:@"autoArrange"]; @@ -222,18 +283,24 @@ -(MyMaker*)arrangedGravity } --(MyMaker*)subviewVertMargin +-(MyMaker*)vertSpace { - return [self addMethod:@"subviewVertMargin"]; + return [self addMethod:@"subviewVSpace"]; } --(MyMaker*)subviewHorzMargin +-(MyMaker*)horzSpace { - return [self addMethod:@"subviewHorzMargin"]; + return [self addMethod:@"subviewHSpace"]; } +-(MyMaker*)pagedCount +{ + return [self addMethod:@"pagedCount"]; + +} + @@ -252,37 +319,37 @@ -(MyMaker*)subviewHorzMargin id oldVal = [myView valueForKey:key]; if ([oldVal isKindOfClass:[MyLayoutPos class]]) { - ((MyLayoutPos*)oldVal).equalTo(val); + [((MyLayoutPos*)oldVal) __equalTo:val]; } - else if ([oldVal isKindOfClass:[MyLayoutDime class]]) + else if ([oldVal isKindOfClass:[MyLayoutSize class]]) { - ((MyLayoutDime*)oldVal).equalTo(val); + [((MyLayoutSize*)oldVal) __equalTo:val]; } else [myView setValue:val forKey:key]; } else if ([val isKindOfClass:[MyLayoutPos class]]) { - ((MyLayoutPos*)[myView valueForKey:key]).equalTo(val); + [((MyLayoutPos*)[myView valueForKey:key]) __equalTo:val]; } - else if ([val isKindOfClass:[MyLayoutDime class]]) + else if ([val isKindOfClass:[MyLayoutSize class]]) { - ((MyLayoutDime*)[myView valueForKey:key]).equalTo(val); + [((MyLayoutSize*)[myView valueForKey:key]) __equalTo:val]; } else if ([val isKindOfClass:[NSArray class]]) { - ((MyLayoutDime*)[myView valueForKey:key]).equalTo(val); + [((MyLayoutSize*)[myView valueForKey:key]) __equalTo:val]; } else if ([val isKindOfClass:[UIView class]]) { id oldVal = [val valueForKey:key]; if ([oldVal isKindOfClass:[MyLayoutPos class]]) { - ((MyLayoutPos*)[myView valueForKey:key]).equalTo(oldVal); + [((MyLayoutPos*)[myView valueForKey:key]) __equalTo:oldVal]; } - else if ([oldVal isKindOfClass:[MyLayoutDime class]]) + else if ([oldVal isKindOfClass:[MyLayoutSize class]]) { - ((MyLayoutDime*)[myView valueForKey:key]).equalTo(oldVal); + [((MyLayoutSize*)[myView valueForKey:key]) __equalTo:oldVal]; } else @@ -309,7 +376,7 @@ -(MyMaker*)subviewHorzMargin for (UIView *myView in _myViews) { - ((MyLayoutPos*)[myView valueForKey:key]).offset(val); + [((MyLayoutPos*)[myView valueForKey:key]) __offset:val]; } } @@ -327,7 +394,7 @@ -(MyMaker*)subviewHorzMargin for (UIView *myView in _myViews) { - ((MyLayoutDime*)[myView valueForKey:key]).multiply(val); + [((MyLayoutSize*)[myView valueForKey:key]) __multiply:val]; } } return self; @@ -346,7 +413,7 @@ -(MyMaker*)subviewHorzMargin for (UIView *myView in _myViews) { - ((MyLayoutDime*)[myView valueForKey:key]).add(val); + [((MyLayoutSize*)[myView valueForKey:key]) __add:val]; } } return self; @@ -354,10 +421,10 @@ -(MyMaker*)subviewHorzMargin } --(MyMaker* (^)(CGFloat val))min +-(MyMaker* (^)(id val))min { _clear = YES; - return ^id(CGFloat val) { + return ^id(id val) { for (NSString *key in _keys) { @@ -365,26 +432,53 @@ -(MyMaker*)subviewHorzMargin for (UIView *myView in _myViews) { - ((MyLayoutDime*)[myView valueForKey:key]).min(val); + + id val2 = val; + if ([val isKindOfClass:[UIView class]]) + val2 = [val valueForKey:key]; + + id oldVal = [myView valueForKey:key]; + if ([oldVal isKindOfClass:[MyLayoutPos class]]) + { + [((MyLayoutPos*)oldVal) __lBound:val2 offsetVal:0]; + } + else if ([oldVal isKindOfClass:[MyLayoutSize class]]) + { + [((MyLayoutSize*)oldVal) __lBound:val2 addVal:0 multiVal:1]; + } + else + ; } } return self; }; - + } --(MyMaker* (^)(CGFloat val))max +-(MyMaker* (^)(id val))max { _clear = YES; - return ^id(CGFloat val) { + return ^id(id val) { for (NSString *key in _keys) { - for (UIView *myView in _myViews) { + id val2 = val; + if ([val isKindOfClass:[UIView class]]) + val2 = [val valueForKey:key]; - ((MyLayoutDime*)[myView valueForKey:key]).max(val); + id oldVal = [myView valueForKey:key]; + if ([oldVal isKindOfClass:[MyLayoutPos class]]) + { + [((MyLayoutPos*)oldVal) __uBound:val2 offsetVal:0]; + } + else if ([oldVal isKindOfClass:[MyLayoutSize class]]) + { + [((MyLayoutSize*)oldVal) __uBound:val2 addVal:0 multiVal:1]; + } + else + ; } } return self; @@ -416,3 +510,5 @@ -(void)allSubviewMakeLayout:(void(^)(MyMaker *make))layoutMaker @end +#endif + diff --git a/Pods/MyLayout/MyLayout/Lib/MyPathLayout.h b/Pods/MyLayout/MyLayout/Lib/MyPathLayout.h new file mode 100644 index 0000000..9588a13 --- /dev/null +++ b/Pods/MyLayout/MyLayout/Lib/MyPathLayout.h @@ -0,0 +1,189 @@ +// +// MyPathLayout.h +// MyLayout +// +// Created by apple on 16/7/8. +// Copyright © 2016年 YoungSoft. All rights reserved. +// + +#import "MyBaseLayout.h" + + +/** + *定义子视图在路径布局中的距离的类型。 + */ +typedef enum : NSUInteger { + MyPathSpace_Flexed, //浮动距离,子视图之间的距离根据路径布局的尺寸和子视图的数量而确定。 + MyPathSpace_Fixed, //固定距离,就是子视图之间的距离是固定的某个数值。 + MyPathSpace_Count, //固定数量距离,就是子视图之间的距离根据路径布局的尺寸和某个具体的数量而确定。 +} MyPathSpaceType; + + + +/** + *子视图之间的路径距离类,描述子视图在路径上的间隔距离的类型。 + */ +@interface MyPathSpace : NSObject + +/**浮动距离,根据布局视图的尺寸和子视图的数量动态决定*/ ++(id)flexed; + +/**固定距离,len为长度,每个子视图之间的距离都是len*/ ++(id)fixed:(CGFloat)len; + +/**数量距离,根据布局视图的尺寸和指定的数量count动态决定。*/ ++(id)count:(NSInteger)count; + + +/**距离类型。*/ +@property(nonatomic, assign, readonly) MyPathSpaceType type; +/**距离的值。*/ +@property(nonatomic, assign, readonly) CGFloat value; + +@end + + +/** + * 坐标轴设置类,用来描述坐标轴的信息。一个坐标轴具有原点、坐标系类型、开始和结束点、坐标轴对应的值这四个方面的内容。 + */ +@interface MyCoordinateSetting : NSObject + + +/** + *坐标原点的位置,位置是相对位置,默认是(0,0), 假如设置为(0.5,0.5)则在视图的中间。 + */ +@property(nonatomic, assign) CGPoint origin; + +/** + * 指定是否是数学坐标系,默认为NO,表示绘图坐标系。 数学坐标系y轴向上为正,向下为负;绘图坐标系则反之。 + */ +@property(nonatomic, assign) BOOL isMath; + +/** + *指定是否是y轴和x轴互换,默认为NO,如果设置为YES则方程提供的变量是y轴的值,方程返回的是x轴的值。 + */ +@property(nonatomic, assign) BOOL isReverse; + + +/**开始位置。如果不设置则根据坐标原点设置以及视图的尺寸自动确定.默认是-CGFLOAT_MAX*/ +@property(nonatomic, assign) CGFloat start; +/**结束位置。如果不设置则根据坐标原点设置以及视图的尺寸自动确定.默认是CGFLOAT_MAX*/ +@property(nonatomic, assign) CGFloat end; + +/**恢复默认设置。*/ +-(void)reset; + +@end + + + +/** + 路径布局类。路径布局通过坐标轴的设置,曲线路径函数方程,子视图之间的距离三个要素来确定其中子视图的位置。因此通过路径布局可以实现一些非常酷炫的布局效果。 + + 你可以从MyPathLayout中派生出一个子类。并实现如下方法: + @code + +(Class)layerClass + { + return [CAShapeLayer class]; + } + + @endcode + + @note 也就是说MyPathLayout的派生类返回一个CAShapeLayer,那么系统将自动会在每次布局时将layer的path属性进行赋值操作。 + + */ +@interface MyPathLayout : MyBaseLayout + + +/** + **下面部分是路径布局的三要素:坐标、函数、距离的定义 + **/ + + +/** + * 坐标系设置,您可以调整坐标系的各种参数来完成下列两个方法中的坐标到绘制的映射转换。 + */ +@property(nonatomic, strong, readonly) MyCoordinateSetting *coordinateSetting; + + +/** + * 直角坐标普通方程,x是坐标系里面x轴的位置,返回y = f(x)。要求函数在定义域内是连续的,否则结果不确定。如果返回的y无效则函数要返回NAN + */ +@property(nonatomic, copy) CGFloat (^rectangularEquation)(CGFloat x); + + +/** + *直角坐标参数方程,t是参数, 返回CGPoint是x轴和y轴的值。要求函数在定义域内是连续的,否则结果不确定。如果返回的点无效,则请返回CGPointMake(NAN,NAN) + */ +@property(nonatomic, copy) CGPoint (^parametricEquation)(CGFloat t); + +/** + *极坐标方程,angle是极坐标的弧度,返回r半径。要求函数在定义域内是连续的,否则结果不确定。如果返回的点无效,则请返回NAN + */ +@property(nonatomic, copy) CGFloat (^polarEquation)(CGFloat angle); + + +/** + *设置子视图在路径曲线上的距离的类型,一共有Flexed, Fixed, MaxCount,默认是Flexed, + */ +@property(nonatomic, strong) MyPathSpace *spaceType; + + +/** + *设置和获取布局视图中的原点视图,默认是nil。如果设置了原点视图则总会将原点视图作为布局视图中的最后一个子视图。原点视图将会显示在路径的坐标原点中心上,因此原点布局是不会参与在路径中的布局的。因为中心原点视图是布局视图中的最后一个子视图,而MyPathLayout重写了AddSubview方法,因此可以正常的使用这个方法来添加子视图。 + */ +@property(nonatomic, strong) UIView *originView; + + +/** + *返回布局视图中所有在曲线路径中排列的子视图。如果设置了原点视图则返回subviews里面除最后一个子视图外的所有子视图,如果没有原点子视图则返回subviews + */ +@property(nonatomic, strong,readonly) NSArray *pathSubviews; + + +/** + 得到子视图在曲线路径中定位时的函数的自变量的值。也就是说在函数中当值等于下面的返回值时,这个视图的位置就被确定了。方法如果返回NAN则表示这个子视图没有定位。 + @param subview 指定的子视图 + @return 返回指定子视图在曲线路径中的自变量值 + */ +-(CGFloat)argumentFrom:(UIView*)subview; + + +/** + 下面三个函数用来获取两个子视图之间的曲线路径数据,在调用getSubviewPathPoint方法之前请先调用beginSubviewPathPoint方法,而调用完毕后请调用endSubviewPathPoint方法,否则getSubviewPathPoint返回的结果未可知。 + */ + + +/** + 开始获取子视图路径数据的方法 + @param full 表示getSubviewPathPoint获取的是否是全部路径点。如果为NO则只会获取子视图的位置的点 + */ +-(void)beginSubviewPathPoint:(BOOL)full; +/** + 结束获取子视图路径数据的方法 + */ +-(void)endSubviewPathPoint; + +/** + 创建从某个子视图到另外一个子视图之间的路径点,返回NSValue数组,里面的值是CGPoint。 + @param fromIndex 指定开始的子视图的索引位置 + @param toIndex 指定结束的子视图的索引位置。如果有原点子视图时,这两个索引值不能算上原点子视图的索引值。 + @return 返回fromIndex到toIndex之间的所有曲线路径点数组 + */ +-(NSArray*)getSubviewPathPoint:(NSInteger)fromIndex toIndex:(NSInteger)toIndex; + +/** + 创建布局的曲线的路径。用户需要负责销毁返回的值。调用者可以用这个方法来获得曲线的路径,进行一些绘制的工作。 + @param subviewCount 指定这个路径上子视图的数量的个数,如果设置为-1则是按照布局视图的子视图的数量来创建。需要注意的是如果布局视图的spaceType为Flexed,Count的话则这个参数设置无效。 + @return 返回指定数量的子视图的曲线路径,用户需要负责销毁返回的对象。 + */ +-(CGPathRef)createPath:(NSInteger)subviewCount; + + +/** + 设置获取子视图距离的误差值。默认是0.5,误差越小则距离的精确值越大,误差最低值不能<=0。一般不需要调整这个值,只有那些要求精度非常高的场景才需要微调这个值,比如在一些曲线路径较短的情况下,通过调小这个值来子视图之间间距的精确计算。 + */ +@property(nonatomic, assign) CGFloat distanceError; + + +@end diff --git a/Pods/MyLayout/MyLayout/Lib/MyPathLayout.m b/Pods/MyLayout/MyLayout/Lib/MyPathLayout.m new file mode 100644 index 0000000..96739a9 --- /dev/null +++ b/Pods/MyLayout/MyLayout/Lib/MyPathLayout.m @@ -0,0 +1,1268 @@ +// +// MyPathLayout.m +// MyLayout +// +// Created by apple on 16/7/8. +// Copyright © 2016年 YoungSoft. All rights reserved. +// + +#import "MyPathLayout.h" +#import "MyLayoutInner.h" + + +@implementation MyPathSpace + +-(id)initWithType:(MyPathSpaceType)type value:(CGFloat)value +{ + self = [super init]; + if (self != nil) + { + _type = type; + _value = value; + } + + return self; +} + +//浮动距离,根据布局视图的尺寸和子视图的数量动态决定 ++(id)flexed +{ + return [[self alloc] initWithType:MyPathSpace_Flexed value:0]; +} + +//固定距离,len为长度,每个子视图之间的距离都是len ++(id)fixed:(CGFloat)len +{ + return [[self alloc] initWithType:MyPathSpace_Fixed value:len]; +} + +//数量距离,根据布局视图的尺寸和指定的数量动态决定。 ++(id)count:(NSInteger)count +{ + return [[self alloc] initWithType:MyPathSpace_Count value:count]; +} + + + +@end + + +@implementation MyCoordinateSetting +{ + __weak MyPathLayout *_pathLayout; +} + +-(id)initWithPathLayout:(MyPathLayout*)pathLayout +{ + self = [super init]; + if (self != nil) + { + _pathLayout = pathLayout; + _start = -CGFLOAT_MAX; + _end = CGFLOAT_MAX; + } + + return self; +} + +-(void)setIsMath:(BOOL)isMath +{ + if (_isMath != isMath) + { + _isMath = isMath; + [_pathLayout setNeedsLayout]; + } + +} + +-(void)setIsReverse:(BOOL)isReverse +{ + if (_isReverse != isReverse) + { + _isReverse = isReverse; + [_pathLayout setNeedsLayout]; + } +} + +-(void)setOrigin:(CGPoint)origin +{ + if (!_myCGPointEqual(_origin, origin)) + { + _origin = origin; + [_pathLayout setNeedsLayout]; + } +} + +-(void)setStart:(CGFloat)start +{ + if (_start != start) + { + _start = start; + [_pathLayout setNeedsLayout]; + } + + +} + +-(void)setEnd:(CGFloat)end +{ + if (_end != end) + { + _end = end; + [_pathLayout setNeedsLayout]; + + } +} + +-(void)reset +{ + _start = -CGFLOAT_MAX; + _end = CGFLOAT_MAX; + _isMath = NO; + _isReverse = NO; + _origin = CGPointZero; + [_pathLayout setNeedsLayout]; +} + +@end + + + +@interface MyPathLayout() + +@property(nonatomic, strong) NSArray *pathPoints; //记录路径内所有算出来的点,内容为NSValue(CGPoint) +@property(nonatomic, strong) NSArray *pointIndexs; //记录每个子视图在pathPoints中的索引位置。内容为NSNumber。比如pathPoints有1000个点,一共有10个子视图那么pointIndexs的长度就是10,每个元素就是在subviewPoints里面的索引。 +@property(nonatomic, strong) NSMutableArray *argumentArray; //记录每个子视图在路径曲线函数中的变量值的数组,数组的内容为NSValue。 + +@end + + + +@implementation MyPathLayout +{ + MyCoordinateSetting *_coordinateSetting; + BOOL _hasOriginView; + MyPathSpace *_spaceType; +} + +/* ++(Class)layerClass +{ + return [CAShapeLayer class]; +} +*/ + +-(MyCoordinateSetting*)coordinateSetting +{ + if (_coordinateSetting == nil) + { + _coordinateSetting = [[MyCoordinateSetting alloc] initWithPathLayout:self]; + } + + return _coordinateSetting; +} + +-(MyPathSpace*)spaceType +{ + if (_spaceType == nil) + { + _spaceType = [MyPathSpace flexed]; + } + + return _spaceType; +} + +-(void)setSpaceType:(MyPathSpace *)spaceType +{ + if (_spaceType != spaceType) + { + _spaceType = spaceType; + + [self setNeedsLayout]; + } +} + +-(void)setRectangularEquation:(CGFloat (^)(CGFloat))rectangularEquation +{ + _rectangularEquation = [rectangularEquation copy]; + _parametricEquation = nil; + _polarEquation = nil; + [self setNeedsLayout]; +} + +-(void)setParametricEquation:(CGPoint (^)(CGFloat))parametricEquation +{ + _parametricEquation = [parametricEquation copy]; + _rectangularEquation = nil; + _polarEquation = nil; + [self setNeedsLayout]; +} + +-(void)setPolarEquation:(CGFloat (^)(CGFloat))polarEquation +{ + _polarEquation = [polarEquation copy]; + _rectangularEquation = nil; + _parametricEquation = nil; + [self setNeedsLayout]; +} + + +-(UIView*)originView +{ + if (_hasOriginView && self.subviews.count > 0) + return self.subviews.lastObject; + return nil; +} + +-(void)setOriginView:(UIView *)originView +{ + if (_hasOriginView) + { + if (originView != nil) + { + if (self.subviews.count > 0) + { + if (self.subviews.lastObject != originView) + { + [self.subviews.lastObject removeFromSuperview]; + [super addSubview:originView]; + } + + } + else + { + [self addSubview:originView]; + } + + } + else + { + if (self.subviews.count > 0) + [self.subviews.lastObject removeFromSuperview]; + + _hasOriginView = NO; + } + + } + else + { + if (originView != nil) + { + [super addSubview:originView]; + _hasOriginView = YES; + } + } +} + +-(NSArray*)pathSubviews +{ + if (_hasOriginView) + { + NSArray *sbs = self.subviews; + if (sbs.count == 0) + return sbs; + + NSMutableArray *pathsbs = [NSMutableArray arrayWithCapacity:self.subviews.count]; + for (UIView *sbv in sbs) + { + if (sbv == sbs.lastObject) + continue; + + [pathsbs addObject:sbv]; + } + + return pathsbs; + } + else + return self.subviews; +} + +-(NSMutableArray*)argumentArray +{ + if (_argumentArray == nil) + { + _argumentArray = [NSMutableArray new]; + } + + return _argumentArray; +} + +-(CGFloat)argumentFrom:(UIView*)subview +{ + NSUInteger index = [self.subviews indexOfObject:subview]; + if (index == NSNotFound) + return NAN; + + if (self.originView == subview) + return NAN; + + if (index < self.argumentArray.count) + { + if (self.polarEquation != nil) + return [self.argumentArray[index] doubleValue] / 180 * M_PI; + else + return [self.argumentArray[index] doubleValue]; + } + else + return NAN; + +} + + +//开始和结束子视图之间的路径创建 +-(void)beginSubviewPathPoint:(BOOL)full +{ + //这里先把所有点都创建出来。 + if (full) + { + NSMutableArray *pointIndexs = [NSMutableArray new]; + self.pathPoints = [self myCalcPoints:self.pathSubviews path:nil pointIndexArray:pointIndexs lsc:self.myCurrentSizeClass]; + self.pointIndexs = pointIndexs; + } + else + { + self.pathPoints = [self myCalcPoints:self.pathSubviews path:nil pointIndexArray:nil lsc:self.myCurrentSizeClass]; + self.pointIndexs = nil; + } + +} + +-(void)endSubviewPathPoint +{ + self.pathPoints = nil; + self.pointIndexs = nil; +} + +-(NSArray*)getSubviewPathPoint:(NSInteger)fromIndex toIndex:(NSInteger)toIndex +{ + if (self.pathPoints == nil) + return nil; + + NSInteger realFromIndex = fromIndex; + NSInteger realToIndex = toIndex; + + if (realFromIndex == realToIndex) + return [NSArray new]; + + //要求外界传递进来的索引要考虑原点视图的索引。 + NSMutableArray *retPoints = [NSMutableArray new]; + + if (realFromIndex < realToIndex) + { + NSInteger start; + NSInteger end; + if (self.pointIndexs == nil) + { + start = realFromIndex; + end = realToIndex; + } + else + { + start = [self.pointIndexs[realFromIndex] integerValue]; + end = [self.pointIndexs[realToIndex] integerValue]; + } + + for (NSInteger i = start; i <= end; i++) + { + [retPoints addObject:self.pathPoints[i]]; + } + } + else + { + NSInteger end = [self.pointIndexs[realFromIndex] integerValue]; + NSInteger start = [self.pointIndexs[realToIndex] integerValue]; + + for (NSInteger i = end; i >= start; i--) + { + [retPoints addObject:self.pathPoints[i]]; + } + } + + return retPoints; + +} + +-(CGPathRef)createPath:(NSInteger)subviewCount +{ + CGMutablePathRef retPath = CGPathCreateMutable(); + + if (self.spaceType.type != MyPathSpace_Fixed) + { + [self myCalcPathPoints:retPath pPathLen:NULL subviewCount:-1 pointIndexArray:nil viewSpace:0 lsc:self.myCurrentSizeClass]; + } + else + { + if (subviewCount == -1) + subviewCount = self.pathSubviews.count; + + [self myCalcPathPoints:retPath pPathLen:NULL subviewCount:subviewCount pointIndexArray:nil viewSpace:self.spaceType.value lsc:self.myCurrentSizeClass]; + } + + return retPath; + +} + +#pragma mark -- Override Method + +- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index +{ + if (self.originView != nil) + { + if (index == self.subviews.count) + index -=1; + } + + [super insertSubview:view atIndex:index]; +} + +- (void)addSubview:(UIView *)view +{ + if (self.originView != nil) + { + [super insertSubview:view atIndex:self.subviews.count - 1]; + } + else + [super addSubview:view]; +} + + +- (void)sendSubviewToBack:(UIView *)view +{ + if (self.originView == view) + return; + + [super sendSubviewToBack:view]; + +} + + +- (void)willRemoveSubview:(UIView *)subview +{ + [super willRemoveSubview:subview]; + if (_hasOriginView) + { + if (self.subviews.count > 0 && subview == self.subviews.lastObject) + { + _hasOriginView = NO; + } + } +} + + +// Only override drawRect: if you perform custom drawing. +// An empty implementation adversely affects performance during animation. + + + /* +- (void)drawRect:(CGRect)rect { + // Drawing code + + + CGContextRef ctx = UIGraphicsGetCurrentContext(); + + CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor); + + + NSArray *sbs = self.pathSubviews; + + CGMutablePathRef path = CGPathCreateMutable(); + + MyPathLayout *lsc = self.myCurrentSizeClass; + + NSArray *pts = nil; + if (sbs.count > 0) + { + if (self.spaceType.type != MyPathSpace_Fixed) + { + CGFloat totalLen = 0; + NSArray *tempArray = [self myCalcPathPoints:path pPathLen:&totalLen subviewCount:-1 pointIndexArray:nil viewSpace:0 lsc:lsc]; + BOOL bClose = NO; + if (tempArray.count > 1) + { + CGPoint p1 = [tempArray.firstObject CGPointValue]; + CGPoint p2 = [tempArray.lastObject CGPointValue]; + bClose = [self myCalcDistance:p1 with:p2] <=1; + } + + CGFloat viewSpacing = 0; + NSInteger sbvcount = sbs.count; + if (self.spaceType.type == MyPathSpace_Count) + sbvcount = (NSInteger)self.spaceType.value; + + if (sbvcount > 1) + { + viewSpacing = totalLen / (sbvcount - (bClose ? 0 : 1)); + } + + pts = [self myCalcPathPoints:nil pPathLen:NULL subviewCount:sbs.count pointIndexArray:nil viewSpace:viewSpacing lsc:lsc]; + + } + else + { + pts = [self myCalcPathPoints:path pPathLen:NULL subviewCount:sbs.count pointIndexArray:nil viewSpace:self.spaceType.value lsc:lsc]; + } + } + + + CGContextAddPath(ctx, path); + CGContextStrokePath(ctx); + + + for (NSValue *val in pts) + { + CGPoint pt2 = val.CGPointValue; + CGContextStrokeEllipseInRect(ctx, CGRectMake(pt2.x - 4, pt2.y - 4, 8, 8)); + } + + } + +*/ + + + +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs +{ + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; + + if (sbs == nil) + sbs = [self myGetLayoutSubviews]; + NSArray *sbs2 = sbs; + + MyPathLayout *lsc = self.myCurrentSizeClass; + + for (UIView *sbv in sbs) + { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (!isEstimate) + { + sbvmyFrame.frame = sbv.bounds; + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + } + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + + + if (pHasSubLayout != nil && (sbvsc.wrapContentHeight || sbvsc.wrapContentWidth)) + *pHasSubLayout = YES; + + if (isEstimate && (sbvsc.wrapContentWidth || sbvsc.wrapContentHeight)) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } + } + + + CGFloat minXPos = CGFLOAT_MAX; + CGFloat maxXPos = -CGFLOAT_MAX; + CGFloat minYPos = CGFLOAT_MAX; + CGFloat maxYPos = -CGFLOAT_MAX; + + + //算路径子视图的。 + sbs = [self myGetLayoutSubviewsFrom:self.pathSubviews]; + + CGMutablePathRef path = nil; + if ([self.layer isKindOfClass:[CAShapeLayer class]] && !isEstimate) + { + path = CGPathCreateMutable(); + } + + NSArray *pts = [self myCalcPoints:sbs path:path pointIndexArray:nil lsc:lsc]; + + if (path != nil) + { + CAShapeLayer *slayer = (CAShapeLayer*)self.layer; + slayer.path = path; + CGPathRelease(path); + } + + for (int i = 0; i < sbs.count; i++) + { + UIView *sbv = sbs[i]; + + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGPoint pt = CGPointZero; + if (pts.count > i) + { + pt = [pts[i] CGPointValue]; + } + + //计算得到最大的高度和最大的宽度。 + + CGRect rect = sbvmyFrame.frame; + + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil) + { + if (sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + { + rect.size.width = [sbvsc.widthSizeInner measureWith:(selfSize.width - lsc.leftPadding - lsc.rightPadding) ]; + } + else + { + rect.size.width = [sbvsc.widthSizeInner measureWith: sbvsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width ]; + } + } + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; + + + if (sbvsc.heightSizeInner.dimeRelaVal != nil) + { + if (sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + { + rect.size.height = [sbvsc.heightSizeInner measureWith:(selfSize.height - lsc.topPadding - lsc.bottomPadding) ]; + } + else + { + rect.size.height = [sbvsc.heightSizeInner measureWith:sbvsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height ]; + } + } + + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + { + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + } + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + + //中心点的位置。。 + rect.origin.x = pt.x - rect.size.width * sbv.layer.anchorPoint.x - sbvsc.rightPosInner.absVal + sbvsc.leftPosInner.absVal; + rect.origin.y = pt.y - rect.size.height * sbv.layer.anchorPoint.y - sbvsc.bottomPosInner.absVal + sbvsc.topPosInner.absVal; + + if (CGRectGetMinY(rect) < minYPos) + { + minYPos = CGRectGetMinY(rect); + } + + if (CGRectGetMaxY(rect) > maxYPos) + { + maxYPos = CGRectGetMaxY(rect); + } + + if (CGRectGetMinX(rect) < minXPos) + { + minXPos = CGRectGetMinX(rect); + } + + if (CGRectGetMaxX(rect) > maxXPos) + { + maxXPos = CGRectGetMaxX(rect); + } + + + sbvmyFrame.frame = rect; + + } + + //特殊填充中心视图。 + UIView *sbv = [self originView]; + if (sbv != nil) + { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + CGRect rect = sbvmyFrame.frame; + + if (sbvsc.widthSizeInner.dimeNumVal != nil) + rect.size.width = sbvsc.widthSizeInner.measure; + + if (sbvsc.widthSizeInner.dimeRelaVal != nil) + { + if (sbvsc.widthSizeInner.dimeRelaVal == lsc.widthSizeInner) + { + rect.size.width = [sbvsc.widthSizeInner measureWith:(selfSize.width - lsc.leftPadding - lsc.rightPadding)]; + } + else + { + rect.size.width = [sbvsc.widthSizeInner measureWith:sbvsc.widthSizeInner.dimeRelaVal.view.estimatedRect.size.width]; + } + } + + rect.size.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:rect.size.width sbvSize:rect.size selfLayoutSize:selfSize]; + + if (sbvsc.heightSizeInner.dimeNumVal != nil) + rect.size.height = sbvsc.heightSizeInner.measure; + + + if (sbvsc.heightSizeInner.dimeRelaVal != nil) + { + if (sbvsc.heightSizeInner.dimeRelaVal == lsc.heightSizeInner) + { + rect.size.height = [sbvsc.heightSizeInner measureWith:selfSize.height - lsc.topPadding - lsc.bottomPadding]; + } + else if (sbvsc.heightSizeInner.dimeRelaVal == sbvsc.widthSizeInner) + { + rect.size.height = [sbvsc.heightSizeInner measureWith:rect.size.width]; + } + else + { + rect.size.height = [sbvsc.heightSizeInner measureWith:sbvsc.heightSizeInner.dimeRelaVal.view.estimatedRect.size.height]; + } + } + + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]) + { + rect.size.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:rect.size.width]; + } + + rect.size.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:rect.size.height sbvSize:rect.size selfLayoutSize:selfSize]; + + //计算宽度等于高度的情况。 + if (sbvsc.widthSizeInner.dimeRelaVal != nil && sbvsc.widthSizeInner.dimeRelaVal == sbvsc.heightSizeInner) + { + rect.size.width = [sbvsc.widthSizeInner measureWith:rect.size.height]; + } + + //位置在原点位置。。 + rect.origin.x = (selfSize.width - lsc.leftPadding - lsc.rightPadding)*self.coordinateSetting.origin.x - rect.size.width *sbv.layer.anchorPoint.x + sbvsc.leftPosInner.absVal + lsc.leftPadding - sbvsc.rightPosInner.absVal; + rect.origin.y = (selfSize.height - lsc.topPadding - lsc.bottomPadding)*self.coordinateSetting.origin.y - rect.size.height * sbv.layer.anchorPoint.y + sbvsc.topPosInner.absVal + lsc.topPadding - sbvsc.bottomPosInner.absVal; + + if (CGRectGetMinY(rect) < minYPos) + { + minYPos = CGRectGetMinY(rect); + } + + if (CGRectGetMaxY(rect) > maxYPos) + { + maxYPos = CGRectGetMaxY(rect); + } + + if (CGRectGetMinX(rect) < minXPos) + { + minXPos = CGRectGetMinX(rect); + } + + if (CGRectGetMaxX(rect) > maxXPos) + { + maxXPos = CGRectGetMaxX(rect); + } + + sbvmyFrame.frame = rect; + + } + + if (minYPos == CGFLOAT_MAX) + { + minYPos = 0; + } + + if (maxYPos == -CGFLOAT_MAX) + { + maxYPos = lsc.topPadding + lsc.bottomPadding; + } + + if (minXPos == CGFLOAT_MAX) + { + minXPos = 0; + } + + if (maxXPos == -CGFLOAT_MAX) + { + maxXPos = lsc.leftPadding + lsc.rightPadding; + } + + + if (lsc.wrapContentWidth) + { + selfSize.width = maxXPos - minXPos; + } + + if (lsc.wrapContentHeight) + { + selfSize.height = maxYPos - minYPos; + } + + //调整布局视图自己的尺寸。 + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + + + //路径布局不支持RTL。 + // [self myAdjustSubviewsRTLPos:sbs2 selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs2 lsc:lsc]; +} + +-(id)createSizeClassInstance +{ + return [MyPathLayoutViewSizeClass new]; +} + + + +#pragma mark -- Private Method + + +-(CGFloat)myCalcDistance:(CGPoint)pt1 with:(CGPoint)pt2 +{ + return sqrt(pow(pt1.x - pt2.x, 2) + pow(pt1.y - pt2.y, 2)); +} + + +-(CGPoint)myGetNearestDistancePoint:(CGFloat)startArg lastXY:(CGPoint)lastXY distance:(CGFloat)distance viewSpace:(CGFloat)viewSpace pLastValidArg:(CGFloat*)pLastValidArg func:(CGPoint (^)(CGFloat))func +{ + + //判断pLastValidArg和Arg的差距如果超过1则按pLastValidArg + 1作为开始计算的变量。 + if (startArg - *pLastValidArg > 1) + startArg = *pLastValidArg + 1; + + CGFloat step = 1; + while(true) + { + + CGFloat arg = startArg - step + step/10; + while (arg - startArg < 0.0001) + { + + CGPoint realXY = func(arg); + if (!isnan(realXY.x) && !isnan(realXY.y)) + { + CGFloat oldDistance = distance; + distance += [self myCalcDistance:realXY with:lastXY]; + if ( _myCGFloatGreatOrEqual(distance, viewSpace)) + { + if (_myCGFloatLessOrEqual(distance - viewSpace, self.distanceError)) + { + *pLastValidArg = arg; + return realXY; + } + else + { + distance = oldDistance; + break; + } + } + + lastXY = realXY; + } + else + { + } + + arg += step / 10; + } + + if (arg > startArg) + { + startArg += 1; + step = 1; + } + else + { + startArg = arg; + step /= 10; + } + if (_myCGFloatLessOrEqual(step, 0.001)) + { + *pLastValidArg = arg; + break; + } + } + + return lastXY; + +} + + +-(void)myCalcPathPointsHelper:(NSMutableArray*)pathPointArray + showPath:(CGMutablePathRef)showPath + pPathLen:(CGFloat*)pPathLen + subviewCount:(NSInteger)subviewCount + pointIndexArray:(NSMutableArray*)pointIndexArray + viewSpace:(CGFloat)viewSpace + startArg:(CGFloat)startArg //定义域最小值 + endArg:(CGFloat)endArg //定义域最大值 + func:(CGPoint (^)(CGFloat))func +{ + + if (self.distanceError <= 0) + self.distanceError = 0.5; + + [self.argumentArray removeAllObjects]; + + CGFloat distance = 0; + CGPoint lastXY = CGPointZero; + + CGFloat arg = startArg; + CGFloat lastValidArg = arg; + + //曲线有可能不是连续的,因此这两个标志用来记录是否某段曲线的开始标志以及曲线的段数 + BOOL isSegmentStart = YES; + int segmentCount = 0; + while (true) + { + + if (subviewCount < 0) + { + //如果曲线变量超过了定义域则退出。 + if (arg - endArg > 0.1) //这里不能用arg > endArg 的原因是有精度问题。 + { + break; + } + } + else if (subviewCount == 0) + { + break; + } + else + { + if (isSegmentStart && segmentCount >= 1) + { + if (pointIndexArray != nil) + [pointIndexArray addObject:@(pathPointArray.count)]; + + [pathPointArray addObject:[NSValue valueWithCGPoint:lastXY]]; + + [self.argumentArray addObject:@(arg)]; + + if (showPath != nil) + { + CGPathAddLineToPoint(showPath, NULL, lastXY.x, lastXY.y); + } + break; + } + + } + + CGPoint realXY = func(arg); + if (!isnan(realXY.x) && !isnan(realXY.y)) + { + if (isSegmentStart) + { + + isSegmentStart = NO; + segmentCount += 1; + if (subviewCount > 0 && segmentCount == 1) + { + subviewCount -=1; + lastValidArg = arg; + + if (pointIndexArray != nil) + [pointIndexArray addObject:@(pathPointArray.count)]; + + [self.argumentArray addObject:@(arg)]; + } + + [pathPointArray addObject:[NSValue valueWithCGPoint:realXY]]; + + if (showPath != nil) + { + CGPathMoveToPoint(showPath,NULL, realXY.x, realXY.y); + } + + + } + else + { + if (subviewCount >= 0) + { + //点的距离累加 + CGFloat oldDistance = distance; + distance += [self myCalcDistance:realXY with:lastXY]; + if (_myCGFloatGreatOrEqual(distance, viewSpace) ) + {//如果距离超过间距。则需要缩小自变量步长。以便达到最小的间距误差 + if (_myCGFloatGreatOrEqual(distance - viewSpace, self.distanceError) ) + { + realXY = [self myGetNearestDistancePoint:arg lastXY:lastXY distance:oldDistance viewSpace:viewSpace pLastValidArg:&lastValidArg func:func]; + } + else + { + lastValidArg = arg; + } + + if (pointIndexArray == nil) + [pathPointArray addObject:[NSValue valueWithCGPoint:realXY]]; + else + [pointIndexArray addObject:@(pathPointArray.count)]; + + distance = 0; + subviewCount -=1; + [self.argumentArray addObject:@(lastValidArg)]; + + } + else if (distance - viewSpace > -1 * self.distanceError) + {//如果距离和间距小于误差则认为是一个视图可以存放的点。 + if (pointIndexArray == nil) + [pathPointArray addObject:[NSValue valueWithCGPoint:realXY]]; + else + [pointIndexArray addObject:@(pathPointArray.count)]; + + distance = 0; + subviewCount -=1; + lastValidArg = arg; + [self.argumentArray addObject:@(arg)]; + } + else + { + lastValidArg = arg; + } + } + else + { + if (pointIndexArray == nil) + [pathPointArray addObject:[NSValue valueWithCGPoint:realXY]]; + } + + if (pointIndexArray != nil) + [pathPointArray addObject:[NSValue valueWithCGPoint:realXY]]; + + + if (showPath != nil) + { + CGPathAddLineToPoint(showPath,NULL, realXY.x, realXY.y); + } + + if (pPathLen != NULL) + { + *pPathLen += [self myCalcDistance:realXY with:lastXY]; + } + } + + lastXY = realXY; + } + else + {//只要自变量和因变量是无效值,则认为是一个新的段的开始。 + isSegmentStart = YES; + } + arg += 1; + } + + +} + + +/** + 计算曲线路径 + + @param showPath 将计算的路径保存到showPath中,可选参数 + @param pPathLen 返回路径的总长度 + @param subviewCount 子视图的数量,如果为-1则表示只计算路径的长度不会把每个子视图所在的路径点索引保存 + @param pointIndexArray 返回所有子视图在路径点的索引 + @param viewSpace 子视图之间的间距 + @param lsc lsc + @return 返回所有路径点 + */ +-(NSArray*)myCalcPathPoints:(CGMutablePathRef)showPath + pPathLen:(CGFloat*)pPathLen + subviewCount:(NSInteger)subviewCount + pointIndexArray:(NSMutableArray*)pointIndexArray + viewSpace:(CGFloat)viewSpace + lsc:(MyPathLayout*)lsc +{ + NSMutableArray *pathPointArray = [NSMutableArray new]; + + CGFloat selfWidth = CGRectGetWidth(self.bounds) - lsc.leftPadding - lsc.rightPadding; + CGFloat selfHeight = CGRectGetHeight(self.bounds) - lsc.topPadding - lsc.bottomPadding; + + CGFloat startArg; + CGFloat endArg; + + if (self.rectangularEquation != nil) + { + startArg = 0 - selfWidth * self.coordinateSetting.origin.x; + if (self.coordinateSetting.isReverse) + { + if (self.coordinateSetting.isMath) + startArg = -1 * selfHeight *(1 - self.coordinateSetting.origin.y); + else + startArg = selfHeight *(0 - self.coordinateSetting.origin.y); + } + + if (self.coordinateSetting.start != -CGFLOAT_MAX) + startArg = self.coordinateSetting.start; + + endArg = selfWidth - selfWidth * self.coordinateSetting.origin.x; + if (self.coordinateSetting.isReverse) + { + if (self.coordinateSetting.isMath) + endArg = -1 * selfHeight *(0 - self.coordinateSetting.origin.y); + else + endArg = selfHeight *(1 - self.coordinateSetting.origin.y); + } + if (self.coordinateSetting.end != CGFLOAT_MAX) + endArg = self.coordinateSetting.end; + + [self myCalcPathPointsHelper:pathPointArray showPath:showPath pPathLen:pPathLen subviewCount:subviewCount pointIndexArray:pointIndexArray viewSpace:viewSpace startArg:startArg endArg:endArg func:^(CGFloat arg){ + + CGFloat val = self.rectangularEquation(arg); + if (!isnan(val)) + { + if (self.coordinateSetting.isReverse) + { + return CGPointMake(val + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -arg : arg) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + + } + else + { + return CGPointMake(arg + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -val : val) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + + } + } + else + return CGPointMake(NAN, NAN); + + }]; + } + else if (self.parametricEquation != nil) + { + startArg = 0 - selfWidth * self.coordinateSetting.origin.x; + if (self.coordinateSetting.isReverse) + { + if (self.coordinateSetting.isMath) + startArg = -1 * selfHeight *(1 - self.coordinateSetting.origin.y); + else + startArg = selfHeight *(0 - self.coordinateSetting.origin.y); + } + if (self.coordinateSetting.start != -CGFLOAT_MAX) + startArg = self.coordinateSetting.start; + + endArg = selfWidth - selfWidth * self.coordinateSetting.origin.x; + if (self.coordinateSetting.isReverse) + { + if (self.coordinateSetting.isMath) + endArg = -1 * selfHeight *(0 - self.coordinateSetting.origin.y); + else + endArg = selfHeight *(1 - self.coordinateSetting.origin.y); + } + if (self.coordinateSetting.end != CGFLOAT_MAX) + endArg = self.coordinateSetting.end; + + [self myCalcPathPointsHelper:pathPointArray showPath:showPath pPathLen:pPathLen subviewCount:subviewCount pointIndexArray:pointIndexArray viewSpace:viewSpace startArg:startArg endArg:endArg func:^(CGFloat arg){ + + CGPoint val = self.parametricEquation(arg); + if (!isnan(val.x) && !isnan(val.y)) + { + if (self.coordinateSetting.isReverse) + { + return CGPointMake(val.y + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -val.x : val.x) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + + } + else + { + return CGPointMake(val.x + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -val.y : val.y) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + } + } + else + return CGPointMake(NAN, NAN); + + }]; + + } + else if (self.polarEquation != nil) + { + + startArg = 0; + if (self.coordinateSetting.start != -CGFLOAT_MAX) + startArg = self.coordinateSetting.start * 180.0 / M_PI; + + endArg = 360; + if (self.coordinateSetting.end != CGFLOAT_MAX) + endArg = self.coordinateSetting.end * 180.0 / M_PI; + + + [self myCalcPathPointsHelper:pathPointArray showPath:showPath pPathLen:pPathLen subviewCount:subviewCount pointIndexArray:pointIndexArray viewSpace:viewSpace startArg:startArg endArg:endArg func:^(CGFloat arg){ + + //计算用弧度 + CGFloat r = self.polarEquation(arg * M_PI / 180.0); + if (!isnan(r)) + { + if (self.coordinateSetting.isReverse) + { + CGFloat y = r * cos(arg / 180.0 * M_PI); + + return CGPointMake(r * sin(arg / 180.0 * M_PI) + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -y : y) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + + } + else + { + + CGFloat y = r * sin(arg / 180 * M_PI); + + return CGPointMake(r * cos(arg / 180 * M_PI) + selfWidth * self.coordinateSetting.origin.x + lsc.leftPadding, + (self.coordinateSetting.isMath ? -y : y) + selfHeight * self.coordinateSetting.origin.y + lsc.topPadding); + } + } + else + return CGPointMake(NAN, NAN); + + }]; + + } + + return pathPointArray; +} + +-(NSArray*)myCalcPoints:(NSArray*)sbs path:(CGMutablePathRef)path pointIndexArray:(NSMutableArray*)pointIndexArray lsc:(MyPathLayout*)lsc +{ + if (sbs.count > 0) + { + if (self.spaceType.type != MyPathSpace_Fixed) + { + //如果间距不是固定的,那么要先算出路径的长度pathLen,以及是否是封闭曲线标志来算出每个子视图在曲线上的间距viewSpacing + + CGFloat pathLen = 0; //曲线的总长度 + NSArray *tempArray = [self myCalcPathPoints:path pPathLen:&pathLen subviewCount:-1 pointIndexArray:nil viewSpace:0 lsc:lsc]; + + //判断是否是封闭路径,方法为第一个路径点和最后一个之间的距离差小于1 + BOOL bClose = NO; + if (tempArray.count > 1) + { + CGPoint p1 = [tempArray.firstObject CGPointValue]; + CGPoint p2 = [tempArray.lastObject CGPointValue]; + bClose = [self myCalcDistance:p1 with:p2] <= 1; + + } + + + CGFloat viewSpace = 0; //每个视图之间的间距。 + NSInteger sbvcount = sbs.count; + if (self.spaceType.type == MyPathSpace_Count) //如果是固定数量则按固定数量来分配间距 + sbvcount = (NSInteger)self.spaceType.value; + + //总长度除视图数量得出子视图的间距。 + if (sbvcount > 1) + { + viewSpace = pathLen / (sbvcount - (bClose ? 0 : 1)); + } + + //有间距后再重新计算一遍 + return [self myCalcPathPoints:nil pPathLen:NULL subviewCount:sbs.count pointIndexArray:pointIndexArray viewSpace:viewSpace lsc:lsc]; + + } + else + { + return [self myCalcPathPoints:path pPathLen:NULL subviewCount:sbs.count pointIndexArray:pointIndexArray viewSpace:self.spaceType.value lsc:lsc]; + } + } + + return nil; + +} + + + + +@end + diff --git a/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.h b/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.h index 797bc8e..5457a82 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.h @@ -11,21 +11,23 @@ /** - *相对布局是一种里面的子视图通过相互之间的约束和依赖来进行布局和定位的布局视图。 - *相对布局里面的子视图的布局位置和添加的顺序无关,而是通过设置子视图的相对依赖关系来进行定位和布局的。 + 相对布局是一种里面的子视图通过相互之间的约束和依赖来进行布局和定位的布局视图。 + 相对布局里面的子视图的布局位置和添加的顺序无关,而是通过设置子视图的相对依赖关系来进行定位和布局的。 + 相对布局提供了和AutoLayout相似的能力。 */ @interface MyRelativeLayout : MyBaseLayout /** - *子视图调用widthDime.equalTo(NSArray均分宽度时当有子视图隐藏时是否参与宽度计算,这个属性只有在参与均分视图的子视图隐藏时才有效,默认是NO + *这个属性已经无效了,请使用子视图自身的扩展属性myVisibility属性来进行子视图的隐藏和显示的定制化处理。 */ -@property(nonatomic, assign) IBInspectable BOOL flexOtherViewWidthWhenSubviewHidden; +@property(nonatomic, assign) BOOL flexOtherViewWidthWhenSubviewHidden MYMETHODDEPRECATED("this property was invalid, please use subview's myVisibility to instead"); /** - *子视图调用heightDime.equalTo(NSArray均分高度时当有子视图隐藏时是否参与高度计算,这个属性只有在参与均分视图的子视图隐藏时才有效,默认是NO + *这个属性已经无效了,请使用子视图自身的扩展属性myVisibility属性来进行子视图的隐藏和显示的定制化处理。 */ -@property(nonatomic, assign) IBInspectable BOOL flexOtherViewHeightWhenSubviewHidden; +@property(nonatomic, assign) BOOL flexOtherViewHeightWhenSubviewHidden MYMETHODDEPRECATED("this property was invalid, please use subview's myVisibility to instead"); +; @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.m b/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.m index 094ea3c..9453072 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyRelativeLayout.m @@ -9,7 +9,7 @@ #import "MyRelativeLayout.h" #import "MyLayoutInner.h" -IB_DESIGNABLE + @implementation MyRelativeLayout /* @@ -23,39 +23,145 @@ - (void)drawRect:(CGRect)rect { -(void)setFlexOtherViewWidthWhenSubviewHidden:(BOOL)flexOtherViewWidthWhenSubviewHidden { - MyRelativeLayout *lsc = self.myCurrentSizeClass; - - if (lsc.flexOtherViewWidthWhenSubviewHidden != flexOtherViewWidthWhenSubviewHidden) - { - lsc.flexOtherViewWidthWhenSubviewHidden = flexOtherViewWidthWhenSubviewHidden; - [self setNeedsLayout]; - } + NSAssert(0, @"oops!, flexOtherViewWidthWhenSubviewHidden is invalid please use subview's myVisibility to instead!!!"); } -(BOOL)flexOtherViewWidthWhenSubviewHidden { - return self.myCurrentSizeClass.flexOtherViewWidthWhenSubviewHidden; + return NO; } -(void)setFlexOtherViewHeightWhenSubviewHidden:(BOOL)flexOtherViewHeightWhenSubviewHidden { + NSAssert(0, @"oops!, flexOtherViewHeightWhenSubviewHidden is invalid please use subview's myVisibility to instead!!!"); +} + +-(BOOL)flexOtherViewHeightWhenSubviewHidden +{ + return NO; +} + +#pragma mark -- Override Method + +-(CGSize)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass sbs:(NSMutableArray*)sbs +{ + CGSize selfSize = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass sbs:sbs]; + MyRelativeLayout *lsc = self.myCurrentSizeClass; - if (lsc.flexOtherViewHeightWhenSubviewHidden != flexOtherViewHeightWhenSubviewHidden) + + for (UIView *sbv in self.subviews) { - lsc.flexOtherViewHeightWhenSubviewHidden = flexOtherViewHeightWhenSubviewHidden; - [self setNeedsLayout]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + + if (sbvsc.useFrame) + continue; + + if (!isEstimate || (pHasSubLayout != nil && (*pHasSubLayout) == YES)) + [sbvmyFrame reset]; + + + if ([sbv isKindOfClass:[MyBaseLayout class]]) + { + + if (sbvsc.wrapContentWidth) + { + //只要同时设置了左右边距或者设置了宽度则应该把wrapContentWidth置为NO + if ((sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) || sbvsc.widthSizeInner.dimeVal != nil) + sbvsc.wrapContentWidth = NO; + } + + if (sbvsc.wrapContentHeight) + { + if ((sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) || sbvsc.heightSizeInner.dimeVal != nil) + sbvsc.wrapContentHeight = NO; + } + + if (pHasSubLayout != nil && (sbvsc.wrapContentHeight || sbvsc.wrapContentWidth)) + *pHasSubLayout = YES; + + if (isEstimate && (sbvsc.wrapContentWidth || sbvsc.wrapContentHeight)) + { + [(MyBaseLayout*)sbv estimateLayoutRect:sbvmyFrame.frame.size inSizeClass:sizeClass]; + + sbvmyFrame.leading = sbvmyFrame.trailing = sbvmyFrame.top = sbvmyFrame.bottom = CGFLOAT_MAX; + + if (sbvmyFrame.multiple) + { + sbvmyFrame.sizeClass = [sbv myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + sbvsc = sbvmyFrame.sizeClass; + } + } + } } + + + BOOL reCalc = NO; + CGSize maxSize = [self myCalcLayout:&reCalc lsc:lsc selfSize:selfSize]; + + if (lsc.wrapContentWidth || lsc.wrapContentHeight) + { + if (_myCGFloatNotEqual(selfSize.height, maxSize.height) || _myCGFloatNotEqual(selfSize.width, maxSize.width)) + { + + if (lsc.wrapContentWidth) + { + selfSize.width = maxSize.width; + } + + if (lsc.wrapContentHeight) + { + selfSize.height = maxSize.height; + } + + //如果里面有需要重新计算的就重新计算布局 + if (reCalc) + { + for (UIView *sbv in self.subviews) + { + MyFrame *sbvmyFrame = sbv.myFrame; + //如果是布局视图则不清除尺寸,其他清除。 + if (isEstimate && [sbv isKindOfClass:[MyBaseLayout class]]) + { + sbvmyFrame.leading = sbvmyFrame.trailing = sbvmyFrame.top = sbvmyFrame.bottom = CGFLOAT_MAX; + } + else + [sbvmyFrame reset]; + } + + [self myCalcLayout:NULL lsc:lsc selfSize:selfSize]; + } + } + + } + + + //调整布局视图自己的尺寸。 + [self myAdjustLayoutSelfSize:&selfSize lsc:lsc]; + + //如果是反向则调整所有子视图的左右位置。 + NSArray *sbs2 = [self myGetLayoutSubviews]; + + [self myAdjustSubviewsRTLPos:sbs2 selfWidth:selfSize.width]; + + return [self myAdjustSizeWhenNoSubviews:selfSize sbs:sbs2 lsc:lsc]; + } --(BOOL)flexOtherViewHeightWhenSubviewHidden +-(id)createSizeClassInstance { - return self.myCurrentSizeClass.flexOtherViewHeightWhenSubviewHidden; + return [MyRelativeLayoutViewSizeClass new]; } + #pragma mark -- Private Method --(void)calcSubViewLeftRight:(UIView*)sbv selfRect:(CGRect)selfRect +-(void)myCalcSubViewLeadingTrailing:(UIView*)sbv + sbvsc:(UIView*)sbvsc + lsc:(MyRelativeLayout*)lsc + sbvmyFrame:(MyFrame*)sbvmyFrame + selfSize:(CGSize)selfSize { @@ -80,286 +186,409 @@ -(void)calcSubViewLeftRight:(UIView*)sbv selfRect:(CGRect)selfRect //左右和宽度设置完毕。 - if ((sbv.absPos.leftPos != CGFLOAT_MAX && sbv.absPos.rightPos != CGFLOAT_MAX && sbv.absPos.width != CGFLOAT_MAX) || sbv.useFrame) + + if (sbvmyFrame.leading != CGFLOAT_MAX && sbvmyFrame.trailing != CGFLOAT_MAX && sbvmyFrame.width != CGFLOAT_MAX) return; //先检测宽度,如果宽度是父亲的宽度则宽度和左右都确定 - if ([self calcWidth:sbv selfRect:selfRect]) + if ([self myCalcWidth:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]) return; - if (sbv.centerXPos.posRelaVal != nil) + if (sbvsc.centerXPosInner.posRelaVal != nil) { - sbv.absPos.leftPos = [self calcSubView:sbv.centerXPos.posRelaVal.view gravity:sbv.centerXPos.posRelaVal.pos selfRect:selfRect] - sbv.absPos.width / 2 + sbv.centerXPos.margin; - sbv.absPos.rightPos = sbv.absPos.leftPos + sbv.absPos.width; - return; + UIView *relaView = sbvsc.centerXPosInner.posRelaVal.view; + + sbvmyFrame.leading = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.centerXPosInner.posRelaVal.pos selfSize:selfSize] - sbvmyFrame.width / 2 + sbvsc.centerXPosInner.absVal; + + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.leading -= sbvsc.centerXPosInner.absVal; + } + + if (sbvmyFrame.leading < 0 && relaView == self && lsc.wrapContentWidth) + sbvmyFrame.leading = 0; + + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; } - else if (sbv.centerXPos.posNumVal != nil) + else if (sbvsc.centerXPosInner.posNumVal != nil) { - sbv.absPos.leftPos = (selfRect.size.width - self.rightPadding - self.leftPadding - sbv.absPos.width) / 2 + self.leftPadding + sbv.centerXPos.margin; - sbv.absPos.rightPos = sbv.absPos.leftPos + sbv.absPos.width; - return; + sbvmyFrame.leading = (selfSize.width - lsc.leadingPadding - lsc.trailingPadding - sbvmyFrame.width) / 2 + lsc.leadingPadding + sbvsc.centerXPosInner.absVal; + + if (sbvmyFrame.leading < 0 && lsc.wrapContentWidth) + sbvmyFrame.leading = 0; + + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; } else { - if (sbv.leftPos.posRelaVal != nil) + //如果左右都设置了则上上面的calcWidth会直接返回不会进入这个流程。 + if (sbvsc.leadingPosInner.posRelaVal != nil) { - sbv.absPos.leftPos = [self calcSubView:sbv.leftPos.posRelaVal.view gravity:sbv.leftPos.posRelaVal.pos selfRect:selfRect] + sbv.leftPos.margin; - sbv.absPos.rightPos = sbv.absPos.leftPos + sbv.absPos.width; - return; + UIView *relaView = sbvsc.leadingPosInner.posRelaVal.view; + + sbvmyFrame.leading = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.leadingPosInner.posRelaVal.pos selfSize:selfSize] + sbvsc.leadingPosInner.absVal; + + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.leading -= sbvsc.leadingPosInner.absVal; + } + + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; } - else if (sbv.leftPos.posNumVal != nil) + else if (sbvsc.leadingPosInner.posNumVal != nil) { - sbv.absPos.leftPos = sbv.leftPos.margin + self.leftPadding; - sbv.absPos.rightPos = sbv.absPos.leftPos + sbv.absPos.width; - return; + sbvmyFrame.leading = sbvsc.leadingPosInner.absVal + lsc.leadingPadding; + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; } - - if (sbv.rightPos.posRelaVal != nil) + else if (sbvsc.trailingPosInner.posRelaVal != nil) { + UIView *relaView = sbvsc.trailingPosInner.posRelaVal.view; + + + sbvmyFrame.trailing = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.trailingPosInner.posRelaVal.pos selfSize:selfSize] - sbvsc.trailingPosInner.absVal + sbvsc.leadingPosInner.absVal; - sbv.absPos.rightPos = [self calcSubView:sbv.rightPos.posRelaVal.view gravity:sbv.rightPos.posRelaVal.pos selfRect:selfRect] - sbv.rightPos.margin + sbv.leftPos.margin; - sbv.absPos.leftPos = sbv.absPos.rightPos - sbv.absPos.width; + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.trailing += sbvsc.trailingPosInner.absVal; + } + + sbvmyFrame.leading = sbvmyFrame.trailing - sbvmyFrame.width; + + } + else if (sbvsc.trailingPosInner.posNumVal != nil) + { + sbvmyFrame.trailing = selfSize.width - lsc.trailingPadding - sbvsc.trailingPosInner.absVal + sbvsc.leadingPosInner.absVal; + sbvmyFrame.leading = sbvmyFrame.trailing - sbvmyFrame.width; + } + else + { - return; + sbvmyFrame.leading = sbvsc.leadingPosInner.absVal + lsc.leadingPadding; + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; + } + + } + + //这里要更新左边最小和右边最大约束的情况。 + MyLayoutPos *lBoundPos = sbvsc.leadingPosInner.lBoundValInner; + MyLayoutPos *uBoundPos = sbvsc.trailingPosInner.uBoundValInner; + + if (lBoundPos.posRelaVal != nil && uBoundPos.posRelaVal != nil) + { + //让宽度缩小并在最小和最大的中间排列。 + CGFloat minLeading = [self myCalcSubView:lBoundPos.posRelaVal.view lsc:lsc gravity:lBoundPos.posRelaVal.pos selfSize:selfSize] + lBoundPos.offsetVal; + + CGFloat maxTrailing = [self myCalcSubView:uBoundPos.posRelaVal.view lsc:lsc gravity:uBoundPos.posRelaVal.pos selfSize:selfSize] - uBoundPos.offsetVal; + + //用maxRight减去minLeft得到的宽度再减去视图的宽度,然后让其居中。。如果宽度超过则缩小视图的宽度。 + CGFloat intervalWidth = maxTrailing - minLeading; + if (intervalWidth < sbvmyFrame.width) + { + sbvmyFrame.width = intervalWidth; + sbvmyFrame.leading = minLeading; } - else if (sbv.rightPos.posNumVal != nil) + else { - sbv.absPos.rightPos = selfRect.size.width - self.rightPadding - sbv.rightPos.margin + sbv.leftPos.margin; - sbv.absPos.leftPos = sbv.absPos.rightPos - sbv.absPos.width; - return; + sbvmyFrame.leading = (intervalWidth - sbvmyFrame.width) / 2 + minLeading; } - sbv.absPos.leftPos = sbv.leftPos.margin + self.leftPadding; - sbv.absPos.rightPos = sbv.absPos.leftPos + sbv.absPos.width; + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; + } + else if (lBoundPos.posRelaVal != nil) + { + //得到左边的最小位置。如果当前的左边距小于这个位置则缩小视图的宽度。 + CGFloat minLeading = [self myCalcSubView:lBoundPos.posRelaVal.view lsc:lsc gravity:lBoundPos.posRelaVal.pos selfSize:selfSize] + lBoundPos.offsetVal; + + + if (sbvmyFrame.leading < minLeading) + { + sbvmyFrame.leading = minLeading; + sbvmyFrame.width = sbvmyFrame.trailing - sbvmyFrame.leading; + } + } + else if (uBoundPos.posRelaVal != nil) + { + //得到右边的最大位置。如果当前的右边距大于了这个位置则缩小视图的宽度。 + CGFloat maxTrailing = [self myCalcSubView:uBoundPos.posRelaVal.view lsc:lsc gravity:uBoundPos.posRelaVal.pos selfSize:selfSize] - uBoundPos.offsetVal; + + if (sbvmyFrame.trailing > maxTrailing) + { + sbvmyFrame.trailing = maxTrailing; + sbvmyFrame.width = sbvmyFrame.trailing - sbvmyFrame.leading; + } + } + } --(void)calcSubViewTopBottom:(UIView*)sbv selfRect:(CGRect)selfRect +-(void)myCalcSubViewTopBottom:(UIView*)sbv sbvsc:(UIView*)sbvsc lsc:(MyRelativeLayout*)lsc sbvmyFrame:(MyFrame*)sbvmyFrame selfSize:(CGSize)selfSize { - if (sbv.useFrame || (sbv.absPos.topPos != CGFLOAT_MAX && sbv.absPos.bottomPos != CGFLOAT_MAX && sbv.absPos.height != CGFLOAT_MAX)) + + + if (sbvmyFrame.top != CGFLOAT_MAX && sbvmyFrame.bottom != CGFLOAT_MAX && sbvmyFrame.height != CGFLOAT_MAX) return; //先检测宽度,如果宽度是父亲的宽度则宽度和左右都确定 - if ([self calcHeight:sbv selfRect:selfRect]) + if ([self myCalcHeight:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]) return; - if (sbv.centerYPos.posRelaVal != nil) + if (sbvsc.centerYPosInner.posRelaVal != nil) { - sbv.absPos.topPos = [self calcSubView:sbv.centerYPos.posRelaVal.view gravity:sbv.centerYPos.posRelaVal.pos selfRect:selfRect] - sbv.absPos.height / 2 + sbv.centerYPos.margin; - sbv.absPos.bottomPos = sbv.absPos.topPos + sbv.absPos.height; - return; + UIView *relaView = sbvsc.centerYPosInner.posRelaVal.view; + + sbvmyFrame.top = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.centerYPosInner.posRelaVal.pos selfSize:selfSize] - sbvmyFrame.height / 2 + sbvsc.centerYPosInner.absVal; + + + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.top -= sbvsc.centerYPosInner.absVal; + } + + if (sbvmyFrame.top < 0 && relaView == self && lsc.wrapContentHeight) + sbvmyFrame.top = 0; + + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; } - else if (sbv.centerYPos.posNumVal != nil) + else if (sbvsc.centerYPosInner.posNumVal != nil) { - sbv.absPos.topPos = (selfRect.size.height - self.topPadding - self.bottomPadding - sbv.absPos.height) / 2 + self.topPadding + sbv.centerYPos.margin; - sbv.absPos.bottomPos = sbv.absPos.topPos + sbv.absPos.height; - return; + sbvmyFrame.top = (selfSize.height - lsc.topPadding - lsc.bottomPadding - sbvmyFrame.height) / 2 + lsc.topPadding + sbvsc.centerYPosInner.absVal; + + if (sbvmyFrame.top < 0 && lsc.wrapContentHeight) + sbvmyFrame.top = 0; + + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; } else { - if (sbv.topPos.posRelaVal != nil) + if (sbvsc.topPosInner.posRelaVal != nil) { - sbv.absPos.topPos = [self calcSubView:sbv.topPos.posRelaVal.view gravity:sbv.topPos.posRelaVal.pos selfRect:selfRect] + sbv.topPos.margin; - sbv.absPos.bottomPos = sbv.absPos.topPos + sbv.absPos.height; - return; + UIView *relaView = sbvsc.topPosInner.posRelaVal.view; + + sbvmyFrame.top = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.topPosInner.posRelaVal.pos selfSize:selfSize] + sbvsc.topPosInner.absVal; + + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.top -= sbvsc.topPosInner.absVal; + } + + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; } - else if (sbv.topPos.posNumVal != nil) + else if (sbvsc.topPosInner.posNumVal != nil) { - sbv.absPos.topPos = sbv.topPos.margin; - sbv.absPos.bottomPos = sbv.absPos.topPos + sbv.absPos.height; - return; + sbvmyFrame.top = sbvsc.topPosInner.absVal + lsc.topPadding; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; } - - if (sbv.bottomPos.posRelaVal != nil) + else if (sbvsc.bottomPosInner.posRelaVal != nil) { + UIView *relaView = sbvsc.bottomPosInner.posRelaVal.view; + + sbvmyFrame.bottom = [self myCalcSubView:relaView lsc:lsc gravity:sbvsc.bottomPosInner.posRelaVal.pos selfSize:selfSize] - sbvsc.bottomPosInner.absVal + sbvsc.topPosInner.absVal; + + if (relaView != nil && relaView != self && [self myIsNoLayoutSubview:relaView]) + { + sbvmyFrame.bottom += sbvsc.bottomPosInner.absVal; + } - sbv.absPos.bottomPos = [self calcSubView:sbv.bottomPos.posRelaVal.view gravity:sbv.bottomPos.posRelaVal.pos selfRect:selfRect] - sbv.bottomPos.margin + sbv.topPos.margin; - sbv.absPos.topPos = sbv.absPos.bottomPos - sbv.absPos.height; + sbvmyFrame.top = sbvmyFrame.bottom - sbvmyFrame.height; - return; } - else if (sbv.bottomPos.posNumVal != nil) + else if (sbvsc.bottomPosInner.posNumVal != nil) + { + if (selfSize.height == 0 && lsc.wrapContentHeight) + { + sbvmyFrame.top = lsc.topPadding; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; + } + else + { + + sbvmyFrame.bottom = selfSize.height - sbvsc.bottomPosInner.absVal - lsc.bottomPadding + sbvsc.topPosInner.absVal; + sbvmyFrame.top = sbvmyFrame.bottom - sbvmyFrame.height; + } + } + else + { + sbvmyFrame.top = sbvsc.topPosInner.absVal + lsc.topPadding; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; + } + } + + //这里要更新上边最小和下边最大约束的情况。 + if (sbvsc.topPosInner.lBoundValInner.posRelaVal != nil && sbvsc.bottomPosInner.uBoundValInner.posRelaVal != nil) + { + //让宽度缩小并在最小和最大的中间排列。 + CGFloat minTop = [self myCalcSubView:sbvsc.topPosInner.lBoundValInner.posRelaVal.view lsc:lsc gravity:sbvsc.topPosInner.lBoundValInner.posRelaVal.pos selfSize:selfSize] + sbvsc.topPosInner.lBoundValInner.offsetVal; + + CGFloat maxBottom = [self myCalcSubView:sbvsc.bottomPosInner.uBoundValInner.posRelaVal.view lsc:lsc gravity:sbvsc.bottomPosInner.uBoundValInner.posRelaVal.pos selfSize:selfSize] - sbvsc.bottomPosInner.uBoundValInner.offsetVal; + + //用maxRight减去minLeft得到的宽度再减去视图的宽度,然后让其居中。。如果宽度超过则缩小视图的宽度。 + if (maxBottom - minTop < sbvmyFrame.height) + { + sbvmyFrame.height = maxBottom - minTop; + sbvmyFrame.top = minTop; + } + else { - sbv.absPos.bottomPos = selfRect.size.height - sbv.bottomPos.margin - self.bottomPadding + sbv.topPos.margin; - sbv.absPos.topPos = sbv.absPos.bottomPos - sbv.absPos.height; - return; + sbvmyFrame.top = (maxBottom - minTop - sbvmyFrame.height) / 2 + minTop; } - sbv.absPos.topPos = sbv.topPos.margin + self.topPadding; - sbv.absPos.bottomPos = sbv.absPos.topPos + sbv.absPos.height; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; + + + } + else if (sbvsc.topPosInner.lBoundValInner.posRelaVal != nil) + { + //得到左边的最小位置。如果当前的左边距小于这个位置则缩小视图的宽度。 + CGFloat minTop = [self myCalcSubView:sbvsc.topPosInner.lBoundValInner.posRelaVal.view lsc:lsc gravity:sbvsc.topPosInner.lBoundValInner.posRelaVal.pos selfSize:selfSize] + sbvsc.topPosInner.lBoundValInner.offsetVal; + + if (sbvmyFrame.top < minTop) + { + sbvmyFrame.top = minTop; + sbvmyFrame.height = sbvmyFrame.bottom - sbvmyFrame.top; + } + + } + else if (sbvsc.bottomPosInner.uBoundValInner.posRelaVal != nil) + { + //得到右边的最大位置。如果当前的右边距大于了这个位置则缩小视图的宽度。 + CGFloat maxBottom = [self myCalcSubView:sbvsc.bottomPosInner.uBoundValInner.posRelaVal.view lsc:lsc gravity:sbvsc.bottomPosInner.uBoundValInner.posRelaVal.pos selfSize:selfSize] - sbvsc.bottomPosInner.uBoundValInner.offsetVal; + if (sbvmyFrame.bottom > maxBottom) + { + sbvmyFrame.bottom = maxBottom; + sbvmyFrame.height = sbvmyFrame.bottom - sbvmyFrame.top; + } } + } --(CGFloat)calcSubView:(UIView*)sbv gravity:(MyMarginGravity)gravity selfRect:(CGRect)selfRect +-(CGFloat)myCalcSubView:(UIView*)sbv lsc:(MyRelativeLayout*)lsc gravity:(MyGravity)gravity selfSize:(CGSize)selfSize { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + switch (gravity) { - case MyMarginGravity_Horz_Left: + case MyGravity_Horz_Leading: { if (sbv == self || sbv == nil) - return self.leftPadding; - + return lsc.leadingPadding; - if (sbv.absPos.leftPos != CGFLOAT_MAX) - return sbv.absPos.leftPos - ((sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) ? sbv.leftPos.margin : 0); + if (sbvmyFrame.leading != CGFLOAT_MAX) + return sbvmyFrame.leading; - [self calcSubViewLeftRight:sbv selfRect:selfRect]; + [self myCalcSubViewLeadingTrailing:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - return sbv.absPos.leftPos - ((sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) ? sbv.leftPos.margin : 0); + return sbvmyFrame.leading; } break; - case MyMarginGravity_Horz_Right: + case MyGravity_Horz_Trailing: { if (sbv == self || sbv == nil) - return selfRect.size.width - self.rightPadding; - - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - { - if (sbv.absPos.leftPos != CGFLOAT_MAX) - return sbv.absPos.leftPos - sbv.leftPos.margin; - - [self calcSubViewLeftRight:sbv selfRect:selfRect]; - - return sbv.absPos.leftPos - sbv.leftPos.margin; - } + return selfSize.width - lsc.trailingPadding; + if (sbvmyFrame.trailing != CGFLOAT_MAX) + return sbvmyFrame.trailing; - if (sbv.absPos.rightPos != CGFLOAT_MAX) - return sbv.absPos.rightPos; + [self myCalcSubViewLeadingTrailing:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - [self calcSubViewLeftRight:sbv selfRect:selfRect]; - - return sbv.absPos.rightPos; + return sbvmyFrame.trailing; } break; - case MyMarginGravity_Vert_Top: + case MyGravity_Vert_Top: { if (sbv == self || sbv == nil) - return self.topPadding; + return lsc.topPadding; - if (sbv.absPos.topPos != CGFLOAT_MAX) - return sbv.absPos.topPos - ((sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) ? sbv.topPos.margin : 0); + if (sbvmyFrame.top != CGFLOAT_MAX) + return sbvmyFrame.top; - [self calcSubViewTopBottom:sbv selfRect:selfRect]; + [self myCalcSubViewTopBottom:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - return sbv.absPos.topPos - ((sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) ? sbv.topPos.margin : 0); + return sbvmyFrame.top; } break; - case MyMarginGravity_Vert_Bottom: + case MyGravity_Vert_Bottom: { if (sbv == self || sbv == nil) - return selfRect.size.height - self.bottomPadding; - - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - { - if (sbv.absPos.topPos != CGFLOAT_MAX) - return sbv.absPos.topPos - sbv.topPos.margin; - - [self calcSubViewTopBottom:sbv selfRect:selfRect]; - - return sbv.absPos.topPos - sbv.topPos.margin; - } + return selfSize.height - lsc.bottomPadding; + if (sbvmyFrame.bottom != CGFLOAT_MAX) + return sbvmyFrame.bottom; - if (sbv.absPos.bottomPos != CGFLOAT_MAX) - return sbv.absPos.bottomPos; + [self myCalcSubViewTopBottom:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - [self calcSubViewTopBottom:sbv selfRect:selfRect]; - - return sbv.absPos.bottomPos; + return sbvmyFrame.bottom; } break; - case MyMarginGravity_Horz_Fill: + case MyGravity_Horz_Fill: { if (sbv == self || sbv == nil) - return selfRect.size.width - self.leftPadding - self.rightPadding; + return selfSize.width - lsc.leadingPadding - lsc.trailingPadding; - if (sbv.absPos.width != CGFLOAT_MAX) - return sbv.absPos.width; + if (sbvmyFrame.width != CGFLOAT_MAX) + return sbvmyFrame.width; - [self calcSubViewLeftRight:sbv selfRect:selfRect]; + [self myCalcSubViewLeadingTrailing:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - return sbv.absPos.width; + return sbvmyFrame.width; } break; - case MyMarginGravity_Vert_Fill: + case MyGravity_Vert_Fill: { if (sbv == self || sbv == nil) - return selfRect.size.height - self.topPadding - self.bottomPadding; + return selfSize.height - lsc.topPadding - lsc.bottomPadding; - if (sbv.absPos.height != CGFLOAT_MAX) - return sbv.absPos.height; + if (sbvmyFrame.height != CGFLOAT_MAX) + return sbvmyFrame.height; - [self calcSubViewTopBottom:sbv selfRect:selfRect]; + [self myCalcSubViewTopBottom:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - return sbv.absPos.height; + return sbvmyFrame.height; } break; - case MyMarginGravity_Horz_Center: + case MyGravity_Horz_Center: { if (sbv == self || sbv == nil) - return (selfRect.size.width - self.leftPadding - self.rightPadding) / 2 + self.leftPadding; - - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - { - if (sbv.absPos.leftPos != CGFLOAT_MAX) - return sbv.absPos.leftPos - sbv.leftPos.margin; - - [self calcSubViewLeftRight:sbv selfRect:selfRect]; - - return sbv.absPos.leftPos - sbv.leftPos.margin; - } + return (selfSize.width - lsc.leadingPadding - lsc.trailingPadding) / 2 + lsc.leadingPadding; + if (sbvmyFrame.leading != CGFLOAT_MAX && sbvmyFrame.trailing != CGFLOAT_MAX && sbvmyFrame.width != CGFLOAT_MAX) + return sbvmyFrame.leading + sbvmyFrame.width / 2; - if (sbv.absPos.leftPos != CGFLOAT_MAX && sbv.absPos.rightPos != CGFLOAT_MAX && sbv.absPos.width != CGFLOAT_MAX) - return sbv.absPos.leftPos + sbv.absPos.width / 2; + [self myCalcSubViewLeadingTrailing:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - [self calcSubViewLeftRight:sbv selfRect:selfRect]; - - return sbv.absPos.leftPos + sbv.absPos.width / 2; + return sbvmyFrame.leading + sbvmyFrame.width / 2; } break; - case MyMarginGravity_Vert_Center: + case MyGravity_Vert_Center: { if (sbv == self || sbv == nil) - return (selfRect.size.height - self.topPadding - self.bottomPadding) / 2 + self.topPadding; - - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - { - if (sbv.absPos.topPos != CGFLOAT_MAX) - return sbv.absPos.topPos - sbv.topPos.margin; - - [self calcSubViewTopBottom:sbv selfRect:selfRect]; - - return sbv.absPos.topPos - sbv.topPos.margin; - } + return (selfSize.height - lsc.topPadding - lsc.bottomPadding) / 2 + lsc.topPadding; + if (sbvmyFrame.top != CGFLOAT_MAX && sbvmyFrame.bottom != CGFLOAT_MAX && sbvmyFrame.height != CGFLOAT_MAX) + return sbvmyFrame.top + sbvmyFrame.height / 2; - if (sbv.absPos.topPos != CGFLOAT_MAX && sbv.absPos.bottomPos != CGFLOAT_MAX && sbv.absPos.height != CGFLOAT_MAX) - return sbv.absPos.topPos + sbv.absPos.height / 2; + [self myCalcSubViewTopBottom:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - [self calcSubViewTopBottom:sbv selfRect:selfRect]; - - return sbv.absPos.topPos + sbv.absPos.height / 2; + return sbvmyFrame.top + sbvmyFrame.height / 2; } break; default: @@ -370,98 +599,125 @@ -(CGFloat)calcSubView:(UIView*)sbv gravity:(MyMarginGravity)gravity selfRect:(CG } --(BOOL)calcWidth:(UIView*)sbv selfRect:(CGRect)selfRect +-(BOOL)myCalcWidth:(UIView*)sbv sbvsc:(UIView*)sbvsc lsc:(MyRelativeLayout*)lsc sbvmyFrame:(MyFrame*)sbvmyFrame selfSize:(CGSize)selfSize { - if (sbv.absPos.width == CGFLOAT_MAX) + + if (sbvmyFrame.width == CGFLOAT_MAX) { - if (sbv.widthDime.dimeRelaVal != nil) + + if (sbvsc.widthSizeInner.dimeRelaVal != nil) { - sbv.absPos.width = [self calcSubView:sbv.widthDime.dimeRelaVal.view gravity:sbv.widthDime.dimeRelaVal.dime selfRect:selfRect] * sbv.widthDime.mutilVal + sbv.widthDime.addVal; + sbvmyFrame.width = [sbvsc.widthSizeInner measureWith:[self myCalcSubView:sbvsc.widthSizeInner.dimeRelaVal.view lsc:lsc gravity:sbvsc.widthSizeInner.dimeRelaVal.dime selfSize:selfSize] ]; - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } - else if (sbv.widthDime.dimeNumVal != nil) + else if (sbvsc.widthSizeInner.dimeNumVal != nil) { - sbv.absPos.width = sbv.widthDime.dimeNumVal.doubleValue * sbv.widthDime.mutilVal + sbv.widthDime.addVal; - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = sbvsc.widthSizeInner.measure; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } else; + if ([self myIsNoLayoutSubview:sbv]) + { + sbvmyFrame.width = 0; + } - if (sbv.leftPos.posVal != nil && sbv.rightPos.posVal != nil) + if (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) { - if (sbv.leftPos.posRelaVal != nil) - sbv.absPos.leftPos = [self calcSubView:sbv.leftPos.posRelaVal.view gravity:sbv.leftPos.posRelaVal.pos selfRect:selfRect] + sbv.leftPos.margin; + if (sbvsc.leadingPosInner.posRelaVal != nil) + sbvmyFrame.leading = [self myCalcSubView:sbvsc.leadingPosInner.posRelaVal.view lsc:lsc gravity:sbvsc.leadingPosInner.posRelaVal.pos selfSize:selfSize] + sbvsc.leadingPosInner.absVal; else - sbv.absPos.leftPos = sbv.leftPos.margin + self.leftPadding; + sbvmyFrame.leading = sbvsc.leadingPosInner.absVal + lsc.leadingPadding; - if (sbv.rightPos.posRelaVal != nil) - sbv.absPos.rightPos = [self calcSubView:sbv.rightPos.posRelaVal.view gravity:sbv.rightPos.posRelaVal.pos selfRect:selfRect] - sbv.rightPos.margin; + if (sbvsc.trailingPosInner.posRelaVal != nil) + sbvmyFrame.trailing = [self myCalcSubView:sbvsc.trailingPosInner.posRelaVal.view lsc:lsc gravity:sbvsc.trailingPosInner.posRelaVal.pos selfSize:selfSize] - sbvsc.trailingPosInner.absVal; else - sbv.absPos.rightPos = selfRect.size.width - sbv.rightPos.margin - self.rightPadding; + sbvmyFrame.trailing = selfSize.width - sbvsc.trailingPosInner.absVal - lsc.trailingPadding; + + sbvmyFrame.width = sbvmyFrame.trailing - sbvmyFrame.leading; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + + if ([self myIsNoLayoutSubview:sbv]) + { + sbvmyFrame.width = 0; + sbvmyFrame.trailing = sbvmyFrame.leading + sbvmyFrame.width; + } - sbv.absPos.width = sbv.absPos.rightPos - sbv.absPos.leftPos; - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; return YES; } - if (sbv.absPos.width == CGFLOAT_MAX) + if (sbvmyFrame.width == CGFLOAT_MAX) { - sbv.absPos.width = sbv.frame.size.width; - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = CGRectGetWidth(sbv.bounds); + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } } - if (sbv.widthDime.lBoundVal.dimeNumVal.doubleValue != -CGFLOAT_MAX || sbv.widthDime.uBoundVal.dimeNumVal.doubleValue != CGFLOAT_MAX) + if ((sbvsc.widthSizeInner.lBoundValInner != nil && sbvsc.widthSizeInner.lBoundValInner.dimeNumVal.doubleValue != -CGFLOAT_MAX) || + (sbvsc.widthSizeInner.uBoundValInner != nil && sbvsc.widthSizeInner.uBoundValInner.dimeNumVal.doubleValue != CGFLOAT_MAX) ) { - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } - + return NO; } --(BOOL)calcHeight:(UIView*)sbv selfRect:(CGRect)selfRect +-(BOOL)myCalcHeight:(UIView*)sbv sbvsc:(UIView*)sbvsc lsc:(MyRelativeLayout*)lsc sbvmyFrame:(MyFrame*)sbvmyFrame selfSize:(CGSize)selfSize { - if (sbv.absPos.height == CGFLOAT_MAX) + + if (sbvmyFrame.height == CGFLOAT_MAX) { - if (sbv.heightDime.dimeRelaVal != nil) + if (sbvsc.heightSizeInner.dimeRelaVal != nil) { - sbv.absPos.height = [self calcSubView:sbv.heightDime.dimeRelaVal.view gravity:sbv.heightDime.dimeRelaVal.dime selfRect:selfRect] * sbv.heightDime.mutilVal + sbv.heightDime.addVal; + sbvmyFrame.height = [sbvsc.heightSizeInner measureWith:[self myCalcSubView:sbvsc.heightSizeInner.dimeRelaVal.view lsc:lsc gravity:sbvsc.heightSizeInner.dimeRelaVal.dime selfSize:selfSize] ]; - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } - else if (sbv.heightDime.dimeNumVal != nil) + else if (sbvsc.heightSizeInner.dimeNumVal != nil) { - sbv.absPos.height = sbv.heightDime.dimeNumVal.doubleValue * sbv.heightDime.mutilVal + sbv.heightDime.addVal; - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = sbvsc.heightSizeInner.measure; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } else; - if (sbv.topPos.posVal != nil && sbv.bottomPos.posVal != nil) + if ([self myIsNoLayoutSubview:sbv]) { - if (sbv.topPos.posRelaVal != nil) - sbv.absPos.topPos = [self calcSubView:sbv.topPos.posRelaVal.view gravity:sbv.topPos.posRelaVal.pos selfRect:selfRect] + sbv.topPos.margin; + sbvmyFrame.height = 0; + } + + + if (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) + { + if (sbvsc.topPosInner.posRelaVal != nil) + sbvmyFrame.top = [self myCalcSubView:sbvsc.topPosInner.posRelaVal.view lsc:lsc gravity:sbvsc.topPosInner.posRelaVal.pos selfSize:selfSize] + sbvsc.topPosInner.absVal; else - sbv.absPos.topPos = sbv.topPos.margin + self.topPadding; + sbvmyFrame.top = sbvsc.topPosInner.absVal + lsc.topPadding; - if (sbv.bottomPos.posRelaVal != nil) - sbv.absPos.bottomPos = [self calcSubView:sbv.bottomPos.posRelaVal.view gravity:sbv.bottomPos.posRelaVal.pos selfRect:selfRect] - sbv.bottomPos.margin; + if (sbvsc.bottomPosInner.posRelaVal != nil) + sbvmyFrame.bottom = [self myCalcSubView:sbvsc.bottomPosInner.posRelaVal.view lsc:lsc gravity:sbvsc.bottomPosInner.posRelaVal.pos selfSize:selfSize] - sbvsc.bottomPosInner.absVal; else - sbv.absPos.bottomPos = selfRect.size.height - sbv.bottomPos.margin - self.bottomPadding; + sbvmyFrame.bottom = selfSize.height - sbvsc.bottomPosInner.absVal - lsc.bottomPadding; + + sbvmyFrame.height = sbvmyFrame.bottom - sbvmyFrame.top; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; - sbv.absPos.height = sbv.absPos.bottomPos - sbv.absPos.topPos; - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + if ([self myIsNoLayoutSubview:sbv]) + { + sbvmyFrame.height = 0; + sbvmyFrame.bottom = sbvmyFrame.top + sbvmyFrame.height; + } return YES; @@ -469,16 +725,28 @@ -(BOOL)calcHeight:(UIView*)sbv selfRect:(CGRect)selfRect } - if (sbv.absPos.height == CGFLOAT_MAX) + if (sbvmyFrame.height == CGFLOAT_MAX) { - sbv.absPos.height = sbv.frame.size.height; - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = CGRectGetHeight(sbv.bounds); + + if (sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]] && ![self myIsNoLayoutSubview:sbv]) + { + if (sbvmyFrame.width == CGFLOAT_MAX) + [self myCalcWidth:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; + + sbvmyFrame.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:sbvmyFrame.width]; + } + + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; + + } } - if (sbv.heightDime.lBoundVal.dimeNumVal.doubleValue != -CGFLOAT_MAX || sbv.heightDime.uBoundVal.dimeNumVal.doubleValue != CGFLOAT_MAX) + if ( (sbvsc.heightSizeInner.lBoundValInner != nil && sbvsc.heightSizeInner.lBoundValInner.dimeNumVal.doubleValue != -CGFLOAT_MAX) || + (sbvsc.heightSizeInner.uBoundValInner != nil && sbvsc.heightSizeInner.uBoundValInner.dimeNumVal.doubleValue != CGFLOAT_MAX)) { - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } return NO; @@ -486,44 +754,65 @@ -(BOOL)calcHeight:(UIView*)sbv selfRect:(CGRect)selfRect } --(CGSize)calcLayout:(BOOL*)pRecalc selfRect:(CGRect)selfRect +-(CGSize)myCalcLayout:(BOOL*)pRecalc lsc:(MyRelativeLayout*)lsc selfSize:(CGSize)selfSize { - *pRecalc = NO; + if (pRecalc != NULL) + *pRecalc = NO; //遍历所有子视图,算出所有宽度和高度根据自身内容确定的子视图的尺寸.以及计算出那些有依赖关系的尺寸限制。。。 for (UIView *sbv in self.subviews) { - [self calcSizeOfWrapContentSubview:sbv]; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; - if (sbv.absPos.width != CGFLOAT_MAX) + + [self myCalcSizeOfWrapContentSubview:sbv sbvsc:sbvsc sbvmyFrame:sbvmyFrame selfLayoutSize:selfSize]; + + if (sbvmyFrame.width != CGFLOAT_MAX) { - if (sbv.widthDime.uBoundVal.dimeRelaVal != nil && sbv.widthDime.uBoundVal.dimeRelaVal.view != self) + if (sbvsc.widthSizeInner.uBoundValInner.dimeRelaVal != nil && sbvsc.widthSizeInner.uBoundValInner.dimeRelaVal.view != self) { - [self calcWidth:sbv.widthDime.uBoundVal.dimeRelaVal.view selfRect:selfRect]; + [self myCalcWidth:sbvsc.widthSizeInner.uBoundValInner.dimeRelaVal.view + sbvsc:sbvsc.widthSizeInner.uBoundValInner.dimeRelaVal.view.myCurrentSizeClass + lsc:lsc + sbvmyFrame:sbvsc.widthSizeInner.uBoundValInner.dimeRelaVal.view.myFrame + selfSize:selfSize]; } - if (sbv.widthDime.lBoundVal.dimeRelaVal != nil && sbv.widthDime.lBoundVal.dimeRelaVal.view != self) + if (sbvsc.widthSizeInner.lBoundValInner.dimeRelaVal != nil && sbvsc.widthSizeInner.lBoundValInner.dimeRelaVal.view != self) { - [self calcWidth:sbv.widthDime.lBoundVal.dimeRelaVal.view selfRect:selfRect]; + [self myCalcWidth:sbvsc.widthSizeInner.lBoundValInner.dimeRelaVal.view + sbvsc:sbvsc.widthSizeInner.lBoundValInner.dimeRelaVal.view.myCurrentSizeClass + lsc:lsc + sbvmyFrame:sbvsc.widthSizeInner.lBoundValInner.dimeRelaVal.view.myFrame + selfSize:selfSize]; } - [self validMeasure:sbv.widthDime sbv:sbv calcSize:sbv.absPos.width sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:sbvmyFrame.width sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } - if (sbv.absPos.height != CGFLOAT_MAX) + if (sbvmyFrame.height != CGFLOAT_MAX) { - if (sbv.heightDime.uBoundVal.dimeRelaVal != nil && sbv.heightDime.uBoundVal.dimeRelaVal.view != self) + if (sbvsc.heightSizeInner.uBoundValInner.dimeRelaVal != nil && sbvsc.heightSizeInner.uBoundValInner.dimeRelaVal.view != self) { - [self calcHeight:sbv.heightDime.uBoundVal.dimeRelaVal.view selfRect:selfRect]; + [self myCalcHeight:sbvsc.heightSizeInner.uBoundValInner.dimeRelaVal.view + sbvsc:sbvsc.heightSizeInner.uBoundValInner.dimeRelaVal.view.myCurrentSizeClass + lsc:lsc + sbvmyFrame:sbvsc.heightSizeInner.uBoundValInner.dimeRelaVal.view.myFrame + selfSize:selfSize]; } - if (sbv.heightDime.lBoundVal.dimeRelaVal != nil && sbv.heightDime.lBoundVal.dimeRelaVal.view != self) + if (sbvsc.heightSizeInner.lBoundValInner.dimeRelaVal != nil && sbvsc.heightSizeInner.lBoundValInner.dimeRelaVal.view != self) { - [self calcHeight:sbv.heightDime.lBoundVal.dimeRelaVal.view selfRect:selfRect]; + [self myCalcHeight:sbvsc.heightSizeInner.lBoundValInner.dimeRelaVal.view + sbvsc:sbvsc.heightSizeInner.lBoundValInner.dimeRelaVal.view.myCurrentSizeClass + lsc:lsc + sbvmyFrame:sbvsc.heightSizeInner.lBoundValInner.dimeRelaVal.view.myFrame + selfSize:selfSize]; } - [self validMeasure:sbv.heightDime sbv:sbv calcSize:sbv.absPos.height sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } } @@ -531,366 +820,384 @@ -(CGSize)calcLayout:(BOOL*)pRecalc selfRect:(CGRect)selfRect //均分宽度和高度。把这部分提出来是为了实现不管数组是哪个视图指定都可以。 for (UIView *sbv in self.subviews) { + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; - if (sbv.widthDime.dimeArrVal != nil) + if (sbvsc.widthSizeInner.dimeArrVal != nil) { - *pRecalc = YES; - - NSArray *arr = sbv.widthDime.dimeArrVal; + if (pRecalc != NULL) + *pRecalc = YES; - BOOL ok1 = sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout && self.flexOtherViewWidthWhenSubviewHidden) || sbv.absPos.sizeClass.isHidden; + NSArray *dimeArray = sbvsc.widthSizeInner.dimeArrVal; - - CGFloat totalMutil = ok1 ? 0 : sbv.widthDime.mutilVal; - CGFloat totalAdd = ok1 ? 0 : sbv.widthDime.addVal; - for (MyLayoutDime *d in arr) + BOOL isViewHidden = [self myIsNoLayoutSubview:sbv]; + CGFloat totalMulti = isViewHidden ? 0 : sbvsc.widthSizeInner.multiVal; + CGFloat totalAdd = isViewHidden ? 0 : sbvsc.widthSizeInner.addVal; + for (MyLayoutSize *dime in dimeArray) { - BOOL ok = d.view.useFrame || (d.view.isHidden && self.hideSubviewReLayout && self.flexOtherViewWidthWhenSubviewHidden) || d.view.absPos.sizeClass.isHidden; - if (!ok) + if (dime.isActive) { - if (d.dimeNumVal != nil) - totalAdd += -1 * d.dimeNumVal.doubleValue; - else if (d.dimeSelfVal != nil) + isViewHidden = [self myIsNoLayoutSubview:dime.view]; + if (!isViewHidden) { - totalAdd += -1 * d.view.absPos.width; + if (dime.dimeNumVal != nil) + totalAdd += -1 * dime.dimeNumVal.doubleValue; + else if (dime.dimeSelfVal != nil) + { + totalAdd += -1 * dime.view.myFrame.width; + } + else + totalMulti += dime.multiVal; + + totalAdd += dime.addVal; + } - else - totalMutil += d.mutilVal; - - totalAdd += d.addVal; - } - } - CGFloat floatWidth = selfRect.size.width - self.leftPadding - self.rightPadding + totalAdd; - if (floatWidth <= 0) + CGFloat floatWidth = selfSize.width - lsc.leadingPadding - lsc.trailingPadding + totalAdd; + if ( _myCGFloatLessOrEqual(floatWidth, 0)) floatWidth = 0; - if (totalMutil != 0) + if (totalMulti != 0) { - sbv.absPos.width = [self validMeasure:sbv.widthDime sbv:sbv calcSize:floatWidth * (sbv.widthDime.mutilVal / totalMutil) sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.width = [self myValidMeasure:sbvsc.widthSizeInner sbv:sbv calcSize:floatWidth * (sbvsc.widthSizeInner.multiVal / totalMulti) sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; - for (MyLayoutDime *d in arr) { - - if (d.dimeNumVal == nil) - d.view.absPos.width = floatWidth * (d.mutilVal / totalMutil); - else - d.view.absPos.width = d.dimeNumVal.doubleValue; - - d.view.absPos.width = [self validMeasure:d.view.widthDime sbv:d.view calcSize:d.view.absPos.width sbvSize:d.view.absPos.frame.size selfLayoutSize:selfRect.size]; + if ([self myIsNoLayoutSubview:sbv]) + sbvmyFrame.width = 0; + + for (MyLayoutSize *dime in dimeArray) + { + if (dime.isActive) + { + if (dime.dimeNumVal == nil) + dime.view.myFrame.width = floatWidth * (dime.multiVal / totalMulti); + else + dime.view.myFrame.width = dime.dimeNumVal.doubleValue; + + dime.view.myFrame.width = [self myValidMeasure:dime.view.widthSize sbv:dime.view calcSize:dime.view.myFrame.width sbvSize:dime.view.myFrame.frame.size selfLayoutSize:selfSize]; + + if ([self myIsNoLayoutSubview:dime.view]) + dime.view.myFrame.width = 0; + } } } } - if (sbv.heightDime.dimeArrVal != nil) + if (sbvsc.heightSizeInner.dimeArrVal != nil) { - *pRecalc = YES; + if (pRecalc != NULL) + *pRecalc = YES; - NSArray *arr = sbv.heightDime.dimeArrVal; + NSArray *dimeArray = sbvsc.heightSizeInner.dimeArrVal; - BOOL ok1 = sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout && self.flexOtherViewHeightWhenSubviewHidden) || sbv.absPos.sizeClass.isHidden; + BOOL isViewHidden = [self myIsNoLayoutSubview:sbv]; - CGFloat totalMutil = ok1 ? 0 : sbv.heightDime.mutilVal; - CGFloat totalAdd = ok1 ? 0 : sbv.heightDime.addVal; - for (MyLayoutDime *d in arr) + CGFloat totalMulti = isViewHidden ? 0 : sbvsc.heightSizeInner.multiVal; + CGFloat totalAdd = isViewHidden ? 0 : sbvsc.heightSizeInner.addVal; + for (MyLayoutSize *dime in dimeArray) { - BOOL ok = d.view.useFrame || (d.view.isHidden && self.hideSubviewReLayout && self.flexOtherViewHeightWhenSubviewHidden) || d.view.absPos.sizeClass.isHidden; - - if (!ok) + if (dime.isActive) { - if (d.dimeNumVal != nil) - totalAdd += -1 * d.dimeNumVal.doubleValue; - else - totalMutil += d.mutilVal; - - totalAdd += d.addVal; + isViewHidden = [self myIsNoLayoutSubview:dime.view]; + if (!isViewHidden) + { + if (dime.dimeNumVal != nil) + totalAdd += -1 * dime.dimeNumVal.doubleValue; + else if (dime.dimeSelfVal != nil) + { + totalAdd += -1 *dime.view.myFrame.height; + } + else + totalMulti += dime.multiVal; + + totalAdd += dime.addVal; + } } - } - CGFloat floatHeight = selfRect.size.height - self.topPadding - self.bottomPadding + totalAdd; - if (floatHeight <= 0) + CGFloat floatHeight = selfSize.height - lsc.topPadding - lsc.bottomPadding + totalAdd; + if (_myCGFloatLessOrEqual(floatHeight, 0)) floatHeight = 0; - if (totalMutil != 0) + if (totalMulti != 0) { - sbv.absPos.height = [self validMeasure:sbv.heightDime sbv:sbv calcSize:floatHeight * (sbv.heightDime.mutilVal / totalMutil) sbvSize:sbv.absPos.frame.size selfLayoutSize:selfRect.size]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:floatHeight * (sbvsc.heightSizeInner.multiVal / totalMulti) sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; - for (MyLayoutDime *d in arr) { - - if (d.dimeNumVal == nil) - d.view.absPos.height = floatHeight * (d.mutilVal / totalMutil); - else - d.view.absPos.height = d.dimeNumVal.doubleValue; - - d.view.absPos.height = [self validMeasure:d.view.heightDime sbv:d.view calcSize:d.view.absPos.height sbvSize:d.view.absPos.frame.size selfLayoutSize:selfRect.size]; + if ([self myIsNoLayoutSubview:sbv]) + sbvmyFrame.height = 0; + + for (MyLayoutSize *dime in dimeArray) + { + if (dime.isActive) + { + if (dime.dimeNumVal == nil) + dime.view.myFrame.height = floatHeight * (dime.multiVal / totalMulti); + else + dime.view.myFrame.height = dime.dimeNumVal.doubleValue; + + dime.view.myFrame.height = [self myValidMeasure:dime.view.heightSize sbv:dime.view calcSize:dime.view.myFrame.height sbvSize:dime.view.myFrame.frame.size selfLayoutSize:selfSize]; + + if ([self myIsNoLayoutSubview:dime.view]) + dime.view.myFrame.height = 0; + } } } } //表示视图数组水平居中 - if (sbv.centerXPos.posArrVal != nil) + if (sbvsc.centerXPosInner.posArrVal != nil) { //先算出所有关联视图的宽度。再计算出关联视图的左边和右边的绝对值。 - NSArray *arr = sbv.centerXPos.posArrVal; + NSArray *centerArray = sbvsc.centerXPosInner.posArrVal; CGFloat totalWidth = 0; + CGFloat totalOffset = 0; - if (!(sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden)) + MyLayoutPos *nextPos = nil; + for (NSInteger i = centerArray.count - 1; i >= 0; i--) { - [self calcWidth:sbv selfRect:selfRect]; - totalWidth += sbv.absPos.width + sbv.centerXPos.margin; + MyLayoutPos *pos = centerArray[i]; + if (![self myIsNoLayoutSubview:pos.view]) + { + if (totalWidth != 0) + { + if (nextPos != nil) + totalOffset += nextPos.view.centerXPos.absVal; + } + + [self myCalcWidth:pos.view sbvsc:pos.view.myCurrentSizeClass lsc:lsc sbvmyFrame:pos.view.myFrame selfSize:selfSize]; + totalWidth += pos.view.myFrame.width; + } + + nextPos = pos; } - - for (MyLayoutPos *p in arr) + if (![self myIsNoLayoutSubview:sbv]) { - if (!(p.view.useFrame || (p.view.isHidden && self.hideSubviewReLayout) || p.view.absPos.sizeClass.isHidden)) + if (totalWidth != 0) { - [self calcWidth:p.view selfRect:selfRect]; - totalWidth += p.view.absPos.width + p.view.centerXPos.margin; + if (nextPos != nil) + totalOffset += nextPos.view.centerXPos.absVal; } + + [self myCalcWidth:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; + totalWidth += sbvmyFrame.width; + totalOffset += sbvsc.centerXPosInner.absVal; } - //所有宽度算出后,再分别设置 - CGFloat leftOffset = (selfRect.size.width - self.leftPadding - self.rightPadding - totalWidth) / 2; - leftOffset += self.leftPadding; - id prev = @(leftOffset); - if (!(sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden)) + //所有宽度算出后,再分别设置 + CGFloat leadingOffset = (selfSize.width - lsc.leadingPadding - lsc.trailingPadding - totalWidth - totalOffset) / 2; + leadingOffset += lsc.leadingPadding; + id prev = @(leadingOffset); + [sbvsc.leadingPos __equalTo:prev]; + prev = sbvsc.trailingPos; + for (MyLayoutPos *pos in centerArray) { - sbv.leftPos.equalTo(prev); - prev = sbv.rightPos; - } - - for (MyLayoutPos *p in arr) - { - if (!(p.view.useFrame || (p.view.isHidden && self.hideSubviewReLayout) || p.view.absPos.sizeClass.isHidden)) - { - p.view.leftPos.equalTo(prev).offset(p.view.centerXPos.margin); - prev = p.view.rightPos; - } + [[pos.view.leadingPos __equalTo:prev] __offset:pos.view.centerXPos.absVal]; + prev = pos.view.trailingPos; } } //表示视图数组垂直居中 - if (sbv.centerYPos.posArrVal != nil) + if (sbvsc.centerYPosInner.posArrVal != nil) { - //先算出所有关联视图的宽度。再计算出关联视图的左边和右边的绝对值。 - NSArray *arr = sbv.centerYPos.posArrVal; + NSArray *centerArray = sbvsc.centerYPosInner.posArrVal; CGFloat totalHeight = 0; + CGFloat totalOffset = 0; - if (!(sbv.useFrame || ( sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden)) + MyLayoutPos *nextPos = nil; + for (NSInteger i = centerArray.count - 1; i >= 0; i--) { - [self calcHeight:sbv selfRect:selfRect]; - totalHeight += sbv.absPos.height + sbv.centerYPos.margin; + MyLayoutPos *pos = centerArray[i]; + if (![self myIsNoLayoutSubview:pos.view]) + { + if (totalHeight != 0) + { + if (nextPos != nil) + totalOffset += nextPos.view.centerYPos.absVal; + } + + [self myCalcHeight:pos.view sbvsc:pos.view.myCurrentSizeClass lsc:lsc sbvmyFrame:pos.view.myFrame selfSize:selfSize]; + totalHeight += pos.view.myFrame.height; + } + + nextPos = pos; } - - for (MyLayoutPos *p in arr) + if (![self myIsNoLayoutSubview:sbv]) { - if (!( p.view.useFrame || (p.view.isHidden && self.hideSubviewReLayout) || p.view.absPos.sizeClass.isHidden)) + if (totalHeight != 0) { - [self calcHeight:p.view selfRect:selfRect]; - totalHeight += p.view.absPos.height + p.view.centerYPos.margin; + if (nextPos != nil) + totalOffset += nextPos.view.centerYPos.absVal; } + + [self myCalcHeight:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; + totalHeight += sbvmyFrame.height; + totalOffset += sbvsc.centerYPosInner.absVal; } - //所有宽度算出后,再分别设置 - CGFloat topOffset = (selfRect.size.height - self.topPadding - self.bottomPadding - totalHeight) / 2; - topOffset += self.topPadding; + + //所有高度算出后,再分别设置 + CGFloat topOffset = (selfSize.height - lsc.topPadding - lsc.bottomPadding - totalHeight - totalOffset) / 2; + topOffset += lsc.topPadding; id prev = @(topOffset); - if (!(sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden)) + [sbvsc.topPos __equalTo:prev]; + prev = sbvsc.bottomPos; + for (MyLayoutPos *pos in centerArray) { - sbv.topPos.equalTo(prev); - prev = sbv.bottomPos; + [[pos.view.topPos __equalTo:prev] __offset:pos.view.centerYPos.absVal]; + prev = pos.view.bottomPos; } - for (MyLayoutPos *p in arr) - { - if (!( p.view.useFrame || (p.view.isHidden && self.hideSubviewReLayout) || p.view.absPos.sizeClass.isHidden )) - { - p.view.topPos.equalTo(prev).offset(p.view.centerYPos.margin); - prev = p.view.bottomPos; - } - } } } //计算最大的宽度和高度 - CGFloat maxWidth = self.leftPadding; - CGFloat maxHeight = self.topPadding; + CGFloat maxWidth = lsc.leadingPadding + lsc.trailingPadding; + CGFloat maxHeight = lsc.topPadding + lsc.bottomPadding; for (UIView *sbv in self.subviews) { - BOOL canCalcMaxWidth = YES; - BOOL canCalcMaxHeight = YES; + MyFrame *sbvmyFrame = sbv.myFrame; + UIView *sbvsc = [self myCurrentSizeClassFrom:sbvmyFrame]; + BOOL sbvWrapContentHeight = sbvsc.wrapContentHeight && ![sbv isKindOfClass:[MyBaseLayout class]]; - [self calcSubViewLeftRight:sbv selfRect:selfRect]; + [self myCalcSubViewLeadingTrailing:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - if (sbv.rightPos.posRelaVal != nil && sbv.rightPos.posRelaVal.view == self) + //特殊处理高度包裹的情况,如果高度包裹时则同时设置顶部和底部将无效。 + if (sbvWrapContentHeight) { - *pRecalc = YES; - } - - if (sbv.widthDime.dimeRelaVal != nil && sbv.widthDime.dimeRelaVal.view == self) - { - canCalcMaxWidth = NO; - *pRecalc = YES; - } - - if (sbv.leftPos.posRelaVal != nil && sbv.leftPos.posRelaVal.view == self && - sbv.rightPos.posRelaVal != nil && sbv.rightPos.posRelaVal.view == self) - { - canCalcMaxWidth = NO; + sbvmyFrame.height = [self myHeightFromFlexedHeightView:sbv sbvsc:sbvsc inWidth:sbvmyFrame.width]; + sbvmyFrame.height = [self myValidMeasure:sbvsc.heightSizeInner sbv:sbv calcSize:sbvmyFrame.height sbvSize:sbvmyFrame.frame.size selfLayoutSize:selfSize]; } + [self myCalcSubViewTopBottom:sbv sbvsc:sbvsc lsc:lsc sbvmyFrame:sbvmyFrame selfSize:selfSize]; - if (sbv.isFlexedHeight) - { - sbv.absPos.height = [self heightFromFlexedHeightView:sbv inWidth:sbv.absPos.width]; - } - - [self calcSubViewTopBottom:sbv selfRect:selfRect]; - - if (sbv.bottomPos.posRelaVal != nil && sbv.bottomPos.posRelaVal.view == self) - *pRecalc = YES; - - if (sbv.heightDime.dimeRelaVal != nil && sbv.heightDime.dimeRelaVal.view == self) - { - *pRecalc = YES; - canCalcMaxHeight = NO; - } - - if (sbv.topPos.posRelaVal != nil && sbv.topPos.posRelaVal.view == self && - sbv.bottomPos.posRelaVal != nil && sbv.bottomPos.posRelaVal.view == self) - { - canCalcMaxHeight = NO; - } - - - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) + if ([self myIsNoLayoutSubview:sbv]) continue; - if (canCalcMaxWidth && maxWidth < sbv.absPos.rightPos + sbv.rightPos.margin) - maxWidth = sbv.absPos.rightPos + sbv.rightPos.margin; - if (canCalcMaxHeight && maxHeight < sbv.absPos.bottomPos + sbv.bottomPos.margin) - maxHeight = sbv.absPos.bottomPos + sbv.bottomPos.margin; - } - - maxWidth += self.rightPadding; - maxHeight += self.bottomPadding; - - return CGSizeMake(maxWidth, maxHeight); - -} - --(CGRect)calcLayoutRect:(CGSize)size isEstimate:(BOOL)isEstimate pHasSubLayout:(BOOL*)pHasSubLayout sizeClass:(MySizeClass)sizeClass -{ - CGRect selfRect = [super calcLayoutRect:size isEstimate:isEstimate pHasSubLayout:pHasSubLayout sizeClass:sizeClass]; - - for (UIView *sbv in self.subviews) - { - if (sbv.useFrame || (sbv.isHidden && self.hideSubviewReLayout) || sbv.absPos.sizeClass.isHidden) - continue; - - if (!isEstimate || (pHasSubLayout != nil && (*pHasSubLayout) == YES)) - [sbv.absPos reset]; - - - if ([sbv isKindOfClass:[MyBaseLayout class]]) + if (lsc.wrapContentWidth && pRecalc != NULL) { - if (pHasSubLayout != NULL) - *pHasSubLayout = YES; - - MyBaseLayout *sbvl = (MyBaseLayout*)sbv; - - if (sbvl.wrapContentWidth) + //当有子视图依赖于父视图的一些设置时,需要重新进行布局(设置了右边或者中间的值,或者宽度依赖父视图) + if(sbvsc.trailingPosInner.posNumVal != nil || + sbvsc.trailingPosInner.posRelaVal.view == self || + sbvsc.centerXPosInner.posRelaVal.view == self || + sbvsc.centerXPosInner.posNumVal != nil || + sbvsc.widthSizeInner.dimeRelaVal.view == self + ) { - //只要同时设置了左右边距或者设置了宽度则应该把wrapContentWidth置为NO - if ((sbvl.leftPos.posVal != nil && sbvl.rightPos.posVal != nil) || sbvl.widthDime.dimeVal != nil) - [sbvl setWrapContentWidthNoLayout:NO]; + *pRecalc = YES; } - if (sbvl.wrapContentHeight) + //宽度最小是任何一个子视图的左右偏移和外加内边距和。 + if (maxWidth < sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + lsc.leadingPadding + lsc.trailingPadding) { - if ((sbvl.topPos.posVal != nil && sbvl.bottomPos.posVal != nil) || sbvl.heightDime.dimeVal != nil) - [sbvl setWrapContentHeightNoLayout:NO]; + maxWidth = sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + lsc.leadingPadding + lsc.trailingPadding; } - - if (isEstimate) + if (sbvsc.widthSizeInner.dimeRelaVal == nil || sbvsc.widthSizeInner.dimeRelaVal != self.widthSizeInner) { - [sbvl estimateLayoutRect:sbvl.absPos.frame.size inSizeClass:sizeClass]; + if (sbvsc.centerXPosInner.posVal != nil) + { + if (maxWidth < sbvmyFrame.width + sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + lsc.leadingPadding + lsc.trailingPadding) + maxWidth = sbvmyFrame.width + sbvsc.leadingPosInner.absVal + sbvsc.trailingPosInner.absVal + lsc.leadingPadding + lsc.trailingPadding; + } + else if (sbvsc.leadingPosInner.posVal != nil && sbvsc.trailingPosInner.posVal != nil) + { + if (maxWidth < fabs(sbvmyFrame.trailing) + sbvsc.leadingPosInner.absVal + lsc.leadingPadding) + { + maxWidth = fabs(sbvmyFrame.trailing) + sbvsc.leadingPosInner.absVal + lsc.leadingPadding; + } + + } + else if (sbvsc.trailingPosInner.posVal != nil) + { + if (maxWidth < fabs(sbvmyFrame.leading) + lsc.leadingPadding) + maxWidth = fabs(sbvmyFrame.leading) + lsc.leadingPadding; + } + else + { + if (maxWidth < fabs(sbvmyFrame.trailing) + lsc.trailingPadding) + maxWidth = fabs(sbvmyFrame.trailing) + lsc.trailingPadding; + } - sbvl.absPos.leftPos = sbvl.absPos.rightPos = sbvl.absPos.topPos = sbvl.absPos.bottomPos = CGFLOAT_MAX; - sbvl.absPos.sizeClass = [sbvl myBestSizeClass:sizeClass]; //因为estimateLayoutRect执行后会还原,所以这里要重新设置 + if (maxWidth < sbvmyFrame.trailing + sbvsc.trailingPosInner.absVal + lsc.trailingPadding) + maxWidth = sbvmyFrame.trailing + sbvsc.trailingPosInner.absVal + lsc.trailingPadding; } } - } - - - BOOL reCalc = NO; - CGSize maxSize = [self calcLayout:&reCalc selfRect:selfRect]; - - if (self.wrapContentWidth || self.wrapContentHeight) - { - if (selfRect.size.height != maxSize.height || selfRect.size.width != maxSize.width) + + if (lsc.wrapContentHeight && pRecalc != NULL) { - - if (self.wrapContentWidth) + //当有子视图依赖于父视图的一些设置时,需要重新进行布局(设置了下边或者中间的值,或者高度依赖父视图) + if(sbvsc.bottomPosInner.posNumVal != nil || + sbvsc.bottomPosInner.posRelaVal.view == self || + sbvsc.centerYPosInner.posRelaVal.view == self || + sbvsc.centerYPosInner.posNumVal != nil || + sbvsc.heightSizeInner.dimeRelaVal.view == self + ) { - selfRect.size.width = maxSize.width; + *pRecalc = YES; } - if (self.wrapContentHeight) + if (maxHeight < sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + lsc.topPadding + lsc.bottomPadding) { - selfRect.size.height = maxSize.height; + maxHeight = sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + lsc.topPadding + lsc.bottomPadding; } - //如果里面有需要重新计算的就重新计算布局 - if (reCalc) + + //这里加入特殊的条件sbvWrapContentHeight,因为有可能有同时设置顶部和底部位置又同时设置wrapContentHeight的情况,这种情况我们也让其加入最大高度计算行列。 + if (sbvsc.heightSizeInner.dimeRelaVal == nil || sbvsc.heightSizeInner.dimeRelaVal != self.heightSizeInner) { - for (UIView *sbv in self.subviews) + + if (sbvsc.centerYPosInner.posVal != nil) { - //如果是布局视图则不清除尺寸,其他清除。 - if (isEstimate && [sbv isKindOfClass:[MyBaseLayout class]]) + if (maxHeight < sbvmyFrame.height + sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + lsc.topPadding + lsc.bottomPadding) + maxHeight = sbvmyFrame.height + sbvsc.topPosInner.absVal + sbvsc.bottomPosInner.absVal + lsc.topPadding + lsc.bottomPadding; + } + else if (sbvsc.topPosInner.posVal != nil && sbvsc.bottomPosInner.posVal != nil) + { + if (maxHeight < fabs(sbvmyFrame.bottom) + sbvsc.topPosInner.absVal + lsc.topPadding) { - sbv.absPos.leftPos = sbv.absPos.rightPos = sbv.absPos.topPos = sbv.absPos.bottomPos = CGFLOAT_MAX; + maxHeight = fabs(sbvmyFrame.bottom) + sbvsc.topPosInner.absVal + lsc.topPadding; } - else - [sbv.absPos reset]; + } + else if (sbvsc.bottomPosInner.posVal != nil) + { + if (maxHeight < fabs(sbvmyFrame.top) + lsc.topPadding) + maxHeight = fabs(sbvmyFrame.top) + lsc.topPadding; + } + else + { + if (maxHeight < fabs(sbvmyFrame.bottom) + lsc.bottomPadding) + maxHeight = fabs(sbvmyFrame.bottom) + lsc.bottomPadding; } - [self calcLayout:&reCalc selfRect:selfRect]; + + if (maxHeight < sbvmyFrame.bottom + sbvsc.bottomPosInner.absVal + lsc.bottomPadding) + maxHeight = sbvmyFrame.bottom + sbvsc.bottomPosInner.absVal + lsc.bottomPadding; + } } - } - selfRect.size.height = [self validMeasure:self.heightDime sbv:self calcSize:selfRect.size.height sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - selfRect.size.width = [self validMeasure:self.widthDime sbv:self calcSize:selfRect.size.width sbvSize:selfRect.size selfLayoutSize:self.superview.frame.size]; - - return selfRect; + return CGSizeMake(maxWidth, maxHeight); } --(id)createSizeClassInstance -{ - return [MyLayoutSizeClassRelativeLayout new]; -} @end diff --git a/Pods/MyLayout/MyLayout/Lib/MyTableLayout.h b/Pods/MyLayout/MyLayout/Lib/MyTableLayout.h index 6c52338..aba4dd8 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyTableLayout.h +++ b/Pods/MyLayout/MyLayout/Lib/MyTableLayout.h @@ -10,45 +10,78 @@ /** - * 行列描述扩展对象。 + 表格布局行列索引描述扩展对象。 */ @interface NSIndexPath(MyTableLayoutEx) + +/** + 构建一个单元格索引对象 + + @param col 列索引 + @param row 行索引 + @return 返回单元格索引实例对象 + */ +(instancetype)indexPathForCol:(NSInteger)col inRow:(NSInteger)row; @property(nonatomic,assign,readonly) NSInteger col; @end -//定义特殊的尺寸 +//定义特殊的表格行列尺寸,参考下面addRow方法中的描述。 #define MTLSIZE_AVERAGE 0 #define MTLSIZE_WRAPCONTENT -1 #define MTLSIZE_MATCHPARENT -2 /** - *表格布局是一种里面的子视图可以像表格一样多行多列排列的布局视图。子视图添加到表格布局视图前必须先要建立并添加行视图,然后再将子视图添加到行视图里面。 - *如果行视图在表格布局里面是从上到下排列的则表格布局为垂直表格布局,垂直表格布局里面的子视图在行视图里面是从左到右排列的; - *如果行视图在表格布局里面是从左到右排列的则表格布局为水平表格布局,水平表格布局里面的子视图在行视图里面是从上到下排列的。 + 表格布局是一种里面的子视图可以像表格一样进行多行多列排列的布局视图。子视图添加到表格布局视图前必须先要建立并添加行子视图,然后再将列子视图添加到行子视图里面。 + 表格里面的行子视图和列子视图的排列方向的概念是相对的,他根据表格布局方向的不同而不同。表格布局根据方向可分为垂直表格布局和水平表格布局。 + + 1. 对于垂直表格布局来说,行子视图是从上到下依次排列的,而列子视图则是在行子视图里面从左到右依次排列。 + + 2. 对于水平表格布局来说,行子视图是从左到右依次排列的,而列子视图则是在行子视图里面从上到下依次排列。 */ @interface MyTableLayout : MyLinearLayout -+(id)tableLayoutWithOrientation:(MyLayoutViewOrientation)orientation; - /** - * 设置表格的行间距和列间距 + 构建一个表格布局视图 + + @param orientation 表格布局的方向 + @return 表格布局实例对象 */ -@property(nonatomic ,assign) IBInspectable CGFloat rowSpacing; -@property(nonatomic, assign) IBInspectable CGFloat colSpacing; ++(instancetype)tableLayoutWithOrientation:(MyOrientation)orientation; /** - * 添加一个新行。对于垂直表格来说每一行是从上往下排列的,而水平表格则每一行是从左往右排列的。 - * - * @param rowSize 为MTLSIZE_WRAPCONTENT表示由子视图决定本行尺寸,子视图需要自己设置尺寸;为MTLSIZE_AVERAGE表示均分尺寸,子视图不需要设置尺寸;大于0表示固定尺寸,子视图不需要设置尺寸;不能设置为MTLSIZE_MATCHPARENT。 - * @param colSize 为MTLSIZE_MATCHPARENT表示子视图需要自己指定尺寸,整体行尺寸和父视图一样的尺寸;为MTLSIZE_WRAPCONTENT表示由子视图需要自己设置尺寸,行尺寸包裹所有子视图;为MTLSIZE_AVERAGE表示均分尺寸,这时候子视图不必设置尺寸;大于0表示子视图固定尺寸,这时候子视图可以不必设置尺寸。 + 添加一个新行。对于垂直表格来说每一行是从上往下排列的,而水平表格则每一行是从左往右排列的。 + + @note 行能设置的值: + + 1. MTLSIZE_WRAPCONTENT表示由列子视图决定本行尺寸(垂直表格为行高,水平表格为行宽),每个列子视图都需要自己设置尺寸(垂直表格为高度,水平表格为宽度) + + 2. MTLSIZE_AVERAGE表示均分尺寸(垂直表格为行高 = 总行高/行数,水平表格为行宽 = 总行宽/行数),列子视图不需要设置尺寸(垂直表格为高度,水平表格为宽度) + + 3. 大于0表示固定尺寸,表示这行的尺寸为这个固定的数值(垂直表格为行高,水平表格为行宽),列子视图不需要设置尺寸(垂直表格为高度,水平表格为宽度)。 + + 4. 不能设置为MTLSIZE_MATCHPARENT。 + + @note 列能设置的值: + + 1. MTLSIZE_MATCHPARENT表示整列尺寸和父视图一样的尺寸(垂直表格为列宽,水平表格为列高),每个子视图需要设置自己的尺寸(垂直表格为宽度,水平表格为高度) + + 2. MTLSIZE_WRAPCONTENT表示整列的尺寸由列内所有子视图包裹(垂直表格为列宽,水平表格为列高).每个子视图需要设置自己的尺寸(垂直表格为宽度,水平表格为高度) + + 3. MTLSIZE_AVERAGE表示整列的尺寸和父视图一样的尺寸(垂直表格为列宽,水平表格为列高),每列内子视图的尺寸均分(垂直表格 = 列宽/行内子视图数,水平表格 = 行高/列内子视图数) + + 4. 大于0表示列内每个子视图都具有固定尺寸(垂直表格为宽度,水平表格为高度),这时候子视图可以不必设置尺寸。 + + + @param rowSize 行的尺寸值,请参考上面的行能设置的值。 + @param colSize 列的尺寸值,请参考上面的列能设置的值。 + @return 返回行布局视图对象 */ -(MyLinearLayout*)addRow:(CGFloat)rowSize colSize:(CGFloat)colSize; @@ -79,8 +112,8 @@ /** * 添加一个新的列。再添加一个新的列前必须要先添加行,对于垂直表格来说每一列是从左到右排列的,而对于水平表格来说每一列是从上到下排列的。 - * @colView: 列视图 - * @rowIndex: 指定要添加列的行的索引 + * @param colView 列视图 + * @param rowIndex 指定要添加列的行的索引 */ -(void)addCol:(UIView*)colView atRow:(NSInteger)rowIndex; @@ -124,3 +157,17 @@ @end + + +@interface MyTableLayout(MyTableDeprecated) + + +/** + * 不再单独设置表格的行间距和列间距了,而是复用视图的水平间距和垂直间距。原来表格的行间距和列间距会根据不同的表格方向定义不同而不同,现在统一为水平和垂直间距,不管表格的方向如何,水平间距都是定义左右的间距,垂直间距都是定义上下的间距。 + */ +@property(nonatomic ,assign, getter=subviewVSpace, setter=setSubviewVSpace:) CGFloat rowSpacing MYMETHODDEPRECATED("use subviewVSpace to instead"); +@property(nonatomic, assign, getter=subviewHSpace, setter=setSubviewHSpace:) CGFloat colSpacing MYMETHODDEPRECATED("use subviewHSpace to instead"); + + +@end + diff --git a/Pods/MyLayout/MyLayout/Lib/MyTableLayout.m b/Pods/MyLayout/MyLayout/Lib/MyTableLayout.m index f83dd33..ea81a35 100644 --- a/Pods/MyLayout/MyLayout/Lib/MyTableLayout.m +++ b/Pods/MyLayout/MyLayout/Lib/MyTableLayout.m @@ -14,7 +14,7 @@ @interface MyTableRowLayout : MyLinearLayout -+(id)rowSize:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutViewOrientation)orientation; ++(id)rowSize:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyOrientation)orientation; @property(nonatomic,assign, readonly) CGFloat rowSize; @property(nonatomic,assign, readonly) CGFloat colSize; @@ -27,7 +27,7 @@ @implementation MyTableRowLayout CGFloat _colSize; } --(id)initWith:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutViewOrientation)orientation +-(id)initWith:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyOrientation)orientation { self = [super initWithOrientation:orientation]; if (self != nil) @@ -35,21 +35,23 @@ -(id)initWith:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutVie _rowSize = rowSize; _colSize = colSize; + UIView *lsc = self.myCurrentSizeClass; + if (rowSize == MTLSIZE_AVERAGE) - self.weight = 1; + lsc.weight = 1; else if (rowSize > 0) { - if (orientation == MyLayoutViewOrientation_Horz) - self.myHeight = rowSize; + if (orientation == MyOrientation_Horz) + lsc.myHeight = rowSize; else - self.myWidth = rowSize; + lsc.myWidth = rowSize; } else if (rowSize == MTLSIZE_WRAPCONTENT) { - if (orientation == MyLayoutViewOrientation_Horz) - self.wrapContentHeight = YES; + if (orientation == MyOrientation_Horz) + lsc.wrapContentHeight = YES; else - self.wrapContentWidth = YES; + lsc.wrapContentWidth = YES; } else { @@ -58,29 +60,29 @@ -(id)initWith:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutVie if (colSize == MTLSIZE_AVERAGE) { - if (orientation == MyLayoutViewOrientation_Horz) + if (orientation == MyOrientation_Horz) { - self.wrapContentWidth = NO; - self.myLeftMargin = self.myRightMargin = 0; + lsc.wrapContentWidth = NO; + lsc.myHorzMargin = 0; } else { - self.wrapContentHeight = NO; - self.myTopMargin = self.myBottomMargin = 0; + lsc.wrapContentHeight = NO; + lsc.myVertMargin = 0; } } else if (colSize == MTLSIZE_MATCHPARENT) { - if (orientation == MyLayoutViewOrientation_Horz) + if (orientation == MyOrientation_Horz) { - self.wrapContentWidth = NO; - self.myLeftMargin = self.myRightMargin = 0; + lsc.wrapContentWidth = NO; + lsc.myHorzMargin = 0; } else { - self.wrapContentHeight = NO; - self.myTopMargin = self.myBottomMargin = 0; + lsc.wrapContentHeight = NO; + lsc.myVertMargin = 0; } } } @@ -88,7 +90,7 @@ -(id)initWith:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutVie return self; } -+(id)rowSize:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyLayoutViewOrientation)orientation ++(id)rowSize:(CGFloat)rowSize colSize:(CGFloat)colSize orientation:(MyOrientation)orientation { return [[self alloc] initWith:rowSize colSize:colSize orientation:orientation]; } @@ -114,37 +116,11 @@ -(NSInteger)col @implementation MyTableLayout -+(id)tableLayoutWithOrientation:(MyLayoutViewOrientation)orientation ++(instancetype)tableLayoutWithOrientation:(MyOrientation)orientation { return [self linearLayoutWithOrientation:orientation]; } --(void)setRowSpacing:(CGFloat)rowSpacing -{ - self.subviewMargin = rowSpacing; -} - --(CGFloat)rowSpacing -{ - return self.subviewMargin; -} - --(void)setColSpacing:(CGFloat)colSpacing -{ - MyTableLayout *lsc = self.myCurrentSizeClass; - if (lsc.colSpacing != colSpacing) - { - lsc.colSpacing = colSpacing; - [self setNeedsLayout]; - } - -} - --(CGFloat)colSpacing -{ - return self.myCurrentSizeClass.colSpacing; -} - -(MyLinearLayout*)addRow:(CGFloat)rowSize colSize:(CGFloat)colSize { @@ -153,15 +129,24 @@ -(MyLinearLayout*)addRow:(CGFloat)rowSize colSize:(CGFloat)colSize -(MyLinearLayout*)insertRow:(CGFloat)rowSize colSize:(CGFloat)colSize atIndex:(NSInteger)rowIndex { - MyLayoutViewOrientation ori = MyLayoutViewOrientation_Vert; - if (self.orientation == MyLayoutViewOrientation_Vert) - ori = MyLayoutViewOrientation_Horz; + MyTableLayout *lsc = self.myCurrentSizeClass; + + MyOrientation ori = MyOrientation_Vert; + if (lsc.orientation == MyOrientation_Vert) + ori = MyOrientation_Horz; else - ori = MyLayoutViewOrientation_Vert; + ori = MyOrientation_Vert; MyTableRowLayout *rowView = [MyTableRowLayout rowSize:rowSize colSize:colSize orientation:ori]; - rowView.subviewMargin = self.colSpacing; - rowView.IntelligentBorderLine = self.IntelligentBorderLine; + if (ori == MyOrientation_Horz) + { + rowView.subviewHSpace = lsc.subviewHSpace; + } + else + { + rowView.subviewVSpace = lsc.subviewVSpace; + } + rowView.intelligentBorderline = self.intelligentBorderline; [super insertSubview:rowView atIndex:rowIndex]; return rowView; } @@ -196,42 +181,45 @@ -(void)insertCol:(UIView*)colView atIndexPath:(NSIndexPath*)indexPath { MyTableRowLayout *rowView = (MyTableRowLayout*)[self viewAtRowIndex:indexPath.row]; + MyLinearLayout *rowsc = rowView.myCurrentSizeClass; + UIView *colsc = colView.myCurrentSizeClass; + //colSize为0表示均分尺寸,为-1表示由子视图决定尺寸,大于0表示固定尺寸。 if (rowView.colSize == MTLSIZE_AVERAGE) - colView.weight = 1; + colsc.weight = 1; else if (rowView.colSize > 0) { - if (rowView.orientation == MyLayoutViewOrientation_Horz) - colView.myWidth = rowView.colSize; + if (rowsc.orientation == MyOrientation_Horz) + colsc.myWidth = rowView.colSize; else - colView.myHeight = rowView.colSize; + colsc.myHeight = rowView.colSize; } - if (rowView.orientation == MyLayoutViewOrientation_Horz) + if (rowsc.orientation == MyOrientation_Horz) { - if (colView.frame.size.height == 0 && colView.heightDime.dimeVal == nil) + if (CGRectGetHeight(colView.bounds) == 0 && colsc.heightSizeInner.dimeVal == nil) { if ([colView isKindOfClass:[MyBaseLayout class]]) { - if (!((MyBaseLayout*)colView).wrapContentHeight) - colView.heightDime.equalTo(rowView.heightDime); + if (!colsc.wrapContentHeight) + [colsc.heightSize __equalTo:rowsc.heightSize]; } else - colView.heightDime.equalTo(rowView.heightDime); + [colsc.heightSize __equalTo:rowsc.heightSize]; } } else { - if (colView.frame.size.width == 0 && colView.widthDime.dimeVal == nil) + if (CGRectGetWidth(colView.bounds) == 0 && colsc.widthSizeInner.dimeVal == nil) { if ([colView isKindOfClass:[MyBaseLayout class]]) { - if (!((MyBaseLayout*)colView).wrapContentWidth) - colView.widthDime.equalTo(rowView.widthDime); + if (!colsc.wrapContentWidth) + [colsc.widthSize __equalTo:rowsc.widthSize]; } else - colView.widthDime.equalTo(rowView.widthDime); + [colsc.widthSize __equalTo:rowsc.widthSize]; } } @@ -271,6 +259,35 @@ -(NSUInteger)countOfColInRow:(NSInteger)rowIndex return [self viewAtRowIndex:rowIndex].subviews.count; } +#pragma mark -- Override Method + + + +-(void)setSubviewVSpace:(CGFloat)subviewVSpace +{ + [super setSubviewVSpace:subviewVSpace]; + if (self.orientation == MyOrientation_Horz) + { + for (NSInteger i = 0; i < self.countOfRow; i++) + { + [self viewAtRowIndex:i].subviewVSpace = subviewVSpace; + } + } +} + +-(void)setSubviewHSpace:(CGFloat)subviewHSpace +{ + [super setSubviewHSpace:subviewHSpace]; + if (self.orientation == MyOrientation_Vert) + { + for (NSInteger i = 0; i < self.countOfRow; i++) + { + [self viewAtRowIndex:i].subviewHSpace = subviewHSpace; + } + } + +} + //不能直接调用如下的函数。 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index @@ -298,18 +315,12 @@ - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview } -/* -// Only override drawRect: if you perform custom drawing. -// An empty implementation adversely affects performance during animation. -- (void)drawRect:(CGRect)rect { - // Drawing code -} -*/ - -(id)createSizeClassInstance { - return [MyLayoutSizeClassTableLayout new]; + return [MyTableLayoutViewSizeClass new]; } +#pragma mark -- Deprecated Method + @end diff --git a/Pods/MyLayout/README.md b/Pods/MyLayout/README.md index 4c99e1f..b18e60c 100644 --- a/Pods/MyLayout/README.md +++ b/Pods/MyLayout/README.md @@ -1,100 +1,506 @@ -#MyLayout1.1.9 +[![Version](https://img.shields.io/cocoapods/v/MyLayout.svg?style=flat)](http://cocoapods.org/pods/MyLayout) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![License](https://img.shields.io/cocoapods/l/MyLayout.svg?style=flat)](http://cocoapods.org/pods/MyLayout) +[![Platform](https://img.shields.io/cocoapods/p/MyLayout.svg?style=flat)](http://cocoapods.org/pods/MyLayout) +[![Support](https://img.shields.io/badge/support-iOS%205%2B%20-blue.svg?style=flat)](https://www.apple.com/nl/ios/) +[![Weibo](https://img.shields.io/badge/Sina微博-@欧阳大哥2013-yellow.svg?style=flat)](http://weibo.com/1411091507) +[![QQ](https://img.shields.io/badge/QQ-156355113-yellow.svg?style=flat)]() +[![GitHub stars](https://img.shields.io/github/stars/youngsoft/MyLinearLayout.svg)](https://github.com/youngsoft/MyLinearLayout/stargazers) + + +![Logo](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/MyLayout.png) + +## MyLayout + +MyLayout is a simple and easy objective-c framework for iOS view layout. MyLayout provides some simple functions to build a variety of complex interface. It integrates the functions including: Autolayout and SizeClass of iOS, five layout classes of Android, float and flex-box and bootstrap of HTML/CSS. The MyLayout's Swift version are named: **[TangramKit](https://github.com/youngsoft/TangramKit)** + +##### ![cn](https://raw.githubusercontent.com/gosquared/flags/master/flags/flags/shiny/24/China.png) Chinese (Simplified): [中文说明](README.zh.md) + + + +## Usage + +* There is a container view S which width is 100 and height is wrap to all subviews height. there are four subviews A,B,C,D arranged from top to bottom. +* Subview A's left margin is 20% width of S, right margin is 30% width of S, height is equal to width of A. +* Subview B's left margin is 40, width is filled in to residual width of S,height is 40. +* Subview C's width is filled in to S, height is 40. +* Subview D's right margin is 20, width is 50% width of S, height is 40 + +![demo](https://raw.githubusercontent.com/youngsoft/TangramKit/master/TangramKitDemo/Support%20Files/usagedemo.png) + + +```objective-c + + MyLinearLayout *S = [MyLinearLayout linearLayoutWithOrientation:MyOrientation_Vert]; + S.subviewSpace = 10; +    S.widthSize.equalTo(@100); +     + UIView *A = UIView.new; + A.leftPos.equalTo(@0.2); + A.rightPos.equalTo(@0.3); + A.heightSize.equalTo(A.widthSize); + [S addSubview:A]; + + UIView *B = UIView.new; + B.leftPos.equalTo(@40); + B.widthSize.equalTo(@60); + B.heightSize.equalTo(@40); + [S addSubview:B]; + + UIView *C = UIView.new; + C.leftPos.equalTo(@0); + C.rightPos.equalTo(@0); + C.heightSize.equalTo(@40); + [S addSubview:C]; + + UIView *D = UIView.new; + D.rightPos.equalTo(@20); + D.widthSize.equalTo(S.widthSize).multiply(0.5); + D.heightSize.equalTo(@40); + [S addSubview:D]; + +``` -## Introduction ---- - -**MyLayout is a powerful iOS UI layout framework which is not an encapsulation based on the AutoLayout but is based on primary *frame* property and by overwriting the *layoutSubview* method to realize the subview's layout. So It is unlimited to run in any version of iOS system. Its idea and principle is referenced from the layout of the Android system, iOS AutoLayout and SizeClass. You can implement the UI layout through the six kinds of layout class below: *MyLinearLayout*, *MyRelativeLayout*, *MyFrameLayout* *MyTableLayout*, *MyFlowLayout*,*MyFloatLayout* and the support for *SizeClass*.** +## Performance comparison + +![demo](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/MyLayoutP.png) + +create time(ms)/per subview|Frame|MyLayout|AutoLayout|Masonry|UIStackView +-----|-------|---------|------|------|--------- +MyLinearLayout|0.08|0.164|0.219|0.304|0.131 +MyFrameLayout|0.05|0.149|0.209|0.273|0.131 +MyRelativeLayout|0.079|0.182|0.116|0.359|0.131 +MyFlowLayout|0.08|0.107|0.198|0.258|0.131 +MyFloatLayout|0.044|0.148|0.203|0.250|0.131 + + +layout time(ms)/per subview |Frame|MyLayout|AutoLayout|Masonry|UIStackView + -----|-------|---------|------|------|--------- +MyLinearLayout|0|0.049|0.269|0.269|0.272 +MyFrameLayout|0|0.042|0.243|0.243|0.272 +MyRelativeLayout|0|0.068|0.274|0.274|0.272 +MyFlowLayout|0|0.036|0.279|0.279|0.272 +MyFloatLayout|0|0.055|0.208|0.208|0.272 + + + +## Architecture + +![demo](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/MyLayoutClass.png) + +### MyLayoutPos +`MyLayoutPos` is represent to the position of a view. UIView provides six extension variables:leftPos, topPos, bottomPos, rightPos, centerXPos, centerYPos to set view's margin or space distance between self and others. You can use `equalTo` method to set NSNumber or MyLayoutPos or NSArray value. there are six simple variables:myLeft,myTop,myBottom,myRight,myCenterX,myCenterY use to set NSNumber value. eg. `A.leftPos.equalTo(@10); <==> A.myLeft = 10;` + + +### MyLayoutSize +`MyLayoutSize` is represent to the size of a view. UIView provides two extension variables:widthSize,heightSize to set view's width and height dimension. You can use `equalTo` method to set NSNumber or MyLayoutSize or NSArray value. there are two simple variables: myWidth, myHeight use to set NSNumber value. eg. `A.widthSize.equalTo(@10); <==> A.myWidth = 10;` + + +### MyLinearLayout +> Is equivalent to: UIStackView of iOS and LinearLayout of Android. + +Linear layout is a single line layout view that the subviews are arranged in sequence according to the added order(from top to bottom or from left to right). So the subviews' origin&size constraints are established by the added order. Subviews arranged in top-to-bottom order is called vertical linear layout view, and +the subviews arranged in left-to-right order is called horizontal linear layout. + +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/ll.png) + +Sample code: + +```objective-c + +-(void)loadView +{ + [super loadView]; + + MyLinearLayout *S = [MyLinearLayout linearLayoutWithOrientation:MyOrientation_Vert]; + S.myWidth = 120; + S.subviewSpace = 10; + + UIView *A = [UIView new]; + A.myLeft = A.myRight = 5; + A.myHeight = 40; + [S addSubview:A]; + + UIView *B = [UIView new]; + B.myLeft = 20; + B.myWidth = B.myHeight = 40; + [S addSubview:B]; + + UIView *C = [UIView new]; + C.myRight = 40; + C.myWidth = 50; + C.myHeight = 40; + [S addSubview:C]; + + UIView *D = [UIView new]; + D.myLeft = D.myRight = 10; + D.myHeight = 40; + [S addSubview:D]; + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + A.backgroundColor = [UIColor greenColor]; + B.backgroundColor = [UIColor blueColor]; + C.backgroundColor = [UIColor orangeColor]; + D.backgroundColor = [UIColor cyanColor]; + } -**Powerful function, easy to use, barely constraint -setting and fit various screen size perfectly are MyLayout's main advantages.** +``` -**I wish you use MyLayout right now or in your next project will be happy!** -#### MyLinearLayout -Linear layout is a single line layout view that the subviews are arranged in sequence according to the added order(from top to bottom or from left to right). So the subviews' origin&size constraints are established by the added order. Subviews arranged in top-to-bottom order is called vertical linear layout view, and the subviews arranged in left-to-right order is called horizontal linear layout. +### MyRelativeLayout +> Is equivalent to: AutoLayout of iOS and RelativeLayout of Android. -#### MyRelativeLayout Relative layout is a layout view that the subviews layout and position through mutual constraints.The subviews in the relative layout are not depended to the adding order but layout and position by setting the subviews' constraints. -#### MyFrameLayout +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/rl.png) + +Sample code: + +```objective-c + +-(void)loadView +{ + [super loadView]; + + MyRelativeLayout *S = [MyRelativeLayout new]; + S.widthSize.equalTo(@170); + S.heightSize.equalTo(@280); + + UIView *A = [UIView new]; + A.leftPos.equalTo(@20); + A.topPos.equalTo(@20); + A.widthSize.equalTo(@40); + A.heightSize.equalTo(A.widthSize); + [S addSubview:A]; + + UIView *B = [UIView new]; + B.leftPos.equalTo(A.centerXPos); + B.topPos.equalTo(A.bottomPos).offset(10); + B.widthSize.equalTo(@60); + B.heightSize.equalTo(A.heightSize); + [S addSubview:B]; + + UIView *C = [UIView new]; + C.leftPos.equalTo(B.rightPos).offset(10); + C.bottomPos.equalTo(B.bottomPos); + C.widthSize.equalTo(@40); + C.heightSize.equalTo(B.heightSize).multiply(0.5); + [S addSubview:C]; + + UIView *D = [UIView new]; + D.bottomPos.equalTo(C.topPos).offset(10); + D.rightPos.equalTo(@15); + D.heightSize.equalTo(A.heightSize); + D.widthSize.equalTo(D.heightSize); + [S addSubview:D]; + + UIView *E = [UIView new]; + E.centerYPos.equalTo(@0); + E.centerXPos.equalTo(@0); + E.heightSize.equalTo(@40); + E.widthSize.equalTo(S.widthSize).add(-20); + [S addSubview:E]; + //.. F, G + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + A.backgroundColor = [UIColor greenColor]; + B.backgroundColor = [UIColor blueColor]; + C.backgroundColor = [UIColor orangeColor]; + D.backgroundColor = [UIColor cyanColor]; + E.backgroundColor = [UIColor magentaColor]; +} + +``` + + +### MyFrameLayout +> Is equivalent to: FrameLayout of Android. + Frame layout is a layout view that the subviews can be overlapped and gravity in a special location of the superview.The subviews' layout position&size is not depended to the adding order and establish dependency constraint with the superview. Frame layout devided the vertical orientation to top,vertical center and bottom, while horizontal orientation is devided to left,horizontal center and right. Any of the subviews is just gravity in either vertical orientation or horizontal orientation. -#### MyTableLayout +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/fl.png) + +Sample code: + +```objective-c + + -(void)loadView +{ + [super loadView]; + + MyFrameLayout *S = [MyFrameLayout new]; + S.mySize = CGSizeMake(320,500); + + UIView *A = [UIView new]; + A.mySize = CGSizeMake(40,40); + [S addSubview:A]; + + UIView *B = [UIView new]; + B.mySize = CGSizeMake(40,40); + B.myRight = 0; + [S addSubview:B]; + + UIView *C = [UIView new]; + C.mySize = CGSizeMake(40,40); + C.myCenterY = 0; + [S addSubview:C]; + + UIView *D = [UIView new]; + D.mySize = CGSizeMake(40,40); + D.myCenter = CGPointZero; + [S addSubview:D]; + + //..E,F,G + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + A.backgroundColor = [UIColor greenColor]; + B.backgroundColor = [UIColor blueColor]; + C.backgroundColor = [UIColor orangeColor]; + D.backgroundColor = [UIColor cyanColor]; + } + +``` + + +### MyTableLayout +> Is equivalent to: TableLayout of Android and table of HTML. + Table layout is a layout view that the subviews are multi-row&col arranged like a table. First you must create a rowview and add it to the table layout, then add the subview to the rowview. If the rowviews arranged in top-to-bottom order,the tableview is caled vertical table layout,in which the subviews are arranged from left to right; If the rowviews arranged in in left-to-right order,the tableview is caled horizontal table layout,in which the subviews are arranged from top to bottom. -#### MyFlowLayout -Flow layout is a layout view presents in multi-line that the subviews are arranged in sequence according to the added order, and when meeting with a arranging constraint it will start a new line and rearrange. The constrains mentioned here includes count constraints and size constraints. The orientation of the new line would be vertical and horizontal, so the flow layout is divided into: count constraints vertical flow layout, size constraints vertical flow layout, count constraints horizontal flow layout, size constraints horizontal flow layout. Flow layout often used in the scenes that the subviews is arranged regularly, it can be substitutive of UICollectionView to some extent. - -#### MyFloatLayout -Float layout is a layout view that the subviews are floating gravity in the given orientations, when the size is not enough to be hold, it will automatically find the best location to gravity. float layout's conception is reference from the HTML/CSS's floating positioning technology, so the float layout can be designed in implementing irregular layout. According to the different orientation of the floating, float layout can be divided into left-right float layout and up-down float layout. +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/tl.png) + +Sample code: + +```objective-c + + -(void)loadView +{ + [super loadView]; + + MyTableLayout *S = [MyTableLayout tableLayoutWithOrientation:MyOrientation_Vert]; + S.wrapContentWidth = YES; + S.subviewHSpace = 10; + S.subviewVSpace = 10; + + [S addRow:MTLSIZE_WRAPCONTENT colSize:MTLSIZE_WRAPCONTENT]; + + UIView *A = [UIView new]; + A.mySize = CGSizeMake(50,40); + [S addSubview:A]; + + UIView *B = [UIView new]; + B.mySize = CGSizeMake(100,40); + [S addSubview:B]; + + UIView *C = [UIView new]; + C.mySize = CGSizeMake(30,40); + [S addSubview:C]; + + [S addRow:MTLSIZE_WRAPCONTENT colSize:MTLSIZE_WRAPCONTENT]; + + UIView *D = [UIView new]; + D.mySize = CGSizeMake(200,40); + [S addSubview:D]; + + //...E,F + + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + A.backgroundColor = [UIColor greenColor]; + B.backgroundColor = [UIColor blueColor]; + C.backgroundColor = [UIColor orangeColor]; + D.backgroundColor = [UIColor cyanColor]; +} + +``` -#### SizeClass -MyLayout provided support to SizeClass in order to fit the different screen sizes of devices. You can combinate the SizeClass with any of the 6 kinds of layout views mentioned above to perfect fit the UI of all equipments. -##How To Get Started ---- - [Download MyLayout](https://github.com/youngsoft/MyLinearLayout/archive/master.zip) and try out the included iPad and iPhone example apps -Read FAQ, or articles below: - -[http://blog.csdn.net/yangtiang/article/details/46483999](http://blog.csdn.net/yangtiang/article/details/46483999) 线性布局 -[http://blog.csdn.net/yangtiang/article/details/46795231](http://blog.csdn.net/yangtiang/article/details/46795231) 相对布局 -[http://blog.csdn.net/yangtiang/article/details/46492083](http://blog.csdn.net/yangtiang/article/details/46492083) 框架布局 -[http://blog.csdn.net/yangtiang/article/details/48011431](http://blog.csdn.net/yangtiang/article/details/48011431) 表格布局 -[http://blog.csdn.net/yangtiang/article/details/50652946](http://blog.csdn.net/yangtiang/article/details/50652946) 流式布局 -[http://www.jianshu.com/p/0c075f2fdab2](http://www.jianshu.com/p/0c075f2fdab2) 浮动布局 +### MyFlowLayout +> Is equivalent to: flexbox of CSS3. +Flow layout is a layout view presents in multi-line that the subviews are arranged in sequence according to the added order, and when meeting with a arranging constraint it will start a new line and rearrange. The constrains mentioned here includes count constraints and size constraints. The orientation of the new line would be vertical and horizontal, so the flow layout is divided into: count constraints vertical flow layout, size constraints vertical flow layout, count constraints horizontal flow layout, size constraints horizontal flow layout. Flow layout often used in the scenes that the subviews is arranged regularly, it can be substitutive of UICollectionView to some extent. the MyFlowLayout is almost implement the flex-box function of the HTML/CSS. -Because my english is poor so I just only can support chinese articles,and I wish some body can help me translate to english. +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/fll.png) +Sample code: -##Communication ---- +```objective-c -- If you need help, use Stack Overflow or Baidu. (Tag 'mylayout') -- If you'd like to contact me, used qq:156355113 or weibo:欧阳大哥 or email:obq0387_cn@sina.com -- If you found a bug, and can provide steps to reliably reproduce it, open an issue. -- If you have a feature request, open an issue. -- If you want to contribute, submit a pull request. -## Installation ---- -MyLayout supports multiple methods for installing the library in a project. -### Copy to your project -1. Copy `Lib` folder from the demo project to your project -2. Add`#import "MyLayout.h"` to your project's PCH file or the referenced header file。 + -(void)loadView +{ + [super loadView]; + + MyFlowLayout *S = [MyFlowLayout flowLayoutWithOrientation:MyOrientation_Vert arrangedCount:4]; + S.wrapContentHeight = YES; + S.myWidth = 300; + S.padding = UIEdgeInsetsMake(10, 10, 10, 10); + S.gravity = MyGravity_Horz_Fill; + S.subviewSpace = 10; + + for (int i = 0; i < 10; i++) + { + UIView *A = [UIView new]; + A.heightSize.equalTo(A.widthSize); + [S addSubview:A]; + + A.backgroundColor = [UIColor greenColor]; -### Installation with CocoaPods + } + + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; +} -CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like MyLayout in your projects. You can install it with the following command: + + -`$ gem install cocoapods` +``` -To integrate MyLayout into your Xcode project using CocoaPods, specify it in your Podfile: + + +### MyFloatLayout +> Is equivalent to: float of CSS. + +Float layout is a layout view that the subviews are floating gravity in the given orientations, when the size is not enough to be hold, it will automatically find the best location to gravity. float layout's conception is reference from the HTML/CSS's floating positioning technology, so the float layout can be designed in implementing irregular layout. According to the different orientation of the floating, float layout can be divided into left-right float layout and up-down float layout. + +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/flo.png) + +Sample code: + +```objective-c + + -(void)loadView +{ + [super loadView]; + + MyFloatLayout *S = [MyFloatLayout floatLayoutWithOrientation:MyOrientation_Vert]; + S.wrapContentHeight = YES; + S.padding = UIEdgeInsetsMake(10, 10, 10, 10); + S.subviewSpace = 10; + S.myWidth = 300; + + UIView *A = [UIView new]; + A.mySize = CGSizeMake(80,70); + [S addSubview:A]; + + UIView *B = [UIView new]; + B.mySize = CGSizeMake(150,40); + [S addSubview:B]; + + UIView *C = [UIView new]; + C.mySize = CGSizeMake(70,40); + [S addSubview:C]; + + UIView *D = [UIView new]; + D.mySize = CGSizeMake(100,140); + [S addSubview:D]; + + UIView *E = [UIView new]; + E.mySize = CGSizeMake(150,40); + E.reverseFloat = YES; + [S addSubview:E]; + + UIView *F = [UIView new]; + F.mySize = CGSizeMake(120,60); + [S addSubview:F]; + + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + A.backgroundColor = [UIColor greenColor]; + B.backgroundColor = [UIColor blueColor]; + C.backgroundColor = [UIColor orangeColor]; + D.backgroundColor = [UIColor cyanColor]; + E.backgroundColor = [UIColor blackColor]; + F.backgroundColor = [UIColor whiteColor]; +} ``` -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '7.0' -pod 'MyLayout', '~> 1.1.9' + +### MyPathLayout +> Is unique characteristic layout view of iOS. + + Path layout is a layout view that the subviews are according to a specified path curve to layout. You must provide a type of Functional equation,a coordinate and a type of distance setting to create a Path Curve than all subview are equidistance layout in the Path layout. path layout usually used to create some irregular and gorgeous UI layout. + +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/pl.png) + +Sample code: + + ```objective-c + + -(void)loadView +{ + [super loadView]; + + MyPathLayout *S = [MyPathLayout new]; + S.mySize = CGSizeMake(320,320); + S.coordinateSetting.isReverse = YES; + S.coordinateSetting.origin = CGPointMake(0.5, 0.2); + + S.polarEquation = ^(CGFloat angle) + { + return 80 * (1 + cos(angle)); + }; + + for (int i = 0; i < 4; i++) + { + UIView *A = [UIView new]; + A.mySize = CGSizeMake(40,40); + [S addSubview:A]; + + A.backgroundColor = [UIColor greenColor]; + } + + [self.view addSubview:S]; + S.backgroundColor = [UIColor redColor]; + } + + + ``` + + + +### MySizeClass +> Is equivalent to: Size Classes of iOS. + +MyLayout provided support to SizeClass in order to fit the different screen sizes of devices. You can combinate the SizeClass with any of the 6 kinds of layout views mentioned above to perfect fit the UI of all equipments. there are two UIView extension method: + +```objective-c + +-(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass; +-(instancetype)fetchLayoutSizeClass:(MySizeClass)sizeClass copyFrom:(MySizeClass)srcSizeClass; + ``` - -Then, run the following command: +to set Size Classes Characteristics like below: -`$ pod install` +```objective-c + +//default is all Size Classes + MyLinearLayout *rootLayout = [MyLinearLayout linearLayoutWithOrientation:MyOrientation_Vert]; + rootLayout.padding = UIEdgeInsetsMake(10, 10, 10, 10); + rootLayout.wrapContentHeight = NO; + rootLayout.gravity = MyGravity_Horz_Fill; +//MySizeClass_wAny | MySizeClass_hCompact is iPhone landscape orientation. + MyLinearLayout *lsc = [rootLayout fetchLayoutSizeClass:MySizeClass_wAny | MySizeClass_hCompact copyFrom:MySizeClass_wAny | MySizeClass_hAny]; + + lsc.orientation = MyOrientation_Horz; + lsc.wrapContentWidth = NO; + lsc.gravity = MyGravity_Vert_Fill; +``` + -##FAQ ---- -* If you use MyLayout runtime cause 100% CPU usage said appeared constraint conflict, please check the subview's constraint set. -* If you use MyLayout exception crashed in MyBaseLayout *willMoveToSuperview* method. it does not matter, just remove the exception break setting in CMD+7. -* If you set wrapConentWidth or wrapContentHeight while set widthDime or heightDime in layout view may be constraint conflict。 -* If you set the layout view as a UIControllView's root view. please set wrapContentWidth and wrapContentHeight to NO. -- Just only MyLinearLayout and MyFrameLayout's subview support relative margin. -- If subview added in layout view, the setFrame method can't setting the origin but the size. ## Demo sample @@ -104,16 +510,15 @@ Then, run the following command: ![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/layoutdemo4.gif) ![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/layoutdemo5.gif) ![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/layoutdemo6.gif) +![演示效果图](https://raw.githubusercontent.com/youngsoft/MyLinearLayout/master/MyLayout/layoutdemo7.gif) ---- ---- +## How To Get Started -#中文介绍 ---- - - 一套功能强大的iOS界面布局库,他不是在AutoLayout的基础上进行的封装,而是一套基于对frame属性的设置,并通过重载layoutSubview函数来实现对子视图进行布局的布局框架。因此可以无限制的运行在任何版本的iOS系统中。其设计思想以及原理则参考了Android的布局体系和iOS自动布局以及SizeClass的功能,通过提供的:**线性布局MyLinearLayout**、**相对布局MyRelativeLayout**、**框架布局MyFrameLayout**、**表格布局MyTableLayout**、**流式布局MyFlowLayout**、**浮动布局MyFloatLayout**六个布局类,以及对**SizeClass**的支持,来完成对界面的布局。MyLayout具有功能强大、简单易用、几乎不用设置任何约束、可以完美适配各种尺寸的屏幕等优势。具体的使用方法请看Demo中的演示代码以及到我的CSDN主页中了解: + [Download MyLayout](https://github.com/youngsoft/MyLinearLayout/archive/master.zip) and try out the included iPad and iPhone example apps +Read FAQ, or articles below: +[http://www.jianshu.com/p/4c1eb0dd676f](http://www.jianshu.com/p/4c1eb0dd676f) 布局框架和原理介绍 [http://blog.csdn.net/yangtiang/article/details/46483999](http://blog.csdn.net/yangtiang/article/details/46483999) 线性布局 [http://blog.csdn.net/yangtiang/article/details/46795231](http://blog.csdn.net/yangtiang/article/details/46795231) 相对布局 [http://blog.csdn.net/yangtiang/article/details/46492083](http://blog.csdn.net/yangtiang/article/details/46492083) 框架布局 @@ -121,155 +526,85 @@ Then, run the following command: [http://blog.csdn.net/yangtiang/article/details/50652946](http://blog.csdn.net/yangtiang/article/details/50652946) 流式布局 [http://www.jianshu.com/p/0c075f2fdab2](http://www.jianshu.com/p/0c075f2fdab2) 浮动布局 -##你也可以加入到QQ群:178573773 或者添加个人QQ:156355113 或者邮件:obq0387_cn@sina.com 联系我。## - +Because my english is poor so I just only can support chinese articles,and I wish somebody can help me translate to english. -#### 线性布局MyLinearLayout -线性布局是一种里面的子视图按添加的顺序从上到下或者从左到右依次排列的单列(单行)布局视图,因此里面的子视图是通过添加的顺序建立约束和依赖关系的。 子视图从上到下依次排列的线性布局视图称为垂直线性布局视图,而子视图从左到右依次排列的线性布局视图则称为水平线性布局。 -#### 相对布局MyRelativeLayout -相对布局是一种里面的子视图通过相互之间的约束和依赖来进行布局和定位的布局视图。相对布局里面的子视图的布局位置和添加的顺序无关,而是通过设置子视图的相对依赖关系来进行定位和布局的。 +## Communication -#### 框架布局MyFrameLayout -框架布局是一种里面的子视图停靠在父视图特定方位并且可以重叠的布局视图。框架布局里面的子视图的布局位置和添加的顺序无关,只跟父视图建立布局约束依赖关系。框架布局将垂直方向上分为上、中、下三个方位,而水平方向上则分为左、中、右三个方位,任何一个子视图都只能定位在垂直方向和水平方向上的一个方位上。 -#### 表格布局MyTableLayout -表格布局是一种里面的子视图可以像表格一样多行多列排列的布局视图。子视图添加到表格布局视图前必须先要建立并添加行视图,然后再将子视图添加到行视图里面。如果行视图在表格布局里面是从上到下排列的则表格布局为垂直表格布局,垂直表格布局里面的子视图在行视图里面是从左到右排列的;如果行视图在表格布局里面是从左到右排列的则表格布局为水平表格布局,水平表格布局里面的子视图在行视图里面是从上到下排列的。 - -#### 流式布局MyFlowLayout -流式布局是一种里面的子视图按照添加的顺序依次排列,当遇到某种约束限制后会另起一行再重新排列的多行展示的布局视图。这里的约束限制主要有数量约束限制和内容尺寸约束限制两种,而换行的方向又分为垂直和水平方向,因此流式布局一共有垂直数量约束流式布局、垂直内容约束流式布局、水平数量约束流式布局、水平内容约束流式布局。流式布局主要应用于那些子视图有规律排列的场景,在某种程度上可以作为UICollectionView的替代品。 - -#### 浮动布局MyFloatLayout -浮动布局是一种里面的子视图按照约定的方向浮动停靠,当尺寸不足以被容纳时会自动寻找最佳的位置进行浮动停靠的布局视图。浮动布局的理念源于HTML/CSS中的浮动定位技术,因此浮动布局可以专门用来实现那些不规则布局或者图文环绕的布局。根据浮动的方向不同,浮动布局可以分为左右浮动布局和上下浮动布局。 +- If you need help, use Stack Overflow or Baidu. (Tag 'mylayout') +- If you'd like to contact me, use *qq:156355113 or weibo:欧阳大哥 or email:obq0387_cn@sina.com* +- If you found a bug, and can provide steps to reliably reproduce it, open an issue. +- If you have a feature request, open an issue. +- If you want to contribute, submit a pull request. -#### SizeClass的支持 -MyLayout布局体系为了实现对不同屏幕尺寸的设备进行适配,提供了对SIZECLASS的支持。您可以将SIZECLASS和上述的6种布局搭配使用,以便实现各种设备界面的完美适配。 - +## Installation -## 使用方法 ---- +MyLayout supports multiple methods for installing the library in a project. +### Copy to your project +1. Copy `Lib` folder from the demo project to your project +2. Add`#import "MyLayout.h"` to your project's PCH file or the referenced header file。 -### 直接拷贝 -1. 将github工程中的Lib文件夹下的所有文件复制到您的工程中。 -2. 将`#import "MyLayout.h"` 头文件放入到您的pch文件中,或者在需要使用界面布局的源代码位置。 +### Installation with CocoaPods -### CocoaPods安装 +CocoaPods is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like MyLayout in your projects. You can install it with the following command: -如果您还没有安装cocoapods则请先执行如下命令: -``` -$ gem install cocoapods -``` +`$ gem install cocoapods` -为了用CocoaPods整合MyLayout到您的Xcode工程, 请建立如下的Podfile: +To integrate MyLayout into your Xcode project using CocoaPods, specify it in your Podfile: ``` source 'https://github.com/CocoaPods/Specs.git' platform :ios, '7.0' -pod 'MyLayout', '~> 1.1.9' +pod 'MyLayout', '~> 1.3.9' ``` -然后运行如下命令: +Then, run the following command: + +`$ pod install` -``` -$ pod install -``` +### Use [Carthage](https://github.com/Carthage/Carthage) +1. Create a `Cartfile` file. -##新功能 ---- -### V1.1.9版本新功能 -1. 添加对国际化的支持。 - - -### V1.1.8版本新功能 -1. 优化了表格布局MyTableLayout和智能边界线的结合的问题。(具体见:TLTest3ViewController) -2. 增加了浮动布局MyFloatLayout设置浮动间距的方法setSubviewFloatMargin (具体见:FOLTest4ViewController) - -### V1.1.7版本新功能 - 1. 修改表格布局的addRow:colSize:以及insertRow:colSize:atIndex的方法名,将原来的colWidth改为了colSize。 (具体见:TLTest2ViewController) - 2. 修改了表格布局的特殊尺寸的宏定义:MTLSIZE_XXXX (具体见:TLTest1ViewController,TLTest2ViewController) - 3. 为表格布局添加行间距:rowSpacing和列间距:colSpacing两个属性,用来设置表格的行和列之间的间距。 (具体见:TLTest2ViewController) - 4. 为布局添加方法:layoutAnimationWithDuration用来实现布局时的动画效果。 (具体见:各个DEMO) - 5. 扩展flexedHeight属性对于UIImageView的支持。当对一个UIImageView设置flexedHeight为YES时则其在布局时会自动根据UIImageView设置的宽度等比例缩放其高度。这个特性在瀑布流实现中非常实用。 (具体见:TLTest2ViewController) - 6. 为浮动布局MyFloat提供subviewMargin、subviewVertMargin、subviewHorzMargin三个新属性,用来设置浮动布局中各视图的水平和垂直间距。 (具体见:FOLTest4ViewController,FOLTest5ViewController) - 7. 为布局视图下的子视图的尺寸提供了设置最大尺寸以及最小尺寸的新功能,原先的MyLayoutDime中的min,max两个方法只能用来设置最小最大的常数值。MyLayoutDime新增加的方法lBound,uBound则功能更加强大。除了可以设置常数限制尺寸外,还可以设置对象限制尺寸。(具体见:AllTest2ViewController,AllTest3ViewController) - 8. 对线性布局中的浮动间距进行优化,支持宽度自动调整的能力.(具体见:AllTest3ViewController) - 9. 完善了将布局视图加入到非布局父视图时的位置和尺寸设置。您可以用myXXXMargin方法以及myHeight,myWidth方法设置其在非布局父视图上的位置和尺寸。 - 10. 系统自动处理了大部分可能出现布局约束冲突的地方,减少了约束冲突出现的可能性。以及出现了约束冲突时告警以及crash的提示。 - 11. 所有代码部分的注释重新编写,更加有利于大家的理解。 - 12. 重新编写了大部分的DEMO例子。 - 13. 修复了浮动布局加入到UIScrollview中不能自动固定的问题。 - 14. 修正了相对布局嵌套其他布局时,高度评估方法可能不正确的问题。 - 15. 修正了线性布局在计算高度和宽度时的一个问题。 - -### V1.1.6版本新功能 -1. MyLayoutDime类的equalTo方法添加可以等于自身的功能。比如`a.widthDime.equalTo(a.widthDime).add(10);` 表示视图a的最终宽度等于其本身内容的宽度再加上10. 这种设置方法不会造成循环引用,主要用于那些需要在自身内容尺寸基础上再扩展尺寸的场景,具体例子见: *FLLTest2ViewController*。 -2. 流式布局MyFlowLayout中的内容填充布局为了解决每行内容的填充空隙问题,增加了拉伸间距,拉伸尺寸,以及自动排列三种功能。拉伸间距需要设置属性*gravity*的值为*MyMarginGravity_Horz_Fill*或者*MyMarginGravity_Vert_Fill*;拉伸尺寸需要设置属性*averageArrange*的值为YES;自动排列则需要设置属性autoArrange的值为YES。具体例子见*FLLTest2ViewController*。 -3. 添加了新的视图扩展属性*noLayout*。这个属性设置为YES时表示子视图会参与布局,但是并不会真实的调整其在布局视图中的位置和尺寸,而布局视图则会保留出这个子视图的布局位置和尺寸的空间。这个属性和*useFrame*混合使用用来实现一些动画效果。具体例子见:*FLLTest3ViewController*。 -4. 框架布局MyFrameLayout支持了wrapContentHeight和wrapContentWidth设置为YES的功能。 -5. 布局视图添加新的属性*highlightedOpacity*,用来指定当布局Touch事件的高亮不透明度值。具体例子见:AllTest1ViewController。 -6. 修正了MyTableLayout中的一个BUG。 -7. 将布局库中的所有注释部分重新进行了格式化和调整。 -8. 优化了布局中的一些性能问题。 -9. 去掉了对过期代码的兼容性。 - -### V1.1.5版本新功能 -1. 添加了新的布局 **浮动布局**,浮动布局实现不规则的子视图的排列,卡片布局。设计思想是从HTML中的CSS样式的float属性得到了。 -2. 新增智能边界线的功能,通过智能边界线的设定,可以让布局中的子布局根据排版而自动生成边界线,而不需要手动去设置。 -3. 修正了各布局的wrapContentHeight和 wrapContentWidth 可能计算不正确的问题。 -4. 修正了布局视图的leftBorderLineLayer的宽度不正确的问题。 -5. 增加了MyLayoutDime和MyLayoutPos这两个类中的方法clear,以便能快速的清除掉所有的设置。 -6. 优化了速度和性能的问题。 - - - -### V1.1.4版本新功能 -1. 修正了尺寸评估函数`estimateLayoutRect`的一个多层嵌套是无法正确评估尺寸的BUG。 -2. 添加了属性`myMargin`用来简单快速的设置myLeftMarign,myTopMargin,myRightMargin,myBottomMargin都是相等的值。 -3. 增加了`MyDimeScale`这个工具类,用来实现不同屏幕的尺寸和位置的缩放的功能,加入我们的UI给我们的是iPhone6的设计图,并指定了某个视图的高度为100但又同时希望在iPhone5上高度缩小,而在iPhone6Plus上高度增加,则可以通过`[MyDimeScale scale:100]`得到各种屏幕的缩放后的值了。 - - -### V1.1.3版本新功能 -1. 对SizeClass支持和竖屏MySizeClass_Portrait和横屏MySizeClass_Landscape。以便支持单独的横屏和竖屏的界面适配,尤其是对iPad设备的横竖屏进行区分适配。 - -### V1.1.2版本新功能 -1. 全面升级,新增加了对SizeClass的支持,通过SizeClass的功能可以为苹果的不同尺寸的设备提供完美的适配功能,对SizeClass的支持,是在苹果的SizeClass能力上支持的,因此只有iOS8以上的版本才支持SizeClass. -2. 流式布局MyFlowLayout增加了按内容填充约束的方式的布局,当arrangedCount设置为0时则表示按内容约束方式进行布局。 -2. 添加了一个新的视图扩展属性mySize,以便为了简化同时设置myWidth,myHeight的能力。 -3. 将原先的布局基类名字MyLayoutBase更名为MyBaseLayout. -4. 修正了直接从MyLinearLayout或者MyFlowLayout建立派生类并初始化可能会出现的死循环的问题。 -5. 增加了对布局视图的autoresizesSubviews属性的支持,这个属性默认是设置为YES,如果设置为NO则布局视图不会产生任何的布局动作,也就是所有的子视图的frame的设置是最终的布局的结果,设置这个属性的作用主要用来实现一些子视图的动画。 -6. 修正了其他的BUG。 - -### V1.1.1版本新功能 -1. 新增加了一个mySize属性可以设置布局的宽度和高度,相当于同时设置myWidth,myHeight -2. 修正了和iOS的AutoLayout结合使用时可能出现的布局定位不正确的问题,这个版本可以同时和frame,AutoLayout布局进行混合使用。 -3. 修正了其他的小问题,以及注释进行了优化和完整。 -4. 将原来的leftMargin,rightMargin,topMargin,bottomMargin,width,height,centerXOffset,centerYOffset,centerOffset这几个方法进行了命名冲突兼容,新版本都在前面增加了my前缀,如果要保持老版本请定义宏:` #define MY_USEOLDMETHODDEF 1 ` 和` #define MY_USEOLDMETHODNOWARNING 1 `。 -5. 将原来的的MarginGravity枚举类型和LineViewOrientation枚举类型重新定义为:MyMarginGravity和MyLayoutViewOrientation。里面的枚举值也进行重新定义,但可以定义宏:` #define MY_USEOLDENUMDEF 1 `和` #define MY_USEOLDENUMNOWARNING 1 `来兼容老版本。 - - -### V1.1.0版本新功能 - -1. 增加了新布局流式布局MyFlowLayout。 -2. 线性布局添加了gravity停靠设置的屏幕水平居中和屏幕垂直居中的功能。 -3. 添加了设置布局视图背景图片backgroundImage和高亮背景图片highlightedBackgroundImage的功能。 -4. 添加了视图偏移约束的最大max最小值min限制,以及尺寸约束时的最大max最小值min限制。 -5. 添加了布局尺寸评估方法estimateLayoutRect以及视图的评估rect值的功能。 -6. 添加了框架布局中的子视图的高度和宽度设置功能,可以让高度或者宽度设置为父视图的高度或者宽度的缩放比例,可以设置高度和宽度相等等功能。 -7. 添加了线性布局均分视图设置边距subviewMargin的功能。 -8. 添加了在布局中让某个子视图不参与布局的功能,只要将useFrame设置为YES即可。 -9. 添加了布局视图设置按下事件setTouchDownTarget,按下被取消setTouchCancelTarget的事件功能。 -10. 添加了线性布局均分时的间距值设置功能averageSubviews。 -11. 添加了清除视图布局设定的方法resetMyLayoutSetting。 -12. 修复了布局占用大量内存的问题。 -13. 修改了布局内添加UIScrollView时橡皮筋效果无效的问题。 -14. 优化了一些约束冲突的解决。 -15. 优化了布局视图添加到非布局视图时的位置和尺寸调整功能。 -16. 修正了子视图恢复隐藏时的界面不重绘的问题。 -17. 修正了布局边界线的缩进显示的问题。 -18. 修正UITableView,UICollectionView下添加布局可能会造成的问题。 + ``` + github "youngsoft/MyLinearLayout" + ``` +2. Run `carthage update`. +3. On your application targets’ “General” settings tab, in the “Linked Frameworks and Libraries” section, drag and drop `MyLayout` framework from the Carthage/Build folder on disk. + +4. On your application targets’ “Build Phases” settings tab, click the “+” icon and choose “New Run Script Phase”. Create a Run Script in which you specify your shell (ex: bin/sh), add the following contents to the script area below the shell: + + ``` + /usr/local/bin/carthage copy-frameworks + ``` + + and add the path under “Input Files”, e.g.: + + ``` + $(SRCROOT)/Carthage/Build/iOS/MyLayout.framework + ``` + + + +## FAQ + +* If you use MyLayout runtime cause 100% CPU usage said appeared constraint conflict, please check the subview's constraint set. +* If you use MyLayout exception crashed in MyBaseLayout *willMoveToSuperview* method. it does not matter, just remove the exception break setting in CMD+7. +* If you set wrapConentWidth or wrapContentHeight while set widthSize or heightSize in layout view may be constraint conflict。 +* If you set the layout view as a UIViewController's root view. please set wrapContentWidth and wrapContentHeight to NO. +- Just only MyLinearLayout and MyFrameLayout's subview support relative margin. +- If subview added in layout view, the setFrame method can't setting the origin but the size. + + +## License + +MyLayout is released under the MIT license. See LICENSE for details. + + +## Version History + **[CHANGELOG.md](CHANGELOG.md)** diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 3b86653..f6158ee 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,3174 +7,3553 @@ objects = { /* Begin PBXBuildFile section */ - 006F18B57BBD06D92D1B57F6BE1BD9F7 /* IQUIWindow+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = E361C521530C24F374AFCC26F76C675F /* IQUIWindow+Hierarchy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 00A40F4FE52842C643A616F04763F040 /* FBRetainCycleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 663231E19B99FD240BB15210ABDDA00A /* FBRetainCycleUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 00F68793C69EA34656C0BC51623A4E1C /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = C461681BED27151F945752EDF2C87F36 /* UITableView+SDAutoTableViewCellHeight.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 01149FA585A714569093657B85C1A350 /* NSSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = EEBF868F328C3579C273A0D79731FFC0 /* NSSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 014F045F0956DB497E4FDEFBF00FFCCC /* UIView+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = D2F7CEBB1A9B91FD3A804467D307AA6C /* UIView+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0232AFC8527610445D2AE3EE8DC9EEE1 /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CB9B68BB8F1BE464BBCEE628882E0E4D /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 032A6C8B7A0E1DAEC294BE47AD3EE159 /* WKWebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FA3881E78E67569BF5D4EFDB53DBA32 /* WKWebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0358B918CA8C9D3C214FD4D41CD69A90 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADEBD85F4C1C7213EAFFE19D21B4184D /* Security.framework */; }; - 03592DBD830EF65C1AE796A0697F46E1 /* NSMutableSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 431D3C2E9513FB79D81D480A2F281CDA /* NSMutableSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 03F90390BB70FCFBECE813E3BC9DDA54 /* NSObject+A2DynamicDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 14147080BB4335069C2725DCDEBF7353 /* NSObject+A2DynamicDelegate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 045FFEDD819A734271DD5DE53C877884 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - 04A855F7BAE10AE697401F7D3532E938 /* NSArray+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = A4FCB4C2BC1481601FCE9EBC2346A5D2 /* NSArray+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 04D809491B653AEC2D98D130ED11BEEB /* FBAllocationTrackerGeneration.h in Headers */ = {isa = PBXBuildFile; fileRef = B11ADBFB315AA27808E3A1D00E776B3C /* FBAllocationTrackerGeneration.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 04E4378CD31ABC4370E6794E529EEC1D /* CALayer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = A74F767F8BEE2C2006AA63DB75092641 /* CALayer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0555D2F5823F13EADB9325C869622A6E /* FBMemoryProfilerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CEB17BF1D637D3D3B4541833DD8413B /* FBMemoryProfilerWindow.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 057758EB3BE2D8C680D95DCA121B9A9E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 067D10BA1984BA3497E9211A65FC2048 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = FF30ACFCC15DB78867B78EE625B52241 /* MASConstraintMaker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0692E35064349B6FA8C1EFD50B7B1F45 /* A2DynamicDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = F3EF33ABB1B73B0A960D36421A6D411C /* A2DynamicDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 070A9D81A8DDACB75FC5B58FE31DC01E /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A931BD93CF0462C69D3484B1A1B26CEE /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0730F351065B86DA2E16F00C83D0FDE8 /* MyLayoutMeasure.h in Headers */ = {isa = PBXBuildFile; fileRef = CB55B2B1F3E97DEB9D1F7164C5D4B855 /* MyLayoutMeasure.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 073B38C4ACF5293933CFAAE30141E27F /* YYTextMagnifier.h in Headers */ = {isa = PBXBuildFile; fileRef = C0896B8206ACB730E0FEAC6A1A8DEE3F /* YYTextMagnifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 075C59B1F2E9CFF59E75341DD2F21240 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 0766686B5BF862B61E4C338AD8ADA185 /* YYTextRunDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = E2731F4D7BD3F9247B4761D28F321760 /* YYTextRunDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0951ECB79A8DDBA8DC3077FA1CC84E6B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - 0963AEF6E13013896F86C1DFD5F50D37 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 148701A1AC001223787225C8E94DADA2 /* NSObject+MJKeyValue.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 09E03A16C24F7463E5DB6A84F1396E0A /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = AF0B5F3879319F1C775D755A16DB60C9 /* MJRefreshAutoGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0A08FC71C4E3B8E0F8734BCDA7CCA7CB /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 6509A409EC7C2E72577991AF6C55F12C /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B5A22DB32C45417EA429BCD6BD30AED /* MLeakedObjectProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6297F00AD799E12E9ED2C989B1ABE31B /* MLeakedObjectProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0B77D000D11EE22180E186FAF868BFE8 /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = B6C0794E2599D34D259A975905CCFCF2 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0BC82D8C499A16ED0C138139D053BB7F /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9B8CF61AEC65F25B77F6A701704785 /* AFSecurityPolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0C28C7FF90A263CDAE9C9487ECBB0E94 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = DBB096B7CC3837A70F84D8164E0865F2 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0C8757279372BAA15C4AD87A46860FA2 /* YYKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 871BFF58AD76397C230BF88813DA3552 /* YYKit-dummy.m */; }; - 0DFD3B43C8895C738F3553552AFBB0AA /* FBMemoryProfiler.mm in Sources */ = {isa = PBXBuildFile; fileRef = D95948DEC2901596D888633F34A13CC6 /* FBMemoryProfiler.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0E09DAAEE47B37EA8E57D5CF715DBDA3 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = DF88779B8746883C828911769CE87E6B /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0E1FA3BC542694799F3C4CD261299859 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 468C7846CEC675C941C4E6A8B977C108 /* NSBundle+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0ECC49B53E7D68F3713FC8BD8977FE90 /* UIBezierPath+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 7564C59377A383BAC298FE2550F26887 /* UIBezierPath+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0F0550B889810895B32BCA065DD6CFC4 /* NSObject+BKAssociatedObjects.h in Headers */ = {isa = PBXBuildFile; fileRef = E2DA34D963312173C67C4B7D5132546C /* NSObject+BKAssociatedObjects.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0F780CD12343E2A5BFBF5026C004D97F /* YYTextDebugOption.m in Sources */ = {isa = PBXBuildFile; fileRef = 958A71E7B0AE9F777DE7B830F9DC4E78 /* YYTextDebugOption.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 0F7EC02E944F8719A5EBDC9D29F9E99F /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 284AA4125C954750088AD99CE79A0390 /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0F99703632B0614C473CBB32B23FC79F /* FBNodeEnumerator.mm in Sources */ = {isa = PBXBuildFile; fileRef = D7046318878BEB7205B99B6497830033 /* FBNodeEnumerator.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 118227C43F283C87130BEE2BFABC7EBD /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F85EB7EE4B021B05D803640358DB6D3 /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11BD0A6C1E6B49EBA6EC80B24EC274B1 /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = D7FA3479A588D12346AABFFC5E7B8AFF /* MJRefreshFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 12D90D3667090B1EF261E0D5E075DA7D /* NSParagraphStyle+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = B565FEFE249C5B7001CAD58462E908FD /* NSParagraphStyle+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 12F7B27FB2422AC6413E77B7F98812C4 /* UIWebView+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 87041701DDC2AF6EF53484A6FB3CEBDF /* UIWebView+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 13695CE9BF36F26CA806C5CD2D6ADECA /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = B213635D79D1B0C8415CD8DDD0D92E26 /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 137F34842F332C539BBBBE525F383183 /* YYTextRubyAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 0ADCEF6352BC832F0E4F53F85511C0DB /* YYTextRubyAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 144A5898941351DDDD561B3811BE9BDA /* MyLinearLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8783D880D8711CB50035F442FD3681BE /* MyLinearLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 149AB7AF81F8643F035A484727F92D63 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B9EC4CF4EF07A52E878A226F584FFB05 /* IQKeyboardManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 14B6D7130587884124D610519251CAE3 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BB20CE80B99FD2CA8B0D10B3A8B42CF /* NSObject+MJCoding.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 14D0600F30531EEA137F11A720E5A83F /* UIImage+RoundedCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = ADD4E0D477E9E2D33FE7546548637C75 /* UIImage+RoundedCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1750E8156D634B9DCFCBDF366430F326 /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = D2E64A5822968FE5CB3F68A4F8705C72 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17912D9A89FC36E82029409E9B74A61A /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F230BC7920E555B8E82AD99BA354C48 /* MobileCoreServices.framework */; }; - 1885895131984E055ED6B984CCFD5AF2 /* YYTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 24E9F4392DC7217FD6A66AE4DC043C0F /* YYTransaction.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 18EB290A51527C1C55C7A950C79B3F32 /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = C14C1A6243FFBB0FC900BE895E7A01B3 /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19CF814B377FEF554E3A07450DCC4602 /* MyRelativeLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 157FD8FC98DA7B0818E8A6324CFDEFA9 /* MyRelativeLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 19E6319F6ECED7539AABBD9A211F7AEC /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BAC7C173C6267FA2878B5B7D39EA518 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1A1A87D09BFBF8057A958C6CF5F73F18 /* YYTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EFBF9A13077655D3157F4AEB2F2FFC0 /* YYTimer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1AA584F301D6BC0012E168F0F0BA851D /* FBRetainCyclePresenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 95E2F474CF8CC4926A38DC930677D4C4 /* FBRetainCyclePresenter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1AC7C3A74405C96F3AC6003D9BAAEDFD /* FBSingleRetainCycleViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = B8EC09614D18706ADB27C639ECF62DE4 /* FBSingleRetainCycleViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1B2F3D8DDFDA028A5FBF9D9571A59F20 /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 5CBC0BE73FC27649007FC579ADC89F24 /* MASConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1BE7CD118C7601DDD1629547E938ED5E /* NSMutableArray+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 94A7759DD55D96042DD24572E5A81971 /* NSMutableArray+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1C289876A4849D6798FC7F154214C5F8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 1CD7E245A5840BF91C834E899B4A92BE /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D681BEA5F306A6CD1E1FAC1DA0E9D7 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E48D4BBDE4668F857067186BA24B29F /* MyDimeScale.m in Sources */ = {isa = PBXBuildFile; fileRef = 93735590AFFF95840B7DF9F446B23CA4 /* MyDimeScale.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1E751FC35B22B2B304F73C9688029FE0 /* NSObject+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F8BA914C2EDBB0166CB02E3C805D3AF /* NSObject+MemoryLeak.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1E88082E67EECA1458FA24BBF7677908 /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = CA6BE538EFF2B2C5FE9FF241AE9AC602 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1EBEFB5E6D7DC300C503592C80CC8E16 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9871D9D77A455E39AE9B6497639C0A /* AFURLResponseSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1F3585F149FCF78A54BE4D46FE15FCEC /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = B9F6A08C41CC3352A79FEA17317EA713 /* MJRefreshComponent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1F44F182C55C5320BFF4F74CB5E4092A /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B9F88D64640F1DEFA5DCC1C0537CCAA1 /* AFAutoPurgingImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1F82D8EB1EF83781CA1DBCB8D4CA8005 /* UIPopoverController+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = B7E1DB591E88AD637D3206E8D8F7D8EC /* UIPopoverController+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1FACCDACF70A7AF5AAED0F35D9AC0642 /* BKMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = D5E91893A2BA596C95A6A8AC13D5C898 /* BKMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 20B986E1BA479165AB677D5F3062B277 /* FBClassStrongLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 306EFD48787CB56175CEABCADFB7845F /* FBClassStrongLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 21540533D941A9A70D5F3F51EE7F84B5 /* UIImage+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = BC3BD023E4995C3ED0207C16D4143987 /* UIImage+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2224DF25740387536B47C8303A1EB43E /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 383D930024C4C0FF2B4F1A76A1E18DD0 /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2276F933F3775D6C59749D45521268D5 /* FBClassStrongLayoutHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 63D17970897F3D5A88BDE33EA9F6DDC5 /* FBClassStrongLayoutHelpers.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 22C1F5CCA9410E78E62B7A9EBC670EAF /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A05B62AC97E8E1C6C77E3A21F43A25E /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2344E01BC94E6F79AFCB264030184D73 /* YYThreadSafeArray.m in Sources */ = {isa = PBXBuildFile; fileRef = 700C3083A6BBF19EF6D5F2E9AB4741ED /* YYThreadSafeArray.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2359387620C5E815BF0594BC40311734 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F5558DDA0210B74435B1D0814999FFB /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 23D376C1DB24F3C16D9ECDD09DB1B111 /* YYTextLine.h in Headers */ = {isa = PBXBuildFile; fileRef = C57DC4863CC2D833D32F6CBEDCC968FB /* YYTextLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 23FC2C390CCEBD27E6B7F1F16E370E75 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D02EC07EA217DE294D925375F8246D0F /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 240DAD6C58BCFE616348F02803A3399E /* NSInvocation+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 24170A9015D9E86DE54E9BE4372EA733 /* NSInvocation+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 24EF18CED914BFB97D469CF93BB5D7B9 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = AF5E9220586D448D78D85E7BDD02FD3D /* MJRefreshNormalHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 25661F4D1324CEF362F927106BECC218 /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = B0E06B3A50429D9BFC7461CFE1F7468B /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 25745A4CD298D10F19E043B0F5636116 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - 259A59B384798F57C2020DD58C8B13F0 /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 692F45E832E6A544635CBFF712D6F87C /* MJPropertyKey.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2654BD200044926EB279FCB467E518E9 /* FBAllocationTrackerNSZombieSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0E91F4A51FA8E49A4563BB19E2EB99E4 /* FBAllocationTrackerNSZombieSupport.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 270C2EB8E082940CA1D04C6A184B2700 /* YYImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 11992BBAA6234C5C16A552FBB9F7F876 /* YYImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 272A3B51FD7D1A3586E668A57678DFC1 /* NSParagraphStyle+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 80282B48EA9DC88F386E733783F1476C /* NSParagraphStyle+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2758709BC359AC175CDB336F1F839633 /* UIFont+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AFDC3BC9CF02334CDE8A19341D0A38B /* UIFont+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 27E8139ED32F1A2770ABC880760DA012 /* MyBaseLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 9520E1D6180B291AA5CCD95D10179016 /* MyBaseLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 286C497DEFE756B68941590057A91030 /* UIControl+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 87F164C0C76BEAD58EDE33382298F4C6 /* UIControl+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 28A0BEDF1DB5E178DEAF1D03F718557B /* NSArray+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F192F3381307CF70B3205D104DF44C6 /* NSArray+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 28A8E94E82C0259F99D8C3608B3BEB2C /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = A39BD32D19E2AABD049C78C03E2C61AD /* NSObject+YYModel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 28D7A6F790D250BCB5AA898F9EAFD960 /* NSOrderedSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = B150A31B862AE24722F4DA3C4436F3BF /* NSOrderedSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2905381350CEFFBFFA9BC8B5D027F190 /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 457D815EB7A0C4D04D170072A869F018 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 290931DC1EE8D0B72C83555DA72253DD /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 751D641C448FB0C3D4B2F43B7074C236 /* AFHTTPSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2936F2242B3780EBD36FD41FEC887E1D /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FB4B5260A762969A24BF67D414EF643 /* CoreImage.framework */; }; - 2979E54C4AFD27076576E82ADEED2F00 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = EEBC201545F6D08325C07BEFE95ED729 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 298D697789B1AD05F58063A57A24BD33 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FE30B18657E66B3C35FB72276D701BC /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2ADCAA69B7B2AD44E140926DFB464239 /* UIScrollView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 4053875D218BD287F8F5AC013633D8BB /* UIScrollView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2AEE9D9F9CB72B98F5DAE5AE1906462B /* IQPreviousNextView.m in Sources */ = {isa = PBXBuildFile; fileRef = E75E291B3A0973671AC25F9E496173A0 /* IQPreviousNextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2B342A1143B39C7E396A50C6540E2639 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAB02C4C5CF01C1DF1D33336447A8F13 /* QuartzCore.framework */; }; - 2B9B56CC07319AE1CD5CB592FBE31075 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 2BE321E2414962431B1A996611CBDE20 /* NSMutableIndexSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = F8131B2692E436306CEFF69EE2C8B173 /* NSMutableIndexSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2C05968F3869597E4B6FAB9636D60745 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F170CD1EEF56260FDAFCAEF342C3FD8 /* YYDiskCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2C2D3EE50DF207F2424F46700850053B /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 36987C06B3A89FF24559FD5CCF12CA7B /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2CBDD27BF2EBBD24A8BD3EA71DBCC648 /* NSObject+BKBlockExecution.m in Sources */ = {isa = PBXBuildFile; fileRef = 67462AA0A44CCE1BA60300302B461C07 /* NSObject+BKBlockExecution.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2CDA1380006B420F20274ACC6B56DCA5 /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5BB2C01F462AD8F43C95BD5DDC756358 /* UIActivityIndicatorView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2CE53012972EDDF89E0334BDDAF4A92C /* MyLayoutDef.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CA0A2BFC5C36CC35B6052E3CE91D5F8 /* MyLayoutDef.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2D738D02D48D3153D7038EE6807923A9 /* YYTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 998A73EF5B4DE379B44CE605DB3BF0A5 /* YYTextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2D7FBA552B3CED667D78641BD3DEF96C /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A32E551FBED662DCD9CC3F2192E5937F /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2EA6C717E673A7463E0D234E7EE865D0 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF629F5D0C79C753A9E822947DEC1586 /* ImageIO.framework */; }; - 2EE24D06F06A46ED8D00E372A01F7300 /* MyFloatLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 72076BB438B0C2D1C303AD9C9BA3877B /* MyFloatLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2F256EE9E2E8BA34E7FF30CCC389FC68 /* MLeaksFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 273058C0C66CF91736A9996C2ECEFB6E /* MLeaksFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2F3044B21B81C821082E67B2EA37961A /* FBStandardGraphEdgeFilters.mm in Sources */ = {isa = PBXBuildFile; fileRef = 970C7F34BB8C96A56778E6BF049B56C0 /* FBStandardGraphEdgeFilters.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2F481514A18F6CA81CFB3F21A067B7E5 /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CF1CBBC6B1465C6113A29F1F01CFB73 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2F83CAFE70F514D552676227BB4A404C /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 256E82EDE793BAEAEFB952558470B935 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2FD3739A31A56E4D7D594C783E9E9541 /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = CE39C9AB6573BE673FD2B852BC4B7668 /* MJExtensionConst.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 2FE39C0008CB689DE5CDCCB4A4929820 /* UIView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = E13097D81D2A6053B27C37D5D3D1EA12 /* UIView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 305D76C2BB2420B6732696C216B01B3B /* NSObject+BKBlockObservation.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F0E3F14042F7F714B53546F93428CE8 /* NSObject+BKBlockObservation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 30917968A189E35A5CFF690875109AB4 /* FBBlockInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D7DF41956ADE4579BFC3EBB6EC305C0 /* FBBlockInterface.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 30DA0B928C8F28E3C3F279C3833458A0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 3167BFE069882992E2B9402CFBAEB982 /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F92F262092D9E79A704AA51E0E19D16C /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 326A543AD4E39A2DAECA1CD385E3AEA2 /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = CA5A25BC9D4E907A46EEBBD41109CA53 /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 326BFC0387011D29CF5FF94116B88C92 /* MFMessageComposeViewController+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = C345638781FC3EFEBE27425ADF905768 /* MFMessageComposeViewController+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 331718BFB4A91CFFE026492905231562 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FF8CF30A052EE5A10BD71D80CE6DC20 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 33880EC1770302F409C5DE019B09B2BD /* YYCGUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEE999CC8EC152F56361B5BAFE47F3C /* YYCGUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 33C43B6C020C6A9CC4EE5C22650C550E /* MFMessageComposeViewController+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8BBC3986DFEFC61B94AAC7474F917747 /* MFMessageComposeViewController+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 345B4200BB80FAC8543D82A17648A770 /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 71A8121E9635F0DF135166A778D5A0A0 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3465C3C047956110FBB9E8EB020EDDDF /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = A40A365166264C987FEABDD1E3BAEC0B /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 348F552E5662196122424C1970EB40CA /* UIPageViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 7708982EC1C7F7B4A4002C2E81A2DE33 /* UIPageViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3511AE7ADBB71D05565854F0E70B7D08 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8296F65452B28EC27F69D8356CA906A1 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3516F9FFA8FF239324AA90BB278F054D /* FBMemoryProfilerMathUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = A3571DB6462414D99889619FD60449AE /* FBMemoryProfilerMathUtils.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 35CE3230014A5B98952EF4BE7F67D537 /* BlocksKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9107142D5A508CE3517BC71013C652F8 /* BlocksKit-dummy.m */; }; - 3650C584B834268677A8F4C6B259761A /* NSString+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = E30A9675183BB486BE625AA6316E7721 /* NSString+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 366A613AE07EAA35B5789F6123FB48AF /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = C17D76842FCA2CB02F088DE122BABE1D /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 36BFC7E736BCA8233A4004AFC712153A /* FBAllocationTrackerSummary.h in Headers */ = {isa = PBXBuildFile; fileRef = C634773DB7672C08216B7B3544CCD0E5 /* FBAllocationTrackerSummary.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37264B40140B388AA1130F9E7656C14F /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 926D0824BBAF28B0096FAEDF16DEC917 /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37CED1748DCD857838B8675B49829B29 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 17588397F6D4A64CA58F2537E7ABAFD1 /* YYCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 37ED3D242A875B92B6F981113C9CD95B /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1471C10244B0C59AE403E080621F636 /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 38915EB1AED5A57209BC2BE02D7568AC /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = E57F44121735798601DF56B845467DD2 /* MJFoundation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 38FF77DC6F076F9A8F92A58A51FCD6EB /* BAButton-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C259586F4BB0915D57F936BAC4DE509 /* BAButton-dummy.m */; }; - 3939531EB270B4145C7ADFBAB2E5695F /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D09EE8D2C85CA40EE3C7F87F72617256 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3999EC69559D210C2FC9DCD3153E2B82 /* NSTimer+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 2734F98AAA6AD94C522DF97253A97BC1 /* NSTimer+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3A1E775BBC5949BF87E7A743D89F003B /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBD3F19020D7F999796C6B139E9DE3A /* MJRefreshBackNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3ABC5E049E9452FE01539DC400A34422 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 3B1106E8F7240255F564CA89DE1254B5 /* YYTextInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 24525023577B19B37EC310F07C3BB51F /* YYTextInput.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3B6EFBA75F4732825DE1A1E8CA7B9417 /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = C14BD54122A5501582104EC3C8921B15 /* MJRefreshAutoNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3C6227087A9E105DB1B3A2B09B06BBA0 /* NSIndexSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = E5EBF7E78D49012DAE5811432FC529ED /* NSIndexSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3C7EBC0661A3D5EC003D315179C1F139 /* FBAllocationTrackerNSZombieSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 13875EC6C753C3AE6747B41E47EAC2B6 /* FBAllocationTrackerNSZombieSupport.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3C8186E2FE94E7D9FA0876B0868654FC /* YYTextInput.m in Sources */ = {isa = PBXBuildFile; fileRef = 118B6B045D782063BC5F00DEA30235A8 /* YYTextInput.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3CCD46AA36C4A376E6D4D640F675CB43 /* FBIvarReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 3341EB532562B2DB29FD8C8F4CD3EE70 /* FBIvarReference.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3CF5DE3EC202C9678B0120CB3CC93FE3 /* NSIndexSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 06CB2811BB4F04F971944D0C865DFBBA /* NSIndexSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DDBF272E8CDFCBA7878E8A552E6A291 /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = AE830205054F9829AE63DDB1BBE18D5B /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DF2307D736F5A334CC5392A06B142C0 /* NSMutableIndexSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 06EFFBACB25D467EA1669A58905F61F7 /* NSMutableIndexSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3EC83B36FA479649971142515128F938 /* FBClassStrongLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 1536D708BA62C4FBB75AE4559672F451 /* FBClassStrongLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3F142396BD956585FAF5E4307AD20A57 /* MyLayoutMeasure.m in Sources */ = {isa = PBXBuildFile; fileRef = FBB383E3DDF012639BE5401783FB6B1A /* MyLayoutMeasure.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3F63C119F95A6735AE627BBB1BEBC4B1 /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 8242AFF25B2FC27DB1504F6D7D610492 /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3FE106A8255FE6832D30B96EC0466D90 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = DB7B7F8B9D09D708552B8FF85D1D7AD0 /* NSLayoutConstraint+MASDebugAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3FEF5414BF754A8E09EAE87999786773 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 3FF8EF9B70D8D84033BF59952D32A730 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 77CF34DEB06540E223A4E361A2550DAB /* MJRefreshHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 401E263227EC555D61B8BBB94ED09D73 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7081EA450B46B30A885165B54CB34218 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4038F2778527875EBCCD377311FDEE75 /* FBAssociationManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7B6C8A4888C7CF99D2AD9BCA9D9D5D72 /* FBAssociationManager.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 406BFD75951518E6FD0A4F10CBD93254 /* YYDispatchQueuePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 24F6496E988D11AC33FDBCC2280A3915 /* YYDispatchQueuePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 40D26CACC0D931F5FDE0F3EE76188A45 /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F66536B55F1D950E6B14A8421B3CFC3 /* IQUIView+IQKeyboardToolbar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 40E4052826DAD23726890F26961637B7 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F2F05222313ACD72D4169968076AB6E /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 419465AC1FD47D619AEA221B345262A5 /* UIView+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DD2CBBADED16457D1732D3822CA08ED /* UIView+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 419DA9897DEA0DF0FE6AB4A5523B8FE1 /* UIImage+RoundedCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 9235FCE9082CA58ACD63B241E9291D86 /* UIImage+RoundedCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41DBC560AB3DCD85C4152E417F0D8D84 /* NSTimer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 68AC8F4C9B4382DED3A74EE06211EDD2 /* NSTimer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41EF6D150DF59842B789CFDFA5E6CBD4 /* FBMemoryProfilerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 705959D551DFEBB854801ADC36DB7722 /* FBMemoryProfilerViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 423CD981F80732AA6C075F7F633CFBBD /* NSURLConnection+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6695B9B3C95B89F49A536147248151 /* NSURLConnection+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4245B5321654797B4991A47934C62842 /* FBMemoryProfilerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B8AB11B7F08B0AEE5078DBEFB8BB0F65 /* FBMemoryProfilerViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4275AA7FC28DD01FBC70E13B98D2FEA8 /* UIViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F50D2DBB0272E5F1F817513CA465D6 /* UIViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 42AB8E601C83D14E8DE88DC98DF14326 /* YYKitMacro.h in Headers */ = {isa = PBXBuildFile; fileRef = 89EE531FEBACAC381FBD105FAC596020 /* YYKitMacro.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 42B48D4AFDE43C0D1C3204C8DE7556AC /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = CD68B0BDB606FE3E3852FC50AB401CFC /* MJRefreshConst.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 432BD50F1E699EDF2EA007E850FFCEF7 /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = CEEB45EDCFC9B270BCFE032A7AE81E84 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 432F9F0DCFD2F1A6CA1DCE23A33C1848 /* MyBaseLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7385F529ED38C1912C19B342FDE96A95 /* MyBaseLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4330562BA1A299CBD37F4602B1A4C95A /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = F3344DCAA1D92FED489A26D42524D37E /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 438B2CD8E9394A35B01949DF7744297B /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 587F16F5BE4442EE547B80E02F884369 /* UIView+SDAutoLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 43C2855DEABCEB6AC756D1846AECB766 /* NSNotificationCenter+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E180D9F1A9A25F97404D8541CC6C050 /* NSNotificationCenter+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 43C53567AD4C9249F883F094C861D4CB /* YYTextLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = F339944D1DE1DBBC3531925D7096318F /* YYTextLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 455F71D95890455473B3AF068D2003D1 /* UIPopoverController+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FB7774E0054E023612AC90FAC907624 /* UIPopoverController+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 45D33F39444225E8034E30AEDE7B3981 /* NSObject+BKAssociatedObjects.m in Sources */ = {isa = PBXBuildFile; fileRef = 11A16B98132C5D6DA4AA8582B1B02FC9 /* NSObject+BKAssociatedObjects.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 45DBD613925B852D1636F679D8DDB7CF /* YYTextEffectWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = F56D1B6C10D1F13D6A18CDFE635F3060 /* YYTextEffectWindow.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 463739553893671B1BEA2E5AEC315D53 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 03C137D5082E643CFA81434C69F92836 /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4664724C03598493E1CEB48C745F447F /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = D36BB1BCC8E2F29B9B000C894EDBEBDF /* AFURLRequestSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4722F520DE1E7EFE1E8EC4C3FC44CAC4 /* UIApplication+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = F6A8C0F42635BF416D1CE21CE53B85C8 /* UIApplication+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 472A06CDF9C801074C35F7764CB235A1 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 27D288C16715291171958E598EC02B1F /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4778F9B01748F1471E4B703346451961 /* UISplitViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D231300C964E617A1CCE86035669FF /* UISplitViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 479EB0898EB9291A645CE0DC9E77FEF8 /* FBAllocationTracker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FF6B35F9B556AAC0817BD6310B7E8C2 /* FBAllocationTracker-dummy.m */; }; - 480BCDADA52E3673CDE007C04345147E /* FBAllocationTrackerSummary.m in Sources */ = {isa = PBXBuildFile; fileRef = D19624A87A419359560798A1BB0B6F44 /* FBAllocationTrackerSummary.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 484776F8B4CF9A89AA18C6874E246DF6 /* NSObject+A2BlockDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = D6382D11AA5824138CAA1CBDF864CC67 /* NSObject+A2BlockDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48F8FC2F0AECC4C025ABC140065A9D43 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B3C96C11CED65BD329589B420D76977 /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 494C17BD48C41F29F889ECC0BD466687 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B37F82FBCD2C7C3E0AFB366268E430D /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A55E2CB58A23956EF1822F5A6DF5F2C /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C84A08F80D1887EA7BD94544170D1E9 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A62800BD30A9E07DC819BB431535389 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - 4B6CA4C3C1D6D595C6468009E4A81904 /* UIGestureRecognizer+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A487A7BF3CA3F7B5DDBE294BB353222 /* UIGestureRecognizer+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4B918BB6FA350CA4E2E48FB612333308 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E91B7A86A2A598221752FFF271FDDAB /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4C359B72D6BDE27D946D1B4D5A22DE00 /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = C3733709FE00D30C4BAD0E7DB04981CC /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4C4CBFEBE60D51CB1BFF276CC4FA95F2 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = C8052BECC9F8243FA232F386E0FD5C7D /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4C5E9DE7937995E6B6A34315FF8DB64B /* CALayer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A29391645458A5ACF59762C0A9846D /* CALayer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4CBDCE45596026507958F76E1192CEEF /* FBMemoryProfilerView.m in Sources */ = {isa = PBXBuildFile; fileRef = B14E63E64DCD2A8AA1960223D09A3EC1 /* FBMemoryProfilerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4CC110CEA5DD89210433C11EEB3EA828 /* FBAllocationTrackerFunctors.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F2940E20C7CA58D7F9055821B4681A8 /* FBAllocationTrackerFunctors.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 4CF12EE8FFA7E2E58665D838C0318D40 /* YYTextKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C9861C770CEF1C5AD1070AD4AE9A137D /* YYTextKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4DF585895E8CD3C010BF93D6DF48B54F /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = D657546308DBF394A9D70B57267F3EB9 /* AFImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4E52F4ADB8675237829C8E518F9AC3D0 /* UIDevice+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = EED9B0E5C27AF17F07BE6DA6FD2F4334 /* UIDevice+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4EB136A70316D23DE42D192ADC878FD0 /* FBAllocationTrackerGenerationManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = B7B4A426B2E5B8AC2816131992C12FB4 /* FBAllocationTrackerGenerationManager.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4FF1D5ABDD8F9D39920D0C629D545670 /* WKWebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 24742DEC1D6C6F047EBC393BC8C6BD7E /* WKWebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4FF8E2D1193DD5C5E02861F16802AEBD /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 04EA5B17C9CF37400057DC8398F858C1 /* MASLayoutConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 52D2FD213D49135B77A6F0DD43BD69B4 /* FBMemoryProfilerSegmentedControl.h in Headers */ = {isa = PBXBuildFile; fileRef = 42BDF165D26E6DCA2F9FFCB395C0383A /* FBMemoryProfilerSegmentedControl.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53063C18938DB19134BBBF1A083A3C96 /* FBAssociationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 05FA771F306FF9958CA14779311F5CA8 /* FBAssociationManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53181BA474ACF31FD44C6168F829E728 /* NSBundle+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 5FD0CC0BD84DBBB4B7AC6B3BBFE39221 /* NSBundle+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53BAF67F6307A2BC5ADC2EC7C6D1DC37 /* FBObjectiveCBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CDF2C8E6691C4AE61AB9A4B979AC5C1 /* FBObjectiveCBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53F1F6E74D2A3030BDD2F7A803B73BE5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - 541F9B734C20637D5171176AC001B554 /* NSSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = FFE92269E9A9E5678E46A33078FD57E4 /* NSSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5467BA80FE76E5928DBC92FCA8F319DD /* UIAlertView+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = BF0E6DFFA13A3D990A16B5FD1AB040D2 /* UIAlertView+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54FB72C5966076D8AA1AB3C3C9D97A5F /* YYWeakProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = E69CB91A5BAE7E61ADE8A4E67875226A /* YYWeakProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 566D8F1463DF3601861C0E0C304CDC1E /* Pods-BABaseProject-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C058147B53A9ADFB7061DF7EB69E8FB1 /* Pods-BABaseProject-dummy.m */; }; - 57F2D418F2B371587BBB1571962C5BA7 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 625FCFAB0AF26ACE41DCE9190963FD10 /* IQUIViewController+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 57F8A490472C6334FF1020372A3C9D0B /* YYTextArchiver.h in Headers */ = {isa = PBXBuildFile; fileRef = 1EA62A528C7657C71E0061470BE57494 /* YYTextArchiver.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 580D3BA1BD0F93D614DF27F1B35787FB /* NSAttributedString+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 70F7172C3EF8307CDCECBFB57DB8FBC8 /* NSAttributedString+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 585E2E63139D737DD4D2EA85F22A8CDC /* YYCGUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = BC085BF6717CD4E4463D582419A87D01 /* YYCGUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 589E73DB3A4CD8B6771CDF132831E548 /* UITextField+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 7475E787A556032F3057053E1D0C3B45 /* UITextField+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58B6E3E637373E5BA0376AE185982C28 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = BDEECAA6CDC8A66BC9C5117C216A27AD /* NSObject+MJProperty.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58D579EA720938163D34D6CEF757C640 /* MyLinearLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = C086880E09AC7E6C8D6077B2BB271C8A /* MyLinearLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 58F4C1C349633CE28F242E5FC8518636 /* NSTimer+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 21D76735A5DB5818F895943389FDB776 /* NSTimer+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 591F302AE7DF328BC509C4A31544F090 /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 56002A76B241F357D48CD4909CC1A858 /* MJRefreshBackGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5A7A913439FDB234260579F29FDAF849 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9791B7B4E06C573F3E1F36B0BFBAF3D9 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m */; }; - 5AD5B04804880BBB9F0E48E8B57BC2BA /* YYTextLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E3CA1F67A4D03CE610B7031A635C2C0 /* YYTextLine.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5B12C60EB6C020374FCE09EB30C1FEEA /* MyFloatLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 464340AC402CF5D0C17F0005CED66A1F /* MyFloatLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5B28F893F9F0F2271C3485FC68C3B44F /* NSData+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 021D7653569CC866FFB0466BCA813293 /* NSData+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5B58B5C42016663F06F4ADA6C93686DC /* NSObject+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 51F42359B30E5D1CF37A746186E26702 /* NSObject+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5CF6F21E35E657C52C7A316DE5CC91B6 /* FBAllocationTrackerGeneration.mm in Sources */ = {isa = PBXBuildFile; fileRef = F5F829DA8589FDD6D38B3C73FF05BC97 /* FBAllocationTrackerGeneration.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5D52DB6DF2E6C24CECB0015A9177A2E1 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 123A5E72353E47385BDE1F6714806946 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5E58BEC63EC00395969B5504E63A51AF /* YYTextParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 53A8B65DEBA1EB2DACE25C3B0B365282 /* YYTextParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5EE98F5266EA4B084F0D8E5AF7D32195 /* FBBlockStrongLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = BA757D006F9F117BF203FCEAC5D80865 /* FBBlockStrongLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5FA5D8F71A7A996186EF67FB1C8B506F /* NSThread+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B1F10FA77028B24266D2980E77086C3 /* NSThread+YYAdd.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5FE8F1C8E7FC2C2BFCA1E85D3FD6A121 /* UINavigationController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = AC31422140AE9ADA8E3BCF77B0641D31 /* UINavigationController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 609B35523D8E082C07EFC109017DC9A9 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = C60BFEF90FD39876DC97935F8F7233E5 /* MJPropertyType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 60A38F3E4D9F2C510C0998304458357C /* FBMemoryProfilerSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = E8FC988D841065B3C10D3B37D0EB0ABB /* FBMemoryProfilerSegmentedControl.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 60AB0AF555E1740F5BDC6D73E47DD4F2 /* FBMemoryProfilerOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = A95A44FBA41652A2ECB84785F2E86CF7 /* FBMemoryProfilerOptions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 60B872A80D2C7EC0A342F16970BF22BB /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D7BB901E91162456CE20970E16BBD61 /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61898DE2259DB9ECC1F23C538FCE7BBB /* UIImagePickerController+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 23CF67AAD0518E1B890DBEF51F31ABA9 /* UIImagePickerController+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6208247720506002F6481FE29EBB7647 /* FBAllocationTrackerDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 296AAB6BC23232567FEB2D3D75004296 /* FBAllocationTrackerDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6246319AFA5965F24CF21A3F0863A9E4 /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 70E0CDC5287ED1477D52FED16F8384B1 /* MJRefreshGifHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 626A921BA28D1E219568AFA9A9F67ABB /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4BCFF3530F736ABCD8BB8951ED0433 /* MJRefreshAutoFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 62F742E29E102974446C4B6AD532466F /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 619BF4D1F233638CB1E7DC0C21E52352 /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 63039357198203C145C9CD6D76DD1DAF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 635C6117BA4F7576BC19343A7965A8BD /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AF1D417786A18366C0E840779866704 /* MASViewAttribute.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 63B9D67A0E4367DA9819234F90E3190C /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 994B9E99765090AE0C2D983A36F212A6 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 63E6E87A7E5A4EC78DA016EF5F7000E5 /* FBAllocationTrackerImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = D9090FFFBCCA96A0D24052D1D2AAE64D /* FBAllocationTrackerImpl.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6401732D299AF2E66A86932AC8BB931D /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FD0AFB662E53B304759CE4E844D0056 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6479867A7C6B6817CD88E0E9B6255206 /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = FE406AF767C1F4F97A25FBB4DE4A7D72 /* IQUITextFieldView+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 650FFDAF60A6C37D824BC6364B09A3E5 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 200428244E7F1CAC94E2D732B86F5D27 /* SystemConfiguration.framework */; }; - 65C9BD1E2E608768ED705A63235FC497 /* YYLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B8615E890C3DDBA5C376AEDEBD92771 /* YYLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 65ED43E8E96D716F4B3C93B112E8BE5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 66E0A7A6952653601E737DADD388541D /* FBMemoryProfiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5364CBEEC29A2377D1D617DB67D7FD03 /* FBMemoryProfiler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 67C5E43EBE2877AD3B4E94A451163AF3 /* NSData+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F8FDDEE8AB41BCED3B7BF039D602C67 /* NSData+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 67CCED21027F765C38659F2051CF41B1 /* WebViewJavascriptBridge_JS.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BC8573301D7C819200435865CFE60B6 /* WebViewJavascriptBridge_JS.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 683E7D22A53BC25FACE3F94D34CF4E89 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAB02C4C5CF01C1DF1D33336447A8F13 /* QuartzCore.framework */; }; - 685A7C29642B2A05030F6EE34BD55879 /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = D1F61F06A8C004D1D740C16CDA98DF13 /* IQUIScrollView+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 695A3FA15E903AE48EB0B3BE336F2467 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FB0D3E7F94C1857319AB7FD15EF5E96 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 69E1CE5225A654934B2A36CCEECD0F82 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 91027CB4857D928D1CA9C81DE21FA2AB /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6A242E93B8569A42628B0F8B369273CA /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20E66BB1768AD27435FA30D2A98779D0 /* MessageUI.framework */; }; - 6A2B3F5556C6ED7D2561C0E644545A67 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AF8E99EF3AF3777EB0C049A26DAC3540 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6AB319828573AEF267BA6AEB9F6BF7BC /* NSMutableDictionary+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = CF393313A8743E1B447081AD31CDC2F2 /* NSMutableDictionary+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6ACE435B71030CD770DECAA65380285F /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42AE4450BA7735FFFE7FAC3E56D8CE30 /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6BD2B68E6E29F37846F58B70CBB59129 /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 72D5E4FF936FFFACB4231B155D93F3F8 /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6BFD89D70358066D5EE988CD3A2C30BA /* YYSentinel.m in Sources */ = {isa = PBXBuildFile; fileRef = 95AD9C8E76E8D9A174F7FEA1000355D7 /* YYSentinel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6C0487DAEC4ED162E3D685D83CBD6758 /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = A0D97EA3D3614781449972AF8EC4D621 /* WebViewJavascriptBridge.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6C0A8F2FBF1BF38CA43CD9793D192E0F /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 200428244E7F1CAC94E2D732B86F5D27 /* SystemConfiguration.framework */; }; - 6C5A6186A6B2B88FB840C2EB6B52025C /* NSObject+FBAllocationTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = CB27C5CB59CE05E58883CB9D00227C59 /* NSObject+FBAllocationTracker.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6D26CBA51614172CC58CB6584C0C58AD /* FBMemoryProfilerOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = DE6D61E44A4DCF9F0735A488361C9B26 /* FBMemoryProfilerOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6D348920EA6AF71077AE9C157BEFAA51 /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F8D8F55D61EE419D9EC90824FE0F70DC /* MJExtension-dummy.m */; }; - 6D34C29ECA85648B6DD5529BEB48FFCD /* FBRetainCycleDetector-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93951F5F071C7963E58277CD1B025BDB /* FBRetainCycleDetector-dummy.m */; }; - 6D40913F14E30C5027EDB1E8E5267456 /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5235F6664D58F67235B2FE9C46034955 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6DB6465EB0B439C49BAE38708AB21C6D /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = C75F362F2721C83B9578690864A9EDB1 /* IQToolbar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6DECEFEAE5BD55B2C4E900F1733B0981 /* YYTextParser.m in Sources */ = {isa = PBXBuildFile; fileRef = B3433531173ED396C780AB47996B4618 /* YYTextParser.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6E33AC5DFF0361416D54D5A53EB7F196 /* FBObjectiveCBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EB70E593734C4BCB70716363593F24A /* FBObjectiveCBlock.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6EAE44A4D1A4916FA680BCE11E63795B /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = DDAF05766BC95B7E64BAF8436774173D /* IQTitleBarButtonItem.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6EC97BDB3FC508526F9E388095A7DDCC /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BEC11E4322B88F12D64410C2C0C23D02 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6EF19A795B1B3BBA4F53B128F387C2C5 /* FBObjectiveCObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DBDB6CE6E9907AC6EB7BCB5D7235424 /* FBObjectiveCObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6FC6586871A6303509B134E0B50AB287 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 045B1B3BFAD9FB6E53AB094CF7B96EB7 /* View+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6FF0235D26EEC959800694F16B1E7C0A /* FBRetainCycleAnalysisCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E667E696694C0D86051522393D31A50 /* FBRetainCycleAnalysisCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 6FF9531FBDD71A64E4B526F0F12C3040 /* FBMemoryProfilerView.h in Headers */ = {isa = PBXBuildFile; fileRef = A2A278B5CF68BEAF8064A78196D43FE3 /* FBMemoryProfilerView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7062F4455FBC488E3D004C79AABD93C2 /* UIImageView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C03A7DC96A2CCC5E2613375220631545 /* UIImageView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 707C7D0C675593AED523B5EDCDEA699A /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0367C8FA55E93591F95053CA17A1B6A /* AssetsLibrary.framework */; }; - 7105AEF79C147E1853DEF7E5B4A909F5 /* FBObjectInStructReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D529033AB45964FD7D9E6344A09B042 /* FBObjectInStructReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 712980BAE00F43D62C7D3B63840D3DF4 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 71AEFDF38D5BE23F3414414534BC43A0 /* Masonry-dummy.m */; }; - 7136985E718DE3BFD007AEF4C8086B04 /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 569A43A38B83F695973632E6621D9A15 /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 71742AEF20E39C14BAFB479128B762C3 /* FBAllocationTrackerHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F86546053615F891FF780D7C428F9FC /* FBAllocationTrackerHelpers.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 71B4B31C29150345DDAEAE1C9CCE8F1E /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = D6651B1A1A3DE36DF389E74039694E4A /* MASViewConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 71E44C38C78705E62F5006CD4CD9AE0A /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C4406700A7F5EA5906CC95ED50528B /* YYAnimatedImageView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 72540129597F65A1C93A1406894EE6BD /* FBMemoryProfilerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E72986232B31803321B32F5A0994B4D /* FBMemoryProfilerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 729824F7571ED25599AD2A5E1E831189 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 34880D346373881FA6D9A57B8A895802 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7424067A8CACE3DB2A66EB68005982A6 /* UITableView+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 58F62B9290AE378B5F235AA7C7FE6253 /* UITableView+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74C5DC9948611A66BF92CD76395881A5 /* UIBarButtonItem+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FC460E45DFF37C3124F4D23555DAFC4 /* UIBarButtonItem+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 74DD9B0A916508400FB11D7E840F0950 /* FBClassStrongLayoutHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BBC1CB40AF9D3594A48E4A8CD6214EC /* FBClassStrongLayoutHelpers.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7503B51AC5F8C9E3FD1B7F03D1FAC7BA /* MyFrameLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B8D852EBB3BA2EB916F5EF39E3F2D1A /* MyFrameLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7560B8ECCA334403DB3831C8D91DB262 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = 24E690991FB67CDDF23F69C48CE66F9D /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 757166ADE968DEB86A4E9EDB1FA80B73 /* NSCache+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4874BB789FAA3836C95529B0BBD4C341 /* NSCache+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 761C55AFBFD10BE0380B5552105C7CD2 /* NSObject+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = C37B7F22AFE1647883020BCDF6012FA8 /* NSObject+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7621053CD7DDD9A87EF89AC8870D6761 /* YYGestureRecognizer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9A2F12DD6EFC4953AEEC39439F1612 /* YYGestureRecognizer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 76430179F5E39F544A6CC8CE5F5E7375 /* MyLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 839B1D07B3D16057E8A03A0C347E6D8A /* MyLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7649AFAAF84436233C7AA0236EF4B018 /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B491FACB2564D7721CD162115BCD106 /* NSObject+MJClass.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 76FBD5B638A942B208EB681CADD4767D /* UIBarButtonItem+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = FF0A3E7F0A0BF10010B764FC479A21A2 /* UIBarButtonItem+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 77515111C9AFE11AB1287761150614F5 /* UITextField+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = B18A663547B41BCB2192256358A509E1 /* UITextField+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 77A72BB8553F41A1676C87C771B6C1A2 /* YYTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = AB7DD34411EF9F2646DED7CB5B79ECED /* YYTransaction.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 78B774329C236522CB110336B6E2A09F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 78BA4C84514B073A0063AEBD1B8D6A83 /* YYTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 46B0E4EFC158C3C0E278033155A6B5AC /* YYTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 78E642FD20DDC06D7DB26D73AD4B74C9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 79BBDEE83CFBBD010F88DD3AECC8D3CB /* NSKeyedUnarchiver+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0E59635DA14A595558ECCF4F8E2107 /* NSKeyedUnarchiver+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 79C4895ED4C0FF8F9954811BED35B463 /* UIBarButtonItem+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 06B3B0EFF24A7FAE0352F8DAADF181C5 /* UIBarButtonItem+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7AA2CCC88CD69AC832E1FC769A07B550 /* fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = 8704C9169749B9511D62A5FA035BAF84 /* fishhook.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7AF49791C7DB2BCD21812ECF9374A23F /* YYDispatchQueuePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 2622C1589AC4B916248C215E1DE4F482 /* YYDispatchQueuePool.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7BB5FA5A44FBC13830AE9E7731A38D7F /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = B026555327BAA23598E63F5914876CCE /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7BB965A7FC99305E8567CB48667BB771 /* UIGestureRecognizer+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E16889ECF6F45797037D61D09B545C4 /* UIGestureRecognizer+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7D5941BA16DB6CAAA4CF96F28BF1A34D /* MyMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6B2D615813A8450489502242E3AB11 /* MyMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7DCC8A91701C7CEB5DFBF5030E918EA4 /* YYKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EAFE6CCB7BAD0352093AF27365BAE8F /* YYKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7DD6A9FA4088C1105AA24E166FFA2DE1 /* FBRetainCycleAnalysisCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D964DD3090BBFF5546FC9B414D405D14 /* FBRetainCycleAnalysisCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F74DA1420D4CDCEAAC6C1E4EF5416FA /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = C257988E7777B5456728B51FF16A46F3 /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7FC9781076EFD2FF3264F474089D6637 /* YYTextAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F00B3AB84CA628F09D6C85C8278267 /* YYTextAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 805AFB3DD4E39EDCDB6B40E227F6371F /* FBObjectiveCGraphElement.h in Headers */ = {isa = PBXBuildFile; fileRef = C7B87B4577CD61E350E3BBB244BD3FC3 /* FBObjectiveCGraphElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 811F1EA799D99DC4CC52152AC6727F8F /* FBAllocationTrackerManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = FC40B6EB9CFF5D58C6F1EB50C76FE1F8 /* FBAllocationTrackerManager.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 819B7F18C58B774F03C2B0689D5C80EE /* UIActionSheet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 98583DB893E2EDF2D9D0C128CF424174 /* UIActionSheet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 820AE72EE18049DB0D39950065ABA727 /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 53826077F7EC40EC905B04539DDE0BB5 /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 828BE170E62BBDAD675DE8A16AD2A6F0 /* fishhook.c in Sources */ = {isa = PBXBuildFile; fileRef = 1F3F941B3531A3103E0556EF2B2D2A3E /* fishhook.c */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 830050886B18F54E17F117FD8EFC717B /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 638F8AABDD62672939B204DD4FE0712C /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 832385F31AACCFABD48F783C577C8785 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 79CE0562E0D8BD6903CEF607CCA7E330 /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 834F559F41EE68C5B9CDC083C10ECD0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 8355E9060CF4352ED0E21569A6FED32F /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 21CD8F15749D4A403CDD14794455532C /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 838048D18B74B177ABC6978BB37D1A68 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = C15716B815131D615641B428CEC905B6 /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8517BE33C254EE906D831579DD8C72B3 /* A2BlockInvocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 76830DF4B5E1BC5088F6870CCDD79240 /* A2BlockInvocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 85764374184EC2477AACD1ECF9A5A390 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D7B3E48295B4763DBA3953A20520C8A4 /* AFURLSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 85DDB01FB12CCFD1CA6153C26F73FCEF /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = C65F485FBA386474CC18FAE641526C21 /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 85FAB6F1D2FE0598BF2E61D7BB084B8D /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 16BF0E56399719AA833B2783027E1F79 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 86D3C675657C8AFE6F73E5D0F209E990 /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = EF2B66CE438E19453A385D102B55B2E8 /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 86ED92B7BDB245B5DB78FE58091F6795 /* YYTextUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 7981A958E01F7C1D3E1D4F9B157700BA /* YYTextUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8738F34AA01C691B1BE6EEE5B85359C1 /* YYTextArchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F397BC56CCE8556249B7D6CC1D44D0B /* YYTextArchiver.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 874763D0455E6B9F5EA8EB0B8B06322D /* NSMutableOrderedSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 74957E39F41DFB9618340045D1FEC5A3 /* NSMutableOrderedSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 87625EFEAC6393D6640AACD14541137D /* MyLayoutDimeInner.h in Headers */ = {isa = PBXBuildFile; fileRef = EAEA5A83D31722BBA1F2B21C610BBBDD /* MyLayoutDimeInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 87770391544EEFFE524350CD59FA39F5 /* FBMemoryProfilerTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B829A03D07E44A405920D9E1937F356 /* FBMemoryProfilerTextField.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 87B4FA22305BCD40330ED17A2051850E /* MLeaksMessenger.h in Headers */ = {isa = PBXBuildFile; fileRef = 96BB5011113C71D8709B3540360F4927 /* MLeaksMessenger.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 881AB1EA374C9358F2A83F1D835D1B35 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = FEA6D93271DC64A3A9B375AD1D046B1A /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 889EB82162DF2E4E07FB326C99AE444D /* FBAllocationTrackerGenerationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D0D97445F8022139BB2546F1E114977E /* FBAllocationTrackerGenerationManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 88D1CB619D6DE78880B03B6A986E4978 /* UIAlertView+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 006412CEB3C110EF9AC81013C3D7ED1A /* UIAlertView+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 895BA4F70452014AED2484F225AF281B /* NSDate+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 857C64E85EF33EB0C0DDB7CF9DA86EEB /* NSDate+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 89A601652839C7EE66DE9780D80CAD75 /* MLeakedObjectProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = C61921B8CBDA195E8F13C72F03FEC9C6 /* MLeakedObjectProxy.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 89B8672D6374A9BA279D225EC45F5269 /* BAButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 50A31F9BD88110591D90290688433D67 /* BAButton.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 89B9F20354AF4A9C511EADE8E028A603 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 08A9C1B648C161EF0F37B35F4C78AAFD /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8A1E281F2784BF7FB67B45BBA9BD7C82 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F18192C071EE9D03A49150B2DB5D79E /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A47F85A2C8AC713A32E871507E0071D /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FBBC51E0CED18446A85031065F30E45 /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A5BD2A6B0E00ABAF752157C3A395CDC /* MyLayoutSizeClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 948471C315238EB01AC87CD838D9A085 /* MyLayoutSizeClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A74EBC631493F2059CC51F432F91000 /* A2DynamicDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = F20F416612C50E1062F61F7FAEA80685 /* A2DynamicDelegate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8ADEC33740B3F65850D44F280433A537 /* UIColor+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D5DAE318AD8143C9223D4EA52676CC6 /* UIColor+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8B5DCDAEE0AC9174EB575E2E7F74D471 /* FBSingleRetainCycleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E951B238F55C08FB59E90C3CD49C7D42 /* FBSingleRetainCycleViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8C5D3488FF8EED0D3450C2DD37D02ECD /* FBMemoryProfilerPresentationModeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 92E909620553250D700F6E1F7F566FE1 /* FBMemoryProfilerPresentationModeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8D1CA82FB4A856C90CDAFD70277575F1 /* FBParsedType.m in Sources */ = {isa = PBXBuildFile; fileRef = 2306FA16E8BCBEACC4EB83A1B28A3999 /* FBParsedType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8EAB6853B8F74DB098A88D6E9DC1A6BD /* FBObjectInStructReference.m in Sources */ = {isa = PBXBuildFile; fileRef = EB5020FF33CED698BEFD41A7EFDDD117 /* FBObjectInStructReference.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8ECA069F824C3B13733EBF651DE63EC1 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F988423503EF98F2FEA42F723F4BBE6 /* CoreFoundation.framework */; }; - 90044DB4682656277A1863EC96318829 /* FBParsedStruct.h in Headers */ = {isa = PBXBuildFile; fileRef = 1CC80A118274F07BD6EC01FA6E973757 /* FBParsedStruct.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9065B8EA484A5A99B3474095A6BB309C /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = E9F2FFEE4EDC1FAFA1DEF9F606B16B9A /* YYKVStorage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 90710737D6B3921B2559258205BC8F91 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ECFA1810737E35C9AEEFF67ED89C751 /* YYWebImageOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 91648E75404DAF62439FE179BF617EC9 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF629F5D0C79C753A9E822947DEC1586 /* ImageIO.framework */; }; - 9177FA86BC19AB14D506D2D634CD1063 /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = EBB6B9021DC0896B8CC106657449A78F /* UIRefreshControl+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9186611FCFEEAEE562D1EF33294EEF65 /* NSDictionary+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = D7A3CE6D39FF34F83D9FCAFC0873C9B8 /* NSDictionary+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 91C81CE21EDBED17E288C71E49ED9332 /* NSURLConnection+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C1FC3666204DDB5FE1B4D6414F49B5B /* NSURLConnection+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 91CAC2B69903F5F3D7C25A95CA77A600 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = C8147290C16AC26AEC18880E6E7606D5 /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 91F4814E8D85EC992C5369058494581D /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 206236CB4A6654F0196C1EFE84EB082F /* YYMemoryCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9205037BA8C22574B33FC96C5EA829A3 /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = BCB0278A80BB796B0BBB05797970ADCF /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9266ED0CD471E6806CF4CA3CB29CCCB0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 9347B960A275D7EEF8F79F348578B45D /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = BB70C9C6E99CB810F1090EBC41955558 /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 93DD4B66C78639F12869052BF2358CDB /* FBMemoryProfilerMathUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 944B1C22925735F8881138F7DA2A23AA /* FBMemoryProfilerMathUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9433314F14BA4B2BE7917A4EDCB33411 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 98B1A8BD171C4B54346E5539A6ADD6BB /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 947B50A28CFF32AF1469194899AF5294 /* FBObjectReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 10861837646B6165DBB45F669524E11E /* FBObjectReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 94D614D8B64A95E9D9EDCE3ABA79D2F8 /* UITabBarController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C70056B483458E7104305C91241DE75 /* UITabBarController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 94EDC5A6C629777B263C3A096E0C17A4 /* UIGestureRecognizer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A03F24619F5E0512F446C207336C0F3 /* UIGestureRecognizer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 95185334069730FB4E89CB76064A13E8 /* YYTextRunDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D0B6487B47F46E9A4257FFE2D6764ABA /* YYTextRunDelegate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 95990C274EF041EC743DCB56D6582862 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - 95B90C7B79E0E209A54E94F4C87DBDF5 /* NSThread+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C88D0A5210200894B552B2AEBC1BF6E /* NSThread+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 964CAE9ED6B18D7B25B79F1E758251CA /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D9C07C6CC62412A69CE26A6F6E4B96C /* YYImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 97824FC0FDC3A4D8FF80AE6717C0F83D /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = BBBA4E1F7C1DEF65E95F5516787B8196 /* UIView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9785BBB495295FAA9892ECFCF7B91781 /* FBBlockStrongRelationDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = C8CA8E1A02DA086416D760CE2790A36C /* FBBlockStrongRelationDetector.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 97E57B0E252F365076EC37B240551BFB /* WebViewJavascriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = FB19699E1C1B12EAF5D5EF13453DED15 /* WebViewJavascriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 97EC044ED22E077311919CCACAD8153E /* NSObject+FBAllocationTracker.mm in Sources */ = {isa = PBXBuildFile; fileRef = C34FAED3862A3782BE249E4245ECB502 /* NSObject+FBAllocationTracker.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 98190A252E5EF0E5337B94F9FFB9FBCB /* MyTableLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = B7AD9B6A7C7D2144615D70677CF84F67 /* MyTableLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9888880720FEF4C3875B61493319B4A8 /* Pods-BABaseProject-BABaseProjectTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B782D01E9282AFC5EE6AA265E4A67B3 /* Pods-BABaseProject-BABaseProjectTests-dummy.m */; }; - 99D3C5BDD5F47C3E7EBED92F9B91ED28 /* FBMemoryProfilerTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C4BE6AA65BD511B1DC825C2E301DF34 /* FBMemoryProfilerTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 99D8C610BC84BE231C5D3D280F3B12AF /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E70FFDE2DFDD27F3F2D9EB717EFE9C6 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9A0D670D80FE9FE0B4499FC3212F055C /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 88947793ADF905B9663533EABD764FDE /* AFNetworking-dummy.m */; }; - 9A2EED60547F71716011B01315633A17 /* MyFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 53ABD9D86A65A57FF7B87B558E040305 /* MyFlowLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9A7B94DB95A6B7CB58211BC811742AC9 /* FBRetainCyclePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = DF4A42C3053AABAE1B120AAC4BBBF872 /* FBRetainCyclePresenter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9AA13D08A7BEB08C03706041D04B698B /* UIColor+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 0779A06752EDCA53A44D9E5761F5CE33 /* UIColor+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9C2214C61E15CF19E50A9F1121705B06 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B08E2CEFD1FE5CA5903983EF82AAC458 /* CoreText.framework */; }; - 9C33ABEEA3669D92CBC0946D20528659 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 21AC9B17FB00F3A1C5B21B599D192340 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9D4833EF218C3111CF304FF6FFCC8AD0 /* FBMemoryProfilerWindowTouchesHandling.h in Headers */ = {isa = PBXBuildFile; fileRef = A52F5F609D7DDA2FD09B6E918914AC21 /* FBMemoryProfilerWindowTouchesHandling.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9E0D6C12E4BCE33C366C03A5BB160075 /* UIView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 08F2148EFBE4600C8932C38185B02BCD /* UIView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9F6FD5E4DE5C4EB64AAA465E68FCC765 /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5AACE5A7DD6A6254087729150B530CF0 /* MKAnnotationView+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9F7B4BB3FBBAF22CA25B3AAB519C07DA /* FBMemoryProfilerFloatingButtonController.h in Headers */ = {isa = PBXBuildFile; fileRef = C0F377538D2D64A5DBBEBB40B9F10B7F /* FBMemoryProfilerFloatingButtonController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9F9CFBD464085524F455C4D19211E69E /* NSMutableDictionary+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A8AA9EC4B02527D28DCFEBB728167B0 /* NSMutableDictionary+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9FADD74420CCA674B263E796321B5230 /* MyLayoutPos.h in Headers */ = {isa = PBXBuildFile; fileRef = C4C3430A5C17BE45F5001DA945CC9462 /* MyLayoutPos.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A01B6978660551BA9BA8E1CF088E8ACC /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = B3473487C4A41397AE46A1C71687C8CA /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A026405E495CA2EFF557A70D1515A689 /* NSOrderedSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = EBEBBAE1D7591EDAC9B55F67C9DFC01C /* NSOrderedSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A0305454E9E336002754077CA24F927A /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B989E586DE2640D8734F40813759F08 /* MJRefreshAutoStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A0FF6FFCC8E7307C10103FD7AC6970E2 /* YYSentinel.h in Headers */ = {isa = PBXBuildFile; fileRef = EA1AA8DE0CB6CF581C4AAB03370A94B2 /* YYSentinel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A1227E5CF161196660480E34B67B50E1 /* UIWebView+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = DA9F4C442D76AE0BE69338FF7A29D2C9 /* UIWebView+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A1968C04873813D7CEB076FDFCBC479C /* UIControl+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = D4B69A40C5A35C2F7BA47EB7146A0A4B /* UIControl+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A21536447A1FE467F02792FD307BD2BB /* MyMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = A688710BF1754C8489B812B2B5CD12A9 /* MyMaker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A229FCF9FEBBF16977B33AB2FEF23830 /* UIBarButtonItem+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C73FFBA29D004B1184A16B3030A7EBEA /* UIBarButtonItem+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A27D8D778B368E2F137FF980CA0614B0 /* YYThreadSafeArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 46146AFA7B79C99D3F78D01909369053 /* YYThreadSafeArray.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A2D515F8E13BB36CA575C018AC2E15C2 /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FF9EAD699F096BFB75E1AA6B54A670B /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A2F19F816F2752816146D876FB861F06 /* UITextField+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F469B868CBD380BAF898D72BDC40A58 /* UITextField+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A4E36E6C4FA07570E0953FC0B56B90E1 /* FBMemoryProfilerMovableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F1EE925428FBECEB0E13992AD8C9806 /* FBMemoryProfilerMovableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A588D6AC3B0CD9ED62BE3A79BE14804F /* UIControl+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = B3DC6E2CDDB6A0ED9D70A1E1FC52E6E8 /* UIControl+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A5DBFF76EDEC1BCDA0351DCE8407ACA9 /* NSDictionary+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D1A145F7BF21BEEBDF4B14411B28DF9 /* NSDictionary+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A61612C5AD7959D2952A03B68BB9F493 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = C1F7A828356422E68F1B923480C376CC /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A6296D65054CD8FF3B2421B4F34C7A7B /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = FF13BCD801E95E62A3F277D7FEBD559B /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A7D31BD1F3AD4ED4612467FAD332F388 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = A1DC28745B38F032A8EF3DA2189C6AA3 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A7DFDB4F664DF052B3099D7014A3A642 /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = C1167CF75D7F6BBC6E68161EA9558D58 /* NSString+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A81FB6D717B889488054755BDF512939 /* YYFileHash.m in Sources */ = {isa = PBXBuildFile; fileRef = 75D3ADDCC531A28A9490F845BC3E94BE /* YYFileHash.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A8862580C4E8DC547108E3BBB60179B5 /* UIBezierPath+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 334E3B593423E2F39054E938A0EA6BC5 /* UIBezierPath+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A8BFB72779F4EB75AC96FCC0153E67F3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A98AC12EE6CEE54D6BAC7E7886561B51 /* YYSpriteSheetImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A9596B04A7B443EA2E5A50E3990A1C39 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = F2D6E4AD12709448D4620BCF9EFF9D3D /* UIScrollView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AA0FEB5DAAD5F404858C39AEDA67F09C /* FBRetainCycleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 427C4E63BCEF748D1C5BFCA32A273550 /* FBRetainCycleUtils.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AA496B2DDFA155A386C4C7275422792E /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E58D4C80227500E1AD4CA3366E0A240 /* MBProgressHUD-dummy.m */; }; - AA4A149C8F5C3BAC314D180BAF86E90D /* MyDimeScale.h in Headers */ = {isa = PBXBuildFile; fileRef = C63D15891DD8222DC8CF0B13B9CBE442 /* MyDimeScale.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AB2FC0AFFBDF156C145E1ECFD1B62C13 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - ABEBCC026684BAA917A433DD31DD6CD7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 240BCAC7B580A7E259EA787FBD602F7E /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AC132C9560C2B1DDCF3AB256BD361A60 /* FBMemoryProfilerPresenting.h in Headers */ = {isa = PBXBuildFile; fileRef = 961F876747EC9A1D5E32BE45FE644EE0 /* FBMemoryProfilerPresenting.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC3B86EEF0CC4B6F9C1D3CF7BF3464A9 /* NSTimer+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = BEA3A528065576E57A614BD00E63B0B6 /* NSTimer+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ACBCDF4294B6A8BB7C742B0F36CFE333 /* NSString+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 2335EA7D63C6C56C8E8566673A553CD5 /* NSString+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ACE9C1A6E8D5121C6C5F907C7A9CFCC9 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B7117B3BCBB7B6A1A59343FDE65AFAB /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD4DD18ED42107A84CD0824E6C319D36 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - ADB8F0C1C148193285ED7C5A45717B55 /* NSNumber+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = F0DC07796E1AD29178646F4F82583274 /* NSNumber+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADD5E90375D7A0A16EDBAA25E100FAA6 /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = AD7AC596E39B564718102D8BF7BFE787 /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AE3E7B75E93B501181C432885F21A9DA /* FBMemoryProfilerGenerationsSectionHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = ECFE48D475CD44CBED9B7C5289FDCEAE /* FBMemoryProfilerGenerationsSectionHeaderView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AE7A0DA2E693624A321511A6B14FAFF3 /* MyRelativeLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 511415AC9277593D6968E67DDFCF1B0E /* MyRelativeLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AEBEBBD498A995A70DCE63834A1593B3 /* NSObject+YYAddForKVO.h in Headers */ = {isa = PBXBuildFile; fileRef = 8839C0CD56C3B30D8E1A8127160276BC /* NSObject+YYAddForKVO.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AEE9839CCD5CF8AA0DC3D411CC2B9402 /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 36B092E4DE9B53D996DC18BF9956DBA7 /* IQBarButtonItem.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AF31C947F53866CC922DBC37284AD46F /* WebViewJavascriptBridge_JS.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D36BB668CD698AEA98938593DB6000C /* WebViewJavascriptBridge_JS.h */; settings = {ATTRIBUTES = (Private, ); }; }; - AF4E7187E09A5AF3A0758991203153DC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - AF7F298DAC4788868748184B44B98915 /* FBBlockStrongRelationDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = DEC231E8241338FFB497649DB24FE2E8 /* FBBlockStrongRelationDetector.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AFD32C6E8D253BFCD6389646EEB98143 /* MLeaksMessenger.m in Sources */ = {isa = PBXBuildFile; fileRef = AE942AA33351A6E0C5B35BD36B65B7ED /* MLeaksMessenger.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B016FF2487BB74DD2F324ECA623F6CB7 /* UINavigationController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = DC4B16A2C39B9FDED877B0623F36525E /* UINavigationController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B0578F009CD0016215E2077CCA012D3D /* NSDictionary+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B94301757733934C689F550ECF08CF6 /* NSDictionary+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B0AEA4C93754AC1C825DD0AD84BA5E59 /* FBNodeEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = D2FBA2765D46BD755D28DB22C86AD06A /* FBNodeEnumerator.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B10A64BAF7708212BEE77303B46759A0 /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CD1EEEA0509DAE57E9C82934DD0CF41 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B12F43459477CEF4D99B07A62EC761F2 /* IQUIWindow+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F32A26BA5ECD684E6ACA01840106B5A /* IQUIWindow+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B19379F938132B183E44912BC25DB806 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 31C588CCFDECBCC4F4FD77599A830F73 /* AFNetworkReachabilityManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B23CD73FCB9CFCC88B1C93981171B9B9 /* A2BlockInvocation.m in Sources */ = {isa = PBXBuildFile; fileRef = DEB50FEE8CDB249C45E029B81CA9A133 /* A2BlockInvocation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B25F8085B440D68735024862A5F6AD9F /* UIGestureRecognizer+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 15E82000642A2D58AF6D39AE8E6BF2CE /* UIGestureRecognizer+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B2B7C90BA9C4DBD9851C75AC801B0E8E /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F0AC202A950F26A1DA6E90840A573AD /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B2FCDD5D574F3520162C4DAC57A3C112 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - B3512189EBC0492FD0D5223C279DC343 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = FE668306681336D7EDCB5181A545E8D7 /* MBProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B3619866A9F9AA1849CB510535CC991D /* NSDate+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AA6FD772C40D71000A74E09ACC3BCB1 /* NSDate+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B38BA63DE02341E9AB873784FFA6FE7E /* NullSafe.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EE83000F7B65AC006FCD523F4318FED /* NullSafe.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B3DD4C828576A28788D84A44FC89F507 /* NSNumber+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = DF66E7154C36ACA86C68678E421495A1 /* NSNumber+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B3E688BC4BC0E79707E6E9D05FE00DC7 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = BD76F534CEEFE47794698A5410F23ADA /* MJRefreshStateHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B409757E827F566779676A8CC6292714 /* NSNotificationCenter+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E565DFF66A43EADBF8073D60C1EAF199 /* NSNotificationCenter+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B410EE6FCF78EF49BBE5CF84677DF875 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - B4A350C1110440DB9C2976B76FB287A2 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EDBB49A61C680654850393134FF81A3F /* SDWebImage-dummy.m */; }; - B51AA1F7701DCDBCC9B88A15320F9C2C /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 5BE7781AE8DE7FDCC3C805497BAB3DC1 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B585A282CC68B8E2AD2967543D85331D /* MLeaksFinder-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 06923B986B9E3DF1096EE7B949FF5A89 /* MLeaksFinder-dummy.m */; }; - B5960FA454047E967D034479FC414DAE /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = DFA5E3502B4CBD9332D644FB4C689A6B /* YYImageCoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B5CF67F7870BAB70A76E57479B706B42 /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = CCB7BD27356A5191522BDE36482D3DED /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B6388C754910F72F2745D640E4EBB15E /* NSDictionary+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = F308182CA3866179A7F1ADF881957B40 /* NSDictionary+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B679B503BFDBF9612F6796287CF3FB22 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 290C8450DD5B7FFBF5956CB8CA9808EA /* UIScrollView+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B683CFA709BB62B56AC13D3017F56010 /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 81D26EC2ADFBC40AD044725AEF390A44 /* MJRefreshBackFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B69BEB9B9DF6E63A34C856E63E2863ED /* UIApplication+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 860442C37308B9FF41C8CE2917F66F82 /* UIApplication+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B6D0E1870507C02ED40FB019A046AA99 /* NSMutableSet+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = A798DD4208A1EC6F17C95D9F282DF3D6 /* NSMutableSet+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B7524CEC2C923E9F9ECABC813CA9745F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - B7B0539A534536A68A64E9C64470C638 /* YYGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 92F23CB6F24D0FE317530DD0838A393F /* YYGestureRecognizer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B7B5D5AFF2A3B9C77C09E08BA520DBC3 /* FBMemoryProfilerSectionHeaderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C93035ECBBA901BB001C1BC351FE3AB /* FBMemoryProfilerSectionHeaderDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B8183467EBAD504A3B55B4F223BD5672 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 239058FE08D4DC523E78BEAB1F7C4A1B /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B875B8B4DA2926082103E045C3FA0859 /* UIPasteboard+YYText.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B4E044D2F5F2C391F1DF56FB7519D30 /* UIPasteboard+YYText.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B9041D9CBCD4064A65F76768A2DD0009 /* YYTextContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 14BC1466655A68388C78CFDE48B538FA /* YYTextContainerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B911C96FEE11AF555371C685AF39EC35 /* MyLayoutPosInner.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FB43FF5DCCA260A7741F60487042BE8 /* MyLayoutPosInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B9289F61BBAF56C928694903618E9BF9 /* JMRoundedCorner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 82A20F9D5364FC95F216E1FF145F9AF7 /* JMRoundedCorner-dummy.m */; }; - B9C2E6BF37CB8A6B09189D005DD76A04 /* FBRetainCycleDetector+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FAD44AC34ABBD5CD2494949F2678403 /* FBRetainCycleDetector+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - BA15999F5676ACB799A4A4CA4241210F /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = B773932A5B2F66A5EFB092C07C02753A /* IQKeyboardReturnKeyHandler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BA46A2C2953A82300E1D49BD9036AD39 /* FBStructEncodingParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = AC57B2B100D6A7427406C7B6007D7515 /* FBStructEncodingParser.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BB13B238DA41C20BFEE24B7E6EDEDA70 /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C96F315F04D21365016B40114DD1AAA5 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BC2E35D7E3F56E7592CAF577B9E657AA /* NSArray+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 212128327832554EB3EF692C63CFF0D9 /* NSArray+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BCC6D57F0B554C41C761BCD2F52927C2 /* FBBlockStrongLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 4A1F2D0F6A4D9EC760DD5A096444C814 /* FBBlockStrongLayout.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BD128F4DAE238F64FA6F88DE2235DC9F /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 30135DB7B2997410CF579580F9ECAF04 /* UIImageView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BD7807408225E207A377796273876905 /* WebViewJavascriptBridgeBase.m in Sources */ = {isa = PBXBuildFile; fileRef = C2816F1AC6BCC92F40FDD4E2A786DFDE /* WebViewJavascriptBridgeBase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BDA1BEC0C08EC41FE116540EC96364C6 /* YYWeakProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ED17C84D4CF51DA801BF6FD9CE2BC7A /* YYWeakProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BE2BE12ECE566C14238DD7845DEDD84B /* BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = B0330E05680263E7BD2051C65FF1A3C8 /* BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BEDA54044F0DF5FBFE690B4E4570F823 /* MFMailComposeViewController+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = FD67AAEC8D513BAF5C12A63FEB5AC14A /* MFMailComposeViewController+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BF078560F6BFCE3DD248BC196B9CF57F /* YYKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = E8506E36A4E57A364CA6A968BDAEBD5C /* YYKeychain.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C008E56970D39AAD5545E4234012E77C /* FBAllocationTrackerImpl.mm in Sources */ = {isa = PBXBuildFile; fileRef = 923A2546B5E5BFF17D052183DD1FCF59 /* FBAllocationTrackerImpl.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C026CACFE3DEEA4E7FFB7D41721D6CDF /* FBMemoryProfiler-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 875F92012D8F29A99AD9E203968B2440 /* FBMemoryProfiler-dummy.m */; }; - C10291D821E77E019EC760D33F1DAB2B /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 542E6C9B8F84F2330A4147C57B231C39 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C13F1C5C4E2DCB6F7E0F9F01FA2C2124 /* NullSafe-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AC536104787A5DF8D85CE1F10C915B13 /* NullSafe-dummy.m */; }; - C16442D25F534C602780E6FD44C6A698 /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = DEBF2D21FAC9B1B4DF6E6E4055D75BBA /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C1B65C3D849FEE4FB5298A8135A765DA /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F3FDF92C92BDB11D471B0CFFC7E5B9 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C1ECC1A5FD628140D2F51950514ABC18 /* FBObjectiveCNSCFTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 94CFF896F4E504B1F472DA414AE7B129 /* FBObjectiveCNSCFTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C2874BD5AC24AB6CF628418E5C251A22 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - C28CE92A89A43CA81EBBC907CC4B06F5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - C2BFF405BE0AEE5C66C90E6FD8B10415 /* BlocksKit+UIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 762FABB48476107064393FADD7621295 /* BlocksKit+UIKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C303254DF24B7C14DA47F53252B4F616 /* YYThreadSafeDictionary.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AEA72FD754A2831F570E82ED44CCD4A /* YYThreadSafeDictionary.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C32B5EAACAF3AA1C4FB0DCBEEF4BB85E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - C37D2F9A62232C28DAF2E51CF1364F21 /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = A9E81F0535793CD081C12DB576F1AC55 /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C385CD3667D28D9E8631067A052570B8 /* YYTextSelectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 73F9BFB28425EEF9A9B802D984362569 /* YYTextSelectionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C39AC358D302C1C2885195358DCF545C /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = D703C0242C6046CA4560FBB06E74919B /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C3AFA6FFBAD63141CDC0FE98B7AE18DA /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F8B7117547F06F7DE8BE03B2E5F35DA /* MJProperty.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C41DFB2F9A72BB8A1566E5F80EA3B7F9 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 80E6E508E14B96347CA93307FBBF80F5 /* CALayer+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C4DE5268953918477EE495B4507DC8F6 /* MyFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = E0AC86376BE98456E5785A7DB9482C7B /* MyFlowLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C569F8F13F620D581269D19A6768C1FD /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C5E7C8B7FEB277772CD5DB310738395 /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C6CAF5151F48A15E1B90EA2FC5EED6E0 /* NSAttributedString+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 74C4A1127781E55DA1D650FBD3FC5F42 /* NSAttributedString+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C6EA6BCD8D2B6F6F76DD7EE1771EF613 /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = E146447886DC5E8C6720ACA35A563954 /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C6EE194D232E9FE87097C0F1DF91B9FA /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = FC67C181B5D05CE69749F162D42CEF79 /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C7167A91FAF83E6CBC3C2A0CCE3D6035 /* YYTextRubyAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 649F7DDCB818BF768FAC670A8EB3E5DA /* YYTextRubyAnnotation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C7E0B31A7916AABF23A79CB06E1F5272 /* NSObject+BKBlockObservation.h in Headers */ = {isa = PBXBuildFile; fileRef = C9A068E3F0B4EB2C414B9E08CBA0725B /* NSObject+BKBlockObservation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C80D7C6DAC57742A60BCA92C85C5940F /* YYKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = D99E1BDC316954C3C939D857AC5E059E /* YYKeychain.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C8374AFC18A6204FB1FA23E1F401A268 /* NSObject+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 952FCA31B82E17C8E6256A933FBAF018 /* NSObject+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C8DCB77D91697CBB4A82E655D488995A /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = C15310E8D8C1B44B7E9E994B8B65BCC8 /* UIButton+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C917316460959B6CF1EB0B86FAF75F08 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D9F08CF4924E1EC00C67FF070B8E575 /* YYClassInfo.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C9884CE8C0A22E6F6AFE867AC31716FB /* FBMemoryProfilerWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCD2B9031FCC29FB4D41E000DC607E3 /* FBMemoryProfilerWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9A7A72AB5C44A7D593BF0530B137A3A /* UIScreen+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 6059752CFBA687BB6603A3947ED34A49 /* UIScreen+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9B6328F023FF633ABA6879D50FC90DE /* NSInvocation+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 99F4E6FE6699D8C9B460C64255BB9171 /* NSInvocation+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA1EB1DB5C89E63A19ED05C55E35AF23 /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 69100874766624C2B61F4971D9B2A650 /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA7B48B591CB1257A8468C8897138358 /* YYTextLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 28731D9959E7A20012FF5C4353093F87 /* YYTextLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CA9EAB13270EAF0672F577BFBF4F6F15 /* FBRetainCycleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = D8DDA95A028C77605EF2532B00BFD808 /* FBRetainCycleDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CB5928A0D4F59D8F09230DA3FAFA5C11 /* FBMemoryProfilerPluggable.h in Headers */ = {isa = PBXBuildFile; fileRef = E24D9A769655360BD36ED428F0E80DD8 /* FBMemoryProfilerPluggable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CBE9BC8CEAD966EC14714D5A447034D9 /* FBObjectiveCGraphElement+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F7122E3FC7E1B4583ADA995A6F07103 /* FBObjectiveCGraphElement+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - CC7D94532BCA6EA7B19872CBD118314A /* YYFileHash.h in Headers */ = {isa = PBXBuildFile; fileRef = A4CEAB9557E666683D46A81804C7EE08 /* YYFileHash.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CC7E36A547AEE6456442AF7F5C60E2F9 /* NSMutableOrderedSet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 717D3F204D359F39F1BC887FAADFA8BE /* NSMutableOrderedSet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCE866B885DF2C81514BD21FC247BF2E /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 0092D3D06AD87FDB0BEB6B9545A56593 /* UIWebView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - CDCDA3DBC3C13EBB3CA76C7F0C17D427 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F82E8F3D0B32202C9549B9DEDD2940 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CE2519EE6B6B796589E9AB8223543EB4 /* FBMemoryProfilerContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4256130E7E08605BAA83B02D16E09619 /* FBMemoryProfilerContainerViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - CE55153EA111B691F0B655F5E600DC41 /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = A54A50C110187F79FD991356ED5487DB /* UIImageView+YYWebImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - CE805A5D1DE6AA36CE6E7DABE520A7D4 /* NSArray+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = CD40C7CA088D9BDF9F2B7F1CC9B7B950 /* NSArray+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - CFB39679AA924EF94E92284FBCA6D420 /* NSObject+YYAddForKVO.m in Sources */ = {isa = PBXBuildFile; fileRef = AEE3936E2FB477E0BF1B39FF87149676 /* NSObject+YYAddForKVO.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D15BD345C4F8967C1FC8CE69E0A7819F /* FBStandardGraphEdgeFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 94B4B1BE232BD6FB20C7D21E665C5256 /* FBStandardGraphEdgeFilters.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D218A27EE5D7D0BA149BDD479A4FA272 /* FBObjectiveCNSCFTimer.mm in Sources */ = {isa = PBXBuildFile; fileRef = AF08524AB58959BC4E7EF7C1EFA593A1 /* FBObjectiveCNSCFTimer.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D23E725899C1A0D2448D5904EB3A8070 /* NSMutableArray+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 53217886BF1EFC1274DA0DEE919C912A /* NSMutableArray+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D2EF16A810A5A08DDA175BEB2245A438 /* FBAssociationManager+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 775735A621CBC5820368C236E79718F4 /* FBAssociationManager+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D308BACE4CEDFB04396668A9050DFC13 /* UIView+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BB1092AFA35D2C14D4174FC42FAA26F /* UIView+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - D33286950C9CB1F933C6829BD2638007 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B061E6991FFEA9EF9967D21F0699 /* NSArray+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D4D23DAF0D1E8032B05378DCE7BB53C4 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F230BC7920E555B8E82AD99BA354C48 /* MobileCoreServices.framework */; }; - D5D12C7E324E5FF9FFBCADCE172D554A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */; }; - D6310BCB04A0A024F31AD92AA155F583 /* FBParsedType.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DE39D822288FA6C2D9F7C07A9E9878B /* FBParsedType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D658EC157FFA1E2ACD564F568916BA05 /* YYLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = F2A77BF6A316546884477C33D437F1BC /* YYLabel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D6841078C9D934FFA7AFA2DF323162E9 /* YYReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = B7912B79A365C76B319EC9369A73DDE1 /* YYReachability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D6C1513DEDA0B77E3E3D232772F24CD3 /* FBMemoryProfilerDeviceUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 79F6961AD9825205FB7AC820975DE4AF /* FBMemoryProfilerDeviceUtils.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D6F66D873FC39935F02EC41295C5DCD2 /* YYTextEffectWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 6DC3F53442B1FFA6CAD55135898D46AF /* YYTextEffectWindow.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D7AFF4F4AA1900F1FDD8CCC28367CD1C /* BlocksKit+MessageUI.h in Headers */ = {isa = PBXBuildFile; fileRef = FDAFBE2351DABBD9D765453D62A694F4 /* BlocksKit+MessageUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D87E1893A7F22806AFF9CDF066A26979 /* FBMemoryProfilerDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F46A618CEB860FED640BFF35C463996 /* FBMemoryProfilerDataSource.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D9370F40F152201BA2D91F6779F615F9 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B138AD15939CEF73595C2E88EF81EB1 /* UIButton+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D951EF099FDCDECB5113C834D273A1E1 /* FBParsedStruct.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A2D8406C9CB2B3A8BD0E36806BBF64D /* FBParsedStruct.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D9C39D054A13CEBB837551208CE66FDB /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 11FC7125B107B56BF9F94DFEE0EF6245 /* AFNetworkActivityIndicatorManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D9D88ED515332296D0EE0C7129EDAAA0 /* NSCache+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 74AD8C811C96DCEC6EF4EA0FEF7860D8 /* NSCache+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAA9E448DBA0AEC0048AA2A15AA4646D /* FBStructEncodingParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D8707A09C9830B7D11A15E765C803C0 /* FBStructEncodingParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DAF1CE8756287B465E0DE48A6133FB79 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 1176C31408BDAAD65BF51F700EE3D887 /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB44790F7228F78EDE7FEBE39BE219E3 /* FBMemoryProfilerDeviceUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EE915E8457B56BB369F5AEBACFED157 /* FBMemoryProfilerDeviceUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DB5250056F65EAC9E3DB8049CDB39B6D /* YYTextAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = EE9890BBAC64710822418EC5F409CC58 /* YYTextAttribute.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DB761995E336C71ED4B3291F5EC1D4BC /* UIControl+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = FCE097D977C7E9212DECEB0CA75E7061 /* UIControl+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DC385EC127CD7D7BEE66F48D28002372 /* MyFrameLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C459B7082D82C38F339BD9329FD10F0 /* MyFrameLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DC4B3D230C0FA7D1E458C488DF32521F /* UIImage+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = E1817E153C3792A869175BA950DCCB82 /* UIImage+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DCAF444BB8A5C3E446377587333F7415 /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 58C80B2149739C468CEF90F235DD79DA /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DD1F717B0527C71229B3339324E35E55 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D2DE91AD22A519E77A093C40560B2FC /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DDBDED87A2A54F30705EE3E2279FF4C2 /* MyLayoutInner.h in Headers */ = {isa = PBXBuildFile; fileRef = AE73B0214DF7E2D4D7E5CB68C93E5DD2 /* MyLayoutInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DDC8B02294294C26BB8EBF7A193F6C89 /* UIFont+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FC27882CB649FBB08F7A410B2466759 /* UIFont+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DE31B168D9197213CEB7B90E3ADEB4CC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - DE57956D7C2887A24CF1AA7F829241B1 /* BAButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 22DDD211FA23314FC16271C217095002 /* BAButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DF44728D73567A6EF536F40F8A0E33CA /* YYTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 30B7AB42C85DE96933B805F6321E27B4 /* YYTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DF697C3E209D61D482E569CE723DF45C /* FBRetainCycleDetector.mm in Sources */ = {isa = PBXBuildFile; fileRef = 826787965C74AE11FB4772C5ECF0F4A0 /* FBRetainCycleDetector.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DF8E6CB243D7C0493F416AB463C8BAB2 /* UIImagePickerController+BlocksKit.m in Sources */ = {isa = PBXBuildFile; fileRef = E196B124A11D919BDB535AC02A361E92 /* UIImagePickerController+BlocksKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DFAE6413E25C223E9FD2650F19B1FAF3 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD5ED7DCF756D27CFD4D403E4C61B50 /* UIProgressView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - DFDAC8245626953C4BCE5A2DA6BE2A5B /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = D4A3730D0111229A07BC6E1FACFBC596 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E058ED481784DB809A21261133DE5FCC /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 997DED83CBD78DC92D4F73157CABD8E8 /* IQUIView+Hierarchy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E0AB941C52556A640214FB7024D47C6F /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 22048D6B92A7AAC7BA16C72241C1CB30 /* ViewController+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E11B19AC0B8CABC8494F45603A799AF7 /* UIView+RoundedCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = 81BDDFDE6ABEABDB18A477150F4049F2 /* UIView+RoundedCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E1517AF43BB1A6D83BB1974D83F663EF /* MyLayoutDime.m in Sources */ = {isa = PBXBuildFile; fileRef = 53A6034CD435B263D225D48ECC87B0CA /* MyLayoutDime.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E1FF22B300A27983D415780BFCA3A9EC /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C4AA37296DC371F60364CCA133BCD11 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E212C2AA95E8F6EFB69A5F1455F291F8 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = F2889C10D93653FBF156A4E9F1118976 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E229CA32ACE34EDEADB722D274FC4FAA /* UIPageViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A3C0F8BC2663543BBB56BD1D07D6CFE /* UIPageViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E2A8D240C6A88B427CD489D5DFEE15B9 /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 46AC5AC9133DAB24CA1667FE46402550 /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E3216E4ADB979F2B578496DB76FBCA1B /* YYTextKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FAF753E3DD88A67E407F6BA30B598501 /* YYTextKeyboardManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E32DDF26286A2F7F77F8B90754373696 /* UIActionSheet+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C2BD20D48F2D4BB15175F72F9E97CFB /* UIActionSheet+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E366F98235BF5356CD8376EA810FB719 /* FBIvarReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B76BDFF0474131CBE95A81BF59E259C /* FBIvarReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E3BE7988875533E3A8771A0B5F83B871 /* YYTextSelectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D0B04B18C889689677E529A528E73DD /* YYTextSelectionView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E4B7C339ADB74AF708C5759AD2A34271 /* MyTableLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 37A7B5AD1ADFD0B617050EB45210ACF5 /* MyTableLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E50D12E543FA3A846A02064E1D428761 /* UIView+RoundedCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BABD48B48F3AF368E6FCA862B2E58E0 /* UIView+RoundedCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E531777A14ED917021F4BDC75DE4E9DE /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 65BC2F9B62FDFEE89297CBF1C49B9A16 /* IQKeyboardManager-dummy.m */; }; - E532AB761BE919436A751C6592DDD7D2 /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = C45715B179603BDF6570632E0AB23F7F /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E5962B95DFB52657991ABE4323CECC00 /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 67843B4AFB717DC19EE388507E0E90EA /* _YYWebImageSetter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E6AD346A0F4A297D39790831FCA99D4F /* UIScrollView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D1F907ABCD484D40F988C657E03F0B0 /* UIScrollView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E78D867BC671930C71FBAFB37C5FADF0 /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = B7F5B0DC517DA77731F27DAA68895507 /* YYFrameImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E7C4AA1A6200B14A941026D27F2B7523 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - E838A33AF16A8BD693037E7C2A54B02D /* UIApplication+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 9203095B5298625FA1E60CF69A48CE89 /* UIApplication+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E86616CEA9B7E604BAEE94D045766BF6 /* YYTextMagnifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 31648AC9A55E2A176D9FAA4999CE5934 /* YYTextMagnifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E8724F7D8D0A810B231E65F0B93EA0B3 /* NSKeyedUnarchiver+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = FBC760B71BAB9E92475C9FAC61EDC721 /* NSKeyedUnarchiver+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E890B6532DE06B762D5FBBE65CC96658 /* FBAllocationTrackerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = D39D80301ABB271A669B38688F34BCE2 /* FBAllocationTrackerManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E9C9E045A4DEC75BF1F8EAC82F66B6C3 /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE3CB4DBF05A80545E0A9738BF8CF22 /* MJRefresh-dummy.m */; }; - EA09D1CACF5BB6F95858509585C62E61 /* IQPreviousNextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 923EB90555F006B695B21B1EF92A0829 /* IQPreviousNextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EA59D93C0DB8BD6C255DCFED262FE017 /* UIApplication+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 85EB35C3772EA46EB9FB7F38672CF542 /* UIApplication+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EABD201E9E05DB1BD9AD6CF4E53CCD77 /* YYAsyncLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = F83D22C26E9610A1D078B3934D89B715 /* YYAsyncLayer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EB02AEF303313F801392DE8D90AFF0F7 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AB281AF7F097B86A46F7B8536C2EA38 /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EC3C8B0E311C697F5AEA2881DB783D8A /* NSObject+A2BlockDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C229C98F73ED9180ABD9E05D95D67C37 /* NSObject+A2BlockDelegate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EC4752A6952E143D1A868F2F2400C8BF /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 37E0B549BE7A86F85D64A4752B4189BD /* SDAutoLayout-dummy.m */; }; - EC501CC4D69B88748E588281B3D35081 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */; }; - EC6CCC98505D2067BC98B4E6223C9DF8 /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = D4194C483B9B9A7F6849BF0E12A25E92 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EC783E9B9EA9DDFC778E4AA0D5065097 /* NSObject+A2DynamicDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 9424C0FAFC3EAD474CB870C47C481C80 /* NSObject+A2DynamicDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ECC5CE14CD52A0B4261142912113523F /* MyLayoutPos.m in Sources */ = {isa = PBXBuildFile; fileRef = BDEAE3DEAC73837A85801AF71B0A19E8 /* MyLayoutPos.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ED69D9B5A342FE9BD3F170D5CDDEC948 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = B2735FCD3752765F1318AA765E05C8B3 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE4E6C1BC29493BF3A669389D9ACDC67 /* UIPasteboard+YYText.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CBFBDB249D7D9EFFC39DC7E6BA02F93 /* UIPasteboard+YYText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE4EE2227481E4A55FFD2261B925F8EA /* FBObjectGraphConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 588B42890A252D3930B71555B6E03222 /* FBObjectGraphConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EE84FC76482B28CB044E8F6197BC583C /* YYReachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E806678D5FD53BEA412FB4EAB3A26FA /* YYReachability.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EEA84C1A209F5417A75FB129CC3F22ED /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F4E05159F189D6601F4017C603D706 /* MJRefreshBackStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EECCF6D4F814D2002ED1CF27B3DE43B0 /* NSObject+YYAddForARC.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E20EDCFC83C743D142C8E40E317192D /* NSObject+YYAddForARC.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EEEDE915DA1014F06CAF97FCE00E5AD0 /* UIViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = AB6D57D045C4E299B7132365AA8B7F85 /* UIViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - EF158C4CCD34CE03299979AE56845597 /* WebViewJavascriptBridge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 988F0FBE5674D696A763BEAF088DAA6D /* WebViewJavascriptBridge-dummy.m */; }; - EF5C372405CD6F1E270BF8FC0F8D0D73 /* YYTextUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E9DC50517CE63365DD9C4AD3D4628FF /* YYTextUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EF87B1AB7825C0B9244F364CEAC1EF31 /* MFMailComposeViewController+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D77B13981F2C3CD8D38863868755197 /* MFMailComposeViewController+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EFFB0528C2A3CF06634EA593BA9B124A /* MyLayoutSizeClass.m in Sources */ = {isa = PBXBuildFile; fileRef = A45C66C433920D54300CD5A5012D0E1C /* MyLayoutSizeClass.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F0652DA225748A5D27C0D8D7F2DADC36 /* FBMemoryProfilerFloatingButtonController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0552B3FF01CC254341F9BDD57A1DA428 /* FBMemoryProfilerFloatingButtonController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F24DD04970442BA79A94F4490928744D /* MyLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F7C672934FAD3064B3C01587AE90804 /* MyLayout-dummy.m */; }; - F290D9B4A7404933D4956C60893577B4 /* FBAllocationTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = F2E12AD898A18DB42AA23058D5988B26 /* FBAllocationTracker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F2C12D297EC4A13542A4587C99E44EB0 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F57FBC0CC07E11A9B5E4207B5A683C10 /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F2D51A804FCAE5C19E2056E56F191CA1 /* UITextField+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = C345502A75CBE61E001D30BA161E4977 /* UITextField+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F35B33F703C287C3C485A77CEE74897E /* YYAsyncLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = C46E09036F368F42F2C7107327BD1A63 /* YYAsyncLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F3774B1449FCE5B3CA3E1B336E11D284 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F952920591065B6779AB858BA9370619 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F42768A24AD7007A6C73A8174FE9A9CF /* FBObjectiveCObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 115B2A6E7D3261CB97A903E45849005A /* FBObjectiveCObject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F4A7718305727E8F73BB52E12A7817FB /* FBMemoryProfilerGenerationsSectionHeaderView.h in Headers */ = {isa = PBXBuildFile; fileRef = B2A6223DCD46DE4F65A52893D4EE6E24 /* FBMemoryProfilerGenerationsSectionHeaderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F4AA2299205DADFF55B7C602DAF95973 /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A8DF7FF8EC5D172FF04CA442C9A51AA /* MASCompositeConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F4B7BD54C7D56BD97FA74AEC2E7354BB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - F4C34EE47D747EB08072D0E6B0885D22 /* YYThreadSafeDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC34FD5385E64670B47F6C9487AAA04 /* YYThreadSafeDictionary.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F5283F0FBFD102881B2A2EB1D997582E /* NSObject+YYAddForARC.m in Sources */ = {isa = PBXBuildFile; fileRef = AFC38B21F8AC5CD8692451846AB1F457 /* NSObject+YYAddForARC.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F60CAF477B4F4573C02F675C42DFFD2D /* UIView+BlocksKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 384DD95419FA690A3C7ADFE8189477B4 /* UIView+BlocksKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F6516207095BAB4A00C52187CFAD097B /* NSObject+BKBlockExecution.h in Headers */ = {isa = PBXBuildFile; fileRef = 045BD462AE8370C34E44BF30A02B2CAF /* NSObject+BKBlockExecution.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F66926E808A751FB587DB34778255261 /* UITableView+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 7235BB3AF5AB53B92A66FA087FB37CDC /* UITableView+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F6C7C9A1BE5A4E0D24B25766B4113E58 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37AE1CD4FA627D2486748A541972215A /* Accelerate.framework */; }; - F6F39D36AC3FD30B5C3DB93B2BEEAD5F /* FBObjectGraphConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = B2DBE707C5E3DF45875D685CA382E542 /* FBObjectGraphConfiguration.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F76B2D834D073963258CC62C64D09766 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A867079605A7949AA380F14868603CB /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F7CEBF9EDD9E89A5A00044D0F8FCB1B6 /* UISplitViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 12C6A852590F540BC62A8D4D29FE3E95 /* UISplitViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F7DF2278950FD397FD19D86DBCFD1E59 /* WebViewJavascriptBridgeBase.h in Headers */ = {isa = PBXBuildFile; fileRef = C00F8308F41ED0074A3E0593A878B9F4 /* WebViewJavascriptBridgeBase.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F8CA8FA6938CAD4AF94B8322E65E71A6 /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = 59DB5DE2EC4B6E18093E86DBCEE0F114 /* IQNSArray+Sort.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F8E226DB411BFD87FC3F7681F98114FE /* NSBundle+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CA673B91BB7FC580CFCD62E50E96B6 /* NSBundle+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FA63DECDF8259994E63CC4F81D26D9A5 /* FBObjectiveCGraphElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 190B701B64C86FB6E111E5F5FCE11DD6 /* FBObjectiveCGraphElement.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FBED53C806353BB69FFBEDADFED1D418 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 59878695D49E5889A941D92A41356AA7 /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FC2ED8F8DAEE337D703ABBEFC8B1DC72 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3698933040026038E6B013F971CC37E6 /* Foundation.framework */; }; - FC7E4F4B1969F616D9F25C307B48C970 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = F80D4FDDD654673A1021C21D4DDD8F24 /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FCE2848D848F1646E37FAA8320D725BA /* YYTextDebugOption.h in Headers */ = {isa = PBXBuildFile; fileRef = 573302A94962ECEDB4BEE8F6031FF022 /* YYTextDebugOption.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FD00F42C2210FD2524AE0636DC9AEDEB /* FBMemoryProfilerContainerViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 38B3A28C52D5632B18B9F817CFD777F1 /* FBMemoryProfilerContainerViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FD39EBE3398E1A99965AC003B273450D /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 64D21B35395ACCE01347F2543C93E17E /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FD881B0D5C3773188FD9DA82CFF5D151 /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 2357778874C40965E6624D6D3DA4B672 /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FE01BA6A01FF9850658526DEB6E3762B /* UIScreen+YYAdd.m in Sources */ = {isa = PBXBuildFile; fileRef = EB720667DA3FF657F2496806E4147791 /* UIScreen+YYAdd.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FE39078A70D6214069FDD2C2B240FB77 /* UITabBarController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = DAC6A3EC477ABAB4D70C54E869B7CE45 /* UITabBarController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FE4C33EB7702BC7EDE592ACD89C2EAB5 /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 503C401237D1504EAC535D4C824AA2C3 /* IQTextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FEACEFA0564ED9C31AB66F4A181F7DED /* MyLayoutDime.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C3E87311FC436EF7C702045B4E3694B /* MyLayoutDime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF0909447E18818BD3AF878F47DB435E /* YYTextContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9014ACEC790E3A7FC3319498B0DA3286 /* YYTextContainerView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF3C232E71E4C6A60F7A3877FC6A162D /* UIDevice+YYAdd.h in Headers */ = {isa = PBXBuildFile; fileRef = 123651602FAA4DA2081110D97FEEA79A /* UIDevice+YYAdd.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF682E8B083BAEBBDF38C52D89D45E37 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B3AB8F9CF26BD99D2E66C0F125D2F592 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF8234F24E5A500CA0A50E2698DFB5FE /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 002DED8FD032353B0D7F5E1F3F688940 /* YYWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - FFA2267B5FB24E6E9D37D56DBF06F4CA /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D5BD7904F2823E0CBC00FD88D5FB3A8 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 00165B02644225D503F585E39D462662 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 469BD90248B96FC9B882C11BB007E913 /* MJRefreshHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 003C49BF565553CCC13B5972C8BDE7D3 /* UITableViewHeaderFooterView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 149D613AB64A6FC4A51B600C92945C66 /* UITableViewHeaderFooterView+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 00C90D2CC7B601460E02DA15E0B14CEF /* UICollectionReusableView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 6FC2BE9F229919A94B59ADBD98870EDD /* UICollectionReusableView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01E09711F001C49F92A97060414E262B /* MASCompositeConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 50896F33233684212DC121A645CC89F8 /* MASCompositeConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0208035EB2AA19980BF5A73C26F9A03E /* BANetManagerCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D6125A92A79F0174D519EEA96DDB6614 /* BANetManagerCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0214246CCB1FF7182F7222B9CCDF8FCB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 02291AFBA9778DD02AC1BCC3A37DD998 /* BAAlert_OC.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D5A4EF37208CFAA5FC23E3F946D3D1 /* BAAlert_OC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0378E93F8FA705BAB02D429BA15A8BD1 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = EF804754A2A4BA00ED0571DD360E073C /* UIImageView+HighlightedWebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 03E287270BE3786DBC8FA7D51FDB6C3B /* FBRetainCycleDetector.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1BACFD0B00F53EE280B277E0569FDCE5 /* FBRetainCycleDetector.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 05132F1E088CE4719C7F227B04243365 /* MyRelativeLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A27D78343DC7345BCB9DBE049419D2D /* MyRelativeLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 059149D1FE43FEEBB99B03417454CB57 /* MyMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = DAC1A8C272EB902E442B93356AA4163F /* MyMaker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 06014790C52BDB833DD91E2EA31C57CC /* RACSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 90B474AD58E8F15B1D8417320883AE1E /* RACSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 064EC4AA8FCCD08F2037037B1E672DBF /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B512CF401CD8E29A3BB1EB7A2E9F8845 /* AFURLSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 06E5728E4758F6DA65FD5F94D68A5646 /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 26F4CE27362B55A10FAC835055A92967 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06F464B11B1FD100EE03EFE6D907AE7B /* NSOrderedSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EEF7A0CC60C23BB5B5E5E766F63AB82 /* NSOrderedSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 078DAC06201563D7DFB5C55831B72CFC /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 984F9931CF0D45C901C10DD01736C733 /* SDWebImageCompat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 08BEF10BA299EEDC0A0787F7A488E1E8 /* RACArraySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 683E7F42D8F2F56D9D411895EBF08B0D /* RACArraySequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 08C263DF6F9031C2ED55A0D16722652A /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 5B788588778E43455F9CFC1EC1A2240E /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09AE1CD603FEA2710DB6CDF79034CCE0 /* UISplitViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 076D040C504E8A4140502446CDC10DB9 /* UISplitViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 09E2D8F0ED0592C82A667F1A32957445 /* BAPickView_Config.h in Headers */ = {isa = PBXBuildFile; fileRef = 78989D891E2977559FAFFA4573846FFE /* BAPickView_Config.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A0AA20A2348D0758B66C7AA855C105C /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = D738726436B6FEDFF7B108051BF55533 /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A1CE7CE58B28609B573D4058ABDD616 /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = FCBB5DE174341BA6135245E17E2971E8 /* AFSecurityPolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0A3A685BD9A56E789E9EA83A1FECBBAE /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 56A9A6A83273B2FD3199AD2E2A873124 /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A51F101E665672CEE3564F22BEF39B4 /* FBObjectiveCGraphElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 93234A36AA4E82B5500A13B523BBF26C /* FBObjectiveCGraphElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A8A266C099C69AE5EDDA18449D59918 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 0BF0406B99C9D40B97754DEF3F1BB40B /* NSData+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 05278141D1D36FB932B136CA7F3D7DAE /* NSData+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0C301DFB402DF26D912413BB335720A0 /* FBRetainCycleUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BD9CA6229D0C6AF61ED4CAFCFE388C1 /* FBRetainCycleUtils.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0C98068993F234C035CFF4B331F31774 /* UIImagePickerController+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = EF18E4AAAC5DD37D24DF555530DC5B2A /* UIImagePickerController+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0CBEA00CFEA3CFC43B5584BBB5AD15C5 /* RACSubject.h in Headers */ = {isa = PBXBuildFile; fileRef = D27FBB194DFB1179123199D9E1FE436C /* RACSubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0CD9E8E4AF19BA77BA1634BB0D8DE16C /* MyFloatLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = E5AF350229D2492D5661257C508B10BA /* MyFloatLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0D74BB49C7FCD6D149369AF58E560D37 /* NSString+RACKeyPathUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FC06F5260E80FF86BD331DF02F41199 /* NSString+RACKeyPathUtilities.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0DAE61EE8CFDFB7FB297590A54105F92 /* MJPropertyType.m in Sources */ = {isa = PBXBuildFile; fileRef = 95DD5559CEE54A435CB8CB7CEC5D5A0A /* MJPropertyType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0EA01C3F1131E46085C373D9F037001F /* RACTestScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = C3301E2066F370F905F0572A50A33F26 /* RACTestScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0F58D27F3B89D6745B7B5C689F24D844 /* UITextView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FCC7A3D936B2DC0E18ADF5E203B0A1E /* UITextView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0FBE35E90EC20A754FE148388194F18B /* UIView+RoundedCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = 63A4033AC2232FE5F6C3307FDC627B6A /* UIView+RoundedCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0FCD50CDA3E8426D5A8EBEE334AD97AF /* MLeaksMessenger.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A63FE6C1793D8EFF15F5E6994CE398A /* MLeaksMessenger.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 0FE9916BD7AB951F99C8A586059F8973 /* NSURLConnection+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = FF7525F3E5B785150F5D9EB53A7E98A9 /* NSURLConnection+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10E8B477B3EFF4BD97B2F86DE4BA0481 /* UIImagePickerController+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F855FC0780591E1AE9AB769FECDF8E8C /* UIImagePickerController+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 12FB4F1EED567495CE59A60213867892 /* RACTestScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 91B9D00466ADF96D063A8AD391D42445 /* RACTestScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 12FCB056A2B7051B0D91B16CAFE85C1D /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = C297F809CF7A4C1E8C5362110E8DEB1C /* UIRefreshControl+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1341A7AC2439CB63D459D32EF985A414 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EE8FDC050865E076A0BC3230729216 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 149E5412AC3CAF625BE3BDDD01FAAA4E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + 14B65CE3038761FA8F6F5D1ECED6A562 /* NSArray+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D80C429D17ED6E81D2D863B3757C8D /* NSArray+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1538CDC5EE69D8FF5CAB596D5C08C4E5 /* RACSubscriptionScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DEBF836F6DD01FC160403BBF725B8F2 /* RACSubscriptionScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 154F16EC176ACD9BD1510EEA6013FBFE /* RACSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = F1B91314EBC4598EB68803B118725BA2 /* RACSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 15F556BBB8C5FD67AD2D7616A991615D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 1615F44139A14CEC7C82D546361B0609 /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 982C2F43360DD32C33C8AA7D5A72EC9A /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 161B3785F561102FEFC4411D7F83DD50 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 262DAED21B11543F7F53D8B04277FD98 /* MJRefreshStateHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 17045EA58EB53C66039B73AFDA4BB11F /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = C7F7038192838C521B2A3AAE6CF28774 /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1713E141F1DA7E7EC40AB8236D2811EF /* UISlider+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A43CBBB2BF1565E6DA98FFC0348EA167 /* UISlider+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 17335BA1380AE6AED8CD25A44290798C /* FBBlockInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 5AAD4883A055A75F1311DE4A805AF105 /* FBBlockInterface.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 17BC1848666973B0308253F04C70F0BF /* UINavigationController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 52B3045903EFF603FFF8BB5D38E69021 /* UINavigationController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 17E74D623462991F19748A7F99CF8ED6 /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2200695DDD89F6C936EB06E5AFF20767 /* UIWebView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1861BD680146448213C3485056697C29 /* RACCompoundDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = B6EA9E873DF5DC7B0576C9E0B0F3445D /* RACCompoundDisposable.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 186FF44AA650AD44B8AE97BA553BDE89 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = BD482008D91EC0216DC0E8B0A6719235 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 18A8F7B9490D287E5EE7787C35FB7A37 /* NSUserDefaults+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = E9351AA02F3EB08E3784279C62F1EF9C /* NSUserDefaults+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1940150B3B5DA4FA97D8217A85CD7DE3 /* RACSubject.m in Sources */ = {isa = PBXBuildFile; fileRef = F80DA353E7061A871D46C211A1D547FA /* RACSubject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 195132C2DA66BD3AC18039534A418AF4 /* FBIvarReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 95850DA30F2BB1B84D94C6178972F6A7 /* FBIvarReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 19CB48FC7AC9D4A7371CCA619ADD85FE /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = F1E6E56CE71732E8ECCA47B8DC8DADB5 /* SDWebImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 19CFCF718B674B91847980FA20429558 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 93BDCF3B3DA900A5EFB80DC0A6525E4D /* AFNetworkReachabilityManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1A12AC09DAEE727DBD9D111A2B098516 /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = ED6C495242508E51175CD46DE280A767 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A21BBE19AA71582C8E44A5549CA28BC /* RACPassthroughSubscriber.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4DA895741510F5E99118CB4F97A297 /* RACPassthroughSubscriber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1A53E8AE5C2491328F12FA8C7DB6A836 /* UITextField+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 85C21791B4C733B9D460DE01E9E72D6F /* UITextField+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1AF513D8D71B663D5422760106B13723 /* MASConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = D9D50A1B986AE4CBAC9F25A3B87D0CE6 /* MASConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1BD6CBE4BFD9590D423C20A3A76B8C24 /* ReactiveObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CCE6A9D5F175ACCC7658035BF3FBDAB1 /* ReactiveObjC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C76817FA5353D989D7BC33E8C5997B5 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */; }; + 1C9B1CF8D54D6E13EB64E5DD4D9BCE30 /* RACSerialDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = F300FE56FF3145C8FB9AD5FF7A43D1DC /* RACSerialDisposable.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1CA7968A577F0508352200889C3B34B7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 1D79EA95FF188871930BC9DB0EF76077 /* FBNodeEnumerator.h in Headers */ = {isa = PBXBuildFile; fileRef = FAFCE66510F5C72350C031D6CA342C58 /* FBNodeEnumerator.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1E0ABF8AF92A609FA30D28620E76ABAF /* RACEagerSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = B7E7F89B24929AC997A0A51CC2B7D0F2 /* RACEagerSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1E934391B59C68B729E3E2CB6CDF3AE7 /* RACReturnSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D7453F6D71E2125AC8396C094D80724 /* RACReturnSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1E9F08BC9F8D7DB75AEC6943DF63747B /* RACDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = 770EE84C2D12D89088B1400460903F3C /* RACDisposable.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 1F3BD3BC28432BB5E2F73501E06E4579 /* MASUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F0F5DE5C01B7BAA938DA1FF02477B0 /* MASUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F4E38A56447A2A214F10261C4521567 /* FBRetainCycleUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = F4CE5ECD7355E0C0076A8173CBCFB84B /* FBRetainCycleUtils.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 1F8FEA93407CEC682A2C0C282CDEAD89 /* MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 96C97AD37C37A32AF7ADC0E0AFFC6346 /* MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2006BFE5ED826610538CE41074CA85D6 /* RACEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EDCA3440551E5C2C770A322ABE1F3B5 /* RACEvent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2012864C735C3DD88ECE425F6C981F6B /* FMDatabasePool.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AEDD7FDA88C26510064248D70178E27 /* FMDatabasePool.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 202AF6D3D075E0A02AF90E4B4880C802 /* RACGroupedSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = B02F60AA22796FB79862B4D06CDE8F76 /* RACGroupedSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 20EB55C7F6500666DA055783E6803BCE /* MJExtension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E1C889AF5CEC7E1AA2DFCAF565C3BB7 /* MJExtension-dummy.m */; }; + 211646AEE68A3577495B0DF917A0DCDC /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F40D29E73B9F1D27F74FB5856BB9224 /* AFImageDownloader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 215D777D7566FBBCDA6020A747A79C6E /* RACEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A6C86CEAD5B224648297B9CE86E638A /* RACEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21647889CC6757FA0040069F72B0782C /* RACErrorSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A04CFAEE48B5262947F2713C74F91ED /* RACErrorSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2224AA0C0EA1CFBAB4B35B1B29263871 /* BANetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A24581B2421A77286F2E77CD27519ABA /* BANetManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2228684E255D03B0A95084FF8C5F78AD /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 96CC5897E6848EB5C09E6C1FD2CD5C01 /* SDImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 22FDEDF4D77D979174E2F8404F0B8627 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 1451240F2979272EAFC1B709D9DF75A3 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2319AE811644B493BAFC885669A9A3C1 /* MyTableLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 60C38E834960E437E49AB0F022A25995 /* MyTableLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2326B72C6DDF90461B96D803AB0E718F /* UIAlertView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = B3C2DB03A42AE5681D8A15EF7775AD90 /* UIAlertView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 234E79261AC257C75B8644DA099FF1C2 /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 08438849E50E3F8FD2D56E8806A7286A /* MJRefreshFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2357DDC85500B4F45E37E411B596F562 /* NSObject+MJKeyValue.h in Headers */ = {isa = PBXBuildFile; fileRef = D64F734FA822B14CA076B30D87148111 /* NSObject+MJKeyValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 236524396AB978EB013E1EDB702DB0D4 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 140163F1818B2F9C79F22762ACEA471D /* MJRefreshBackNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 23C101C10FF5ECC8FE29078BAB3E0FE8 /* NSObject+RACKVOWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = AEA19F745A325226E68C2AE19280CEFD /* NSObject+RACKVOWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24366EC109185894F228F3E2917122CC /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 645FD6BECB7739E2EFF3E953E0E82109 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2473EEC1DD96DA1BDB5854EBF13DA3D9 /* Struct.h in Headers */ = {isa = PBXBuildFile; fileRef = 811A0E1051557C4254EF3DA722799C17 /* Struct.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 249137C66E3211FB55A11A8D1D8B5FB3 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 35787C1EADE08EA1FA3A0739B3FA15AC /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 24BCE8CFE943E7FEEE9C77AF19CCD3B5 /* Struct.mm in Sources */ = {isa = PBXBuildFile; fileRef = 230F29483FCC337D606D637DD1FB2B88 /* Struct.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 24D62FF5048CF5339C87189530FFE3D4 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 79DB9BCC449DA5BFF0A8074105F999C7 /* MJRefreshBackStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 25AB8C276F7E356D09D38ED8E87DC314 /* UISlider+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 90018A503A8CEE50B82FEFC8C5B1717F /* UISlider+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2612D2B9BEA56B8CB2B361AA0BAB599F /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC4EB67AC152CDA932EEBC5F7378174 /* UIButton+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 262F09111C574E80A4C77C5FC75D2FC5 /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D91D0FF2C718F2C6CDD5210B1769B0A /* IQUITextFieldView+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 26D2993721ADDE22D59CD39B008B23EC /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 586379DAA99D75E39F9642AEC8F5E069 /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 26F516FA78F17CC80E8A8AA0787577D4 /* NullSafe.m in Sources */ = {isa = PBXBuildFile; fileRef = EBFC03F0A603F5F06588BA74F5319B6F /* NullSafe.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 270F1E86F4FADA90623D5E0B67AD5C8B /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A420EA5A01F414F0FC314F1064C6278F /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2747EE8106C747EA8BA5D5C53AAAF773 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 2779B4204D238B10720B1D2D39EBB8BC /* RACMulticastConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F08CCB0693E93A725C16B70974BE /* RACMulticastConnection.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 27A153B9E381F0A914A71BCBAAAF1BE1 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = B0FFA59642E56C38D4B03E8CA762B990 /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2840200811C169B537D1AB30BD1BE5BE /* RACScopedDisposable.m in Sources */ = {isa = PBXBuildFile; fileRef = F8248C414FEB1821DE630D745804D0EC /* RACScopedDisposable.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 287F5BD9A44437A41CEC2F370FE25886 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 288E9B4B99C71CD94352F785F807C4F2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 28B30D7AF077B7BBD7361FB6AC3AA2BC /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = F344F11D49F15853191E2DFDB70CAC29 /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28B9AD50225490AA3D8EC93C02702FD1 /* UITextField+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 06DA4C4975F8EA85B8A299B1AE23C457 /* UITextField+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 28C7CBBF6E282E66DA76FD2CE4C4CE5A /* RACSubscriber.m in Sources */ = {isa = PBXBuildFile; fileRef = FDB3A102CB0523354DC41B91D8697D65 /* RACSubscriber.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2AB111D38BFC2D501249664984E1A48F /* FBObjectInStructReference.h in Headers */ = {isa = PBXBuildFile; fileRef = E25F808055257D1088E5D63822CA2698 /* FBObjectInStructReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2AC677C7D32F72030B81CA00F24F65FD /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E0039B999EEC6CC2BDCD4171B8E22AE /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B20A7A457F69EA4CFEC2DB9CFB37FC9 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C1FC93334980F256E0551501D88194C /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2BCD3F861A5F4CF448072C4692AD130D /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FFD73BD50467F1415468F929775F98A0 /* UIImageView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2C41E93CF9F63753E9F5D4AF7410C9E6 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = A1EADA48B3316C296B619063CDAAFAFE /* FMDatabase.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2D551DB63729E1AB561DD47287449251 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 2D62B803E161E9F5510ED0EAF293EB7F /* FBClassStrongLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C1407FB601C2671A1CB39BA8960D5DB /* FBClassStrongLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2DBB2C804B04B105AFBC65BD957EB4EC /* UIApplication+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 1179E94B52BD84B46398ED6142E3B82A /* UIApplication+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2E396DC8A4A1A517C66D660BFB119AE6 /* FBBlockStrongLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = B9A91DDA7E64E859C26D6CF57BBE5C29 /* FBBlockStrongLayout.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 2EBAA518CB8B2DAF89A63637091D4615 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F20B78249762A98503F000C0866655F /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2EFDEB04B2C065CFB1C9585FD3D4A70F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 2F0AA8E23D06411F630E51B9BC7C2E7C /* RACCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EC514F86D7133C8AD208124A04A5A44 /* RACCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2F9C6A75A81786C913877F2B10829446 /* BAActionSheetCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C7280B0B01FE0A9FBD451F52A186927 /* BAActionSheetCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2FFC0B37153ECB644FB44590FA7870F0 /* UIView+BARectCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = B2F7CA4FF254B4E71A0FC39B3B529DD1 /* UIView+BARectCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3018EE59839005688A2865CCD3167680 /* RACSubscriptingAssignmentTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = B3B6F3F9725B0E0BC78DED1BFBF1D192 /* RACSubscriptingAssignmentTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3037AB601C885680CFEA52F0D9BFF3B6 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B563D356738CBFD934E59F1F95F94E6 /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3046977628F90F18E0C16226B3E9CC66 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 181A9D814CF3A91AF0A0F95586C6DDC9 /* MJRefreshNormalHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 30ED24B307C7A36FB5FE4B28D75ADFE9 /* CALayer+Animation.m in Sources */ = {isa = PBXBuildFile; fileRef = BD9BB92866B725B4FCC7F220A47F2786 /* CALayer+Animation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 318BD24B1B9DCB183FF8D9C7B1ADEA97 /* BAKit_PickerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 95313961CC052A5A1DA2C2AA063946F2 /* BAKit_PickerView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3209214BDEE62D6A14BD122EA403E3FD /* UISwitch+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CA5BAA895F8F75A12EC1D858B0B6626 /* UISwitch+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32170BF7817BCD2E27F114DF85BEC1FB /* FBRetainCycleDetector+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 155961995EE5EA2560BA51896ACBA23C /* FBRetainCycleDetector+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 324AEE1266878BC24EA8C1DD42D5E7F5 /* MyBaseLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 012617C3649DCA989C25D81F51BFCF1C /* MyBaseLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3254A0868C2064A507F6FD2042728CFC /* UIActionSheet+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 35732075BBB2F0C1C7555D30716BB878 /* UIActionSheet+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 326927CAFD6998E858E504D0131E7717 /* NSObject+RACDeallocating.h in Headers */ = {isa = PBXBuildFile; fileRef = 20243B04674BFF26F1C89BB8801B12FE /* NSObject+RACDeallocating.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32CE86A55755C33212B96E92DF548297 /* NSNotificationCenter+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A4460A1D77EF476D75CDAB94861EECC /* NSNotificationCenter+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 336514D3DC816F7AE30D0F40C6630632 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 33C9BBA493BFCA903EFF1462B7B67D89 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AE1BE0AD3E37333FD6CBB38ED79FEC43 /* SDWebImageManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3441FD49260098D9A3C6EC9B99C27E24 /* RACScopedDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = F3416F29B712BBDA03F5D32621408AD6 /* RACScopedDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 34B22D755CA7E16A822E9C09ACFBECD9 /* NSObject+MJKeyValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B43B6EB8692A50C274D7B10EE078407 /* NSObject+MJKeyValue.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3500BFC1B349FD37291B8E3F4A57C32C /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 19DAA63A9C4F018362642CA2E4E33C93 /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35773004282D2825DD45C3EF9B32C21F /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A776A1F54D563FA366882864F4773DA /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35B39A7A2A63892DCB722C1E1063E152 /* FBObjectiveCBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 500E8609A7C6478FF93264F69B6822CF /* FBObjectiveCBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35DACE1A84A19E6CAA0E045E6608722C /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 6452F64FB9A4CA603153111E279D02A1 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35DE995FE1330AC6A960B9A41EBA5BE1 /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 87C396456C1DBF225EE521F037BC5DBD /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3735A8F00A2F14E2CC1AF9DBCB0204ED /* NSDictionary+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A7EB0ED4BFC39E91AEC092305D00CC4 /* NSDictionary+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 374E3648990739367CCF8E10601C79C5 /* FBStandardGraphEdgeFilters.mm in Sources */ = {isa = PBXBuildFile; fileRef = 01ECCDDED3A1496AFCBB954F1BE228A5 /* FBStandardGraphEdgeFilters.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 375F406E11C336D937C08DDAE88C4ED4 /* JMRoundedCorner-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D05680A3EF91F26983800EFD7ABA4953 /* JMRoundedCorner-dummy.m */; }; + 379E73B02D080960213419E4E9EB8E57 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 388DEECFB480603D294F7E854FA5CFFA /* UITableViewHeaderFooterView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = C596170919E35CD4258498390D989FEC /* UITableViewHeaderFooterView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3892AD2E3C45334DD27E8686245CC509 /* NSObject+RACLifting.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DAC0FCDA2FFF32FA2B67735A53D1938 /* NSObject+RACLifting.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 38D21D09D7DC5C341EAD47F13CCA34CD /* NSObject+RACDeallocating.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BA360036A5AABAFBDF3334B063FDAC0 /* NSObject+RACDeallocating.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3911013375A3BCAA6817F40BAD456388 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FD86E222A556966847A5A1839B2D9F5 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 398A5C11EFB816892FD5E18AD24F03D4 /* FMResultSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EE3B99BAEC118FC63BA4B315A147B82 /* FMResultSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 399AD9BBF136293CB803BB676786BD30 /* MyTableLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = FF76520268F3123F593947502AB7F9FD /* MyTableLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3A135E858450F155E28A1F19CF0D0332 /* NSObject+MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = E5F1FE1740DB2CBDE3A588874FF5CEBF /* NSObject+MJProperty.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3A5AFEAEBF16D153E69669B9B61A2D79 /* NSOrderedSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A6875D2AD8063882A71D920BE79C32C /* NSOrderedSet+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3D51A7D14E04DEA3F615267326D9DF39 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 3D761EFC3010510CCDA246DD4ACD8C95 /* UIDatePicker+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = EF9A17FC90908EF12F33CAE11F0E3363 /* UIDatePicker+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3E3E0923CD2596B21F5699BD8A9F444A /* MyLayoutSize.m in Sources */ = {isa = PBXBuildFile; fileRef = 38D5AFDE32F62244BED362D45F62E0E5 /* MyLayoutSize.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3E8181D81B4A0AF638056FA9EE8EF2BA /* NSFileHandle+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 963D9B5691C4810E959EDAB45BD9784B /* NSFileHandle+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3EDF9409FF56DD9231E3F5C508293AF7 /* RACPassthroughSubscriber.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F87BCBF3538C417F466EDB238BCFE42 /* RACPassthroughSubscriber.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3F8E1511E1B765762C9448C1A150671F /* MyFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 934817E4C51481753208D8043FF8A696 /* MyFlowLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3F9B7B96F95416ABF95F00E750EDB4FC /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = AB9EB42B9050E4FEF520D780AF17C884 /* IQUIView+Hierarchy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3FA97B3E7DB4506B27097B6BEA18E6B2 /* RACQueueScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = BF2DF29A3ACB8A0748E91601BC5F74A1 /* RACQueueScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3FAD482A58C0DF35FF2B74E883C1865B /* BAActionSheetCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FB680C7F5EF0A74DCB74CEBD2E362D46 /* BAActionSheetCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 3FECFDE87253334FA356C4898AA1478D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 4058490286340DD8F35B782988B62DA9 /* RACReplaySubject.h in Headers */ = {isa = PBXBuildFile; fileRef = D3867859D01997146ED0A6B55678EAE0 /* RACReplaySubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 40DA4EEA0E1BC3C5D3200A9B90BC69A8 /* RACEXTScope.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE2F2FC2CAD45E6981EB09C51B8FC72 /* RACEXTScope.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 428F7F5939C25BC63348A0F068E21F7B /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 398019BEC2C03A0C83B11298A7329629 /* SDImageCacheConfig.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 434F1BC8A60BCEA041F1A564194EC87C /* BAPickView_OC.h in Headers */ = {isa = PBXBuildFile; fileRef = BA57AD18C92754A29658ADEE3CB19D5D /* BAPickView_OC.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 43643239F78BFE4405AD5092ACC1B176 /* IQPreviousNextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F9CAF1A0F76DF7C95AA9FE87616AA50 /* IQPreviousNextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4383226A07F73DA32817AE21693C6EB1 /* NSNotificationCenter+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = A1B380DCAD3D4989E2DBB93251264A10 /* NSNotificationCenter+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 44075E10A74C1321109A17F1AFEE8158 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = D2A9DBF98EF72B1552A4B9DCA1A0C551 /* UIImage+MultiFormat.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4425D9F9A5CD1EACFE51568A15A3AEEE /* UIRefreshControl+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 6167BA731EDF1A6183132EE6F7E58E6E /* UIRefreshControl+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 445559F744F9B0BADD377849C1C2B50F /* FBRetainCycleDetector-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B6CEFCCC58EDB72AA7FE62EF82F50A05 /* FBRetainCycleDetector-dummy.m */; }; + 46401F3C7FF0B0CFE2E9B14914780835 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FB904632BF7635153EBB4B52094A8C7 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 466869E41EB306F74C8A6E87CC1539BF /* ViewController+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4543D78CD3D31D7C057CCBE5F42C8ED4 /* ViewController+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 47687F665BD725F1046EE5C119145B16 /* UIImage+RoundedCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 5031BD94E5D281BDF0FA49E5155AE5A7 /* UIImage+RoundedCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4803F176BEFA1B1DDA46E4685C29C9E5 /* BAKit_TouchID.m in Sources */ = {isa = PBXBuildFile; fileRef = 763520CC236743BC9BFF34E1D68E25A9 /* BAKit_TouchID.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 490C85453F915055A5F7F6E48CCDE39B /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 694836430EB9C8125E7441814F33CA6D /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 490CA524521F7D444EA58FA915D7E99C /* NSArray+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B837B9C68445C1FCC28E0B1CC395B0F2 /* NSArray+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 496E1AECA482FEFF59EAD97CD913C9ED /* NSUserDefaults+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = D21EEE027DB8D34C65A2AAF14CCE57C3 /* NSUserDefaults+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 49B903D576E09560C52AA92FDCC31A68 /* Masonry.h in Headers */ = {isa = PBXBuildFile; fileRef = 403F378006FD2BF9BAD9E8276E715A41 /* Masonry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A49D2D82248088CA84188952B9E69BA /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C0FD2363C19CAAAD2FA740B029FE7D6 /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4A5370224316C4FDC97DFDE77E543185 /* RACDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 253D2711D2CBA7C45408CA750D08BF6B /* RACDelegateProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4A658AACD7DC9B7012BFA2A1E21A524E /* MJExtensionConst.m in Sources */ = {isa = PBXBuildFile; fileRef = DCE12E777FDFB5F59CE3D1AB607EA1C6 /* MJExtensionConst.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4B0E2A3FCD260DDC14AC986F7DC9A433 /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = C5B928368CF1F81EE818B14DDE3E9280 /* IQTextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4B3D72803EAFFC67F70C9F33E18E0E80 /* UIGestureRecognizer+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 429BAE4E40C83327B0D1D998598F015A /* UIGestureRecognizer+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4B5FEB1B4D1FD21BBD4D89990C3A65F6 /* FBObjectGraphConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 01B4E936F6957AE85B5FB407B150EBC0 /* FBObjectGraphConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4C19EA5D51CE0CD0A47DA12FF723BA07 /* UITouch+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 749131B0ED321E1314E55AF2D0E994B6 /* UITouch+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 4C2F00BEDCAF6C8363EFBE8B373985AE /* UIImage+CompressImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 77020299ACF56CE92483C8719318CE4A /* UIImage+CompressImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4C6BFB4C1F6CF71C99E1FB270F0FEDAF /* MJPropertyKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D60DB510C4CF8E8BDA17CE4E68AD3E9 /* MJPropertyKey.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4CBE1B46550A3FB90FDD1CB9CBA7B7FE /* MASConstraint+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = CC6DDDF0E27A3900E532CDE064919124 /* MASConstraint+Private.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4CC9C69E797A8B66E96A7A1C1B1B51CC /* MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 08F9C99E7D2BA240D4DD3AED5093367E /* MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4D4481D7CCAB65F56FCE65940D66E398 /* RACEmptySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BBF9A6F4940DDFEA675FF57427C9A66 /* RACEmptySequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4D73CB904FB8DCCECCC9D987FF76EBC6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 4E1D58C8FD07687510855F78194CFC80 /* MyLayoutPosInner.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D58D3DF16E86AB3A10C88B0003B6AB5 /* MyLayoutPosInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E1EBB47F6877FD897DA05D12B814B41 /* NSObject+RACDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CD1202CDB22125A7F85E1CEC6FDEFDC /* NSObject+RACDescription.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E9ED3B511284582E51B9F174A04D7E5 /* RACBlockTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F09E22AEAB191F29945C8492757D29C /* RACBlockTrampoline.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4F0C30DDEA8015AC0C2ACF001680ED93 /* UIGestureRecognizer+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 286E560BE1F5CAEB90DA5E2E24EEA6B8 /* UIGestureRecognizer+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4F2409AD0BC2345435F1790C9E6711A7 /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 03942C96840284EA7A4A42306EEA4657 /* UIView+SDAutoLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4F465CFD84A03F685BC5EE7E50110D96 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AD0CD4FE367AC1CB35C31ED86FB204B /* ImageIO.framework */; }; + 4F9EEB7B6227BA240455C8183E34AD31 /* RACBlockTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = 35AA214C6AC1232C1B5DB344B854410D /* RACBlockTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4FB74F804DD69190137B7EAACC769D10 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + 4FD48058F41DC4DE8E50732088ECAE2C /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 285DEC3A2DEB85BEE3116BC91D02FDE2 /* YYMemoryCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 4FE0DD2BD99DED481207CC51E6FBB31E /* fishhook.c in Sources */ = {isa = PBXBuildFile; fileRef = 82EAAEC10A1168277E065755D0E6A828 /* fishhook.c */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 50B17934049197212C6158A0C8DABD81 /* UIView+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CC6FBD35F379E7B58572D0A35591949 /* UIView+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 510006C67F22B784ECA56DECA7277787 /* FBObjectiveCNSCFTimer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 80A10BA1C35D53F01346A73D5910FB6C /* FBObjectiveCNSCFTimer.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 511E62CC288F9D0BAB773E7508C54BD2 /* RACReplaySubject.m in Sources */ = {isa = PBXBuildFile; fileRef = 312AEAC2C8999EE2170793DE45E4B8E8 /* RACReplaySubject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5140B47E9F36B49A1565B2DBB70372AF /* UITableViewCell+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = FC4FB10EFD19299CBDEC1C3BF7E17B70 /* UITableViewCell+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 514663D13BAD254F684191EA8897EDA8 /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = F251007383EE0D771424EE7E274C7C80 /* MJRefreshBackFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 51577160C4D66422FCA35CA4309743E7 /* MyDimeScale.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E0B83129C843D9FB6FDA7B950F2CFC1 /* MyDimeScale.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 524CCDCA583F6EB7864DA85CFDD2FA91 /* RACSubscriptionScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 48E822CF85A1B417E733C1688FA2010D /* RACSubscriptionScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 528CB1724C6F2D469237AC1148FC0184 /* NSInvocation+RACTypeParsing.m in Sources */ = {isa = PBXBuildFile; fileRef = A73DC36B540A437BAD925324A32CB822 /* NSInvocation+RACTypeParsing.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 52BA5ED3898FD3C7571E9B74782158A5 /* MJPropertyType.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D1D993ABB12AC1ACE1D7D82E8826BE4 /* MJPropertyType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52D224DB918FEBC654E65312FBD1F9FB /* MyPathLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = ADC5137C6CFCE99DD06051C7CC84FC5B /* MyPathLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 52E28A0A333684B80D6CD7FFD42865E2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 5384B3D4220177C54920CD90B667C14B /* RACTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 60EADE108E7BBCDA8EE2FE15DDFBBEEB /* RACTuple.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53E16175D3F285FCD0AA297379790B78 /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = A1248E606F012300018B23C31E9680AC /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 548BBD5B63FA097F419829C3EE8EA068 /* View+MASAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 514AC273FC24445D83FC5C9F35EB1DED /* View+MASAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 54C569700D18D40210BD66A54C295E23 /* MyLinearLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 234F644A5F52C35A3202B444A8BE17ED /* MyLinearLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 55536A434B4BC0B1EE8BD1FDCD94192C /* UITextView+BAKit.h in Headers */ = {isa = PBXBuildFile; fileRef = C494FDBBA55D3265C3C0140FC7FD8D17 /* UITextView+BAKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 55E100C6F1202EFF14CD1D9CA73E6CA1 /* RACDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 03D11F623E5749F2B1F5E766B98A4674 /* RACDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 564C355AC932F4CA88A75E1F428557D0 /* MLeaksMessenger.h in Headers */ = {isa = PBXBuildFile; fileRef = C3A48DE1F908577C23BB69378BCC5B34 /* MLeaksMessenger.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5651B5D1C3CC197BBC4E60B0486907B4 /* RACTargetQueueScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = EF83EE0F915810D84F50C89DD19D7D53 /* RACTargetQueueScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 567041C667DABD3C23072A5398212368 /* RACCompoundDisposableProvider.d in Sources */ = {isa = PBXBuildFile; fileRef = FFA8D290F6CA616F7FE38D9E087201E1 /* RACCompoundDisposableProvider.d */; }; + 56ADB19187037D7702F9FAF37761F6D6 /* BANetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 78C1568783AD9BEFBF0F76813BC26239 /* BANetManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 57189DCEA6F5EA977652E83C20F22875 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9791B7B4E06C573F3E1F36B0BFBAF3D9 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m */; }; + 5719F06B809080CDEF7E6BC75DEA1A3C /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = D6568FECDA701F3E6F731327E406ED63 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5893119644C74B86BB1A78997930A7C2 /* RACSignalSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 707663A6256B38642AA63C517F8FA91C /* RACSignalSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5932389EA3182D47CDE0A64DB20CB53A /* Pods-BABaseProject-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C058147B53A9ADFB7061DF7EB69E8FB1 /* Pods-BABaseProject-dummy.m */; }; + 597CEE76562EB4D948504B07655C54D6 /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = F29F7E71C1DD342C396D05EC998B0A2B /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5990488A3CE23CAC30C3A5737C3668F1 /* FBNodeEnumerator.mm in Sources */ = {isa = PBXBuildFile; fileRef = F1245DCADA367ECF0B9A5FC124EC259B /* FBNodeEnumerator.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 59CF9E95314C2B98CD4E53BA7FE282E4 /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = ED40B90F1D6C8B733F48574D41DED4EF /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59E9272DA1911A5D9B33D93712498732 /* UIView+BARectCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 05EC1B6C2F312B2D2EB67385A82ADF09 /* UIView+BARectCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5A2FF5F16ABBFABA5EC18B9AF230429E /* IQUIWindow+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 71CF3E8627FA78B3AB21BC4BED237D8D /* IQUIWindow+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5B0F9E50ABC298DEB44CF52A26A87EE4 /* UIView+BARectCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 395326E78402D6FD1222720DF2C766E6 /* UIView+BARectCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5B46C39A3F939EDB676981756CC24007 /* Masonry-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C82E61DF961334D6581C54C2B08FEDAC /* Masonry-dummy.m */; }; + 5C1A8BDA259349464ED5CDCE43FD51AA /* RACUnarySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 31BF767FF5B2ED098574654E25271D1B /* RACUnarySequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5D52B79671BB1E3204FE57591AB56C2D /* FBObjectiveCGraphElement.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6A329314C9FB7BCFAA04B9A2D9875BF8 /* FBObjectiveCGraphElement.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5D77AE5662B05B8D9FD5D889D55DF7C4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 5DBEE0B7F6DD9A8CE0DD449879B81D52 /* RACSerialDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1DED575B5BF7C305691C875E96D5B4 /* RACSerialDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F46FA2DA1E9903D4E4AC2296A5E2D3B /* BAKit_PickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 58A351A36F1D2D1D26BFFB0AEC05A52A /* BAKit_PickerView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 5F9047FB6A1DEFB6F6397E7540BD1589 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 5FAAFB7774A9CF9C75C3B930C5538F56 /* NSEnumerator+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AFA8912D8C5109C85FDC65E360B238B /* NSEnumerator+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 612D7698019865805EFC789DCE5858AF /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 65BC33252FCA9058A7D3CFAA47C2E12F /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61C611ABFFC5FFF35ACE70883CB8F523 /* MASLayoutConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = EEA7BF8AD0BBE0F7C0E09936A24D445F /* MASLayoutConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6209E20926D79222E59F58B962BFAA1E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + 6249770A7D163B0F3001D5A76C5FA01C /* MASConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E67FF242F605D60BDD908B30A835E94 /* MASConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 629393440ABCD73AD3D16C75C633B585 /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = E289E6000C07977DD066205B22CF45BE /* IQNSArray+Sort.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 63299DE5DEA29075FADA35711169188E /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DE63024DF0B71846FBEEF4623BCA9019 /* AFNetworking-dummy.m */; }; + 63834DBC3194C7E71951973418FBB170 /* RACTupleSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = BAF38F3F3BCF4114F44F457B03803C13 /* RACTupleSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 65211C8401943694C84504AD2841AF41 /* RACKVOChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = D5526ED44F63AB6324BF008FFF234533 /* RACKVOChannel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 657B5E1587868A2227379DF94D13F237 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = AFFEA5AF3E485E420B844B47EF385544 /* YYDiskCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 658B85296E2EDA3455CD9FC6B3F4180F /* MyMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = C89091427D7AB1D7B78625766365009E /* MyMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 65FDE8FDBCF2F4CED252E7133D6B44DD /* SDWebImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C53401DF672DEFCFD1E60FCB433057B /* SDWebImageDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 661E3C9B494ED5C317CE616690A1A632 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 66635EAAE52FF5571DBCDC626FB8CA86 /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 980BE16B12FCFA38A053DA9760F6E773 /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6821259F4B0EA9B89D5D09E98B1D1AA1 /* UIControl+RACSignalSupportPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA9442E6A4034841DD6CB3FDFA0C73C /* UIControl+RACSignalSupportPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 682B0E603612B6ADBCCF30580F9A4B09 /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9729CD39D764C290A8EFFAFC0616B9F1 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6837AD005926AB2974513453DB787C5A /* MBProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D098EF662A91968498A77E124302EB90 /* MBProgressHUD-dummy.m */; }; + 684FBDB6507EDA2227AB548F3E7A0777 /* UISegmentedControl+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = B24586F6863B5A5EF2DB2F80B165EDAA /* UISegmentedControl+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 686A4FD038133513879F2F52D8A7A7A7 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF92D32A6D64DC676363705855F4C32C /* CoreFoundation.framework */; }; + 688B82109A6B9EBFA545C40F9981230D /* RACIndexSetSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = E6E759698AEEACB0D25C59A6E2293428 /* RACIndexSetSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 68AE61CFF3786AA315960308C04C5CB8 /* RACScheduler+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A3EC90B72CC7FF026EB36BCE1E111EA /* RACScheduler+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 698931FC082239ACB64F331F831B076D /* NSDate+BAKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3667FF770F6A8140D57DF53BDA62005F /* NSDate+BAKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6A7AEB37893207A008195A51B9E94772 /* RACSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B2FD174879A4D1EDC30B115E5E67D7E /* RACSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6ABDBB0428E5672AEA19FCFBBFFD2F12 /* RACUnarySequence.m in Sources */ = {isa = PBXBuildFile; fileRef = D751E5324CC91F43E41E599645283EB1 /* RACUnarySequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6B1B0B7AA37EE1D9E4DF6480BFBEF3B3 /* RACSignalSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = D87BF6AA9F0E669F88F010CACE9BB211 /* RACSignalSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6B71CE5BA32574F407349C1DA20605B4 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = CBC8BFF0774593786090569F092D9445 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6B99D2D80C641E0F351CBDEAAB0FF929 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 110FB15DF49DAD2BC44FD43CE0FCA9FA /* SDWebImageDownloaderOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6C0C802617374C786CC7139203D20801 /* FBBlockStrongLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = ABEAB6702D091BD0AF5DA298F3A106A0 /* FBBlockStrongLayout.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 6C7A3365D10F96F281FB0181BFEAC7AB /* RACErrorSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F0908CC444FE177FC1ED9F121BAB57B /* RACErrorSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6CA5641617C855A7102C7787BB154D89 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EE494C85C760F5DE095C549F1D7EBE4 /* MJRefreshAutoStateFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6D04EB73FAB920BB1E208A7D7B94644B /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 96A44317869D4232F074010DF2DB49BB /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6DD8A0E2B36DDF8E41ECB8C44EEE3832 /* UITextView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = B02BAA61E5DAB045E5E85B38DE6BF7E4 /* UITextView+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6EA4EFB7F28637623953B1832EB6D55D /* UIViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 63C82D656CCB8D762D41764A67CCB10A /* UIViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 6F939D57C2FA1C35A059F9090913B8EE /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 546019111ACE8E76036065AFB3F53AA2 /* SDAutoLayout-dummy.m */; }; + 70466468CE4673A8FA094386A43F7C43 /* RACScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 1ED768A051D4B277045DBB0036E3C5C3 /* RACScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 707E818332E5033501DF2D7826C639DF /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 950937E9BA2BCBC2C1BD03E39A9D5A6E /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 711267B481D8B91410F4D9E7A631EEEC /* NSObject+RACPropertySubscribing.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E4C2BD0006A845C1A9BF9A16EFFFC87 /* NSObject+RACPropertySubscribing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 713927C8C7FA28F971FD5292555D3EC9 /* UITabBarController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = BD23AE31E8BE741709F9E156462BBB9E /* UITabBarController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 717931389BD269B98A41E303FFB044D4 /* UIControl+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = CF00B06C975E6813C428E385C676BD56 /* UIControl+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 71DFF4FCF490E7C2983380C32C3E05A6 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 296A677D2DE30C7190B4240C2DFCCC02 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7285BC629A75B39B9DB7061D285C79E1 /* RACEagerSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D7746A3F6DD0E4D29A82F430AA7032B /* RACEagerSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7291E906AE8A3C1F92183154FE65DCDD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C261D5021438CCB1D68559713BAB392C /* QuartzCore.framework */; }; + 729B628E992E517000943F0B724DEDCB /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = E7F5B97BDC24E97AE6E21DC0221419B4 /* UIView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 72D7D35B9C7D780503A1E69B61342386 /* MyDimeScale.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C878A78D0FD9A773A3E231BBC089A2C /* MyDimeScale.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7335EB55170E40E3F900C0A4021B9F13 /* MyLayoutSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 35BDA86AE11F460A2DF00BC4EB769654 /* MyLayoutSize.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 738F08A49CF038BC0A9BD49BA174373A /* MyLayoutSizeClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 327F60EA44DE902FE3C475B66026065A /* MyLayoutSizeClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 73AECD256E14E9CB1BEE2910F414A576 /* RACArraySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 85DBC14E01134FDC92D40BCBB179E981 /* RACArraySequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75410390D1EEB08A839FA543A08DE221 /* RACTupleSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 631634FC273C56086EE2BDF5C3031136 /* RACTupleSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75439029BC47FE84FF09B314AC948570 /* UIStepper+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 98BB369EF7D39809E76DF0221E906D4A /* UIStepper+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 75E8694E6675A18460CC5FF0DA15C4AC /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = F88D8E256D8AC4AF923227D7EAC1C76C /* NSData+ImageContentType.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 76216E6D51359619A86400BCFDB05A52 /* RACValueTransformer.h in Headers */ = {isa = PBXBuildFile; fileRef = 099AE2A650497D8662F9346B62DC0ADB /* RACValueTransformer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 762CE7EC21F162AF572CA8AD2DE8CE89 /* UINavigationController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = C52DAC06DE562DF53E1DD173C42E2BE8 /* UINavigationController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 768CD4934A23B51DA213BF82E6B6D449 /* NSArray+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 501F7246348435E06E306B3F2556F176 /* NSArray+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 774165C3EC91357AC0FF2BBF49DE931F /* MyFlowLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E25E8A0AAAAC111A684D76A7732C6BB /* MyFlowLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 77445AEAFE4727C5DEB71186D278B71F /* MyFrameLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = EB1C8D0E3F3A6763EBACDEA6AF77B9D1 /* MyFrameLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 791CD6031B6267F1C4035A0FDE50753E /* RACStringSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = A06BCDF5740D5CB805B09E24ECCCE37A /* RACStringSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7A9A1597781BC33CE61C149A11A8670A /* FBObjectGraphConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F3703EC741A1CBA8FD2B6A90EA808B3E /* FBObjectGraphConfiguration.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7B00546EE080C2038F79D70C01900062 /* FBStructEncodingParser.mm in Sources */ = {isa = PBXBuildFile; fileRef = 78AA4C06C28E1562EA304CCC6FD497EB /* FBStructEncodingParser.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7B03977453EC7062E7485C8711A5B67E /* UIImage+RoundedCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C9A4D99DF92CB8A163E0DE19AB5A9B8 /* UIImage+RoundedCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7B12269BEFA5305C78EC3D22AB2B1CEC /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = C6B4C5C280265CD3729319E0A4BA07DF /* UIActivityIndicatorView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7B2ED9E571E4E51168F7157F2EAE6199 /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E71F9D7C259E084C1EB5A9B55F4155 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7BBAE335CA7667E51CFA81BF17DD861C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */; }; + 7CDBF7EA5C30D66F866F8E3BA32F1712 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 57788604735687969ACC0021E00446E2 /* FMDatabaseAdditions.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7D110B14A1C00B852FFBD4102B6E66A1 /* RACSignal+Operations.h in Headers */ = {isa = PBXBuildFile; fileRef = 1DCA24FCEAB2C370E0DFE8F12D8A9F90 /* RACSignal+Operations.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7DE5229A02A082342649D63AE3D9BDB7 /* RACBehaviorSubject.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E9B39AE6A97DC7F9350E4CCF94DC025 /* RACBehaviorSubject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7EC91A130840ED564223B9D074144840 /* FBAssociationManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = E263CDE84DF182C2232CD2991EFFFA0C /* FBAssociationManager.mm */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7ED7150308ABEE5094716C24B19321A3 /* NSObject+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E34670B295AA51BA862050258AA92BD /* NSObject+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 7F744D9E26348306653D7579B1AFDC1E /* MyLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 268320F0FA40E517AA8F5D3575247D49 /* MyLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8130F6C217CEC1E91603C9659C8B5C24 /* BAButton-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 24CDB901D3BF0DF41F65D51C3D4044F5 /* BAButton-dummy.m */; }; + 820459CD178B77B552D286F094DE0B43 /* RACGroupedSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = D6EAFF8D5BA13E11EEA9AFA58781F851 /* RACGroupedSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825E5E32DB00F5D7D22818224E22B8C0 /* UIButton+BAState.h in Headers */ = {isa = PBXBuildFile; fileRef = 11F59FF048F0B1369B44D5B6C92A7493 /* UIButton+BAState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 82BA014C81EE79BD7F043D96AB562DB6 /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = F2D5CCC769B68FD5CA071CE470976902 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8442562E89006042C5F1AEC0E7597322 /* RACTargetQueueScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 21E8A91D2FFDF02FC12EC1249BA136BA /* RACTargetQueueScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 85363CAA183427442D879B35DDDB0CE3 /* FBClassStrongLayoutHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 12F4CC0D9A789BA0EF4C5ABEA99F8D83 /* FBClassStrongLayoutHelpers.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 853A9C3D08C8663BC7CD6B9F3B2CDF82 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2863BAA55E29DA6ABAE6B5B3D15A2C68 /* DZNEmptyDataSet-dummy.m */; }; + 85A735234E32D220ACFA55DAF5F60250 /* RACChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = F6884FF058D9159A41EDF771E4955B37 /* RACChannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85BBFB5F0008B8304BF840AA6449C61F /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = D2FE91EA1F722AA810863F6BE215C71C /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85CC88BF2A94A02880B862A6501B2C1D /* RACReturnSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 73B4622AF4FB0A31A4AA502DAC17EFFF /* RACReturnSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 864C519065467C5CF9340F9E40F5C19C /* UIView+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 04793345358B92FB44E056157C1970B7 /* UIView+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 86EE1CB5473A4A07081D8DE3A2C45924 /* View+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = E8FCEFDAFDF12FCFC776957239B52E91 /* View+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 87B3E5EC8059E756A29E20FC7A052D1A /* UIButton+BACountDown.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C16930F8B76EE6F0FD5EEB16B3556A9 /* UIButton+BACountDown.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88290D5C90C12F48F09E6AC463737F1F /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E3A29C80DB503CCE251A466BCC44B08 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 888C19B07487841701EE49C8B95F30BF /* RACIndexSetSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CECD2D7749000CD5709068588846623 /* RACIndexSetSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 889D48A9B81ADF617C1D4E4E9473E3A9 /* FMDB.h in Headers */ = {isa = PBXBuildFile; fileRef = 001D6A764F83ECFE13AF65407D2CF8E6 /* FMDB.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 88C41ADC22C465D75518EA69F57496F8 /* RACAnnotations.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B99DD703945C83B4601D36B45FEBE2 /* RACAnnotations.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8958F2453EEBAF71BFEBD78FB48986EC /* UIWebView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = ADA404D82C8CD1AFEA1294AE6183FEE7 /* UIWebView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 89BB399DD4ECCB1A6DB93384DE41B8C0 /* RACEXTRuntimeExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3111E22E4AD00750A1DC1A82C14A1F6D /* RACEXTRuntimeExtensions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 89D0A398F988B9F3423C7E134CF36B9F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 8AEF0AA29FB2BC2B6E9CF59F1CAEB323 /* MyLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC6FC10C68A48A66F831E1EBE43EAC49 /* MyLayout-dummy.m */; }; + 8B9A16752EC196AE20C518DEAD49AEDB /* MKAnnotationView+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7EF70F5DB7EA91726A7AC19A9C10AE /* MKAnnotationView+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BDF1F8DA30C465DB6FF17EA58D0721E /* FBBlockStrongRelationDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = 2FAEB1F6ACFBD9ACCDC835645763CA8A /* FBBlockStrongRelationDetector.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8BE30B72D3E9BFF954B9208B3F7D656F /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = CBD5AD45F98AC4CDCE624F473F6EDE6A /* UIScrollView+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8C25E0182BA34FA1B1AD59A0F851755B /* UITextView+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = D7542A991595F09E904571E427247496 /* UITextView+BAKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8C9CE91BC3C17B920AE1AF53660852DE /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = FD1B499B8DCCD01E993CD5C9B009C237 /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8D96DA6EBC17B5E077606546B89A1948 /* UICollectionReusableView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 57A035F0B63D38312FB44AEF072DA5B6 /* UICollectionReusableView+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8DA09345A151E6C8FF767D4457442349 /* NSString+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = CBDF01225E66C23D8036BF216E62BBC3 /* NSString+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8E3DC47D9C8F8C484B8B535FB46BF78A /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 83FA8D8C61EFB1CB2D49B34CB9628D50 /* IQBarButtonItem.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8E7BC04EF0E086E356FF20FB72CFCF02 /* MJProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 051B27C920CBC8EEF5484B7AAD7468FC /* MJProperty.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8EDB9F8D78E3B9E94363E4A0FFDA532C /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = DBCFE478A76EF2089C162BBADCD26CF7 /* UIView+WebCacheOperation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8F6647F255ECD395D38B819217A508E4 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B5B1B4631239031AD33CFE487E2F9C0E /* UIImageView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 8FFB4BCE843B1F261E996B0091E27606 /* NSSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = DD0AEFE68EC51F3983E1C9EBC7D198B1 /* NSSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 903158692A045396106CA22C0DD13BA6 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE6EB8B81ABA49102E7DD26271570B4F /* SystemConfiguration.framework */; }; + 903D16EEE10FFB91B8B4742586EDC09F /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = E867981DA05B944DC6F56866658B220E /* FMDatabaseQueue.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 907178269A8169EB6FE7C9F082BADEF7 /* RACScheduler+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = 33636993BC8A1BADE06BA3819AC69F9F /* RACScheduler+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 90C8D76B0E95CE0FA5E809D88852EA33 /* NSDateFormatter+BAKit.h in Headers */ = {isa = PBXBuildFile; fileRef = D25479F0E7B16C558BF66D03CC55D9FE /* NSDateFormatter+BAKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 90D6D6EC05ACD0CFCDA05FBFFF888B75 /* UITableViewCell+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = AD4784BBC5F9BA4E607295008B249FE8 /* UITableViewCell+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 910388D9B7DB12B52E86A0D49AE2C786 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FAD3EAA8397C4E7B02110BABD7E001E /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 910B24376E3E5B6B788069D1C3FC6F14 /* MyLinearLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 153251EBA7639679E85F3313F0F094C3 /* MyLinearLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 91AEF94DFC71F2AA66CB0310A9280B24 /* Type.h in Headers */ = {isa = PBXBuildFile; fileRef = EE6B82B7B241315F082442745525D3B1 /* Type.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 925EBB6CDAA2E17791E1DDCDA62A3375 /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 3862B80244844091269D5E663405D818 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92937DC066543122186195A2941D3C60 /* MJFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 878A0CC02C1009C8B07BB6C0F2F4B102 /* MJFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92CB97FFD0D038C5BABE4DB06CA7BCB0 /* NSEnumerator+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 40087F240505956876B1EE3C618953BC /* NSEnumerator+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 937E5142168172919C2324C670510223 /* UITouch+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = AF62EA21CC88D14DD0F555F35FC03C75 /* UITouch+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 939C3DA8E67BAB44457845D82C3B8D6D /* UIButton+BAState.m in Sources */ = {isa = PBXBuildFile; fileRef = ABDA2A0C416650E9A3218E82CDB26E1A /* UIButton+BAState.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 93F12B05D8333C37D9CBEA3D1782CC04 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + 94D6FC9E345F03396C02EEF2AD6A25B7 /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 1815DD33D4791214C169D35AB767C541 /* IQKeyboardReturnKeyHandler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 95665C9CCFD65CA886F92B7E1CB780C4 /* UIButton+BACountDown.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E56F2D1869810C7515227FB09A525D2 /* UIButton+BACountDown.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9583FD3FEB50DF2110A43EB6DD7765BE /* RACDynamicSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = C886872885D5259609AD09034FCE7F42 /* RACDynamicSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 95CB5A60FC847EE6652F07A2D5026926 /* RACStream.m in Sources */ = {isa = PBXBuildFile; fileRef = C1133B6CB319536971880F776861A938 /* RACStream.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 95D9BE365F88F3E6647892440A46B77E /* NSInvocation+RACTypeParsing.h in Headers */ = {isa = PBXBuildFile; fileRef = B221B4504CE1DF7A85DD313BD25E3745 /* NSInvocation+RACTypeParsing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 95F90F972DFDFBC3E012F069A6E24C33 /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = B7F3B31C23026CD61CE7E0CCAC6692EA /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97CA04C5B77CB7773C7F0871D0E1C581 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 40C6B6E777043A326F2E22C407EBDE8C /* MJRefreshAutoFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 97ECECDB9891F0320F610EBFFDDD42BD /* fishhook.h in Headers */ = {isa = PBXBuildFile; fileRef = F42FD717A852C0FE7FAA541B808B047A /* fishhook.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 983CB852CBBFBC04C2A6BA407E34F59B /* View+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F8BED4FCA81E6191645978BFB0DE7A6 /* View+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98B3FA74D7C3085E2AE3A956E39D9FD8 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D833929A098FC5A369CD580C0C5ADDB /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98C97192F61D773184E25D2998F220DB /* FBClassStrongLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1DDA574E254C090B33EB9AAB23570D11 /* FBClassStrongLayout.mm */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9934AEA2C891C201D8ED5746FF42FE1B /* NSLayoutConstraint+MASDebugAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 6144199C55F769BCA18BC97E102C9CA8 /* NSLayoutConstraint+MASDebugAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 99364D96200D03FC3229E6A956E10ADB /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = A2A9ED566256428A8EE6CAB22BAC8A28 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9951C5DCBF0A1ACF8C3434402FC487DD /* BANetManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B5A9A3555B80689119B5C2DE16E6626B /* BANetManager-dummy.m */; }; + 99714143FA44A34F87D1F2AA6D254177 /* FMDatabaseQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = E94641D09D42A41BACD43E868A83A186 /* FMDatabaseQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 99B6512419FFD9949F6510C02A15A973 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C022E794B2CEBE1756E4A06291C3E5C3 /* SDWebImage-dummy.m */; }; + 99E00D593F76D7E6C96300345E211282 /* MASConstraintMaker.m in Sources */ = {isa = PBXBuildFile; fileRef = 211662498AC88AD17BDE0A4817A3C1CB /* MASConstraintMaker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9B5FC4788D032DAC752CC0766A747AEE /* Pods-BABaseProject-BABaseProjectTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B782D01E9282AFC5EE6AA265E4A67B3 /* Pods-BABaseProject-BABaseProjectTests-dummy.m */; }; + 9C0079311546383FCE4158E2D938FBB8 /* FBClassStrongLayoutHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = FDE0D1F515C62158394BF3A8CEAB6436 /* FBClassStrongLayoutHelpers.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9C01AC7CFD24447140FD72D700ED66C1 /* MyLayoutInner.h in Headers */ = {isa = PBXBuildFile; fileRef = 9839DE7AC89339C7F31DE30EF7BE525D /* MyLayoutInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9C0908154FC1320D13F5FA40C47E47D7 /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = E67C8590AB01E04303A4CB757B9EF9C8 /* FMDatabasePool.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + 9DDC888AA9FE29CD96DCB574AF125142 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8494FA7602B009EC978E97801C051491 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E598F4B8C367DF0061C6F22761D534D /* FBStructEncodingParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 9448E64F97FD9307451B66E172594356 /* FBStructEncodingParser.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9E8A25E2EB31D3751C563994A7DC71A5 /* BAAlert-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 833A2F19E32FDAF1C33E1CF49FA8FD5A /* BAAlert-dummy.m */; }; + 9EA434971062D302D44C154CAC9A8D68 /* NSString+RACKeyPathUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = D32E6325008AAAE78A388EA99F2A6E78 /* NSString+RACKeyPathUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9F39FCC5EFE5F66AFA01AB0F2E9065FA /* MJPropertyKey.m in Sources */ = {isa = PBXBuildFile; fileRef = BD992D834E45180885BDDC8DADADD153 /* MJPropertyKey.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A00760B0ADDC18EE7A9059D5D06DEC8D /* RACDynamicSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 0123EF31071CBCBB396BB4E5FF2AC962 /* RACDynamicSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1B868F66E6E2705FD6B4F4200FC5476 /* FBObjectReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C40F9C9B3CA2A6856FE4AB75711F9EF /* FBObjectReference.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A1EAE5E58D9F2040BACBB482211EA611 /* UIPageViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = A66B25BC253C896F3701A033C5533BDF /* UIPageViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + A288D6376DF56482903F0C7080C78E44 /* UIButton+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = EE03606EBDEE9CF546D23CE0585CAB15 /* UIButton+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A297DD2E044F47D05E740BFF48CDEC71 /* UIButton+BAKit.h in Headers */ = {isa = PBXBuildFile; fileRef = A3A101DD4AEF30ADDC844AAA3846DD39 /* UIButton+BAKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A2BB3206E41D307B932B2B9E9DB93D29 /* MKAnnotationView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 16773082991510BF8EBD7D23221AECDB /* MKAnnotationView+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A2E9E9D97C3F9E421371240AB925AAF1 /* RACValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62EA6A12CF12D7B25B4CF5288BC3A451 /* RACValueTransformer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A30B72113FFCBF49735A9CECC944D95D /* UIImage+CompressImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 607A7C66490292A0ACAF9ECAED2F9E84 /* UIImage+CompressImage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A34B005B792D9949D839B2DF0808B765 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F7719B2B06543C66BFA4D11CB660CC0 /* SDWebImagePrefetcher.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A36D266A14F17B087426D90762D61716 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = D4E29B4AA52D095FFB047449C90C7A5D /* UIButton+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A4223E648086FEF52D8BEF6BC331EDC9 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = E331D4315A214B57E7B39B57D7235F53 /* IQUIViewController+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A4673AAFCC562A2429C9CCEBAD970582 /* NSObject+RACSelectorSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 4627D7C077EF4154EE76CB73F193AA33 /* NSObject+RACSelectorSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A563471FD2DC868AD5CD6550E48EAC6E /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DC6BD0551CDD697D319D154721BD26F /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5C29FCEFB79434D96EB5F4DCC7CB883 /* RACmetamacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 903FAE1A6ADAC6BC1744F51EBC11DD78 /* RACmetamacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A5CC736BE68ABCDF971C27B076E538AB /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7599DE7539EB395DB0996D54DFA9FB50 /* MJRefreshAutoGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A6436E3CFFCBFE591E2D2A68ED90CAC6 /* MASLayoutConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A076E905BE295CE093C9085B1D7F7CB /* MASLayoutConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A67059B6451EE4D4C8827F52621E54A3 /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 208FDB098265597D2DCA112B563FB9DF /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A6C0859344AF583A7E835D1EB2A61CF1 /* NSObject+RACSelectorSignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BBFAB4B70EF0531E057F24FDAA67B7A /* NSObject+RACSelectorSignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A741D5D80E92F85E00CCB8B65D6B1A6C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C261D5021438CCB1D68559713BAB392C /* QuartzCore.framework */; }; + A7BE167232C57C8CF5BDE3CA6A1EB77D /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = ADECB2D80F39BF9689953920952743D9 /* UIView+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A83991D7C1373DF66020C2FDFC5D7564 /* MASViewConstraint.h in Headers */ = {isa = PBXBuildFile; fileRef = 2ACFCC94452F527AE31DDF08B14330AB /* MASViewConstraint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8511C86C70830EA57DFD7A1D83B4668 /* RACSubscriber+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 36691016BB84FA5EC047579622539A5C /* RACSubscriber+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + A881DE880F47B67A1FB7743A84C4E675 /* RACKVOTrampoline.h in Headers */ = {isa = PBXBuildFile; fileRef = 61116BBC93B6B5972BD166F712C0D7CC /* RACKVOTrampoline.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8CCBA3F1F4DB835E51AED0B6E185B5E /* MyFloatLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = A4AF5A9FF67E6F3B7410BBF68C430434 /* MyFloatLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A8D8C81D5D7B58215ED5DC8EAEB20424 /* BAAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C218F0977854B5EDF55A1F6B6982FC8 /* BAAlert.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A906A376A93C1C83BB89E8F63A663F43 /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 732854E296B1E6905139F93DCE039E40 /* AFAutoPurgingImageCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + A906E9E7472BA4B9EB9C72F6F317EE7D /* NSObject+RACLifting.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B880DE953842FCF8F2FB239EDEBAE11 /* NSObject+RACLifting.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A974DE47B402E6956FB9B85EAEBE8426 /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D4AE42961F126BDC472E18A1F0E50C /* MJRefreshGifHeader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AA6B5B9FA2B8FE2455163E0FB2249906 /* NSSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = F18B63F5AB0904D247F9A1DD347C1131 /* NSSet+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AB43F097B242078CC539D21528AEF1D4 /* FBObjectiveCGraphElement+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = D1CC9C76C884F56DA3F1402A420CBB6F /* FBObjectiveCGraphElement+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + AB67E47EF7869038D5E0A57EA08CB693 /* MyPathLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 7821C3C11EE680BDBCDA4B31D647A7BD /* MyPathLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AC2EDF67D16BDE8184310AC75138FDF3 /* RACUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = D8A14CE787496A01B9AEBA346AC0794A /* RACUnit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD8B5C73E4469C0C98A263777F305710 /* NSFileHandle+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1702A2065D3C3D9EE8FE7982D31343C6 /* NSFileHandle+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + AD9F2B872334F242E611A5C9CCF86018 /* MyBaseLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = FA56DFEFAB27D79DC417226CA8059178 /* MyBaseLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + ADD69BFB0A0F3F7B7E162E410A67CF05 /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8587B77D25616B82EE6965223D5C7596 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AEA8EC22BC3946FBA4AF9FA4FCDEDE69 /* RACSubscriber.h in Headers */ = {isa = PBXBuildFile; fileRef = CDACE2021E194A0AE2834AEBFE532D53 /* RACSubscriber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AF8BDC3F660E285057AA1EC6D0D87612 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E7BA51C89206DA133993E548DF4A3301 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AFEC22C633375B36456C7848FDB4A94D /* NSURLConnection+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 050C9BF9E331CB49B507B2A4617C2FA3 /* NSURLConnection+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B068500226B60EC7436ABD5E0F2FE33E /* BAPickView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BCDD642BC626E7A6D32B29C8B851B877 /* BAPickView-dummy.m */; }; + B09ACCABBCE259273E3C3D08E277D8D0 /* UIControl+RACSignalSupportPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = EC0BE1AE163D88FAC4BC0AF824659DF2 /* UIControl+RACSignalSupportPrivate.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B0C13321D8E8246F0213C8EF755503E3 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = FDF3D63313115407B68DEBB369937128 /* MJRefreshComponent.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B0C95A64C2DF64B2CE8F10BB44E44F37 /* NullSafe-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C70FE6E6862B92B401F41A93D102FBED /* NullSafe-dummy.m */; }; + B119DF750B6A6AF6352B3A416E9833AF /* RACCompoundDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = FFDFC4FE5AF8F486D6C2866AB749C8B1 /* RACCompoundDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B21F04A0C203727DAA5D19FEC6606B94 /* BAKit_DeviceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = FA0CD9E0881B11302F7A36689C66A353 /* BAKit_DeviceModel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B24AEB4999F36F67F80710C3A8B38198 /* FBStandardGraphEdgeFilters.h in Headers */ = {isa = PBXBuildFile; fileRef = 02173D79633FD20DB16941D0EE34DE04 /* FBStandardGraphEdgeFilters.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B3A6235D661F70BB8D33265485FD1EA9 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C261D5021438CCB1D68559713BAB392C /* QuartzCore.framework */; }; + B40756412613B53C80EE77C4C223990F /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = ACF9FE0FEAB65AF880BEDF1731B98544 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B57DA2EF743D46651B10283F2F8C79CF /* RACSignal+Operations.m in Sources */ = {isa = PBXBuildFile; fileRef = CF3E2739C3A89F92FA9F0BF32A29D00C /* RACSignal+Operations.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B5D5CEBD7958C2B6F44BEB0365F84878 /* RACDisposable.h in Headers */ = {isa = PBXBuildFile; fileRef = F9A3C01C496820F5455AC933C98AF703 /* RACDisposable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B69F47477A7A892F0185011363F212EA /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = CE4E9B76191389562F0DDD143BC73213 /* IQUIScrollView+Additions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B745A8E8B2AE642E5EF29A477F7D3428 /* NSString+RACSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = AE640802970D3E32CC94306E6E234532 /* NSString+RACSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B7F9309770F7330BD4693E264C395B93 /* RACStream+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = EF7CC2A346C1AA725029F1299F22DEBC /* RACStream+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + B8B3AD7B87C38807CFC02F6A9D5C755D /* UISegmentedControl+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F53F171070C0DCF1269F332348E6A4D6 /* UISegmentedControl+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B8C9C795F8301C2B982A50134284A219 /* MLeaksFinder-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DDA30BD88664E66A24DB93EF4024E0 /* MLeaksFinder-dummy.m */; }; + B915E3CFDFBA7B99411BC5430162868F /* NSObject+MJClass.h in Headers */ = {isa = PBXBuildFile; fileRef = 9731009AFEAF56AACDFB8E681EF551A8 /* NSObject+MJClass.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B953667D411D1DCD919CBD314F568A92 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 55C7EA2D39D172B466546AA4FAE87851 /* NSLayoutConstraint+MASDebugAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + B9CB658A8343D27A77CC0F24C34D43EF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + BA0EF227E29990276A608FCC60FB5AF0 /* MyLayoutDef.h in Headers */ = {isa = PBXBuildFile; fileRef = F10F1F4BADC29D2C7A221C2C968B1FC3 /* MyLayoutDef.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BABB8E8AE74B58D9DC37F30962D684BB /* UIAlertView+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = DE7D2E3A124FAB095EE7CB6E4AEA9236 /* UIAlertView+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BAC5042E83AE7F65D4341B9CB941F341 /* RACDynamicSequence.m in Sources */ = {isa = PBXBuildFile; fileRef = 06E59E23F5C3C8428AD24FEAA5876419 /* RACDynamicSequence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BAEE4B12537A4CA864CA8B6EF93F7D4A /* FBObjectInStructReference.m in Sources */ = {isa = PBXBuildFile; fileRef = A0D90254371991424FF2AC105609FDA3 /* FBObjectInStructReference.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BB6727D28D7F8DE18E35DA7984DA8364 /* UIView+BAAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C22E55019961FFAFAEDF8E9F5D33484 /* UIView+BAAnimation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BB6E2FBF8C448CB0D1B8B9C8CC0B426A /* RACBehaviorSubject.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C5BF5C462014C7C318D4835F4077875 /* RACBehaviorSubject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BBE4F5204B74712CAC86088D18B3E910 /* FBIvarReference.m in Sources */ = {isa = PBXBuildFile; fileRef = A1D5EEE93A96612FD5CF2FF2CD1D3DD5 /* FBIvarReference.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BC04BC7CCC9DE1E6F262CCDEB98A3588 /* IQPreviousNextView.m in Sources */ = {isa = PBXBuildFile; fileRef = E91A174996D1BC996779C6506C28A744 /* IQPreviousNextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BC21D943A752BDA01E4D04CF9808D6AB /* BANetManagerCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 04F2D33D010870B7E9EE7E3AFCC85099 /* BANetManagerCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BCB77E95D1D2C7739AAC8284A057F871 /* FBAssociationManager+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 730864ECFC785CF72C5D632B85F70C23 /* FBAssociationManager+Internal.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BCBB7013F639112A6CE80E0F0F992102 /* UIButton+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = E4A205075DBA8F207C0ACC94D0CB22F5 /* UIButton+RACCommandSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BCF3B04D2D97433F32BFBC9DE9D97CBE /* NSString+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F8D3232335498A45A07CE7F0E26FB102 /* NSString+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD271081D9C75795FB497E6FD6E96FBA /* UITabBarController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 897593CBCD4B76599686072FC18497B9 /* UITabBarController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BD35014C5CE824D791E2FAC4B29AA90C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + BD35528AF6A5D15D4BAE46A5D414177F /* NSString+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D8358950E72253455562539CC2FAA66 /* NSString+MJExtension.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BD9F745169ADBBD029EE0C69E68E60D4 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DC0E904CAB22E6848C0F34024379088 /* NSBundle+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BDE55DB986952CED890714089FF520DA /* FBObjectiveCObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B76D18B532E5127E5658D8CAE0FB6CC /* FBObjectiveCObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE55E6CA41B94B735275119D91CC67C3 /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E30AFC92FD0E60DBDBCC7A94871F41 /* IQKeyboardManager-dummy.m */; }; + BF279CD1A148F5DCCDC2B6CDC4406682 /* RACDynamicSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = D959636B8252E5AA339ADFD5924D847F /* RACDynamicSignal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF57D0D3C431D5624A5524D5FEFFF552 /* MyLayoutPos.m in Sources */ = {isa = PBXBuildFile; fileRef = DCF1281E65E2614206531CCAC9EF8BE4 /* MyLayoutPos.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BF744BA669C583B52C7E29309759186A /* BAKit_TouchID.h in Headers */ = {isa = PBXBuildFile; fileRef = 446129556223C2E74A8A7C30F8767C38 /* BAKit_TouchID.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF74696EF094DB98236F1466B59649C1 /* UIRefreshControl+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = DE2C979AC4E4695037FE10A14C2D6804 /* UIRefreshControl+RACCommandSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BF8165F578E449953F94600BE6AA9114 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5222E50B77065D4839E4C83532E2D5CA /* IQKeyboardManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + BFD31B865BBF73BF07FFC196768E6267 /* BAButton.h in Headers */ = {isa = PBXBuildFile; fileRef = B497BB618F3B51903EAE4EED74A3E099 /* BAButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BFF2AC41197FF448F673DC4553D5C19E /* BATextView.h in Headers */ = {isa = PBXBuildFile; fileRef = DF95114B2DC23082C9E4025F811DDC6F /* BATextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C16FDBA2BC10E28B8D59DE5CCF4758EC /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = CA38384949F3798DAC4DF09171283418 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1B31690BC5CAE796DEB99FC35F5B70F /* NSIndexSet+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 221F3D0762DC4E834B21AE69B07584EF /* NSIndexSet+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1C0D7C93BF3DE14A26757273598D0FA /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 68660D5FE61037C194223DBF5FFC497C /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C214E3582DE2BE5E85F81912A8D66702 /* NSObject+MJClass.m in Sources */ = {isa = PBXBuildFile; fileRef = FE881CF5DC6C0D3BF1424678EB76968F /* NSObject+MJClass.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C2BB4AD69433B10C2D930E85DB32F7DC /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 6894BFF390848EB3D17A76D80EECF687 /* IQToolbar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C35D13E483AC7E6AAF30EDA13DD2F840 /* RACMulticastConnection+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DFB5DC253A0AE52D64C85AE05761D94 /* RACMulticastConnection+Private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + C40CFE1274D588CA1A9DF9394BF76EAE /* FMDB-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A0F3A0AA32EA21154905701BE733FF2F /* FMDB-dummy.m */; }; + C41C8DD9B5EFB8867DC2C7293D6CCC10 /* RACStringSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 5945F84A6D24CE448DE7D3F7B5ABADD0 /* RACStringSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C440CA5708F04DC122548142E76A0A8B /* MLeakedObjectProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DC6768DB3E2C29BEDF0934C051A9C93 /* MLeakedObjectProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C4D12D56B5E4323CDE6A77AEF30D4D9F /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 892E35422B2B31502870054B9D4FAF4F /* AFURLResponseSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C6DADCD0353AEE5BAAAA1D7FC324CC45 /* UIDatePicker+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1579DB4F931010CCE34F3884CBB80197 /* UIDatePicker+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C8884A693922DDC345E3FDAFCBEEEBAC /* RACKVOTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = 23849DBA6F5CF90243CEA3152D613E52 /* RACKVOTrampoline.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C88F85D3200060BD98FC13EA58121706 /* ViewController+MASAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E856330B4B3D8B9348F393D3A51DB82 /* ViewController+MASAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C8B5C706FEB92B68B931A6FFA85E8DE9 /* UIPageViewController+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9F5AF730E591D3AE4EAA7A33F3AF6F /* UIPageViewController+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C8C314277319859A56ACC3981AE1B73F /* UIStepper+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 01C3BD591308422732B95A5DA0302F53 /* UIStepper+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C99EE99A2BD1F31240E2BC87EF556D47 /* UIButton+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 95E1DFAE51D038FC0CAE0D81305B130C /* UIButton+BAKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + C9AEEC8697B6EF9C01522F75C8323DF0 /* UIView+RoundedCorner.h in Headers */ = {isa = PBXBuildFile; fileRef = 582AA5CEDA0AAB03312DB0D55EFB9143 /* UIView+RoundedCorner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9AF959052F52EE5872D84966C01C183 /* RACKVOProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 865D673BCE6FB3E9605BCD7388A34C25 /* RACKVOProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9F6937BC265DA8CDB70746F57C570AE /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F3396B1101111F2E3244D6E74F99676 /* UIScrollView+MJRefresh.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CA2565BAA19A87BE87C96E472A87906C /* FBObjectiveCObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 089DFDA2E91232FE841E02962273C34B /* FBObjectiveCObject.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CA3019565485463D53694B16F8F34811 /* UIApplication+MemoryLeak.m in Sources */ = {isa = PBXBuildFile; fileRef = 746473F717DB171103D115422967E42C /* UIApplication+MemoryLeak.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CBA073485222F5F656AAF745EB499742 /* NSObject+MJCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 2EBCD81DCACFCB19676491212DDAD136 /* NSObject+MJCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CBCCEAD402645565401CA93924736979 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */; }; + CC222B9474D9C43EAFE8D7205B452B6F /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = D15D4B4697C831661E28AF4B426694E9 /* YYKVStorage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CDC456529F00D8491AC8A8616FC2BC65 /* FBAssociationManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 64DBE5F8BBD92A71E95B851C2CEDCD4C /* FBAssociationManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CDE542FD1A5A11E7D0376375D561E9B5 /* NSObject+RACPropertySubscribing.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A9E18A61560925625AC94CAEF61B367 /* NSObject+RACPropertySubscribing.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CDF1320392E5C8072B165CA0C372DC2A /* BATouchID.h in Headers */ = {isa = PBXBuildFile; fileRef = D1DD67320E69D9D20A89276F401C56E4 /* BATouchID.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CEF7E139022FFA4F5C99D4DC5DE67990 /* MASViewAttribute.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D8003D5754AC4C5B8FCF890B9BF84A /* MASViewAttribute.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CF60CDD7FC54D81361766A68E9BB70C8 /* BAActionSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 8211444BEDDE5D0F1A36B11E6A9E7F46 /* BAActionSheet.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + CF7AFBD61708A69B9725AE2B6BB16423 /* FBObjectiveCNSCFTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 277DBB41112C0CCFDFE1E1341BA3F6D2 /* FBObjectiveCNSCFTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D05C186B37384E7A65270AA3BB88E0B3 /* BAKit_DeviceModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 3936179AB8A2713262AFCC205E90BEFB /* BAKit_DeviceModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0E8F48B7A113F82C5409DC0E6CFDDB5 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E228B8F4E47E733FC8629782BCAB3542 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0ECB12BC4FAC9C9DEA13E51DCD42E6E /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 106876CF473CEB04DACD72F9BD78B10A /* NSImage+WebCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D145F5C81176E920E1CE462D4B50D88D /* UIViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = CE0941E28ED4E88FB4BA97BC1DEAF98E /* UIViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D20BD033BA609D6252AF9901CFE66F9D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + D216590437651582CA9B654DC07F0738 /* NSString+RACSequenceAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D7B07227B08E988A109D3E720F61437 /* NSString+RACSequenceAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2260EF6B75C467EA376C70986B33602 /* RACQueueScheduler+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = 806C000E5B0069D4772442AD7EAC9F16 /* RACQueueScheduler+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2F0ABE0012F68B8CBDC895CE81F44CA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + D3515C73F9E2E4E52D329299760642A8 /* RACUnit.m in Sources */ = {isa = PBXBuildFile; fileRef = B2807A0E8FC5A483B0867902EF917059 /* RACUnit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D37406AAF0A1AA9AA7285E752A79372A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + D486C538AE3151018303619712539B4C /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6812CF2D70BAA638A95AE504ACEAEFE8 /* UIProgressView+AFNetworking.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D59FC98A74E440C4725B6FDC28F5951E /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C3C3742FB2223836D49DD1ED38C6FC /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5B7D8C76ECDAE3675FED3DDD52A1A1F /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F0DE6243A4F4E4CF6FD3AC7401DE61C /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D5CB999FB5FC80FC126A38AB4DF12227 /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = FE90086D59C6A47C5E35451A6C43626E /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D6BF473AFAA64B302157344251239F9B /* RACSignalProvider.d in Sources */ = {isa = PBXBuildFile; fileRef = 684A3FEB76F4E44438CFCAFC0B57BB43 /* RACSignalProvider.d */; }; + D7324A85467742EE0D02E130B33A814F /* UIView+BAAnimation.m in Sources */ = {isa = PBXBuildFile; fileRef = A19FE504E109866CF7EC09D4EFA05F0C /* UIView+BAAnimation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D73AB015637CF9C779610A91DAA0307C /* RACImmediateScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A0D6C50022CF14A826712F5FE73AAB0 /* RACImmediateScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D7BF4DBA76F12C797027E90648D9AEE0 /* MJExtensionConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 0759D3FA679FE64776D6B7C9D1FD9ECE /* MJExtensionConst.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8170774E48CAD1B76374729C521EC12 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A62036EF008984FBD2B85C2DC76D57C4 /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D852415DFD46E85C293E0DDE01868EA2 /* FMDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 11EC33FFB6BBCB6CBEF82174F7A45B74 /* FMDatabase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D8760B9674AEF13DDE8E9653EABA23C2 /* MLeakedObjectProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = AA21FBCD7DE6349E8574FD56322B008D /* MLeakedObjectProxy.h */; settings = {ATTRIBUTES = (Project, ); }; }; + D8D72BEC4364E9F77BCC6B8AB4E30DF3 /* MASViewConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A920D2F9BDEEDAEFCB1E58B82982BCD /* MASViewConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + D91A44E187477241B893D258E3F67A58 /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = 1190208B0B32FAAB0849AE6CE64A14F2 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA1C76394F3B8B3EDCBEEDEF36F458F8 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CB0D7512A834348177D062F006911E3 /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA31E6B835805273D8285C2FC8118DF4 /* NSDateFormatter+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = DB3CD6E69E7748B39B733D1CCA14FD93 /* NSDateFormatter+BAKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DA961F4D6F59851734A0DCEBE0C14762 /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C166D53BEBDEF9C2D8E186212A3195C /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAD0FAE59A407688AF3D1AC65B3BC400 /* UIBarButtonItem+RACCommandSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A94EF503CBD63A6DF9D584FB70F0D8E /* UIBarButtonItem+RACCommandSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DAE39F8E699DCC6049163E7293494401 /* NSObject+RACDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = FE7A720065ADD4DFB14F38D3A80EC296 /* NSObject+RACDescription.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DAEDD041193BF71C3FA970DEB859EB33 /* RACEmptySignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D57D3DAE6529FFC47500FA3EDB66F03 /* RACEmptySignal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + DBDCE948DF1D74806D9D319F636A0E8B /* NSString+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 082182A0A5CB339A92B820E15098390D /* NSString+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DC3F788B3CCFAAEC642ACC6AE1A236E5 /* IQUIWindow+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 17D64FBB4A2519B2CA50A02FA7A3817B /* IQUIWindow+Hierarchy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DCDE75E49B50C393C41A66D3927B06AC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */; }; + DD0AA9E8B308E45F90AD7A01F8BBC4DC /* NSObject+MJProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = E776533117D9BAF8AF776D255087524C /* NSObject+MJProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DD9FFEF9FC2BE383CD0EBECFAF3A1C29 /* RACMulticastConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = A62150A856854F44C62AA221D727DEC5 /* RACMulticastConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE05DC4A672845CAF53EF550D7B3E27D /* FBObjectiveCBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A820BC42588ED20A7DA9742723911D5 /* FBObjectiveCBlock.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DE130FE41810425BC7D6AE496D9F217A /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = E74C48E55C9840886DA46DE722D075EE /* MJRefreshBackGifFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DE31BBF6A7963C5871A19655EF5532BE /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 08ED25551853722CCFBFEE3A01914FE8 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE4F35E25C347D342D1EAA3739ADED2B /* RACEXTKeyPathCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D8C5BEDC14D5495A86C545D449488CD /* RACEXTKeyPathCoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DE755C1C9EEE8E6E49D88DD041D49AA4 /* UIView+BARectCorner.m in Sources */ = {isa = PBXBuildFile; fileRef = 2299D7AFEC8BF49333908E31B028ACA9 /* UIView+BARectCorner.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + DE825B8F32AB823F4BE5492CAC6FCB4B /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F7CE4774B273BDA375ADF1CBAC2D592 /* Security.framework */; }; + E072DA57403C4BFF9B10467BE05604C5 /* NSArray+MASShorthandAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 717EF9B6502DAAF2737CE842DFA5B309 /* NSArray+MASShorthandAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E12695AC9D3F7A09372C6DD20CFBEAD7 /* NSArray+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 281158B539A4F14DB261C2E7607CBB6B /* NSArray+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E178C757CEB7B7D459841D30EE75D227 /* RACStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E097E0A2D6A8DADAAC68701D768C179 /* RACStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E1E771349813022263F549BDF33CB4BB /* MASViewAttribute.h in Headers */ = {isa = PBXBuildFile; fileRef = 765E7F28BA6619A94CF2C0F1D1EE621F /* MASViewAttribute.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E244613E222DCB5A2406C048A1F7986F /* SDWebImageDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C9F144C211A4FE3634CAD7610176D38 /* SDWebImageDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E26BCF3A5AA583809A600E4DCA6EA85E /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6298AC3563BA3FCEB026D19A33B46F0A /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2C4D5A6AC8758AE155AE8282CAA85A6 /* NSObject+RACKVOWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = A2B53FE407BA6D1052FD2E69CB119934 /* NSObject+RACKVOWrapper.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E2E27D0D8EFC3DBFB31EB805A9F40F46 /* UISplitViewController+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = A5207C15A79E3C066E8F20D61B1F5F25 /* UISplitViewController+MemoryLeak.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E2F414ED0D18F10AB46E2A73D961696B /* RACEmptySignal.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE371ED4D9DC628EAA0CF770DEE4957 /* RACEmptySignal.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E381BACE805B2AD472E03A1156D9054C /* RACChannel.m in Sources */ = {isa = PBXBuildFile; fileRef = CD386AAF63FC4BFFECF7EDAFD0F7926D /* RACChannel.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E3D78C20D648BB0234F93D8C9E69ED4D /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E1D79763F0BFC7180FCE2A379B50BD6 /* IQUIView+IQKeyboardToolbar.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E3EA008B59CE78D5B393437366769BC0 /* BaseType.h in Headers */ = {isa = PBXBuildFile; fileRef = C6DBCD28FCD626B506271488F6313370 /* BaseType.h */; settings = {ATTRIBUTES = (Project, ); }; }; + E444D099624D1BE7F72FDD51FD211B92 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */; }; + E4AD1B2492FF31B1B8D9C7448F01B933 /* MyLayoutSizeInner.h in Headers */ = {isa = PBXBuildFile; fileRef = 50AE63C2A06A3695F2DECA8AC0174F4A /* MyLayoutSizeInner.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4CC118CECD9FA374CCA32C3D3B01B7E /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 66A541E696EFAA079F2073208EEC2ECB /* UIImage+GIF.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E4FFC42D0FCC4DD4E79B931206552F1E /* UIActionSheet+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 046753C33076BDD2B01511972EE3BC5F /* UIActionSheet+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E6C19504109FFF1EF6FF66919E731574 /* BAAlert.h in Headers */ = {isa = PBXBuildFile; fileRef = 47266E4296E25F40182E8AD7DF4522AE /* BAAlert.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E6D8B8B5C270268865260902A54F6E21 /* RACScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 95D186B0F2495965B4BFD9829ED50B0C /* RACScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E6EB93F9F0E4C5727BFC3147BA91C599 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BFDD8D36E4CDD28A46A32266461ABE1 /* MBProgressHUD.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E72B4CFB4C7690B821BA27013BE26017 /* BAAlert_Config.h in Headers */ = {isa = PBXBuildFile; fileRef = 74DEE764CFD162737CE8F57799646803 /* BAAlert_Config.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7B0270BEDCBE116DDD853F76E27B0BA /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 7362865ECCE7D08788DE8194F276AC64 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7BAB4DFB5CFC24C291C46D44DF3DF52 /* NSDate+BAKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 9D41F7972543DEEDA61482AAF56BAD7D /* NSDate+BAKit.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E81A3DDBBA7965126D98EEA4C35E7363 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9EDC284BE3377646CD17FAE061ED3247 /* AFHTTPSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E8282933FB50EABD6C7ECE449B3A16FD /* ReactiveObjC-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BC46F9CF2F9DD86B27771B482AA01E4 /* ReactiveObjC-dummy.m */; }; + E862E5CD709BA7304F5E80F1C409FF0D /* RACSubscriptingAssignmentTrampoline.m in Sources */ = {isa = PBXBuildFile; fileRef = A4E8ACDBE016B429BA59DC2AA4044D5E /* RACSubscriptingAssignmentTrampoline.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E904764D8FB281B24C4D5A729A9610C5 /* MyFrameLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 80AB726B9C6929C89B92052F1FC43942 /* MyFrameLayout.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + E92DD35C8BD30188DD5D34B36AF83CC8 /* RACImmediateScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = FFE381120EB63D29C6F0E2A028E2597A /* RACImmediateScheduler.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9ADC2F08FD25B7881FDECC7EA78A70B /* RACEmptySequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 01AEB5ACDCF93694992BF8B7BC52E040 /* RACEmptySequence.h */; settings = {ATTRIBUTES = (Private, ); }; }; + E9CF168BFBD6CF942B0B78C3931AA8F6 /* RACQueueScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = 75E79D98DE90159CB40167CCF0D3C206 /* RACQueueScheduler.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EA03C058ABBF9DE06CC094EA630A6588 /* UIBarButtonItem+RACCommandSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 891159984927FE3C67C5053C5D7D3417 /* UIBarButtonItem+RACCommandSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EA321C98029015AA4895C0B26891D8F8 /* MBProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = E65C0D8FDC6F71353B02F309F7BE46B1 /* MBProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EACEC6F4009C4374A9041907300AD7D6 /* MLeaksFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1492A3B27727F16D62B40E22156D5C32 /* MLeaksFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EAEEC5EDA062152C206B868F228B2D08 /* NSObject+MJCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E048C60C68E30FA69980B9B03FAC8C1 /* NSObject+MJCoding.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EBA632EA41470F059E86A82C018FCC6E /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 60EFCFF863A885BD3632C8E8830B78D1 /* MJRefreshAutoNormalFooter.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + EBF571C96020B3840B90A9D80A511F5F /* BATextView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F6C6D89C07CEA51DF629F9A3BBB7151 /* BATextView-dummy.m */; }; + EBF77604EBDDA71E2C50ABE736B6A995 /* BATouchID-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FAB0BB99535D38F65234DE1225639F4 /* BATouchID-dummy.m */; }; + EC48DE078CA5E55922CCE02354D475CD /* MASConstraintMaker.h in Headers */ = {isa = PBXBuildFile; fileRef = AFAC06ECACA6EE974CE680A7AF8AC065 /* MASConstraintMaker.h */; settings = {ATTRIBUTES = (Public, ); }; }; + ED89F1A48BA44D203A2C4B9C6F53AC0B /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 6545DEC6111D42FBAEFB0AA974324C56 /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDDE7064989C1242DF4A6EC18A95F347 /* FBRetainCycleDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 435CF4706573795628005AF2384CD26C /* FBRetainCycleDetector.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE0863A6578DD6F1C0AC7EA92D37A41E /* RACEXTRuntimeExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ABBA38B18A6F0FE7EAA982E3281C6F4 /* RACEXTRuntimeExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; }; + EE5E7E22AB24130DA900363225BF4091 /* RACKVOChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = CDFE4F3A1FED05F13047CE223843F1CF /* RACKVOChannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF5F809703CEB27AC35E3379601E6954 /* MyLayoutPos.h in Headers */ = {isa = PBXBuildFile; fileRef = D2F01DC15821781C72495F8E508A6311 /* MyLayoutPos.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F00CCFAB93A4F18419CD91217B1D5F66 /* FMDatabaseAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B452FB9D2A3C5B83B7DD31AC83FD01B9 /* FMDatabaseAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F02320ABC117E8ACC68CA867458B20F5 /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = C6638A012A7EA49021C2580330CA7D10 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F084040D7B1CB303848EE1785157198C /* RACSequence.h in Headers */ = {isa = PBXBuildFile; fileRef = 604DD91DD93479E515EC86F456239B04 /* RACSequence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F099E5987DD80E8D78E909AF81D3C587 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F261D7707DB64FD78317931AB4A9158 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F0A828EC72CD7FB7ABFDD5B5736EF7F8 /* MJFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = C2F4D933150DAB263D0F1ADFF6D5FF9E /* MJFoundation.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F0B56A7D38A399A2F67F9920C9526A66 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + F0D3B46458CCF360ABD737BE7179D4D0 /* MyLayoutSizeClass.m in Sources */ = {isa = PBXBuildFile; fileRef = FB5C6D33A11AD5B35A44A3BCDB3956A9 /* MyLayoutSizeClass.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F1F93EE1AA5E870F2CE81325CE9EB643 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = CC9BC32E321B69F4BA4FC25FE7439A35 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F20082A4085F5E3007801440DBBE995C /* FBBlockStrongRelationDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = C607A6B1B7A3551AF885590E7B10D53D /* FBBlockStrongRelationDetector.h */; settings = {ATTRIBUTES = (Project, ); }; }; + F2B1873F3C7CFD66578CF42B6C51BF04 /* NSObject+MemoryLeak.h in Headers */ = {isa = PBXBuildFile; fileRef = B582A9AECE43FE5C81EFFD82CA7A616A /* NSObject+MemoryLeak.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2CB6CD10C6CFEE79A97469FD90E2439 /* NSData+RACSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = C330ACCC3FFEF14A1148DC10375C00F8 /* NSData+RACSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F2D2E00D6D56AFDDCD5E4C870E5C23BC /* NSDictionary+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DD19D489968E7AF69DB54F0337C36A8 /* NSDictionary+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F390892683F928EB38E95D670531D2E9 /* CALayer+Animation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2083825C6B8994832ABD9EFAB9FCC63A /* CALayer+Animation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F390D582745DF3516ADD4D910A2ACFFA /* MASCompositeConstraint.m in Sources */ = {isa = PBXBuildFile; fileRef = 444D4B257658723EBB2335B6280A8866 /* MASCompositeConstraint.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F39CF586C2E0EDCD5CF400148361F91F /* MyRelativeLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 601D1FC77A743C7F9FA9AF2A224BCBE5 /* MyRelativeLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3D9846F6653C84EC501DC04AFD47804 /* UIControl+RACSignalSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 74BB721EB50B1A295844955B664314D1 /* UIControl+RACSignalSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3F1360A716B0907F986122F0B0A5F20 /* RACTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CBEAC3E59C031CD31D439847153524D /* RACTuple.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F42D3D33B0FD8814A3C33FC46FE1690A /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = E8509EAC97FC971E791A2A5C248EC9D7 /* FMResultSet.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F519D1ACAC1396A2C05C5272F88FD526 /* RACCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0B7E72C34C019DB4CFDD3D78EECBBB /* RACCommand.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F56F1AD0D978F250A30E1980549A7EB6 /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6902DCE08C05000C58385292DC7EFAE /* MJRefresh-dummy.m */; }; + F5CC06F3E0C232483A72DCCFAF393BE0 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 63877C0FACAA04F453ABCFA0FA312457 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F65005F3BA971FE1877ADDE49A494052 /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = F3ECD567247047A054B2A13BEB2DB7E9 /* IQTitleBarButtonItem.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F673BF559B086F2E1E7A4F089F6EA0CD /* BAActionSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = EF0AAF659293E8380276C4C74A26693F /* BAActionSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F6C16D658A9ECD1466CF6DACB61557CB /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = BDC0F938A736A44ADE99A6AAC93809CC /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F71530448B7A282746853F4718DCA267 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + F88580E07538A44A13193CA98E37ADCA /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 9073C5E0EBACF5E0496567B2612BD7CD /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F88EBCF213D5CDC9DD9761F38AC8851A /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 389DC02195D2060AE766053F5810F53A /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F8B71BB9667E21385D7AAEFEC796BAE4 /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 47C1E96893C46BAD1077EA8460A077B2 /* AFNetworkActivityIndicatorManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F8DCA6C3C05A59B2C95A1B5F1CBD8C99 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2248D3C37B4C26439603E26212E027AC /* MobileCoreServices.framework */; }; + F90C80BC5933114AD0B3E3AC614525B1 /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = 049E6E6A18DCD858AF95F4641D01F9A7 /* UITableView+SDAutoTableViewCellHeight.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + F9928811ED6D5CF357E847654C1BAA1C /* RACKVOProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 539271E13991BDD44759115BC547CF20 /* RACKVOProxy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FA768A4F72E8CD1F358A566049F6F78D /* NSIndexSet+RACSequenceAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = A1B4929D1AE922EE2479CC853E30ED47 /* NSIndexSet+RACSequenceAdditions.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FB6B82B23C0980BA952729E43124A788 /* UISwitch+RACSignalSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = BD958B9C9A5105BE54D777A889DAA617 /* UISwitch+RACSignalSupport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FB9AA5207284E33FFC55FEB308BFA71F /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AD4CC755E906600F2BEAA5B269919A9 /* AFURLRequestSerialization.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FBFE53983A247600ECF47853C2F01D4D /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 9863F1A5D31166CD96E194C4E439888B /* MJRefreshConst.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FCA3C88FA81BF77A2075054DC301E215 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */; }; + FD6FD2A233EAD00D04FA88DD394857C7 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B11DF881084E9F909CF568AA69D08A /* YYCache.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; + FD75BF9A064E7F30DEB21CA6B0C5F174 /* YYCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 75FBD28615A2702D829B9617A5C4279C /* YYCache-dummy.m */; }; + FF1B68BB2C26B49D0DB408D77BF73D8C /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0C171B8EBC4570F91A890502853AC324 /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 0016359E689D56206143840C165BF624 /* PBXContainerItemProxy */ = { + 00D30C29733C70CA478F538F7237DD60 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E3E12B8BB339234054946D8B39A93687; - remoteInfo = FBRetainCycleDetector; + remoteGlobalIDString = 7126A8FF47B4545643C04540D6F9CB0B; + remoteInfo = MyLayout; }; - 0227BD8ABDC3748CE8F9566966D0D908 /* PBXContainerItemProxy */ = { + 030BCC40A429EA604CBBE459D722A72F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = DA1A7295DF2A99609DA0EEBF5E83233D; - remoteInfo = BlocksKit; + remoteGlobalIDString = C2A16C4461578CE67FD49F604F436B41; + remoteInfo = NullSafe; }; - 04D5996D41CBFD139614FBE57FDA1DEB /* PBXContainerItemProxy */ = { + 08EE0E840599CB144428D80DC4FC10B1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 9EAB3E42EF957541E6C3C76D35FD008E; - remoteInfo = MJExtension; + remoteGlobalIDString = D5A9684BC81FF3836EEDB27552011C18; + remoteInfo = BAButton; }; - 05AFEC554C233BDBB345720866B1A93D /* PBXContainerItemProxy */ = { + 0BDC3A76D1C16655A49C44CAA5D7AC30 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 24F2D2C1278EF320F595B3F56C58DA67; - remoteInfo = WebViewJavascriptBridge; + remoteGlobalIDString = 9DC8D9E02903E93BD0B2FEC9D846EA20; + remoteInfo = Masonry; }; - 06247CAECF6C94CA6D04D0AC532B177E /* PBXContainerItemProxy */ = { + 0D2CD62B6BF5D90FB99D41F04FD8485D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 985F42852C5AD70E725D4F06503F5C5A; - remoteInfo = BAButton; + remoteGlobalIDString = AF9D6EADD8E530631B349B6FDC56DA82; + remoteInfo = FBRetainCycleDetector; }; - 0B4FDDCD836D17771440EDFAA1B8BB98 /* PBXContainerItemProxy */ = { + 107421B0B3FDFAD887316C73472E7DE0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 24F2D2C1278EF320F595B3F56C58DA67; - remoteInfo = WebViewJavascriptBridge; + remoteGlobalIDString = A316B54C67E947D23CECD230FA5BFAEF; + remoteInfo = MJExtension; }; - 115A4A8E40B5F5F2D5FA00D78B7A0A6C /* PBXContainerItemProxy */ = { + 133A01B8B7CAB11B4ED1A3A4DD0D7CB3 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 37D7380A52EE2E9B49BECEE4DC247D19; - remoteInfo = YYKit; + remoteGlobalIDString = 92844E36EBBF88C45D432D8DBD41E81B; + remoteInfo = BAAlert; }; - 12EBCBEA5794BCEDFA0BF75D032DF156 /* PBXContainerItemProxy */ = { + 15564FFC1CE7EF8D30E599B3EA2BA1AF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 67C2E0E0C5FE7DE41F6A50F738BEFC7D; - remoteInfo = SDAutoLayout; + remoteGlobalIDString = 9E033EDB5EC0819481B0546434FA577B; + remoteInfo = AFNetworking; }; - 14AB2F8A2BFAD078FE5571FD144248D1 /* PBXContainerItemProxy */ = { + 16A32234F5E3DFC0934AB07F50A4A1C1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A0DF836BAB98D7819952604EA22C47E; - remoteInfo = FBAllocationTracker; + remoteGlobalIDString = 0C26DF3C4A7B81F517436CE80F07F368; + remoteInfo = BANetManager; }; - 1BC3C451DE8906FBB7A26A588A188F16 /* PBXContainerItemProxy */ = { + 16D43129D79FB377DFFF114C2E9E0776 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = A0D476EE36FD46C7A5020DBF09EBD0FA; - remoteInfo = SDWebImage; + remoteGlobalIDString = C2A16C4461578CE67FD49F604F436B41; + remoteInfo = NullSafe; }; - 1D50494C3615B659D1654D1EA70E0DCC /* PBXContainerItemProxy */ = { + 18D91D58B6BC8DD129D1F5E610C32633 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 07A1458F0ECFD7D943DC4EF15E916F34; - remoteInfo = MyLayout; + remoteGlobalIDString = C2A16C4461578CE67FD49F604F436B41; + remoteInfo = NullSafe; }; - 1FBC68C8F8C1AC781D24127E569B95EC /* PBXContainerItemProxy */ = { + 1B15B3D679F86388A02EEE21C9FDEC96 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = B58AE9150F017AC1E3E69371EC850776; - remoteInfo = JMRoundedCorner; + remoteGlobalIDString = B6F3D6D69304DDD34A584B5BE13EED49; + remoteInfo = BATouchID; }; - 2174BDB21B47A223011CBBDEE1E1104B /* PBXContainerItemProxy */ = { + 1E253136F1BA441D33A424866D915B67 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E3E12B8BB339234054946D8B39A93687; - remoteInfo = FBRetainCycleDetector; + remoteGlobalIDString = B6F3D6D69304DDD34A584B5BE13EED49; + remoteInfo = BATouchID; }; - 2304709AD76C08429E71020C2312240B /* PBXContainerItemProxy */ = { + 1F7355F2D81D4F9E0C250D1F79279DBD /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 9EAB3E42EF957541E6C3C76D35FD008E; - remoteInfo = MJExtension; + remoteGlobalIDString = 9E033EDB5EC0819481B0546434FA577B; + remoteInfo = AFNetworking; }; - 27D8C65026898D7EE8589D682804F959 /* PBXContainerItemProxy */ = { + 1FE82DB67E0C68E549C543463661A712 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 70BC44266C6FFE30D2C57129458E070B; + remoteGlobalIDString = 04CF549EBEEE7BC87AEAE35397184D94; remoteInfo = MJRefresh; }; - 297D668FA3F94CE351A136C8FA061AAE /* PBXContainerItemProxy */ = { + 2162BDA9C21C1582A7398BB76C9CACE7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = EBE33197DFF5736FB990D1E852CCCDEE; - remoteInfo = MLeaksFinder; + remoteGlobalIDString = 9DC8D9E02903E93BD0B2FEC9D846EA20; + remoteInfo = Masonry; }; - 2DF1D82D2F5E35DE6F9A4955079E08B5 /* PBXContainerItemProxy */ = { + 22AB899D6F28621DA37280B79858BAD9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = A0D476EE36FD46C7A5020DBF09EBD0FA; - remoteInfo = SDWebImage; + remoteGlobalIDString = 5437890023F30CA85DFCA260CA914D48; + remoteInfo = DZNEmptyDataSet; }; - 331CF2990AB76637E223B2D5631074D5 /* PBXContainerItemProxy */ = { + 2AA33B57220A590C2939BF4326FC0F3F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 985F42852C5AD70E725D4F06503F5C5A; - remoteInfo = BAButton; + remoteGlobalIDString = 586F2DFA9BDCC6675C2546793A69E5CC; + remoteInfo = MBProgressHUD; }; - 33B4F9C0A558A130F3218EC8513FDC9A /* PBXContainerItemProxy */ = { + 2EA207C279828E1FDAB7777DDBB2B790 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 07A1458F0ECFD7D943DC4EF15E916F34; - remoteInfo = MyLayout; + remoteGlobalIDString = 9DC8D9E02903E93BD0B2FEC9D846EA20; + remoteInfo = Masonry; }; - 34F4AA7FAFCDFD925774D521A0C86B73 /* PBXContainerItemProxy */ = { + 2FA5B815424135D7EA95D85E8C50E86B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E3E12B8BB339234054946D8B39A93687; - remoteInfo = FBRetainCycleDetector; + remoteGlobalIDString = DBD02925B68D475A927D89F1925CBD89; + remoteInfo = BAPickView; }; - 401F4F8197F6B0BD6A5409D19A5B1621 /* PBXContainerItemProxy */ = { + 32FC691E010CCD70F16BC38B98E93001 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 70BC44266C6FFE30D2C57129458E070B; - remoteInfo = MJRefresh; + remoteGlobalIDString = DBD02925B68D475A927D89F1925CBD89; + remoteInfo = BAPickView; }; - 4374486EA19D970AAD70DB08DB629B8A /* PBXContainerItemProxy */ = { + 37FF3D1517E687FD1CA8F9AAD9F7E5BC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 07A1458F0ECFD7D943DC4EF15E916F34; - remoteInfo = MyLayout; + remoteGlobalIDString = AC139CEF10BCCB200972B4617F3CA14E; + remoteInfo = MLeaksFinder; }; - 460A76C7A01BC1E018AB1F659CE2F6EF /* PBXContainerItemProxy */ = { + 3D329C51A0C1C9505D2220FE5129F3A9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D058B89EB3B3DF45457A2DCD3971AFFE; - remoteInfo = MBProgressHUD; + remoteGlobalIDString = 5EAA6D463A9A35AD53DFDE7BD90DB91D; + remoteInfo = JMRoundedCorner; }; - 47BA41182245B64AE306E925F9C6310B /* PBXContainerItemProxy */ = { + 42AD9A5DFC81D83AFBE920DB70F02FFC /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D0D0C9D20C43FA94D4C88FBFE2601B8E; + remoteGlobalIDString = 5437890023F30CA85DFCA260CA914D48; + remoteInfo = DZNEmptyDataSet; + }; + 47546FFDA067C17E98D54F9443BB344E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9E033EDB5EC0819481B0546434FA577B; + remoteInfo = AFNetworking; + }; + 4AF09F6F674AE5220208018E8289C18D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8642CC820CE8C5B88C113D7F47AF4BC3; + remoteInfo = FMDB; + }; + 4F0699D34D2F418D8AD373926B8C2DCF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 904F4F27FD314010A3812EB2A9306183; remoteInfo = IQKeyboardManager; }; - 4B119CF795F097AB76FCA0758E445F51 /* PBXContainerItemProxy */ = { + 5B709639F4BCAB70B4CA7FEB3CD584B5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 53480ED0BE09FF49E34B1702D485CAAB; - remoteInfo = Masonry; + remoteGlobalIDString = 904F4F27FD314010A3812EB2A9306183; + remoteInfo = IQKeyboardManager; + }; + 5D8E2662D7599400306837AD5F31904F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = A316B54C67E947D23CECD230FA5BFAEF; + remoteInfo = MJExtension; }; - 4D46B8EEA18711968208C448EEF3FAB1 /* PBXContainerItemProxy */ = { + 5E8BC6F209F2C3A86C2B01D6D850EE36 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A0DF836BAB98D7819952604EA22C47E; - remoteInfo = FBAllocationTracker; + remoteGlobalIDString = D5A9684BC81FF3836EEDB27552011C18; + remoteInfo = BAButton; }; - 51BEF212E228CF167500F0DEC9BA578E /* PBXContainerItemProxy */ = { + 718BB2EEEE0C684F6C23E59CA5338CE0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 53480ED0BE09FF49E34B1702D485CAAB; - remoteInfo = Masonry; + remoteGlobalIDString = AC139CEF10BCCB200972B4617F3CA14E; + remoteInfo = MLeaksFinder; + }; + 728DB2CD7A05722F864A5FCB1F3980D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8642CC820CE8C5B88C113D7F47AF4BC3; + remoteInfo = FMDB; + }; + 7589128AB3A15D869EEC07BA73AEC954 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 5EAA6D463A9A35AD53DFDE7BD90DB91D; + remoteInfo = JMRoundedCorner; }; - 51E42EA16726673C03A561D7BFBD923B /* PBXContainerItemProxy */ = { + 7A108BA74BBD8013B7E682A5F0CDBF36 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D058B89EB3B3DF45457A2DCD3971AFFE; + remoteGlobalIDString = 586F2DFA9BDCC6675C2546793A69E5CC; remoteInfo = MBProgressHUD; }; - 534FFF47D668F103967E4772020EF06A /* PBXContainerItemProxy */ = { + 7B0FB4C6C0B3BB3067207623C9F0E458 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A0DF836BAB98D7819952604EA22C47E; - remoteInfo = FBAllocationTracker; + remoteGlobalIDString = AF9D6EADD8E530631B349B6FDC56DA82; + remoteInfo = FBRetainCycleDetector; }; - 590E930858C92176F2D966737FD12015 /* PBXContainerItemProxy */ = { + 7EB5CAFBE68F03E86DB587DB40BE7ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 928353533005A4198EBDA5B700D37B64; - remoteInfo = AFNetworking; + remoteGlobalIDString = BEBC67318C6C143D4D7E5C99A2B61B2A; + remoteInfo = SDAutoLayout; }; - 606C37F9AFD09B0D64702A39C087CD5C /* PBXContainerItemProxy */ = { + 870E373173CD997DF72214E719B8FFF0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 8C8C1779E3959B3BF107B00990F45010; - remoteInfo = FBMemoryProfiler; + remoteGlobalIDString = 720000A04716EA94A7F8EAE4F7FFE0A2; + remoteInfo = ReactiveObjC; }; - 60ACAA8BB2FF01C45B9EB27579D163D4 /* PBXContainerItemProxy */ = { + 882A7F3A48A52727637E9D7D6BE4EDC4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 24F2D2C1278EF320F595B3F56C58DA67; - remoteInfo = WebViewJavascriptBridge; + remoteGlobalIDString = BEBC67318C6C143D4D7E5C99A2B61B2A; + remoteInfo = SDAutoLayout; }; - 65A3D3E4B3F8F34B167BBBFCB8703383 /* PBXContainerItemProxy */ = { + 8899F3986499D89F048258BF94425BF1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 37D7380A52EE2E9B49BECEE4DC247D19; - remoteInfo = YYKit; + remoteGlobalIDString = 6B5503127B165F8F1EF1105805C54DD6; + remoteInfo = SDWebImage; }; - 66D3A62BA0DA7529EE36641CCB9DC37B /* PBXContainerItemProxy */ = { + 88E3AFC64C41EA3A5764DA03E2F2022F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 8C8C1779E3959B3BF107B00990F45010; - remoteInfo = FBMemoryProfiler; + remoteGlobalIDString = CEB869244C24B7157BF5DD56B91AD5DD; + remoteInfo = YYCache; }; - 6A0A0FE677977080090E3589148F31B3 /* PBXContainerItemProxy */ = { + 89C49D2FB913492633D0FCBCB6C02CBF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = EBE33197DFF5736FB990D1E852CCCDEE; - remoteInfo = MLeaksFinder; + remoteGlobalIDString = 6B5503127B165F8F1EF1105805C54DD6; + remoteInfo = SDWebImage; }; - 7D398D1EEEEFE309936F44E7A70F3A7A /* PBXContainerItemProxy */ = { + 8EDA3C4542EA7726BB29C1EC9CBCC59B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = DA1A7295DF2A99609DA0EEBF5E83233D; - remoteInfo = BlocksKit; + remoteGlobalIDString = CEB869244C24B7157BF5DD56B91AD5DD; + remoteInfo = YYCache; }; - 7DF55054DBE09CAE642AE97A2F8E4D71 /* PBXContainerItemProxy */ = { + 96946E1931594BE9D055BAC35749BF09 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E3E12B8BB339234054946D8B39A93687; - remoteInfo = FBRetainCycleDetector; + remoteGlobalIDString = 1D77298ECE42FEF88367950A2D83E5C1; + remoteInfo = BATextView; }; - 84C447EB9BEE790435C92A7673C04E13 /* PBXContainerItemProxy */ = { + 97379C2B6728AC3CFC623C4DF650CFD8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 37D7380A52EE2E9B49BECEE4DC247D19; - remoteInfo = YYKit; + remoteGlobalIDString = 7126A8FF47B4545643C04540D6F9CB0B; + remoteInfo = MyLayout; }; - 87150E209460FF2B4C13219C665A6479 /* PBXContainerItemProxy */ = { + 98AE78743B7477F24109295A0A01BEFA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 985F42852C5AD70E725D4F06503F5C5A; - remoteInfo = BAButton; + remoteGlobalIDString = 0C26DF3C4A7B81F517436CE80F07F368; + remoteInfo = BANetManager; + }; + 98B94FA25D5F43AE6DE67B6007F3703E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8642CC820CE8C5B88C113D7F47AF4BC3; + remoteInfo = FMDB; }; - 8C81CFF18971EEF318B6F202A8E569C2 /* PBXContainerItemProxy */ = { + 9F47A25A7223BB66F5DA9C114E94B525 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = E3E12B8BB339234054946D8B39A93687; + remoteGlobalIDString = AF9D6EADD8E530631B349B6FDC56DA82; remoteInfo = FBRetainCycleDetector; }; - 8DBED064513B4AF86D97B5960B3C6E98 /* PBXContainerItemProxy */ = { + A09BD46FCB625F2A0F25B7164F6480ED /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 70BC44266C6FFE30D2C57129458E070B; - remoteInfo = MJRefresh; + remoteGlobalIDString = A316B54C67E947D23CECD230FA5BFAEF; + remoteInfo = MJExtension; }; - 91B9B9DDD31187272D3644FFD07C8B47 /* PBXContainerItemProxy */ = { + A260BC5C95B11BA9D2101051335C6B19 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D0D0C9D20C43FA94D4C88FBFE2601B8E; - remoteInfo = IQKeyboardManager; + remoteGlobalIDString = 720000A04716EA94A7F8EAE4F7FFE0A2; + remoteInfo = ReactiveObjC; }; - 9217FA6B57A70EEECA6B4F96468B098A /* PBXContainerItemProxy */ = { + A6D2CE6E2F6B9EABAEDA1E590FAE9790 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D0D0C9D20C43FA94D4C88FBFE2601B8E; - remoteInfo = IQKeyboardManager; + remoteGlobalIDString = D5A9684BC81FF3836EEDB27552011C18; + remoteInfo = BAButton; }; - A034049FCCECB82AC243382A7550899D /* PBXContainerItemProxy */ = { + A8C58B61A02D9B98666C65144A501AF1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = DA1A7295DF2A99609DA0EEBF5E83233D; - remoteInfo = BlocksKit; + remoteGlobalIDString = 586F2DFA9BDCC6675C2546793A69E5CC; + remoteInfo = MBProgressHUD; }; - A0E8B4E1F8C638CF16E512E79E5250B9 /* PBXContainerItemProxy */ = { + A9CF6877635A023A214A8D28C8B131D1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 67C2E0E0C5FE7DE41F6A50F738BEFC7D; - remoteInfo = SDAutoLayout; + remoteGlobalIDString = 92844E36EBBF88C45D432D8DBD41E81B; + remoteInfo = BAAlert; }; - A1CE7EE360C46564A850510AFE5F0028 /* PBXContainerItemProxy */ = { + AC4ADD2A266DBEBBA8E402F9E86FE449 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = B58AE9150F017AC1E3E69371EC850776; - remoteInfo = JMRoundedCorner; + remoteGlobalIDString = 04CF549EBEEE7BC87AEAE35397184D94; + remoteInfo = MJRefresh; }; - B816890B3CBCE0F7BF0E2E0BA2E48106 /* PBXContainerItemProxy */ = { + B4A5C1EAD6DD1080ABA4B2F6A44650CB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 39818EAD9B4F5290D508A9F1E9C33CB6; - remoteInfo = NullSafe; + remoteGlobalIDString = 720000A04716EA94A7F8EAE4F7FFE0A2; + remoteInfo = ReactiveObjC; }; - C842508F17786AF0BBC9ED6486AC5E07 /* PBXContainerItemProxy */ = { + B97168ABDD04929D10A63DF955DF8621 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = B58AE9150F017AC1E3E69371EC850776; - remoteInfo = JMRoundedCorner; + remoteGlobalIDString = B6F3D6D69304DDD34A584B5BE13EED49; + remoteInfo = BATouchID; }; - D5166D53E6C8B2887340FABFAC9B6561 /* PBXContainerItemProxy */ = { + BB0D179F7EBA93F611E28F525681A003 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 928353533005A4198EBDA5B700D37B64; - remoteInfo = AFNetworking; + remoteGlobalIDString = DBD02925B68D475A927D89F1925CBD89; + remoteInfo = BAPickView; }; - D6536C86D8F75FC2F608FAD0BD6ED65A /* PBXContainerItemProxy */ = { + C291347E0FAAA95D4902B212BF8B7447 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 8C8C1779E3959B3BF107B00990F45010; - remoteInfo = FBMemoryProfiler; + remoteGlobalIDString = 5EAA6D463A9A35AD53DFDE7BD90DB91D; + remoteInfo = JMRoundedCorner; }; - D87E940E232B368613693DBBFB079754 /* PBXContainerItemProxy */ = { + C5B082A108AB9C18DE322810C99F8CE9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 39818EAD9B4F5290D508A9F1E9C33CB6; - remoteInfo = NullSafe; + remoteGlobalIDString = 04CF549EBEEE7BC87AEAE35397184D94; + remoteInfo = MJRefresh; }; - DF7F6C7604DF0B07418963313F301FDE /* PBXContainerItemProxy */ = { + CE48A2895A82FCE586ED2A5C033AAF46 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = EBE33197DFF5736FB990D1E852CCCDEE; - remoteInfo = MLeaksFinder; + remoteGlobalIDString = CEB869244C24B7157BF5DD56B91AD5DD; + remoteInfo = YYCache; }; - E3539B2455F142C6129F1BE3748887DC /* PBXContainerItemProxy */ = { + DD40FF5286831E588B25B4B2B1CCF514 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 5A0DF836BAB98D7819952604EA22C47E; - remoteInfo = FBAllocationTracker; + remoteGlobalIDString = AC139CEF10BCCB200972B4617F3CA14E; + remoteInfo = MLeaksFinder; }; - E7451B537E2D37B4B84D7E57DE6A082A /* PBXContainerItemProxy */ = { + DDBE573EFD39FA218B281015C60E10A0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = A0D476EE36FD46C7A5020DBF09EBD0FA; + remoteGlobalIDString = 6B5503127B165F8F1EF1105805C54DD6; remoteInfo = SDWebImage; }; - E976AE5BA4E92138E2EB6E2873C3B577 /* PBXContainerItemProxy */ = { + DF571C10C2396B57059330B44E0ECA90 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = D058B89EB3B3DF45457A2DCD3971AFFE; - remoteInfo = MBProgressHUD; + remoteGlobalIDString = 1D77298ECE42FEF88367950A2D83E5C1; + remoteInfo = BATextView; }; - E9D4CE8B9573BCA4DE0A827B97D35E36 /* PBXContainerItemProxy */ = { + E4392790DAF568A7A25B933ED0B0492B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 928353533005A4198EBDA5B700D37B64; + remoteGlobalIDString = 7126A8FF47B4545643C04540D6F9CB0B; + remoteInfo = MyLayout; + }; + E8050173A43BE11C8F24AE806272926C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1D77298ECE42FEF88367950A2D83E5C1; + remoteInfo = BATextView; + }; + EA7F42F6F6313E422F71304AD0D4E4AE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 9E033EDB5EC0819481B0546434FA577B; remoteInfo = AFNetworking; }; - EE24BFCE61832390A9C8FE7B33463E50 /* PBXContainerItemProxy */ = { + EABCD96654A253A5B1AF12D759ADA2B5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 39818EAD9B4F5290D508A9F1E9C33CB6; - remoteInfo = NullSafe; + remoteGlobalIDString = 92844E36EBBF88C45D432D8DBD41E81B; + remoteInfo = BAAlert; }; - EEE0CBB5BA8B3A8D57E3F8BB83BA8BDC /* PBXContainerItemProxy */ = { + ECFFB802D763E9D906B6950043D55B17 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 67C2E0E0C5FE7DE41F6A50F738BEFC7D; + remoteGlobalIDString = BEBC67318C6C143D4D7E5C99A2B61B2A; remoteInfo = SDAutoLayout; }; - F8640315975976DFA4749ED2C72FF532 /* PBXContainerItemProxy */ = { + F013F222D1229D6336090BA2277ED706 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 9EAB3E42EF957541E6C3C76D35FD008E; - remoteInfo = MJExtension; + remoteGlobalIDString = 5437890023F30CA85DFCA260CA914D48; + remoteInfo = DZNEmptyDataSet; }; - FEDD61BDB33FC3DD39015C16338D334A /* PBXContainerItemProxy */ = { + FA736B8CC593D6328470A759E9D251B5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 53480ED0BE09FF49E34B1702D485CAAB; - remoteInfo = Masonry; + remoteGlobalIDString = 0C26DF3C4A7B81F517436CE80F07F368; + remoteInfo = BANetManager; + }; + FCA8812C8EA50ED3C601C6198A4BE252 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF9D6EADD8E530631B349B6FDC56DA82; + remoteInfo = FBRetainCycleDetector; + }; + FD81F75C23145EB097D073524D3739F3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 904F4F27FD314010A3812EB2A9306183; + remoteInfo = IQKeyboardManager; + }; + FF99BE7E3DFB6D5902F98945F836E7BC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = CEB869244C24B7157BF5DD56B91AD5DD; + remoteInfo = YYCache; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 002DED8FD032353B0D7F5E1F3F688940 /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYKit/Image/YYWebImageManager.m; sourceTree = ""; }; - 0035845876E7EC58331336E8112E7986 /* libPods-BABaseProject-BABaseProjectUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 006412CEB3C110EF9AC81013C3D7ED1A /* UIAlertView+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+BlocksKit.m"; path = "BlocksKit/UIKit/UIAlertView+BlocksKit.m"; sourceTree = ""; }; - 0092D3D06AD87FDB0BEB6B9545A56593 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; - 021D7653569CC866FFB0466BCA813293 /* NSData+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+YYAdd.m"; path = "YYKit/Base/Foundation/NSData+YYAdd.m"; sourceTree = ""; }; - 02AEDD35E2700E165B5CB89AA20E1873 /* BlocksKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BlocksKit.xcconfig; sourceTree = ""; }; - 032C51895B4D6E237C6F4EDF7412B5DC /* UMSnsAccountViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSnsAccountViewController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib; sourceTree = ""; }; - 03C137D5082E643CFA81434C69F92836 /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYKit/Cache/YYKVStorage.h; sourceTree = ""; }; - 03D681BEA5F306A6CD1E1FAC1DA0E9D7 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = ""; }; - 045B1B3BFAD9FB6E53AB094CF7B96EB7 /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; - 045BD462AE8370C34E44BF30A02B2CAF /* NSObject+BKBlockExecution.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+BKBlockExecution.h"; path = "BlocksKit/Core/NSObject+BKBlockExecution.h"; sourceTree = ""; }; - 04EA5B17C9CF37400057DC8398F858C1 /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; - 0552B3FF01CC254341F9BDD57A1DA428 /* FBMemoryProfilerFloatingButtonController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerFloatingButtonController.m; path = FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.m; sourceTree = ""; }; - 05FA771F306FF9958CA14779311F5CA8 /* FBAssociationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAssociationManager.h; path = FBRetainCycleDetector/Associations/FBAssociationManager.h; sourceTree = ""; }; - 06923B986B9E3DF1096EE7B949FF5A89 /* MLeaksFinder-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MLeaksFinder-dummy.m"; sourceTree = ""; }; - 06B3B0EFF24A7FAE0352F8DAADF181C5 /* UIBarButtonItem+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBarButtonItem+YYAdd.m"; path = "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.m"; sourceTree = ""; }; - 06CB2811BB4F04F971944D0C865DFBBA /* NSIndexSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSIndexSet+BlocksKit.h"; path = "BlocksKit/Core/NSIndexSet+BlocksKit.h"; sourceTree = ""; }; - 06EFFBACB25D467EA1669A58905F61F7 /* NSMutableIndexSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableIndexSet+BlocksKit.h"; path = "BlocksKit/Core/NSMutableIndexSet+BlocksKit.h"; sourceTree = ""; }; - 073F5B5E980E9A9C18CFA123714CFE6A /* Masonry.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.xcconfig; sourceTree = ""; }; - 0779A06752EDCA53A44D9E5761F5CE33 /* UIColor+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIColor+YYAdd.h"; path = "YYKit/Base/UIKit/UIColor+YYAdd.h"; sourceTree = ""; }; - 08392E3D0EC410F614A0C233E220C60F /* MBProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-prefix.pch"; sourceTree = ""; }; - 08674FC285BAD9D66D91FFE1718AE27F /* MyLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MyLayout-prefix.pch"; sourceTree = ""; }; - 08A9C1B648C161EF0F37B35F4C78AAFD /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; - 08F2148EFBE4600C8932C38185B02BCD /* UIView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+YYAdd.m"; path = "YYKit/Base/UIKit/UIView+YYAdd.m"; sourceTree = ""; }; - 08F8DDEB1BCC514204993B8F2D17E2B6 /* WBHttpRequest+WeiboUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WBHttpRequest+WeiboUser.h"; path = "Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h"; sourceTree = ""; }; - 0ADCEF6352BC832F0E4F53F85511C0DB /* YYTextRubyAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextRubyAnnotation.h; path = YYKit/Text/String/YYTextRubyAnnotation.h; sourceTree = ""; }; - 0B3C96C11CED65BD329589B420D76977 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; - 0C2BD20D48F2D4BB15175F72F9E97CFB /* UIActionSheet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActionSheet+BlocksKit.h"; path = "BlocksKit/UIKit/UIActionSheet+BlocksKit.h"; sourceTree = ""; }; - 0C831BBE29D3D88E9374FF889283405A /* WeiboUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WeiboUser.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h; sourceTree = ""; }; - 0CD1EEEA0509DAE57E9C82934DD0CF41 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; - 0CDF2C8E6691C4AE61AB9A4B979AC5C1 /* FBObjectiveCBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCBlock.h; path = FBRetainCycleDetector/Graph/FBObjectiveCBlock.h; sourceTree = ""; }; - 0D1A145F7BF21BEEBDF4B14411B28DF9 /* NSDictionary+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+BlocksKit.h"; path = "BlocksKit/Core/NSDictionary+BlocksKit.h"; sourceTree = ""; }; - 0D8707A09C9830B7D11A15E765C803C0 /* FBStructEncodingParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBStructEncodingParser.h; path = FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h; sourceTree = ""; }; - 0D9871D9D77A455E39AE9B6497639C0A /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; - 0DBDB6CE6E9907AC6EB7BCB5D7235424 /* FBObjectiveCObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCObject.h; path = FBRetainCycleDetector/Graph/FBObjectiveCObject.h; sourceTree = ""; }; - 0E180D9F1A9A25F97404D8541CC6C050 /* NSNotificationCenter+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+YYAdd.h"; path = "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.h"; sourceTree = ""; }; - 0E72986232B31803321B32F5A0994B4D /* FBMemoryProfilerDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerDataSource.h; path = FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.h; sourceTree = ""; }; - 0E91F4A51FA8E49A4563BB19E2EB99E4 /* FBAllocationTrackerNSZombieSupport.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAllocationTrackerNSZombieSupport.mm; path = FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.mm; sourceTree = ""; }; - 0EE915E8457B56BB369F5AEBACFED157 /* FBMemoryProfilerDeviceUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerDeviceUtils.h; path = FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.h; sourceTree = ""; }; - 0F8B7117547F06F7DE8BE03B2E5F35DA /* MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJProperty.m; path = MJExtension/MJProperty.m; sourceTree = ""; }; - 0FB0D3E7F94C1857319AB7FD15EF5E96 /* MBProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; - 0FBBC51E0CED18446A85031065F30E45 /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYKit/Image/YYImageCoder.h; sourceTree = ""; }; - 0FC27882CB649FBB08F7A410B2466759 /* UIFont+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+YYAdd.m"; path = "YYKit/Base/UIKit/UIFont+YYAdd.m"; sourceTree = ""; }; - 10861837646B6165DBB45F669524E11E /* FBObjectReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectReference.h; sourceTree = ""; }; - 115B2A6E7D3261CB97A903E45849005A /* FBObjectiveCObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectiveCObject.m; path = FBRetainCycleDetector/Graph/FBObjectiveCObject.m; sourceTree = ""; }; - 1176C31408BDAAD65BF51F700EE3D887 /* MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJProperty.h; path = MJExtension/MJProperty.h; sourceTree = ""; }; - 118B6B045D782063BC5F00DEA30235A8 /* YYTextInput.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextInput.m; path = YYKit/Text/Component/YYTextInput.m; sourceTree = ""; }; - 11992BBAA6234C5C16A552FBB9F7F876 /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYKit/Image/YYImageCache.m; sourceTree = ""; }; - 11A16B98132C5D6DA4AA8582B1B02FC9 /* NSObject+BKAssociatedObjects.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+BKAssociatedObjects.m"; path = "BlocksKit/Core/NSObject+BKAssociatedObjects.m"; sourceTree = ""; }; - 11FC7125B107B56BF9F94DFEE0EF6245 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; - 123651602FAA4DA2081110D97FEEA79A /* UIDevice+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIDevice+YYAdd.h"; path = "YYKit/Base/UIKit/UIDevice+YYAdd.h"; sourceTree = ""; }; - 123A5E72353E47385BDE1F6714806946 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; - 12C6A852590F540BC62A8D4D29FE3E95 /* UISplitViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISplitViewController+MemoryLeak.m"; path = "MLeaksFinder/UISplitViewController+MemoryLeak.m"; sourceTree = ""; }; - 13875EC6C753C3AE6747B41E47EAC2B6 /* FBAllocationTrackerNSZombieSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerNSZombieSupport.h; path = FBAllocationTracker/Generations/FBAllocationTrackerNSZombieSupport.h; sourceTree = ""; }; - 13C44FE4476867326B1322C8801A34A2 /* WXApi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApi.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h; sourceTree = ""; }; - 14147080BB4335069C2725DCDEBF7353 /* NSObject+A2DynamicDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+A2DynamicDelegate.m"; path = "BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.m"; sourceTree = ""; }; - 144C440F0AFC5C445523C400AF409A6A /* libFBMemoryProfiler.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBMemoryProfiler.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 148701A1AC001223787225C8E94DADA2 /* NSObject+MJKeyValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJKeyValue.m"; path = "MJExtension/NSObject+MJKeyValue.m"; sourceTree = ""; }; - 14AAB5D81DDF9197E0128299DDB440A8 /* MLeaksFinder.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MLeaksFinder.xcconfig; sourceTree = ""; }; - 14BC1466655A68388C78CFDE48B538FA /* YYTextContainerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextContainerView.m; path = YYKit/Text/Component/YYTextContainerView.m; sourceTree = ""; }; - 1536D708BA62C4FBB75AE4559672F451 /* FBClassStrongLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBClassStrongLayout.m; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.m; sourceTree = ""; }; - 157FD8FC98DA7B0818E8A6324CFDEFA9 /* MyRelativeLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyRelativeLayout.h; path = MyLayout/Lib/MyRelativeLayout.h; sourceTree = ""; }; - 15E82000642A2D58AF6D39AE8E6BF2CE /* UIGestureRecognizer+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIGestureRecognizer+BlocksKit.h"; path = "BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.h"; sourceTree = ""; }; - 16BF0E56399719AA833B2783027E1F79 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; - 17588397F6D4A64CA58F2537E7ABAFD1 /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYKit/Cache/YYCache.m; sourceTree = ""; }; - 18566A1235AC54B710AF9172ABF3E47F /* WBSDKBasicButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WBSDKBasicButton.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h; sourceTree = ""; }; - 1905F135A73F32BC7B6C8573855235AA /* libWebViewJavascriptBridge.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libWebViewJavascriptBridge.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 190B701B64C86FB6E111E5F5FCE11DD6 /* FBObjectiveCGraphElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectiveCGraphElement.m; path = FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.m; sourceTree = ""; }; - 1A8280EAB1D3C821ADB1C5DDDB5C814B /* UMSocialSDKResourcesNew.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = UMSocialSDKResourcesNew.bundle; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle; sourceTree = ""; }; - 1A8AA9EC4B02527D28DCFEBB728167B0 /* NSMutableDictionary+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableDictionary+BlocksKit.h"; path = "BlocksKit/Core/NSMutableDictionary+BlocksKit.h"; sourceTree = ""; }; - 1A8DF7FF8EC5D172FF04CA442C9A51AA /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; - 1AD45B236E26EF32F8CC18E1A7CB4D6D /* YYKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYKit-prefix.pch"; sourceTree = ""; }; - 1BAC7C173C6267FA2878B5B7D39EA518 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; - 1BB1092AFA35D2C14D4174FC42FAA26F /* UIView+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MemoryLeak.h"; path = "MLeaksFinder/UIView+MemoryLeak.h"; sourceTree = ""; }; + 001D6A764F83ECFE13AF65407D2CF8E6 /* FMDB.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDB.h; path = src/fmdb/FMDB.h; sourceTree = ""; }; + 0021755692C766A4A27D754D62CDE475 /* BMKVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKVersion.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKVersion.h; sourceTree = ""; }; + 0123EF31071CBCBB396BB4E5FF2AC962 /* RACDynamicSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDynamicSequence.h; path = ReactiveObjC/RACDynamicSequence.h; sourceTree = ""; }; + 012617C3649DCA989C25D81F51BFCF1C /* MyBaseLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyBaseLayout.h; path = MyLayout/Lib/MyBaseLayout.h; sourceTree = ""; }; + 01AEB5ACDCF93694992BF8B7BC52E040 /* RACEmptySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEmptySequence.h; path = ReactiveObjC/RACEmptySequence.h; sourceTree = ""; }; + 01B4E936F6957AE85B5FB407B150EBC0 /* FBObjectGraphConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectGraphConfiguration.h; path = FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h; sourceTree = ""; }; + 01C3BD591308422732B95A5DA0302F53 /* UIStepper+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIStepper+RACSignalSupport.m"; path = "ReactiveObjC/UIStepper+RACSignalSupport.m"; sourceTree = ""; }; + 01ECCDDED3A1496AFCBB954F1BE228A5 /* FBStandardGraphEdgeFilters.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBStandardGraphEdgeFilters.mm; path = FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm; sourceTree = ""; }; + 02173D79633FD20DB16941D0EE34DE04 /* FBStandardGraphEdgeFilters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBStandardGraphEdgeFilters.h; path = FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.h; sourceTree = ""; }; + 03942C96840284EA7A4A42306EEA4657 /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = ""; }; + 03D11F623E5749F2B1F5E766B98A4674 /* RACDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDelegateProxy.h; path = ReactiveObjC/RACDelegateProxy.h; sourceTree = ""; }; + 046753C33076BDD2B01511972EE3BC5F /* UIActionSheet+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActionSheet+RACSignalSupport.m"; path = "ReactiveObjC/UIActionSheet+RACSignalSupport.m"; sourceTree = ""; }; + 04793345358B92FB44E056157C1970B7 /* UIView+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MemoryLeak.m"; path = "MLeaksFinder/UIView+MemoryLeak.m"; sourceTree = ""; }; + 049E6E6A18DCD858AF95F4641D01F9A7 /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = ""; }; + 04F2D33D010870B7E9EE7E3AFCC85099 /* BANetManagerCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BANetManagerCache.m; path = BANetManager/BANetManagerCache.m; sourceTree = ""; }; + 0501317D931CA14F1FC480A013F4364A /* BMKLocationViewDisplayParam.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKLocationViewDisplayParam.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKLocationViewDisplayParam.h; sourceTree = ""; }; + 050C9BF9E331CB49B507B2A4617C2FA3 /* NSURLConnection+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLConnection+RACSupport.m"; path = "ReactiveObjC/NSURLConnection+RACSupport.m"; sourceTree = ""; }; + 051B27C920CBC8EEF5484B7AAD7468FC /* MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJProperty.m; path = MJExtension/MJProperty.m; sourceTree = ""; }; + 05278141D1D36FB932B136CA7F3D7DAE /* NSData+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+RACSupport.m"; path = "ReactiveObjC/NSData+RACSupport.m"; sourceTree = ""; }; + 05EC1B6C2F312B2D2EB67385A82ADF09 /* UIView+BARectCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+BARectCorner.h"; path = "BAButton/BAButton/UIView+BARectCorner.h"; sourceTree = ""; }; + 06DA4C4975F8EA85B8A299B1AE23C457 /* UITextField+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+RACSignalSupport.h"; path = "ReactiveObjC/UITextField+RACSignalSupport.h"; sourceTree = ""; }; + 06E59E23F5C3C8428AD24FEAA5876419 /* RACDynamicSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDynamicSequence.m; path = ReactiveObjC/RACDynamicSequence.m; sourceTree = ""; }; + 0759D3FA679FE64776D6B7C9D1FD9ECE /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; }; + 076D040C504E8A4140502446CDC10DB9 /* UISplitViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISplitViewController+MemoryLeak.m"; path = "MLeaksFinder/UISplitViewController+MemoryLeak.m"; sourceTree = ""; }; + 07AC6A834CE3DB849BEC77BDBFD57063 /* BMKRadarResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRadarResult.h; path = BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarResult.h; sourceTree = ""; }; + 082182A0A5CB339A92B820E15098390D /* NSString+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+MJExtension.h"; path = "MJExtension/NSString+MJExtension.h"; sourceTree = ""; }; + 08220E658BE225AC98C9F060988E7C99 /* BMKCloudSearchComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCloudSearchComponent.h; path = BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchComponent.h; sourceTree = ""; }; + 08438849E50E3F8FD2D56E8806A7286A /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; + 08890F66152FB2C9DE640E0684F7C1CD /* BMKCloudSearchInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCloudSearchInfo.h; path = BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearchInfo.h; sourceTree = ""; }; + 089DFDA2E91232FE841E02962273C34B /* FBObjectiveCObject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectiveCObject.m; path = FBRetainCycleDetector/Graph/FBObjectiveCObject.m; sourceTree = ""; }; + 08ED25551853722CCFBFEE3A01914FE8 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; + 08F9C99E7D2BA240D4DD3AED5093367E /* MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtension.h; path = MJExtension/MJExtension.h; sourceTree = ""; }; + 099AE2A650497D8662F9346B62DC0ADB /* RACValueTransformer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACValueTransformer.h; path = ReactiveObjC/RACValueTransformer.h; sourceTree = ""; }; + 0A1805608C2690B1DB1D2F3BCD4669A2 /* BMKOpenPoiOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenPoiOption.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoiOption.h; sourceTree = ""; }; + 0A22E369C917AA057EF666A7F12DAAF6 /* BMKRadarComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRadarComponent.h; path = BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarComponent.h; sourceTree = ""; }; + 0A27D78343DC7345BCB9DBE049419D2D /* MyRelativeLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyRelativeLayout.m; path = MyLayout/Lib/MyRelativeLayout.m; sourceTree = ""; }; + 0A6C86CEAD5B224648297B9CE86E638A /* RACEvent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEvent.h; path = ReactiveObjC/RACEvent.h; sourceTree = ""; }; + 0A94EF503CBD63A6DF9D584FB70F0D8E /* UIBarButtonItem+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBarButtonItem+RACCommandSupport.m"; path = "ReactiveObjC/UIBarButtonItem+RACCommandSupport.m"; sourceTree = ""; }; + 0AD4CC755E906600F2BEAA5B269919A9 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; + 0AEB1A61146C5142D4D5E77AB0128992 /* BMKCloudSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCloudSearch.h; path = BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudSearch.h; sourceTree = ""; }; + 0AEDD7FDA88C26510064248D70178E27 /* FMDatabasePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabasePool.h; path = src/fmdb/FMDatabasePool.h; sourceTree = ""; }; + 0BB106A6CC8BDD9DD0F8D6872F238CAB /* libUMSocialLog.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libUMSocialLog.a; path = UShareSDK/UMSocialSDKPlugin/libUMSocialLog.a; sourceTree = ""; }; + 0C171B8EBC4570F91A890502853AC324 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; + 0C218F0977854B5EDF55A1F6B6982FC8 /* BAAlert.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAAlert.m; path = BAAlert/BAAlert/BAAlert.m; sourceTree = ""; }; + 0C7280B0B01FE0A9FBD451F52A186927 /* BAActionSheetCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAActionSheetCell.h; path = BAAlert/BAAlert/BAActionSheetCell.h; sourceTree = ""; }; + 0CC6FBD35F379E7B58572D0A35591949 /* UIView+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MemoryLeak.h"; path = "MLeaksFinder/UIView+MemoryLeak.h"; sourceTree = ""; }; + 0D8358950E72253455562539CC2FAA66 /* NSString+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+MJExtension.m"; path = "MJExtension/NSString+MJExtension.m"; sourceTree = ""; }; + 0DB6007E6C18F3CE8A03EF9DA8F30502 /* libMLeaksFinder.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMLeaksFinder.a; path = libMLeaksFinder.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 0F223A84D78AE0F2009F07EDC72AE9CC /* JMRoundedCorner.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JMRoundedCorner.xcconfig; sourceTree = ""; }; + 0F56087B0D929D2319DBF8C9C05F1B1C /* MJExtension.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.xcconfig; sourceTree = ""; }; + 0F6C6D89C07CEA51DF629F9A3BBB7151 /* BATextView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BATextView-dummy.m"; sourceTree = ""; }; + 104A9990DF39FBBDFE9CE6E9F7260A0D /* ReactiveObjC-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ReactiveObjC-prefix.pch"; sourceTree = ""; }; + 106876CF473CEB04DACD72F9BD78B10A /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = ""; }; + 110FB15DF49DAD2BC44FD43CE0FCA9FA /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; + 1179E94B52BD84B46398ED6142E3B82A /* UIApplication+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+MemoryLeak.h"; path = "MLeaksFinder/UIApplication+MemoryLeak.h"; sourceTree = ""; }; + 1190208B0B32FAAB0849AE6CE64A14F2 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; + 11DAD57A8968440D8545058A2A1FD71C /* BMKRadarVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRadarVersion.h; path = BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarVersion.h; sourceTree = ""; }; + 11EC33FFB6BBCB6CBEF82174F7A45B74 /* FMDatabase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabase.h; path = src/fmdb/FMDatabase.h; sourceTree = ""; }; + 11F59FF048F0B1369B44D5B6C92A7493 /* UIButton+BAState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+BAState.h"; path = "BAButton/BAButton/UIButton+BAState.h"; sourceTree = ""; }; + 12F4CC0D9A789BA0EF4C5ABEA99F8D83 /* FBClassStrongLayoutHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBClassStrongLayoutHelpers.m; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayoutHelpers.m; sourceTree = ""; }; + 13CF84D9AB979C1C299E38DD3640B0F5 /* BMKOpenPoi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenPoi.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPoi.h; sourceTree = ""; }; + 140163F1818B2F9C79F22762ACEA471D /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; + 141FCE7E92B2539D3BA3A82D56E9CFCD /* Masonry.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Masonry.xcconfig; sourceTree = ""; }; + 1451240F2979272EAFC1B709D9DF75A3 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; + 1492A3B27727F16D62B40E22156D5C32 /* MLeaksFinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeaksFinder.h; path = MLeaksFinder/MLeaksFinder.h; sourceTree = ""; }; + 149D613AB64A6FC4A51B600C92945C66 /* UITableViewHeaderFooterView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewHeaderFooterView+RACSignalSupport.m"; path = "ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.m"; sourceTree = ""; }; + 153251EBA7639679E85F3313F0F094C3 /* MyLinearLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLinearLayout.h; path = MyLayout/Lib/MyLinearLayout.h; sourceTree = ""; }; + 155961995EE5EA2560BA51896ACBA23C /* FBRetainCycleDetector+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBRetainCycleDetector+Internal.h"; path = "FBRetainCycleDetector/Detector/FBRetainCycleDetector+Internal.h"; sourceTree = ""; }; + 1579DB4F931010CCE34F3884CBB80197 /* UIDatePicker+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIDatePicker+RACSignalSupport.m"; path = "ReactiveObjC/UIDatePicker+RACSignalSupport.m"; sourceTree = ""; }; + 16773082991510BF8EBD7D23221AECDB /* MKAnnotationView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+RACSignalSupport.m"; path = "ReactiveObjC/MKAnnotationView+RACSignalSupport.m"; sourceTree = ""; }; + 1702A2065D3C3D9EE8FE7982D31343C6 /* NSFileHandle+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileHandle+RACSupport.m"; path = "ReactiveObjC/NSFileHandle+RACSupport.m"; sourceTree = ""; }; + 177623C7BE1948054DEEB107467F9E91 /* BMKMapComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMapComponent.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapComponent.h; sourceTree = ""; }; + 17D4AE42961F126BDC472E18A1F0E50C /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; + 17D64FBB4A2519B2CA50A02FA7A3817B /* IQUIWindow+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIWindow+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIWindow+Hierarchy.m"; sourceTree = ""; }; + 17EB73B6840226C409A702BFA00CAC70 /* BANetManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BANetManager-prefix.pch"; sourceTree = ""; }; + 1815DD33D4791214C169D35AB767C541 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.m; sourceTree = ""; }; + 181A9D814CF3A91AF0A0F95586C6DDC9 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; + 18D96FE27DB98800E0CF89E3B9F0DF3F /* TencentOpenApi_IOS_Bundle.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = TencentOpenApi_IOS_Bundle.bundle; path = UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle; sourceTree = ""; }; + 19D8003D5754AC4C5B8FCF890B9BF84A /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; + 19DAA63A9C4F018362642CA2E4E33C93 /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = ""; }; + 1A00F7D10B75F5E22DE86E2667F20609 /* BMKShape.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKShape.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKShape.h; sourceTree = ""; }; + 1A04CFAEE48B5262947F2713C74F91ED /* RACErrorSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACErrorSignal.h; path = ReactiveObjC/RACErrorSignal.h; sourceTree = ""; }; + 1A6875D2AD8063882A71D920BE79C32C /* NSOrderedSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSOrderedSet+RACSequenceAdditions.m"; path = "ReactiveObjC/NSOrderedSet+RACSequenceAdditions.m"; sourceTree = ""; }; + 1A6A0D59DE3FACBAE0B4911159F89CA6 /* libSocialQQ.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libSocialQQ.a; path = UShareSDK/SocialLibraries/QQ/libSocialQQ.a; sourceTree = ""; }; + 1A920D2F9BDEEDAEFCB1E58B82982BCD /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; + 1B43B6EB8692A50C274D7B10EE078407 /* NSObject+MJKeyValue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJKeyValue.m"; path = "MJExtension/NSObject+MJKeyValue.m"; sourceTree = ""; }; + 1B880DE953842FCF8F2FB239EDEBAE11 /* NSObject+RACLifting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACLifting.h"; path = "ReactiveObjC/NSObject+RACLifting.h"; sourceTree = ""; }; + 1BACFD0B00F53EE280B277E0569FDCE5 /* FBRetainCycleDetector.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBRetainCycleDetector.mm; path = FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm; sourceTree = ""; }; + 1BEE4EB8302487D7E3F856E2BA809DAA /* BMKRadarOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRadarOption.h; path = BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarOption.h; sourceTree = ""; }; 1C29FA061DCFAB12C13B62C2B431E857 /* Pods-BABaseProject-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-resources.sh"; sourceTree = ""; }; - 1C84A08F80D1887EA7BD94544170D1E9 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; - 1CA9DE9D2486104FE7F1DE2B6E2245C3 /* UMSCommentInputControlleriPad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSCommentInputControlleriPad.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib; sourceTree = ""; }; - 1CC80A118274F07BD6EC01FA6E973757 /* FBParsedStruct.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBParsedStruct.h; path = FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.h; sourceTree = ""; }; - 1D36BB668CD698AEA98938593DB6000C /* WebViewJavascriptBridge_JS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge_JS.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.h; sourceTree = ""; }; - 1D529033AB45964FD7D9E6344A09B042 /* FBObjectInStructReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectInStructReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectInStructReference.h; sourceTree = ""; }; - 1DD2CBBADED16457D1732D3822CA08ED /* UIView+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+BlocksKit.m"; path = "BlocksKit/UIKit/UIView+BlocksKit.m"; sourceTree = ""; }; - 1E3CA1F67A4D03CE610B7031A635C2C0 /* YYTextLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextLine.m; path = YYKit/Text/Component/YYTextLine.m; sourceTree = ""; }; - 1EA62A528C7657C71E0061470BE57494 /* YYTextArchiver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextArchiver.h; path = YYKit/Text/String/YYTextArchiver.h; sourceTree = ""; }; + 1D7746A3F6DD0E4D29A82F430AA7032B /* RACEagerSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEagerSequence.h; path = ReactiveObjC/RACEagerSequence.h; sourceTree = ""; }; + 1DCA24FCEAB2C370E0DFE8F12D8A9F90 /* RACSignal+Operations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACSignal+Operations.h"; path = "ReactiveObjC/RACSignal+Operations.h"; sourceTree = ""; }; + 1DDA574E254C090B33EB9AAB23570D11 /* FBClassStrongLayout.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBClassStrongLayout.mm; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.mm; sourceTree = ""; }; + 1E92917BCC2CB30A9506D26BAF59F243 /* BMKRouteSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRouteSearchType.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchType.h; sourceTree = ""; }; + 1ED5844300CA1B971687CFC8C8570F5D /* libIQKeyboardManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libIQKeyboardManager.a; path = libIQKeyboardManager.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1ED768A051D4B277045DBB0036E3C5C3 /* RACScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACScheduler.h; path = ReactiveObjC/RACScheduler.h; sourceTree = ""; }; 1EF4D927988F5CE1E81A545366AFC736 /* Pods-BABaseProject-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-frameworks.sh"; sourceTree = ""; }; - 1EFBF9A13077655D3157F4AEB2F2FFC0 /* YYTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTimer.m; path = YYKit/Utility/YYTimer.m; sourceTree = ""; }; - 1F3F941B3531A3103E0556EF2B2D2A3E /* fishhook.c */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.c; name = fishhook.c; path = fishhook/fishhook.c; sourceTree = ""; }; - 1F46A618CEB860FED640BFF35C463996 /* FBMemoryProfilerDataSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerDataSource.m; path = FBMemoryProfiler/Controllers/FBMemoryProfilerDataSource.m; sourceTree = ""; }; - 1FF2F95A55EC13B3F1BE3F5E69E7960C /* WebViewJavascriptBridge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WebViewJavascriptBridge-prefix.pch"; sourceTree = ""; }; - 200428244E7F1CAC94E2D732B86F5D27 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; - 206236CB4A6654F0196C1EFE84EB082F /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYKit/Cache/YYMemoryCache.m; sourceTree = ""; }; - 20E66BB1768AD27435FA30D2A98779D0 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/MessageUI.framework; sourceTree = DEVELOPER_DIR; }; - 20F8D3EB12F5D3E17B3E71D2C4692DDE /* BAButton-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BAButton-prefix.pch"; sourceTree = ""; }; - 212128327832554EB3EF692C63CFF0D9 /* NSArray+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+YYAdd.h"; path = "YYKit/Base/Foundation/NSArray+YYAdd.h"; sourceTree = ""; }; - 21AC9B17FB00F3A1C5B21B599D192340 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; - 21CD8F15749D4A403CDD14794455532C /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; - 21D76735A5DB5818F895943389FDB776 /* NSTimer+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSTimer+BlocksKit.h"; path = "BlocksKit/Core/NSTimer+BlocksKit.h"; sourceTree = ""; }; - 22048D6B92A7AAC7BA16C72241C1CB30 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; - 22DDD211FA23314FC16271C217095002 /* BAButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAButton.h; path = BAButton/BAButton.h; sourceTree = ""; }; - 2306FA16E8BCBEACC4EB83A1B28A3999 /* FBParsedType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBParsedType.m; path = FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.m; sourceTree = ""; }; - 2335EA7D63C6C56C8E8566673A553CD5 /* NSString+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+YYAdd.m"; path = "YYKit/Base/Foundation/NSString+YYAdd.m"; sourceTree = ""; }; - 2357778874C40965E6624D6D3DA4B672 /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = ""; }; - 239058FE08D4DC523E78BEAB1F7C4A1B /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; - 23CF67AAD0518E1B890DBEF51F31ABA9 /* UIImagePickerController+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImagePickerController+BlocksKit.h"; path = "BlocksKit/UIKit/UIImagePickerController+BlocksKit.h"; sourceTree = ""; }; - 23D1167FF7B65A01F1B7BD2DA3F382CE /* UMSocialSnsService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSnsService.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h; sourceTree = ""; }; - 240BCAC7B580A7E259EA787FBD602F7E /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; - 240D5346C40C8A4793704A345166F6E2 /* libYYKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libYYKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 24170A9015D9E86DE54E9BE4372EA733 /* NSInvocation+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSInvocation+BlocksKit.m"; path = "BlocksKit/Core/NSInvocation+BlocksKit.m"; sourceTree = ""; }; - 24525023577B19B37EC310F07C3BB51F /* YYTextInput.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextInput.h; path = YYKit/Text/Component/YYTextInput.h; sourceTree = ""; }; - 24742DEC1D6C6F047EBC393BC8C6BD7E /* WKWebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WKWebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.m; sourceTree = ""; }; - 24E690991FB67CDDF23F69C48CE66F9D /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.h"; sourceTree = ""; }; - 24E9F4392DC7217FD6A66AE4DC043C0F /* YYTransaction.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTransaction.h; path = YYKit/Utility/YYTransaction.h; sourceTree = ""; }; - 24F6496E988D11AC33FDBCC2280A3915 /* YYDispatchQueuePool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDispatchQueuePool.h; path = YYKit/Utility/YYDispatchQueuePool.h; sourceTree = ""; }; - 256E82EDE793BAEAEFB952558470B935 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; - 2622C1589AC4B916248C215E1DE4F482 /* YYDispatchQueuePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDispatchQueuePool.m; path = YYKit/Utility/YYDispatchQueuePool.m; sourceTree = ""; }; - 273058C0C66CF91736A9996C2ECEFB6E /* MLeaksFinder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeaksFinder.h; path = MLeaksFinder/MLeaksFinder.h; sourceTree = ""; }; - 2734F98AAA6AD94C522DF97253A97BC1 /* NSTimer+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSTimer+BlocksKit.m"; path = "BlocksKit/Core/NSTimer+BlocksKit.m"; sourceTree = ""; }; - 27D288C16715291171958E598EC02B1F /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; - 284AA4125C954750088AD99CE79A0390 /* MJExtensionConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtensionConst.h; path = MJExtension/MJExtensionConst.h; sourceTree = ""; }; - 28731D9959E7A20012FF5C4353093F87 /* YYTextLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextLayout.h; path = YYKit/Text/Component/YYTextLayout.h; sourceTree = ""; }; - 288B72AA3C58E307C4389C3C52273715 /* libMBProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMBProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 290C8450DD5B7FFBF5956CB8CA9808EA /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; - 296AAB6BC23232567FEB2D3D75004296 /* FBAllocationTrackerDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerDefines.h; path = FBAllocationTracker/FBAllocationTrackerDefines.h; sourceTree = ""; }; - 2A487A7BF3CA3F7B5DDBE294BB353222 /* UIGestureRecognizer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIGestureRecognizer+YYAdd.h"; path = "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.h"; sourceTree = ""; }; - 2A4BCFF3530F736ABCD8BB8951ED0433 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; - 2B138AD15939CEF73595C2E88EF81EB1 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; - 2B1F10FA77028B24266D2980E77086C3 /* NSThread+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSThread+YYAdd.m"; path = "YYKit/Base/Foundation/NSThread+YYAdd.m"; sourceTree = ""; }; - 2B4ACCAFBE6446BAB21858D74DE52729 /* WXApiObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApiObject.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h; sourceTree = ""; }; - 2BBC1CB40AF9D3594A48E4A8CD6214EC /* FBClassStrongLayoutHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBClassStrongLayoutHelpers.h; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayoutHelpers.h; sourceTree = ""; }; - 2BC8573301D7C819200435865CFE60B6 /* WebViewJavascriptBridge_JS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge_JS.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge_JS.m; sourceTree = ""; }; - 2C259586F4BB0915D57F936BAC4DE509 /* BAButton-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BAButton-dummy.m"; sourceTree = ""; }; - 2CF1CBBC6B1465C6113A29F1F01CFB73 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.h; sourceTree = ""; }; - 2D5BD7904F2823E0CBC00FD88D5FB3A8 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; - 2D5DAE318AD8143C9223D4EA52676CC6 /* UIColor+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIColor+YYAdd.m"; path = "YYKit/Base/UIKit/UIColor+YYAdd.m"; sourceTree = ""; }; - 2ED17C84D4CF51DA801BF6FD9CE2BC7A /* YYWeakProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWeakProxy.h; path = YYKit/Utility/YYWeakProxy.h; sourceTree = ""; }; - 2EE83000F7B65AC006FCD523F4318FED /* NullSafe.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NullSafe.m; path = NullSafe/NullSafe.m; sourceTree = ""; }; - 2F230BC7920E555B8E82AD99BA354C48 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; - 2F2F05222313ACD72D4169968076AB6E /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; - 2F66536B55F1D950E6B14A8421B3CFC3 /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = ""; }; - 30135DB7B2997410CF579580F9ECAF04 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; - 306EFD48787CB56175CEABCADFB7845F /* FBClassStrongLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBClassStrongLayout.h; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h; sourceTree = ""; }; - 30B7AB42C85DE96933B805F6321E27B4 /* YYTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextView.h; path = YYKit/Text/YYTextView.h; sourceTree = ""; }; - 31648AC9A55E2A176D9FAA4999CE5934 /* YYTextMagnifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextMagnifier.m; path = YYKit/Text/Component/YYTextMagnifier.m; sourceTree = ""; }; - 31C588CCFDECBCC4F4FD77599A830F73 /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + 1F0908CC444FE177FC1ED9F121BAB57B /* RACErrorSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACErrorSignal.m; path = ReactiveObjC/RACErrorSignal.m; sourceTree = ""; }; + 1F7CE4774B273BDA375ADF1CBAC2D592 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 20243B04674BFF26F1C89BB8801B12FE /* NSObject+RACDeallocating.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACDeallocating.h"; path = "ReactiveObjC/NSObject+RACDeallocating.h"; sourceTree = ""; }; + 2038DB3198491F1BAC3EF45DED8F42A7 /* BMKNavigation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKNavigation.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKNavigation.h; sourceTree = ""; }; + 2083825C6B8994832ABD9EFAB9FCC63A /* CALayer+Animation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+Animation.h"; path = "BAAlert/BAAlert/CALayer+Animation.h"; sourceTree = ""; }; + 208FDB098265597D2DCA112B563FB9DF /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; + 20ED70031919883C757FC6A7DA2A8E24 /* UMSocialNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UMSocialNetwork.framework; path = UShareSDK/UMSocialSDK/UMSocialNetwork.framework; sourceTree = ""; }; + 211662498AC88AD17BDE0A4817A3C1CB /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; + 21681FB275626CAA88F463F258C4B899 /* BAPickView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BAPickView-prefix.pch"; sourceTree = ""; }; + 21E8A91D2FFDF02FC12EC1249BA136BA /* RACTargetQueueScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTargetQueueScheduler.m; path = ReactiveObjC/RACTargetQueueScheduler.m; sourceTree = ""; }; + 2200695DDD89F6C936EB06E5AFF20767 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; + 221F3D0762DC4E834B21AE69B07584EF /* NSIndexSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSIndexSet+RACSequenceAdditions.h"; path = "ReactiveObjC/NSIndexSet+RACSequenceAdditions.h"; sourceTree = ""; }; + 2248D3C37B4C26439603E26212E027AC /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; + 2299D7AFEC8BF49333908E31B028ACA9 /* UIView+BARectCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+BARectCorner.m"; path = "BAButton/BAButton/UIView+BARectCorner.m"; sourceTree = ""; }; + 22AB4ABACB85E561190034B7B6551504 /* APOpenAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = APOpenAPI.h; path = UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h; sourceTree = ""; }; + 22B7431A158DD14D3A998F7E4905B17D /* BMKBusLineSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKBusLineSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearchOption.h; sourceTree = ""; }; + 22F0B7DC48F3AE70868877DB6888BAF9 /* WBHttpRequest+WeiboToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WBHttpRequest+WeiboToken.h"; path = "UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest+WeiboToken.h"; sourceTree = ""; }; + 230F29483FCC337D606D637DD1FB2B88 /* Struct.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = Struct.mm; path = FBRetainCycleDetector/Layout/Classes/Parser/Struct.mm; sourceTree = ""; }; + 234F644A5F52C35A3202B444A8BE17ED /* MyLinearLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLinearLayout.m; path = MyLayout/Lib/MyLinearLayout.m; sourceTree = ""; }; + 23849DBA6F5CF90243CEA3152D613E52 /* RACKVOTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOTrampoline.m; path = ReactiveObjC/RACKVOTrampoline.m; sourceTree = ""; }; + 2419C87AC70E30EAC1E42CD1052ED034 /* BaiduMapAPI_Search.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Search.framework; path = BaiduMapKit/BaiduMapAPI_Search.framework; sourceTree = ""; }; + 24CDB901D3BF0DF41F65D51C3D4044F5 /* BAButton-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BAButton-dummy.m"; sourceTree = ""; }; + 24E732E61E783895CF9D3245E9C94340 /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSDWebImage.a; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 253D2711D2CBA7C45408CA750D08BF6B /* RACDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDelegateProxy.m; path = ReactiveObjC/RACDelegateProxy.m; sourceTree = ""; }; + 254F7A4DA015B4389CE024290D2E0817 /* UMSocialWechatHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialWechatHandler.h; path = UShareSDK/SocialLibraries/WeChat/UMSocialWechatHandler.h; sourceTree = ""; }; + 25D4ABE7819E399A9D91A6FE03EFE0AE /* BMKCircleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCircleView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircleView.h; sourceTree = ""; }; + 262DAED21B11543F7F53D8B04277FD98 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; + 268320F0FA40E517AA8F5D3575247D49 /* MyLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayout.h; path = MyLayout/Lib/MyLayout.h; sourceTree = ""; }; + 26F4CE27362B55A10FAC835055A92967 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; + 277DBB41112C0CCFDFE1E1341BA3F6D2 /* FBObjectiveCNSCFTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCNSCFTimer.h; path = FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.h; sourceTree = ""; }; + 281158B539A4F14DB261C2E7607CBB6B /* NSArray+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+RACSequenceAdditions.m"; path = "ReactiveObjC/NSArray+RACSequenceAdditions.m"; sourceTree = ""; }; + 285DEC3A2DEB85BEE3116BC91D02FDE2 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = ""; }; + 2863BAA55E29DA6ABAE6B5B3D15A2C68 /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DZNEmptyDataSet-dummy.m"; sourceTree = ""; }; + 286E560BE1F5CAEB90DA5E2E24EEA6B8 /* UIGestureRecognizer+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIGestureRecognizer+RACSignalSupport.h"; path = "ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h"; sourceTree = ""; }; + 2902E219B43F6327F8C71C573FE3D209 /* BMKUtilsComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKUtilsComponent.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsComponent.h; sourceTree = ""; }; + 293F15EC612DC15503D82054E16136CC /* YYCache.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.xcconfig; sourceTree = ""; }; + 296A677D2DE30C7190B4240C2DFCCC02 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyboardManager/IQKeyboardManager.h; sourceTree = ""; }; + 2A0065A702ADA89850B8FE13EC1D2E30 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; + 2ACFCC94452F527AE31DDF08B14330AB /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; + 2BAD3F8D84038EE76B97941D3610A983 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; + 2C0EF8BF0F971F39EB7F550B63140569 /* BMKLocationVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKLocationVersion.h; path = BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationVersion.h; sourceTree = ""; }; + 2C166D53BEBDEF9C2D8E186212A3195C /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; + 2C16930F8B76EE6F0FD5EEB16B3556A9 /* UIButton+BACountDown.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+BACountDown.h"; path = "BAButton/BAButton/UIButton+BACountDown.h"; sourceTree = ""; }; + 2C5BF5C462014C7C318D4835F4077875 /* RACBehaviorSubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACBehaviorSubject.h; path = ReactiveObjC/RACBehaviorSubject.h; sourceTree = ""; }; + 2C9A4D99DF92CB8A163E0DE19AB5A9B8 /* UIImage+RoundedCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+RoundedCorner.m"; path = "JMRoundedCorner/UIImage+RoundedCorner.m"; sourceTree = ""; }; + 2C9AC5DA082BEA613499A94FC20CAFDD /* MLeaksFinder.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MLeaksFinder.xcconfig; sourceTree = ""; }; + 2D76CB8ECA822D6FD5ED20F617CBC3AF /* BMKSearchBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKSearchBase.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchBase.h; sourceTree = ""; }; + 2DAA8D71933229D4EB5B0FC01815E90D /* BMKLocationService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKLocationService.h; path = BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationService.h; sourceTree = ""; }; + 2DE371ED4D9DC628EAA0CF770DEE4957 /* RACEmptySignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEmptySignal.m; path = ReactiveObjC/RACEmptySignal.m; sourceTree = ""; }; + 2E25E8A0AAAAC111A684D76A7732C6BB /* MyFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFlowLayout.h; path = MyLayout/Lib/MyFlowLayout.h; sourceTree = ""; }; + 2E3A29C80DB503CCE251A466BCC44B08 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; + 2E856330B4B3D8B9348F393D3A51DB82 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; + 2EBCD81DCACFCB19676491212DDAD136 /* NSObject+MJCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJCoding.h"; path = "MJExtension/NSObject+MJCoding.h"; sourceTree = ""; }; + 2EE494C85C760F5DE095C549F1D7EBE4 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; + 2F20B78249762A98503F000C0866655F /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; + 2FAEB1F6ACFBD9ACCDC835645763CA8A /* FBBlockStrongRelationDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBBlockStrongRelationDetector.m; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongRelationDetector.m; sourceTree = ""; }; + 2FD86E222A556966847A5A1839B2D9F5 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; + 3111E22E4AD00750A1DC1A82C14A1F6D /* RACEXTRuntimeExtensions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEXTRuntimeExtensions.m; path = ReactiveObjC/extobjc/RACEXTRuntimeExtensions.m; sourceTree = ""; }; + 312AEAC2C8999EE2170793DE45E4B8E8 /* RACReplaySubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACReplaySubject.m; path = ReactiveObjC/RACReplaySubject.m; sourceTree = ""; }; + 31BF767FF5B2ED098574654E25271D1B /* RACUnarySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACUnarySequence.h; path = ReactiveObjC/RACUnarySequence.h; sourceTree = ""; }; + 327F60EA44DE902FE3C475B66026065A /* MyLayoutSizeClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutSizeClass.h; path = MyLayout/Lib/MyLayoutSizeClass.h; sourceTree = ""; }; 3324676947E0C5C9262CF719A16784E0 /* Pods-BABaseProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject.debug.xcconfig"; sourceTree = ""; }; - 3341EB532562B2DB29FD8C8F4CD3EE70 /* FBIvarReference.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBIvarReference.m; path = FBRetainCycleDetector/Layout/Classes/Reference/FBIvarReference.m; sourceTree = ""; }; - 334E3B593423E2F39054E938A0EA6BC5 /* UIBezierPath+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBezierPath+YYAdd.h"; path = "YYKit/Base/UIKit/UIBezierPath+YYAdd.h"; sourceTree = ""; }; - 33824E4290C85330F2018A765169A40A /* NullSafe-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NullSafe-prefix.pch"; sourceTree = ""; }; - 3471A15044110541D125F12AA4FAB42E /* WBSDKRelationshipButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WBSDKRelationshipButton.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h; sourceTree = ""; }; - 34880D346373881FA6D9A57B8A895802 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; - 36987C06B3A89FF24559FD5CCF12CA7B /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; - 3698933040026038E6B013F971CC37E6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 36B092E4DE9B53D996DC18BF9956DBA7 /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.m; sourceTree = ""; }; - 37A7B5AD1ADFD0B617050EB45210ACF5 /* MyTableLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyTableLayout.m; path = MyLayout/Lib/MyTableLayout.m; sourceTree = ""; }; - 37AE1CD4FA627D2486748A541972215A /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; - 37E0B549BE7A86F85D64A4752B4189BD /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = ""; }; - 383D930024C4C0FF2B4F1A76A1E18DD0 /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYKit/Image/Categories/UIButton+YYWebImage.h"; sourceTree = ""; }; - 384DD95419FA690A3C7ADFE8189477B4 /* UIView+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+BlocksKit.h"; path = "BlocksKit/UIKit/UIView+BlocksKit.h"; sourceTree = ""; }; - 38B3A28C52D5632B18B9F817CFD777F1 /* FBMemoryProfilerContainerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerContainerViewController.h; path = FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.h; sourceTree = ""; }; - 3A0E59635DA14A595558ECCF4F8E2107 /* NSKeyedUnarchiver+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSKeyedUnarchiver+YYAdd.m"; path = "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.m"; sourceTree = ""; }; - 3A3C0F8BC2663543BBB56BD1D07D6CFE /* UIPageViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIPageViewController+MemoryLeak.m"; path = "MLeaksFinder/UIPageViewController+MemoryLeak.m"; sourceTree = ""; }; - 3B491FACB2564D7721CD162115BCD106 /* NSObject+MJClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJClass.m"; path = "MJExtension/NSObject+MJClass.m"; sourceTree = ""; }; - 3B94301757733934C689F550ECF08CF6 /* NSDictionary+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+YYAdd.m"; path = "YYKit/Base/Foundation/NSDictionary+YYAdd.m"; sourceTree = ""; }; + 334193C938D9CBFE4064554A225BB2E5 /* BMKOpenRouteOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenRouteOption.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRouteOption.h; sourceTree = ""; }; + 33636993BC8A1BADE06BA3819AC69F9F /* RACScheduler+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACScheduler+Subclass.h"; path = "ReactiveObjC/RACScheduler+Subclass.h"; sourceTree = ""; }; + 339F84D06D8FBC2F1F0E11D9DB3D1B06 /* BMKPolygon.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPolygon.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygon.h; sourceTree = ""; }; + 35732075BBB2F0C1C7555D30716BB878 /* UIActionSheet+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActionSheet+RACSignalSupport.h"; path = "ReactiveObjC/UIActionSheet+RACSignalSupport.h"; sourceTree = ""; }; + 35787C1EADE08EA1FA3A0739B3FA15AC /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYCache/YYKVStorage.h; sourceTree = ""; }; + 35AA214C6AC1232C1B5DB344B854410D /* RACBlockTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACBlockTrampoline.h; path = ReactiveObjC/RACBlockTrampoline.h; sourceTree = ""; }; + 35BDA86AE11F460A2DF00BC4EB769654 /* MyLayoutSize.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutSize.h; path = MyLayout/Lib/MyLayoutSize.h; sourceTree = ""; }; + 3667FF770F6A8140D57DF53BDA62005F /* NSDate+BAKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+BAKit.h"; path = "BAPickView/BAPickView/NSDate+BAKit.h"; sourceTree = ""; }; + 36691016BB84FA5EC047579622539A5C /* RACSubscriber+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACSubscriber+Private.h"; path = "ReactiveObjC/RACSubscriber+Private.h"; sourceTree = ""; }; + 3671B4A39B437A4A1500B060B40C94A9 /* UMSocialAlipayHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialAlipayHandler.h; path = UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h; sourceTree = ""; }; + 36D80C429D17ED6E81D2D863B3757C8D /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; + 376E4A3CBF92F4FE4EB23EA625C1543C /* libReactiveObjC.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libReactiveObjC.a; path = libReactiveObjC.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3862B80244844091269D5E663405D818 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; + 389DC02195D2060AE766053F5810F53A /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = ""; }; + 38D5AFDE32F62244BED362D45F62E0E5 /* MyLayoutSize.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutSize.m; path = MyLayout/Lib/MyLayoutSize.m; sourceTree = ""; }; + 38EDBBFB74E8E449133380A37D13E19F /* libAPOpenSdk.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libAPOpenSdk.a; path = UShareSDK/SocialLibraries/AlipayShare/libAPOpenSdk.a; sourceTree = ""; }; + 3917A5A4685744726F35459D795C8208 /* BMKGroundOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGroundOverlay.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlay.h; sourceTree = ""; }; + 3936179AB8A2713262AFCC205E90BEFB /* BAKit_DeviceModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAKit_DeviceModel.h; path = BATouchID/BATouchID/BAKit_DeviceModel.h; sourceTree = ""; }; + 395326E78402D6FD1222720DF2C766E6 /* UIView+BARectCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+BARectCorner.h"; path = "BAPickView/BAPickView/UIView+BARectCorner.h"; sourceTree = ""; }; + 398019BEC2C03A0C83B11298A7329629 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = ""; }; + 3A4460A1D77EF476D75CDAB94861EECC /* NSNotificationCenter+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNotificationCenter+RACSupport.h"; path = "ReactiveObjC/NSNotificationCenter+RACSupport.h"; sourceTree = ""; }; + 3A5583188F4271149CAAD3C89233F88C /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = ""; }; + 3A6863F19D6670EF972F70434A310987 /* BMKHeatMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKHeatMap.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKHeatMap.h; sourceTree = ""; }; + 3AFA8912D8C5109C85FDC65E360B238B /* NSEnumerator+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSEnumerator+RACSequenceAdditions.m"; path = "ReactiveObjC/NSEnumerator+RACSequenceAdditions.m"; sourceTree = ""; }; + 3B0C634B0297ABC6F5168AFC00F9C8AE /* BMKFavPoiInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKFavPoiInfo.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiInfo.h; sourceTree = ""; }; + 3B77F08CCB0693E93A725C16B70974BE /* RACMulticastConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACMulticastConnection.m; path = ReactiveObjC/RACMulticastConnection.m; sourceTree = ""; }; 3BB46D1BDA8E927D0294849D61332D50 /* Pods-BABaseProject-BABaseProjectTests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-BABaseProjectTests-resources.sh"; sourceTree = ""; }; - 3BC34FD5385E64670B47F6C9487AAA04 /* YYThreadSafeDictionary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYThreadSafeDictionary.m; path = YYKit/Utility/YYThreadSafeDictionary.m; sourceTree = ""; }; - 3BE3CB4DBF05A80545E0A9738BF8CF22 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; - 3C9159BD8374EF1395DC9A245DFF9D5F /* WebViewJavascriptBridge.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WebViewJavascriptBridge.xcconfig; sourceTree = ""; }; - 3CA468691084FABF8B4121A25DBBED2C /* IQKeyboardManager.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.xcconfig; sourceTree = ""; }; - 3E91B7A86A2A598221752FFF271FDDAB /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; - 3E9A2F12DD6EFC4953AEEC39439F1612 /* YYGestureRecognizer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYGestureRecognizer.h; path = YYKit/Utility/YYGestureRecognizer.h; sourceTree = ""; }; - 3EB70E593734C4BCB70716363593F24A /* FBObjectiveCBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectiveCBlock.m; path = FBRetainCycleDetector/Graph/FBObjectiveCBlock.m; sourceTree = ""; }; - 3F0AC202A950F26A1DA6E90840A573AD /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; - 3F0E3F14042F7F714B53546F93428CE8 /* NSObject+BKBlockObservation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+BKBlockObservation.m"; path = "BlocksKit/Core/NSObject+BKBlockObservation.m"; sourceTree = ""; }; - 3FAD44AC34ABBD5CD2494949F2678403 /* FBRetainCycleDetector+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBRetainCycleDetector+Internal.h"; path = "FBRetainCycleDetector/Detector/FBRetainCycleDetector+Internal.h"; sourceTree = ""; }; - 3FB7774E0054E023612AC90FAC907624 /* UIPopoverController+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIPopoverController+BlocksKit.h"; path = "BlocksKit/UIKit/UIPopoverController+BlocksKit.h"; sourceTree = ""; }; - 3FC460E45DFF37C3124F4D23555DAFC4 /* UIBarButtonItem+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBarButtonItem+BlocksKit.m"; path = "BlocksKit/UIKit/UIBarButtonItem+BlocksKit.m"; sourceTree = ""; }; - 4053875D218BD287F8F5AC013633D8BB /* UIScrollView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+YYAdd.h"; path = "YYKit/Base/UIKit/UIScrollView+YYAdd.h"; sourceTree = ""; }; + 3BC46F9CF2F9DD86B27771B482AA01E4 /* ReactiveObjC-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ReactiveObjC-dummy.m"; sourceTree = ""; }; + 3BEDD5BAE75C2F69070518B977228435 /* FMDB.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FMDB.xcconfig; sourceTree = ""; }; + 3C7EF70F5DB7EA91726A7AC19A9C10AE /* MKAnnotationView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+RACSignalSupport.h"; path = "ReactiveObjC/MKAnnotationView+RACSignalSupport.h"; sourceTree = ""; }; + 3D00313D1E5CE9B1AFE409079491E15E /* FMDB-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FMDB-prefix.pch"; sourceTree = ""; }; + 3D57D3DAE6529FFC47500FA3EDB66F03 /* RACEmptySignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEmptySignal.h; path = ReactiveObjC/RACEmptySignal.h; sourceTree = ""; }; + 3DAC0FCDA2FFF32FA2B67735A53D1938 /* NSObject+RACLifting.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACLifting.m"; path = "ReactiveObjC/NSObject+RACLifting.m"; sourceTree = ""; }; + 3DD19D489968E7AF69DB54F0337C36A8 /* NSDictionary+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+RACSequenceAdditions.m"; path = "ReactiveObjC/NSDictionary+RACSequenceAdditions.m"; sourceTree = ""; }; + 3E00F3186D0D77F2C61BF519E7E17E57 /* libBAAlert.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBAAlert.a; path = libBAAlert.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E34670B295AA51BA862050258AA92BD /* NSObject+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MemoryLeak.m"; path = "MLeaksFinder/NSObject+MemoryLeak.m"; sourceTree = ""; }; + 3F7719B2B06543C66BFA4D11CB660CC0 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = ""; }; + 3F9CAF1A0F76DF7C95AA9FE87616AA50 /* IQPreviousNextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQPreviousNextView.h; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.h; sourceTree = ""; }; + 3FDED38C033770B7581AB0A201118DB1 /* BaiduMapAPI_Map.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Map.framework; path = BaiduMapKit/BaiduMapAPI_Map.framework; sourceTree = ""; }; + 40087F240505956876B1EE3C618953BC /* NSEnumerator+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSEnumerator+RACSequenceAdditions.h"; path = "ReactiveObjC/NSEnumerator+RACSequenceAdditions.h"; sourceTree = ""; }; + 403F378006FD2BF9BAD9E8276E715A41 /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; + 40C6B6E777043A326F2E22C407EBDE8C /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = ""; }; + 41E6E2C06037B36FF12412138FCD1E39 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; 41FBC58145CB22498B5323EA12E897BC /* Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig"; sourceTree = ""; }; - 4256130E7E08605BAA83B02D16E09619 /* FBMemoryProfilerContainerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerContainerViewController.m; path = FBMemoryProfiler/Window/FBMemoryProfilerContainerViewController.m; sourceTree = ""; }; - 427C4E63BCEF748D1C5BFCA32A273550 /* FBRetainCycleUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBRetainCycleUtils.m; path = FBRetainCycleDetector/FBRetainCycleUtils.m; sourceTree = ""; }; - 42AE4450BA7735FFFE7FAC3E56D8CE30 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; - 42BDF165D26E6DCA2F9FFCB395C0383A /* FBMemoryProfilerSegmentedControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerSegmentedControl.h; path = FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.h; sourceTree = ""; }; - 431D3C2E9513FB79D81D480A2F281CDA /* NSMutableSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableSet+BlocksKit.h"; path = "BlocksKit/Core/NSMutableSet+BlocksKit.h"; sourceTree = ""; }; - 433064D867F3A509FB5B78130B08FBC2 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyboardManager/Resources/IQKeyboardManager.bundle; sourceTree = ""; }; - 43CA673B91BB7FC580CFCD62E50E96B6 /* NSBundle+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+YYAdd.m"; path = "YYKit/Base/Foundation/NSBundle+YYAdd.m"; sourceTree = ""; }; - 43EAF23E8EA3541BCE6659ED8BAA2210 /* UMSocialTumblrHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialTumblrHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h; sourceTree = ""; }; - 43F4E05159F189D6601F4017C603D706 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; - 4538FD40297CA79DB8CDE665A81DE8A3 /* libBlocksKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBlocksKit.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 457D815EB7A0C4D04D170072A869F018 /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; - 46146AFA7B79C99D3F78D01909369053 /* YYThreadSafeArray.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYThreadSafeArray.h; path = YYKit/Utility/YYThreadSafeArray.h; sourceTree = ""; }; - 464340AC402CF5D0C17F0005CED66A1F /* MyFloatLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFloatLayout.m; path = MyLayout/Lib/MyFloatLayout.m; sourceTree = ""; }; - 468C7846CEC675C941C4E6A8B977C108 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; - 46AC5AC9133DAB24CA1667FE46402550 /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = ""; }; - 46B0E4EFC158C3C0E278033155A6B5AC /* YYTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTimer.h; path = YYKit/Utility/YYTimer.h; sourceTree = ""; }; - 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 47C4406700A7F5EA5906CC95ED50528B /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYKit/Image/YYAnimatedImageView.m; sourceTree = ""; }; - 4874BB789FAA3836C95529B0BBD4C341 /* NSCache+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCache+BlocksKit.m"; path = "BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.m"; sourceTree = ""; }; - 4956183838E6D4475A0100F5E64B7A59 /* BAButton.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BAButton.xcconfig; sourceTree = ""; }; - 4A1F2D0F6A4D9EC760DD5A096444C814 /* FBBlockStrongLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBBlockStrongLayout.m; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongLayout.m; sourceTree = ""; }; - 4B19B061E6991FFEA9EF9967D21F0699 /* NSArray+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+MASAdditions.m"; path = "Masonry/NSArray+MASAdditions.m"; sourceTree = ""; }; - 4B7117B3BCBB7B6A1A59343FDE65AFAB /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; - 4B8D852EBB3BA2EB916F5EF39E3F2D1A /* MyFrameLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFrameLayout.h; path = MyLayout/Lib/MyFrameLayout.h; sourceTree = ""; }; - 4C4BE6AA65BD511B1DC825C2E301DF34 /* FBMemoryProfilerTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerTextField.h; path = FBMemoryProfiler/UI/FBMemoryProfilerTextField.h; sourceTree = ""; }; - 4C93035ECBBA901BB001C1BC351FE3AB /* FBMemoryProfilerSectionHeaderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerSectionHeaderDelegate.h; path = FBMemoryProfiler/Controllers/FBMemoryProfilerSectionHeaderDelegate.h; sourceTree = ""; }; - 4CBFBDB249D7D9EFFC39DC7E6BA02F93 /* UIPasteboard+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIPasteboard+YYText.h"; path = "YYKit/Text/String/UIPasteboard+YYText.h"; sourceTree = ""; }; - 4D218FC49276D25CF7A3F38239314838 /* UMSocialAlipayShareHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialAlipayShareHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h; sourceTree = ""; }; - 4D7BB901E91162456CE20970E16BBD61 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = ""; }; - 4D9F08CF4924E1EC00C67FF070B8E575 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYKit/Model/YYClassInfo.m; sourceTree = ""; }; - 4F469B868CBD380BAF898D72BDC40A58 /* UITextField+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+BlocksKit.m"; path = "BlocksKit/UIKit/UITextField+BlocksKit.m"; sourceTree = ""; }; - 4F5558DDA0210B74435B1D0814999FFB /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; - 4FA3881E78E67569BF5D4EFDB53DBA32 /* WKWebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WKWebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WKWebViewJavascriptBridge.h; sourceTree = ""; }; - 4FB43FF5DCCA260A7741F60487042BE8 /* MyLayoutPosInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutPosInner.h; path = MyLayout/Lib/MyLayoutPosInner.h; sourceTree = ""; }; - 4FF8CF30A052EE5A10BD71D80CE6DC20 /* ViewController+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "ViewController+MASAdditions.h"; path = "Masonry/ViewController+MASAdditions.h"; sourceTree = ""; }; - 503C401237D1504EAC535D4C824AA2C3 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyboardManager/IQTextView/IQTextView.m; sourceTree = ""; }; - 50A31F9BD88110591D90290688433D67 /* BAButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAButton.m; path = BAButton/BAButton.m; sourceTree = ""; }; - 511415AC9277593D6968E67DDFCF1B0E /* MyRelativeLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyRelativeLayout.m; path = MyLayout/Lib/MyRelativeLayout.m; sourceTree = ""; }; - 51F42359B30E5D1CF37A746186E26702 /* NSObject+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAdd.m"; path = "YYKit/Base/Foundation/NSObject+YYAdd.m"; sourceTree = ""; }; - 5235F6664D58F67235B2FE9C46034955 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; - 53217886BF1EFC1274DA0DEE919C912A /* NSMutableArray+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+BlocksKit.m"; path = "BlocksKit/Core/NSMutableArray+BlocksKit.m"; sourceTree = ""; }; - 5364CBEEC29A2377D1D617DB67D7FD03 /* FBMemoryProfiler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfiler.h; path = FBMemoryProfiler/FBMemoryProfiler.h; sourceTree = ""; }; - 537A830133BA682BF29287F9257C56FF /* FBAllocationTracker.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBAllocationTracker.xcconfig; sourceTree = ""; }; - 53826077F7EC40EC905B04539DDE0BB5 /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; - 53A6034CD435B263D225D48ECC87B0CA /* MyLayoutDime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutDime.m; path = MyLayout/Lib/MyLayoutDime.m; sourceTree = ""; }; - 53A8B65DEBA1EB2DACE25C3B0B365282 /* YYTextParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextParser.h; path = YYKit/Text/String/YYTextParser.h; sourceTree = ""; }; - 53ABD9D86A65A57FF7B87B558E040305 /* MyFlowLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFlowLayout.h; path = MyLayout/Lib/MyFlowLayout.h; sourceTree = ""; }; - 53FB588A113AB29AD3375DE84C25ABDE /* WBHttpRequest+WeiboGame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WBHttpRequest+WeiboGame.h"; path = "Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h"; sourceTree = ""; }; - 542E6C9B8F84F2330A4147C57B231C39 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; - 56002A76B241F357D48CD4909CC1A858 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; - 569A43A38B83F695973632E6621D9A15 /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = ""; }; - 573302A94962ECEDB4BEE8F6031FF022 /* YYTextDebugOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextDebugOption.h; path = YYKit/Text/Component/YYTextDebugOption.h; sourceTree = ""; }; - 57768CBA856A51F8D31835601F2C7CF5 /* libPods-BABaseProject-BABaseProjectTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject-BABaseProjectTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 587F16F5BE4442EE547B80E02F884369 /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = ""; }; - 588B42890A252D3930B71555B6E03222 /* FBObjectGraphConfiguration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectGraphConfiguration.h; path = FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.h; sourceTree = ""; }; - 58C80B2149739C468CEF90F235DD79DA /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYKit/Model/NSObject+YYModel.h"; sourceTree = ""; }; - 58F62B9290AE378B5F235AA7C7FE6253 /* UITableView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+YYAdd.h"; path = "YYKit/Base/UIKit/UITableView+YYAdd.h"; sourceTree = ""; }; - 59549BB86E8407BD18DC6A23749BD49F /* MLeaksFinder-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MLeaksFinder-prefix.pch"; sourceTree = ""; }; - 59878695D49E5889A941D92A41356AA7 /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYKit/Image/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = ""; }; - 59DB5DE2EC4B6E18093E86DBCEE0F114 /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.m"; sourceTree = ""; }; - 5AACE5A7DD6A6254087729150B530CF0 /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYKit/Image/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = ""; }; - 5AFDC3BC9CF02334CDE8A19341D0A38B /* UIFont+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+YYAdd.h"; path = "YYKit/Base/UIKit/UIFont+YYAdd.h"; sourceTree = ""; }; + 429BAE4E40C83327B0D1D998598F015A /* UIGestureRecognizer+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIGestureRecognizer+RACSignalSupport.m"; path = "ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m"; sourceTree = ""; }; + 435CF4706573795628005AF2384CD26C /* FBRetainCycleDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCycleDetector.h; path = FBRetainCycleDetector/Detector/FBRetainCycleDetector.h; sourceTree = ""; }; + 43DDA30BD88664E66A24DB93EF4024E0 /* MLeaksFinder-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MLeaksFinder-dummy.m"; sourceTree = ""; }; + 444D4B257658723EBB2335B6280A8866 /* MASCompositeConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASCompositeConstraint.m; path = Masonry/MASCompositeConstraint.m; sourceTree = ""; }; + 445BD805E0C8977E90E9DB040C0E6971 /* mapapi.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = mapapi.bundle; path = BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle; sourceTree = ""; }; + 446129556223C2E74A8A7C30F8767C38 /* BAKit_TouchID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAKit_TouchID.h; path = BATouchID/BATouchID/BAKit_TouchID.h; sourceTree = ""; }; + 44C205E043411C9776E9AB93B8B40884 /* BMKLocationComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKLocationComponent.h; path = BaiduMapKit/BaiduMapAPI_Location.framework/Headers/BMKLocationComponent.h; sourceTree = ""; }; + 4510791B869F4D7AA04BC2CC44AFADEB /* MyLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MyLayout-prefix.pch"; sourceTree = ""; }; + 4543D78CD3D31D7C057CCBE5F42C8ED4 /* ViewController+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "ViewController+MASAdditions.m"; path = "Masonry/ViewController+MASAdditions.m"; sourceTree = ""; }; + 459AAFE1F1D9EA4D967986654FFD8E94 /* BMKCircle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCircle.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKCircle.h; sourceTree = ""; }; + 4627D7C077EF4154EE76CB73F193AA33 /* NSObject+RACSelectorSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACSelectorSignal.h"; path = "ReactiveObjC/NSObject+RACSelectorSignal.h"; sourceTree = ""; }; + 46379A297FC67C6E204CA4FE3BC093BB /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; + 469BD90248B96FC9B882C11BB007E913 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; + 47266E4296E25F40182E8AD7DF4522AE /* BAAlert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAAlert.h; path = BAAlert/BAAlert/BAAlert.h; sourceTree = ""; }; + 47C1E96893C46BAD1077EA8460A077B2 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = ""; }; + 48E822CF85A1B417E733C1688FA2010D /* RACSubscriptionScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriptionScheduler.h; path = ReactiveObjC/RACSubscriptionScheduler.h; sourceTree = ""; }; + 49303BDED7D239E54D72C3EB245BF3A7 /* UMSocialSDKPromptResources.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = UMSocialSDKPromptResources.bundle; path = UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle; sourceTree = ""; }; + 4A076E905BE295CE093C9085B1D7F7CB /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; + 4AAD40469B5CAC2D161755405DB1644A /* BMKTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKTypes.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKTypes.h; sourceTree = ""; }; + 4B2CC3FEF34AB97E1C69DA32D2111AE6 /* BMKActionPaopaoView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKActionPaopaoView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKActionPaopaoView.h; sourceTree = ""; }; + 4B58FB996D895EF70D76E9E288B7C114 /* libssl.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libssl.a; path = BaiduMapKit/thirdlibs/libssl.a; sourceTree = ""; }; + 4C1407FB601C2671A1CB39BA8960D5DB /* FBClassStrongLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBClassStrongLayout.h; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayout.h; sourceTree = ""; }; + 4C40F9C9B3CA2A6856FE4AB75711F9EF /* FBObjectReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectReference.h; sourceTree = ""; }; + 4C49368620D6CAF2E5410A91CAC5FDE6 /* BMKRadarManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRadarManager.h; path = BaiduMapKit/BaiduMapAPI_Radar.framework/Headers/BMKRadarManager.h; sourceTree = ""; }; + 4D2277AF8337A1D2124234F055750FB0 /* libMyLayout.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMyLayout.a; path = libMyLayout.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 4D8FA3DEBAC05AD570B7ED05D853B068 /* libBANetManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBANetManager.a; path = libBANetManager.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 4DC0E904CAB22E6848C0F34024379088 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSBundle+MJRefresh.m"; path = "MJRefresh/NSBundle+MJRefresh.m"; sourceTree = ""; }; + 4E0039B999EEC6CC2BDCD4171B8E22AE /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; + 4E1C889AF5CEC7E1AA2DFCAF565C3BB7 /* MJExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJExtension-dummy.m"; sourceTree = ""; }; + 4ECD915F5623EE5A7BFCD8A9F40327C5 /* MBProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.xcconfig; sourceTree = ""; }; + 4F037546AD903D466E03B855604AB7CB /* BMKFavPoiManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKFavPoiManager.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKFavPoiManager.h; sourceTree = ""; }; + 4F72E022A651D7B44DF817233E2B9BAD /* BMKShareURLSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKShareURLSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareURLSearch.h; sourceTree = ""; }; + 500E8609A7C6478FF93264F69B6822CF /* FBObjectiveCBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCBlock.h; path = FBRetainCycleDetector/Graph/FBObjectiveCBlock.h; sourceTree = ""; }; + 501F7246348435E06E306B3F2556F176 /* NSArray+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+RACSequenceAdditions.h"; path = "ReactiveObjC/NSArray+RACSequenceAdditions.h"; sourceTree = ""; }; + 5031BD94E5D281BDF0FA49E5155AE5A7 /* UIImage+RoundedCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+RoundedCorner.h"; path = "JMRoundedCorner/UIImage+RoundedCorner.h"; sourceTree = ""; }; + 50896F33233684212DC121A645CC89F8 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; + 50AE63C2A06A3695F2DECA8AC0174F4A /* MyLayoutSizeInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutSizeInner.h; path = MyLayout/Lib/MyLayoutSizeInner.h; sourceTree = ""; }; + 514AC273FC24445D83FC5C9F35EB1DED /* View+MASAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "View+MASAdditions.m"; path = "Masonry/View+MASAdditions.m"; sourceTree = ""; }; + 51D5A4EF37208CFAA5FC23E3F946D3D1 /* BAAlert_OC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAAlert_OC.h; path = BAAlert/BAAlert/BAAlert_OC.h; sourceTree = ""; }; + 51EE8FDC050865E076A0BC3230729216 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; + 5222E50B77065D4839E4C83532E2D5CA /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyboardManager/IQKeyboardManager.m; sourceTree = ""; }; + 52B3045903EFF603FFF8BB5D38E69021 /* UINavigationController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+MemoryLeak.h"; path = "MLeaksFinder/UINavigationController+MemoryLeak.h"; sourceTree = ""; }; + 539271E13991BDD44759115BC547CF20 /* RACKVOProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOProxy.m; path = ReactiveObjC/RACKVOProxy.m; sourceTree = ""; }; + 53F0F5DE5C01B7BAA938DA1FF02477B0 /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; + 546019111ACE8E76036065AFB3F53AA2 /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = ""; }; + 55C7EA2D39D172B466546AA4FAE87851 /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; + 56A9A6A83273B2FD3199AD2E2A873124 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = ""; }; + 57788604735687969ACC0021E00446E2 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseAdditions.m; path = src/fmdb/FMDatabaseAdditions.m; sourceTree = ""; }; + 57A035F0B63D38312FB44AEF072DA5B6 /* UICollectionReusableView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionReusableView+RACSignalSupport.m"; path = "ReactiveObjC/UICollectionReusableView+RACSignalSupport.m"; sourceTree = ""; }; + 57FEE02EF51A521F034E03F903606B20 /* BANetManager.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BANetManager.xcconfig; sourceTree = ""; }; + 582AA5CEDA0AAB03312DB0D55EFB9143 /* UIView+RoundedCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+RoundedCorner.h"; path = "JMRoundedCorner/UIView+RoundedCorner.h"; sourceTree = ""; }; + 586379DAA99D75E39F9642AEC8F5E069 /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; + 58A351A36F1D2D1D26BFFB0AEC05A52A /* BAKit_PickerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAKit_PickerView.m; path = BAPickView/BAPickView/BAKit_PickerView.m; sourceTree = ""; }; + 5945F84A6D24CE448DE7D3F7B5ABADD0 /* RACStringSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACStringSequence.h; path = ReactiveObjC/RACStringSequence.h; sourceTree = ""; }; + 5A0D6C50022CF14A826712F5FE73AAB0 /* RACImmediateScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACImmediateScheduler.m; path = ReactiveObjC/RACImmediateScheduler.m; sourceTree = ""; }; + 5A776A1F54D563FA366882864F4773DA /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = ""; }; + 5AAD4883A055A75F1311DE4A805AF105 /* FBBlockInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockInterface.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockInterface.h; sourceTree = ""; }; + 5AE11900CF5483F5F3AE31706C9EA7BC /* BMKOverlayGLBasicView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOverlayGLBasicView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayGLBasicView.h; sourceTree = ""; }; 5B529932F0709F27B7751914DCF639CF /* Pods-BABaseProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject.release.xcconfig"; sourceTree = ""; }; - 5BB20CE80B99FD2CA8B0D10B3A8B42CF /* NSObject+MJCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJCoding.m"; path = "MJExtension/NSObject+MJCoding.m"; sourceTree = ""; }; - 5BB2C01F462AD8F43C95BD5DDC756358 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; - 5BC30B5939D17763233F285D247CC1A2 /* WBHttpRequest+WeiboShare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WBHttpRequest+WeiboShare.h"; path = "Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h"; sourceTree = ""; }; - 5BE7781AE8DE7FDCC3C805497BAB3DC1 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; - 5C1FC3666204DDB5FE1B4D6414F49B5B /* NSURLConnection+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLConnection+BlocksKit.m"; path = "BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.m"; sourceTree = ""; }; - 5C88D0A5210200894B552B2AEBC1BF6E /* NSThread+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSThread+YYAdd.h"; path = "YYKit/Base/Foundation/NSThread+YYAdd.h"; sourceTree = ""; }; - 5CBC0BE73FC27649007FC579ADC89F24 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; - 5D9C07C6CC62412A69CE26A6F6E4B96C /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYKit/Image/YYImage.m; sourceTree = ""; }; - 5E58D4C80227500E1AD4CA3366E0A240 /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = ""; }; - 5E70FFDE2DFDD27F3F2D9EB717EFE9C6 /* MASCompositeConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASCompositeConstraint.h; path = Masonry/MASCompositeConstraint.h; sourceTree = ""; }; - 5F1EE925428FBECEB0E13992AD8C9806 /* FBMemoryProfilerMovableViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerMovableViewController.h; path = FBMemoryProfiler/Window/FBMemoryProfilerMovableViewController.h; sourceTree = ""; }; - 5F397BC56CCE8556249B7D6CC1D44D0B /* YYTextArchiver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextArchiver.m; path = YYKit/Text/String/YYTextArchiver.m; sourceTree = ""; }; - 5F7122E3FC7E1B4583ADA995A6F07103 /* FBObjectiveCGraphElement+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBObjectiveCGraphElement+Internal.h"; path = "FBRetainCycleDetector/Graph/Internal/FBObjectiveCGraphElement+Internal.h"; sourceTree = ""; }; - 5F7C672934FAD3064B3C01587AE90804 /* MyLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MyLayout-dummy.m"; sourceTree = ""; }; - 5F8BA914C2EDBB0166CB02E3C805D3AF /* NSObject+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MemoryLeak.h"; path = "MLeaksFinder/NSObject+MemoryLeak.h"; sourceTree = ""; }; - 5F8FDDEE8AB41BCED3B7BF039D602C67 /* NSData+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+YYAdd.h"; path = "YYKit/Base/Foundation/NSData+YYAdd.h"; sourceTree = ""; }; - 5FD0CC0BD84DBBB4B7AC6B3BBFE39221 /* NSBundle+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+YYAdd.h"; path = "YYKit/Base/Foundation/NSBundle+YYAdd.h"; sourceTree = ""; }; - 5FF6B35F9B556AAC0817BD6310B7E8C2 /* FBAllocationTracker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBAllocationTracker-dummy.m"; sourceTree = ""; }; - 6054FBA7A221AEB09292C9C50B5E707D /* TencentOpenApi_IOS_Bundle.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = TencentOpenApi_IOS_Bundle.bundle; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle; sourceTree = ""; }; - 6059752CFBA687BB6603A3947ED34A49 /* UIScreen+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+YYAdd.h"; path = "YYKit/Base/UIKit/UIScreen+YYAdd.h"; sourceTree = ""; }; - 619BF4D1F233638CB1E7DC0C21E52352 /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = ""; }; - 625FCFAB0AF26ACE41DCE9190963FD10 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.m"; sourceTree = ""; }; - 6297F00AD799E12E9ED2C989B1ABE31B /* MLeakedObjectProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MLeakedObjectProxy.m; path = MLeaksFinder/MLeakedObjectProxy.m; sourceTree = ""; }; - 638F8AABDD62672939B204DD4FE0712C /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; - 63D17970897F3D5A88BDE33EA9F6DDC5 /* FBClassStrongLayoutHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBClassStrongLayoutHelpers.m; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayoutHelpers.m; sourceTree = ""; }; - 649F7DDCB818BF768FAC670A8EB3E5DA /* YYTextRubyAnnotation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextRubyAnnotation.m; path = YYKit/Text/String/YYTextRubyAnnotation.m; sourceTree = ""; }; - 64D21B35395ACCE01347F2543C93E17E /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; - 6509A409EC7C2E72577991AF6C55F12C /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; - 65BC2F9B62FDFEE89297CBF1C49B9A16 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = ""; }; - 6623DF3A6E50A569D2DDEE8F72B79AB8 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = ""; }; - 663231E19B99FD240BB15210ABDDA00A /* FBRetainCycleUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCycleUtils.h; path = FBRetainCycleDetector/FBRetainCycleUtils.h; sourceTree = ""; }; - 67462AA0A44CCE1BA60300302B461C07 /* NSObject+BKBlockExecution.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+BKBlockExecution.m"; path = "BlocksKit/Core/NSObject+BKBlockExecution.m"; sourceTree = ""; }; - 67843B4AFB717DC19EE388507E0E90EA /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYKit/Image/Categories/_YYWebImageSetter.m; sourceTree = ""; }; - 6823FB292EAD4DD5284907E8B4B0D85C /* UMSocialData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialData.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h; sourceTree = ""; }; - 68AC8F4C9B4382DED3A74EE06211EDD2 /* NSTimer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSTimer+YYAdd.h"; path = "YYKit/Base/Foundation/NSTimer+YYAdd.h"; sourceTree = ""; }; - 69100874766624C2B61F4971D9B2A650 /* NSObject+MJClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJClass.h"; path = "MJExtension/NSObject+MJClass.h"; sourceTree = ""; }; - 692F45E832E6A544635CBFF712D6F87C /* MJPropertyKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyKey.m; path = MJExtension/MJPropertyKey.m; sourceTree = ""; }; - 6A05B62AC97E8E1C6C77E3A21F43A25E /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; - 6A867079605A7949AA380F14868603CB /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYKit/Image/YYWebImageManager.h; sourceTree = ""; }; - 6AF1D417786A18366C0E840779866704 /* MASViewAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewAttribute.m; path = Masonry/MASViewAttribute.m; sourceTree = ""; }; + 5B788588778E43455F9CFC1EC1A2240E /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = ""; }; + 5BAFB149D68667A0D6431B76E5783F6F /* BMKBaseComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKBaseComponent.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKBaseComponent.h; sourceTree = ""; }; + 5C0FD2363C19CAAAD2FA740B029FE7D6 /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyboardManager/IQToolbar/IQToolbar.h; sourceTree = ""; }; + 5C1FC93334980F256E0551501D88194C /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; + 5C9F144C211A4FE3634CAD7610176D38 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = ""; }; + 5CA1EECDBF84706387AA49384039D6F3 /* libWeiboSDK.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libWeiboSDK.a; path = UShareSDK/SocialLibraries/Sina/SinaSDK/libWeiboSDK.a; sourceTree = ""; }; + 5CCEE69A9392F2636E8527AC05DFC45E /* libPods-BABaseProject-BABaseProjectTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-BABaseProject-BABaseProjectTests.a"; path = "libPods-BABaseProject-BABaseProjectTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5CD1202CDB22125A7F85E1CEC6FDEFDC /* NSObject+RACDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACDescription.h"; path = "ReactiveObjC/NSObject+RACDescription.h"; sourceTree = ""; }; + 5CF7C8317E4DC25F54F36124B4F3F4B9 /* BAAlert.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = BAAlert.bundle; path = BAAlert/BAAlert/BAAlert.bundle; sourceTree = ""; }; + 5D5D1B65405EBEF3CFFAB2132F25AEE9 /* WeiboSDK.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = WeiboSDK.bundle; path = UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle; sourceTree = ""; }; + 5E048C60C68E30FA69980B9B03FAC8C1 /* NSObject+MJCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJCoding.m"; path = "MJExtension/NSObject+MJCoding.m"; sourceTree = ""; }; + 5E20BF45AC08FB6EBDBD8C26952923C2 /* BATouchID-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BATouchID-prefix.pch"; sourceTree = ""; }; + 5E4C2BD0006A845C1A9BF9A16EFFFC87 /* NSObject+RACPropertySubscribing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACPropertySubscribing.h"; path = "ReactiveObjC/NSObject+RACPropertySubscribing.h"; sourceTree = ""; }; + 5E9B39AE6A97DC7F9350E4CCF94DC025 /* RACBehaviorSubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACBehaviorSubject.m; path = ReactiveObjC/RACBehaviorSubject.m; sourceTree = ""; }; + 5F95358F4A1161C22A88708730F249D4 /* WXApiObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApiObject.h; path = UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApiObject.h; sourceTree = ""; }; + 5FAB0BB99535D38F65234DE1225639F4 /* BATouchID-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BATouchID-dummy.m"; sourceTree = ""; }; + 5FE5FD2FE709C150152C039EFAC5A269 /* libMBProgressHUD.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMBProgressHUD.a; path = libMBProgressHUD.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 601D1FC77A743C7F9FA9AF2A224BCBE5 /* MyRelativeLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyRelativeLayout.h; path = MyLayout/Lib/MyRelativeLayout.h; sourceTree = ""; }; + 603E32B34ED8D61D048F1ECC77FA35EA /* libBATouchID.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBATouchID.a; path = libBATouchID.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 604DD91DD93479E515EC86F456239B04 /* RACSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSequence.h; path = ReactiveObjC/RACSequence.h; sourceTree = ""; }; + 607A7C66490292A0ACAF9ECAED2F9E84 /* UIImage+CompressImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+CompressImage.m"; path = "BANetManager/UIImage+CompressImage.m"; sourceTree = ""; }; + 60C38E834960E437E49AB0F022A25995 /* MyTableLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyTableLayout.m; path = MyLayout/Lib/MyTableLayout.m; sourceTree = ""; }; + 60EADE108E7BBCDA8EE2FE15DDFBBEEB /* RACTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTuple.h; path = ReactiveObjC/RACTuple.h; sourceTree = ""; }; + 60EFCFF863A885BD3632C8E8830B78D1 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; + 61116BBC93B6B5972BD166F712C0D7CC /* RACKVOTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOTrampoline.h; path = ReactiveObjC/RACKVOTrampoline.h; sourceTree = ""; }; + 611A6AC47E613536E9F521DFB600C6B3 /* libcrypto.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libcrypto.a; path = BaiduMapKit/thirdlibs/libcrypto.a; sourceTree = ""; }; + 6144199C55F769BCA18BC97E102C9CA8 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; + 6167BA731EDF1A6183132EE6F7E58E6E /* UIRefreshControl+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+RACCommandSupport.h"; path = "ReactiveObjC/UIRefreshControl+RACCommandSupport.h"; sourceTree = ""; }; + 616AA544CB59F83B5C4BF3AA454C4AF9 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = ""; }; + 6298AC3563BA3FCEB026D19A33B46F0A /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = ""; }; + 62EA6A12CF12D7B25B4CF5288BC3A451 /* RACValueTransformer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACValueTransformer.m; path = ReactiveObjC/RACValueTransformer.m; sourceTree = ""; }; + 631634FC273C56086EE2BDF5C3031136 /* RACTupleSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTupleSequence.h; path = ReactiveObjC/RACTupleSequence.h; sourceTree = ""; }; + 63877C0FACAA04F453ABCFA0FA312457 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; + 63A4033AC2232FE5F6C3307FDC627B6A /* UIView+RoundedCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+RoundedCorner.m"; path = "JMRoundedCorner/UIView+RoundedCorner.m"; sourceTree = ""; }; + 63C82D656CCB8D762D41764A67CCB10A /* UIViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+MemoryLeak.m"; path = "MLeaksFinder/UIViewController+MemoryLeak.m"; sourceTree = ""; }; + 6452F64FB9A4CA603153111E279D02A1 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; + 645FD6BECB7739E2EFF3E953E0E82109 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYCache/YYDiskCache.h; sourceTree = ""; }; + 64DBE5F8BBD92A71E95B851C2CEDCD4C /* FBAssociationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAssociationManager.h; path = FBRetainCycleDetector/Associations/FBAssociationManager.h; sourceTree = ""; }; + 6545DEC6111D42FBAEFB0AA974324C56 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = ""; }; + 65BC33252FCA9058A7D3CFAA47C2E12F /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = ""; }; + 660A7FF695AADDEB5FB5BDD9E27428A1 /* NullSafe.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NullSafe.xcconfig; sourceTree = ""; }; + 663A19FFB2BDB3088FC83BCB69A56988 /* MyLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MyLayout.xcconfig; sourceTree = ""; }; + 66A541E696EFAA079F2073208EEC2ECB /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = ""; }; + 6812CF2D70BAA638A95AE504ACEAEFE8 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; + 683E7F42D8F2F56D9D411895EBF08B0D /* RACArraySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACArraySequence.m; path = ReactiveObjC/RACArraySequence.m; sourceTree = ""; }; + 684A3FEB76F4E44438CFCAFC0B57BB43 /* RACSignalProvider.d */ = {isa = PBXFileReference; includeInIndex = 1; name = RACSignalProvider.d; path = ReactiveObjC/RACSignalProvider.d; sourceTree = ""; }; + 68660D5FE61037C194223DBF5FFC497C /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = ""; }; + 6894BFF390848EB3D17A76D80EECF687 /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyboardManager/IQToolbar/IQToolbar.m; sourceTree = ""; }; + 694836430EB9C8125E7441814F33CA6D /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = ""; }; + 6A329314C9FB7BCFAA04B9A2D9875BF8 /* FBObjectiveCGraphElement.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBObjectiveCGraphElement.mm; path = FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.mm; sourceTree = ""; }; + 6A3EC90B72CC7FF026EB36BCE1E111EA /* RACScheduler+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACScheduler+Private.h"; path = "ReactiveObjC/RACScheduler+Private.h"; sourceTree = ""; }; + 6A619FCF79752BC0D90C35E5AC4F2AF0 /* ReactiveObjC.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReactiveObjC.xcconfig; sourceTree = ""; }; + 6AA7706A9CDC113241DF6C48DE3BC256 /* BMKCloudVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCloudVersion.h; path = BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudVersion.h; sourceTree = ""; }; + 6AE5D6C1898313DA101FC0635D08BE5D /* JMRoundedCorner-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JMRoundedCorner-prefix.pch"; sourceTree = ""; }; + 6AF284593655C892B7FBC584208FC6B3 /* BAButton.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BAButton.xcconfig; sourceTree = ""; }; + 6B0FF9C37F37B7D8E3259D2DD9DE3A4D /* BMKOpenPanorama.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenPanorama.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenPanorama.h; sourceTree = ""; }; + 6B4D40A557A83F29F5D05BEA1BD4B62E /* UShareUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UShareUI.framework; path = UShareSDK/UMSocialUI/UShareUI.framework; sourceTree = ""; }; + 6B563D356738CBFD934E59F1F95F94E6 /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.h"; sourceTree = ""; }; + 6B66727C135F6C84ED97BF4CD305BABE /* BaiduMapAPI_Base.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Base.framework; path = BaiduMapKit/BaiduMapAPI_Base.framework; sourceTree = ""; }; 6B782D01E9282AFC5EE6AA265E4A67B3 /* Pods-BABaseProject-BABaseProjectTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BABaseProject-BABaseProjectTests-dummy.m"; sourceTree = ""; }; - 6BBD3F19020D7F999796C6B139E9DE3A /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = ""; }; - 6C4AA37296DC371F60364CCA133BCD11 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = ""; }; - 6D0B04B18C889689677E529A528E73DD /* YYTextSelectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextSelectionView.m; path = YYKit/Text/Component/YYTextSelectionView.m; sourceTree = ""; }; - 6D1F907ABCD484D40F988C657E03F0B0 /* UIScrollView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+YYAdd.m"; path = "YYKit/Base/UIKit/UIScrollView+YYAdd.m"; sourceTree = ""; }; - 6D7DF41956ADE4579BFC3EBB6EC305C0 /* FBBlockInterface.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockInterface.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockInterface.h; sourceTree = ""; }; - 6DC3F53442B1FFA6CAD55135898D46AF /* YYTextEffectWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextEffectWindow.h; path = YYKit/Text/Component/YYTextEffectWindow.h; sourceTree = ""; }; - 6DE39D822288FA6C2D9F7C07A9E9878B /* FBParsedType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBParsedType.h; path = FBRetainCycleDetector/Layout/Classes/Parser/FBParsedType.h; sourceTree = ""; }; - 6ECD8987A0E823C8C7604793A01C8241 /* WeiboSDK.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = WeiboSDK.bundle; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle; sourceTree = ""; }; - 6F128CD0D57C7E81E7A1492CAB990888 /* WBHttpRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WBHttpRequest.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h; sourceTree = ""; }; - 6F170CD1EEF56260FDAFCAEF342C3FD8 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYKit/Cache/YYDiskCache.m; sourceTree = ""; }; - 6F18192C071EE9D03A49150B2DB5D79E /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = ""; }; - 6F2940E20C7CA58D7F9055821B4681A8 /* FBAllocationTrackerFunctors.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerFunctors.h; path = FBAllocationTracker/FBAllocationTrackerFunctors.h; sourceTree = ""; }; - 6F32A26BA5ECD684E6ACA01840106B5A /* IQUIWindow+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIWindow+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIWindow+Hierarchy.h"; sourceTree = ""; }; - 6F85EB7EE4B021B05D803640358DB6D3 /* NSObject+MJCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJCoding.h"; path = "MJExtension/NSObject+MJCoding.h"; sourceTree = ""; }; - 6F86546053615F891FF780D7C428F9FC /* FBAllocationTrackerHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerHelpers.h; path = FBAllocationTracker/FBAllocationTrackerHelpers.h; sourceTree = ""; }; - 6F988423503EF98F2FEA42F723F4BBE6 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; - 6FD0AFB662E53B304759CE4E844D0056 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = ""; }; - 6FE30B18657E66B3C35FB72276D701BC /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; - 700C3083A6BBF19EF6D5F2E9AB4741ED /* YYThreadSafeArray.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYThreadSafeArray.m; path = YYKit/Utility/YYThreadSafeArray.m; sourceTree = ""; }; - 705959D551DFEBB854801ADC36DB7722 /* FBMemoryProfilerViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerViewController.h; path = FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.h; sourceTree = ""; }; - 7081EA450B46B30A885165B54CB34218 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; - 70871709F538ED14CF03B137C02A8E45 /* libBAButton.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBAButton.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 70E0CDC5287ED1477D52FED16F8384B1 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = ""; }; - 70F7172C3EF8307CDCECBFB57DB8FBC8 /* NSAttributedString+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+YYText.m"; path = "YYKit/Text/String/NSAttributedString+YYText.m"; sourceTree = ""; }; - 712D89FDB34DCFC906C0A3C79E8069DC /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = ""; }; - 7165F04A60BD490969657F34FA562646 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj; sourceTree = ""; }; - 717D3F204D359F39F1BC887FAADFA8BE /* NSMutableOrderedSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableOrderedSet+BlocksKit.h"; path = "BlocksKit/Core/NSMutableOrderedSet+BlocksKit.h"; sourceTree = ""; }; - 71A8121E9635F0DF135166A778D5A0A0 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYKit/Image/YYWebImageOperation.h; sourceTree = ""; }; - 71AEFDF38D5BE23F3414414534BC43A0 /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; - 72076BB438B0C2D1C303AD9C9BA3877B /* MyFloatLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFloatLayout.h; path = MyLayout/Lib/MyFloatLayout.h; sourceTree = ""; }; - 7235BB3AF5AB53B92A66FA087FB37CDC /* UITableView+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+YYAdd.m"; path = "YYKit/Base/UIKit/UITableView+YYAdd.m"; sourceTree = ""; }; - 7255C95DDD6766282731AAE5DD1F9BA2 /* UMSocialLaiwangHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialLaiwangHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h; sourceTree = ""; }; - 72D5E4FF936FFFACB4231B155D93F3F8 /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = ""; }; - 733D195D5D8A97F9FB3309792B338B9E /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = "zh-Hans.lproj"; path = "Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj"; sourceTree = ""; }; - 7385F529ED38C1912C19B342FDE96A95 /* MyBaseLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyBaseLayout.h; path = MyLayout/Lib/MyBaseLayout.h; sourceTree = ""; }; - 73F9BFB28425EEF9A9B802D984362569 /* YYTextSelectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextSelectionView.h; path = YYKit/Text/Component/YYTextSelectionView.h; sourceTree = ""; }; - 7475E787A556032F3057053E1D0C3B45 /* UITextField+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+YYAdd.m"; path = "YYKit/Base/UIKit/UITextField+YYAdd.m"; sourceTree = ""; }; - 74957E39F41DFB9618340045D1FEC5A3 /* NSMutableOrderedSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableOrderedSet+BlocksKit.m"; path = "BlocksKit/Core/NSMutableOrderedSet+BlocksKit.m"; sourceTree = ""; }; - 74AD8C811C96DCEC6EF4EA0FEF7860D8 /* NSCache+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCache+BlocksKit.h"; path = "BlocksKit/DynamicDelegate/Foundation/NSCache+BlocksKit.h"; sourceTree = ""; }; - 74C4A1127781E55DA1D650FBD3FC5F42 /* NSAttributedString+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+YYText.h"; path = "YYKit/Text/String/NSAttributedString+YYText.h"; sourceTree = ""; }; + 6BD2311F3DFB0E781A177965486923EA /* BMKUtilsVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKUtilsVersion.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKUtilsVersion.h; sourceTree = ""; }; + 6C22E55019961FFAFAEDF8E9F5D33484 /* UIView+BAAnimation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+BAAnimation.h"; path = "BAPickView/BAPickView/UIView+BAAnimation.h"; sourceTree = ""; }; + 6CBEAC3E59C031CD31D439847153524D /* RACTuple.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTuple.m; path = ReactiveObjC/RACTuple.m; sourceTree = ""; }; + 6D58D3DF16E86AB3A10C88B0003B6AB5 /* MyLayoutPosInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutPosInner.h; path = MyLayout/Lib/MyLayoutPosInner.h; sourceTree = ""; }; + 6DC6768DB3E2C29BEDF0934C051A9C93 /* MLeakedObjectProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MLeakedObjectProxy.m; path = MLeaksFinder/MLeakedObjectProxy.m; sourceTree = ""; }; + 6EC514F86D7133C8AD208124A04A5A44 /* RACCommand.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACCommand.h; path = ReactiveObjC/RACCommand.h; sourceTree = ""; }; + 6F261D7707DB64FD78317931AB4A9158 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = ""; }; + 6F678A7BE9D389183549EDD18E78D90C /* libYYCache.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libYYCache.a; path = libYYCache.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 6FAA6B66D5265FCD4D66415C9FEAB562 /* BMKDistrictSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKDistrictSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKDistrictSearch.h; sourceTree = ""; }; + 6FC2BE9F229919A94B59ADBD98870EDD /* UICollectionReusableView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionReusableView+RACSignalSupport.h"; path = "ReactiveObjC/UICollectionReusableView+RACSignalSupport.h"; sourceTree = ""; }; + 707663A6256B38642AA63C517F8FA91C /* RACSignalSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSignalSequence.h; path = ReactiveObjC/RACSignalSequence.h; sourceTree = ""; }; + 717EF9B6502DAAF2737CE842DFA5B309 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; + 71CF3E8627FA78B3AB21BC4BED237D8D /* IQUIWindow+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIWindow+Hierarchy.h"; path = "IQKeyboardManager/Categories/IQUIWindow+Hierarchy.h"; sourceTree = ""; }; + 730864ECFC785CF72C5D632B85F70C23 /* FBAssociationManager+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBAssociationManager+Internal.h"; path = "FBRetainCycleDetector/Associations/Internal/FBAssociationManager+Internal.h"; sourceTree = ""; }; + 732854E296B1E6905139F93DCE039E40 /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; + 7362865ECCE7D08788DE8194F276AC64 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; + 73B4622AF4FB0A31A4AA502DAC17EFFF /* RACReturnSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACReturnSignal.h; path = ReactiveObjC/RACReturnSignal.h; sourceTree = ""; }; + 7404FD9BABC3A7C4D989C68E8970534B /* IQKeyboardManager.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.xcconfig; sourceTree = ""; }; + 7410A7410975F9556AF6F71F02D47652 /* BMKAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKAnnotation.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotation.h; sourceTree = ""; }; + 746473F717DB171103D115422967E42C /* UIApplication+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+MemoryLeak.m"; path = "MLeaksFinder/UIApplication+MemoryLeak.m"; sourceTree = ""; }; + 749131B0ED321E1314E55AF2D0E994B6 /* UITouch+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITouch+MemoryLeak.h"; path = "MLeaksFinder/UITouch+MemoryLeak.h"; sourceTree = ""; }; + 74BB721EB50B1A295844955B664314D1 /* UIControl+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+RACSignalSupport.h"; path = "ReactiveObjC/UIControl+RACSignalSupport.h"; sourceTree = ""; }; + 74DEE764CFD162737CE8F57799646803 /* BAAlert_Config.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAAlert_Config.h; path = BAAlert/BAAlert/BAAlert_Config.h; sourceTree = ""; }; 74F2A12B73C7669C548F63641D841D11 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown"; sourceTree = ""; }; - 751D641C448FB0C3D4B2F43B7074C236 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; - 7564C59377A383BAC298FE2550F26887 /* UIBezierPath+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIBezierPath+YYAdd.m"; path = "YYKit/Base/UIKit/UIBezierPath+YYAdd.m"; sourceTree = ""; }; - 75D3ADDCC531A28A9490F845BC3E94BE /* YYFileHash.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFileHash.m; path = YYKit/Utility/YYFileHash.m; sourceTree = ""; }; - 762FABB48476107064393FADD7621295 /* BlocksKit+UIKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BlocksKit+UIKit.h"; path = "BlocksKit/BlocksKit+UIKit.h"; sourceTree = ""; }; - 76830DF4B5E1BC5088F6870CCDD79240 /* A2BlockInvocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A2BlockInvocation.h; path = BlocksKit/DynamicDelegate/A2BlockInvocation.h; sourceTree = ""; }; - 769D05CD721EEA4FFB52AE8D6AFFF199 /* libAFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAFNetworking.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 76B5F9DE17CE07DF617770BCCD60BCA6 /* UMSocialSinaSSOHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSinaSSOHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h; sourceTree = ""; }; - 7708982EC1C7F7B4A4002C2E81A2DE33 /* UIPageViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIPageViewController+MemoryLeak.h"; path = "MLeaksFinder/UIPageViewController+MemoryLeak.h"; sourceTree = ""; }; - 775735A621CBC5820368C236E79718F4 /* FBAssociationManager+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBAssociationManager+Internal.h"; path = "FBRetainCycleDetector/Associations/Internal/FBAssociationManager+Internal.h"; sourceTree = ""; }; - 77CF34DEB06540E223A4E361A2550DAB /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = ""; }; - 7815EC8CFEF112D81BC88DCC35995367 /* libSDAutoLayout.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSDAutoLayout.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 78B9ECC35CC0C5D2CC96B8C51E14EA9B /* UMSocial.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocial.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h; sourceTree = ""; }; - 793F86674E0068BB34C9E8029DE303D2 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = ""; }; - 7981A958E01F7C1D3E1D4F9B157700BA /* YYTextUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextUtilities.h; path = YYKit/Text/String/YYTextUtilities.h; sourceTree = ""; }; - 79CE0562E0D8BD6903CEF607CCA7E330 /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSBundle+MJRefresh.h"; path = "MJRefresh/NSBundle+MJRefresh.h"; sourceTree = ""; }; - 79F6961AD9825205FB7AC820975DE4AF /* FBMemoryProfilerDeviceUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerDeviceUtils.m; path = FBMemoryProfiler/Utils/FBMemoryProfilerDeviceUtils.m; sourceTree = ""; }; - 7A2D8406C9CB2B3A8BD0E36806BBF64D /* FBParsedStruct.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBParsedStruct.m; path = FBRetainCycleDetector/Layout/Classes/Parser/FBParsedStruct.m; sourceTree = ""; }; + 7599DE7539EB395DB0996D54DFA9FB50 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; + 75E79D98DE90159CB40167CCF0D3C206 /* RACQueueScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACQueueScheduler.m; path = ReactiveObjC/RACQueueScheduler.m; sourceTree = ""; }; + 75FBD28615A2702D829B9617A5C4279C /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = ""; }; + 763520CC236743BC9BFF34E1D68E25A9 /* BAKit_TouchID.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAKit_TouchID.m; path = BATouchID/BATouchID/BAKit_TouchID.m; sourceTree = ""; }; + 765E7F28BA6619A94CF2C0F1D1EE621F /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; + 77020299ACF56CE92483C8719318CE4A /* UIImage+CompressImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+CompressImage.h"; path = "BANetManager/UIImage+CompressImage.h"; sourceTree = ""; }; + 770EE84C2D12D89088B1400460903F3C /* RACDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDisposable.m; path = ReactiveObjC/RACDisposable.m; sourceTree = ""; }; + 7749FA9768C0B4098EF0400CDF294203 /* libMJRefresh.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMJRefresh.a; path = libMJRefresh.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 7811BB681DF349D0BE4EDD6CFE2EE56A /* BMKGeneralDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGeneralDelegate.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKGeneralDelegate.h; sourceTree = ""; }; + 7821C3C11EE680BDBCDA4B31D647A7BD /* MyPathLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyPathLayout.m; path = MyLayout/Lib/MyPathLayout.m; sourceTree = ""; }; + 78989D891E2977559FAFFA4573846FFE /* BAPickView_Config.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAPickView_Config.h; path = BAPickView/BAPickView/BAPickView_Config.h; sourceTree = ""; }; + 78AA4C06C28E1562EA304CCC6FD497EB /* FBStructEncodingParser.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBStructEncodingParser.mm; path = FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm; sourceTree = ""; }; + 78C1568783AD9BEFBF0F76813BC26239 /* BANetManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BANetManager.m; path = BANetManager/BANetManager.m; sourceTree = ""; }; + 79478BCFBD5CA079DBEAF71201EA144E /* BMKMapManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMapManager.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKMapManager.h; sourceTree = ""; }; + 79DB9BCC449DA5BFF0A8074105F999C7 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = ""; }; + 7A618BF26B9A80D3691D22FE02234F00 /* FBRetainCycleDetector.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBRetainCycleDetector.xcconfig; sourceTree = ""; }; + 7A9E18A61560925625AC94CAEF61B367 /* NSObject+RACPropertySubscribing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACPropertySubscribing.m"; path = "ReactiveObjC/NSObject+RACPropertySubscribing.m"; sourceTree = ""; }; + 7ABBA38B18A6F0FE7EAA982E3281C6F4 /* RACEXTRuntimeExtensions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTRuntimeExtensions.h; path = ReactiveObjC/extobjc/RACEXTRuntimeExtensions.h; sourceTree = ""; }; + 7AD0CD4FE367AC1CB35C31ED86FB204B /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; 7AE02BDEE3F33785A9C42C59CD77B6F8 /* Pods-BABaseProject-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BABaseProject-acknowledgements.markdown"; sourceTree = ""; }; - 7B140DE3A9081AB2EFB0E6D41AA7F0FC /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; - 7B4E044D2F5F2C391F1DF56FB7519D30 /* UIPasteboard+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIPasteboard+YYText.m"; path = "YYKit/Text/String/UIPasteboard+YYText.m"; sourceTree = ""; }; - 7B6C8A4888C7CF99D2AD9BCA9D9D5D72 /* FBAssociationManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAssociationManager.mm; path = FBRetainCycleDetector/Associations/FBAssociationManager.mm; sourceTree = ""; }; - 7B76F296A3C646F332E6530AD4E84E33 /* libJMRoundedCorner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJMRoundedCorner.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 7B829A03D07E44A405920D9E1937F356 /* FBMemoryProfilerTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerTextField.m; path = FBMemoryProfiler/UI/FBMemoryProfilerTextField.m; sourceTree = ""; }; - 7C459B7082D82C38F339BD9329FD10F0 /* MyFrameLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFrameLayout.m; path = MyLayout/Lib/MyFrameLayout.m; sourceTree = ""; }; - 7D77B13981F2C3CD8D38863868755197 /* MFMailComposeViewController+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MFMailComposeViewController+BlocksKit.h"; path = "BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.h"; sourceTree = ""; }; - 7E9DC50517CE63365DD9C4AD3D4628FF /* YYTextUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextUtilities.m; path = YYKit/Text/String/YYTextUtilities.m; sourceTree = ""; }; - 7FAB178DCC346DD357F6185649270335 /* WBSDKCommentButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WBSDKCommentButton.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h; sourceTree = ""; }; - 7FB4B5260A762969A24BF67D414EF643 /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreImage.framework; sourceTree = DEVELOPER_DIR; }; - 7FF9EAD699F096BFB75E1AA6B54A670B /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYKit/Image/YYImageCache.h; sourceTree = ""; }; - 80282B48EA9DC88F386E733783F1476C /* NSParagraphStyle+YYText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSParagraphStyle+YYText.m"; path = "YYKit/Text/String/NSParagraphStyle+YYText.m"; sourceTree = ""; }; - 80496A5A3F411AD5B449D4E4A41EA4EA /* UMSocialWechatHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialWechatHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h; sourceTree = ""; }; - 80E6E508E14B96347CA93307FBBF80F5 /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYKit/Image/Categories/CALayer+YYWebImage.m"; sourceTree = ""; }; - 8129DE49A32FA7F798E44444D0ABEC7C /* APOpenAPI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = APOpenAPI.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h; sourceTree = ""; }; - 81BDDFDE6ABEABDB18A477150F4049F2 /* UIView+RoundedCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+RoundedCorner.m"; path = "JMRoundedCorner/UIView+RoundedCorner.m"; sourceTree = ""; }; - 81D26EC2ADFBC40AD044725AEF390A44 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; - 8242AFF25B2FC27DB1504F6D7D610492 /* MASViewAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewAttribute.h; path = Masonry/MASViewAttribute.h; sourceTree = ""; }; - 826787965C74AE11FB4772C5ECF0F4A0 /* FBRetainCycleDetector.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBRetainCycleDetector.mm; path = FBRetainCycleDetector/Detector/FBRetainCycleDetector.mm; sourceTree = ""; }; - 8296F65452B28EC27F69D8356CA906A1 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = ""; }; - 82A20F9D5364FC95F216E1FF145F9AF7 /* JMRoundedCorner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JMRoundedCorner-dummy.m"; sourceTree = ""; }; - 839B1D07B3D16057E8A03A0C347E6D8A /* MyLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayout.h; path = MyLayout/Lib/MyLayout.h; sourceTree = ""; }; - 83C22E37D16F166B00D45DADBA4BB65E /* MBProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MBProgressHUD.xcconfig; sourceTree = ""; }; - 84F3FDF92C92BDB11D471B0CFFC7E5B9 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = ""; }; - 857C64E85EF33EB0C0DDB7CF9DA86EEB /* NSDate+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+YYAdd.m"; path = "YYKit/Base/Foundation/NSDate+YYAdd.m"; sourceTree = ""; }; - 85EB35C3772EA46EB9FB7F38672CF542 /* UIApplication+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+YYAdd.m"; path = "YYKit/Base/UIKit/UIApplication+YYAdd.m"; sourceTree = ""; }; - 860442C37308B9FF41C8CE2917F66F82 /* UIApplication+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+YYAdd.h"; path = "YYKit/Base/UIKit/UIApplication+YYAdd.h"; sourceTree = ""; }; - 869B45B936CD39EA123E85D842443321 /* UMSocialLineHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialLineHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h; sourceTree = ""; }; - 87041701DDC2AF6EF53484A6FB3CEBDF /* UIWebView+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+BlocksKit.h"; path = "BlocksKit/UIKit/UIWebView+BlocksKit.h"; sourceTree = ""; }; - 8704C9169749B9511D62A5FA035BAF84 /* fishhook.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fishhook.h; path = fishhook/fishhook.h; sourceTree = ""; }; - 871BFF58AD76397C230BF88813DA3552 /* YYKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYKit-dummy.m"; sourceTree = ""; }; - 875F92012D8F29A99AD9E203968B2440 /* FBMemoryProfiler-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBMemoryProfiler-dummy.m"; sourceTree = ""; }; - 8783D880D8711CB50035F442FD3681BE /* MyLinearLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLinearLayout.h; path = MyLayout/Lib/MyLinearLayout.h; sourceTree = ""; }; - 87F164C0C76BEAD58EDE33382298F4C6 /* UIControl+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+YYAdd.h"; path = "YYKit/Base/UIKit/UIControl+YYAdd.h"; sourceTree = ""; }; - 87F50D2DBB0272E5F1F817513CA465D6 /* UIViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+MemoryLeak.m"; path = "MLeaksFinder/UIViewController+MemoryLeak.m"; sourceTree = ""; }; - 8839C0CD56C3B30D8E1A8127160276BC /* NSObject+YYAddForKVO.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAddForKVO.h"; path = "YYKit/Base/Foundation/NSObject+YYAddForKVO.h"; sourceTree = ""; }; - 88947793ADF905B9663533EABD764FDE /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; - 89EE531FEBACAC381FBD105FAC596020 /* YYKitMacro.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKitMacro.h; path = YYKit/Base/YYKitMacro.h; sourceTree = ""; }; - 8AA6FD772C40D71000A74E09ACC3BCB1 /* NSDate+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDate+YYAdd.h"; path = "YYKit/Base/Foundation/NSDate+YYAdd.h"; sourceTree = ""; }; - 8AB281AF7F097B86A46F7B8536C2EA38 /* MASViewConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASViewConstraint.h; path = Masonry/MASViewConstraint.h; sourceTree = ""; }; - 8B37F82FBCD2C7C3E0AFB366268E430D /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = ""; }; - 8B76BDFF0474131CBE95A81BF59E259C /* FBIvarReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBIvarReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBIvarReference.h; sourceTree = ""; }; - 8B8615E890C3DDBA5C376AEDEBD92771 /* YYLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYLabel.h; path = YYKit/Text/YYLabel.h; sourceTree = ""; }; - 8BBC3986DFEFC61B94AAC7474F917747 /* MFMessageComposeViewController+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MFMessageComposeViewController+BlocksKit.h"; path = "BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.h"; sourceTree = ""; }; - 8C3E87311FC436EF7C702045B4E3694B /* MyLayoutDime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutDime.h; path = MyLayout/Lib/MyLayoutDime.h; sourceTree = ""; }; - 8C5B5FD6E8E85386F12D5FC11C9400DC /* NullSafe.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = NullSafe.xcconfig; sourceTree = ""; }; - 8D2DE91AD22A519E77A093C40560B2FC /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; + 7BD75221D5D39FAB91CA933F7BB0A516 /* BMKGeocodeSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGeocodeSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearch.h; sourceTree = ""; }; + 7BD9CA6229D0C6AF61ED4CAFCFE388C1 /* FBRetainCycleUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBRetainCycleUtils.m; path = FBRetainCycleDetector/FBRetainCycleUtils.m; sourceTree = ""; }; + 7C53401DF672DEFCFD1E60FCB433057B /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = ""; }; + 7CB0D7512A834348177D062F006911E3 /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYCache/YYMemoryCache.h; sourceTree = ""; }; + 7D833929A098FC5A369CD580C0C5ADDB /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = ""; }; + 7DC6BD0551CDD697D319D154721BD26F /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = ""; }; + 7DEBF836F6DD01FC160403BBF725B8F2 /* RACSubscriptionScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriptionScheduler.m; path = ReactiveObjC/RACSubscriptionScheduler.m; sourceTree = ""; }; + 7EDCA3440551E5C2C770A322ABE1F3B5 /* RACEvent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEvent.m; path = ReactiveObjC/RACEvent.m; sourceTree = ""; }; + 7EEF7A0CC60C23BB5B5E5E766F63AB82 /* NSOrderedSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSOrderedSet+RACSequenceAdditions.h"; path = "ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h"; sourceTree = ""; }; + 806C000E5B0069D4772442AD7EAC9F16 /* RACQueueScheduler+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACQueueScheduler+Subclass.h"; path = "ReactiveObjC/RACQueueScheduler+Subclass.h"; sourceTree = ""; }; + 80A10BA1C35D53F01346A73D5910FB6C /* FBObjectiveCNSCFTimer.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBObjectiveCNSCFTimer.mm; path = FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm; sourceTree = ""; }; + 80AB726B9C6929C89B92052F1FC43942 /* MyFrameLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFrameLayout.m; path = MyLayout/Lib/MyFrameLayout.m; sourceTree = ""; }; + 8114510368988128AE3ED5A0656960A0 /* BAPickView.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = BAPickView.bundle; path = BAPickView/BAPickView/BAPickView.bundle; sourceTree = ""; }; + 811A0E1051557C4254EF3DA722799C17 /* Struct.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Struct.h; path = FBRetainCycleDetector/Layout/Classes/Parser/Struct.h; sourceTree = ""; }; + 819D80F6962C1B9787DC879384BFEABF /* UMSocialCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UMSocialCore.framework; path = UShareSDK/UMSocialSDK/UMSocialCore.framework; sourceTree = ""; }; + 8211444BEDDE5D0F1A36B11E6A9E7F46 /* BAActionSheet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAActionSheet.m; path = BAAlert/BAAlert/BAActionSheet.m; sourceTree = ""; }; + 82C1375F6DDA6BD2AED2D49ED6B30063 /* BMKGeocodeType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGeocodeType.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeType.h; sourceTree = ""; }; + 82EAAEC10A1168277E065755D0E6A828 /* fishhook.c */ = {isa = PBXFileReference; includeInIndex = 1; name = fishhook.c; path = fishhook/fishhook.c; sourceTree = ""; }; + 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 833A2F19E32FDAF1C33E1CF49FA8FD5A /* BAAlert-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BAAlert-dummy.m"; sourceTree = ""; }; + 83FA8D8C61EFB1CB2D49B34CB9628D50 /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.m; sourceTree = ""; }; + 8412A09C5134434A5730A730A228A42A /* WeiboSDK+Statistics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WeiboSDK+Statistics.h"; path = "UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK+Statistics.h"; sourceTree = ""; }; + 8494FA7602B009EC978E97801C051491 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = ""; }; + 8541664168DE1FB96B78AEA67B4E9762 /* BMKGeometry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGeometry.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKGeometry.h; sourceTree = ""; }; + 8587B77D25616B82EE6965223D5C7596 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; + 85A99A944259EBFC0F1553375D3F6612 /* BMKPolygonView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPolygonView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolygonView.h; sourceTree = ""; }; + 85C21791B4C733B9D460DE01E9E72D6F /* UITextField+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextField+RACSignalSupport.m"; path = "ReactiveObjC/UITextField+RACSignalSupport.m"; sourceTree = ""; }; + 85DBC14E01134FDC92D40BCBB179E981 /* RACArraySequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACArraySequence.h; path = ReactiveObjC/RACArraySequence.h; sourceTree = ""; }; + 865D673BCE6FB3E9605BCD7388A34C25 /* RACKVOProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOProxy.h; path = ReactiveObjC/RACKVOProxy.h; sourceTree = ""; }; + 878A0CC02C1009C8B07BB6C0F2F4B102 /* MJFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJFoundation.h; path = MJExtension/MJFoundation.h; sourceTree = ""; }; + 87C396456C1DBF225EE521F037BC5DBD /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+EmptyDataSet.m"; path = "Source/UIScrollView+EmptyDataSet.m"; sourceTree = ""; }; + 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 88659FC1DC25EC4D2F844E6E43EC9446 /* BaiduMapAPI_Location.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Location.framework; path = BaiduMapKit/BaiduMapAPI_Location.framework; sourceTree = ""; }; + 88E82E59CEAB24CE906DF78CE4C4355A /* BMKGradient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGradient.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGradient.h; sourceTree = ""; }; + 891159984927FE3C67C5053C5D7D3417 /* UIBarButtonItem+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+RACCommandSupport.h"; path = "ReactiveObjC/UIBarButtonItem+RACCommandSupport.h"; sourceTree = ""; }; + 892E35422B2B31502870054B9D4FAF4F /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; + 897593CBCD4B76599686072FC18497B9 /* UITabBarController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITabBarController+MemoryLeak.m"; path = "MLeaksFinder/UITabBarController+MemoryLeak.m"; sourceTree = ""; }; + 89A0A131F0363897C5566635EB56DC6E /* libFMDB.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFMDB.a; path = libFMDB.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 8A63FE6C1793D8EFF15F5E6994CE398A /* MLeaksMessenger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MLeaksMessenger.m; path = MLeaksFinder/MLeaksMessenger.m; sourceTree = ""; }; + 8A820BC42588ED20A7DA9742723911D5 /* FBObjectiveCBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectiveCBlock.m; path = FBRetainCycleDetector/Graph/FBObjectiveCBlock.m; sourceTree = ""; }; + 8B2FD174879A4D1EDC30B115E5E67D7E /* RACSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSequence.m; path = ReactiveObjC/RACSequence.m; sourceTree = ""; }; + 8B76D18B532E5127E5658D8CAE0FB6CC /* FBObjectiveCObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCObject.h; path = FBRetainCycleDetector/Graph/FBObjectiveCObject.h; sourceTree = ""; }; + 8C878A78D0FD9A773A3E231BBC089A2C /* MyDimeScale.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyDimeScale.m; path = MyLayout/Lib/MyDimeScale.m; sourceTree = ""; }; + 8C8A30C8501539568BD49BA7D62A8CB4 /* BAAlert-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BAAlert-prefix.pch"; sourceTree = ""; }; + 8C9BBCDCE898BCA27F91DAE1DBEF4371 /* BMKMapView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMapView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapView.h; sourceTree = ""; }; + 8CDD582B3956B1DBB30BB4F23AF988C4 /* BMKSearchComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKSearchComponent.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchComponent.h; sourceTree = ""; }; + 8CECD2D7749000CD5709068588846623 /* RACIndexSetSequence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACIndexSetSequence.h; path = ReactiveObjC/RACIndexSetSequence.h; sourceTree = ""; }; + 8D1D993ABB12AC1ACE1D7D82E8826BE4 /* MJPropertyType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyType.h; path = MJExtension/MJPropertyType.h; sourceTree = ""; }; + 8D60DB510C4CF8E8BDA17CE4E68AD3E9 /* MJPropertyKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyKey.h; path = MJExtension/MJPropertyKey.h; sourceTree = ""; }; + 8D7453F6D71E2125AC8396C094D80724 /* RACReturnSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACReturnSignal.m; path = ReactiveObjC/RACReturnSignal.m; sourceTree = ""; }; + 8D7B07227B08E988A109D3E720F61437 /* NSString+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACSequenceAdditions.h"; path = "ReactiveObjC/NSString+RACSequenceAdditions.h"; sourceTree = ""; }; + 8DFB5DC253A0AE52D64C85AE05761D94 /* RACMulticastConnection+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACMulticastConnection+Private.h"; path = "ReactiveObjC/RACMulticastConnection+Private.h"; sourceTree = ""; }; 8E038A6E85654AE5656DB97C353FB4B1 /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject-BABaseProjectTests.release.xcconfig"; sourceTree = ""; }; - 8E6695B9B3C95B89F49A536147248151 /* NSURLConnection+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLConnection+BlocksKit.h"; path = "BlocksKit/DynamicDelegate/Foundation/NSURLConnection+BlocksKit.h"; sourceTree = ""; }; - 8E6B2D615813A8450489502242E3AB11 /* MyMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyMaker.h; path = MyLayout/Lib/MyMaker.h; sourceTree = ""; }; - 8EAFE6CCB7BAD0352093AF27365BAE8F /* YYKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKit.h; path = YYKit/YYKit.h; sourceTree = ""; }; - 8F192F3381307CF70B3205D104DF44C6 /* NSArray+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+BlocksKit.h"; path = "BlocksKit/Core/NSArray+BlocksKit.h"; sourceTree = ""; }; - 9014ACEC790E3A7FC3319498B0DA3286 /* YYTextContainerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextContainerView.h; path = YYKit/Text/Component/YYTextContainerView.h; sourceTree = ""; }; - 90F2739D5E8E6919B21D8B70C2B23960 /* UMSocialTwitterHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialTwitterHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h; sourceTree = ""; }; - 91027CB4857D928D1CA9C81DE21FA2AB /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; - 9107142D5A508CE3517BC71013C652F8 /* BlocksKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BlocksKit-dummy.m"; sourceTree = ""; }; - 917DAC8E0F01BF248C4086298E220215 /* FBRetainCycleDetector-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBRetainCycleDetector-prefix.pch"; sourceTree = ""; }; - 9203095B5298625FA1E60CF69A48CE89 /* UIApplication+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+MemoryLeak.h"; path = "MLeaksFinder/UIApplication+MemoryLeak.h"; sourceTree = ""; }; - 9235FCE9082CA58ACD63B241E9291D86 /* UIImage+RoundedCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+RoundedCorner.h"; path = "JMRoundedCorner/UIImage+RoundedCorner.h"; sourceTree = ""; }; - 923A2546B5E5BFF17D052183DD1FCF59 /* FBAllocationTrackerImpl.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAllocationTrackerImpl.mm; path = FBAllocationTracker/FBAllocationTrackerImpl.mm; sourceTree = ""; }; - 923EB90555F006B695B21B1EF92A0829 /* IQPreviousNextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQPreviousNextView.h; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.h; sourceTree = ""; }; - 926D0824BBAF28B0096FAEDF16DEC917 /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYKit/Cache/YYMemoryCache.h; sourceTree = ""; }; - 92E909620553250D700F6E1F7F566FE1 /* FBMemoryProfilerPresentationModeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerPresentationModeDelegate.h; path = FBMemoryProfiler/FBMemoryProfilerPresentationModeDelegate.h; sourceTree = ""; }; - 92F23CB6F24D0FE317530DD0838A393F /* YYGestureRecognizer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYGestureRecognizer.m; path = YYKit/Utility/YYGestureRecognizer.m; sourceTree = ""; }; - 93264B354E37C0A94E976DFF6F868698 /* libFBRetainCycleDetector.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBRetainCycleDetector.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 93735590AFFF95840B7DF9F446B23CA4 /* MyDimeScale.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyDimeScale.m; path = MyLayout/Lib/MyDimeScale.m; sourceTree = ""; }; - 93951F5F071C7963E58277CD1B025BDB /* FBRetainCycleDetector-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBRetainCycleDetector-dummy.m"; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9424C0FAFC3EAD474CB870C47C481C80 /* NSObject+A2DynamicDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+A2DynamicDelegate.h"; path = "BlocksKit/DynamicDelegate/NSObject+A2DynamicDelegate.h"; sourceTree = ""; }; - 944B1C22925735F8881138F7DA2A23AA /* FBMemoryProfilerMathUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerMathUtils.h; path = FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.h; sourceTree = ""; }; - 948471C315238EB01AC87CD838D9A085 /* MyLayoutSizeClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutSizeClass.h; path = MyLayout/Lib/MyLayoutSizeClass.h; sourceTree = ""; }; - 94A7759DD55D96042DD24572E5A81971 /* NSMutableArray+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+BlocksKit.h"; path = "BlocksKit/Core/NSMutableArray+BlocksKit.h"; sourceTree = ""; }; - 94B4B1BE232BD6FB20C7D21E665C5256 /* FBStandardGraphEdgeFilters.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBStandardGraphEdgeFilters.h; path = FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.h; sourceTree = ""; }; - 94CFF896F4E504B1F472DA414AE7B129 /* FBObjectiveCNSCFTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCNSCFTimer.h; path = FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.h; sourceTree = ""; }; - 9520E1D6180B291AA5CCD95D10179016 /* MyBaseLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyBaseLayout.m; path = MyLayout/Lib/MyBaseLayout.m; sourceTree = ""; }; - 952FCA31B82E17C8E6256A933FBAF018 /* NSObject+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MemoryLeak.m"; path = "MLeaksFinder/NSObject+MemoryLeak.m"; sourceTree = ""; }; - 958A71E7B0AE9F777DE7B830F9DC4E78 /* YYTextDebugOption.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextDebugOption.m; path = YYKit/Text/Component/YYTextDebugOption.m; sourceTree = ""; }; - 95AD9C8E76E8D9A174F7FEA1000355D7 /* YYSentinel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSentinel.m; path = YYKit/Utility/YYSentinel.m; sourceTree = ""; }; - 95E2F474CF8CC4926A38DC930677D4C4 /* FBRetainCyclePresenter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCyclePresenter.h; path = FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.h; sourceTree = ""; }; - 961F876747EC9A1D5E32BE45FE644EE0 /* FBMemoryProfilerPresenting.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerPresenting.h; path = FBMemoryProfiler/Controllers/FBMemoryProfilerPresenting.h; sourceTree = ""; }; - 96BB5011113C71D8709B3540360F4927 /* MLeaksMessenger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeaksMessenger.h; path = MLeaksFinder/MLeaksMessenger.h; sourceTree = ""; }; + 8E0B83129C843D9FB6FDA7B950F2CFC1 /* MyDimeScale.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyDimeScale.h; path = MyLayout/Lib/MyDimeScale.h; sourceTree = ""; }; + 8E933D8EB276BA8E1EA27AA968EAD2C5 /* BMKPoiSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPoiSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchOption.h; sourceTree = ""; }; + 8F0DE6243A4F4E4CF6FD3AC7401DE61C /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = ""; }; + 8F1A97C3E62A6002537A8A074EF7141B /* MLeaksFinder-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MLeaksFinder-prefix.pch"; sourceTree = ""; }; + 8F3396B1101111F2E3244D6E74F99676 /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJRefresh.m"; path = "MJRefresh/UIScrollView+MJRefresh.m"; sourceTree = ""; }; + 8F87BCBF3538C417F466EDB238BCFE42 /* RACPassthroughSubscriber.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACPassthroughSubscriber.m; path = ReactiveObjC/RACPassthroughSubscriber.m; sourceTree = ""; }; + 8FAD3EAA8397C4E7B02110BABD7E001E /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = ""; }; + 8FB67143512F86955CBD2E22A4415075 /* BMKPolyline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPolyline.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolyline.h; sourceTree = ""; }; + 90018A503A8CEE50B82FEFC8C5B1717F /* UISlider+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISlider+RACSignalSupport.m"; path = "ReactiveObjC/UISlider+RACSignalSupport.m"; sourceTree = ""; }; + 903FAE1A6ADAC6BC1744F51EBC11DD78 /* RACmetamacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACmetamacros.h; path = ReactiveObjC/extobjc/RACmetamacros.h; sourceTree = ""; }; + 9073C5E0EBACF5E0496567B2612BD7CD /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+MJExtension.h"; path = "MJRefresh/UIView+MJExtension.h"; sourceTree = ""; }; + 90B474AD58E8F15B1D8417320883AE1E /* RACSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSignal.h; path = ReactiveObjC/RACSignal.h; sourceTree = ""; }; + 9110FDB20B06A0A2EA84A9A8FF75D449 /* libSocialSina.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libSocialSina.a; path = UShareSDK/SocialLibraries/Sina/libSocialSina.a; sourceTree = ""; }; + 91B9D00466ADF96D063A8AD391D42445 /* RACTestScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTestScheduler.m; path = ReactiveObjC/RACTestScheduler.m; sourceTree = ""; }; + 92E91E0FE6F2414A1E43D65DD3F9BABF /* FBRetainCycleDetector-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBRetainCycleDetector-prefix.pch"; sourceTree = ""; }; + 93234A36AA4E82B5500A13B523BBF26C /* FBObjectiveCGraphElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCGraphElement.h; path = FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h; sourceTree = ""; }; + 934817E4C51481753208D8043FF8A696 /* MyFlowLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFlowLayout.m; path = MyLayout/Lib/MyFlowLayout.m; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 93AFB7B99EC71CD1AC1A9AC6A2F12A4B /* BATouchID.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BATouchID.xcconfig; sourceTree = ""; }; + 93BDCF3B3DA900A5EFB80DC0A6525E4D /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = ""; }; + 9448E64F97FD9307451B66E172594356 /* FBStructEncodingParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBStructEncodingParser.h; path = FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.h; sourceTree = ""; }; + 950937E9BA2BCBC2C1BD03E39A9D5A6E /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; + 95313961CC052A5A1DA2C2AA063946F2 /* BAKit_PickerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAKit_PickerView.h; path = BAPickView/BAPickView/BAKit_PickerView.h; sourceTree = ""; }; + 95850DA30F2BB1B84D94C6178972F6A7 /* FBIvarReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBIvarReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBIvarReference.h; sourceTree = ""; }; + 95D186B0F2495965B4BFD9829ED50B0C /* RACScheduler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACScheduler.m; path = ReactiveObjC/RACScheduler.m; sourceTree = ""; }; + 95DD5559CEE54A435CB8CB7CEC5D5A0A /* MJPropertyType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyType.m; path = MJExtension/MJPropertyType.m; sourceTree = ""; }; + 95E1DFAE51D038FC0CAE0D81305B130C /* UIButton+BAKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+BAKit.m"; path = "BAButton/BAButton/UIButton+BAKit.m"; sourceTree = ""; }; + 963D9B5691C4810E959EDAB45BD9784B /* NSFileHandle+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileHandle+RACSupport.h"; path = "ReactiveObjC/NSFileHandle+RACSupport.h"; sourceTree = ""; }; + 96A44317869D4232F074010DF2DB49BB /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; + 96C97AD37C37A32AF7ADC0E0AFFC6346 /* MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJProperty.h; path = MJExtension/MJProperty.h; sourceTree = ""; }; + 96CC5897E6848EB5C09E6C1FD2CD5C01 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; 96E8B655AACCAB7E846D22DC0C30768E /* Pods-BABaseProject-BABaseProjectUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject-BABaseProjectUITests.release.xcconfig"; sourceTree = ""; }; - 970C7F34BB8C96A56778E6BF049B56C0 /* FBStandardGraphEdgeFilters.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBStandardGraphEdgeFilters.mm; path = FBRetainCycleDetector/Filtering/FBStandardGraphEdgeFilters.mm; sourceTree = ""; }; + 9729CD39D764C290A8EFFAFC0616B9F1 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = ""; }; + 9731009AFEAF56AACDFB8E681EF551A8 /* NSObject+MJClass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJClass.h"; path = "MJExtension/NSObject+MJClass.h"; sourceTree = ""; }; 9791B7B4E06C573F3E1F36B0BFBAF3D9 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BABaseProject-BABaseProjectUITests-dummy.m"; sourceTree = ""; }; - 9837A57BA5AF03815FE5F5F17770E66C /* JMRoundedCorner.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JMRoundedCorner.xcconfig; sourceTree = ""; }; - 98583DB893E2EDF2D9D0C128CF424174 /* UIActionSheet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActionSheet+BlocksKit.m"; path = "BlocksKit/UIKit/UIActionSheet+BlocksKit.m"; sourceTree = ""; }; - 988F0FBE5674D696A763BEAF088DAA6D /* WebViewJavascriptBridge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WebViewJavascriptBridge-dummy.m"; sourceTree = ""; }; - 98AC747293657DCADD5813E7316742A0 /* BlocksKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BlocksKit-prefix.pch"; sourceTree = ""; }; - 98B1A8BD171C4B54346E5539A6ADD6BB /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = ""; }; - 994B9E99765090AE0C2D983A36F212A6 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.h"; sourceTree = ""; }; - 997DED83CBD78DC92D4F73157CABD8E8 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = ""; }; - 998A73EF5B4DE379B44CE605DB3BF0A5 /* YYTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextView.m; path = YYKit/Text/YYTextView.m; sourceTree = ""; }; - 99F4E6FE6699D8C9B460C64255BB9171 /* NSInvocation+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSInvocation+BlocksKit.h"; path = "BlocksKit/Core/NSInvocation+BlocksKit.h"; sourceTree = ""; }; - 9A03F24619F5E0512F446C207336C0F3 /* UIGestureRecognizer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIGestureRecognizer+YYAdd.m"; path = "YYKit/Base/UIKit/UIGestureRecognizer+YYAdd.m"; sourceTree = ""; }; - 9AA694E8AA0C8EBA5F843A31E3BC16DC /* UMSLoginViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSLoginViewController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib; sourceTree = ""; }; - 9AEA72FD754A2831F570E82ED44CCD4A /* YYThreadSafeDictionary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYThreadSafeDictionary.h; path = YYKit/Utility/YYThreadSafeDictionary.h; sourceTree = ""; }; - 9B989E586DE2640D8734F40813759F08 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = ""; }; - 9BABD48B48F3AF368E6FCA862B2E58E0 /* UIView+RoundedCorner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+RoundedCorner.h"; path = "JMRoundedCorner/UIView+RoundedCorner.h"; sourceTree = ""; }; - 9C0A0E60E1C974F0B9E46B8B706F3565 /* JMRoundedCorner-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JMRoundedCorner-prefix.pch"; sourceTree = ""; }; - 9C5E7C8B7FEB277772CD5DB310738395 /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYKit/Image/YYFrameImage.h; sourceTree = ""; }; - 9C70056B483458E7104305C91241DE75 /* UITabBarController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITabBarController+MemoryLeak.m"; path = "MLeaksFinder/UITabBarController+MemoryLeak.m"; sourceTree = ""; }; - 9CA0A2BFC5C36CC35B6052E3CE91D5F8 /* MyLayoutDef.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutDef.h; path = MyLayout/Lib/MyLayoutDef.h; sourceTree = ""; }; - 9CC9442DC0E5812B81C743588F30693D /* UMSocialSinaHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSinaHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h; sourceTree = ""; }; - 9CEB17BF1D637D3D3B4541833DD8413B /* FBMemoryProfilerWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerWindow.m; path = FBMemoryProfiler/Window/FBMemoryProfilerWindow.m; sourceTree = ""; }; - 9E16889ECF6F45797037D61D09B545C4 /* UIGestureRecognizer+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIGestureRecognizer+BlocksKit.m"; path = "BlocksKit/UIKit/UIGestureRecognizer+BlocksKit.m"; sourceTree = ""; }; - 9E20EDCFC83C743D142C8E40E317192D /* NSObject+YYAddForARC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAddForARC.h"; path = "YYKit/Base/Foundation/NSObject+YYAddForARC.h"; sourceTree = ""; }; - 9E667E696694C0D86051522393D31A50 /* FBRetainCycleAnalysisCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBRetainCycleAnalysisCache.m; path = FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.m; sourceTree = ""; }; - 9E806678D5FD53BEA412FB4EAB3A26FA /* YYReachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYReachability.m; path = YYKit/Utility/YYReachability.m; sourceTree = ""; }; - 9ECFA1810737E35C9AEEFF67ED89C751 /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYKit/Image/YYWebImageOperation.m; sourceTree = ""; }; - 9FC05C0F71D0920E092E83CD4FF59DB6 /* UMSocialSnsPlatformManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSnsPlatformManager.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h; sourceTree = ""; }; - 9FCD2B9031FCC29FB4D41E000DC607E3 /* FBMemoryProfilerWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerWindow.h; path = FBMemoryProfiler/Window/FBMemoryProfilerWindow.h; sourceTree = ""; }; - A02E0C9A11F077B870A72CA725FE5BB1 /* MyLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MyLayout.xcconfig; sourceTree = ""; }; - A0D97EA3D3614781449972AF8EC4D621 /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridge.m; path = WebViewJavascriptBridge/WebViewJavascriptBridge.m; sourceTree = ""; }; - A1471C10244B0C59AE403E080621F636 /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = ""; }; - A1BBEA9F94DB0D14A4D9F722B49F9525 /* UMShareEditViewControlleriPad.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMShareEditViewControlleriPad.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib; sourceTree = ""; }; - A1DC28745B38F032A8EF3DA2189C6AA3 /* NSArray+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASShorthandAdditions.h"; path = "Masonry/NSArray+MASShorthandAdditions.h"; sourceTree = ""; }; - A2A278B5CF68BEAF8064A78196D43FE3 /* FBMemoryProfilerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerView.h; path = FBMemoryProfiler/Views/FBMemoryProfilerView.h; sourceTree = ""; }; - A31C4AD0C13C32F787D540E870CF7E92 /* MJExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-prefix.pch"; sourceTree = ""; }; - A32E551FBED662DCD9CC3F2192E5937F /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; - A3571DB6462414D99889619FD60449AE /* FBMemoryProfilerMathUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerMathUtils.m; path = FBMemoryProfiler/Utils/FBMemoryProfilerMathUtils.m; sourceTree = ""; }; - A39BD32D19E2AABD049C78C03E2C61AD /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYKit/Model/NSObject+YYModel.m"; sourceTree = ""; }; - A40A365166264C987FEABDD1E3BAEC0B /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYKit/Model/YYClassInfo.h; sourceTree = ""; }; - A4506D8CE7BED59971E881257AFF9911 /* UMSocialControllerService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialControllerService.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h; sourceTree = ""; }; - A45C66C433920D54300CD5A5012D0E1C /* MyLayoutSizeClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutSizeClass.m; path = MyLayout/Lib/MyLayoutSizeClass.m; sourceTree = ""; }; - A4CEAB9557E666683D46A81804C7EE08 /* YYFileHash.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFileHash.h; path = YYKit/Utility/YYFileHash.h; sourceTree = ""; }; - A4FCB4C2BC1481601FCE9EBC2346A5D2 /* NSArray+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+YYAdd.m"; path = "YYKit/Base/Foundation/NSArray+YYAdd.m"; sourceTree = ""; }; - A52F5F609D7DDA2FD09B6E918914AC21 /* FBMemoryProfilerWindowTouchesHandling.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerWindowTouchesHandling.h; path = FBMemoryProfiler/Window/FBMemoryProfilerWindowTouchesHandling.h; sourceTree = ""; }; - A54A50C110187F79FD991356ED5487DB /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYKit/Image/Categories/UIImageView+YYWebImage.m"; sourceTree = ""; }; - A688710BF1754C8489B812B2B5CD12A9 /* MyMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyMaker.m; path = MyLayout/Lib/MyMaker.m; sourceTree = ""; }; - A74F767F8BEE2C2006AA63DB75092641 /* CALayer+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYAdd.h"; path = "YYKit/Base/Quartz/CALayer+YYAdd.h"; sourceTree = ""; }; - A798DD4208A1EC6F17C95D9F282DF3D6 /* NSMutableSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableSet+BlocksKit.m"; path = "BlocksKit/Core/NSMutableSet+BlocksKit.m"; sourceTree = ""; }; - A8BCD4C2DDF24E50FA8A8D8DCC395DE2 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-prefix.pch"; sourceTree = ""; }; - A931BD93CF0462C69D3484B1A1B26CEE /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = ""; }; - A95A44FBA41652A2ECB84785F2E86CF7 /* FBMemoryProfilerOptions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerOptions.m; path = FBMemoryProfiler/Options/FBMemoryProfilerOptions.m; sourceTree = ""; }; - A98AC12EE6CEE54D6BAC7E7886561B51 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYKit/Image/YYSpriteSheetImage.m; sourceTree = ""; }; - A9E81F0535793CD081C12DB576F1AC55 /* MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJExtension.h; path = MJExtension/MJExtension.h; sourceTree = ""; }; + 980BE16B12FCFA38A053DA9760F6E773 /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = ""; }; + 982C2F43360DD32C33C8AA7D5A72EC9A /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = ""; }; + 9839DE7AC89339C7F31DE30EF7BE525D /* MyLayoutInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutInner.h; path = MyLayout/Lib/MyLayoutInner.h; sourceTree = ""; }; + 984F9931CF0D45C901C10DD01736C733 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = ""; }; + 9863F1A5D31166CD96E194C4E439888B /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; + 9891244C472758A11480E5437D23EF3A /* UMSocialQQHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialQQHandler.h; path = UShareSDK/SocialLibraries/QQ/UMSocialQQHandler.h; sourceTree = ""; }; + 98BB369EF7D39809E76DF0221E906D4A /* UIStepper+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIStepper+RACSignalSupport.h"; path = "ReactiveObjC/UIStepper+RACSignalSupport.h"; sourceTree = ""; }; + 99509CA473DF5A0BA17B88A19262F011 /* YYCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-prefix.pch"; sourceTree = ""; }; + 9A7EB0ED4BFC39E91AEC092305D00CC4 /* NSDictionary+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+RACSequenceAdditions.h"; path = "ReactiveObjC/NSDictionary+RACSequenceAdditions.h"; sourceTree = ""; }; + 9BA261E2B739D01BAF9E02778ED97209 /* MJExtension-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MJExtension-prefix.pch"; sourceTree = ""; }; + 9BA360036A5AABAFBDF3334B063FDAC0 /* NSObject+RACDeallocating.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACDeallocating.m"; path = "ReactiveObjC/NSObject+RACDeallocating.m"; sourceTree = ""; }; + 9BBF9A6F4940DDFEA675FF57427C9A66 /* RACEmptySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEmptySequence.m; path = ReactiveObjC/RACEmptySequence.m; sourceTree = ""; }; + 9BBFAB4B70EF0531E057F24FDAA67B7A /* NSObject+RACSelectorSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACSelectorSignal.m"; path = "ReactiveObjC/NSObject+RACSelectorSignal.m"; sourceTree = ""; }; + 9BFDD8D36E4CDD28A46A32266461ABE1 /* MBProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; + 9CA5BAA895F8F75A12EC1D858B0B6626 /* UISwitch+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISwitch+RACSignalSupport.h"; path = "ReactiveObjC/UISwitch+RACSignalSupport.h"; sourceTree = ""; }; + 9CB768200157EF9D10A64ACB69C1CBFF /* BMKOfflineMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOfflineMap.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMap.h; sourceTree = ""; }; + 9D41F7972543DEEDA61482AAF56BAD7D /* NSDate+BAKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDate+BAKit.m"; path = "BAPickView/BAPickView/NSDate+BAKit.m"; sourceTree = ""; }; + 9D8C5BEDC14D5495A86C545D449488CD /* RACEXTKeyPathCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTKeyPathCoding.h; path = ReactiveObjC/extobjc/RACEXTKeyPathCoding.h; sourceTree = ""; }; + 9D91D0FF2C718F2C6CDD5210B1769B0A /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = ""; }; + 9DE2F2FC2CAD45E6981EB09C51B8FC72 /* RACEXTScope.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACEXTScope.h; path = ReactiveObjC/extobjc/RACEXTScope.h; sourceTree = ""; }; + 9E097E0A2D6A8DADAAC68701D768C179 /* RACStream.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACStream.h; path = ReactiveObjC/RACStream.h; sourceTree = ""; }; + 9E1D79763F0BFC7180FCE2A379B50BD6 /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyboardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = ""; }; + 9E56F2D1869810C7515227FB09A525D2 /* UIButton+BACountDown.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+BACountDown.m"; path = "BAButton/BAButton/UIButton+BACountDown.m"; sourceTree = ""; }; + 9E67FF242F605D60BDD908B30A835E94 /* MASConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraint.h; path = Masonry/MASConstraint.h; sourceTree = ""; }; + 9EDC284BE3377646CD17FAE061ED3247 /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = ""; }; + 9EE3B99BAEC118FC63BA4B315A147B82 /* FMResultSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMResultSet.h; path = src/fmdb/FMResultSet.h; sourceTree = ""; }; + 9EEF55682496FB97F53E754637C62F61 /* libNullSafe.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libNullSafe.a; path = libNullSafe.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 9F09E22AEAB191F29945C8492757D29C /* RACBlockTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACBlockTrampoline.m; path = ReactiveObjC/RACBlockTrampoline.m; sourceTree = ""; }; + 9F40D29E73B9F1D27F74FB5856BB9224 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; + 9F8BED4FCA81E6191645978BFB0DE7A6 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; + 9FB904632BF7635153EBB4B52094A8C7 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = ""; }; + 9FBA2561EA2DC090499096D5B71CC38D /* BATextView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BATextView-prefix.pch"; sourceTree = ""; }; + 9FC06F5260E80FF86BD331DF02F41199 /* NSString+RACKeyPathUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACKeyPathUtilities.m"; path = "ReactiveObjC/NSString+RACKeyPathUtilities.m"; sourceTree = ""; }; + 9FCC7A3D936B2DC0E18ADF5E203B0A1E /* UITextView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+RACSignalSupport.h"; path = "ReactiveObjC/UITextView+RACSignalSupport.h"; sourceTree = ""; }; + A06BCDF5740D5CB805B09E24ECCCE37A /* RACStringSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACStringSequence.m; path = ReactiveObjC/RACStringSequence.m; sourceTree = ""; }; + A0D90254371991424FF2AC105609FDA3 /* FBObjectInStructReference.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectInStructReference.m; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectInStructReference.m; sourceTree = ""; }; + A0F3A0AA32EA21154905701BE733FF2F /* FMDB-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FMDB-dummy.m"; sourceTree = ""; }; + A1248E606F012300018B23C31E9680AC /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyboardManager/IQTextView/IQTextView.h; sourceTree = ""; }; + A183E5E9716152AC99873D8CD62087B3 /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DZNEmptyDataSet-prefix.pch"; sourceTree = ""; }; + A19FE504E109866CF7EC09D4EFA05F0C /* UIView+BAAnimation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+BAAnimation.m"; path = "BAPickView/BAPickView/UIView+BAAnimation.m"; sourceTree = ""; }; + A1B380DCAD3D4989E2DBB93251264A10 /* NSNotificationCenter+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+RACSupport.m"; path = "ReactiveObjC/NSNotificationCenter+RACSupport.m"; sourceTree = ""; }; + A1B4929D1AE922EE2479CC853E30ED47 /* NSIndexSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSIndexSet+RACSequenceAdditions.m"; path = "ReactiveObjC/NSIndexSet+RACSequenceAdditions.m"; sourceTree = ""; }; + A1D5EEE93A96612FD5CF2FF2CD1D3DD5 /* FBIvarReference.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBIvarReference.m; path = FBRetainCycleDetector/Layout/Classes/Reference/FBIvarReference.m; sourceTree = ""; }; + A1EADA48B3316C296B619063CDAAFAFE /* FMDatabase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabase.m; path = src/fmdb/FMDatabase.m; sourceTree = ""; }; + A24581B2421A77286F2E77CD27519ABA /* BANetManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BANetManager.h; path = BANetManager/BANetManager.h; sourceTree = ""; }; + A2A9ED566256428A8EE6CAB22BAC8A28 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = ""; }; + A2B53FE407BA6D1052FD2E69CB119934 /* NSObject+RACKVOWrapper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACKVOWrapper.m"; path = "ReactiveObjC/NSObject+RACKVOWrapper.m"; sourceTree = ""; }; + A3A101DD4AEF30ADDC844AAA3846DD39 /* UIButton+BAKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+BAKit.h"; path = "BAButton/BAButton/UIButton+BAKit.h"; sourceTree = ""; }; + A420EA5A01F414F0FC314F1064C6278F /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = ""; }; + A43CBBB2BF1565E6DA98FFC0348EA167 /* UISlider+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISlider+RACSignalSupport.h"; path = "ReactiveObjC/UISlider+RACSignalSupport.h"; sourceTree = ""; }; + A4AF5A9FF67E6F3B7410BBF68C430434 /* MyFloatLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFloatLayout.h; path = MyLayout/Lib/MyFloatLayout.h; sourceTree = ""; }; + A4E8ACDBE016B429BA59DC2AA4044D5E /* RACSubscriptingAssignmentTrampoline.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriptingAssignmentTrampoline.m; path = ReactiveObjC/RACSubscriptingAssignmentTrampoline.m; sourceTree = ""; }; + A5207C15A79E3C066E8F20D61B1F5F25 /* UISplitViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISplitViewController+MemoryLeak.h"; path = "MLeaksFinder/UISplitViewController+MemoryLeak.h"; sourceTree = ""; }; + A52CDB4442685E57F1B88305266C9F1D /* SDAutoLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.xcconfig; sourceTree = ""; }; + A5B15B9D1A5AD58BFCC20B039DCC2380 /* BMKOfflineMapType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOfflineMapType.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOfflineMapType.h; sourceTree = ""; }; + A62036EF008984FBD2B85C2DC76D57C4 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; + A62150A856854F44C62AA221D727DEC5 /* RACMulticastConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACMulticastConnection.h; path = ReactiveObjC/RACMulticastConnection.h; sourceTree = ""; }; + A66B25BC253C896F3701A033C5533BDF /* UIPageViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIPageViewController+MemoryLeak.h"; path = "MLeaksFinder/UIPageViewController+MemoryLeak.h"; sourceTree = ""; }; + A6F32588B657850EABFB74AEDDB38C5B /* BMKPoiSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPoiSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearch.h; sourceTree = ""; }; + A73DC36B540A437BAD925324A32CB822 /* NSInvocation+RACTypeParsing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSInvocation+RACTypeParsing.m"; path = "ReactiveObjC/NSInvocation+RACTypeParsing.m"; sourceTree = ""; }; + A7B99DD703945C83B4601D36B45FEBE2 /* RACAnnotations.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACAnnotations.h; path = ReactiveObjC/RACAnnotations.h; sourceTree = ""; }; + A829375743110C8BFCCDFD99BADD23F7 /* libBATextView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBATextView.a; path = libBATextView.a; sourceTree = BUILT_PRODUCTS_DIR; }; + A9DFFD4246C2438A4371E24F79B51AF9 /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; + AA21FBCD7DE6349E8574FD56322B008D /* MLeakedObjectProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeakedObjectProxy.h; path = MLeaksFinder/MLeakedObjectProxy.h; sourceTree = ""; }; AA61728548221DE9AEA85A39C94081C3 /* Pods-BABaseProject-BABaseProjectTests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-BABaseProjectTests-frameworks.sh"; sourceTree = ""; }; - AB6D57D045C4E299B7132365AA8B7F85 /* UIViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIViewController+MemoryLeak.h"; path = "MLeaksFinder/UIViewController+MemoryLeak.h"; sourceTree = ""; }; - AB7DD34411EF9F2646DED7CB5B79ECED /* YYTransaction.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTransaction.m; path = YYKit/Utility/YYTransaction.m; sourceTree = ""; }; - AC31422140AE9ADA8E3BCF77B0641D31 /* UINavigationController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+MemoryLeak.m"; path = "MLeaksFinder/UINavigationController+MemoryLeak.m"; sourceTree = ""; }; - AC536104787A5DF8D85CE1F10C915B13 /* NullSafe-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NullSafe-dummy.m"; sourceTree = ""; }; - AC57B2B100D6A7427406C7B6007D7515 /* FBStructEncodingParser.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBStructEncodingParser.mm; path = FBRetainCycleDetector/Layout/Classes/Parser/FBStructEncodingParser.mm; sourceTree = ""; }; - AD7AC596E39B564718102D8BF7BFE787 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYKit/Image/Categories/_YYWebImageSetter.h; sourceTree = ""; }; - ADD4E0D477E9E2D33FE7546548637C75 /* UIImage+RoundedCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+RoundedCorner.m"; path = "JMRoundedCorner/UIImage+RoundedCorner.m"; sourceTree = ""; }; - ADEBD85F4C1C7213EAFFE19D21B4184D /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - AE73B0214DF7E2D4D7E5CB68C93E5DD2 /* MyLayoutInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutInner.h; path = MyLayout/Lib/MyLayoutInner.h; sourceTree = ""; }; - AE830205054F9829AE63DDB1BBE18D5B /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYKit/Image/Categories/CALayer+YYWebImage.h"; sourceTree = ""; }; - AE942AA33351A6E0C5B35BD36B65B7ED /* MLeaksMessenger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MLeaksMessenger.m; path = MLeaksFinder/MLeaksMessenger.m; sourceTree = ""; }; - AE9B8CF61AEC65F25B77F6A701704785 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; - AEE3936E2FB477E0BF1B39FF87149676 /* NSObject+YYAddForKVO.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAddForKVO.m"; path = "YYKit/Base/Foundation/NSObject+YYAddForKVO.m"; sourceTree = ""; }; - AF08524AB58959BC4E7EF7C1EFA593A1 /* FBObjectiveCNSCFTimer.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBObjectiveCNSCFTimer.mm; path = FBRetainCycleDetector/Graph/Specialization/FBObjectiveCNSCFTimer.mm; sourceTree = ""; }; - AF0B5F3879319F1C775D755A16DB60C9 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = ""; }; - AF5E9220586D448D78D85E7BDD02FD3D /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = ""; }; - AF8E99EF3AF3777EB0C049A26DAC3540 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = ""; }; - AFC38B21F8AC5CD8692451846AB1F457 /* NSObject+YYAddForARC.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYAddForARC.m"; path = "YYKit/Base/Foundation/NSObject+YYAddForARC.m"; sourceTree = ""; }; - B00315F157BCD001B78AC8C41A183E5D /* UMSocialBar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialBar.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h; sourceTree = ""; }; - B026555327BAA23598E63F5914876CCE /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJExtension.h"; path = "MJRefresh/UIScrollView+MJExtension.h"; sourceTree = ""; }; - B0330E05680263E7BD2051C65FF1A3C8 /* BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BlocksKit.h; path = BlocksKit/BlocksKit.h; sourceTree = ""; }; - B0367C8FA55E93591F95053CA17A1B6A /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; }; - B08E2CEFD1FE5CA5903983EF82AAC458 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; - B0E06B3A50429D9BFC7461CFE1F7468B /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyboardManager/IQToolbar/IQToolbar.h; sourceTree = ""; }; - B0EE43543C69695FA5696AB0D650F4AF /* FBAllocationTracker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBAllocationTracker-prefix.pch"; sourceTree = ""; }; - B11ADBFB315AA27808E3A1D00E776B3C /* FBAllocationTrackerGeneration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerGeneration.h; path = FBAllocationTracker/Generations/FBAllocationTrackerGeneration.h; sourceTree = ""; }; - B14E63E64DCD2A8AA1960223D09A3EC1 /* FBMemoryProfilerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerView.m; path = FBMemoryProfiler/Views/FBMemoryProfilerView.m; sourceTree = ""; }; - B150A31B862AE24722F4DA3C4436F3BF /* NSOrderedSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSOrderedSet+BlocksKit.m"; path = "BlocksKit/Core/NSOrderedSet+BlocksKit.m"; sourceTree = ""; }; - B18A663547B41BCB2192256358A509E1 /* UITextField+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+BlocksKit.h"; path = "BlocksKit/UIKit/UITextField+BlocksKit.h"; sourceTree = ""; }; + AAF349A33035E163768A382E51E0944E /* BMKSearchVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKSearchVersion.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSearchVersion.h; sourceTree = ""; }; + AB0B7E72C34C019DB4CFDD3D78EECBBB /* RACCommand.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACCommand.m; path = ReactiveObjC/RACCommand.m; sourceTree = ""; }; + AB0FFA39D3FD61256F6D72E11701B042 /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMasonry.a; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; + AB9EB42B9050E4FEF520D780AF17C884 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = ""; }; + ABDA2A0C416650E9A3218E82CDB26E1A /* UIButton+BAState.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+BAState.m"; path = "BAButton/BAButton/UIButton+BAState.m"; sourceTree = ""; }; + ABEAB6702D091BD0AF5DA298F3A106A0 /* FBBlockStrongLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockStrongLayout.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongLayout.h; sourceTree = ""; }; + AC0FF902594BF620DA9C7757098E23E7 /* libWeChatSDK.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libWeChatSDK.a; path = UShareSDK/SocialLibraries/WeChat/WechatSDK/libWeChatSDK.a; sourceTree = ""; }; + ACF604C3596C865FBAAF8BB2AE352CCA /* BMKBusLineSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKBusLineSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKBusLineSearch.h; sourceTree = ""; }; + ACF9FE0FEAB65AF880BEDF1731B98544 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = ""; }; + AD19CE05FF3E73AB501E972F5D82955A /* libJMRoundedCorner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libJMRoundedCorner.a; path = libJMRoundedCorner.a; sourceTree = BUILT_PRODUCTS_DIR; }; + AD4784BBC5F9BA4E607295008B249FE8 /* UITableViewCell+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableViewCell+RACSignalSupport.m"; path = "ReactiveObjC/UITableViewCell+RACSignalSupport.m"; sourceTree = ""; }; + ADA404D82C8CD1AFEA1294AE6183FEE7 /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; + ADC5137C6CFCE99DD06051C7CC84FC5B /* MyPathLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyPathLayout.h; path = MyLayout/Lib/MyPathLayout.h; sourceTree = ""; }; + ADECB2D80F39BF9689953920952743D9 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = ""; }; + AE1BE0AD3E37333FD6CBB38ED79FEC43 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = ""; }; + AE640802970D3E32CC94306E6E234532 /* NSString+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACSupport.m"; path = "ReactiveObjC/NSString+RACSupport.m"; sourceTree = ""; }; + AE6EB8B81ABA49102E7DD26271570B4F /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + AEA19F745A325226E68C2AE19280CEFD /* NSObject+RACKVOWrapper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+RACKVOWrapper.h"; path = "ReactiveObjC/NSObject+RACKVOWrapper.h"; sourceTree = ""; }; + AF62EA21CC88D14DD0F555F35FC03C75 /* UITouch+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITouch+MemoryLeak.m"; path = "MLeaksFinder/UITouch+MemoryLeak.m"; sourceTree = ""; }; + AF92D32A6D64DC676363705855F4C32C /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + AF9F5AF730E591D3AE4EAA7A33F3AF6F /* UIPageViewController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIPageViewController+MemoryLeak.m"; path = "MLeaksFinder/UIPageViewController+MemoryLeak.m"; sourceTree = ""; }; + AFAC06ECACA6EE974CE680A7AF8AC065 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; + AFFEA5AF3E485E420B844B47EF385544 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYCache/YYDiskCache.m; sourceTree = ""; }; + B0198BA0BE9BB00547AEFCC0FA21E46D /* BMKSuggestionSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKSuggestionSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearchOption.h; sourceTree = ""; }; + B02BAA61E5DAB045E5E85B38DE6BF7E4 /* UITextView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextView+RACSignalSupport.m"; path = "ReactiveObjC/UITextView+RACSignalSupport.m"; sourceTree = ""; }; + B02F60AA22796FB79862B4D06CDE8F76 /* RACGroupedSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACGroupedSignal.m; path = ReactiveObjC/RACGroupedSignal.m; sourceTree = ""; }; + B0451EB20856135E30D3FE1D974E8907 /* UMSocialSinaHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSinaHandler.h; path = UShareSDK/SocialLibraries/Sina/UMSocialSinaHandler.h; sourceTree = ""; }; + B0FFA59642E56C38D4B03E8CA762B990 /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = ""; }; + B17D703A3835F8829B6BC43BDD0344AD /* BMKMultiPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMultiPoint.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMultiPoint.h; sourceTree = ""; }; B1B94BA83E74CFABB64B0849C0BFD82B /* Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist"; sourceTree = ""; }; - B1F5A5B82C6B2761D528F2924568504C /* UMSocialInstagramHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialInstagramHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h; sourceTree = ""; }; - B213635D79D1B0C8415CD8DDD0D92E26 /* MJFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJFoundation.h; path = MJExtension/MJFoundation.h; sourceTree = ""; }; - B25BBB87AC06B7F8FFCDDD4F34D11D86 /* libFBAllocationTracker.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFBAllocationTracker.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B2735FCD3752765F1318AA765E05C8B3 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = ""; }; - B2A6223DCD46DE4F65A52893D4EE6E24 /* FBMemoryProfilerGenerationsSectionHeaderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerGenerationsSectionHeaderView.h; path = FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.h; sourceTree = ""; }; - B2DBE707C5E3DF45875D685CA382E542 /* FBObjectGraphConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectGraphConfiguration.m; path = FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m; sourceTree = ""; }; - B31F5EAC0CD3EAA27BE46699DBF4ABF3 /* FBRetainCycleDetector.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBRetainCycleDetector.xcconfig; sourceTree = ""; }; - B3433531173ED396C780AB47996B4618 /* YYTextParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextParser.m; path = YYKit/Text/String/YYTextParser.m; sourceTree = ""; }; - B3473487C4A41397AE46A1C71687C8CA /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = ""; }; - B3AB8F9CF26BD99D2E66C0F125D2F592 /* MASUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASUtilities.h; path = Masonry/MASUtilities.h; sourceTree = ""; }; - B3DC6E2CDDB6A0ED9D70A1E1FC52E6E8 /* UIControl+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+YYAdd.m"; path = "YYKit/Base/UIKit/UIControl+YYAdd.m"; sourceTree = ""; }; - B565FEFE249C5B7001CAD58462E908FD /* NSParagraphStyle+YYText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSParagraphStyle+YYText.h"; path = "YYKit/Text/String/NSParagraphStyle+YYText.h"; sourceTree = ""; }; - B696538C145D3F1CF93CE278A6D90206 /* libMyLayout.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMyLayout.a; sourceTree = BUILT_PRODUCTS_DIR; }; - B6C0794E2599D34D259A975905CCFCF2 /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYKit/Image/YYImage.h; sourceTree = ""; }; - B773932A5B2F66A5EFB092C07C02753A /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.m; sourceTree = ""; }; - B7912B79A365C76B319EC9369A73DDE1 /* YYReachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYReachability.h; path = YYKit/Utility/YYReachability.h; sourceTree = ""; }; - B7AD9B6A7C7D2144615D70677CF84F67 /* MyTableLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyTableLayout.h; path = MyLayout/Lib/MyTableLayout.h; sourceTree = ""; }; - B7B4A426B2E5B8AC2816131992C12FB4 /* FBAllocationTrackerGenerationManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAllocationTrackerGenerationManager.mm; path = FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.mm; sourceTree = ""; }; - B7E1DB591E88AD637D3206E8D8F7D8EC /* UIPopoverController+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIPopoverController+BlocksKit.m"; path = "BlocksKit/UIKit/UIPopoverController+BlocksKit.m"; sourceTree = ""; }; - B7F5B0DC517DA77731F27DAA68895507 /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYKit/Image/YYFrameImage.m; sourceTree = ""; }; + B221B4504CE1DF7A85DD313BD25E3745 /* NSInvocation+RACTypeParsing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSInvocation+RACTypeParsing.h"; path = "ReactiveObjC/NSInvocation+RACTypeParsing.h"; sourceTree = ""; }; + B22D583BC9E9519845EE7FA03B2D23FD /* BMKPointAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPointAnnotation.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPointAnnotation.h; sourceTree = ""; }; + B24586F6863B5A5EF2DB2F80B165EDAA /* UISegmentedControl+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISegmentedControl+RACSignalSupport.m"; path = "ReactiveObjC/UISegmentedControl+RACSignalSupport.m"; sourceTree = ""; }; + B2807A0E8FC5A483B0867902EF917059 /* RACUnit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACUnit.m; path = ReactiveObjC/RACUnit.m; sourceTree = ""; }; + B2F7CA4FF254B4E71A0FC39B3B529DD1 /* UIView+BARectCorner.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+BARectCorner.m"; path = "BAPickView/BAPickView/UIView+BARectCorner.m"; sourceTree = ""; }; + B3B6F3F9725B0E0BC78DED1BFBF1D192 /* RACSubscriptingAssignmentTrampoline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriptingAssignmentTrampoline.h; path = ReactiveObjC/RACSubscriptingAssignmentTrampoline.h; sourceTree = ""; }; + B3C2DB03A42AE5681D8A15EF7775AD90 /* UIAlertView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+RACSignalSupport.h"; path = "ReactiveObjC/UIAlertView+RACSignalSupport.h"; sourceTree = ""; }; + B3E30AFC92FD0E60DBDBCC7A94871F41 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = ""; }; + B452FB9D2A3C5B83B7DD31AC83FD01B9 /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseAdditions.h; path = src/fmdb/FMDatabaseAdditions.h; sourceTree = ""; }; + B497BB618F3B51903EAE4EED74A3E099 /* BAButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAButton.h; path = BAButton/BAButton/BAButton.h; sourceTree = ""; }; + B4E7D9C2EB3B392236B39C337D298364 /* BMKOpenOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenOption.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenOption.h; sourceTree = ""; }; + B512CF401CD8E29A3BB1EB7A2E9F8845 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; + B582A9AECE43FE5C81EFFD82CA7A616A /* NSObject+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MemoryLeak.h"; path = "MLeaksFinder/NSObject+MemoryLeak.h"; sourceTree = ""; }; + B5A9A3555B80689119B5C2DE16E6626B /* BANetManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BANetManager-dummy.m"; sourceTree = ""; }; + B5B1B4631239031AD33CFE487E2F9C0E /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = ""; }; + B61A3831AC3C6608B543FB9E99A748FE /* BMKRouteSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRouteSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearchOption.h; sourceTree = ""; }; + B6CEFCCC58EDB72AA7FE62EF82F50A05 /* FBRetainCycleDetector-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBRetainCycleDetector-dummy.m"; sourceTree = ""; }; + B6EA9E873DF5DC7B0576C9E0B0F3445D /* RACCompoundDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACCompoundDisposable.m; path = ReactiveObjC/RACCompoundDisposable.m; sourceTree = ""; }; + B7E7F89B24929AC997A0A51CC2B7D0F2 /* RACEagerSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACEagerSequence.m; path = ReactiveObjC/RACEagerSequence.m; sourceTree = ""; }; + B7F3B31C23026CD61CE7E0CCAC6692EA /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = ""; }; B808676B7B02CCDCE360D5E4DD98F752 /* Pods-BABaseProject-BABaseProjectUITests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-BABaseProjectUITests-frameworks.sh"; sourceTree = ""; }; - B8AB11B7F08B0AEE5078DBEFB8BB0F65 /* FBMemoryProfilerViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerViewController.m; path = FBMemoryProfiler/Controllers/FBMemoryProfilerViewController.m; sourceTree = ""; }; - B8D231300C964E617A1CCE86035669FF /* UISplitViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISplitViewController+MemoryLeak.h"; path = "MLeaksFinder/UISplitViewController+MemoryLeak.h"; sourceTree = ""; }; - B8EC09614D18706ADB27C639ECF62DE4 /* FBSingleRetainCycleViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSingleRetainCycleViewController.h; path = FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.h; sourceTree = ""; }; + B837B9C68445C1FCC28E0B1CC395B0F2 /* NSArray+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+MASAdditions.h"; path = "Masonry/NSArray+MASAdditions.h"; sourceTree = ""; }; B9040C60CE4E764E44E8C39C5572A776 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BABaseProject-BABaseProjectTests.debug.xcconfig"; sourceTree = ""; }; - B9CDD4E2472E289FF16D67669DD34C6A /* YYKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYKit.xcconfig; sourceTree = ""; }; - B9CFA88A92293B958DA20564BFE2EA70 /* UMSocialDataService.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialDataService.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h; sourceTree = ""; }; - B9EC4CF4EF07A52E878A226F584FFB05 /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyboardManager/IQKeyboardManager.m; sourceTree = ""; }; - B9F6A08C41CC3352A79FEA17317EA713 /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; - B9F88D64640F1DEFA5DCC1C0537CCAA1 /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = ""; }; - BA757D006F9F117BF203FCEAC5D80865 /* FBBlockStrongLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockStrongLayout.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongLayout.h; sourceTree = ""; }; - BAB02C4C5CF01C1DF1D33336447A8F13 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - BB70C9C6E99CB810F1090EBC41955558 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; - BBBA4E1F7C1DEF65E95F5516787B8196 /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; - BBD5ED7DCF756D27CFD4D403E4C61B50 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = ""; }; - BC085BF6717CD4E4463D582419A87D01 /* YYCGUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCGUtilities.m; path = YYKit/Base/Quartz/YYCGUtilities.m; sourceTree = ""; }; - BC3BD023E4995C3ED0207C16D4143987 /* UIImage+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYAdd.h"; path = "YYKit/Base/UIKit/UIImage+YYAdd.h"; sourceTree = ""; }; - BCADCD1C4CCAAEC27065ED1A9362E2D4 /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = ""; }; - BCB0278A80BB796B0BBB05797970ADCF /* Masonry.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Masonry.h; path = Masonry/Masonry.h; sourceTree = ""; }; - BCEE999CC8EC152F56361B5BAFE47F3C /* YYCGUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCGUtilities.h; path = YYKit/Base/Quartz/YYCGUtilities.h; sourceTree = ""; }; - BD20923BDF87CF94DD9630025F397ADD /* UMSocialFacebookHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialFacebookHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h; sourceTree = ""; }; - BD76F534CEEFE47794698A5410F23ADA /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = ""; }; - BDEAE3DEAC73837A85801AF71B0A19E8 /* MyLayoutPos.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutPos.m; path = MyLayout/Lib/MyLayoutPos.m; sourceTree = ""; }; - BDEECAA6CDC8A66BC9C5117C216A27AD /* NSObject+MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJProperty.m"; path = "MJExtension/NSObject+MJProperty.m"; sourceTree = ""; }; - BEA3A528065576E57A614BD00E63B0B6 /* NSTimer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSTimer+YYAdd.m"; path = "YYKit/Base/Foundation/NSTimer+YYAdd.m"; sourceTree = ""; }; - BEC11E4322B88F12D64410C2C0C23D02 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; - BEC29C2C4693655F7BFBD6BE0DB1D2CE /* libMasonry.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMasonry.a; sourceTree = BUILT_PRODUCTS_DIR; }; - BF0E6DFFA13A3D990A16B5FD1AB040D2 /* UIAlertView+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIAlertView+BlocksKit.h"; path = "BlocksKit/UIKit/UIAlertView+BlocksKit.h"; sourceTree = ""; }; - BF629F5D0C79C753A9E822947DEC1586 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - C00F8308F41ED0074A3E0593A878B9F4 /* WebViewJavascriptBridgeBase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridgeBase.h; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.h; sourceTree = ""; }; - C03A7DC96A2CCC5E2613375220631545 /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYKit/Image/Categories/UIImageView+YYWebImage.h"; sourceTree = ""; }; + B9A91DDA7E64E859C26D6CF57BBE5C29 /* FBBlockStrongLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBBlockStrongLayout.m; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongLayout.m; sourceTree = ""; }; + B9D77A1C8ADF8EA8960EFF7B7EE025EC /* BAPickView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BAPickView.xcconfig; sourceTree = ""; }; + BA57AD18C92754A29658ADEE3CB19D5D /* BAPickView_OC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAPickView_OC.h; path = BAPickView/BAPickView/BAPickView_OC.h; sourceTree = ""; }; + BAF38F3F3BCF4114F44F457B03803C13 /* RACTupleSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACTupleSequence.m; path = ReactiveObjC/RACTupleSequence.m; sourceTree = ""; }; + BB94B2FF6E22C5506C00E70FDE67E95C /* libSDAutoLayout.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libSDAutoLayout.a; path = libSDAutoLayout.a; sourceTree = BUILT_PRODUCTS_DIR; }; + BC6FC10C68A48A66F831E1EBE43EAC49 /* MyLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MyLayout-dummy.m"; sourceTree = ""; }; + BCDD642BC626E7A6D32B29C8B851B877 /* BAPickView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "BAPickView-dummy.m"; sourceTree = ""; }; + BD23AE31E8BE741709F9E156462BBB9E /* UITabBarController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITabBarController+MemoryLeak.h"; path = "MLeaksFinder/UITabBarController+MemoryLeak.h"; sourceTree = ""; }; + BD482008D91EC0216DC0E8B0A6719235 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; + BD958B9C9A5105BE54D777A889DAA617 /* UISwitch+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UISwitch+RACSignalSupport.m"; path = "ReactiveObjC/UISwitch+RACSignalSupport.m"; sourceTree = ""; }; + BD992D834E45180885BDDC8DADADD153 /* MJPropertyKey.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyKey.m; path = MJExtension/MJPropertyKey.m; sourceTree = ""; }; + BD9BB92866B725B4FCC7F220A47F2786 /* CALayer+Animation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+Animation.m"; path = "BAAlert/BAAlert/CALayer+Animation.m"; sourceTree = ""; }; + BDB8312FDC9D04BE3830776BD0B9E027 /* APOpenAPIObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = APOpenAPIObject.h; path = UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h; sourceTree = ""; }; + BDBF2EFE1CD0909950A1090E08FE04B4 /* BMKOpenRoute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOpenRoute.h; path = BaiduMapKit/BaiduMapAPI_Utils.framework/Headers/BMKOpenRoute.h; sourceTree = ""; }; + BDC0F938A736A44ADE99A6AAC93809CC /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = ""; }; + BF2DF29A3ACB8A0748E91601BC5F74A1 /* RACQueueScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACQueueScheduler.h; path = ReactiveObjC/RACQueueScheduler.h; sourceTree = ""; }; + BF4DA895741510F5E99118CB4F97A297 /* RACPassthroughSubscriber.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACPassthroughSubscriber.h; path = ReactiveObjC/RACPassthroughSubscriber.h; sourceTree = ""; }; + C022E794B2CEBE1756E4A06291C3E5C3 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; C058147B53A9ADFB7061DF7EB69E8FB1 /* Pods-BABaseProject-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BABaseProject-dummy.m"; sourceTree = ""; }; - C086880E09AC7E6C8D6077B2BB271C8A /* MyLinearLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLinearLayout.m; path = MyLayout/Lib/MyLinearLayout.m; sourceTree = ""; }; - C0896B8206ACB730E0FEAC6A1A8DEE3F /* YYTextMagnifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextMagnifier.h; path = YYKit/Text/Component/YYTextMagnifier.h; sourceTree = ""; }; - C0F377538D2D64A5DBBEBB40B9F10B7F /* FBMemoryProfilerFloatingButtonController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerFloatingButtonController.h; path = FBMemoryProfiler/Controllers/FBMemoryProfilerFloatingButtonController.h; sourceTree = ""; }; - C1167CF75D7F6BBC6E68161EA9558D58 /* NSString+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+MJExtension.m"; path = "MJExtension/NSString+MJExtension.m"; sourceTree = ""; }; - C14BD54122A5501582104EC3C8921B15 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = ""; }; - C14C1A6243FFBB0FC900BE895E7A01B3 /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = ""; }; - C15310E8D8C1B44B7E9E994B8B65BCC8 /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYKit/Image/Categories/UIButton+YYWebImage.m"; sourceTree = ""; }; - C15716B815131D615641B428CEC905B6 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = ""; }; - C17D76842FCA2CB02F088DE122BABE1D /* MJPropertyKey.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyKey.h; path = MJExtension/MJPropertyKey.h; sourceTree = ""; }; - C1F7A828356422E68F1B923480C376CC /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = ""; }; - C229C98F73ED9180ABD9E05D95D67C37 /* NSObject+A2BlockDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+A2BlockDelegate.m"; path = "BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.m"; sourceTree = ""; }; - C257988E7777B5456728B51FF16A46F3 /* SDWebImageDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDecoder.m; path = SDWebImage/SDWebImageDecoder.m; sourceTree = ""; }; - C2816F1AC6BCC92F40FDD4E2A786DFDE /* WebViewJavascriptBridgeBase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WebViewJavascriptBridgeBase.m; path = WebViewJavascriptBridge/WebViewJavascriptBridgeBase.m; sourceTree = ""; }; - C293CFC6829F5D0B4FA34A7E97BE9036 /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; - C345502A75CBE61E001D30BA161E4977 /* UITextField+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextField+YYAdd.h"; path = "YYKit/Base/UIKit/UITextField+YYAdd.h"; sourceTree = ""; }; - C345638781FC3EFEBE27425ADF905768 /* MFMessageComposeViewController+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MFMessageComposeViewController+BlocksKit.m"; path = "BlocksKit/MessageUI/MFMessageComposeViewController+BlocksKit.m"; sourceTree = ""; }; - C34FAED3862A3782BE249E4245ECB502 /* NSObject+FBAllocationTracker.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = "NSObject+FBAllocationTracker.mm"; path = "FBAllocationTracker/NSObject+FBAllocationTracker.mm"; sourceTree = ""; }; - C3733709FE00D30C4BAD0E7DB04981CC /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+MJRefresh.h"; path = "MJRefresh/UIScrollView+MJRefresh.h"; sourceTree = ""; }; - C37B7F22AFE1647883020BCDF6012FA8 /* NSObject+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYAdd.h"; path = "YYKit/Base/Foundation/NSObject+YYAdd.h"; sourceTree = ""; }; - C45715B179603BDF6570632E0AB23F7F /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.h; sourceTree = ""; }; - C461681BED27151F945752EDF2C87F36 /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = ""; }; - C46E09036F368F42F2C7107327BD1A63 /* YYAsyncLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAsyncLayer.h; path = YYKit/Utility/YYAsyncLayer.h; sourceTree = ""; }; - C4C3430A5C17BE45F5001DA945CC9462 /* MyLayoutPos.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutPos.h; path = MyLayout/Lib/MyLayoutPos.h; sourceTree = ""; }; - C4F00B3AB84CA628F09D6C85C8278267 /* YYTextAttribute.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextAttribute.h; path = YYKit/Text/String/YYTextAttribute.h; sourceTree = ""; }; - C4F82E8F3D0B32202C9549B9DEDD2940 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyboardManager/IQKeyboardManager.h; sourceTree = ""; }; - C57DC4863CC2D833D32F6CBEDCC968FB /* YYTextLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextLine.h; path = YYKit/Text/Component/YYTextLine.h; sourceTree = ""; }; - C60BFEF90FD39876DC97935F8F7233E5 /* MJPropertyType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJPropertyType.m; path = MJExtension/MJPropertyType.m; sourceTree = ""; }; - C61921B8CBDA195E8F13C72F03FEC9C6 /* MLeakedObjectProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeakedObjectProxy.h; path = MLeaksFinder/MLeakedObjectProxy.h; sourceTree = ""; }; - C634773DB7672C08216B7B3544CCD0E5 /* FBAllocationTrackerSummary.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerSummary.h; path = FBAllocationTracker/FBAllocationTrackerSummary.h; sourceTree = ""; }; - C63D15891DD8222DC8CF0B13B9CBE442 /* MyDimeScale.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyDimeScale.h; path = MyLayout/Lib/MyDimeScale.h; sourceTree = ""; }; - C65F485FBA386474CC18FAE641526C21 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; - C73FFBA29D004B1184A16B3030A7EBEA /* UIBarButtonItem+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+BlocksKit.h"; path = "BlocksKit/UIKit/UIBarButtonItem+BlocksKit.h"; sourceTree = ""; }; - C75F362F2721C83B9578690864A9EDB1 /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyboardManager/IQToolbar/IQToolbar.m; sourceTree = ""; }; - C7B87B4577CD61E350E3BBB244BD3FC3 /* FBObjectiveCGraphElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectiveCGraphElement.h; path = FBRetainCycleDetector/Graph/FBObjectiveCGraphElement.h; sourceTree = ""; }; - C8052BECC9F8243FA232F386E0FD5C7D /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; - C8147290C16AC26AEC18880E6E7606D5 /* MJPropertyType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJPropertyType.h; path = MJExtension/MJPropertyType.h; sourceTree = ""; }; - C8CA8E1A02DA086416D760CE2790A36C /* FBBlockStrongRelationDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockStrongRelationDetector.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongRelationDetector.h; sourceTree = ""; }; - C96F315F04D21365016B40114DD1AAA5 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYKit/Cache/YYDiskCache.h; sourceTree = ""; }; - C9861C770CEF1C5AD1070AD4AE9A137D /* YYTextKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextKeyboardManager.h; path = YYKit/Text/Component/YYTextKeyboardManager.h; sourceTree = ""; }; - C9A068E3F0B4EB2C414B9E08CBA0725B /* NSObject+BKBlockObservation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+BKBlockObservation.h"; path = "BlocksKit/Core/NSObject+BKBlockObservation.h"; sourceTree = ""; }; - CA5A25BC9D4E907A46EEBBD41109CA53 /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = ""; }; - CA6BE538EFF2B2C5FE9FF241AE9AC602 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = ""; }; - CB27C5CB59CE05E58883CB9D00227C59 /* NSObject+FBAllocationTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+FBAllocationTracker.h"; path = "FBAllocationTracker/NSObject+FBAllocationTracker.h"; sourceTree = ""; }; - CB55B2B1F3E97DEB9D1F7164C5D4B855 /* MyLayoutMeasure.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutMeasure.h; path = MyLayout/Lib/MyLayoutMeasure.h; sourceTree = ""; }; - CB87C62AE6E5C45889814D0B4AC34B36 /* UMSocialAccountManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialAccountManager.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h; sourceTree = ""; }; - CB9B68BB8F1BE464BBCEE628882E0E4D /* SDWebImageDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDecoder.h; path = SDWebImage/SDWebImageDecoder.h; sourceTree = ""; }; - CCB7BD27356A5191522BDE36482D3DED /* UIWebView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIWebView+AFNetworking.h"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.h"; sourceTree = ""; }; - CD1330F645A5ED76EF05BA751E6537A3 /* UMSocialQQHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialQQHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h; sourceTree = ""; }; - CD40C7CA088D9BDF9F2B7F1CC9B7B950 /* NSArray+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+BlocksKit.m"; path = "BlocksKit/Core/NSArray+BlocksKit.m"; sourceTree = ""; }; - CD68B0BDB606FE3E3852FC50AB401CFC /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = ""; }; - CDCCEE2F0F0D7EE0C5F9EBF63A6A8889 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = ""; }; - CE39C9AB6573BE673FD2B852BC4B7668 /* MJExtensionConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJExtensionConst.m; path = MJExtension/MJExtensionConst.m; sourceTree = ""; }; - CEEB45EDCFC9B270BCFE032A7AE81E84 /* View+MASShorthandAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASShorthandAdditions.h"; path = "Masonry/View+MASShorthandAdditions.h"; sourceTree = ""; }; - CF393313A8743E1B447081AD31CDC2F2 /* NSMutableDictionary+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableDictionary+BlocksKit.m"; path = "BlocksKit/Core/NSMutableDictionary+BlocksKit.m"; sourceTree = ""; }; - D01A85BFB73FD7F935560D47D57A81CA /* UMSocialControllerServiceComment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialControllerServiceComment.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h; sourceTree = ""; }; - D02EC07EA217DE294D925375F8246D0F /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYKit/Image/YYSpriteSheetImage.h; sourceTree = ""; }; - D09EE8D2C85CA40EE3C7F87F72617256 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = ""; }; - D0B6487B47F46E9A4257FFE2D6764ABA /* YYTextRunDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextRunDelegate.m; path = YYKit/Text/String/YYTextRunDelegate.m; sourceTree = ""; }; - D0D97445F8022139BB2546F1E114977E /* FBAllocationTrackerGenerationManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerGenerationManager.h; path = FBAllocationTracker/Generations/FBAllocationTrackerGenerationManager.h; sourceTree = ""; }; - D19624A87A419359560798A1BB0B6F44 /* FBAllocationTrackerSummary.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBAllocationTrackerSummary.m; path = FBAllocationTracker/FBAllocationTrackerSummary.m; sourceTree = ""; }; - D1F61F06A8C004D1D740C16CDA98DF13 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = ""; }; - D2E64A5822968FE5CB3F68A4F8705C72 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = ""; }; - D2F7CEBB1A9B91FD3A804467D307AA6C /* UIView+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MemoryLeak.m"; path = "MLeaksFinder/UIView+MemoryLeak.m"; sourceTree = ""; }; - D2FBA2765D46BD755D28DB22C86AD06A /* FBNodeEnumerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBNodeEnumerator.h; path = FBRetainCycleDetector/Detector/FBNodeEnumerator.h; sourceTree = ""; }; - D36BB1BCC8E2F29B9B000C894EDBEBDF /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = ""; }; - D39D80301ABB271A669B38688F34BCE2 /* FBAllocationTrackerManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerManager.h; path = FBAllocationTracker/FBAllocationTrackerManager.h; sourceTree = ""; }; - D4194C483B9B9A7F6849BF0E12A25E92 /* MASConstraintMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASConstraintMaker.h; path = Masonry/MASConstraintMaker.h; sourceTree = ""; }; - D49E82DDCE38B66E39BBC64B88C05650 /* libMJRefresh.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMJRefresh.a; sourceTree = BUILT_PRODUCTS_DIR; }; - D4A3730D0111229A07BC6E1FACFBC596 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; - D4B69A40C5A35C2F7BA47EB7146A0A4B /* UIControl+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+BlocksKit.h"; path = "BlocksKit/UIKit/UIControl+BlocksKit.h"; sourceTree = ""; }; - D4E7CFA66B6EF7657077F4BC2D8D0006 /* UMSocialSnsData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialSnsData.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h; sourceTree = ""; }; - D4F55EA627BF67A9A79DB19CC030FFC7 /* UMSShareListController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSShareListController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib; sourceTree = ""; }; + C08FCE176AA8AB645D9914A604A54C0F /* BMKOverlayPathView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOverlayPathView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayPathView.h; sourceTree = ""; }; + C1133B6CB319536971880F776861A938 /* RACStream.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACStream.m; path = ReactiveObjC/RACStream.m; sourceTree = ""; }; + C19AB24B4E3E55EF93EF9D3E42622DEC /* BMKAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKAnnotationView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKAnnotationView.h; sourceTree = ""; }; + C217BF798B10CE24A5CFD2D08FD44F53 /* libBAPickView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBAPickView.a; path = libBAPickView.a; sourceTree = BUILT_PRODUCTS_DIR; }; + C261D5021438CCB1D68559713BAB392C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + C297F809CF7A4C1E8C5362110E8DEB1C /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; + C2B11DF881084E9F909CF568AA69D08A /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYCache/YYCache.m; sourceTree = ""; }; + C2E84E8CAD885AA6C73FD3BE110F988F /* libDZNEmptyDataSet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libDZNEmptyDataSet.a; path = libDZNEmptyDataSet.a; sourceTree = BUILT_PRODUCTS_DIR; }; + C2F4D933150DAB263D0F1ADFF6D5FF9E /* MJFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJFoundation.m; path = MJExtension/MJFoundation.m; sourceTree = ""; }; + C3301E2066F370F905F0572A50A33F26 /* RACTestScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTestScheduler.h; path = ReactiveObjC/RACTestScheduler.h; sourceTree = ""; }; + C330ACCC3FFEF14A1148DC10375C00F8 /* NSData+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+RACSupport.h"; path = "ReactiveObjC/NSData+RACSupport.h"; sourceTree = ""; }; + C3A48DE1F908577C23BB69378BCC5B34 /* MLeaksMessenger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MLeaksMessenger.h; path = MLeaksFinder/MLeaksMessenger.h; sourceTree = ""; }; + C494FDBBA55D3265C3C0140FC7FD8D17 /* UITextView+BAKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITextView+BAKit.h"; path = "BATextView/BATextView/UITextView+BAKit.h"; sourceTree = ""; }; + C52DAC06DE562DF53E1DD173C42E2BE8 /* UINavigationController+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UINavigationController+MemoryLeak.m"; path = "MLeaksFinder/UINavigationController+MemoryLeak.m"; sourceTree = ""; }; + C596170919E35CD4258498390D989FEC /* UITableViewHeaderFooterView+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableViewHeaderFooterView+RACSignalSupport.h"; path = "ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h"; sourceTree = ""; }; + C5B928368CF1F81EE818B14DDE3E9280 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyboardManager/IQTextView/IQTextView.m; sourceTree = ""; }; + C607A6B1B7A3551AF885590E7B10D53D /* FBBlockStrongRelationDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBBlockStrongRelationDetector.h; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongRelationDetector.h; sourceTree = ""; }; + C6638A012A7EA49021C2580330CA7D10 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.h"; sourceTree = ""; }; + C689F5BDD13FC94864EDE8FAC3A3794E /* WBHttpRequest.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WBHttpRequest.h; path = UShareSDK/SocialLibraries/Sina/SinaSDK/WBHttpRequest.h; sourceTree = ""; }; + C6A13A70D1B717A4EC9DFF58875F725E /* BMKPolylineView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPolylineView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPolylineView.h; sourceTree = ""; }; + C6A3F2B7E15A00B6B57797E93320091E /* libPods-BABaseProject-BABaseProjectUITests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-BABaseProject-BABaseProjectUITests.a"; path = "libPods-BABaseProject-BABaseProjectUITests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C6B4C5C280265CD3729319E0A4BA07DF /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = ""; }; + C6DBCD28FCD626B506271488F6313370 /* BaseType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BaseType.h; path = FBRetainCycleDetector/Layout/Classes/Parser/BaseType.h; sourceTree = ""; }; + C70FE6E6862B92B401F41A93D102FBED /* NullSafe-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NullSafe-dummy.m"; sourceTree = ""; }; + C7F7038192838C521B2A3AAE6CF28774 /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = ""; }; + C802A885E69B23CC89AD20E978261BC3 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyboardManager/Resources/IQKeyboardManager.bundle; sourceTree = ""; }; + C80AB2A9B465DEB6A65841BCE3CE7D88 /* libSocialWeChat.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libSocialWeChat.a; path = UShareSDK/SocialLibraries/WeChat/libSocialWeChat.a; sourceTree = ""; }; + C81C77EBCDC767363836DB3363AD1268 /* BMKTileLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKTileLayer.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayer.h; sourceTree = ""; }; + C82E61DF961334D6581C54C2B08FEDAC /* Masonry-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Masonry-dummy.m"; sourceTree = ""; }; + C8622392B1B4AE791A1EC0CB748303DC /* BMKOverlay.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOverlay.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlay.h; sourceTree = ""; }; + C886872885D5259609AD09034FCE7F42 /* RACDynamicSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACDynamicSignal.m; path = ReactiveObjC/RACDynamicSignal.m; sourceTree = ""; }; + C89091427D7AB1D7B78625766365009E /* MyMaker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyMaker.h; path = MyLayout/Lib/MyMaker.h; sourceTree = ""; }; + C98FD91FE871F648F9FD7A5F9A45DB1E /* libPods-BABaseProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-BABaseProject.a"; path = "libPods-BABaseProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + CA38384949F3798DAC4DF09171283418 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = ""; }; + CA950E326630F652B88DB46CFEED7D56 /* BaiduMapAPI_Utils.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Utils.framework; path = BaiduMapKit/BaiduMapAPI_Utils.framework; sourceTree = ""; }; + CBC8BFF0774593786090569F092D9445 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; + CBD5AD45F98AC4CDCE624F473F6EDE6A /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; + CBDF01225E66C23D8036BF216E62BBC3 /* NSString+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+RACSequenceAdditions.m"; path = "ReactiveObjC/NSString+RACSequenceAdditions.m"; sourceTree = ""; }; + CC6DDDF0E27A3900E532CDE064919124 /* MASConstraint+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MASConstraint+Private.h"; path = "Masonry/MASConstraint+Private.h"; sourceTree = ""; }; + CC9BC32E321B69F4BA4FC25FE7439A35 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = ""; }; + CCC4EB67AC152CDA932EEBC5F7378174 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = ""; }; + CCCFBDDF63B471BDF11A4AD364CAE939 /* libAFNetworking.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libAFNetworking.a; path = libAFNetworking.a; sourceTree = BUILT_PRODUCTS_DIR; }; + CCE6A9D5F175ACCC7658035BF3FBDAB1 /* ReactiveObjC.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ReactiveObjC.h; path = ReactiveObjC/ReactiveObjC.h; sourceTree = ""; }; + CD1DED575B5BF7C305691C875E96D5B4 /* RACSerialDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSerialDisposable.h; path = ReactiveObjC/RACSerialDisposable.h; sourceTree = ""; }; + CD386AAF63FC4BFFECF7EDAFD0F7926D /* RACChannel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACChannel.m; path = ReactiveObjC/RACChannel.m; sourceTree = ""; }; + CDA9442E6A4034841DD6CB3FDFA0C73C /* UIControl+RACSignalSupportPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIControl+RACSignalSupportPrivate.h"; path = "ReactiveObjC/UIControl+RACSignalSupportPrivate.h"; sourceTree = ""; }; + CDACE2021E194A0AE2834AEBFE532D53 /* RACSubscriber.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubscriber.h; path = ReactiveObjC/RACSubscriber.h; sourceTree = ""; }; + CDFE4F3A1FED05F13047CE223843F1CF /* RACKVOChannel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACKVOChannel.h; path = ReactiveObjC/RACKVOChannel.h; sourceTree = ""; }; + CE0941E28ED4E88FB4BA97BC1DEAF98E /* UIViewController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIViewController+MemoryLeak.h"; path = "MLeaksFinder/UIViewController+MemoryLeak.h"; sourceTree = ""; }; + CE4E9B76191389562F0DDD143BC73213 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = ""; }; + CF00B06C975E6813C428E385C676BD56 /* UIControl+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+RACSignalSupport.m"; path = "ReactiveObjC/UIControl+RACSignalSupport.m"; sourceTree = ""; }; + CF3E2739C3A89F92FA9F0BF32A29D00C /* RACSignal+Operations.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "RACSignal+Operations.m"; path = "ReactiveObjC/RACSignal+Operations.m"; sourceTree = ""; }; + CFBD8791D09EE1815BCB927F6836005E /* TencentOpenAPI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TencentOpenAPI.framework; path = UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework; sourceTree = ""; }; + D05680A3EF91F26983800EFD7ABA4953 /* JMRoundedCorner-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JMRoundedCorner-dummy.m"; sourceTree = ""; }; + D098EF662A91968498A77E124302EB90 /* MBProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MBProgressHUD-dummy.m"; sourceTree = ""; }; + D15D4B4697C831661E28AF4B426694E9 /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = ""; }; + D1CC9C76C884F56DA3F1402A420CBB6F /* FBObjectiveCGraphElement+Internal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "FBObjectiveCGraphElement+Internal.h"; path = "FBRetainCycleDetector/Graph/Internal/FBObjectiveCGraphElement+Internal.h"; sourceTree = ""; }; + D1DD67320E69D9D20A89276F401C56E4 /* BATouchID.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BATouchID.h; path = BATouchID/BATouchID/BATouchID.h; sourceTree = ""; }; + D1DF4057A74B52A69C7CDE21A4834E7D /* BMKShareUrlSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKShareUrlSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKShareUrlSearchOption.h; sourceTree = ""; }; + D21EEE027DB8D34C65A2AAF14CCE57C3 /* NSUserDefaults+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSUserDefaults+RACSupport.h"; path = "ReactiveObjC/NSUserDefaults+RACSupport.h"; sourceTree = ""; }; + D25479F0E7B16C558BF66D03CC55D9FE /* NSDateFormatter+BAKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDateFormatter+BAKit.h"; path = "BAPickView/BAPickView/NSDateFormatter+BAKit.h"; sourceTree = ""; }; + D27FBB194DFB1179123199D9E1FE436C /* RACSubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACSubject.h; path = ReactiveObjC/RACSubject.h; sourceTree = ""; }; + D2A9DBF98EF72B1552A4B9DCA1A0C551 /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = ""; }; + D2F01DC15821781C72495F8E508A6311 /* MyLayoutPos.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutPos.h; path = MyLayout/Lib/MyLayoutPos.h; sourceTree = ""; }; + D2FE91EA1F722AA810863F6BE215C71C /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = ""; }; + D32E6325008AAAE78A388EA99F2A6E78 /* NSString+RACKeyPathUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACKeyPathUtilities.h"; path = "ReactiveObjC/NSString+RACKeyPathUtilities.h"; sourceTree = ""; }; + D3867859D01997146ED0A6B55678EAE0 /* RACReplaySubject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACReplaySubject.h; path = ReactiveObjC/RACReplaySubject.h; sourceTree = ""; }; + D4E29B4AA52D095FFB047449C90C7A5D /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = ""; }; + D4F6611986B976C30B2750D210B5F268 /* BMKCloudPOIList.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKCloudPOIList.h; path = BaiduMapKit/BaiduMapAPI_Cloud.framework/Headers/BMKCloudPOIList.h; sourceTree = ""; }; D524915C5A0A1A83100E9931AC8A93A1 /* Pods-BABaseProject-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BABaseProject-acknowledgements.plist"; sourceTree = ""; }; - D586E48D6140F434735ECC61B950C26E /* Masonry-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Masonry-prefix.pch"; sourceTree = ""; }; - D5E91893A2BA596C95A6A8AC13D5C898 /* BKMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BKMacros.h; path = BlocksKit/Core/BKMacros.h; sourceTree = ""; }; - D615F0566F405F9ED0B6C36DBAA5780C /* SDAutoLayout.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.xcconfig; sourceTree = ""; }; - D6382D11AA5824138CAA1CBDF864CC67 /* NSObject+A2BlockDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+A2BlockDelegate.h"; path = "BlocksKit/DynamicDelegate/NSObject+A2BlockDelegate.h"; sourceTree = ""; }; - D657546308DBF394A9D70B57267F3EB9 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = ""; }; - D6651B1A1A3DE36DF389E74039694E4A /* MASViewConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASViewConstraint.m; path = Masonry/MASViewConstraint.m; sourceTree = ""; }; - D703C0242C6046CA4560FBB06E74919B /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyboardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = ""; }; - D7046318878BEB7205B99B6497830033 /* FBNodeEnumerator.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBNodeEnumerator.mm; path = FBRetainCycleDetector/Detector/FBNodeEnumerator.mm; sourceTree = ""; }; - D7A3CE6D39FF34F83D9FCAFC0873C9B8 /* NSDictionary+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+YYAdd.h"; path = "YYKit/Base/Foundation/NSDictionary+YYAdd.h"; sourceTree = ""; }; - D7B3E48295B4763DBA3953A20520C8A4 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = ""; }; - D7FA3479A588D12346AABFFC5E7B8AFF /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = ""; }; - D8C7363D104E3C693F0B79121ED330FD /* WBHttpRequest+WeiboToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "WBHttpRequest+WeiboToken.h"; path = "Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboToken.h"; sourceTree = ""; }; - D8DDA95A028C77605EF2532B00BFD808 /* FBRetainCycleDetector.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCycleDetector.h; path = FBRetainCycleDetector/Detector/FBRetainCycleDetector.h; sourceTree = ""; }; - D9090FFFBCCA96A0D24052D1D2AAE64D /* FBAllocationTrackerImpl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTrackerImpl.h; path = FBAllocationTracker/FBAllocationTrackerImpl.h; sourceTree = ""; }; - D95948DEC2901596D888633F34A13CC6 /* FBMemoryProfiler.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBMemoryProfiler.mm; path = FBMemoryProfiler/FBMemoryProfiler.mm; sourceTree = ""; }; - D964DD3090BBFF5546FC9B414D405D14 /* FBRetainCycleAnalysisCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCycleAnalysisCache.h; path = FBMemoryProfiler/RetainCycles/FBRetainCycleAnalysisCache.h; sourceTree = ""; }; - D99E1BDC316954C3C939D857AC5E059E /* YYKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKeychain.h; path = YYKit/Utility/YYKeychain.h; sourceTree = ""; }; - DA9F4C442D76AE0BE69338FF7A29D2C9 /* UIWebView+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+BlocksKit.m"; path = "BlocksKit/UIKit/UIWebView+BlocksKit.m"; sourceTree = ""; }; - DAC6A3EC477ABAB4D70C54E869B7CE45 /* UITabBarController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITabBarController+MemoryLeak.h"; path = "MLeaksFinder/UITabBarController+MemoryLeak.h"; sourceTree = ""; }; - DB7B7F8B9D09D708552B8FF85D1D7AD0 /* NSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSLayoutConstraint+MASDebugAdditions.m"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; - DBB096B7CC3837A70F84D8164E0865F2 /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = ""; }; - DC4B16A2C39B9FDED877B0623F36525E /* UINavigationController+MemoryLeak.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UINavigationController+MemoryLeak.h"; path = "MLeaksFinder/UINavigationController+MemoryLeak.h"; sourceTree = ""; }; - DD3DA039268C9830A065E3A491D2792C /* MJExtension.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJExtension.xcconfig; sourceTree = ""; }; - DDAF05766BC95B7E64BAF8436774173D /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = ""; }; - DE6D61E44A4DCF9F0735A488361C9B26 /* FBMemoryProfilerOptions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerOptions.h; path = FBMemoryProfiler/Options/FBMemoryProfilerOptions.h; sourceTree = ""; }; - DEB50FEE8CDB249C45E029B81CA9A133 /* A2BlockInvocation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A2BlockInvocation.m; path = BlocksKit/DynamicDelegate/A2BlockInvocation.m; sourceTree = ""; }; - DEBF2D21FAC9B1B4DF6E6E4055D75BBA /* NSObject+MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJProperty.h"; path = "MJExtension/NSObject+MJProperty.h"; sourceTree = ""; }; - DEC231E8241338FFB497649DB24FE2E8 /* FBBlockStrongRelationDetector.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBBlockStrongRelationDetector.m; path = FBRetainCycleDetector/Layout/Blocks/FBBlockStrongRelationDetector.m; sourceTree = ""; }; - DF4A42C3053AABAE1B120AAC4BBBF872 /* FBRetainCyclePresenter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBRetainCyclePresenter.m; path = FBMemoryProfiler/RetainCycles/FBRetainCyclePresenter.m; sourceTree = ""; }; - DF66E7154C36ACA86C68678E421495A1 /* NSNumber+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+YYAdd.m"; path = "YYKit/Base/Foundation/NSNumber+YYAdd.m"; sourceTree = ""; }; - DF88779B8746883C828911769CE87E6B /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = ""; }; - DFA5E3502B4CBD9332D644FB4C689A6B /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYKit/Image/YYImageCoder.m; sourceTree = ""; }; - E029EA548246F048B3F048B3B7479B7F /* MJRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.xcconfig; sourceTree = ""; }; - E0AC86376BE98456E5785A7DB9482C7B /* MyFlowLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFlowLayout.m; path = MyLayout/Lib/MyFlowLayout.m; sourceTree = ""; }; - E13097D81D2A6053B27C37D5D3D1EA12 /* UIView+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+YYAdd.h"; path = "YYKit/Base/UIKit/UIView+YYAdd.h"; sourceTree = ""; }; - E146447886DC5E8C6720ACA35A563954 /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyboardManager/IQTextView/IQTextView.h; sourceTree = ""; }; - E1817E153C3792A869175BA950DCCB82 /* UIImage+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYAdd.m"; path = "YYKit/Base/UIKit/UIImage+YYAdd.m"; sourceTree = ""; }; - E196B124A11D919BDB535AC02A361E92 /* UIImagePickerController+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+BlocksKit.m"; path = "BlocksKit/UIKit/UIImagePickerController+BlocksKit.m"; sourceTree = ""; }; - E1C0048F5E133A922700A51EE9BE7EB4 /* libNullSafe.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libNullSafe.a; sourceTree = BUILT_PRODUCTS_DIR; }; - E24D9A769655360BD36ED428F0E80DD8 /* FBMemoryProfilerPluggable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBMemoryProfilerPluggable.h; path = FBMemoryProfiler/Options/FBMemoryProfilerPluggable.h; sourceTree = ""; }; - E2731F4D7BD3F9247B4761D28F321760 /* YYTextRunDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYTextRunDelegate.h; path = YYKit/Text/String/YYTextRunDelegate.h; sourceTree = ""; }; - E2DA34D963312173C67C4B7D5132546C /* NSObject+BKAssociatedObjects.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+BKAssociatedObjects.h"; path = "BlocksKit/Core/NSObject+BKAssociatedObjects.h"; sourceTree = ""; }; - E30A9675183BB486BE625AA6316E7721 /* NSString+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+YYAdd.h"; path = "YYKit/Base/Foundation/NSString+YYAdd.h"; sourceTree = ""; }; - E3357C2D50236DED53B1C1A8BF1F135F /* libMLeaksFinder.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMLeaksFinder.a; sourceTree = BUILT_PRODUCTS_DIR; }; - E3502342F5345D3C550A0A17EA0E52EB /* FBMemoryProfiler-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBMemoryProfiler-prefix.pch"; sourceTree = ""; }; - E361C521530C24F374AFCC26F76C675F /* IQUIWindow+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIWindow+Hierarchy.m"; path = "IQKeyboardManager/Categories/IQUIWindow+Hierarchy.m"; sourceTree = ""; }; - E3BF14FD2D4416057FD82A5E63D8DEE2 /* UMSocialWhatsappHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialWhatsappHandler.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h; sourceTree = ""; }; - E48A191CC7E14B27BFA0D94D8A80757C /* UMShareEditViewController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMShareEditViewController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib; sourceTree = ""; }; - E565DFF66A43EADBF8073D60C1EAF199 /* NSNotificationCenter+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNotificationCenter+YYAdd.m"; path = "YYKit/Base/Foundation/NSNotificationCenter+YYAdd.m"; sourceTree = ""; }; - E57F44121735798601DF56B845467DD2 /* MJFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJFoundation.m; path = MJExtension/MJFoundation.m; sourceTree = ""; }; - E5EBF7E78D49012DAE5811432FC529ED /* NSIndexSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSIndexSet+BlocksKit.m"; path = "BlocksKit/Core/NSIndexSet+BlocksKit.m"; sourceTree = ""; }; - E69CB91A5BAE7E61ADE8A4E67875226A /* YYWeakProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWeakProxy.m; path = YYKit/Utility/YYWeakProxy.m; sourceTree = ""; }; - E70291ACEF1EAD6C0819A7A42F40F502 /* libPods-BABaseProject.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-BABaseProject.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - E75E291B3A0973671AC25F9E496173A0 /* IQPreviousNextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQPreviousNextView.m; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.m; sourceTree = ""; }; - E8506E36A4E57A364CA6A968BDAEBD5C /* YYKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKeychain.m; path = YYKit/Utility/YYKeychain.m; sourceTree = ""; }; - E8FC988D841065B3C10D3B37D0EB0ABB /* FBMemoryProfilerSegmentedControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerSegmentedControl.m; path = FBMemoryProfiler/UI/FBMemoryProfilerSegmentedControl.m; sourceTree = ""; }; - E951B238F55C08FB59E90C3CD49C7D42 /* FBSingleRetainCycleViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSingleRetainCycleViewController.m; path = FBMemoryProfiler/RetainCycles/FBSingleRetainCycleViewController.m; sourceTree = ""; }; - E9A29391645458A5ACF59762C0A9846D /* CALayer+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYAdd.m"; path = "YYKit/Base/Quartz/CALayer+YYAdd.m"; sourceTree = ""; }; - E9F2FFEE4EDC1FAFA1DEF9F606B16B9A /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYKit/Cache/YYKVStorage.m; sourceTree = ""; }; - EA1AA8DE0CB6CF581C4AAB03370A94B2 /* YYSentinel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSentinel.h; path = YYKit/Utility/YYSentinel.h; sourceTree = ""; }; - EAEA5A83D31722BBA1F2B21C610BBBDD /* MyLayoutDimeInner.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutDimeInner.h; path = MyLayout/Lib/MyLayoutDimeInner.h; sourceTree = ""; }; - EB5020FF33CED698BEFD41A7EFDDD117 /* FBObjectInStructReference.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectInStructReference.m; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectInStructReference.m; sourceTree = ""; }; + D5526ED44F63AB6324BF008FFF234533 /* RACKVOChannel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACKVOChannel.m; path = ReactiveObjC/RACKVOChannel.m; sourceTree = ""; }; + D6125A92A79F0174D519EEA96DDB6614 /* BANetManagerCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BANetManagerCache.h; path = BANetManager/BANetManagerCache.h; sourceTree = ""; }; + D64F734FA822B14CA076B30D87148111 /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; }; + D6568FECDA701F3E6F731327E406ED63 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = ""; }; + D6902DCE08C05000C58385292DC7EFAE /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJRefresh-dummy.m"; sourceTree = ""; }; + D6942A984722D6CFE2F9E9E4B3668EE9 /* MJRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.xcconfig; sourceTree = ""; }; + D6EAFF8D5BA13E11EEA9AFA58781F851 /* RACGroupedSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACGroupedSignal.h; path = ReactiveObjC/RACGroupedSignal.h; sourceTree = ""; }; + D738726436B6FEDFF7B108051BF55533 /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYCache/YYCache.h; sourceTree = ""; }; + D751E5324CC91F43E41E599645283EB1 /* RACUnarySequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACUnarySequence.m; path = ReactiveObjC/RACUnarySequence.m; sourceTree = ""; }; + D7542A991595F09E904571E427247496 /* UITextView+BAKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITextView+BAKit.m"; path = "BATextView/BATextView/UITextView+BAKit.m"; sourceTree = ""; }; + D8102957964045D9CE1780BC8C2B4D72 /* AFNetworking.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.xcconfig; sourceTree = ""; }; + D87BF6AA9F0E669F88F010CACE9BB211 /* RACSignalSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSignalSequence.m; path = ReactiveObjC/RACSignalSequence.m; sourceTree = ""; }; + D8A14CE787496A01B9AEBA346AC0794A /* RACUnit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACUnit.h; path = ReactiveObjC/RACUnit.h; sourceTree = ""; }; + D8AF76CFC6451B8E24F41A1078F95ED3 /* MBProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MBProgressHUD-prefix.pch"; sourceTree = ""; }; + D9490851F54406E0F550CD313F4E431C /* UMMobClick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UMMobClick.framework; path = "umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework"; sourceTree = ""; }; + D959636B8252E5AA339ADFD5924D847F /* RACDynamicSignal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDynamicSignal.h; path = ReactiveObjC/RACDynamicSignal.h; sourceTree = ""; }; + D9D50A1B986AE4CBAC9F25A3B87D0CE6 /* MASConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraint.m; path = Masonry/MASConstraint.m; sourceTree = ""; }; + DAC1A8C272EB902E442B93356AA4163F /* MyMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyMaker.m; path = MyLayout/Lib/MyMaker.m; sourceTree = ""; }; + DB3CD6E69E7748B39B733D1CCA14FD93 /* NSDateFormatter+BAKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDateFormatter+BAKit.m"; path = "BAPickView/BAPickView/NSDateFormatter+BAKit.m"; sourceTree = ""; }; + DBCFE478A76EF2089C162BBADCD26CF7 /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = ""; }; + DC0BAAA1862835201D4F9D25160103B0 /* BMKGeocodeSearchOption.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGeocodeSearchOption.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKGeocodeSearchOption.h; sourceTree = ""; }; + DCE12E777FDFB5F59CE3D1AB607EA1C6 /* MJExtensionConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJExtensionConst.m; path = MJExtension/MJExtensionConst.m; sourceTree = ""; }; + DCF1281E65E2614206531CCAC9EF8BE4 /* MyLayoutPos.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutPos.m; path = MyLayout/Lib/MyLayoutPos.m; sourceTree = ""; }; + DD0AEFE68EC51F3983E1C9EBC7D198B1 /* NSSet+RACSequenceAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSSet+RACSequenceAdditions.h"; path = "ReactiveObjC/NSSet+RACSequenceAdditions.h"; sourceTree = ""; }; + DE2C979AC4E4695037FE10A14C2D6804 /* UIRefreshControl+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+RACCommandSupport.m"; path = "ReactiveObjC/UIRefreshControl+RACCommandSupport.m"; sourceTree = ""; }; + DE4CD48C05C643B0431363B88957C07D /* WXApi.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WXApi.h; path = UShareSDK/SocialLibraries/WeChat/WechatSDK/WXApi.h; sourceTree = ""; }; + DE63024DF0B71846FBEEF4623BCA9019 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; + DE7D2E3A124FAB095EE7CB6E4AEA9236 /* UIAlertView+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIAlertView+RACSignalSupport.m"; path = "ReactiveObjC/UIAlertView+RACSignalSupport.m"; sourceTree = ""; }; + DEFFACBDB5976EC63F435EED20E997ED /* libFBRetainCycleDetector.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libFBRetainCycleDetector.a; path = libFBRetainCycleDetector.a; sourceTree = BUILT_PRODUCTS_DIR; }; + DF1CC7469F808ED02F6DC3ABF853FD6D /* BMKRouteSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKRouteSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKRouteSearch.h; sourceTree = ""; }; + DF5CEF7A0BFD5821969BAE27D9E9A1F0 /* BMKMapStatus.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMapStatus.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapStatus.h; sourceTree = ""; }; + DF95114B2DC23082C9E4025F811DDC6F /* BATextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BATextView.h; path = BATextView/BATextView/BATextView.h; sourceTree = ""; }; + E08B3DC6CF4BBBB8A46DD8C3F4FDE387 /* BaiduMapAPI_Radar.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Radar.framework; path = BaiduMapKit/BaiduMapAPI_Radar.framework; sourceTree = ""; }; + E11A5341F1CFE9AF45B9239EC8D3D85F /* BMKBaseIndoorMapInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKBaseIndoorMapInfo.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKBaseIndoorMapInfo.h; sourceTree = ""; }; + E1E71F9D7C259E084C1EB5A9B55F4155 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = ""; }; + E228B8F4E47E733FC8629782BCAB3542 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = ""; }; + E25F808055257D1088E5D63822CA2698 /* FBObjectInStructReference.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBObjectInStructReference.h; path = FBRetainCycleDetector/Layout/Classes/Reference/FBObjectInStructReference.h; sourceTree = ""; }; + E263CDE84DF182C2232CD2991EFFFA0C /* FBAssociationManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBAssociationManager.mm; path = FBRetainCycleDetector/Associations/FBAssociationManager.mm; sourceTree = ""; }; + E289E6000C07977DD066205B22CF45BE /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyboardManager/Categories/IQNSArray+Sort.m"; sourceTree = ""; }; + E331D4315A214B57E7B39B57D7235F53 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyboardManager/Categories/IQUIViewController+Additions.m"; sourceTree = ""; }; + E4A205075DBA8F207C0ACC94D0CB22F5 /* UIButton+RACCommandSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+RACCommandSupport.m"; path = "ReactiveObjC/UIButton+RACCommandSupport.m"; sourceTree = ""; }; + E52F1D54AB1F3F85B2D2AB64AE320577 /* BMKTileLayerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKTileLayerView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKTileLayerView.h; sourceTree = ""; }; + E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + E5AF350229D2492D5661257C508B10BA /* MyFloatLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyFloatLayout.m; path = MyLayout/Lib/MyFloatLayout.m; sourceTree = ""; }; + E5F1FE1740DB2CBDE3A588874FF5CEBF /* NSObject+MJProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJProperty.m"; path = "MJExtension/NSObject+MJProperty.m"; sourceTree = ""; }; + E63B5058F296F2BADE7AF7F881D2A5A7 /* WechatAuthSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WechatAuthSDK.h; path = UShareSDK/SocialLibraries/WeChat/WechatSDK/WechatAuthSDK.h; sourceTree = ""; }; + E65C0D8FDC6F71353B02F309F7BE46B1 /* MBProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; + E67C8590AB01E04303A4CB757B9EF9C8 /* FMDatabasePool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabasePool.m; path = src/fmdb/FMDatabasePool.m; sourceTree = ""; }; + E69699E8B0D6448DF0DB6D15E963CB92 /* WeiboSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WeiboSDK.h; path = UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.h; sourceTree = ""; }; + E6DB5CF4A72C51298AB0775908547ACC /* BMKSuggestionSearch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKSuggestionSearch.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKSuggestionSearch.h; sourceTree = ""; }; + E6E759698AEEACB0D25C59A6E2293428 /* RACIndexSetSequence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACIndexSetSequence.m; path = ReactiveObjC/RACIndexSetSequence.m; sourceTree = ""; }; + E74C48E55C9840886DA46DE722D075EE /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = ""; }; + E776533117D9BAF8AF776D255087524C /* NSObject+MJProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJProperty.h"; path = "MJExtension/NSObject+MJProperty.h"; sourceTree = ""; }; + E7B74F4BEC5432F8CAE802632F7FE075 /* BMKPinAnnotationView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPinAnnotationView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKPinAnnotationView.h; sourceTree = ""; }; + E7BA51C89206DA133993E548DF4A3301 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = ""; }; + E7F5B97BDC24E97AE6E21DC0221419B4 /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+MJExtension.m"; path = "MJRefresh/UIView+MJExtension.m"; sourceTree = ""; }; + E8509EAC97FC971E791A2A5C248EC9D7 /* FMResultSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMResultSet.m; path = src/fmdb/FMResultSet.m; sourceTree = ""; }; + E867981DA05B944DC6F56866658B220E /* FMDatabaseQueue.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FMDatabaseQueue.m; path = src/fmdb/FMDatabaseQueue.m; sourceTree = ""; }; + E890B95F7128A9E3A635022395ABD04F /* BMKOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKOverlayView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKOverlayView.h; sourceTree = ""; }; + E8FCEFDAFDF12FCFC776957239B52E91 /* View+MASAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "View+MASAdditions.h"; path = "Masonry/View+MASAdditions.h"; sourceTree = ""; }; + E91A174996D1BC996779C6506C28A744 /* IQPreviousNextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQPreviousNextView.m; path = IQKeyboardManager/IQToolbar/IQPreviousNextView.m; sourceTree = ""; }; + E9351AA02F3EB08E3784279C62F1EF9C /* NSUserDefaults+RACSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSUserDefaults+RACSupport.m"; path = "ReactiveObjC/NSUserDefaults+RACSupport.m"; sourceTree = ""; }; + E94641D09D42A41BACD43E868A83A186 /* FMDatabaseQueue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FMDatabaseQueue.h; path = src/fmdb/FMDatabaseQueue.h; sourceTree = ""; }; + EB1C8D0E3F3A6763EBACDEA6AF77B9D1 /* MyFrameLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyFrameLayout.h; path = MyLayout/Lib/MyFrameLayout.h; sourceTree = ""; }; EB57CCC4B9B45429B2D81F6A6CAFE2E8 /* Pods-BABaseProject-BABaseProjectUITests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BABaseProject-BABaseProjectUITests-resources.sh"; sourceTree = ""; }; - EB720667DA3FF657F2496806E4147791 /* UIScreen+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+YYAdd.m"; path = "YYKit/Base/UIKit/UIScreen+YYAdd.m"; sourceTree = ""; }; - EBB6B9021DC0896B8CC106657449A78F /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = ""; }; - EBEBBAE1D7591EDAC9B55F67C9DFC01C /* NSOrderedSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSOrderedSet+BlocksKit.h"; path = "BlocksKit/Core/NSOrderedSet+BlocksKit.h"; sourceTree = ""; }; - EBF706F17C94E152003A5AF47B58798A /* libSDWebImage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSDWebImage.a; sourceTree = BUILT_PRODUCTS_DIR; }; - EC5CEF7487FECB58388614ED120649BD /* libMJExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMJExtension.a; sourceTree = BUILT_PRODUCTS_DIR; }; - ECFE48D475CD44CBED9B7C5289FDCEAE /* FBMemoryProfilerGenerationsSectionHeaderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBMemoryProfilerGenerationsSectionHeaderView.m; path = FBMemoryProfiler/Views/FBMemoryProfilerGenerationsSectionHeaderView.m; sourceTree = ""; }; - EDBB49A61C680654850393134FF81A3F /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = ""; }; - EE9890BBAC64710822418EC5F409CC58 /* YYTextAttribute.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextAttribute.m; path = YYKit/Text/String/YYTextAttribute.m; sourceTree = ""; }; - EEBC201545F6D08325C07BEFE95ED729 /* NSLayoutConstraint+MASDebugAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSLayoutConstraint+MASDebugAdditions.h"; path = "Masonry/NSLayoutConstraint+MASDebugAdditions.h"; sourceTree = ""; }; - EEBF868F328C3579C273A0D79731FFC0 /* NSSet+BlocksKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSSet+BlocksKit.h"; path = "BlocksKit/Core/NSSet+BlocksKit.h"; sourceTree = ""; }; - EED9B0E5C27AF17F07BE6DA6FD2F4334 /* UIDevice+YYAdd.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIDevice+YYAdd.m"; path = "YYKit/Base/UIKit/UIDevice+YYAdd.m"; sourceTree = ""; }; - EF2B66CE438E19453A385D102B55B2E8 /* NSString+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+MJExtension.h"; path = "MJExtension/NSString+MJExtension.h"; sourceTree = ""; }; - EF9FCC932C774D75C21C9F8A3D51589B /* WeiboSDK.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WeiboSDK.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h; sourceTree = ""; }; - F0DC07796E1AD29178646F4F82583274 /* NSNumber+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+YYAdd.h"; path = "YYKit/Base/Foundation/NSNumber+YYAdd.h"; sourceTree = ""; }; + EBFC03F0A603F5F06588BA74F5319B6F /* NullSafe.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NullSafe.m; path = NullSafe/NullSafe.m; sourceTree = ""; }; + EC0BE1AE163D88FAC4BC0AF824659DF2 /* UIControl+RACSignalSupportPrivate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+RACSignalSupportPrivate.m"; path = "ReactiveObjC/UIControl+RACSignalSupportPrivate.m"; sourceTree = ""; }; + EC22AED41E78032182E018DD30D3CD1B /* UMSocialSDKResources.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = UMSocialSDKResources.bundle; path = UShareSDK/UMSocialUI/UMSocialSDKResources.bundle; sourceTree = ""; }; + ECBEC57B84F9854CC7B039CE8AF36ECA /* libSocialAlipayShare.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; name = libSocialAlipayShare.a; path = UShareSDK/SocialLibraries/AlipayShare/libSocialAlipayShare.a; sourceTree = ""; }; + ED40B90F1D6C8B733F48574D41DED4EF /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = ""; }; + ED6C495242508E51175CD46DE280A767 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyboardManager/IQKeyboardReturnKeyHandler.h; sourceTree = ""; }; + EE03606EBDEE9CF546D23CE0585CAB15 /* UIButton+RACCommandSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+RACCommandSupport.h"; path = "ReactiveObjC/UIButton+RACCommandSupport.h"; sourceTree = ""; }; + EE0C97E240B531A6F37F89D953DF2C6E /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = ""; }; + EE2A2D475EA9BC6D7A3D80C6DFDDFC5C /* BAButton-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "BAButton-prefix.pch"; sourceTree = ""; }; + EE6B82B7B241315F082442745525D3B1 /* Type.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Type.h; path = FBRetainCycleDetector/Layout/Classes/Parser/Type.h; sourceTree = ""; }; + EEA522201A6FF495C79C40CF9DD1C4D0 /* BAAlert.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BAAlert.xcconfig; sourceTree = ""; }; + EEA7BF8AD0BBE0F7C0E09936A24D445F /* MASLayoutConstraint.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASLayoutConstraint.m; path = Masonry/MASLayoutConstraint.m; sourceTree = ""; }; + EF0AAF659293E8380276C4C74A26693F /* BAActionSheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BAActionSheet.h; path = BAAlert/BAAlert/BAActionSheet.h; sourceTree = ""; }; + EF18E4AAAC5DD37D24DF555530DC5B2A /* UIImagePickerController+RACSignalSupport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImagePickerController+RACSignalSupport.m"; path = "ReactiveObjC/UIImagePickerController+RACSignalSupport.m"; sourceTree = ""; }; + EF7CC2A346C1AA725029F1299F22DEBC /* RACStream+Private.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "RACStream+Private.h"; path = "ReactiveObjC/RACStream+Private.h"; sourceTree = ""; }; + EF804754A2A4BA00ED0571DD360E073C /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; + EF83EE0F915810D84F50C89DD19D7D53 /* RACTargetQueueScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACTargetQueueScheduler.h; path = ReactiveObjC/RACTargetQueueScheduler.h; sourceTree = ""; }; + EF9A17FC90908EF12F33CAE11F0E3363 /* UIDatePicker+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIDatePicker+RACSignalSupport.h"; path = "ReactiveObjC/UIDatePicker+RACSignalSupport.h"; sourceTree = ""; }; + F10F1F4BADC29D2C7A221C2C968B1FC3 /* MyLayoutDef.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyLayoutDef.h; path = MyLayout/Lib/MyLayoutDef.h; sourceTree = ""; }; + F1245DCADA367ECF0B9A5FC124EC259B /* FBNodeEnumerator.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = FBNodeEnumerator.mm; path = FBRetainCycleDetector/Detector/FBNodeEnumerator.mm; sourceTree = ""; }; + F149A61901C3091F204FAD2C10BDC48F /* BATextView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = BATextView.xcconfig; sourceTree = ""; }; + F18B63F5AB0904D247F9A1DD347C1131 /* NSSet+RACSequenceAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSSet+RACSequenceAdditions.m"; path = "ReactiveObjC/NSSet+RACSequenceAdditions.m"; sourceTree = ""; }; + F1B91314EBC4598EB68803B118725BA2 /* RACSignal.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSignal.m; path = ReactiveObjC/RACSignal.m; sourceTree = ""; }; + F1E6E56CE71732E8ECCA47B8DC8DADB5 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = ""; }; F1FD976657C231B956D88FBE38E12E75 /* Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown"; sourceTree = ""; }; - F20F416612C50E1062F61F7FAEA80685 /* A2DynamicDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = A2DynamicDelegate.m; path = BlocksKit/DynamicDelegate/A2DynamicDelegate.m; sourceTree = ""; }; - F2889C10D93653FBF156A4E9F1118976 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = ""; }; - F2A77BF6A316546884477C33D437F1BC /* YYLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYLabel.m; path = YYKit/Text/YYLabel.m; sourceTree = ""; }; - F2D6E4AD12709448D4620BCF9EFF9D3D /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScrollView+MJExtension.m"; path = "MJRefresh/UIScrollView+MJExtension.m"; sourceTree = ""; }; - F2E12AD898A18DB42AA23058D5988B26 /* FBAllocationTracker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBAllocationTracker.h; path = FBAllocationTracker/FBAllocationTracker.h; sourceTree = ""; }; + F251007383EE0D771424EE7E274C7C80 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = ""; }; + F29F7E71C1DD342C396D05EC998B0A2B /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = ""; }; + F2D5CCC769B68FD5CA071CE470976902 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyboardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = ""; }; F2E9A4555AAE6FCF7DCB2FF3F7C59A90 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist"; sourceTree = ""; }; - F308182CA3866179A7F1ADF881957B40 /* NSDictionary+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+BlocksKit.m"; path = "BlocksKit/Core/NSDictionary+BlocksKit.m"; sourceTree = ""; }; - F3344DCAA1D92FED489A26D42524D37E /* NSObject+MJKeyValue.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+MJKeyValue.h"; path = "MJExtension/NSObject+MJKeyValue.h"; sourceTree = ""; }; - F339944D1DE1DBBC3531925D7096318F /* YYTextLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextLayout.m; path = YYKit/Text/Component/YYTextLayout.m; sourceTree = ""; }; - F38779F1A83D21F874604E26DEE40E0A /* libIQKeyboardManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libIQKeyboardManager.a; sourceTree = BUILT_PRODUCTS_DIR; }; - F3909CA2318F98A6D06C2D6EF9B13CB5 /* SDWebImage.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.xcconfig; sourceTree = ""; }; - F3EF33ABB1B73B0A960D36421A6D411C /* A2DynamicDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = A2DynamicDelegate.h; path = BlocksKit/DynamicDelegate/A2DynamicDelegate.h; sourceTree = ""; }; - F46E65C6A7E7233681EC6C6D760231E1 /* UMSCommentInputController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSCommentInputController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib; sourceTree = ""; }; - F56D1B6C10D1F13D6A18CDFE635F3060 /* YYTextEffectWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextEffectWindow.m; path = YYKit/Text/Component/YYTextEffectWindow.m; sourceTree = ""; }; - F57FBC0CC07E11A9B5E4207B5A683C10 /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = ""; }; - F5F829DA8589FDD6D38B3C73FF05BC97 /* FBAllocationTrackerGeneration.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAllocationTrackerGeneration.mm; path = FBAllocationTracker/Generations/FBAllocationTrackerGeneration.mm; sourceTree = ""; }; - F6A8C0F42635BF416D1CE21CE53B85C8 /* UIApplication+MemoryLeak.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+MemoryLeak.m"; path = "MLeaksFinder/UIApplication+MemoryLeak.m"; sourceTree = ""; }; - F6C2E14E34B70EFE1465E0369C4533F6 /* APOpenAPIObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = APOpenAPIObject.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h; sourceTree = ""; }; - F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - F80D4FDDD654673A1021C21D4DDD8F24 /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = ""; }; - F8131B2692E436306CEFF69EE2C8B173 /* NSMutableIndexSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableIndexSet+BlocksKit.m"; path = "BlocksKit/Core/NSMutableIndexSet+BlocksKit.m"; sourceTree = ""; }; - F83D22C26E9610A1D078B3934D89B715 /* YYAsyncLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAsyncLayer.m; path = YYKit/Utility/YYAsyncLayer.m; sourceTree = ""; }; - F8D8F55D61EE419D9EC90824FE0F70DC /* MJExtension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MJExtension-dummy.m"; sourceTree = ""; }; - F92F262092D9E79A704AA51E0E19D16C /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYKit/Cache/YYCache.h; sourceTree = ""; }; - F952920591065B6779AB858BA9370619 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = ""; }; - FA1E9D55396D47D2CD5D86BB8266AA2A /* UMSCommentDetailController.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = UMSCommentDetailController.xib; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib; sourceTree = ""; }; - FAF753E3DD88A67E407F6BA30B598501 /* YYTextKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYTextKeyboardManager.m; path = YYKit/Text/Component/YYTextKeyboardManager.m; sourceTree = ""; }; - FB19699E1C1B12EAF5D5EF13453DED15 /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WebViewJavascriptBridge.h; path = WebViewJavascriptBridge/WebViewJavascriptBridge.h; sourceTree = ""; }; - FB2C90B3901EDA03712AC7220E136EC9 /* UMSocialConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = UMSocialConfig.h; path = Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h; sourceTree = ""; }; - FBB383E3DDF012639BE5401783FB6B1A /* MyLayoutMeasure.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutMeasure.m; path = MyLayout/Lib/MyLayoutMeasure.m; sourceTree = ""; }; - FBC760B71BAB9E92475C9FAC61EDC721 /* NSKeyedUnarchiver+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSKeyedUnarchiver+YYAdd.h"; path = "YYKit/Base/Foundation/NSKeyedUnarchiver+YYAdd.h"; sourceTree = ""; }; - FC40B6EB9CFF5D58C6F1EB50C76FE1F8 /* FBAllocationTrackerManager.mm */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.cpp.objcpp; name = FBAllocationTrackerManager.mm; path = FBAllocationTracker/FBAllocationTrackerManager.mm; sourceTree = ""; }; - FC67C181B5D05CE69749F162D42CEF79 /* MASLayoutConstraint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MASLayoutConstraint.h; path = Masonry/MASLayoutConstraint.h; sourceTree = ""; }; - FCA70A234DD2E2530A95ABC854B27153 /* FBMemoryProfiler.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBMemoryProfiler.xcconfig; sourceTree = ""; }; - FCE097D977C7E9212DECEB0CA75E7061 /* UIControl+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIControl+BlocksKit.m"; path = "BlocksKit/UIKit/UIControl+BlocksKit.m"; sourceTree = ""; }; - FD67AAEC8D513BAF5C12A63FEB5AC14A /* MFMailComposeViewController+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MFMailComposeViewController+BlocksKit.m"; path = "BlocksKit/MessageUI/MFMailComposeViewController+BlocksKit.m"; sourceTree = ""; }; - FDAFBE2351DABBD9D765453D62A694F4 /* BlocksKit+MessageUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "BlocksKit+MessageUI.h"; path = "BlocksKit/BlocksKit+MessageUI.h"; sourceTree = ""; }; - FE406AF767C1F4F97A25FBB4DE4A7D72 /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyboardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = ""; }; - FE668306681336D7EDCB5181A545E8D7 /* MBProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; - FEA6D93271DC64A3A9B375AD1D046B1A /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = ""; }; - FF0A3E7F0A0BF10010B764FC479A21A2 /* UIBarButtonItem+YYAdd.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIBarButtonItem+YYAdd.h"; path = "YYKit/Base/UIKit/UIBarButtonItem+YYAdd.h"; sourceTree = ""; }; - FF13BCD801E95E62A3F277D7FEBD559B /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYKit/Image/YYAnimatedImageView.h; sourceTree = ""; }; - FF30ACFCC15DB78867B78EE625B52241 /* MASConstraintMaker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MASConstraintMaker.m; path = Masonry/MASConstraintMaker.m; sourceTree = ""; }; - FFE92269E9A9E5678E46A33078FD57E4 /* NSSet+BlocksKit.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSSet+BlocksKit.m"; path = "BlocksKit/Core/NSSet+BlocksKit.m"; sourceTree = ""; }; + F300FE56FF3145C8FB9AD5FF7A43D1DC /* RACSerialDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSerialDisposable.m; path = ReactiveObjC/RACSerialDisposable.m; sourceTree = ""; }; + F33C0B0C1B44159104500693CB5435BE /* libMJExtension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMJExtension.a; path = libMJExtension.a; sourceTree = BUILT_PRODUCTS_DIR; }; + F3416F29B712BBDA03F5D32621408AD6 /* RACScopedDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACScopedDisposable.h; path = ReactiveObjC/RACScopedDisposable.h; sourceTree = ""; }; + F344F11D49F15853191E2DFDB70CAC29 /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyboardManager/IQToolbar/IQBarButtonItem.h; sourceTree = ""; }; + F3703EC741A1CBA8FD2B6A90EA808B3E /* FBObjectGraphConfiguration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBObjectGraphConfiguration.m; path = FBRetainCycleDetector/Graph/FBObjectGraphConfiguration.m; sourceTree = ""; }; + F3A2E37C6E7EE503652045770FFAF1C3 /* BMKMapVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKMapVersion.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKMapVersion.h; sourceTree = ""; }; + F3ECD567247047A054B2A13BEB2DB7E9 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyboardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = ""; }; + F42FD717A852C0FE7FAA541B808B047A /* fishhook.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = fishhook.h; path = fishhook/fishhook.h; sourceTree = ""; }; + F4CE5ECD7355E0C0076A8173CBCFB84B /* FBRetainCycleUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBRetainCycleUtils.h; path = FBRetainCycleDetector/FBRetainCycleUtils.h; sourceTree = ""; }; + F53F171070C0DCF1269F332348E6A4D6 /* UISegmentedControl+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UISegmentedControl+RACSignalSupport.h"; path = "ReactiveObjC/UISegmentedControl+RACSignalSupport.h"; sourceTree = ""; }; + F65E91D3549F14FA9667A801796E93E6 /* BMKGroundOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKGroundOverlayView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKGroundOverlayView.h; sourceTree = ""; }; + F6884FF058D9159A41EDF771E4955B37 /* RACChannel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACChannel.h; path = ReactiveObjC/RACChannel.h; sourceTree = ""; }; + F70D8D3E45FCC5F26E12F1A175B8A239 /* NullSafe-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NullSafe-prefix.pch"; sourceTree = ""; }; + F7A72A5FB5E0A390B3AAB256A9D5292B /* BMKUserLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKUserLocation.h; path = BaiduMapKit/BaiduMapAPI_Base.framework/Headers/BMKUserLocation.h; sourceTree = ""; }; + F80DA353E7061A871D46C211A1D547FA /* RACSubject.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubject.m; path = ReactiveObjC/RACSubject.m; sourceTree = ""; }; + F8248C414FEB1821DE630D745804D0EC /* RACScopedDisposable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACScopedDisposable.m; path = ReactiveObjC/RACScopedDisposable.m; sourceTree = ""; }; + F855FC0780591E1AE9AB769FECDF8E8C /* UIImagePickerController+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImagePickerController+RACSignalSupport.h"; path = "ReactiveObjC/UIImagePickerController+RACSignalSupport.h"; sourceTree = ""; }; + F88D8E256D8AC4AF923227D7EAC1C76C /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = ""; }; + F8D3232335498A45A07CE7F0E26FB102 /* NSString+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+RACSupport.h"; path = "ReactiveObjC/NSString+RACSupport.h"; sourceTree = ""; }; + F9A3C01C496820F5455AC933C98AF703 /* RACDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACDisposable.h; path = ReactiveObjC/RACDisposable.h; sourceTree = ""; }; + F9C3C3742FB2223836D49DD1ED38C6FC /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = ""; }; + FA0CD9E0881B11302F7A36689C66A353 /* BAKit_DeviceModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAKit_DeviceModel.m; path = BATouchID/BATouchID/BAKit_DeviceModel.m; sourceTree = ""; }; + FA2DDCF5AC779145FF5360213A6ED73B /* BMKArclineView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKArclineView.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArclineView.h; sourceTree = ""; }; + FA46F427EA857EA63616BE9AD90CF75F /* libBAButton.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libBAButton.a; path = libBAButton.a; sourceTree = BUILT_PRODUCTS_DIR; }; + FA56DFEFAB27D79DC417226CA8059178 /* MyBaseLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyBaseLayout.m; path = MyLayout/Lib/MyBaseLayout.m; sourceTree = ""; }; + FAFCE66510F5C72350C031D6CA342C58 /* FBNodeEnumerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBNodeEnumerator.h; path = FBRetainCycleDetector/Detector/FBNodeEnumerator.h; sourceTree = ""; }; + FB5C6D33A11AD5B35A44A3BCDB3956A9 /* MyLayoutSizeClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MyLayoutSizeClass.m; path = MyLayout/Lib/MyLayoutSizeClass.m; sourceTree = ""; }; + FB680C7F5EF0A74DCB74CEBD2E362D46 /* BAActionSheetCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BAActionSheetCell.m; path = BAAlert/BAAlert/BAActionSheetCell.m; sourceTree = ""; }; + FC4FB10EFD19299CBDEC1C3BF7E17B70 /* UITableViewCell+RACSignalSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableViewCell+RACSignalSupport.h"; path = "ReactiveObjC/UITableViewCell+RACSignalSupport.h"; sourceTree = ""; }; + FC7B152E95904B0C4458C59879572897 /* BaiduMapAPI_Cloud.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BaiduMapAPI_Cloud.framework; path = BaiduMapKit/BaiduMapAPI_Cloud.framework; sourceTree = ""; }; + FCBB5DE174341BA6135245E17E2971E8 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = ""; }; + FD1B499B8DCCD01E993CD5C9B009C237 /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScrollView+EmptyDataSet.h"; path = "Source/UIScrollView+EmptyDataSet.h"; sourceTree = ""; }; + FD300C04B2988F6FB94F34E7F40C2A17 /* BMKArcline.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKArcline.h; path = BaiduMapKit/BaiduMapAPI_Map.framework/Headers/BMKArcline.h; sourceTree = ""; }; + FDB3A102CB0523354DC41B91D8697D65 /* RACSubscriber.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = RACSubscriber.m; path = ReactiveObjC/RACSubscriber.m; sourceTree = ""; }; + FDE0D1F515C62158394BF3A8CEAB6436 /* FBClassStrongLayoutHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBClassStrongLayoutHelpers.h; path = FBRetainCycleDetector/Layout/Classes/FBClassStrongLayoutHelpers.h; sourceTree = ""; }; + FDF3D63313115407B68DEBB369937128 /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = ""; }; + FE7A720065ADD4DFB14F38D3A80EC296 /* NSObject+RACDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+RACDescription.m"; path = "ReactiveObjC/NSObject+RACDescription.m"; sourceTree = ""; }; + FE881CF5DC6C0D3BF1424678EB76968F /* NSObject+MJClass.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+MJClass.m"; path = "MJExtension/NSObject+MJClass.m"; sourceTree = ""; }; + FE90086D59C6A47C5E35451A6C43626E /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = ""; }; + FEDE149088064E0D8D82768AF8C40E67 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = ""; }; + FF5DF239814F256ECB6DEAB3AF1E21FF /* BMKPoiSearchType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BMKPoiSearchType.h; path = BaiduMapKit/BaiduMapAPI_Search.framework/Headers/BMKPoiSearchType.h; sourceTree = ""; }; + FF7525F3E5B785150F5D9EB53A7E98A9 /* NSURLConnection+RACSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLConnection+RACSupport.h"; path = "ReactiveObjC/NSURLConnection+RACSupport.h"; sourceTree = ""; }; + FF76520268F3123F593947502AB7F9FD /* MyTableLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MyTableLayout.h; path = MyLayout/Lib/MyTableLayout.h; sourceTree = ""; }; + FFA8D290F6CA616F7FE38D9E087201E1 /* RACCompoundDisposableProvider.d */ = {isa = PBXFileReference; includeInIndex = 1; name = RACCompoundDisposableProvider.d; path = ReactiveObjC/RACCompoundDisposableProvider.d; sourceTree = ""; }; + FFD73BD50467F1415468F929775F98A0 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = ""; }; + FFDFC4FE5AF8F486D6C2866AB749C8B1 /* RACCompoundDisposable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACCompoundDisposable.h; path = ReactiveObjC/RACCompoundDisposable.h; sourceTree = ""; }; + FFE381120EB63D29C6F0E2A028E2597A /* RACImmediateScheduler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RACImmediateScheduler.h; path = ReactiveObjC/RACImmediateScheduler.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 14FE64D42570C0C6DFD635529D1CA24C /* Frameworks */ = { + 025694188CB9A7D96CC58750018B4FFC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3FECFDE87253334FA356C4898AA1478D /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1FB2CAF09B049412D2B70F2A22C2BD63 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 63039357198203C145C9CD6D76DD1DAF /* Foundation.framework in Frameworks */, + 287F5BD9A44437A41CEC2F370FE25886 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 18DC669D75F24ED4F05E2C4F0153E4D2 /* Frameworks */ = { + 276D108F2AC1678329F05B6AC008E8F3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F6C7C9A1BE5A4E0D24B25766B4113E58 /* Accelerate.framework in Frameworks */, - 707C7D0C675593AED523B5EDCDEA699A /* AssetsLibrary.framework in Frameworks */, - 8ECA069F824C3B13733EBF651DE63EC1 /* CoreFoundation.framework in Frameworks */, - 25745A4CD298D10F19E043B0F5636116 /* CoreGraphics.framework in Frameworks */, - 2936F2242B3780EBD36FD41FEC887E1D /* CoreImage.framework in Frameworks */, - 9C2214C61E15CF19E50A9F1121705B06 /* CoreText.framework in Frameworks */, - 9266ED0CD471E6806CF4CA3CB29CCCB0 /* Foundation.framework in Frameworks */, - 2EA6C717E673A7463E0D234E7EE865D0 /* ImageIO.framework in Frameworks */, - D4D23DAF0D1E8032B05378DCE7BB53C4 /* MobileCoreServices.framework in Frameworks */, - 683E7D22A53BC25FACE3F94D34CF4E89 /* QuartzCore.framework in Frameworks */, - 6C0A8F2FBF1BF38CA43CD9793D192E0F /* SystemConfiguration.framework in Frameworks */, - 4A62800BD30A9E07DC819BB431535389 /* UIKit.framework in Frameworks */, + B9CB658A8343D27A77CC0F24C34D43EF /* Foundation.framework in Frameworks */, + 4FB74F804DD69190137B7EAACC769D10 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1D54816B04BD53B4C4719CEBF111AA2B /* Frameworks */ = { + 304BE8E8A1CD6D0A65F67B9405E33C3E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 057758EB3BE2D8C680D95DCA121B9A9E /* Foundation.framework in Frameworks */, - D5D12C7E324E5FF9FFBCADCE172D554A /* UIKit.framework in Frameworks */, + D20BD033BA609D6252AF9901CFE66F9D /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 24D1976AC00C86A01629B00C8315F7C0 /* Frameworks */ = { + 337A15437F2D8E9608BBC9A7F937EB94 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3FEF5414BF754A8E09EAE87999786773 /* Foundation.framework in Frameworks */, + 15F556BBB8C5FD67AD2D7616A991615D /* Foundation.framework in Frameworks */, + DCDE75E49B50C393C41A66D3927B06AC /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2C6DE07433816ECB482DB1EA1D853578 /* Frameworks */ = { + 43940D4BFC76623893D58D22EF244EA5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78B774329C236522CB110336B6E2A09F /* Foundation.framework in Frameworks */, + 2EFDEB04B2C065CFB1C9585FD3D4A70F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 39A13DB7DB9B67A6E3C314E61D45CB33 /* Frameworks */ = { + 4C3BB007BD8D3387F8BDE4E08917DCEE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - EC501CC4D69B88748E588281B3D35081 /* CoreGraphics.framework in Frameworks */, - FC2ED8F8DAEE337D703ABBEFC8B1DC72 /* Foundation.framework in Frameworks */, - C32B5EAACAF3AA1C4FB0DCBEEF4BB85E /* UIKit.framework in Frameworks */, + 379E73B02D080960213419E4E9EB8E57 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3DEB6CF58693553526051BAD1BB58A32 /* Frameworks */ = { + 5AFD1D588CCD6F175B115D022B4160ED /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 53F1F6E74D2A3030BDD2F7A803B73BE5 /* CoreGraphics.framework in Frameworks */, - 075C59B1F2E9CFF59E75341DD2F21240 /* Foundation.framework in Frameworks */, - B7524CEC2C923E9F9ECABC813CA9745F /* UIKit.framework in Frameworks */, + 288E9B4B99C71CD94352F785F807C4F2 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4B3D76B8213892AB020D16833FB55532 /* Frameworks */ = { + 5B5697A5A886EAD879C9E3899735A579 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 2B9B56CC07319AE1CD5CB592FBE31075 /* Foundation.framework in Frameworks */, + 2D551DB63729E1AB561DD47287449251 /* Foundation.framework in Frameworks */, + 4F465CFD84A03F685BC5EE7E50110D96 /* ImageIO.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 508C962B3E08E8DA04956BF349A3CDFD /* Frameworks */ = { + 64786C9E4ED20F0FD5D947A7C759FE3B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 045FFEDD819A734271DD5DE53C877884 /* CoreGraphics.framework in Frameworks */, - 30DA0B928C8F28E3C3F279C3833458A0 /* Foundation.framework in Frameworks */, - 17912D9A89FC36E82029409E9B74A61A /* MobileCoreServices.framework in Frameworks */, - 0358B918CA8C9D3C214FD4D41CD69A90 /* Security.framework in Frameworks */, - 650FFDAF60A6C37D824BC6364B09A3E5 /* SystemConfiguration.framework in Frameworks */, + 7BBAE335CA7667E51CFA81BF17DD861C /* CoreGraphics.framework in Frameworks */, + 3D51A7D14E04DEA3F615267326D9DF39 /* Foundation.framework in Frameworks */, + B3A6235D661F70BB8D33265485FD1EA9 /* QuartzCore.framework in Frameworks */, + 149E5412AC3CAF625BE3BDDD01FAAA4E /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 62C68FB07092B5938E292DADBCE3C4C1 /* Frameworks */ = { + 647EB643955B3A451A81AD53AA3D73BE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B410EE6FCF78EF49BBE5CF84677DF875 /* Foundation.framework in Frameworks */, + 5D77AE5662B05B8D9FD5D889D55DF7C4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 703B851E235F160823E85E4781227D2E /* Frameworks */ = { + 64ABB930934D7BBCC7618A9342E09C9C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B2FCDD5D574F3520162C4DAC57A3C112 /* Foundation.framework in Frameworks */, + FCA3C88FA81BF77A2075054DC301E215 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 747242460B935FEA3E994652BD8C2E0B /* Frameworks */ = { + 6AD0378404548633841923037FCBAC54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 65ED43E8E96D716F4B3C93B112E8BE5B /* Foundation.framework in Frameworks */, + BD35014C5CE824D791E2FAC4B29AA90C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 87D63FC8B5A5501852974C5E1F3328A6 /* Frameworks */ = { + 6FD8312A1AEB348F49A81C438DB25115 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C2874BD5AC24AB6CF628418E5C251A22 /* Foundation.framework in Frameworks */, - 6A242E93B8569A42628B0F8B369273CA /* MessageUI.framework in Frameworks */, + F0B56A7D38A399A2F67F9920C9526A66 /* Foundation.framework in Frameworks */, + 6209E20926D79222E59F58B962BFAA1E /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8D741FE3E49419A8E41EC5C8203D4D88 /* Frameworks */ = { + 89AFA9A69DB2C7631C9988689473B991 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C28CE92A89A43CA81EBBC907CC4B06F5 /* CoreGraphics.framework in Frameworks */, - E7C4AA1A6200B14A941026D27F2B7523 /* Foundation.framework in Frameworks */, - AB2FC0AFFBDF156C145E1ECFD1B62C13 /* UIKit.framework in Frameworks */, + 336514D3DC816F7AE30D0F40C6630632 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 91247678E3E2D23B0BF2C3EF48002167 /* Frameworks */ = { + A4EA756151CBB70FB351768786619D31 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 78E642FD20DDC06D7DB26D73AD4B74C9 /* Foundation.framework in Frameworks */, + 4D73CB904FB8DCCECCC9D987FF76EBC6 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 988FA15379A4032C312C2049FB88101A /* Frameworks */ = { + AA25CBA949EE1F715A5CDA9F84F0DDF1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0951ECB79A8DDBA8DC3077FA1CC84E6B /* CoreGraphics.framework in Frameworks */, - 1C289876A4849D6798FC7F154214C5F8 /* Foundation.framework in Frameworks */, - 2B342A1143B39C7E396A50C6540E2639 /* QuartzCore.framework in Frameworks */, + 686A4FD038133513879F2F52D8A7A7A7 /* CoreFoundation.framework in Frameworks */, + 1CA7968A577F0508352200889C3B34B7 /* Foundation.framework in Frameworks */, + A741D5D80E92F85E00CCB8B65D6B1A6C /* QuartzCore.framework in Frameworks */, + D2F0ABE0012F68B8CBDC895CE81F44CA /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - A98F23017BE117F7F07DA2E36558D86C /* Frameworks */ = { + AFB3129C86FDE9B97F0E5646C1039FD7 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F4B7BD54C7D56BD97FA74AEC2E7354BB /* Foundation.framework in Frameworks */, + 2747EE8106C747EA8BA5D5C53AAAF773 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - AB2DF1EA2C3D54AB784B3446C4C994E1 /* Frameworks */ = { + AFD9B6EDB4FA1C9D5052E3F284B819ED /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 95990C274EF041EC743DCB56D6582862 /* Foundation.framework in Frameworks */, - 91648E75404DAF62439FE179BF617EC9 /* ImageIO.framework in Frameworks */, + 0A8A266C099C69AE5EDDA18449D59918 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - ABED467BCE084E492B6A0E6E20E4CE7A /* Frameworks */ = { + B57134F14D0B782971053CD2EB92CC0C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3ABC5E049E9452FE01539DC400A34422 /* Foundation.framework in Frameworks */, + 52E28A0A333684B80D6CD7FFD42865E2 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BA22D54174502D0E45D7A86A50C7D202 /* Frameworks */ = { + BA07D21115FC94333B28618552257239 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AD4DD18ED42107A84CD0824E6C319D36 /* Foundation.framework in Frameworks */, + 89D0A398F988B9F3423C7E134CF36B9F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BDED716E87AA5CEF190AB0859B4C3D80 /* Frameworks */ = { + C8B04F4754F962B5C28827F9129BFE2E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 834F559F41EE68C5B9CDC083C10ECD0B /* Foundation.framework in Frameworks */, + E444D099624D1BE7F72FDD51FD211B92 /* CoreGraphics.framework in Frameworks */, + 5F9047FB6A1DEFB6F6397E7540BD1589 /* Foundation.framework in Frameworks */, + D37406AAF0A1AA9AA7285E752A79372A /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FAB9E9D9BBDB93399D3C2B91469EC4B6 /* Frameworks */ = { + E1FFA9BD201F7FCE2311B14D2E5AA8C0 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DE31B168D9197213CEB7B90E3ADEB4CC /* Foundation.framework in Frameworks */, - AF4E7187E09A5AF3A0758991203153DC /* UIKit.framework in Frameworks */, + F71530448B7A282746853F4718DCA267 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + ECDA50A72D7377044DC78A4EC42582AE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 661E3C9B494ED5C317CE616690A1A632 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F3284DBE3CA8932733932AD2A48445B2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CBCCEAD402645565401CA93924736979 /* CoreGraphics.framework in Frameworks */, + 0214246CCB1FF7182F7222B9CCDF8FCB /* Foundation.framework in Frameworks */, + F8DCA6C3C05A59B2C95A1B5F1CBD8C99 /* MobileCoreServices.framework in Frameworks */, + DE825B8F32AB823F4BE5492CAC6FCB4B /* Security.framework in Frameworks */, + 903158692A045396106CA22C0DD13BA6 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F9AC974E3329F79899A7B3BE290FC894 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1C76817FA5353D989D7BC33E8C5997B5 /* CoreGraphics.framework in Frameworks */, + 93F12B05D8333C37D9CBEA3D1782CC04 /* Foundation.framework in Frameworks */, + 7291E906AE8A3C1F92183154FE65DCDD /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0092979368591B7B2AA62B41F6E1B3C4 /* AFNetworking */ = { + 01F59D975F48833BE5139B9DB96FAC9A /* Support Files */ = { isa = PBXGroup; children = ( - 6509A409EC7C2E72577991AF6C55F12C /* AFNetworking.h */, - 28A1EAAB40288C288997F2C3054BF148 /* NSURLSession */, - 05014BE50E9460378D5C1FAA1F0DA1A0 /* Reachability */, - 6183458B074062895635AFCA1CEBF171 /* Security */, - CD2EBF8D0A9FB295CA7415CE5A63BA6C /* Serialization */, - 423C84F3B84CFCF85C479AA769283AD3 /* Support Files */, - 97646BFF9993B9742D127B99C09B24EB /* UIKit */, + EEA522201A6FF495C79C40CF9DD1C4D0 /* BAAlert.xcconfig */, + 833A2F19E32FDAF1C33E1CF49FA8FD5A /* BAAlert-dummy.m */, + 8C8A30C8501539568BD49BA7D62A8CB4 /* BAAlert-prefix.pch */, ); - path = AFNetworking; + name = "Support Files"; + path = "../Target Support Files/BAAlert"; sourceTree = ""; }; - 027D5A3F19A7F4E64E373262D8BA4F98 /* Support Files */ = { + 047F78C977F7C0C7AAFEF7B90E9D2998 /* Support Files */ = { isa = PBXGroup; children = ( - B31F5EAC0CD3EAA27BE46699DBF4ABF3 /* FBRetainCycleDetector.xcconfig */, - 93951F5F071C7963E58277CD1B025BDB /* FBRetainCycleDetector-dummy.m */, - 917DAC8E0F01BF248C4086298E220215 /* FBRetainCycleDetector-prefix.pch */, + 141FCE7E92B2539D3BA3A82D56E9CFCD /* Masonry.xcconfig */, + C82E61DF961334D6581C54C2B08FEDAC /* Masonry-dummy.m */, + A9DFFD4246C2438A4371E24F79B51AF9 /* Masonry-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/FBRetainCycleDetector"; + path = "../Target Support Files/Masonry"; sourceTree = ""; }; - 05014BE50E9460378D5C1FAA1F0DA1A0 /* Reachability */ = { + 0B25E73CE744F8126B7E11E516C9A932 /* Frameworks */ = { isa = PBXGroup; children = ( - B2735FCD3752765F1318AA765E05C8B3 /* AFNetworkReachabilityManager.h */, - 31C588CCFDECBCC4F4FD77599A830F73 /* AFNetworkReachabilityManager.m */, + 20ED70031919883C757FC6A7DA2A8E24 /* UMSocialNetwork.framework */, ); - name = Reachability; + name = Frameworks; sourceTree = ""; }; - 0FA60C029D44C9EFF4240358849F13F5 /* UIKit */ = { + 0C1A7E5AF3134805430A5EEB1CF9274D /* Support Files */ = { isa = PBXGroup; children = ( - 762FABB48476107064393FADD7621295 /* BlocksKit+UIKit.h */, - 0C2BD20D48F2D4BB15175F72F9E97CFB /* UIActionSheet+BlocksKit.h */, - 98583DB893E2EDF2D9D0C128CF424174 /* UIActionSheet+BlocksKit.m */, - BF0E6DFFA13A3D990A16B5FD1AB040D2 /* UIAlertView+BlocksKit.h */, - 006412CEB3C110EF9AC81013C3D7ED1A /* UIAlertView+BlocksKit.m */, - C73FFBA29D004B1184A16B3030A7EBEA /* UIBarButtonItem+BlocksKit.h */, - 3FC460E45DFF37C3124F4D23555DAFC4 /* UIBarButtonItem+BlocksKit.m */, - D4B69A40C5A35C2F7BA47EB7146A0A4B /* UIControl+BlocksKit.h */, - FCE097D977C7E9212DECEB0CA75E7061 /* UIControl+BlocksKit.m */, - 15E82000642A2D58AF6D39AE8E6BF2CE /* UIGestureRecognizer+BlocksKit.h */, - 9E16889ECF6F45797037D61D09B545C4 /* UIGestureRecognizer+BlocksKit.m */, - 23CF67AAD0518E1B890DBEF51F31ABA9 /* UIImagePickerController+BlocksKit.h */, - E196B124A11D919BDB535AC02A361E92 /* UIImagePickerController+BlocksKit.m */, - 3FB7774E0054E023612AC90FAC907624 /* UIPopoverController+BlocksKit.h */, - B7E1DB591E88AD637D3206E8D8F7D8EC /* UIPopoverController+BlocksKit.m */, - B18A663547B41BCB2192256358A509E1 /* UITextField+BlocksKit.h */, - 4F469B868CBD380BAF898D72BDC40A58 /* UITextField+BlocksKit.m */, - 384DD95419FA690A3C7ADFE8189477B4 /* UIView+BlocksKit.h */, - 1DD2CBBADED16457D1732D3822CA08ED /* UIView+BlocksKit.m */, - 87041701DDC2AF6EF53484A6FB3CEBDF /* UIWebView+BlocksKit.h */, - DA9F4C442D76AE0BE69338FF7A29D2C9 /* UIWebView+BlocksKit.m */, + 293F15EC612DC15503D82054E16136CC /* YYCache.xcconfig */, + 75FBD28615A2702D829B9617A5C4279C /* YYCache-dummy.m */, + 99509CA473DF5A0BA17B88A19262F011 /* YYCache-prefix.pch */, ); - name = UIKit; + name = "Support Files"; + path = "../Target Support Files/YYCache"; sourceTree = ""; }; - 11EA46CAD15D145B2229A677A756CD29 /* MyLayout */ = { + 0C482E8EF1358CC2C8911C9E58F11151 /* iOS */ = { isa = PBXGroup; children = ( - 7385F529ED38C1912C19B342FDE96A95 /* MyBaseLayout.h */, - 9520E1D6180B291AA5CCD95D10179016 /* MyBaseLayout.m */, - C63D15891DD8222DC8CF0B13B9CBE442 /* MyDimeScale.h */, - 93735590AFFF95840B7DF9F446B23CA4 /* MyDimeScale.m */, - 72076BB438B0C2D1C303AD9C9BA3877B /* MyFloatLayout.h */, - 464340AC402CF5D0C17F0005CED66A1F /* MyFloatLayout.m */, - 53ABD9D86A65A57FF7B87B558E040305 /* MyFlowLayout.h */, - E0AC86376BE98456E5785A7DB9482C7B /* MyFlowLayout.m */, - 4B8D852EBB3BA2EB916F5EF39E3F2D1A /* MyFrameLayout.h */, - 7C459B7082D82C38F339BD9329FD10F0 /* MyFrameLayout.m */, - 839B1D07B3D16057E8A03A0C347E6D8A /* MyLayout.h */, - 9CA0A2BFC5C36CC35B6052E3CE91D5F8 /* MyLayoutDef.h */, - 8C3E87311FC436EF7C702045B4E3694B /* MyLayoutDime.h */, - 53A6034CD435B263D225D48ECC87B0CA /* MyLayoutDime.m */, - EAEA5A83D31722BBA1F2B21C610BBBDD /* MyLayoutDimeInner.h */, - AE73B0214DF7E2D4D7E5CB68C93E5DD2 /* MyLayoutInner.h */, - CB55B2B1F3E97DEB9D1F7164C5D4B855 /* MyLayoutMeasure.h */, - FBB383E3DDF012639BE5401783FB6B1A /* MyLayoutMeasure.m */, - C4C3430A5C17BE45F5001DA945CC9462 /* MyLayoutPos.h */, - BDEAE3DEAC73837A85801AF71B0A19E8 /* MyLayoutPos.m */, - 4FB43FF5DCCA260A7741F60487042BE8 /* MyLayoutPosInner.h */, - 948471C315238EB01AC87CD838D9A085 /* MyLayoutSizeClass.h */, - A45C66C433920D54300CD5A5012D0E1C /* MyLayoutSizeClass.m */, - 8783D880D8711CB50035F442FD3681BE /* MyLinearLayout.h */, - C086880E09AC7E6C8D6077B2BB271C8A /* MyLinearLayout.m */, - 8E6B2D615813A8450489502242E3AB11 /* MyMaker.h */, - A688710BF1754C8489B812B2B5CD12A9 /* MyMaker.m */, - 157FD8FC98DA7B0818E8A6324CFDEFA9 /* MyRelativeLayout.h */, - 511415AC9277593D6968E67DDFCF1B0E /* MyRelativeLayout.m */, - B7AD9B6A7C7D2144615D70677CF84F67 /* MyTableLayout.h */, - 37A7B5AD1ADFD0B617050EB45210ACF5 /* MyTableLayout.m */, - EFADBE2D435CDF5AD5B9F7CB74E137DF /* Support Files */, + AF92D32A6D64DC676363705855F4C32C /* CoreFoundation.framework */, + E569E78D491A8CC166EAE063A5BF98B1 /* CoreGraphics.framework */, + 82FA943C8C51F0128D1655FC4C3A3CEF /* Foundation.framework */, + 7AD0CD4FE367AC1CB35C31ED86FB204B /* ImageIO.framework */, + 2248D3C37B4C26439603E26212E027AC /* MobileCoreServices.framework */, + C261D5021438CCB1D68559713BAB392C /* QuartzCore.framework */, + 1F7CE4774B273BDA375ADF1CBAC2D592 /* Security.framework */, + AE6EB8B81ABA49102E7DD26271570B4F /* SystemConfiguration.framework */, + 87CF9362F9CD8FF09241B71BB7B7FCA2 /* UIKit.framework */, ); - path = MyLayout; + name = iOS; sourceTree = ""; }; - 1582D54B25109EC5E91AA3F0F40020F2 /* Support Files */ = { + 0DA3AB78557A31BF4C3FD725FC0CF4ED /* Resources */ = { isa = PBXGroup; children = ( - 4956183838E6D4475A0100F5E64B7A59 /* BAButton.xcconfig */, - 2C259586F4BB0915D57F936BAC4DE509 /* BAButton-dummy.m */, - 20F8D3EB12F5D3E17B3E71D2C4692DDE /* BAButton-prefix.pch */, + 8114510368988128AE3ED5A0656960A0 /* BAPickView.bundle */, ); - name = "Support Files"; - path = "../Target Support Files/BAButton"; + name = Resources; sourceTree = ""; }; - 186CC53799CD8D38035660CFC8A0D248 /* Support Files */ = { + 0E8FF008D3812872AF8B057FA4D5186E /* MBProgressHUD */ = { isa = PBXGroup; children = ( - 9837A57BA5AF03815FE5F5F17770E66C /* JMRoundedCorner.xcconfig */, - 82A20F9D5364FC95F216E1FF145F9AF7 /* JMRoundedCorner-dummy.m */, - 9C0A0E60E1C974F0B9E46B8B706F3565 /* JMRoundedCorner-prefix.pch */, + E65C0D8FDC6F71353B02F309F7BE46B1 /* MBProgressHUD.h */, + 9BFDD8D36E4CDD28A46A32266461ABE1 /* MBProgressHUD.m */, + 35C7F1D264540534A3309A3A0D365661 /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/JMRoundedCorner"; + name = MBProgressHUD; + path = MBProgressHUD; sourceTree = ""; }; - 18DD2E176B0DB4125666C26463CBDAD6 /* Support Files */ = { + 0F0AAC89E186C2345BE11E0E9EA01E9A /* ReducedWeChat */ = { isa = PBXGroup; children = ( - E029EA548246F048B3F048B3B7479B7F /* MJRefresh.xcconfig */, - 3BE3CB4DBF05A80545E0A9738BF8CF22 /* MJRefresh-dummy.m */, - A8BCD4C2DDF24E50FA8A8D8DCC395DE2 /* MJRefresh-prefix.pch */, + 254F7A4DA015B4389CE024290D2E0817 /* UMSocialWechatHandler.h */, + 948501BDA18DED3BA4FFDAB79CDEEE79 /* Frameworks */, ); - name = "Support Files"; - path = "../Target Support Files/MJRefresh"; + name = ReducedWeChat; sourceTree = ""; }; - 1BD0CAD28A6279C83A321F199AEBA4EE /* Frameworks */ = { + 10D58619321FABBC2BBC70D73B033751 /* SDWebImage */ = { isa = PBXGroup; children = ( - 8094E5F255737AC3D9566B14F5571530 /* iOS */, + DEB5ACF7A306F00CB01CEA7BB5027381 /* Core */, + DF0FAE54A9A193FFFC76CA9ECBFD398C /* Support Files */, ); - name = Frameworks; + name = SDWebImage; + path = SDWebImage; sourceTree = ""; }; - 1D86B574429F65018009855F4E147BBB /* Resources */ = { + 113322D3AAA8961D79EC66892E28D38C /* Resources */ = { isa = PBXGroup; children = ( - 7165F04A60BD490969657F34FA562646 /* en.lproj */, - 6054FBA7A221AEB09292C9C50B5E707D /* TencentOpenApi_IOS_Bundle.bundle */, - FA1E9D55396D47D2CD5D86BB8266AA2A /* UMSCommentDetailController.xib */, - F46E65C6A7E7233681EC6C6D760231E1 /* UMSCommentInputController.xib */, - 1CA9DE9D2486104FE7F1DE2B6E2245C3 /* UMSCommentInputControlleriPad.xib */, - E48A191CC7E14B27BFA0D94D8A80757C /* UMShareEditViewController.xib */, - A1BBEA9F94DB0D14A4D9F722B49F9525 /* UMShareEditViewControlleriPad.xib */, - 9AA694E8AA0C8EBA5F843A31E3BC16DC /* UMSLoginViewController.xib */, - 032C51895B4D6E237C6F4EDF7412B5DC /* UMSnsAccountViewController.xib */, - 1A8280EAB1D3C821ADB1C5DDDB5C814B /* UMSocialSDKResourcesNew.bundle */, - D4F55EA627BF67A9A79DB19CC030FFC7 /* UMSShareListController.xib */, - 6ECD8987A0E823C8C7604793A01C8241 /* WeiboSDK.bundle */, - 733D195D5D8A97F9FB3309792B338B9E /* zh-Hans.lproj */, + 445BD805E0C8977E90E9DB040C0E6971 /* mapapi.bundle */, ); name = Resources; sourceTree = ""; }; - 1D972870EDB9DB3906220E3A0564269B /* IQKeyboardManager */ = { + 1F3AF483EE8F1E3A41D83334F0F80E69 /* Support Files */ = { isa = PBXGroup; children = ( - C45715B179603BDF6570632E0AB23F7F /* IQBarButtonItem.h */, - 36B092E4DE9B53D996DC18BF9956DBA7 /* IQBarButtonItem.m */, - C4F82E8F3D0B32202C9549B9DEDD2940 /* IQKeyboardManager.h */, - B9EC4CF4EF07A52E878A226F584FFB05 /* IQKeyboardManager.m */, - 72D5E4FF936FFFACB4231B155D93F3F8 /* IQKeyboardManagerConstants.h */, - D703C0242C6046CA4560FBB06E74919B /* IQKeyboardManagerConstantsInternal.h */, - 2CF1CBBC6B1465C6113A29F1F01CFB73 /* IQKeyboardReturnKeyHandler.h */, - B773932A5B2F66A5EFB092C07C02753A /* IQKeyboardReturnKeyHandler.m */, - 24E690991FB67CDDF23F69C48CE66F9D /* IQNSArray+Sort.h */, - 59DB5DE2EC4B6E18093E86DBCEE0F114 /* IQNSArray+Sort.m */, - 923EB90555F006B695B21B1EF92A0829 /* IQPreviousNextView.h */, - E75E291B3A0973671AC25F9E496173A0 /* IQPreviousNextView.m */, - E146447886DC5E8C6720ACA35A563954 /* IQTextView.h */, - 503C401237D1504EAC535D4C824AA2C3 /* IQTextView.m */, - 619BF4D1F233638CB1E7DC0C21E52352 /* IQTitleBarButtonItem.h */, - DDAF05766BC95B7E64BAF8436774173D /* IQTitleBarButtonItem.m */, - B0E06B3A50429D9BFC7461CFE1F7468B /* IQToolbar.h */, - C75F362F2721C83B9578690864A9EDB1 /* IQToolbar.m */, - 03D681BEA5F306A6CD1E1FAC1DA0E9D7 /* IQUIScrollView+Additions.h */, - D1F61F06A8C004D1D740C16CDA98DF13 /* IQUIScrollView+Additions.m */, - A1471C10244B0C59AE403E080621F636 /* IQUITextFieldView+Additions.h */, - FE406AF767C1F4F97A25FBB4DE4A7D72 /* IQUITextFieldView+Additions.m */, - 569A43A38B83F695973632E6621D9A15 /* IQUIView+Hierarchy.h */, - 997DED83CBD78DC92D4F73157CABD8E8 /* IQUIView+Hierarchy.m */, - 46AC5AC9133DAB24CA1667FE46402550 /* IQUIView+IQKeyboardToolbar.h */, - 2F66536B55F1D950E6B14A8421B3CFC3 /* IQUIView+IQKeyboardToolbar.m */, - 994B9E99765090AE0C2D983A36F212A6 /* IQUIViewController+Additions.h */, - 625FCFAB0AF26ACE41DCE9190963FD10 /* IQUIViewController+Additions.m */, - 6F32A26BA5ECD684E6ACA01840106B5A /* IQUIWindow+Hierarchy.h */, - E361C521530C24F374AFCC26F76C675F /* IQUIWindow+Hierarchy.m */, - B5A639464F9C083AE28EDC6048E2D3FD /* Resources */, - 69974D8BD1EE1F6177947ABBE9F95671 /* Support Files */, + 7A618BF26B9A80D3691D22FE02234F00 /* FBRetainCycleDetector.xcconfig */, + B6CEFCCC58EDB72AA7FE62EF82F50A05 /* FBRetainCycleDetector-dummy.m */, + 92E91E0FE6F2414A1E43D65DD3F9BABF /* FBRetainCycleDetector-prefix.pch */, ); - path = IQKeyboardManager; + name = "Support Files"; + path = "../Target Support Files/FBRetainCycleDetector"; sourceTree = ""; }; - 218C5ADD264604BD2E9587FB0ADF314F /* Support Files */ = { + 20C800004D7714211CF7A285445BB05B /* Frameworks */ = { isa = PBXGroup; children = ( - D615F0566F405F9ED0B6C36DBAA5780C /* SDAutoLayout.xcconfig */, - 37E0B549BE7A86F85D64A4752B4189BD /* SDAutoLayout-dummy.m */, - BCADCD1C4CCAAEC27065ED1A9362E2D4 /* SDAutoLayout-prefix.pch */, + 1A6A0D59DE3FACBAE0B4911159F89CA6 /* libSocialQQ.a */, ); - name = "Support Files"; - path = "../Target Support Files/SDAutoLayout"; + name = Frameworks; sourceTree = ""; }; - 25E32A38343A821DC1FF8571F6DA58DA /* Support Files */ = { + 24002A6670E6882ECD6250D3E60F9CB2 /* Frameworks */ = { isa = PBXGroup; children = ( - FCA70A234DD2E2530A95ABC854B27153 /* FBMemoryProfiler.xcconfig */, - 875F92012D8F29A99AD9E203968B2440 /* FBMemoryProfiler-dummy.m */, - E3502342F5345D3C550A0A17EA0E52EB /* FBMemoryProfiler-prefix.pch */, + 0C482E8EF1358CC2C8911C9E58F11151 /* iOS */, ); - name = "Support Files"; - path = "../Target Support Files/FBMemoryProfiler"; + name = Frameworks; sourceTree = ""; }; - 28A1EAAB40288C288997F2C3054BF148 /* NSURLSession */ = { + 27C349FC6F031915656B5008ECD231E0 /* Products */ = { isa = PBXGroup; children = ( - F952920591065B6779AB858BA9370619 /* AFHTTPSessionManager.h */, - 751D641C448FB0C3D4B2F43B7074C236 /* AFHTTPSessionManager.m */, - 8296F65452B28EC27F69D8356CA906A1 /* AFURLSessionManager.h */, - D7B3E48295B4763DBA3953A20520C8A4 /* AFURLSessionManager.m */, + CCCFBDDF63B471BDF11A4AD364CAE939 /* libAFNetworking.a */, + 3E00F3186D0D77F2C61BF519E7E17E57 /* libBAAlert.a */, + FA46F427EA857EA63616BE9AD90CF75F /* libBAButton.a */, + 4D8FA3DEBAC05AD570B7ED05D853B068 /* libBANetManager.a */, + C217BF798B10CE24A5CFD2D08FD44F53 /* libBAPickView.a */, + A829375743110C8BFCCDFD99BADD23F7 /* libBATextView.a */, + 603E32B34ED8D61D048F1ECC77FA35EA /* libBATouchID.a */, + C2E84E8CAD885AA6C73FD3BE110F988F /* libDZNEmptyDataSet.a */, + DEFFACBDB5976EC63F435EED20E997ED /* libFBRetainCycleDetector.a */, + 89A0A131F0363897C5566635EB56DC6E /* libFMDB.a */, + 1ED5844300CA1B971687CFC8C8570F5D /* libIQKeyboardManager.a */, + AD19CE05FF3E73AB501E972F5D82955A /* libJMRoundedCorner.a */, + AB0FFA39D3FD61256F6D72E11701B042 /* libMasonry.a */, + 5FE5FD2FE709C150152C039EFAC5A269 /* libMBProgressHUD.a */, + F33C0B0C1B44159104500693CB5435BE /* libMJExtension.a */, + 7749FA9768C0B4098EF0400CDF294203 /* libMJRefresh.a */, + 0DB6007E6C18F3CE8A03EF9DA8F30502 /* libMLeaksFinder.a */, + 4D2277AF8337A1D2124234F055750FB0 /* libMyLayout.a */, + 9EEF55682496FB97F53E754637C62F61 /* libNullSafe.a */, + C98FD91FE871F648F9FD7A5F9A45DB1E /* libPods-BABaseProject.a */, + 5CCEE69A9392F2636E8527AC05DFC45E /* libPods-BABaseProject-BABaseProjectTests.a */, + C6A3F2B7E15A00B6B57797E93320091E /* libPods-BABaseProject-BABaseProjectUITests.a */, + 376E4A3CBF92F4FE4EB23EA625C1543C /* libReactiveObjC.a */, + BB94B2FF6E22C5506C00E70FDE67E95C /* libSDAutoLayout.a */, + 24E732E61E783895CF9D3245E9C94340 /* libSDWebImage.a */, + 6F678A7BE9D389183549EDD18E78D90C /* libYYCache.a */, ); - name = NSURLSession; + name = Products; sourceTree = ""; }; - 2E7F03381BF895589C84D2460EFD4948 /* Support Files */ = { + 2AA3CCFC2E4988CC9D0843C7BBD10361 /* Support Files */ = { isa = PBXGroup; children = ( - 537A830133BA682BF29287F9257C56FF /* FBAllocationTracker.xcconfig */, - 5FF6B35F9B556AAC0817BD6310B7E8C2 /* FBAllocationTracker-dummy.m */, - B0EE43543C69695FA5696AB0D650F4AF /* FBAllocationTracker-prefix.pch */, + 2C9AC5DA082BEA613499A94FC20CAFDD /* MLeaksFinder.xcconfig */, + 43DDA30BD88664E66A24DB93EF4024E0 /* MLeaksFinder-dummy.m */, + 8F1A97C3E62A6002537A8A074EF7141B /* MLeaksFinder-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/FBAllocationTracker"; + path = "../Target Support Files/MLeaksFinder"; sourceTree = ""; }; - 31354D5351A9790CC4EFF700A8B1E6D6 /* Frameworks */ = { + 2E23056445498E6C522C1AA9D90C5817 /* Frameworks */ = { isa = PBXGroup; children = ( - 712D89FDB34DCFC906C0A3C79E8069DC /* WebP.framework */, + 6B66727C135F6C84ED97BF4CD305BABE /* BaiduMapAPI_Base.framework */, + FC7B152E95904B0C4458C59879572897 /* BaiduMapAPI_Cloud.framework */, + 88659FC1DC25EC4D2F844E6E43EC9446 /* BaiduMapAPI_Location.framework */, + 3FDED38C033770B7581AB0A201118DB1 /* BaiduMapAPI_Map.framework */, + E08B3DC6CF4BBBB8A46DD8C3F4FDE387 /* BaiduMapAPI_Radar.framework */, + 2419C87AC70E30EAC1E42CD1052ED034 /* BaiduMapAPI_Search.framework */, + CA950E326630F652B88DB46CFEED7D56 /* BaiduMapAPI_Utils.framework */, + 611A6AC47E613536E9F521DFB600C6B3 /* libcrypto.a */, + 4B58FB996D895EF70D76E9E288B7C114 /* libssl.a */, ); name = Frameworks; sourceTree = ""; }; - 38D1E0F133A021A0DA81EB78DB6782FF /* Support Files */ = { + 2EDE6F794EAE8550FA0E9B2813702D3D /* Network */ = { isa = PBXGroup; children = ( - 3C9159BD8374EF1395DC9A245DFF9D5F /* WebViewJavascriptBridge.xcconfig */, - 988F0FBE5674D696A763BEAF088DAA6D /* WebViewJavascriptBridge-dummy.m */, - 1FF2F95A55EC13B3F1BE3F5E69E7960C /* WebViewJavascriptBridge-prefix.pch */, + 0B25E73CE744F8126B7E11E516C9A932 /* Frameworks */, ); - name = "Support Files"; - path = "../Target Support Files/WebViewJavascriptBridge"; + name = Network; sourceTree = ""; }; - 3E90695702A038076ABA8B2B54EF7BFE /* Targets Support Files */ = { + 32524923047247C8FFC7F2D5433A8D2B /* Resources */ = { isa = PBXGroup; children = ( - E266CF14E860C7FC9B093956A5969B1F /* Pods-BABaseProject */, - 4F75868358855F9C00E1353E9ABC5255 /* Pods-BABaseProject-BABaseProjectTests */, - E85F36EED1BE25B9385971FD663CED87 /* Pods-BABaseProject-BABaseProjectUITests */, + C802A885E69B23CC89AD20E978261BC3 /* IQKeyboardManager.bundle */, ); - name = "Targets Support Files"; + name = Resources; sourceTree = ""; }; - 423C84F3B84CFCF85C479AA769283AD3 /* Support Files */ = { + 344091525CB7D6536221DB7D18D78D84 /* Support Files */ = { isa = PBXGroup; children = ( - C293CFC6829F5D0B4FA34A7E97BE9036 /* AFNetworking.xcconfig */, - 88947793ADF905B9663533EABD764FDE /* AFNetworking-dummy.m */, - 793F86674E0068BB34C9E8029DE303D2 /* AFNetworking-prefix.pch */, + 57FEE02EF51A521F034E03F903606B20 /* BANetManager.xcconfig */, + B5A9A3555B80689119B5C2DE16E6626B /* BANetManager-dummy.m */, + 17EB73B6840226C409A702BFA00CAC70 /* BANetManager-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/AFNetworking"; + path = "../Target Support Files/BANetManager"; sourceTree = ""; }; - 4F75868358855F9C00E1353E9ABC5255 /* Pods-BABaseProject-BABaseProjectTests */ = { + 35C7F1D264540534A3309A3A0D365661 /* Support Files */ = { isa = PBXGroup; children = ( - 74F2A12B73C7669C548F63641D841D11 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown */, - F2E9A4555AAE6FCF7DCB2FF3F7C59A90 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist */, - 6B782D01E9282AFC5EE6AA265E4A67B3 /* Pods-BABaseProject-BABaseProjectTests-dummy.m */, - AA61728548221DE9AEA85A39C94081C3 /* Pods-BABaseProject-BABaseProjectTests-frameworks.sh */, - 3BB46D1BDA8E927D0294849D61332D50 /* Pods-BABaseProject-BABaseProjectTests-resources.sh */, - B9040C60CE4E764E44E8C39C5572A776 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */, - 8E038A6E85654AE5656DB97C353FB4B1 /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */, + 4ECD915F5623EE5A7BFCD8A9F40327C5 /* MBProgressHUD.xcconfig */, + D098EF662A91968498A77E124302EB90 /* MBProgressHUD-dummy.m */, + D8AF76CFC6451B8E24F41A1078F95ED3 /* MBProgressHUD-prefix.pch */, ); - name = "Pods-BABaseProject-BABaseProjectTests"; - path = "Target Support Files/Pods-BABaseProject-BABaseProjectTests"; + name = "Support Files"; + path = "../Target Support Files/MBProgressHUD"; sourceTree = ""; }; - 51626C6BC932F98A8BD003AC6B06ADB4 /* MBProgressHUD */ = { + 38950E4455EAB88A27E83792F74DE3CC /* YYCache */ = { isa = PBXGroup; children = ( - 0FB0D3E7F94C1857319AB7FD15EF5E96 /* MBProgressHUD.h */, - FE668306681336D7EDCB5181A545E8D7 /* MBProgressHUD.m */, - FEA2560D308838AF85C041A84C85C079 /* Support Files */, - ); - path = MBProgressHUD; + D738726436B6FEDFF7B108051BF55533 /* YYCache.h */, + C2B11DF881084E9F909CF568AA69D08A /* YYCache.m */, + 645FD6BECB7739E2EFF3E953E0E82109 /* YYDiskCache.h */, + AFFEA5AF3E485E420B844B47EF385544 /* YYDiskCache.m */, + 35787C1EADE08EA1FA3A0739B3FA15AC /* YYKVStorage.h */, + D15D4B4697C831661E28AF4B426694E9 /* YYKVStorage.m */, + 7CB0D7512A834348177D062F006911E3 /* YYMemoryCache.h */, + 285DEC3A2DEB85BEE3116BC91D02FDE2 /* YYMemoryCache.m */, + 0C1A7E5AF3134805430A5EEB1CF9274D /* Support Files */, + ); + name = YYCache; + path = YYCache; sourceTree = ""; }; - 5AD8F45D96D8B48CEF8E5CC9E364B0F4 /* MJExtension */ = { + 391BB56D7F659777E99DABAA3E95D8F7 /* MJExtension */ = { isa = PBXGroup; children = ( - A9E81F0535793CD081C12DB576F1AC55 /* MJExtension.h */, - 284AA4125C954750088AD99CE79A0390 /* MJExtensionConst.h */, - CE39C9AB6573BE673FD2B852BC4B7668 /* MJExtensionConst.m */, - B213635D79D1B0C8415CD8DDD0D92E26 /* MJFoundation.h */, - E57F44121735798601DF56B845467DD2 /* MJFoundation.m */, - 1176C31408BDAAD65BF51F700EE3D887 /* MJProperty.h */, - 0F8B7117547F06F7DE8BE03B2E5F35DA /* MJProperty.m */, - C17D76842FCA2CB02F088DE122BABE1D /* MJPropertyKey.h */, - 692F45E832E6A544635CBFF712D6F87C /* MJPropertyKey.m */, - C8147290C16AC26AEC18880E6E7606D5 /* MJPropertyType.h */, - C60BFEF90FD39876DC97935F8F7233E5 /* MJPropertyType.m */, - 69100874766624C2B61F4971D9B2A650 /* NSObject+MJClass.h */, - 3B491FACB2564D7721CD162115BCD106 /* NSObject+MJClass.m */, - 6F85EB7EE4B021B05D803640358DB6D3 /* NSObject+MJCoding.h */, - 5BB20CE80B99FD2CA8B0D10B3A8B42CF /* NSObject+MJCoding.m */, - F3344DCAA1D92FED489A26D42524D37E /* NSObject+MJKeyValue.h */, - 148701A1AC001223787225C8E94DADA2 /* NSObject+MJKeyValue.m */, - DEBF2D21FAC9B1B4DF6E6E4055D75BBA /* NSObject+MJProperty.h */, - BDEECAA6CDC8A66BC9C5117C216A27AD /* NSObject+MJProperty.m */, - EF2B66CE438E19453A385D102B55B2E8 /* NSString+MJExtension.h */, - C1167CF75D7F6BBC6E68161EA9558D58 /* NSString+MJExtension.m */, - FFDF402F08A529338D4122656D60DC3E /* Support Files */, + 08F9C99E7D2BA240D4DD3AED5093367E /* MJExtension.h */, + 0759D3FA679FE64776D6B7C9D1FD9ECE /* MJExtensionConst.h */, + DCE12E777FDFB5F59CE3D1AB607EA1C6 /* MJExtensionConst.m */, + 878A0CC02C1009C8B07BB6C0F2F4B102 /* MJFoundation.h */, + C2F4D933150DAB263D0F1ADFF6D5FF9E /* MJFoundation.m */, + 96C97AD37C37A32AF7ADC0E0AFFC6346 /* MJProperty.h */, + 051B27C920CBC8EEF5484B7AAD7468FC /* MJProperty.m */, + 8D60DB510C4CF8E8BDA17CE4E68AD3E9 /* MJPropertyKey.h */, + BD992D834E45180885BDDC8DADADD153 /* MJPropertyKey.m */, + 8D1D993ABB12AC1ACE1D7D82E8826BE4 /* MJPropertyType.h */, + 95DD5559CEE54A435CB8CB7CEC5D5A0A /* MJPropertyType.m */, + 9731009AFEAF56AACDFB8E681EF551A8 /* NSObject+MJClass.h */, + FE881CF5DC6C0D3BF1424678EB76968F /* NSObject+MJClass.m */, + 2EBCD81DCACFCB19676491212DDAD136 /* NSObject+MJCoding.h */, + 5E048C60C68E30FA69980B9B03FAC8C1 /* NSObject+MJCoding.m */, + D64F734FA822B14CA076B30D87148111 /* NSObject+MJKeyValue.h */, + 1B43B6EB8692A50C274D7B10EE078407 /* NSObject+MJKeyValue.m */, + E776533117D9BAF8AF776D255087524C /* NSObject+MJProperty.h */, + E5F1FE1740DB2CBDE3A588874FF5CEBF /* NSObject+MJProperty.m */, + 082182A0A5CB339A92B820E15098390D /* NSString+MJExtension.h */, + 0D8358950E72253455562539CC2FAA66 /* NSString+MJExtension.m */, + A2CC5987957BC9497497D04A5A33F896 /* Support Files */, ); + name = MJExtension; path = MJExtension; sourceTree = ""; }; - 6183458B074062895635AFCA1CEBF171 /* Security */ = { + 3B2385D7B5C18A19D915E57BA43E582B /* Resources */ = { isa = PBXGroup; children = ( - D4A3730D0111229A07BC6E1FACFBC596 /* AFSecurityPolicy.h */, - AE9B8CF61AEC65F25B77F6A701704785 /* AFSecurityPolicy.m */, + 5CF7C8317E4DC25F54F36124B4F3F4B9 /* BAAlert.bundle */, ); - name = Security; + name = Resources; sourceTree = ""; }; - 670DDAA4D81C059F3AEDC4DEFC126DE5 /* Pods */ = { + 3C3AB7BCC07D0CC5F13B4162576F361C /* Support Files */ = { isa = PBXGroup; children = ( - 0092979368591B7B2AA62B41F6E1B3C4 /* AFNetworking */, - F6F7EAD9D8A4C04F54A91212DF30CAFF /* BAButton */, - 75868C5547FD6D53A949C55DEEE68A8F /* BlocksKit */, - B0F88E2DEA5EE6D7F525CB6AEAC2E773 /* FBAllocationTracker */, - 7041C08EC68D3536CDB4ECDA47731D70 /* FBMemoryProfiler */, - A7D0851C12C490E611E05A5EF3092756 /* FBRetainCycleDetector */, - 1D972870EDB9DB3906220E3A0564269B /* IQKeyboardManager */, - 6AADDF59816E1B16514AFB270C570C1C /* JMRoundedCorner */, - C8A7FFEF0679ABCAA54393074DAA6F72 /* Masonry */, - 51626C6BC932F98A8BD003AC6B06ADB4 /* MBProgressHUD */, - 5AD8F45D96D8B48CEF8E5CC9E364B0F4 /* MJExtension */, - E35160C7F91BC675D05CF833EF4DB90A /* MJRefresh */, - 7BFE0A39145E50B7D495DD085AD639BC /* MLeaksFinder */, - 11EA46CAD15D145B2229A677A756CD29 /* MyLayout */, - 8059E860666256FF8AE87A191B4538DE /* NullSafe */, - FA04856AC14B9FBA63A86F2C5D698C92 /* SDAutoLayout */, - D0FB24469D730F87FD0942DE89DBDEFC /* SDWebImage */, - 9D8F09C1F698232BC6B56C4DC8F8B9B5 /* UMengSocial */, - DE386D134C1B0AB0468FC7A0AB07D5F2 /* WebViewJavascriptBridge */, - D416EA197E58E9E3DDF11883AF4B588A /* YYKit */, + 660A7FF695AADDEB5FB5BDD9E27428A1 /* NullSafe.xcconfig */, + C70FE6E6862B92B401F41A93D102FBED /* NullSafe-dummy.m */, + F70D8D3E45FCC5F26E12F1A175B8A239 /* NullSafe-prefix.pch */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/NullSafe"; sourceTree = ""; }; - 69974D8BD1EE1F6177947ABBE9F95671 /* Support Files */ = { + 3E90695702A038076ABA8B2B54EF7BFE /* Targets Support Files */ = { isa = PBXGroup; children = ( - 3CA468691084FABF8B4121A25DBBED2C /* IQKeyboardManager.xcconfig */, - 65BC2F9B62FDFEE89297CBF1C49B9A16 /* IQKeyboardManager-dummy.m */, - CDCCEE2F0F0D7EE0C5F9EBF63A6A8889 /* IQKeyboardManager-prefix.pch */, + E266CF14E860C7FC9B093956A5969B1F /* Pods-BABaseProject */, + 4F75868358855F9C00E1353E9ABC5255 /* Pods-BABaseProject-BABaseProjectTests */, + E85F36EED1BE25B9385971FD663CED87 /* Pods-BABaseProject-BABaseProjectUITests */, ); - name = "Support Files"; - path = "../Target Support Files/IQKeyboardManager"; + name = "Targets Support Files"; sourceTree = ""; }; - 6AADDF59816E1B16514AFB270C570C1C /* JMRoundedCorner */ = { + 3ECC7E5B93C910A04170258B6418C473 /* Support Files */ = { isa = PBXGroup; children = ( - 9235FCE9082CA58ACD63B241E9291D86 /* UIImage+RoundedCorner.h */, - ADD4E0D477E9E2D33FE7546548637C75 /* UIImage+RoundedCorner.m */, - 9BABD48B48F3AF368E6FCA862B2E58E0 /* UIView+RoundedCorner.h */, - 81BDDFDE6ABEABDB18A477150F4049F2 /* UIView+RoundedCorner.m */, - 186CC53799CD8D38035660CFC8A0D248 /* Support Files */, + 93AFB7B99EC71CD1AC1A9AC6A2F12A4B /* BATouchID.xcconfig */, + 5FAB0BB99535D38F65234DE1225639F4 /* BATouchID-dummy.m */, + 5E20BF45AC08FB6EBDBD8C26952923C2 /* BATouchID-prefix.pch */, ); - path = JMRoundedCorner; + name = "Support Files"; + path = "../Target Support Files/BATouchID"; sourceTree = ""; }; - 7041C08EC68D3536CDB4ECDA47731D70 /* FBMemoryProfiler */ = { + 41FD8F7C74067E909F88FAD3BFC34C92 /* FBRetainCycleDetector */ = { isa = PBXGroup; children = ( - 5364CBEEC29A2377D1D617DB67D7FD03 /* FBMemoryProfiler.h */, - D95948DEC2901596D888633F34A13CC6 /* FBMemoryProfiler.mm */, - 38B3A28C52D5632B18B9F817CFD777F1 /* FBMemoryProfilerContainerViewController.h */, - 4256130E7E08605BAA83B02D16E09619 /* FBMemoryProfilerContainerViewController.m */, - 0E72986232B31803321B32F5A0994B4D /* FBMemoryProfilerDataSource.h */, - 1F46A618CEB860FED640BFF35C463996 /* FBMemoryProfilerDataSource.m */, - 0EE915E8457B56BB369F5AEBACFED157 /* FBMemoryProfilerDeviceUtils.h */, - 79F6961AD9825205FB7AC820975DE4AF /* FBMemoryProfilerDeviceUtils.m */, - C0F377538D2D64A5DBBEBB40B9F10B7F /* FBMemoryProfilerFloatingButtonController.h */, - 0552B3FF01CC254341F9BDD57A1DA428 /* FBMemoryProfilerFloatingButtonController.m */, - B2A6223DCD46DE4F65A52893D4EE6E24 /* FBMemoryProfilerGenerationsSectionHeaderView.h */, - ECFE48D475CD44CBED9B7C5289FDCEAE /* FBMemoryProfilerGenerationsSectionHeaderView.m */, - 944B1C22925735F8881138F7DA2A23AA /* FBMemoryProfilerMathUtils.h */, - A3571DB6462414D99889619FD60449AE /* FBMemoryProfilerMathUtils.m */, - 5F1EE925428FBECEB0E13992AD8C9806 /* FBMemoryProfilerMovableViewController.h */, - DE6D61E44A4DCF9F0735A488361C9B26 /* FBMemoryProfilerOptions.h */, - A95A44FBA41652A2ECB84785F2E86CF7 /* FBMemoryProfilerOptions.m */, - E24D9A769655360BD36ED428F0E80DD8 /* FBMemoryProfilerPluggable.h */, - 92E909620553250D700F6E1F7F566FE1 /* FBMemoryProfilerPresentationModeDelegate.h */, - 961F876747EC9A1D5E32BE45FE644EE0 /* FBMemoryProfilerPresenting.h */, - 4C93035ECBBA901BB001C1BC351FE3AB /* FBMemoryProfilerSectionHeaderDelegate.h */, - 42BDF165D26E6DCA2F9FFCB395C0383A /* FBMemoryProfilerSegmentedControl.h */, - E8FC988D841065B3C10D3B37D0EB0ABB /* FBMemoryProfilerSegmentedControl.m */, - 4C4BE6AA65BD511B1DC825C2E301DF34 /* FBMemoryProfilerTextField.h */, - 7B829A03D07E44A405920D9E1937F356 /* FBMemoryProfilerTextField.m */, - A2A278B5CF68BEAF8064A78196D43FE3 /* FBMemoryProfilerView.h */, - B14E63E64DCD2A8AA1960223D09A3EC1 /* FBMemoryProfilerView.m */, - 705959D551DFEBB854801ADC36DB7722 /* FBMemoryProfilerViewController.h */, - B8AB11B7F08B0AEE5078DBEFB8BB0F65 /* FBMemoryProfilerViewController.m */, - 9FCD2B9031FCC29FB4D41E000DC607E3 /* FBMemoryProfilerWindow.h */, - 9CEB17BF1D637D3D3B4541833DD8413B /* FBMemoryProfilerWindow.m */, - A52F5F609D7DDA2FD09B6E918914AC21 /* FBMemoryProfilerWindowTouchesHandling.h */, - D964DD3090BBFF5546FC9B414D405D14 /* FBRetainCycleAnalysisCache.h */, - 9E667E696694C0D86051522393D31A50 /* FBRetainCycleAnalysisCache.m */, - 95E2F474CF8CC4926A38DC930677D4C4 /* FBRetainCyclePresenter.h */, - DF4A42C3053AABAE1B120AAC4BBBF872 /* FBRetainCyclePresenter.m */, - B8EC09614D18706ADB27C639ECF62DE4 /* FBSingleRetainCycleViewController.h */, - E951B238F55C08FB59E90C3CD49C7D42 /* FBSingleRetainCycleViewController.m */, - 25E32A38343A821DC1FF8571F6DA58DA /* Support Files */, - ); - path = FBMemoryProfiler; + C6DBCD28FCD626B506271488F6313370 /* BaseType.h */, + 64DBE5F8BBD92A71E95B851C2CEDCD4C /* FBAssociationManager.h */, + E263CDE84DF182C2232CD2991EFFFA0C /* FBAssociationManager.mm */, + 730864ECFC785CF72C5D632B85F70C23 /* FBAssociationManager+Internal.h */, + 5AAD4883A055A75F1311DE4A805AF105 /* FBBlockInterface.h */, + ABEAB6702D091BD0AF5DA298F3A106A0 /* FBBlockStrongLayout.h */, + B9A91DDA7E64E859C26D6CF57BBE5C29 /* FBBlockStrongLayout.m */, + C607A6B1B7A3551AF885590E7B10D53D /* FBBlockStrongRelationDetector.h */, + 2FAEB1F6ACFBD9ACCDC835645763CA8A /* FBBlockStrongRelationDetector.m */, + 4C1407FB601C2671A1CB39BA8960D5DB /* FBClassStrongLayout.h */, + 1DDA574E254C090B33EB9AAB23570D11 /* FBClassStrongLayout.mm */, + FDE0D1F515C62158394BF3A8CEAB6436 /* FBClassStrongLayoutHelpers.h */, + 12F4CC0D9A789BA0EF4C5ABEA99F8D83 /* FBClassStrongLayoutHelpers.m */, + 95850DA30F2BB1B84D94C6178972F6A7 /* FBIvarReference.h */, + A1D5EEE93A96612FD5CF2FF2CD1D3DD5 /* FBIvarReference.m */, + FAFCE66510F5C72350C031D6CA342C58 /* FBNodeEnumerator.h */, + F1245DCADA367ECF0B9A5FC124EC259B /* FBNodeEnumerator.mm */, + 01B4E936F6957AE85B5FB407B150EBC0 /* FBObjectGraphConfiguration.h */, + F3703EC741A1CBA8FD2B6A90EA808B3E /* FBObjectGraphConfiguration.m */, + E25F808055257D1088E5D63822CA2698 /* FBObjectInStructReference.h */, + A0D90254371991424FF2AC105609FDA3 /* FBObjectInStructReference.m */, + 500E8609A7C6478FF93264F69B6822CF /* FBObjectiveCBlock.h */, + 8A820BC42588ED20A7DA9742723911D5 /* FBObjectiveCBlock.m */, + 93234A36AA4E82B5500A13B523BBF26C /* FBObjectiveCGraphElement.h */, + 6A329314C9FB7BCFAA04B9A2D9875BF8 /* FBObjectiveCGraphElement.mm */, + D1CC9C76C884F56DA3F1402A420CBB6F /* FBObjectiveCGraphElement+Internal.h */, + 277DBB41112C0CCFDFE1E1341BA3F6D2 /* FBObjectiveCNSCFTimer.h */, + 80A10BA1C35D53F01346A73D5910FB6C /* FBObjectiveCNSCFTimer.mm */, + 8B76D18B532E5127E5658D8CAE0FB6CC /* FBObjectiveCObject.h */, + 089DFDA2E91232FE841E02962273C34B /* FBObjectiveCObject.m */, + 4C40F9C9B3CA2A6856FE4AB75711F9EF /* FBObjectReference.h */, + 435CF4706573795628005AF2384CD26C /* FBRetainCycleDetector.h */, + 1BACFD0B00F53EE280B277E0569FDCE5 /* FBRetainCycleDetector.mm */, + 155961995EE5EA2560BA51896ACBA23C /* FBRetainCycleDetector+Internal.h */, + F4CE5ECD7355E0C0076A8173CBCFB84B /* FBRetainCycleUtils.h */, + 7BD9CA6229D0C6AF61ED4CAFCFE388C1 /* FBRetainCycleUtils.m */, + 02173D79633FD20DB16941D0EE34DE04 /* FBStandardGraphEdgeFilters.h */, + 01ECCDDED3A1496AFCBB954F1BE228A5 /* FBStandardGraphEdgeFilters.mm */, + 9448E64F97FD9307451B66E172594356 /* FBStructEncodingParser.h */, + 78AA4C06C28E1562EA304CCC6FD497EB /* FBStructEncodingParser.mm */, + 82EAAEC10A1168277E065755D0E6A828 /* fishhook.c */, + F42FD717A852C0FE7FAA541B808B047A /* fishhook.h */, + 811A0E1051557C4254EF3DA722799C17 /* Struct.h */, + 230F29483FCC337D606D637DD1FB2B88 /* Struct.mm */, + EE6B82B7B241315F082442745525D3B1 /* Type.h */, + 1F3AF483EE8F1E3A41D83334F0F80E69 /* Support Files */, + ); + name = FBRetainCycleDetector; + path = FBRetainCycleDetector; sourceTree = ""; }; - 75868C5547FD6D53A949C55DEEE68A8F /* BlocksKit */ = { + 44280CF47A37F3060CE88B8073267A47 /* Frameworks */ = { isa = PBXGroup; children = ( - C615EDCE33600E6F127FAD1FBE4FE2D2 /* Core */, - C244D84D9C34E06F53C59DCED050DECA /* DynamicDelegate */, - F659DF71E0CF33C71CDB5AD291C436EE /* MessageUI */, - B871EE9D3297F807D7A2F300C75DB309 /* Support Files */, - 0FA60C029D44C9EFF4240358849F13F5 /* UIKit */, + 5CA1EECDBF84706387AA49384039D6F3 /* libWeiboSDK.a */, ); - path = BlocksKit; + name = Frameworks; sourceTree = ""; }; - 7BFE0A39145E50B7D495DD085AD639BC /* MLeaksFinder */ = { + 47538F345FB35EF54EE22AE150E226AF /* AlipayShare */ = { isa = PBXGroup; children = ( - C61921B8CBDA195E8F13C72F03FEC9C6 /* MLeakedObjectProxy.h */, - 6297F00AD799E12E9ED2C989B1ABE31B /* MLeakedObjectProxy.m */, - 273058C0C66CF91736A9996C2ECEFB6E /* MLeaksFinder.h */, - 96BB5011113C71D8709B3540360F4927 /* MLeaksMessenger.h */, - AE942AA33351A6E0C5B35BD36B65B7ED /* MLeaksMessenger.m */, - 5F8BA914C2EDBB0166CB02E3C805D3AF /* NSObject+MemoryLeak.h */, - 952FCA31B82E17C8E6256A933FBAF018 /* NSObject+MemoryLeak.m */, - 9203095B5298625FA1E60CF69A48CE89 /* UIApplication+MemoryLeak.h */, - F6A8C0F42635BF416D1CE21CE53B85C8 /* UIApplication+MemoryLeak.m */, - DC4B16A2C39B9FDED877B0623F36525E /* UINavigationController+MemoryLeak.h */, - AC31422140AE9ADA8E3BCF77B0641D31 /* UINavigationController+MemoryLeak.m */, - 7708982EC1C7F7B4A4002C2E81A2DE33 /* UIPageViewController+MemoryLeak.h */, - 3A3C0F8BC2663543BBB56BD1D07D6CFE /* UIPageViewController+MemoryLeak.m */, - B8D231300C964E617A1CCE86035669FF /* UISplitViewController+MemoryLeak.h */, - 12C6A852590F540BC62A8D4D29FE3E95 /* UISplitViewController+MemoryLeak.m */, - DAC6A3EC477ABAB4D70C54E869B7CE45 /* UITabBarController+MemoryLeak.h */, - 9C70056B483458E7104305C91241DE75 /* UITabBarController+MemoryLeak.m */, - 1BB1092AFA35D2C14D4174FC42FAA26F /* UIView+MemoryLeak.h */, - D2F7CEBB1A9B91FD3A804467D307AA6C /* UIView+MemoryLeak.m */, - AB6D57D045C4E299B7132365AA8B7F85 /* UIViewController+MemoryLeak.h */, - 87F50D2DBB0272E5F1F817513CA465D6 /* UIViewController+MemoryLeak.m */, - 8356DE08C3D8BD6EE4C4F21693F808F5 /* Support Files */, + 22AB4ABACB85E561190034B7B6551504 /* APOpenAPI.h */, + BDB8312FDC9D04BE3830776BD0B9E027 /* APOpenAPIObject.h */, + 3671B4A39B437A4A1500B060B40C94A9 /* UMSocialAlipayHandler.h */, + F00A095D90849D3B713E0CC7682041FE /* Frameworks */, ); - path = MLeaksFinder; + name = AlipayShare; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 486B38C2D378BC89A307496AC030C282 /* Masonry */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 1BD0CAD28A6279C83A321F199AEBA4EE /* Frameworks */, - 670DDAA4D81C059F3AEDC4DEFC126DE5 /* Pods */, - 8BF31E0DC007D0C028B2DF6206A25624 /* Products */, - 3E90695702A038076ABA8B2B54EF7BFE /* Targets Support Files */, + 50896F33233684212DC121A645CC89F8 /* MASCompositeConstraint.h */, + 444D4B257658723EBB2335B6280A8866 /* MASCompositeConstraint.m */, + 9E67FF242F605D60BDD908B30A835E94 /* MASConstraint.h */, + D9D50A1B986AE4CBAC9F25A3B87D0CE6 /* MASConstraint.m */, + CC6DDDF0E27A3900E532CDE064919124 /* MASConstraint+Private.h */, + AFAC06ECACA6EE974CE680A7AF8AC065 /* MASConstraintMaker.h */, + 211662498AC88AD17BDE0A4817A3C1CB /* MASConstraintMaker.m */, + 4A076E905BE295CE093C9085B1D7F7CB /* MASLayoutConstraint.h */, + EEA7BF8AD0BBE0F7C0E09936A24D445F /* MASLayoutConstraint.m */, + 403F378006FD2BF9BAD9E8276E715A41 /* Masonry.h */, + 53F0F5DE5C01B7BAA938DA1FF02477B0 /* MASUtilities.h */, + 765E7F28BA6619A94CF2C0F1D1EE621F /* MASViewAttribute.h */, + 19D8003D5754AC4C5B8FCF890B9BF84A /* MASViewAttribute.m */, + 2ACFCC94452F527AE31DDF08B14330AB /* MASViewConstraint.h */, + 1A920D2F9BDEEDAEFCB1E58B82982BCD /* MASViewConstraint.m */, + B837B9C68445C1FCC28E0B1CC395B0F2 /* NSArray+MASAdditions.h */, + 36D80C429D17ED6E81D2D863B3757C8D /* NSArray+MASAdditions.m */, + 717EF9B6502DAAF2737CE842DFA5B309 /* NSArray+MASShorthandAdditions.h */, + 6144199C55F769BCA18BC97E102C9CA8 /* NSLayoutConstraint+MASDebugAdditions.h */, + 55C7EA2D39D172B466546AA4FAE87851 /* NSLayoutConstraint+MASDebugAdditions.m */, + E8FCEFDAFDF12FCFC776957239B52E91 /* View+MASAdditions.h */, + 514AC273FC24445D83FC5C9F35EB1DED /* View+MASAdditions.m */, + 9F8BED4FCA81E6191645978BFB0DE7A6 /* View+MASShorthandAdditions.h */, + 2E856330B4B3D8B9348F393D3A51DB82 /* ViewController+MASAdditions.h */, + 4543D78CD3D31D7C057CCBE5F42C8ED4 /* ViewController+MASAdditions.m */, + 047F78C977F7C0C7AAFEF7B90E9D2998 /* Support Files */, ); + name = Masonry; + path = Masonry; sourceTree = ""; }; - 8059E860666256FF8AE87A191B4538DE /* NullSafe */ = { + 487F09620FF4BE3BE44933B360933FB5 /* ReducedQQ */ = { isa = PBXGroup; children = ( - 2EE83000F7B65AC006FCD523F4318FED /* NullSafe.m */, - AC4A143682B3D3A67B054D86E0F4EB67 /* Support Files */, + 9891244C472758A11480E5437D23EF3A /* UMSocialQQHandler.h */, + 20C800004D7714211CF7A285445BB05B /* Frameworks */, ); - path = NullSafe; + name = ReducedQQ; sourceTree = ""; }; - 8094E5F255737AC3D9566B14F5571530 /* iOS */ = { + 4C352D662CA230F719B90FD03AA673EF /* Resources */ = { isa = PBXGroup; children = ( - 37AE1CD4FA627D2486748A541972215A /* Accelerate.framework */, - B0367C8FA55E93591F95053CA17A1B6A /* AssetsLibrary.framework */, - 6F988423503EF98F2FEA42F723F4BBE6 /* CoreFoundation.framework */, - F72F2717BE67599AA3C060579FD19346 /* CoreGraphics.framework */, - 7FB4B5260A762969A24BF67D414EF643 /* CoreImage.framework */, - B08E2CEFD1FE5CA5903983EF82AAC458 /* CoreText.framework */, - 3698933040026038E6B013F971CC37E6 /* Foundation.framework */, - BF629F5D0C79C753A9E822947DEC1586 /* ImageIO.framework */, - 20E66BB1768AD27435FA30D2A98779D0 /* MessageUI.framework */, - 2F230BC7920E555B8E82AD99BA354C48 /* MobileCoreServices.framework */, - BAB02C4C5CF01C1DF1D33336447A8F13 /* QuartzCore.framework */, - ADEBD85F4C1C7213EAFFE19D21B4184D /* Security.framework */, - 200428244E7F1CAC94E2D732B86F5D27 /* SystemConfiguration.framework */, - 4712322705BA9B919B0B2B6D5386840B /* UIKit.framework */, + 18D96FE27DB98800E0CF89E3B9F0DF3F /* TencentOpenApi_IOS_Bundle.bundle */, ); - name = iOS; + name = Resources; sourceTree = ""; }; - 8356DE08C3D8BD6EE4C4F21693F808F5 /* Support Files */ = { + 4F75868358855F9C00E1353E9ABC5255 /* Pods-BABaseProject-BABaseProjectTests */ = { isa = PBXGroup; children = ( - 14AAB5D81DDF9197E0128299DDB440A8 /* MLeaksFinder.xcconfig */, - 06923B986B9E3DF1096EE7B949FF5A89 /* MLeaksFinder-dummy.m */, - 59549BB86E8407BD18DC6A23749BD49F /* MLeaksFinder-prefix.pch */, + 74F2A12B73C7669C548F63641D841D11 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown */, + F2E9A4555AAE6FCF7DCB2FF3F7C59A90 /* Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist */, + 6B782D01E9282AFC5EE6AA265E4A67B3 /* Pods-BABaseProject-BABaseProjectTests-dummy.m */, + AA61728548221DE9AEA85A39C94081C3 /* Pods-BABaseProject-BABaseProjectTests-frameworks.sh */, + 3BB46D1BDA8E927D0294849D61332D50 /* Pods-BABaseProject-BABaseProjectTests-resources.sh */, + B9040C60CE4E764E44E8C39C5572A776 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */, + 8E038A6E85654AE5656DB97C353FB4B1 /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */, ); - name = "Support Files"; - path = "../Target Support Files/MLeaksFinder"; + name = "Pods-BABaseProject-BABaseProjectTests"; + path = "Target Support Files/Pods-BABaseProject-BABaseProjectTests"; sourceTree = ""; }; - 8BF31E0DC007D0C028B2DF6206A25624 /* Products */ = { + 50001ADEDEBE8D408D2625A07341DE83 /* Sina */ = { isa = PBXGroup; children = ( - 769D05CD721EEA4FFB52AE8D6AFFF199 /* libAFNetworking.a */, - 70871709F538ED14CF03B137C02A8E45 /* libBAButton.a */, - 4538FD40297CA79DB8CDE665A81DE8A3 /* libBlocksKit.a */, - B25BBB87AC06B7F8FFCDDD4F34D11D86 /* libFBAllocationTracker.a */, - 144C440F0AFC5C445523C400AF409A6A /* libFBMemoryProfiler.a */, - 93264B354E37C0A94E976DFF6F868698 /* libFBRetainCycleDetector.a */, - F38779F1A83D21F874604E26DEE40E0A /* libIQKeyboardManager.a */, - 7B76F296A3C646F332E6530AD4E84E33 /* libJMRoundedCorner.a */, - BEC29C2C4693655F7BFBD6BE0DB1D2CE /* libMasonry.a */, - 288B72AA3C58E307C4389C3C52273715 /* libMBProgressHUD.a */, - EC5CEF7487FECB58388614ED120649BD /* libMJExtension.a */, - D49E82DDCE38B66E39BBC64B88C05650 /* libMJRefresh.a */, - E3357C2D50236DED53B1C1A8BF1F135F /* libMLeaksFinder.a */, - B696538C145D3F1CF93CE278A6D90206 /* libMyLayout.a */, - E1C0048F5E133A922700A51EE9BE7EB4 /* libNullSafe.a */, - E70291ACEF1EAD6C0819A7A42F40F502 /* libPods-BABaseProject.a */, - 57768CBA856A51F8D31835601F2C7CF5 /* libPods-BABaseProject-BABaseProjectTests.a */, - 0035845876E7EC58331336E8112E7986 /* libPods-BABaseProject-BABaseProjectUITests.a */, - 7815EC8CFEF112D81BC88DCC35995367 /* libSDAutoLayout.a */, - EBF706F17C94E152003A5AF47B58798A /* libSDWebImage.a */, - 1905F135A73F32BC7B6C8573855235AA /* libWebViewJavascriptBridge.a */, - 240D5346C40C8A4793704A345166F6E2 /* libYYKit.a */, - ); - name = Products; + C689F5BDD13FC94864EDE8FAC3A3794E /* WBHttpRequest.h */, + 22F0B7DC48F3AE70868877DB6888BAF9 /* WBHttpRequest+WeiboToken.h */, + E69699E8B0D6448DF0DB6D15E963CB92 /* WeiboSDK.h */, + 8412A09C5134434A5730A730A228A42A /* WeiboSDK+Statistics.h */, + 44280CF47A37F3060CE88B8073267A47 /* Frameworks */, + AF1A798F7E8EFD20D49070FEC16D0D0A /* Resources */, + ); + name = Sina; sourceTree = ""; }; - 8C6CD012FC7053DC7FDFF9F9F742EC18 /* Support Files */ = { + 505540D01EA310285DDE76DEEA7FEB19 /* IQKeyboardManager */ = { isa = PBXGroup; children = ( - B9CDD4E2472E289FF16D67669DD34C6A /* YYKit.xcconfig */, - 871BFF58AD76397C230BF88813DA3552 /* YYKit-dummy.m */, - 1AD45B236E26EF32F8CC18E1A7CB4D6D /* YYKit-prefix.pch */, + F344F11D49F15853191E2DFDB70CAC29 /* IQBarButtonItem.h */, + 83FA8D8C61EFB1CB2D49B34CB9628D50 /* IQBarButtonItem.m */, + 296A677D2DE30C7190B4240C2DFCCC02 /* IQKeyboardManager.h */, + 5222E50B77065D4839E4C83532E2D5CA /* IQKeyboardManager.m */, + 8F0DE6243A4F4E4CF6FD3AC7401DE61C /* IQKeyboardManagerConstants.h */, + 5A776A1F54D563FA366882864F4773DA /* IQKeyboardManagerConstantsInternal.h */, + ED6C495242508E51175CD46DE280A767 /* IQKeyboardReturnKeyHandler.h */, + 1815DD33D4791214C169D35AB767C541 /* IQKeyboardReturnKeyHandler.m */, + 6B563D356738CBFD934E59F1F95F94E6 /* IQNSArray+Sort.h */, + E289E6000C07977DD066205B22CF45BE /* IQNSArray+Sort.m */, + 3F9CAF1A0F76DF7C95AA9FE87616AA50 /* IQPreviousNextView.h */, + E91A174996D1BC996779C6506C28A744 /* IQPreviousNextView.m */, + A1248E606F012300018B23C31E9680AC /* IQTextView.h */, + C5B928368CF1F81EE818B14DDE3E9280 /* IQTextView.m */, + 389DC02195D2060AE766053F5810F53A /* IQTitleBarButtonItem.h */, + F3ECD567247047A054B2A13BEB2DB7E9 /* IQTitleBarButtonItem.m */, + 5C0FD2363C19CAAAD2FA740B029FE7D6 /* IQToolbar.h */, + 6894BFF390848EB3D17A76D80EECF687 /* IQToolbar.m */, + F2D5CCC769B68FD5CA071CE470976902 /* IQUIScrollView+Additions.h */, + CE4E9B76191389562F0DDD143BC73213 /* IQUIScrollView+Additions.m */, + C7F7038192838C521B2A3AAE6CF28774 /* IQUITextFieldView+Additions.h */, + 9D91D0FF2C718F2C6CDD5210B1769B0A /* IQUITextFieldView+Additions.m */, + 65BC33252FCA9058A7D3CFAA47C2E12F /* IQUIView+Hierarchy.h */, + AB9EB42B9050E4FEF520D780AF17C884 /* IQUIView+Hierarchy.m */, + 5B788588778E43455F9CFC1EC1A2240E /* IQUIView+IQKeyboardToolbar.h */, + 9E1D79763F0BFC7180FCE2A379B50BD6 /* IQUIView+IQKeyboardToolbar.m */, + C6638A012A7EA49021C2580330CA7D10 /* IQUIViewController+Additions.h */, + E331D4315A214B57E7B39B57D7235F53 /* IQUIViewController+Additions.m */, + 71CF3E8627FA78B3AB21BC4BED237D8D /* IQUIWindow+Hierarchy.h */, + 17D64FBB4A2519B2CA50A02FA7A3817B /* IQUIWindow+Hierarchy.m */, + 32524923047247C8FFC7F2D5433A8D2B /* Resources */, + 6E4CE3C40A317DF7DD6B1EAE95F32EAF /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/YYKit"; + name = IQKeyboardManager; + path = IQKeyboardManager; sourceTree = ""; }; - 97646BFF9993B9742D127B99C09B24EB /* UIKit */ = { + 5127CB1E1790294810CEFF46B813993F /* Support Files */ = { isa = PBXGroup; children = ( - 1BAC7C173C6267FA2878B5B7D39EA518 /* AFAutoPurgingImageCache.h */, - B9F88D64640F1DEFA5DCC1C0537CCAA1 /* AFAutoPurgingImageCache.m */, - CA5A25BC9D4E907A46EEBBD41109CA53 /* AFImageDownloader.h */, - D657546308DBF394A9D70B57267F3EB9 /* AFImageDownloader.m */, - D09EE8D2C85CA40EE3C7F87F72617256 /* AFNetworkActivityIndicatorManager.h */, - 11FC7125B107B56BF9F94DFEE0EF6245 /* AFNetworkActivityIndicatorManager.m */, - 638F8AABDD62672939B204DD4FE0712C /* UIActivityIndicatorView+AFNetworking.h */, - 5BB2C01F462AD8F43C95BD5DDC756358 /* UIActivityIndicatorView+AFNetworking.m */, - F2889C10D93653FBF156A4E9F1118976 /* UIButton+AFNetworking.h */, - 2B138AD15939CEF73595C2E88EF81EB1 /* UIButton+AFNetworking.m */, - 84F3FDF92C92BDB11D471B0CFFC7E5B9 /* UIImage+AFNetworking.h */, - BEC11E4322B88F12D64410C2C0C23D02 /* UIImageView+AFNetworking.h */, - 30135DB7B2997410CF579580F9ECAF04 /* UIImageView+AFNetworking.m */, - 16BF0E56399719AA833B2783027E1F79 /* UIKit+AFNetworking.h */, - 123A5E72353E47385BDE1F6714806946 /* UIProgressView+AFNetworking.h */, - BBD5ED7DCF756D27CFD4D403E4C61B50 /* UIProgressView+AFNetworking.m */, - 4B7117B3BCBB7B6A1A59343FDE65AFAB /* UIRefreshControl+AFNetworking.h */, - EBB6B9021DC0896B8CC106657449A78F /* UIRefreshControl+AFNetworking.m */, - CCB7BD27356A5191522BDE36482D3DED /* UIWebView+AFNetworking.h */, - 0092D3D06AD87FDB0BEB6B9545A56593 /* UIWebView+AFNetworking.m */, + 663A19FFB2BDB3088FC83BCB69A56988 /* MyLayout.xcconfig */, + BC6FC10C68A48A66F831E1EBE43EAC49 /* MyLayout-dummy.m */, + 4510791B869F4D7AA04BC2CC44AFADEB /* MyLayout-prefix.pch */, ); - name = UIKit; + name = "Support Files"; + path = "../Target Support Files/MyLayout"; sourceTree = ""; }; - 98B5741DDBA3C2E514D0E93EC11E67ED /* Support Files */ = { + 53FAD1AED3F5A95E6B6E7EDCC0369156 /* Support Files */ = { isa = PBXGroup; children = ( - F3909CA2318F98A6D06C2D6EF9B13CB5 /* SDWebImage.xcconfig */, - EDBB49A61C680654850393134FF81A3F /* SDWebImage-dummy.m */, - 7B140DE3A9081AB2EFB0E6D41AA7F0FC /* SDWebImage-prefix.pch */, + D8102957964045D9CE1780BC8C2B4D72 /* AFNetworking.xcconfig */, + DE63024DF0B71846FBEEF4623BCA9019 /* AFNetworking-dummy.m */, + 2A0065A702ADA89850B8FE13EC1D2E30 /* AFNetworking-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/SDWebImage"; + path = "../Target Support Files/AFNetworking"; sourceTree = ""; }; - 9D8F09C1F698232BC6B56C4DC8F8B9B5 /* UMengSocial */ = { + 598D7D798888A8DD474B98921C5D46DA /* NullSafe */ = { isa = PBXGroup; children = ( - 8129DE49A32FA7F798E44444D0ABEC7C /* APOpenAPI.h */, - F6C2E14E34B70EFE1465E0369C4533F6 /* APOpenAPIObject.h */, - 78B9ECC35CC0C5D2CC96B8C51E14EA9B /* UMSocial.h */, - CB87C62AE6E5C45889814D0B4AC34B36 /* UMSocialAccountManager.h */, - 4D218FC49276D25CF7A3F38239314838 /* UMSocialAlipayShareHandler.h */, - B00315F157BCD001B78AC8C41A183E5D /* UMSocialBar.h */, - FB2C90B3901EDA03712AC7220E136EC9 /* UMSocialConfig.h */, - A4506D8CE7BED59971E881257AFF9911 /* UMSocialControllerService.h */, - D01A85BFB73FD7F935560D47D57A81CA /* UMSocialControllerServiceComment.h */, - 6823FB292EAD4DD5284907E8B4B0D85C /* UMSocialData.h */, - B9CFA88A92293B958DA20564BFE2EA70 /* UMSocialDataService.h */, - BD20923BDF87CF94DD9630025F397ADD /* UMSocialFacebookHandler.h */, - B1F5A5B82C6B2761D528F2924568504C /* UMSocialInstagramHandler.h */, - 7255C95DDD6766282731AAE5DD1F9BA2 /* UMSocialLaiwangHandler.h */, - 869B45B936CD39EA123E85D842443321 /* UMSocialLineHandler.h */, - CD1330F645A5ED76EF05BA751E6537A3 /* UMSocialQQHandler.h */, - 9CC9442DC0E5812B81C743588F30693D /* UMSocialSinaHandler.h */, - 76B5F9DE17CE07DF617770BCCD60BCA6 /* UMSocialSinaSSOHandler.h */, - D4E7CFA66B6EF7657077F4BC2D8D0006 /* UMSocialSnsData.h */, - 9FC05C0F71D0920E092E83CD4FF59DB6 /* UMSocialSnsPlatformManager.h */, - 23D1167FF7B65A01F1B7BD2DA3F382CE /* UMSocialSnsService.h */, - 43EAF23E8EA3541BCE6659ED8BAA2210 /* UMSocialTumblrHandler.h */, - 90F2739D5E8E6919B21D8B70C2B23960 /* UMSocialTwitterHandler.h */, - 80496A5A3F411AD5B449D4E4A41EA4EA /* UMSocialWechatHandler.h */, - E3BF14FD2D4416057FD82A5E63D8DEE2 /* UMSocialWhatsappHandler.h */, - 6F128CD0D57C7E81E7A1492CAB990888 /* WBHttpRequest.h */, - 53FB588A113AB29AD3375DE84C25ABDE /* WBHttpRequest+WeiboGame.h */, - 5BC30B5939D17763233F285D247CC1A2 /* WBHttpRequest+WeiboShare.h */, - D8C7363D104E3C693F0B79121ED330FD /* WBHttpRequest+WeiboToken.h */, - 08F8DDEB1BCC514204993B8F2D17E2B6 /* WBHttpRequest+WeiboUser.h */, - 18566A1235AC54B710AF9172ABF3E47F /* WBSDKBasicButton.h */, - 7FAB178DCC346DD357F6185649270335 /* WBSDKCommentButton.h */, - 3471A15044110541D125F12AA4FAB42E /* WBSDKRelationshipButton.h */, - EF9FCC932C774D75C21C9F8A3D51589B /* WeiboSDK.h */, - 0C831BBE29D3D88E9374FF889283405A /* WeiboUser.h */, - 13C44FE4476867326B1322C8801A34A2 /* WXApi.h */, - 2B4ACCAFBE6446BAB21858D74DE52729 /* WXApiObject.h */, - 1D86B574429F65018009855F4E147BBB /* Resources */, - ); - path = UMengSocial; + EBFC03F0A603F5F06588BA74F5319B6F /* NullSafe.m */, + 3C3AB7BCC07D0CC5F13B4162576F361C /* Support Files */, + ); + name = NullSafe; + path = NullSafe; sourceTree = ""; }; - A377D5AC4BB6A6FD1AC5831558A76752 /* Core */ = { + 5AF07974CDD64F87387AC6A1FD11CF92 /* Frameworks */ = { isa = PBXGroup; children = ( - 256E82EDE793BAEAEFB952558470B935 /* NSData+ImageContentType.h */, - C65F485FBA386474CC18FAE641526C21 /* NSData+ImageContentType.m */, - 27D288C16715291171958E598EC02B1F /* SDImageCache.h */, - 98B1A8BD171C4B54346E5539A6ADD6BB /* SDImageCache.m */, - 6FE30B18657E66B3C35FB72276D701BC /* SDWebImageCompat.h */, - 239058FE08D4DC523E78BEAB1F7C4A1B /* SDWebImageCompat.m */, - CB9B68BB8F1BE464BBCEE628882E0E4D /* SDWebImageDecoder.h */, - C257988E7777B5456728B51FF16A46F3 /* SDWebImageDecoder.m */, - C1F7A828356422E68F1B923480C376CC /* SDWebImageDownloader.h */, - C8052BECC9F8243FA232F386E0FD5C7D /* SDWebImageDownloader.m */, - AF8E99EF3AF3777EB0C049A26DAC3540 /* SDWebImageDownloaderOperation.h */, - C15716B815131D615641B428CEC905B6 /* SDWebImageDownloaderOperation.m */, - A931BD93CF0462C69D3484B1A1B26CEE /* SDWebImageManager.h */, - 240BCAC7B580A7E259EA787FBD602F7E /* SDWebImageManager.m */, - 21AC9B17FB00F3A1C5B21B599D192340 /* SDWebImageOperation.h */, - 2D5BD7904F2823E0CBC00FD88D5FB3A8 /* SDWebImagePrefetcher.h */, - 08A9C1B648C161EF0F37B35F4C78AAFD /* SDWebImagePrefetcher.m */, - B3473487C4A41397AE46A1C71687C8CA /* UIButton+WebCache.h */, - 3E91B7A86A2A598221752FFF271FDDAB /* UIButton+WebCache.m */, - DBB096B7CC3837A70F84D8164E0865F2 /* UIImage+GIF.h */, - 36987C06B3A89FF24559FD5CCF12CA7B /* UIImage+GIF.m */, - 8B37F82FBCD2C7C3E0AFB366268E430D /* UIImage+MultiFormat.h */, - 2F2F05222313ACD72D4169968076AB6E /* UIImage+MultiFormat.m */, - 6F18192C071EE9D03A49150B2DB5D79E /* UIImageView+HighlightedWebCache.h */, - F57FBC0CC07E11A9B5E4207B5A683C10 /* UIImageView+HighlightedWebCache.m */, - 6C4AA37296DC371F60364CCA133BCD11 /* UIImageView+WebCache.h */, - 6A05B62AC97E8E1C6C77E3A21F43A25E /* UIImageView+WebCache.m */, - DF88779B8746883C828911769CE87E6B /* UIView+WebCacheOperation.h */, - 0B3C96C11CED65BD329589B420D76977 /* UIView+WebCacheOperation.m */, + AC0FF902594BF620DA9C7757098E23E7 /* libWeChatSDK.a */, ); - name = Core; + name = Frameworks; sourceTree = ""; }; - A7D0851C12C490E611E05A5EF3092756 /* FBRetainCycleDetector */ = { + 5D2CCDE2725B9FE97371395418D05A3C /* BATouchID */ = { isa = PBXGroup; children = ( - 05FA771F306FF9958CA14779311F5CA8 /* FBAssociationManager.h */, - 7B6C8A4888C7CF99D2AD9BCA9D9D5D72 /* FBAssociationManager.mm */, - 775735A621CBC5820368C236E79718F4 /* FBAssociationManager+Internal.h */, - 6D7DF41956ADE4579BFC3EBB6EC305C0 /* FBBlockInterface.h */, - BA757D006F9F117BF203FCEAC5D80865 /* FBBlockStrongLayout.h */, - 4A1F2D0F6A4D9EC760DD5A096444C814 /* FBBlockStrongLayout.m */, - C8CA8E1A02DA086416D760CE2790A36C /* FBBlockStrongRelationDetector.h */, - DEC231E8241338FFB497649DB24FE2E8 /* FBBlockStrongRelationDetector.m */, - 306EFD48787CB56175CEABCADFB7845F /* FBClassStrongLayout.h */, - 1536D708BA62C4FBB75AE4559672F451 /* FBClassStrongLayout.m */, - 2BBC1CB40AF9D3594A48E4A8CD6214EC /* FBClassStrongLayoutHelpers.h */, - 63D17970897F3D5A88BDE33EA9F6DDC5 /* FBClassStrongLayoutHelpers.m */, - 8B76BDFF0474131CBE95A81BF59E259C /* FBIvarReference.h */, - 3341EB532562B2DB29FD8C8F4CD3EE70 /* FBIvarReference.m */, - D2FBA2765D46BD755D28DB22C86AD06A /* FBNodeEnumerator.h */, - D7046318878BEB7205B99B6497830033 /* FBNodeEnumerator.mm */, - 588B42890A252D3930B71555B6E03222 /* FBObjectGraphConfiguration.h */, - B2DBE707C5E3DF45875D685CA382E542 /* FBObjectGraphConfiguration.m */, - 1D529033AB45964FD7D9E6344A09B042 /* FBObjectInStructReference.h */, - EB5020FF33CED698BEFD41A7EFDDD117 /* FBObjectInStructReference.m */, - 0CDF2C8E6691C4AE61AB9A4B979AC5C1 /* FBObjectiveCBlock.h */, - 3EB70E593734C4BCB70716363593F24A /* FBObjectiveCBlock.m */, - C7B87B4577CD61E350E3BBB244BD3FC3 /* FBObjectiveCGraphElement.h */, - 190B701B64C86FB6E111E5F5FCE11DD6 /* FBObjectiveCGraphElement.m */, - 5F7122E3FC7E1B4583ADA995A6F07103 /* FBObjectiveCGraphElement+Internal.h */, - 94CFF896F4E504B1F472DA414AE7B129 /* FBObjectiveCNSCFTimer.h */, - AF08524AB58959BC4E7EF7C1EFA593A1 /* FBObjectiveCNSCFTimer.mm */, - 0DBDB6CE6E9907AC6EB7BCB5D7235424 /* FBObjectiveCObject.h */, - 115B2A6E7D3261CB97A903E45849005A /* FBObjectiveCObject.m */, - 10861837646B6165DBB45F669524E11E /* FBObjectReference.h */, - 1CC80A118274F07BD6EC01FA6E973757 /* FBParsedStruct.h */, - 7A2D8406C9CB2B3A8BD0E36806BBF64D /* FBParsedStruct.m */, - 6DE39D822288FA6C2D9F7C07A9E9878B /* FBParsedType.h */, - 2306FA16E8BCBEACC4EB83A1B28A3999 /* FBParsedType.m */, - D8DDA95A028C77605EF2532B00BFD808 /* FBRetainCycleDetector.h */, - 826787965C74AE11FB4772C5ECF0F4A0 /* FBRetainCycleDetector.mm */, - 3FAD44AC34ABBD5CD2494949F2678403 /* FBRetainCycleDetector+Internal.h */, - 663231E19B99FD240BB15210ABDDA00A /* FBRetainCycleUtils.h */, - 427C4E63BCEF748D1C5BFCA32A273550 /* FBRetainCycleUtils.m */, - 94B4B1BE232BD6FB20C7D21E665C5256 /* FBStandardGraphEdgeFilters.h */, - 970C7F34BB8C96A56778E6BF049B56C0 /* FBStandardGraphEdgeFilters.mm */, - 0D8707A09C9830B7D11A15E765C803C0 /* FBStructEncodingParser.h */, - AC57B2B100D6A7427406C7B6007D7515 /* FBStructEncodingParser.mm */, - 1F3F941B3531A3103E0556EF2B2D2A3E /* fishhook.c */, - 8704C9169749B9511D62A5FA035BAF84 /* fishhook.h */, - 027D5A3F19A7F4E64E373262D8BA4F98 /* Support Files */, + 3936179AB8A2713262AFCC205E90BEFB /* BAKit_DeviceModel.h */, + FA0CD9E0881B11302F7A36689C66A353 /* BAKit_DeviceModel.m */, + 446129556223C2E74A8A7C30F8767C38 /* BAKit_TouchID.h */, + 763520CC236743BC9BFF34E1D68E25A9 /* BAKit_TouchID.m */, + D1DD67320E69D9D20A89276F401C56E4 /* BATouchID.h */, + 3ECC7E5B93C910A04170258B6418C473 /* Support Files */, + ); + name = BATouchID; + path = BATouchID; + sourceTree = ""; + }; + 5E17A7BF8005C9A6F7560A4201CD7EE4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6B4D40A557A83F29F5D05BEA1BD4B62E /* UShareUI.framework */, ); - path = FBRetainCycleDetector; + name = Frameworks; sourceTree = ""; }; - AC4A143682B3D3A67B054D86E0F4EB67 /* Support Files */ = { + 5E67FFDB37B084A5141D5632431313E1 /* Support Files */ = { isa = PBXGroup; children = ( - 8C5B5FD6E8E85386F12D5FC11C9400DC /* NullSafe.xcconfig */, - AC536104787A5DF8D85CE1F10C915B13 /* NullSafe-dummy.m */, - 33824E4290C85330F2018A765169A40A /* NullSafe-prefix.pch */, + A52CDB4442685E57F1B88305266C9F1D /* SDAutoLayout.xcconfig */, + 546019111ACE8E76036065AFB3F53AA2 /* SDAutoLayout-dummy.m */, + EE0C97E240B531A6F37F89D953DF2C6E /* SDAutoLayout-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/NullSafe"; + path = "../Target Support Files/SDAutoLayout"; + sourceTree = ""; + }; + 5FDC48B884D0238E27745C03F5F00E5E /* UI */ = { + isa = PBXGroup; + children = ( + 5E17A7BF8005C9A6F7560A4201CD7EE4 /* Frameworks */, + B06E4BC76DFCEB503EA0C6A8A79D462D /* Resources */, + ); + name = UI; + sourceTree = ""; + }; + 616FFE383E1F881C3ED5353C39ABF790 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D9490851F54406E0F550CD313F4E431C /* UMMobClick.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 62FCF2E43FBCD7EB925D38AF38B2349B /* NSURLSession */ = { + isa = PBXGroup; + children = ( + CBC8BFF0774593786090569F092D9445 /* AFHTTPSessionManager.h */, + 9EDC284BE3377646CD17FAE061ED3247 /* AFHTTPSessionManager.m */, + 63877C0FACAA04F453ABCFA0FA312457 /* AFURLSessionManager.h */, + B512CF401CD8E29A3BB1EB7A2E9F8845 /* AFURLSessionManager.m */, + ); + name = NSURLSession; + sourceTree = ""; + }; + 6E4CE3C40A317DF7DD6B1EAE95F32EAF /* Support Files */ = { + isa = PBXGroup; + children = ( + 7404FD9BABC3A7C4D989C68E8970534B /* IQKeyboardManager.xcconfig */, + B3E30AFC92FD0E60DBDBCC7A94871F41 /* IQKeyboardManager-dummy.m */, + 3A5583188F4271149CAAD3C89233F88C /* IQKeyboardManager-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/IQKeyboardManager"; + sourceTree = ""; + }; + 7003B6BE18AC3CA009336CFD929130FF /* QQ */ = { + isa = PBXGroup; + children = ( + D36FFD30C64B8D8F563B3EA0892178A5 /* Frameworks */, + 4C352D662CA230F719B90FD03AA673EF /* Resources */, + ); + name = QQ; + sourceTree = ""; + }; + 734363555468A91399E6C55839F2279F /* Security */ = { + isa = PBXGroup; + children = ( + F9C3C3742FB2223836D49DD1ED38C6FC /* AFSecurityPolicy.h */, + FCBB5DE174341BA6135245E17E2971E8 /* AFSecurityPolicy.m */, + ); + name = Security; sourceTree = ""; }; - B066B34B8EFACCC0645DCAC8140560CA /* no-arc */ = { + 79574F190DC4D52D9DB3350F69A832BC /* MLeaksFinder */ = { isa = PBXGroup; children = ( - 9E20EDCFC83C743D142C8E40E317192D /* NSObject+YYAddForARC.h */, - AFC38B21F8AC5CD8692451846AB1F457 /* NSObject+YYAddForARC.m */, - 5C88D0A5210200894B552B2AEBC1BF6E /* NSThread+YYAdd.h */, - 2B1F10FA77028B24266D2980E77086C3 /* NSThread+YYAdd.m */, + AA21FBCD7DE6349E8574FD56322B008D /* MLeakedObjectProxy.h */, + 6DC6768DB3E2C29BEDF0934C051A9C93 /* MLeakedObjectProxy.m */, + 1492A3B27727F16D62B40E22156D5C32 /* MLeaksFinder.h */, + C3A48DE1F908577C23BB69378BCC5B34 /* MLeaksMessenger.h */, + 8A63FE6C1793D8EFF15F5E6994CE398A /* MLeaksMessenger.m */, + B582A9AECE43FE5C81EFFD82CA7A616A /* NSObject+MemoryLeak.h */, + 3E34670B295AA51BA862050258AA92BD /* NSObject+MemoryLeak.m */, + 1179E94B52BD84B46398ED6142E3B82A /* UIApplication+MemoryLeak.h */, + 746473F717DB171103D115422967E42C /* UIApplication+MemoryLeak.m */, + 52B3045903EFF603FFF8BB5D38E69021 /* UINavigationController+MemoryLeak.h */, + C52DAC06DE562DF53E1DD173C42E2BE8 /* UINavigationController+MemoryLeak.m */, + A66B25BC253C896F3701A033C5533BDF /* UIPageViewController+MemoryLeak.h */, + AF9F5AF730E591D3AE4EAA7A33F3AF6F /* UIPageViewController+MemoryLeak.m */, + A5207C15A79E3C066E8F20D61B1F5F25 /* UISplitViewController+MemoryLeak.h */, + 076D040C504E8A4140502446CDC10DB9 /* UISplitViewController+MemoryLeak.m */, + BD23AE31E8BE741709F9E156462BBB9E /* UITabBarController+MemoryLeak.h */, + 897593CBCD4B76599686072FC18497B9 /* UITabBarController+MemoryLeak.m */, + 749131B0ED321E1314E55AF2D0E994B6 /* UITouch+MemoryLeak.h */, + AF62EA21CC88D14DD0F555F35FC03C75 /* UITouch+MemoryLeak.m */, + 0CC6FBD35F379E7B58572D0A35591949 /* UIView+MemoryLeak.h */, + 04793345358B92FB44E056157C1970B7 /* UIView+MemoryLeak.m */, + CE0941E28ED4E88FB4BA97BC1DEAF98E /* UIViewController+MemoryLeak.h */, + 63C82D656CCB8D762D41764A67CCB10A /* UIViewController+MemoryLeak.m */, + 2AA3CCFC2E4988CC9D0843C7BBD10361 /* Support Files */, ); - name = "no-arc"; + name = MLeaksFinder; + path = MLeaksFinder; sourceTree = ""; }; - B0F88E2DEA5EE6D7F525CB6AEAC2E773 /* FBAllocationTracker */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - F2E12AD898A18DB42AA23058D5988B26 /* FBAllocationTracker.h */, - 296AAB6BC23232567FEB2D3D75004296 /* FBAllocationTrackerDefines.h */, - 6F2940E20C7CA58D7F9055821B4681A8 /* FBAllocationTrackerFunctors.h */, - B11ADBFB315AA27808E3A1D00E776B3C /* FBAllocationTrackerGeneration.h */, - F5F829DA8589FDD6D38B3C73FF05BC97 /* FBAllocationTrackerGeneration.mm */, - D0D97445F8022139BB2546F1E114977E /* FBAllocationTrackerGenerationManager.h */, - B7B4A426B2E5B8AC2816131992C12FB4 /* FBAllocationTrackerGenerationManager.mm */, - 6F86546053615F891FF780D7C428F9FC /* FBAllocationTrackerHelpers.h */, - D9090FFFBCCA96A0D24052D1D2AAE64D /* FBAllocationTrackerImpl.h */, - 923A2546B5E5BFF17D052183DD1FCF59 /* FBAllocationTrackerImpl.mm */, - D39D80301ABB271A669B38688F34BCE2 /* FBAllocationTrackerManager.h */, - FC40B6EB9CFF5D58C6F1EB50C76FE1F8 /* FBAllocationTrackerManager.mm */, - 13875EC6C753C3AE6747B41E47EAC2B6 /* FBAllocationTrackerNSZombieSupport.h */, - 0E91F4A51FA8E49A4563BB19E2EB99E4 /* FBAllocationTrackerNSZombieSupport.mm */, - C634773DB7672C08216B7B3544CCD0E5 /* FBAllocationTrackerSummary.h */, - D19624A87A419359560798A1BB0B6F44 /* FBAllocationTrackerSummary.m */, - CB27C5CB59CE05E58883CB9D00227C59 /* NSObject+FBAllocationTracker.h */, - C34FAED3862A3782BE249E4245ECB502 /* NSObject+FBAllocationTracker.mm */, - 2E7F03381BF895589C84D2460EFD4948 /* Support Files */, - ); - path = FBAllocationTracker; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 24002A6670E6882ECD6250D3E60F9CB2 /* Frameworks */, + EAFA675C750AAADCB30CAF65A1A87D0D /* Pods */, + 27C349FC6F031915656B5008ECD231E0 /* Products */, + 3E90695702A038076ABA8B2B54EF7BFE /* Targets Support Files */, + ); sourceTree = ""; }; - B5A639464F9C083AE28EDC6048E2D3FD /* Resources */ = { + 7E121928FBA1B853A99A34418AB71EA5 /* Support Files */ = { isa = PBXGroup; children = ( - 433064D867F3A509FB5B78130B08FBC2 /* IQKeyboardManager.bundle */, + 6AF284593655C892B7FBC584208FC6B3 /* BAButton.xcconfig */, + 24CDB901D3BF0DF41F65D51C3D4044F5 /* BAButton-dummy.m */, + EE2A2D475EA9BC6D7A3D80C6DFDDFC5C /* BAButton-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/BAButton"; + sourceTree = ""; + }; + 83D2CE3987D7FF901E8FB169D451BD7E /* BAAlert */ = { + isa = PBXGroup; + children = ( + EF0AAF659293E8380276C4C74A26693F /* BAActionSheet.h */, + 8211444BEDDE5D0F1A36B11E6A9E7F46 /* BAActionSheet.m */, + 0C7280B0B01FE0A9FBD451F52A186927 /* BAActionSheetCell.h */, + FB680C7F5EF0A74DCB74CEBD2E362D46 /* BAActionSheetCell.m */, + 47266E4296E25F40182E8AD7DF4522AE /* BAAlert.h */, + 0C218F0977854B5EDF55A1F6B6982FC8 /* BAAlert.m */, + 74DEE764CFD162737CE8F57799646803 /* BAAlert_Config.h */, + 51D5A4EF37208CFAA5FC23E3F946D3D1 /* BAAlert_OC.h */, + 2083825C6B8994832ABD9EFAB9FCC63A /* CALayer+Animation.h */, + BD9BB92866B725B4FCC7F220A47F2786 /* CALayer+Animation.m */, + 3B2385D7B5C18A19D915E57BA43E582B /* Resources */, + 01F59D975F48833BE5139B9DB96FAC9A /* Support Files */, + ); + name = BAAlert; + path = BAAlert; + sourceTree = ""; + }; + 850B16A8823FE1D386F4ABEEE6088055 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0BB106A6CC8BDD9DD0F8D6872F238CAB /* libUMSocialLog.a */, + 819D80F6962C1B9787DC879384BFEABF /* UMSocialCore.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 86702041ACE8BD6EC24FF70E583D2A46 /* Support Files */ = { + isa = PBXGroup; + children = ( + B9D77A1C8ADF8EA8960EFF7B7EE025EC /* BAPickView.xcconfig */, + BCDD642BC626E7A6D32B29C8B851B877 /* BAPickView-dummy.m */, + 21681FB275626CAA88F463F258C4B899 /* BAPickView-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/BAPickView"; + sourceTree = ""; + }; + 8D6A65E57B8889ACBAF57DCAAE08E037 /* Resources */ = { + isa = PBXGroup; + children = ( + 2BAD3F8D84038EE76B97941D3610A983 /* MJRefresh.bundle */, ); name = Resources; sourceTree = ""; }; - B871EE9D3297F807D7A2F300C75DB309 /* Support Files */ = { + 8E5499967C2672F5969BD23873C15AA7 /* MJRefresh */ = { + isa = PBXGroup; + children = ( + 982C2F43360DD32C33C8AA7D5A72EC9A /* MJRefresh.h */, + E1E71F9D7C259E084C1EB5A9B55F4155 /* MJRefreshAutoFooter.h */, + 40C6B6E777043A326F2E22C407EBDE8C /* MJRefreshAutoFooter.m */, + 56A9A6A83273B2FD3199AD2E2A873124 /* MJRefreshAutoGifFooter.h */, + 7599DE7539EB395DB0996D54DFA9FB50 /* MJRefreshAutoGifFooter.m */, + D2FE91EA1F722AA810863F6BE215C71C /* MJRefreshAutoNormalFooter.h */, + 60EFCFF863A885BD3632C8E8830B78D1 /* MJRefreshAutoNormalFooter.m */, + 0C171B8EBC4570F91A890502853AC324 /* MJRefreshAutoStateFooter.h */, + 2EE494C85C760F5DE095C549F1D7EBE4 /* MJRefreshAutoStateFooter.m */, + 8587B77D25616B82EE6965223D5C7596 /* MJRefreshBackFooter.h */, + F251007383EE0D771424EE7E274C7C80 /* MJRefreshBackFooter.m */, + 6545DEC6111D42FBAEFB0AA974324C56 /* MJRefreshBackGifFooter.h */, + E74C48E55C9840886DA46DE722D075EE /* MJRefreshBackGifFooter.m */, + CA38384949F3798DAC4DF09171283418 /* MJRefreshBackNormalFooter.h */, + 140163F1818B2F9C79F22762ACEA471D /* MJRefreshBackNormalFooter.m */, + ED40B90F1D6C8B733F48574D41DED4EF /* MJRefreshBackStateFooter.h */, + 79DB9BCC449DA5BFF0A8074105F999C7 /* MJRefreshBackStateFooter.m */, + 2E3A29C80DB503CCE251A466BCC44B08 /* MJRefreshComponent.h */, + FDF3D63313115407B68DEBB369937128 /* MJRefreshComponent.m */, + 3862B80244844091269D5E663405D818 /* MJRefreshConst.h */, + 9863F1A5D31166CD96E194C4E439888B /* MJRefreshConst.m */, + A2A9ED566256428A8EE6CAB22BAC8A28 /* MJRefreshFooter.h */, + 08438849E50E3F8FD2D56E8806A7286A /* MJRefreshFooter.m */, + B7F3B31C23026CD61CE7E0CCAC6692EA /* MJRefreshGifHeader.h */, + 17D4AE42961F126BDC472E18A1F0E50C /* MJRefreshGifHeader.m */, + 4E0039B999EEC6CC2BDCD4171B8E22AE /* MJRefreshHeader.h */, + 469BD90248B96FC9B882C11BB007E913 /* MJRefreshHeader.m */, + 8494FA7602B009EC978E97801C051491 /* MJRefreshNormalHeader.h */, + 181A9D814CF3A91AF0A0F95586C6DDC9 /* MJRefreshNormalHeader.m */, + F29F7E71C1DD342C396D05EC998B0A2B /* MJRefreshStateHeader.h */, + 262DAED21B11543F7F53D8B04277FD98 /* MJRefreshStateHeader.m */, + 5C1FC93334980F256E0551501D88194C /* NSBundle+MJRefresh.h */, + 4DC0E904CAB22E6848C0F34024379088 /* NSBundle+MJRefresh.m */, + 208FDB098265597D2DCA112B563FB9DF /* UIScrollView+MJExtension.h */, + CBD5AD45F98AC4CDCE624F473F6EDE6A /* UIScrollView+MJExtension.m */, + 1190208B0B32FAAB0849AE6CE64A14F2 /* UIScrollView+MJRefresh.h */, + 8F3396B1101111F2E3244D6E74F99676 /* UIScrollView+MJRefresh.m */, + 9073C5E0EBACF5E0496567B2612BD7CD /* UIView+MJExtension.h */, + E7F5B97BDC24E97AE6E21DC0221419B4 /* UIView+MJExtension.m */, + 8D6A65E57B8889ACBAF57DCAAE08E037 /* Resources */, + A0749877AC6D40E097255773AB972526 /* Support Files */, + ); + name = MJRefresh; + path = MJRefresh; + sourceTree = ""; + }; + 9444544600F23E36FBF2132ACAEC91DD /* DZNEmptyDataSet */ = { + isa = PBXGroup; + children = ( + FD1B499B8DCCD01E993CD5C9B009C237 /* UIScrollView+EmptyDataSet.h */, + 87C396456C1DBF225EE521F037BC5DBD /* UIScrollView+EmptyDataSet.m */, + A43CAFA95EC62C6A932EC76DF750089C /* Support Files */, + ); + name = DZNEmptyDataSet; + path = DZNEmptyDataSet; + sourceTree = ""; + }; + 948501BDA18DED3BA4FFDAB79CDEEE79 /* Frameworks */ = { isa = PBXGroup; children = ( - 02AEDD35E2700E165B5CB89AA20E1873 /* BlocksKit.xcconfig */, - 9107142D5A508CE3517BC71013C652F8 /* BlocksKit-dummy.m */, - 98AC747293657DCADD5813E7316742A0 /* BlocksKit-prefix.pch */, + C80AB2A9B465DEB6A65841BCE3CE7D88 /* libSocialWeChat.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9A5E82EED0B120E8583C224E497A7CEB /* ReducedSina */ = { + isa = PBXGroup; + children = ( + B0451EB20856135E30D3FE1D974E8907 /* UMSocialSinaHandler.h */, + C34C957C0A6E82F87E25B9417DC58A0A /* Frameworks */, + ); + name = ReducedSina; + sourceTree = ""; + }; + 9FC5B9BCBEA0984869BE5AAA45AB4B63 /* AFNetworking */ = { + isa = PBXGroup; + children = ( + 9FB904632BF7635153EBB4B52094A8C7 /* AFNetworking.h */, + 62FCF2E43FBCD7EB925D38AF38B2349B /* NSURLSession */, + E2D0CABDD4E37E04BDDD77DE5FB421C3 /* Reachability */, + 734363555468A91399E6C55839F2279F /* Security */, + F959F6D8BD1ABAC70692712C47708E6A /* Serialization */, + 53FAD1AED3F5A95E6B6E7EDCC0369156 /* Support Files */, + A1036DD1E9BD22BCE198DA74AE57DD4C /* UIKit */, + ); + name = AFNetworking; + path = AFNetworking; + sourceTree = ""; + }; + A0749877AC6D40E097255773AB972526 /* Support Files */ = { + isa = PBXGroup; + children = ( + D6942A984722D6CFE2F9E9E4B3668EE9 /* MJRefresh.xcconfig */, + D6902DCE08C05000C58385292DC7EFAE /* MJRefresh-dummy.m */, + 41E6E2C06037B36FF12412138FCD1E39 /* MJRefresh-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/BlocksKit"; + path = "../Target Support Files/MJRefresh"; sourceTree = ""; }; - C244D84D9C34E06F53C59DCED050DECA /* DynamicDelegate */ = { + A1036DD1E9BD22BCE198DA74AE57DD4C /* UIKit */ = { isa = PBXGroup; children = ( - 76830DF4B5E1BC5088F6870CCDD79240 /* A2BlockInvocation.h */, - DEB50FEE8CDB249C45E029B81CA9A133 /* A2BlockInvocation.m */, - F3EF33ABB1B73B0A960D36421A6D411C /* A2DynamicDelegate.h */, - F20F416612C50E1062F61F7FAEA80685 /* A2DynamicDelegate.m */, - 74AD8C811C96DCEC6EF4EA0FEF7860D8 /* NSCache+BlocksKit.h */, - 4874BB789FAA3836C95529B0BBD4C341 /* NSCache+BlocksKit.m */, - D6382D11AA5824138CAA1CBDF864CC67 /* NSObject+A2BlockDelegate.h */, - C229C98F73ED9180ABD9E05D95D67C37 /* NSObject+A2BlockDelegate.m */, - 9424C0FAFC3EAD474CB870C47C481C80 /* NSObject+A2DynamicDelegate.h */, - 14147080BB4335069C2725DCDEBF7353 /* NSObject+A2DynamicDelegate.m */, - 8E6695B9B3C95B89F49A536147248151 /* NSURLConnection+BlocksKit.h */, - 5C1FC3666204DDB5FE1B4D6414F49B5B /* NSURLConnection+BlocksKit.m */, - ); - name = DynamicDelegate; + CC9BC32E321B69F4BA4FC25FE7439A35 /* AFAutoPurgingImageCache.h */, + 732854E296B1E6905139F93DCE039E40 /* AFAutoPurgingImageCache.m */, + 950937E9BA2BCBC2C1BD03E39A9D5A6E /* AFImageDownloader.h */, + 9F40D29E73B9F1D27F74FB5856BB9224 /* AFImageDownloader.m */, + 7362865ECCE7D08788DE8194F276AC64 /* AFNetworkActivityIndicatorManager.h */, + 47C1E96893C46BAD1077EA8460A077B2 /* AFNetworkActivityIndicatorManager.m */, + 9729CD39D764C290A8EFFAFC0616B9F1 /* UIActivityIndicatorView+AFNetworking.h */, + C6B4C5C280265CD3729319E0A4BA07DF /* UIActivityIndicatorView+AFNetworking.m */, + 2F20B78249762A98503F000C0866655F /* UIButton+AFNetworking.h */, + CCC4EB67AC152CDA932EEBC5F7378174 /* UIButton+AFNetworking.m */, + 51EE8FDC050865E076A0BC3230729216 /* UIImage+AFNetworking.h */, + FE90086D59C6A47C5E35451A6C43626E /* UIImageView+AFNetworking.h */, + FFD73BD50467F1415468F929775F98A0 /* UIImageView+AFNetworking.m */, + D6568FECDA701F3E6F731327E406ED63 /* UIKit+AFNetworking.h */, + ACF9FE0FEAB65AF880BEDF1731B98544 /* UIProgressView+AFNetworking.h */, + 6812CF2D70BAA638A95AE504ACEAEFE8 /* UIProgressView+AFNetworking.m */, + 6F261D7707DB64FD78317931AB4A9158 /* UIRefreshControl+AFNetworking.h */, + C297F809CF7A4C1E8C5362110E8DEB1C /* UIRefreshControl+AFNetworking.m */, + ADA404D82C8CD1AFEA1294AE6183FEE7 /* UIWebView+AFNetworking.h */, + 2200695DDD89F6C936EB06E5AFF20767 /* UIWebView+AFNetworking.m */, + ); + name = UIKit; sourceTree = ""; }; - C615EDCE33600E6F127FAD1FBE4FE2D2 /* Core */ = { + A2CC5987957BC9497497D04A5A33F896 /* Support Files */ = { isa = PBXGroup; children = ( - D5E91893A2BA596C95A6A8AC13D5C898 /* BKMacros.h */, - B0330E05680263E7BD2051C65FF1A3C8 /* BlocksKit.h */, - 8F192F3381307CF70B3205D104DF44C6 /* NSArray+BlocksKit.h */, - CD40C7CA088D9BDF9F2B7F1CC9B7B950 /* NSArray+BlocksKit.m */, - 0D1A145F7BF21BEEBDF4B14411B28DF9 /* NSDictionary+BlocksKit.h */, - F308182CA3866179A7F1ADF881957B40 /* NSDictionary+BlocksKit.m */, - 06CB2811BB4F04F971944D0C865DFBBA /* NSIndexSet+BlocksKit.h */, - E5EBF7E78D49012DAE5811432FC529ED /* NSIndexSet+BlocksKit.m */, - 99F4E6FE6699D8C9B460C64255BB9171 /* NSInvocation+BlocksKit.h */, - 24170A9015D9E86DE54E9BE4372EA733 /* NSInvocation+BlocksKit.m */, - 94A7759DD55D96042DD24572E5A81971 /* NSMutableArray+BlocksKit.h */, - 53217886BF1EFC1274DA0DEE919C912A /* NSMutableArray+BlocksKit.m */, - 1A8AA9EC4B02527D28DCFEBB728167B0 /* NSMutableDictionary+BlocksKit.h */, - CF393313A8743E1B447081AD31CDC2F2 /* NSMutableDictionary+BlocksKit.m */, - 06EFFBACB25D467EA1669A58905F61F7 /* NSMutableIndexSet+BlocksKit.h */, - F8131B2692E436306CEFF69EE2C8B173 /* NSMutableIndexSet+BlocksKit.m */, - 717D3F204D359F39F1BC887FAADFA8BE /* NSMutableOrderedSet+BlocksKit.h */, - 74957E39F41DFB9618340045D1FEC5A3 /* NSMutableOrderedSet+BlocksKit.m */, - 431D3C2E9513FB79D81D480A2F281CDA /* NSMutableSet+BlocksKit.h */, - A798DD4208A1EC6F17C95D9F282DF3D6 /* NSMutableSet+BlocksKit.m */, - E2DA34D963312173C67C4B7D5132546C /* NSObject+BKAssociatedObjects.h */, - 11A16B98132C5D6DA4AA8582B1B02FC9 /* NSObject+BKAssociatedObjects.m */, - 045BD462AE8370C34E44BF30A02B2CAF /* NSObject+BKBlockExecution.h */, - 67462AA0A44CCE1BA60300302B461C07 /* NSObject+BKBlockExecution.m */, - C9A068E3F0B4EB2C414B9E08CBA0725B /* NSObject+BKBlockObservation.h */, - 3F0E3F14042F7F714B53546F93428CE8 /* NSObject+BKBlockObservation.m */, - EBEBBAE1D7591EDAC9B55F67C9DFC01C /* NSOrderedSet+BlocksKit.h */, - B150A31B862AE24722F4DA3C4436F3BF /* NSOrderedSet+BlocksKit.m */, - EEBF868F328C3579C273A0D79731FFC0 /* NSSet+BlocksKit.h */, - FFE92269E9A9E5678E46A33078FD57E4 /* NSSet+BlocksKit.m */, - 21D76735A5DB5818F895943389FDB776 /* NSTimer+BlocksKit.h */, - 2734F98AAA6AD94C522DF97253A97BC1 /* NSTimer+BlocksKit.m */, + 0F56087B0D929D2319DBF8C9C05F1B1C /* MJExtension.xcconfig */, + 4E1C889AF5CEC7E1AA2DFCAF565C3BB7 /* MJExtension-dummy.m */, + 9BA261E2B739D01BAF9E02778ED97209 /* MJExtension-prefix.pch */, ); - name = Core; + name = "Support Files"; + path = "../Target Support Files/MJExtension"; sourceTree = ""; }; - C8A7FFEF0679ABCAA54393074DAA6F72 /* Masonry */ = { + A43CAFA95EC62C6A932EC76DF750089C /* Support Files */ = { isa = PBXGroup; children = ( - 5E70FFDE2DFDD27F3F2D9EB717EFE9C6 /* MASCompositeConstraint.h */, - 1A8DF7FF8EC5D172FF04CA442C9A51AA /* MASCompositeConstraint.m */, - 457D815EB7A0C4D04D170072A869F018 /* MASConstraint.h */, - 5CBC0BE73FC27649007FC579ADC89F24 /* MASConstraint.m */, - 3F0AC202A950F26A1DA6E90840A573AD /* MASConstraint+Private.h */, - D4194C483B9B9A7F6849BF0E12A25E92 /* MASConstraintMaker.h */, - FF30ACFCC15DB78867B78EE625B52241 /* MASConstraintMaker.m */, - FC67C181B5D05CE69749F162D42CEF79 /* MASLayoutConstraint.h */, - 04EA5B17C9CF37400057DC8398F858C1 /* MASLayoutConstraint.m */, - BCB0278A80BB796B0BBB05797970ADCF /* Masonry.h */, - B3AB8F9CF26BD99D2E66C0F125D2F592 /* MASUtilities.h */, - 8242AFF25B2FC27DB1504F6D7D610492 /* MASViewAttribute.h */, - 6AF1D417786A18366C0E840779866704 /* MASViewAttribute.m */, - 8AB281AF7F097B86A46F7B8536C2EA38 /* MASViewConstraint.h */, - D6651B1A1A3DE36DF389E74039694E4A /* MASViewConstraint.m */, - 64D21B35395ACCE01347F2543C93E17E /* NSArray+MASAdditions.h */, - 4B19B061E6991FFEA9EF9967D21F0699 /* NSArray+MASAdditions.m */, - A1DC28745B38F032A8EF3DA2189C6AA3 /* NSArray+MASShorthandAdditions.h */, - EEBC201545F6D08325C07BEFE95ED729 /* NSLayoutConstraint+MASDebugAdditions.h */, - DB7B7F8B9D09D708552B8FF85D1D7AD0 /* NSLayoutConstraint+MASDebugAdditions.m */, - 8D2DE91AD22A519E77A093C40560B2FC /* View+MASAdditions.h */, - 045B1B3BFAD9FB6E53AB094CF7B96EB7 /* View+MASAdditions.m */, - CEEB45EDCFC9B270BCFE032A7AE81E84 /* View+MASShorthandAdditions.h */, - 4FF8CF30A052EE5A10BD71D80CE6DC20 /* ViewController+MASAdditions.h */, - 22048D6B92A7AAC7BA16C72241C1CB30 /* ViewController+MASAdditions.m */, - CB4979B9EB7042C2E31CCEE52AAB5837 /* Support Files */, + 616AA544CB59F83B5C4BF3AA454C4AF9 /* DZNEmptyDataSet.xcconfig */, + 2863BAA55E29DA6ABAE6B5B3D15A2C68 /* DZNEmptyDataSet-dummy.m */, + A183E5E9716152AC99873D8CD62087B3 /* DZNEmptyDataSet-prefix.pch */, ); - path = Masonry; + name = "Support Files"; + path = "../Target Support Files/DZNEmptyDataSet"; sourceTree = ""; }; - CB4979B9EB7042C2E31CCEE52AAB5837 /* Support Files */ = { + AAEB4A10424758F1B44A14409C681A42 /* WeChat */ = { isa = PBXGroup; children = ( - 073F5B5E980E9A9C18CFA123714CFE6A /* Masonry.xcconfig */, - 71AEFDF38D5BE23F3414414534BC43A0 /* Masonry-dummy.m */, - D586E48D6140F434735ECC61B950C26E /* Masonry-prefix.pch */, + E63B5058F296F2BADE7AF7F881D2A5A7 /* WechatAuthSDK.h */, + DE4CD48C05C643B0431363B88957C07D /* WXApi.h */, + 5F95358F4A1161C22A88708730F249D4 /* WXApiObject.h */, + 5AF07974CDD64F87387AC6A1FD11CF92 /* Frameworks */, + ); + name = WeChat; + sourceTree = ""; + }; + AB0854D85551AEBB1D5C16F495637F4D /* FMDB */ = { + isa = PBXGroup; + children = ( + CFFB6BFED582FCC918D32EAC91A78AC4 /* standard */, + BF20836DF1C138168F3A11BFFD9F6EE4 /* Support Files */, + ); + name = FMDB; + path = FMDB; + sourceTree = ""; + }; + AF1A798F7E8EFD20D49070FEC16D0D0A /* Resources */ = { + isa = PBXGroup; + children = ( + 5D5D1B65405EBEF3CFFAB2132F25AEE9 /* WeiboSDK.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + AF2D90B415F6F71E05718C673683E736 /* BAButton */ = { + isa = PBXGroup; + children = ( + B497BB618F3B51903EAE4EED74A3E099 /* BAButton.h */, + 2C16930F8B76EE6F0FD5EEB16B3556A9 /* UIButton+BACountDown.h */, + 9E56F2D1869810C7515227FB09A525D2 /* UIButton+BACountDown.m */, + A3A101DD4AEF30ADDC844AAA3846DD39 /* UIButton+BAKit.h */, + 95E1DFAE51D038FC0CAE0D81305B130C /* UIButton+BAKit.m */, + 11F59FF048F0B1369B44D5B6C92A7493 /* UIButton+BAState.h */, + ABDA2A0C416650E9A3218E82CDB26E1A /* UIButton+BAState.m */, + 05EC1B6C2F312B2D2EB67385A82ADF09 /* UIView+BARectCorner.h */, + 2299D7AFEC8BF49333908E31B028ACA9 /* UIView+BARectCorner.m */, + 7E121928FBA1B853A99A34418AB71EA5 /* Support Files */, + ); + name = BAButton; + path = BAButton; + sourceTree = ""; + }; + B06E4BC76DFCEB503EA0C6A8A79D462D /* Resources */ = { + isa = PBXGroup; + children = ( + EC22AED41E78032182E018DD30D3CD1B /* UMSocialSDKResources.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + B1EC2F4BEBF3B4366A297050D9F89577 /* SDAutoLayout */ = { + isa = PBXGroup; + children = ( + 7DC6BD0551CDD697D319D154721BD26F /* SDAutoLayout.h */, + 8FAD3EAA8397C4E7B02110BABD7E001E /* UITableView+SDAutoTableViewCellHeight.h */, + 049E6E6A18DCD858AF95F4641D01F9A7 /* UITableView+SDAutoTableViewCellHeight.m */, + 19DAA63A9C4F018362642CA2E4E33C93 /* UIView+SDAutoLayout.h */, + 03942C96840284EA7A4A42306EEA4657 /* UIView+SDAutoLayout.m */, + 5E67FFDB37B084A5141D5632431313E1 /* Support Files */, + ); + name = SDAutoLayout; + path = SDAutoLayout; + sourceTree = ""; + }; + B438AA15C35CADB53D7536CE21B943C4 /* UMengAnalytics-NO-IDFA */ = { + isa = PBXGroup; + children = ( + 616FFE383E1F881C3ED5353C39ABF790 /* Frameworks */, + ); + name = "UMengAnalytics-NO-IDFA"; + path = "UMengAnalytics-NO-IDFA"; + sourceTree = ""; + }; + B91A49B72A0FE025CB83F5A5F372CBF1 /* Social */ = { + isa = PBXGroup; + children = ( + 47538F345FB35EF54EE22AE150E226AF /* AlipayShare */, + 7003B6BE18AC3CA009336CFD929130FF /* QQ */, + 487F09620FF4BE3BE44933B360933FB5 /* ReducedQQ */, + 9A5E82EED0B120E8583C224E497A7CEB /* ReducedSina */, + 0F0AAC89E186C2345BE11E0E9EA01E9A /* ReducedWeChat */, + 50001ADEDEBE8D408D2625A07341DE83 /* Sina */, + AAEB4A10424758F1B44A14409C681A42 /* WeChat */, + ); + name = Social; + sourceTree = ""; + }; + B9DCD6147CBC035910ABBE845D6483E6 /* Support Files */ = { + isa = PBXGroup; + children = ( + 6A619FCF79752BC0D90C35E5AC4F2AF0 /* ReactiveObjC.xcconfig */, + 3BC46F9CF2F9DD86B27771B482AA01E4 /* ReactiveObjC-dummy.m */, + 104A9990DF39FBBDFE9CE6E9F7260A0D /* ReactiveObjC-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/Masonry"; + path = "../Target Support Files/ReactiveObjC"; sourceTree = ""; }; - CD2EBF8D0A9FB295CA7415CE5A63BA6C /* Serialization */ = { + BF20836DF1C138168F3A11BFFD9F6EE4 /* Support Files */ = { isa = PBXGroup; children = ( - 4F5558DDA0210B74435B1D0814999FFB /* AFURLRequestSerialization.h */, - D36BB1BCC8E2F29B9B000C894EDBEBDF /* AFURLRequestSerialization.m */, - 5BE7781AE8DE7FDCC3C805497BAB3DC1 /* AFURLResponseSerialization.h */, - 0D9871D9D77A455E39AE9B6497639C0A /* AFURLResponseSerialization.m */, + 3BEDD5BAE75C2F69070518B977228435 /* FMDB.xcconfig */, + A0F3A0AA32EA21154905701BE733FF2F /* FMDB-dummy.m */, + 3D00313D1E5CE9B1AFE409079491E15E /* FMDB-prefix.pch */, ); - name = Serialization; + name = "Support Files"; + path = "../Target Support Files/FMDB"; sourceTree = ""; }; - D0FB24469D730F87FD0942DE89DBDEFC /* SDWebImage */ = { + C34C957C0A6E82F87E25B9417DC58A0A /* Frameworks */ = { isa = PBXGroup; children = ( - A377D5AC4BB6A6FD1AC5831558A76752 /* Core */, - 98B5741DDBA3C2E514D0E93EC11E67ED /* Support Files */, + 9110FDB20B06A0A2EA84A9A8FF75D449 /* libSocialSina.a */, ); - path = SDWebImage; + name = Frameworks; + sourceTree = ""; + }; + C44AEEBCDB26C94FC218F0E59CC62CE0 /* Support Files */ = { + isa = PBXGroup; + children = ( + F149A61901C3091F204FAD2C10BDC48F /* BATextView.xcconfig */, + 0F6C6D89C07CEA51DF629F9A3BBB7151 /* BATextView-dummy.m */, + 9FBA2561EA2DC090499096D5B71CC38D /* BATextView-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/BATextView"; sourceTree = ""; }; - D416EA197E58E9E3DDF11883AF4B588A /* YYKit */ = { + C7891ED54A12D749B583059BD695A42A /* ReactiveObjC */ = { isa = PBXGroup; children = ( - AD7AC596E39B564718102D8BF7BFE787 /* _YYWebImageSetter.h */, - 67843B4AFB717DC19EE388507E0E90EA /* _YYWebImageSetter.m */, - A74F767F8BEE2C2006AA63DB75092641 /* CALayer+YYAdd.h */, - E9A29391645458A5ACF59762C0A9846D /* CALayer+YYAdd.m */, - AE830205054F9829AE63DDB1BBE18D5B /* CALayer+YYWebImage.h */, - 80E6E508E14B96347CA93307FBBF80F5 /* CALayer+YYWebImage.m */, - 59878695D49E5889A941D92A41356AA7 /* MKAnnotationView+YYWebImage.h */, - 5AACE5A7DD6A6254087729150B530CF0 /* MKAnnotationView+YYWebImage.m */, - 212128327832554EB3EF692C63CFF0D9 /* NSArray+YYAdd.h */, - A4FCB4C2BC1481601FCE9EBC2346A5D2 /* NSArray+YYAdd.m */, - 74C4A1127781E55DA1D650FBD3FC5F42 /* NSAttributedString+YYText.h */, - 70F7172C3EF8307CDCECBFB57DB8FBC8 /* NSAttributedString+YYText.m */, - 5FD0CC0BD84DBBB4B7AC6B3BBFE39221 /* NSBundle+YYAdd.h */, - 43CA673B91BB7FC580CFCD62E50E96B6 /* NSBundle+YYAdd.m */, - 5F8FDDEE8AB41BCED3B7BF039D602C67 /* NSData+YYAdd.h */, - 021D7653569CC866FFB0466BCA813293 /* NSData+YYAdd.m */, - 8AA6FD772C40D71000A74E09ACC3BCB1 /* NSDate+YYAdd.h */, - 857C64E85EF33EB0C0DDB7CF9DA86EEB /* NSDate+YYAdd.m */, - D7A3CE6D39FF34F83D9FCAFC0873C9B8 /* NSDictionary+YYAdd.h */, - 3B94301757733934C689F550ECF08CF6 /* NSDictionary+YYAdd.m */, - FBC760B71BAB9E92475C9FAC61EDC721 /* NSKeyedUnarchiver+YYAdd.h */, - 3A0E59635DA14A595558ECCF4F8E2107 /* NSKeyedUnarchiver+YYAdd.m */, - 0E180D9F1A9A25F97404D8541CC6C050 /* NSNotificationCenter+YYAdd.h */, - E565DFF66A43EADBF8073D60C1EAF199 /* NSNotificationCenter+YYAdd.m */, - F0DC07796E1AD29178646F4F82583274 /* NSNumber+YYAdd.h */, - DF66E7154C36ACA86C68678E421495A1 /* NSNumber+YYAdd.m */, - C37B7F22AFE1647883020BCDF6012FA8 /* NSObject+YYAdd.h */, - 51F42359B30E5D1CF37A746186E26702 /* NSObject+YYAdd.m */, - 8839C0CD56C3B30D8E1A8127160276BC /* NSObject+YYAddForKVO.h */, - AEE3936E2FB477E0BF1B39FF87149676 /* NSObject+YYAddForKVO.m */, - 58C80B2149739C468CEF90F235DD79DA /* NSObject+YYModel.h */, - A39BD32D19E2AABD049C78C03E2C61AD /* NSObject+YYModel.m */, - B565FEFE249C5B7001CAD58462E908FD /* NSParagraphStyle+YYText.h */, - 80282B48EA9DC88F386E733783F1476C /* NSParagraphStyle+YYText.m */, - E30A9675183BB486BE625AA6316E7721 /* NSString+YYAdd.h */, - 2335EA7D63C6C56C8E8566673A553CD5 /* NSString+YYAdd.m */, - 68AC8F4C9B4382DED3A74EE06211EDD2 /* NSTimer+YYAdd.h */, - BEA3A528065576E57A614BD00E63B0B6 /* NSTimer+YYAdd.m */, - 860442C37308B9FF41C8CE2917F66F82 /* UIApplication+YYAdd.h */, - 85EB35C3772EA46EB9FB7F38672CF542 /* UIApplication+YYAdd.m */, - FF0A3E7F0A0BF10010B764FC479A21A2 /* UIBarButtonItem+YYAdd.h */, - 06B3B0EFF24A7FAE0352F8DAADF181C5 /* UIBarButtonItem+YYAdd.m */, - 334E3B593423E2F39054E938A0EA6BC5 /* UIBezierPath+YYAdd.h */, - 7564C59377A383BAC298FE2550F26887 /* UIBezierPath+YYAdd.m */, - 383D930024C4C0FF2B4F1A76A1E18DD0 /* UIButton+YYWebImage.h */, - C15310E8D8C1B44B7E9E994B8B65BCC8 /* UIButton+YYWebImage.m */, - 0779A06752EDCA53A44D9E5761F5CE33 /* UIColor+YYAdd.h */, - 2D5DAE318AD8143C9223D4EA52676CC6 /* UIColor+YYAdd.m */, - 87F164C0C76BEAD58EDE33382298F4C6 /* UIControl+YYAdd.h */, - B3DC6E2CDDB6A0ED9D70A1E1FC52E6E8 /* UIControl+YYAdd.m */, - 123651602FAA4DA2081110D97FEEA79A /* UIDevice+YYAdd.h */, - EED9B0E5C27AF17F07BE6DA6FD2F4334 /* UIDevice+YYAdd.m */, - 5AFDC3BC9CF02334CDE8A19341D0A38B /* UIFont+YYAdd.h */, - 0FC27882CB649FBB08F7A410B2466759 /* UIFont+YYAdd.m */, - 2A487A7BF3CA3F7B5DDBE294BB353222 /* UIGestureRecognizer+YYAdd.h */, - 9A03F24619F5E0512F446C207336C0F3 /* UIGestureRecognizer+YYAdd.m */, - BC3BD023E4995C3ED0207C16D4143987 /* UIImage+YYAdd.h */, - E1817E153C3792A869175BA950DCCB82 /* UIImage+YYAdd.m */, - C03A7DC96A2CCC5E2613375220631545 /* UIImageView+YYWebImage.h */, - A54A50C110187F79FD991356ED5487DB /* UIImageView+YYWebImage.m */, - 4CBFBDB249D7D9EFFC39DC7E6BA02F93 /* UIPasteboard+YYText.h */, - 7B4E044D2F5F2C391F1DF56FB7519D30 /* UIPasteboard+YYText.m */, - 6059752CFBA687BB6603A3947ED34A49 /* UIScreen+YYAdd.h */, - EB720667DA3FF657F2496806E4147791 /* UIScreen+YYAdd.m */, - 4053875D218BD287F8F5AC013633D8BB /* UIScrollView+YYAdd.h */, - 6D1F907ABCD484D40F988C657E03F0B0 /* UIScrollView+YYAdd.m */, - 58F62B9290AE378B5F235AA7C7FE6253 /* UITableView+YYAdd.h */, - 7235BB3AF5AB53B92A66FA087FB37CDC /* UITableView+YYAdd.m */, - C345502A75CBE61E001D30BA161E4977 /* UITextField+YYAdd.h */, - 7475E787A556032F3057053E1D0C3B45 /* UITextField+YYAdd.m */, - E13097D81D2A6053B27C37D5D3D1EA12 /* UIView+YYAdd.h */, - 08F2148EFBE4600C8932C38185B02BCD /* UIView+YYAdd.m */, - FF13BCD801E95E62A3F277D7FEBD559B /* YYAnimatedImageView.h */, - 47C4406700A7F5EA5906CC95ED50528B /* YYAnimatedImageView.m */, - C46E09036F368F42F2C7107327BD1A63 /* YYAsyncLayer.h */, - F83D22C26E9610A1D078B3934D89B715 /* YYAsyncLayer.m */, - F92F262092D9E79A704AA51E0E19D16C /* YYCache.h */, - 17588397F6D4A64CA58F2537E7ABAFD1 /* YYCache.m */, - BCEE999CC8EC152F56361B5BAFE47F3C /* YYCGUtilities.h */, - BC085BF6717CD4E4463D582419A87D01 /* YYCGUtilities.m */, - A40A365166264C987FEABDD1E3BAEC0B /* YYClassInfo.h */, - 4D9F08CF4924E1EC00C67FF070B8E575 /* YYClassInfo.m */, - C96F315F04D21365016B40114DD1AAA5 /* YYDiskCache.h */, - 6F170CD1EEF56260FDAFCAEF342C3FD8 /* YYDiskCache.m */, - 24F6496E988D11AC33FDBCC2280A3915 /* YYDispatchQueuePool.h */, - 2622C1589AC4B916248C215E1DE4F482 /* YYDispatchQueuePool.m */, - A4CEAB9557E666683D46A81804C7EE08 /* YYFileHash.h */, - 75D3ADDCC531A28A9490F845BC3E94BE /* YYFileHash.m */, - 9C5E7C8B7FEB277772CD5DB310738395 /* YYFrameImage.h */, - B7F5B0DC517DA77731F27DAA68895507 /* YYFrameImage.m */, - 3E9A2F12DD6EFC4953AEEC39439F1612 /* YYGestureRecognizer.h */, - 92F23CB6F24D0FE317530DD0838A393F /* YYGestureRecognizer.m */, - B6C0794E2599D34D259A975905CCFCF2 /* YYImage.h */, - 5D9C07C6CC62412A69CE26A6F6E4B96C /* YYImage.m */, - 7FF9EAD699F096BFB75E1AA6B54A670B /* YYImageCache.h */, - 11992BBAA6234C5C16A552FBB9F7F876 /* YYImageCache.m */, - 0FBBC51E0CED18446A85031065F30E45 /* YYImageCoder.h */, - DFA5E3502B4CBD9332D644FB4C689A6B /* YYImageCoder.m */, - D99E1BDC316954C3C939D857AC5E059E /* YYKeychain.h */, - E8506E36A4E57A364CA6A968BDAEBD5C /* YYKeychain.m */, - 8EAFE6CCB7BAD0352093AF27365BAE8F /* YYKit.h */, - 89EE531FEBACAC381FBD105FAC596020 /* YYKitMacro.h */, - 03C137D5082E643CFA81434C69F92836 /* YYKVStorage.h */, - E9F2FFEE4EDC1FAFA1DEF9F606B16B9A /* YYKVStorage.m */, - 8B8615E890C3DDBA5C376AEDEBD92771 /* YYLabel.h */, - F2A77BF6A316546884477C33D437F1BC /* YYLabel.m */, - 926D0824BBAF28B0096FAEDF16DEC917 /* YYMemoryCache.h */, - 206236CB4A6654F0196C1EFE84EB082F /* YYMemoryCache.m */, - B7912B79A365C76B319EC9369A73DDE1 /* YYReachability.h */, - 9E806678D5FD53BEA412FB4EAB3A26FA /* YYReachability.m */, - EA1AA8DE0CB6CF581C4AAB03370A94B2 /* YYSentinel.h */, - 95AD9C8E76E8D9A174F7FEA1000355D7 /* YYSentinel.m */, - D02EC07EA217DE294D925375F8246D0F /* YYSpriteSheetImage.h */, - A98AC12EE6CEE54D6BAC7E7886561B51 /* YYSpriteSheetImage.m */, - 1EA62A528C7657C71E0061470BE57494 /* YYTextArchiver.h */, - 5F397BC56CCE8556249B7D6CC1D44D0B /* YYTextArchiver.m */, - C4F00B3AB84CA628F09D6C85C8278267 /* YYTextAttribute.h */, - EE9890BBAC64710822418EC5F409CC58 /* YYTextAttribute.m */, - 9014ACEC790E3A7FC3319498B0DA3286 /* YYTextContainerView.h */, - 14BC1466655A68388C78CFDE48B538FA /* YYTextContainerView.m */, - 573302A94962ECEDB4BEE8F6031FF022 /* YYTextDebugOption.h */, - 958A71E7B0AE9F777DE7B830F9DC4E78 /* YYTextDebugOption.m */, - 6DC3F53442B1FFA6CAD55135898D46AF /* YYTextEffectWindow.h */, - F56D1B6C10D1F13D6A18CDFE635F3060 /* YYTextEffectWindow.m */, - 24525023577B19B37EC310F07C3BB51F /* YYTextInput.h */, - 118B6B045D782063BC5F00DEA30235A8 /* YYTextInput.m */, - C9861C770CEF1C5AD1070AD4AE9A137D /* YYTextKeyboardManager.h */, - FAF753E3DD88A67E407F6BA30B598501 /* YYTextKeyboardManager.m */, - 28731D9959E7A20012FF5C4353093F87 /* YYTextLayout.h */, - F339944D1DE1DBBC3531925D7096318F /* YYTextLayout.m */, - C57DC4863CC2D833D32F6CBEDCC968FB /* YYTextLine.h */, - 1E3CA1F67A4D03CE610B7031A635C2C0 /* YYTextLine.m */, - C0896B8206ACB730E0FEAC6A1A8DEE3F /* YYTextMagnifier.h */, - 31648AC9A55E2A176D9FAA4999CE5934 /* YYTextMagnifier.m */, - 53A8B65DEBA1EB2DACE25C3B0B365282 /* YYTextParser.h */, - B3433531173ED396C780AB47996B4618 /* YYTextParser.m */, - 0ADCEF6352BC832F0E4F53F85511C0DB /* YYTextRubyAnnotation.h */, - 649F7DDCB818BF768FAC670A8EB3E5DA /* YYTextRubyAnnotation.m */, - E2731F4D7BD3F9247B4761D28F321760 /* YYTextRunDelegate.h */, - D0B6487B47F46E9A4257FFE2D6764ABA /* YYTextRunDelegate.m */, - 73F9BFB28425EEF9A9B802D984362569 /* YYTextSelectionView.h */, - 6D0B04B18C889689677E529A528E73DD /* YYTextSelectionView.m */, - 7981A958E01F7C1D3E1D4F9B157700BA /* YYTextUtilities.h */, - 7E9DC50517CE63365DD9C4AD3D4628FF /* YYTextUtilities.m */, - 30B7AB42C85DE96933B805F6321E27B4 /* YYTextView.h */, - 998A73EF5B4DE379B44CE605DB3BF0A5 /* YYTextView.m */, - 46146AFA7B79C99D3F78D01909369053 /* YYThreadSafeArray.h */, - 700C3083A6BBF19EF6D5F2E9AB4741ED /* YYThreadSafeArray.m */, - 9AEA72FD754A2831F570E82ED44CCD4A /* YYThreadSafeDictionary.h */, - 3BC34FD5385E64670B47F6C9487AAA04 /* YYThreadSafeDictionary.m */, - 46B0E4EFC158C3C0E278033155A6B5AC /* YYTimer.h */, - 1EFBF9A13077655D3157F4AEB2F2FFC0 /* YYTimer.m */, - 24E9F4392DC7217FD6A66AE4DC043C0F /* YYTransaction.h */, - AB7DD34411EF9F2646DED7CB5B79ECED /* YYTransaction.m */, - 2ED17C84D4CF51DA801BF6FD9CE2BC7A /* YYWeakProxy.h */, - E69CB91A5BAE7E61ADE8A4E67875226A /* YYWeakProxy.m */, - 6A867079605A7949AA380F14868603CB /* YYWebImageManager.h */, - 002DED8FD032353B0D7F5E1F3F688940 /* YYWebImageManager.m */, - 71A8121E9635F0DF135166A778D5A0A0 /* YYWebImageOperation.h */, - 9ECFA1810737E35C9AEEFF67ED89C751 /* YYWebImageOperation.m */, - 31354D5351A9790CC4EFF700A8B1E6D6 /* Frameworks */, - B066B34B8EFACCC0645DCAC8140560CA /* no-arc */, - 8C6CD012FC7053DC7FDFF9F9F742EC18 /* Support Files */, - ); - path = YYKit; + 3C7EF70F5DB7EA91726A7AC19A9C10AE /* MKAnnotationView+RACSignalSupport.h */, + 16773082991510BF8EBD7D23221AECDB /* MKAnnotationView+RACSignalSupport.m */, + 501F7246348435E06E306B3F2556F176 /* NSArray+RACSequenceAdditions.h */, + 281158B539A4F14DB261C2E7607CBB6B /* NSArray+RACSequenceAdditions.m */, + C330ACCC3FFEF14A1148DC10375C00F8 /* NSData+RACSupport.h */, + 05278141D1D36FB932B136CA7F3D7DAE /* NSData+RACSupport.m */, + 9A7EB0ED4BFC39E91AEC092305D00CC4 /* NSDictionary+RACSequenceAdditions.h */, + 3DD19D489968E7AF69DB54F0337C36A8 /* NSDictionary+RACSequenceAdditions.m */, + 40087F240505956876B1EE3C618953BC /* NSEnumerator+RACSequenceAdditions.h */, + 3AFA8912D8C5109C85FDC65E360B238B /* NSEnumerator+RACSequenceAdditions.m */, + 963D9B5691C4810E959EDAB45BD9784B /* NSFileHandle+RACSupport.h */, + 1702A2065D3C3D9EE8FE7982D31343C6 /* NSFileHandle+RACSupport.m */, + 221F3D0762DC4E834B21AE69B07584EF /* NSIndexSet+RACSequenceAdditions.h */, + A1B4929D1AE922EE2479CC853E30ED47 /* NSIndexSet+RACSequenceAdditions.m */, + B221B4504CE1DF7A85DD313BD25E3745 /* NSInvocation+RACTypeParsing.h */, + A73DC36B540A437BAD925324A32CB822 /* NSInvocation+RACTypeParsing.m */, + 3A4460A1D77EF476D75CDAB94861EECC /* NSNotificationCenter+RACSupport.h */, + A1B380DCAD3D4989E2DBB93251264A10 /* NSNotificationCenter+RACSupport.m */, + 20243B04674BFF26F1C89BB8801B12FE /* NSObject+RACDeallocating.h */, + 9BA360036A5AABAFBDF3334B063FDAC0 /* NSObject+RACDeallocating.m */, + 5CD1202CDB22125A7F85E1CEC6FDEFDC /* NSObject+RACDescription.h */, + FE7A720065ADD4DFB14F38D3A80EC296 /* NSObject+RACDescription.m */, + AEA19F745A325226E68C2AE19280CEFD /* NSObject+RACKVOWrapper.h */, + A2B53FE407BA6D1052FD2E69CB119934 /* NSObject+RACKVOWrapper.m */, + 1B880DE953842FCF8F2FB239EDEBAE11 /* NSObject+RACLifting.h */, + 3DAC0FCDA2FFF32FA2B67735A53D1938 /* NSObject+RACLifting.m */, + 5E4C2BD0006A845C1A9BF9A16EFFFC87 /* NSObject+RACPropertySubscribing.h */, + 7A9E18A61560925625AC94CAEF61B367 /* NSObject+RACPropertySubscribing.m */, + 4627D7C077EF4154EE76CB73F193AA33 /* NSObject+RACSelectorSignal.h */, + 9BBFAB4B70EF0531E057F24FDAA67B7A /* NSObject+RACSelectorSignal.m */, + 7EEF7A0CC60C23BB5B5E5E766F63AB82 /* NSOrderedSet+RACSequenceAdditions.h */, + 1A6875D2AD8063882A71D920BE79C32C /* NSOrderedSet+RACSequenceAdditions.m */, + DD0AEFE68EC51F3983E1C9EBC7D198B1 /* NSSet+RACSequenceAdditions.h */, + F18B63F5AB0904D247F9A1DD347C1131 /* NSSet+RACSequenceAdditions.m */, + D32E6325008AAAE78A388EA99F2A6E78 /* NSString+RACKeyPathUtilities.h */, + 9FC06F5260E80FF86BD331DF02F41199 /* NSString+RACKeyPathUtilities.m */, + 8D7B07227B08E988A109D3E720F61437 /* NSString+RACSequenceAdditions.h */, + CBDF01225E66C23D8036BF216E62BBC3 /* NSString+RACSequenceAdditions.m */, + F8D3232335498A45A07CE7F0E26FB102 /* NSString+RACSupport.h */, + AE640802970D3E32CC94306E6E234532 /* NSString+RACSupport.m */, + FF7525F3E5B785150F5D9EB53A7E98A9 /* NSURLConnection+RACSupport.h */, + 050C9BF9E331CB49B507B2A4617C2FA3 /* NSURLConnection+RACSupport.m */, + D21EEE027DB8D34C65A2AAF14CCE57C3 /* NSUserDefaults+RACSupport.h */, + E9351AA02F3EB08E3784279C62F1EF9C /* NSUserDefaults+RACSupport.m */, + A7B99DD703945C83B4601D36B45FEBE2 /* RACAnnotations.h */, + 85DBC14E01134FDC92D40BCBB179E981 /* RACArraySequence.h */, + 683E7F42D8F2F56D9D411895EBF08B0D /* RACArraySequence.m */, + 2C5BF5C462014C7C318D4835F4077875 /* RACBehaviorSubject.h */, + 5E9B39AE6A97DC7F9350E4CCF94DC025 /* RACBehaviorSubject.m */, + 35AA214C6AC1232C1B5DB344B854410D /* RACBlockTrampoline.h */, + 9F09E22AEAB191F29945C8492757D29C /* RACBlockTrampoline.m */, + F6884FF058D9159A41EDF771E4955B37 /* RACChannel.h */, + CD386AAF63FC4BFFECF7EDAFD0F7926D /* RACChannel.m */, + 6EC514F86D7133C8AD208124A04A5A44 /* RACCommand.h */, + AB0B7E72C34C019DB4CFDD3D78EECBBB /* RACCommand.m */, + FFDFC4FE5AF8F486D6C2866AB749C8B1 /* RACCompoundDisposable.h */, + B6EA9E873DF5DC7B0576C9E0B0F3445D /* RACCompoundDisposable.m */, + FFA8D290F6CA616F7FE38D9E087201E1 /* RACCompoundDisposableProvider.d */, + 03D11F623E5749F2B1F5E766B98A4674 /* RACDelegateProxy.h */, + 253D2711D2CBA7C45408CA750D08BF6B /* RACDelegateProxy.m */, + F9A3C01C496820F5455AC933C98AF703 /* RACDisposable.h */, + 770EE84C2D12D89088B1400460903F3C /* RACDisposable.m */, + 0123EF31071CBCBB396BB4E5FF2AC962 /* RACDynamicSequence.h */, + 06E59E23F5C3C8428AD24FEAA5876419 /* RACDynamicSequence.m */, + D959636B8252E5AA339ADFD5924D847F /* RACDynamicSignal.h */, + C886872885D5259609AD09034FCE7F42 /* RACDynamicSignal.m */, + 1D7746A3F6DD0E4D29A82F430AA7032B /* RACEagerSequence.h */, + B7E7F89B24929AC997A0A51CC2B7D0F2 /* RACEagerSequence.m */, + 01AEB5ACDCF93694992BF8B7BC52E040 /* RACEmptySequence.h */, + 9BBF9A6F4940DDFEA675FF57427C9A66 /* RACEmptySequence.m */, + 3D57D3DAE6529FFC47500FA3EDB66F03 /* RACEmptySignal.h */, + 2DE371ED4D9DC628EAA0CF770DEE4957 /* RACEmptySignal.m */, + 1A04CFAEE48B5262947F2713C74F91ED /* RACErrorSignal.h */, + 1F0908CC444FE177FC1ED9F121BAB57B /* RACErrorSignal.m */, + 0A6C86CEAD5B224648297B9CE86E638A /* RACEvent.h */, + 7EDCA3440551E5C2C770A322ABE1F3B5 /* RACEvent.m */, + 9D8C5BEDC14D5495A86C545D449488CD /* RACEXTKeyPathCoding.h */, + 7ABBA38B18A6F0FE7EAA982E3281C6F4 /* RACEXTRuntimeExtensions.h */, + 3111E22E4AD00750A1DC1A82C14A1F6D /* RACEXTRuntimeExtensions.m */, + 9DE2F2FC2CAD45E6981EB09C51B8FC72 /* RACEXTScope.h */, + D6EAFF8D5BA13E11EEA9AFA58781F851 /* RACGroupedSignal.h */, + B02F60AA22796FB79862B4D06CDE8F76 /* RACGroupedSignal.m */, + FFE381120EB63D29C6F0E2A028E2597A /* RACImmediateScheduler.h */, + 5A0D6C50022CF14A826712F5FE73AAB0 /* RACImmediateScheduler.m */, + 8CECD2D7749000CD5709068588846623 /* RACIndexSetSequence.h */, + E6E759698AEEACB0D25C59A6E2293428 /* RACIndexSetSequence.m */, + CDFE4F3A1FED05F13047CE223843F1CF /* RACKVOChannel.h */, + D5526ED44F63AB6324BF008FFF234533 /* RACKVOChannel.m */, + 865D673BCE6FB3E9605BCD7388A34C25 /* RACKVOProxy.h */, + 539271E13991BDD44759115BC547CF20 /* RACKVOProxy.m */, + 61116BBC93B6B5972BD166F712C0D7CC /* RACKVOTrampoline.h */, + 23849DBA6F5CF90243CEA3152D613E52 /* RACKVOTrampoline.m */, + 903FAE1A6ADAC6BC1744F51EBC11DD78 /* RACmetamacros.h */, + A62150A856854F44C62AA221D727DEC5 /* RACMulticastConnection.h */, + 3B77F08CCB0693E93A725C16B70974BE /* RACMulticastConnection.m */, + 8DFB5DC253A0AE52D64C85AE05761D94 /* RACMulticastConnection+Private.h */, + BF4DA895741510F5E99118CB4F97A297 /* RACPassthroughSubscriber.h */, + 8F87BCBF3538C417F466EDB238BCFE42 /* RACPassthroughSubscriber.m */, + BF2DF29A3ACB8A0748E91601BC5F74A1 /* RACQueueScheduler.h */, + 75E79D98DE90159CB40167CCF0D3C206 /* RACQueueScheduler.m */, + 806C000E5B0069D4772442AD7EAC9F16 /* RACQueueScheduler+Subclass.h */, + D3867859D01997146ED0A6B55678EAE0 /* RACReplaySubject.h */, + 312AEAC2C8999EE2170793DE45E4B8E8 /* RACReplaySubject.m */, + 73B4622AF4FB0A31A4AA502DAC17EFFF /* RACReturnSignal.h */, + 8D7453F6D71E2125AC8396C094D80724 /* RACReturnSignal.m */, + 1ED768A051D4B277045DBB0036E3C5C3 /* RACScheduler.h */, + 95D186B0F2495965B4BFD9829ED50B0C /* RACScheduler.m */, + 6A3EC90B72CC7FF026EB36BCE1E111EA /* RACScheduler+Private.h */, + 33636993BC8A1BADE06BA3819AC69F9F /* RACScheduler+Subclass.h */, + F3416F29B712BBDA03F5D32621408AD6 /* RACScopedDisposable.h */, + F8248C414FEB1821DE630D745804D0EC /* RACScopedDisposable.m */, + 604DD91DD93479E515EC86F456239B04 /* RACSequence.h */, + 8B2FD174879A4D1EDC30B115E5E67D7E /* RACSequence.m */, + CD1DED575B5BF7C305691C875E96D5B4 /* RACSerialDisposable.h */, + F300FE56FF3145C8FB9AD5FF7A43D1DC /* RACSerialDisposable.m */, + 90B474AD58E8F15B1D8417320883AE1E /* RACSignal.h */, + F1B91314EBC4598EB68803B118725BA2 /* RACSignal.m */, + 1DCA24FCEAB2C370E0DFE8F12D8A9F90 /* RACSignal+Operations.h */, + CF3E2739C3A89F92FA9F0BF32A29D00C /* RACSignal+Operations.m */, + 684A3FEB76F4E44438CFCAFC0B57BB43 /* RACSignalProvider.d */, + 707663A6256B38642AA63C517F8FA91C /* RACSignalSequence.h */, + D87BF6AA9F0E669F88F010CACE9BB211 /* RACSignalSequence.m */, + 9E097E0A2D6A8DADAAC68701D768C179 /* RACStream.h */, + C1133B6CB319536971880F776861A938 /* RACStream.m */, + EF7CC2A346C1AA725029F1299F22DEBC /* RACStream+Private.h */, + 5945F84A6D24CE448DE7D3F7B5ABADD0 /* RACStringSequence.h */, + A06BCDF5740D5CB805B09E24ECCCE37A /* RACStringSequence.m */, + D27FBB194DFB1179123199D9E1FE436C /* RACSubject.h */, + F80DA353E7061A871D46C211A1D547FA /* RACSubject.m */, + CDACE2021E194A0AE2834AEBFE532D53 /* RACSubscriber.h */, + FDB3A102CB0523354DC41B91D8697D65 /* RACSubscriber.m */, + 36691016BB84FA5EC047579622539A5C /* RACSubscriber+Private.h */, + B3B6F3F9725B0E0BC78DED1BFBF1D192 /* RACSubscriptingAssignmentTrampoline.h */, + A4E8ACDBE016B429BA59DC2AA4044D5E /* RACSubscriptingAssignmentTrampoline.m */, + 48E822CF85A1B417E733C1688FA2010D /* RACSubscriptionScheduler.h */, + 7DEBF836F6DD01FC160403BBF725B8F2 /* RACSubscriptionScheduler.m */, + EF83EE0F915810D84F50C89DD19D7D53 /* RACTargetQueueScheduler.h */, + 21E8A91D2FFDF02FC12EC1249BA136BA /* RACTargetQueueScheduler.m */, + C3301E2066F370F905F0572A50A33F26 /* RACTestScheduler.h */, + 91B9D00466ADF96D063A8AD391D42445 /* RACTestScheduler.m */, + 60EADE108E7BBCDA8EE2FE15DDFBBEEB /* RACTuple.h */, + 6CBEAC3E59C031CD31D439847153524D /* RACTuple.m */, + 631634FC273C56086EE2BDF5C3031136 /* RACTupleSequence.h */, + BAF38F3F3BCF4114F44F457B03803C13 /* RACTupleSequence.m */, + 31BF767FF5B2ED098574654E25271D1B /* RACUnarySequence.h */, + D751E5324CC91F43E41E599645283EB1 /* RACUnarySequence.m */, + D8A14CE787496A01B9AEBA346AC0794A /* RACUnit.h */, + B2807A0E8FC5A483B0867902EF917059 /* RACUnit.m */, + 099AE2A650497D8662F9346B62DC0ADB /* RACValueTransformer.h */, + 62EA6A12CF12D7B25B4CF5288BC3A451 /* RACValueTransformer.m */, + CCE6A9D5F175ACCC7658035BF3FBDAB1 /* ReactiveObjC.h */, + 35732075BBB2F0C1C7555D30716BB878 /* UIActionSheet+RACSignalSupport.h */, + 046753C33076BDD2B01511972EE3BC5F /* UIActionSheet+RACSignalSupport.m */, + B3C2DB03A42AE5681D8A15EF7775AD90 /* UIAlertView+RACSignalSupport.h */, + DE7D2E3A124FAB095EE7CB6E4AEA9236 /* UIAlertView+RACSignalSupport.m */, + 891159984927FE3C67C5053C5D7D3417 /* UIBarButtonItem+RACCommandSupport.h */, + 0A94EF503CBD63A6DF9D584FB70F0D8E /* UIBarButtonItem+RACCommandSupport.m */, + EE03606EBDEE9CF546D23CE0585CAB15 /* UIButton+RACCommandSupport.h */, + E4A205075DBA8F207C0ACC94D0CB22F5 /* UIButton+RACCommandSupport.m */, + 6FC2BE9F229919A94B59ADBD98870EDD /* UICollectionReusableView+RACSignalSupport.h */, + 57A035F0B63D38312FB44AEF072DA5B6 /* UICollectionReusableView+RACSignalSupport.m */, + 74BB721EB50B1A295844955B664314D1 /* UIControl+RACSignalSupport.h */, + CF00B06C975E6813C428E385C676BD56 /* UIControl+RACSignalSupport.m */, + CDA9442E6A4034841DD6CB3FDFA0C73C /* UIControl+RACSignalSupportPrivate.h */, + EC0BE1AE163D88FAC4BC0AF824659DF2 /* UIControl+RACSignalSupportPrivate.m */, + EF9A17FC90908EF12F33CAE11F0E3363 /* UIDatePicker+RACSignalSupport.h */, + 1579DB4F931010CCE34F3884CBB80197 /* UIDatePicker+RACSignalSupport.m */, + 286E560BE1F5CAEB90DA5E2E24EEA6B8 /* UIGestureRecognizer+RACSignalSupport.h */, + 429BAE4E40C83327B0D1D998598F015A /* UIGestureRecognizer+RACSignalSupport.m */, + F855FC0780591E1AE9AB769FECDF8E8C /* UIImagePickerController+RACSignalSupport.h */, + EF18E4AAAC5DD37D24DF555530DC5B2A /* UIImagePickerController+RACSignalSupport.m */, + 6167BA731EDF1A6183132EE6F7E58E6E /* UIRefreshControl+RACCommandSupport.h */, + DE2C979AC4E4695037FE10A14C2D6804 /* UIRefreshControl+RACCommandSupport.m */, + F53F171070C0DCF1269F332348E6A4D6 /* UISegmentedControl+RACSignalSupport.h */, + B24586F6863B5A5EF2DB2F80B165EDAA /* UISegmentedControl+RACSignalSupport.m */, + A43CBBB2BF1565E6DA98FFC0348EA167 /* UISlider+RACSignalSupport.h */, + 90018A503A8CEE50B82FEFC8C5B1717F /* UISlider+RACSignalSupport.m */, + 98BB369EF7D39809E76DF0221E906D4A /* UIStepper+RACSignalSupport.h */, + 01C3BD591308422732B95A5DA0302F53 /* UIStepper+RACSignalSupport.m */, + 9CA5BAA895F8F75A12EC1D858B0B6626 /* UISwitch+RACSignalSupport.h */, + BD958B9C9A5105BE54D777A889DAA617 /* UISwitch+RACSignalSupport.m */, + FC4FB10EFD19299CBDEC1C3BF7E17B70 /* UITableViewCell+RACSignalSupport.h */, + AD4784BBC5F9BA4E607295008B249FE8 /* UITableViewCell+RACSignalSupport.m */, + C596170919E35CD4258498390D989FEC /* UITableViewHeaderFooterView+RACSignalSupport.h */, + 149D613AB64A6FC4A51B600C92945C66 /* UITableViewHeaderFooterView+RACSignalSupport.m */, + 06DA4C4975F8EA85B8A299B1AE23C457 /* UITextField+RACSignalSupport.h */, + 85C21791B4C733B9D460DE01E9E72D6F /* UITextField+RACSignalSupport.m */, + 9FCC7A3D936B2DC0E18ADF5E203B0A1E /* UITextView+RACSignalSupport.h */, + B02BAA61E5DAB045E5E85B38DE6BF7E4 /* UITextView+RACSignalSupport.m */, + B9DCD6147CBC035910ABBE845D6483E6 /* Support Files */, + ); + name = ReactiveObjC; + path = ReactiveObjC; sourceTree = ""; }; - DE386D134C1B0AB0468FC7A0AB07D5F2 /* WebViewJavascriptBridge */ = { + C7D3D976EAC0DF624A7B62E56D24CE66 /* BAPickView */ = { isa = PBXGroup; children = ( - FB19699E1C1B12EAF5D5EF13453DED15 /* WebViewJavascriptBridge.h */, - A0D97EA3D3614781449972AF8EC4D621 /* WebViewJavascriptBridge.m */, - 1D36BB668CD698AEA98938593DB6000C /* WebViewJavascriptBridge_JS.h */, - 2BC8573301D7C819200435865CFE60B6 /* WebViewJavascriptBridge_JS.m */, - C00F8308F41ED0074A3E0593A878B9F4 /* WebViewJavascriptBridgeBase.h */, - C2816F1AC6BCC92F40FDD4E2A786DFDE /* WebViewJavascriptBridgeBase.m */, - 4FA3881E78E67569BF5D4EFDB53DBA32 /* WKWebViewJavascriptBridge.h */, - 24742DEC1D6C6F047EBC393BC8C6BD7E /* WKWebViewJavascriptBridge.m */, - 38D1E0F133A021A0DA81EB78DB6782FF /* Support Files */, - ); - path = WebViewJavascriptBridge; + 95313961CC052A5A1DA2C2AA063946F2 /* BAKit_PickerView.h */, + 58A351A36F1D2D1D26BFFB0AEC05A52A /* BAKit_PickerView.m */, + 78989D891E2977559FAFFA4573846FFE /* BAPickView_Config.h */, + BA57AD18C92754A29658ADEE3CB19D5D /* BAPickView_OC.h */, + 3667FF770F6A8140D57DF53BDA62005F /* NSDate+BAKit.h */, + 9D41F7972543DEEDA61482AAF56BAD7D /* NSDate+BAKit.m */, + D25479F0E7B16C558BF66D03CC55D9FE /* NSDateFormatter+BAKit.h */, + DB3CD6E69E7748B39B733D1CCA14FD93 /* NSDateFormatter+BAKit.m */, + 6C22E55019961FFAFAEDF8E9F5D33484 /* UIView+BAAnimation.h */, + A19FE504E109866CF7EC09D4EFA05F0C /* UIView+BAAnimation.m */, + 395326E78402D6FD1222720DF2C766E6 /* UIView+BARectCorner.h */, + B2F7CA4FF254B4E71A0FC39B3B529DD1 /* UIView+BARectCorner.m */, + 0DA3AB78557A31BF4C3FD725FC0CF4ED /* Resources */, + 86702041ACE8BD6EC24FF70E583D2A46 /* Support Files */, + ); + name = BAPickView; + path = BAPickView; + sourceTree = ""; + }; + CA56B18374AE294321EC88088E472B99 /* BANetManager */ = { + isa = PBXGroup; + children = ( + A24581B2421A77286F2E77CD27519ABA /* BANetManager.h */, + 78C1568783AD9BEFBF0F76813BC26239 /* BANetManager.m */, + D6125A92A79F0174D519EEA96DDB6614 /* BANetManagerCache.h */, + 04F2D33D010870B7E9EE7E3AFCC85099 /* BANetManagerCache.m */, + 77020299ACF56CE92483C8719318CE4A /* UIImage+CompressImage.h */, + 607A7C66490292A0ACAF9ECAED2F9E84 /* UIImage+CompressImage.m */, + 344091525CB7D6536221DB7D18D78D84 /* Support Files */, + ); + name = BANetManager; + path = BANetManager; + sourceTree = ""; + }; + CC46372175029AC9C3EC34F36D2B6687 /* Resources */ = { + isa = PBXGroup; + children = ( + 49303BDED7D239E54D72C3EB245BF3A7 /* UMSocialSDKPromptResources.bundle */, + ); + name = Resources; + sourceTree = ""; + }; + CFFB6BFED582FCC918D32EAC91A78AC4 /* standard */ = { + isa = PBXGroup; + children = ( + 11EC33FFB6BBCB6CBEF82174F7A45B74 /* FMDatabase.h */, + A1EADA48B3316C296B619063CDAAFAFE /* FMDatabase.m */, + B452FB9D2A3C5B83B7DD31AC83FD01B9 /* FMDatabaseAdditions.h */, + 57788604735687969ACC0021E00446E2 /* FMDatabaseAdditions.m */, + 0AEDD7FDA88C26510064248D70178E27 /* FMDatabasePool.h */, + E67C8590AB01E04303A4CB757B9EF9C8 /* FMDatabasePool.m */, + E94641D09D42A41BACD43E868A83A186 /* FMDatabaseQueue.h */, + E867981DA05B944DC6F56866658B220E /* FMDatabaseQueue.m */, + 001D6A764F83ECFE13AF65407D2CF8E6 /* FMDB.h */, + 9EE3B99BAEC118FC63BA4B315A147B82 /* FMResultSet.h */, + E8509EAC97FC971E791A2A5C248EC9D7 /* FMResultSet.m */, + ); + name = standard; + sourceTree = ""; + }; + D36FFD30C64B8D8F563B3EA0892178A5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CFBD8791D09EE1815BCB927F6836005E /* TencentOpenAPI.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + D93A134688085932D4D22EE29A69B3FB /* MyLayout */ = { + isa = PBXGroup; + children = ( + 012617C3649DCA989C25D81F51BFCF1C /* MyBaseLayout.h */, + FA56DFEFAB27D79DC417226CA8059178 /* MyBaseLayout.m */, + 8E0B83129C843D9FB6FDA7B950F2CFC1 /* MyDimeScale.h */, + 8C878A78D0FD9A773A3E231BBC089A2C /* MyDimeScale.m */, + A4AF5A9FF67E6F3B7410BBF68C430434 /* MyFloatLayout.h */, + E5AF350229D2492D5661257C508B10BA /* MyFloatLayout.m */, + 2E25E8A0AAAAC111A684D76A7732C6BB /* MyFlowLayout.h */, + 934817E4C51481753208D8043FF8A696 /* MyFlowLayout.m */, + EB1C8D0E3F3A6763EBACDEA6AF77B9D1 /* MyFrameLayout.h */, + 80AB726B9C6929C89B92052F1FC43942 /* MyFrameLayout.m */, + 268320F0FA40E517AA8F5D3575247D49 /* MyLayout.h */, + F10F1F4BADC29D2C7A221C2C968B1FC3 /* MyLayoutDef.h */, + 9839DE7AC89339C7F31DE30EF7BE525D /* MyLayoutInner.h */, + D2F01DC15821781C72495F8E508A6311 /* MyLayoutPos.h */, + DCF1281E65E2614206531CCAC9EF8BE4 /* MyLayoutPos.m */, + 6D58D3DF16E86AB3A10C88B0003B6AB5 /* MyLayoutPosInner.h */, + 35BDA86AE11F460A2DF00BC4EB769654 /* MyLayoutSize.h */, + 38D5AFDE32F62244BED362D45F62E0E5 /* MyLayoutSize.m */, + 327F60EA44DE902FE3C475B66026065A /* MyLayoutSizeClass.h */, + FB5C6D33A11AD5B35A44A3BCDB3956A9 /* MyLayoutSizeClass.m */, + 50AE63C2A06A3695F2DECA8AC0174F4A /* MyLayoutSizeInner.h */, + 153251EBA7639679E85F3313F0F094C3 /* MyLinearLayout.h */, + 234F644A5F52C35A3202B444A8BE17ED /* MyLinearLayout.m */, + C89091427D7AB1D7B78625766365009E /* MyMaker.h */, + DAC1A8C272EB902E442B93356AA4163F /* MyMaker.m */, + ADC5137C6CFCE99DD06051C7CC84FC5B /* MyPathLayout.h */, + 7821C3C11EE680BDBCDA4B31D647A7BD /* MyPathLayout.m */, + 601D1FC77A743C7F9FA9AF2A224BCBE5 /* MyRelativeLayout.h */, + 0A27D78343DC7345BCB9DBE049419D2D /* MyRelativeLayout.m */, + FF76520268F3123F593947502AB7F9FD /* MyTableLayout.h */, + 60C38E834960E437E49AB0F022A25995 /* MyTableLayout.m */, + 5127CB1E1790294810CEFF46B813993F /* Support Files */, + ); + name = MyLayout; + path = MyLayout; + sourceTree = ""; + }; + DEB5ACF7A306F00CB01CEA7BB5027381 /* Core */ = { + isa = PBXGroup; + children = ( + BDC0F938A736A44ADE99A6AAC93809CC /* NSData+ImageContentType.h */, + F88D8E256D8AC4AF923227D7EAC1C76C /* NSData+ImageContentType.m */, + A420EA5A01F414F0FC314F1064C6278F /* NSImage+WebCache.h */, + 106876CF473CEB04DACD72F9BD78B10A /* NSImage+WebCache.m */, + E7BA51C89206DA133993E548DF4A3301 /* SDImageCache.h */, + 96CC5897E6848EB5C09E6C1FD2CD5C01 /* SDImageCache.m */, + 7D833929A098FC5A369CD580C0C5ADDB /* SDImageCacheConfig.h */, + 398019BEC2C03A0C83B11298A7329629 /* SDImageCacheConfig.m */, + B0FFA59642E56C38D4B03E8CA762B990 /* SDWebImageCompat.h */, + 984F9931CF0D45C901C10DD01736C733 /* SDWebImageCompat.m */, + 7C53401DF672DEFCFD1E60FCB433057B /* SDWebImageDecoder.h */, + 5C9F144C211A4FE3634CAD7610176D38 /* SDWebImageDecoder.m */, + BD482008D91EC0216DC0E8B0A6719235 /* SDWebImageDownloader.h */, + F1E6E56CE71732E8ECCA47B8DC8DADB5 /* SDWebImageDownloader.m */, + 2FD86E222A556966847A5A1839B2D9F5 /* SDWebImageDownloaderOperation.h */, + 110FB15DF49DAD2BC44FD43CE0FCA9FA /* SDWebImageDownloaderOperation.m */, + 6452F64FB9A4CA603153111E279D02A1 /* SDWebImageManager.h */, + AE1BE0AD3E37333FD6CBB38ED79FEC43 /* SDWebImageManager.m */, + E228B8F4E47E733FC8629782BCAB3542 /* SDWebImageOperation.h */, + 694836430EB9C8125E7441814F33CA6D /* SDWebImagePrefetcher.h */, + 3F7719B2B06543C66BFA4D11CB660CC0 /* SDWebImagePrefetcher.m */, + 2C166D53BEBDEF9C2D8E186212A3195C /* UIButton+WebCache.h */, + D4E29B4AA52D095FFB047449C90C7A5D /* UIButton+WebCache.m */, + A62036EF008984FBD2B85C2DC76D57C4 /* UIImage+GIF.h */, + 66A541E696EFAA079F2073208EEC2ECB /* UIImage+GIF.m */, + 1451240F2979272EAFC1B709D9DF75A3 /* UIImage+MultiFormat.h */, + D2A9DBF98EF72B1552A4B9DCA1A0C551 /* UIImage+MultiFormat.m */, + 586379DAA99D75E39F9642AEC8F5E069 /* UIImageView+HighlightedWebCache.h */, + EF804754A2A4BA00ED0571DD360E073C /* UIImageView+HighlightedWebCache.m */, + 26F4CE27362B55A10FAC835055A92967 /* UIImageView+WebCache.h */, + B5B1B4631239031AD33CFE487E2F9C0E /* UIImageView+WebCache.m */, + 6298AC3563BA3FCEB026D19A33B46F0A /* UIView+WebCache.h */, + ADECB2D80F39BF9689953920952743D9 /* UIView+WebCache.m */, + 96A44317869D4232F074010DF2DB49BB /* UIView+WebCacheOperation.h */, + DBCFE478A76EF2089C162BBADCD26CF7 /* UIView+WebCacheOperation.m */, + ); + name = Core; + sourceTree = ""; + }; + DF0FAE54A9A193FFFC76CA9ECBFD398C /* Support Files */ = { + isa = PBXGroup; + children = ( + 46379A297FC67C6E204CA4FE3BC093BB /* SDWebImage.xcconfig */, + C022E794B2CEBE1756E4A06291C3E5C3 /* SDWebImage-dummy.m */, + FEDE149088064E0D8D82768AF8C40E67 /* SDWebImage-prefix.pch */, + ); + name = "Support Files"; + path = "../Target Support Files/SDWebImage"; sourceTree = ""; }; E266CF14E860C7FC9B093956A5969B1F /* Pods-BABaseProject */ = { @@ -3192,52 +3571,13 @@ path = "Target Support Files/Pods-BABaseProject"; sourceTree = ""; }; - E35160C7F91BC675D05CF833EF4DB90A /* MJRefresh */ = { + E2D0CABDD4E37E04BDDD77DE5FB421C3 /* Reachability */ = { isa = PBXGroup; children = ( - 542E6C9B8F84F2330A4147C57B231C39 /* MJRefresh.h */, - A32E551FBED662DCD9CC3F2192E5937F /* MJRefreshAutoFooter.h */, - 2A4BCFF3530F736ABCD8BB8951ED0433 /* MJRefreshAutoFooter.m */, - 5235F6664D58F67235B2FE9C46034955 /* MJRefreshAutoGifFooter.h */, - AF0B5F3879319F1C775D755A16DB60C9 /* MJRefreshAutoGifFooter.m */, - 53826077F7EC40EC905B04539DDE0BB5 /* MJRefreshAutoNormalFooter.h */, - C14BD54122A5501582104EC3C8921B15 /* MJRefreshAutoNormalFooter.m */, - 4D7BB901E91162456CE20970E16BBD61 /* MJRefreshAutoStateFooter.h */, - 9B989E586DE2640D8734F40813759F08 /* MJRefreshAutoStateFooter.m */, - D2E64A5822968FE5CB3F68A4F8705C72 /* MJRefreshBackFooter.h */, - 81D26EC2ADFBC40AD044725AEF390A44 /* MJRefreshBackFooter.m */, - 34880D346373881FA6D9A57B8A895802 /* MJRefreshBackGifFooter.h */, - 56002A76B241F357D48CD4909CC1A858 /* MJRefreshBackGifFooter.m */, - 91027CB4857D928D1CA9C81DE21FA2AB /* MJRefreshBackNormalFooter.h */, - 6BBD3F19020D7F999796C6B139E9DE3A /* MJRefreshBackNormalFooter.m */, - 21CD8F15749D4A403CDD14794455532C /* MJRefreshBackStateFooter.h */, - 43F4E05159F189D6601F4017C603D706 /* MJRefreshBackStateFooter.m */, - CA6BE538EFF2B2C5FE9FF241AE9AC602 /* MJRefreshComponent.h */, - B9F6A08C41CC3352A79FEA17317EA713 /* MJRefreshComponent.m */, - 6FD0AFB662E53B304759CE4E844D0056 /* MJRefreshConst.h */, - CD68B0BDB606FE3E3852FC50AB401CFC /* MJRefreshConst.m */, - 7081EA450B46B30A885165B54CB34218 /* MJRefreshFooter.h */, - D7FA3479A588D12346AABFFC5E7B8AFF /* MJRefreshFooter.m */, - 42AE4450BA7735FFFE7FAC3E56D8CE30 /* MJRefreshGifHeader.h */, - 70E0CDC5287ED1477D52FED16F8384B1 /* MJRefreshGifHeader.m */, - FEA6D93271DC64A3A9B375AD1D046B1A /* MJRefreshHeader.h */, - 77CF34DEB06540E223A4E361A2550DAB /* MJRefreshHeader.m */, - 1C84A08F80D1887EA7BD94544170D1E9 /* MJRefreshNormalHeader.h */, - AF5E9220586D448D78D85E7BDD02FD3D /* MJRefreshNormalHeader.m */, - BB70C9C6E99CB810F1090EBC41955558 /* MJRefreshStateHeader.h */, - BD76F534CEEFE47794698A5410F23ADA /* MJRefreshStateHeader.m */, - 79CE0562E0D8BD6903CEF607CCA7E330 /* NSBundle+MJRefresh.h */, - 468C7846CEC675C941C4E6A8B977C108 /* NSBundle+MJRefresh.m */, - B026555327BAA23598E63F5914876CCE /* UIScrollView+MJExtension.h */, - F2D6E4AD12709448D4620BCF9EFF9D3D /* UIScrollView+MJExtension.m */, - C3733709FE00D30C4BAD0E7DB04981CC /* UIScrollView+MJRefresh.h */, - 290C8450DD5B7FFBF5956CB8CA9808EA /* UIScrollView+MJRefresh.m */, - 0CD1EEEA0509DAE57E9C82934DD0CF41 /* UIView+MJExtension.h */, - BBBA4E1F7C1DEF65E95F5516787B8196 /* UIView+MJExtension.m */, - FB4F4EE58CD0CA7D60F28B9BD2FD557D /* Resources */, - 18DD2E176B0DB4125666C26463CBDAD6 /* Support Files */, + 08ED25551853722CCFBFEE3A01914FE8 /* AFNetworkReachabilityManager.h */, + 93BDCF3B3DA900A5EFB80DC0A6525E4D /* AFNetworkReachabilityManager.m */, ); - path = MJRefresh; + name = Reachability; sourceTree = ""; }; E85F36EED1BE25B9385971FD663CED87 /* Pods-BABaseProject-BABaseProjectUITests */ = { @@ -3255,757 +3595,990 @@ path = "Target Support Files/Pods-BABaseProject-BABaseProjectUITests"; sourceTree = ""; }; - EFADBE2D435CDF5AD5B9F7CB74E137DF /* Support Files */ = { + EAFA675C750AAADCB30CAF65A1A87D0D /* Pods */ = { isa = PBXGroup; children = ( - A02E0C9A11F077B870A72CA725FE5BB1 /* MyLayout.xcconfig */, - 5F7C672934FAD3064B3C01587AE90804 /* MyLayout-dummy.m */, - 08674FC285BAD9D66D91FFE1718AE27F /* MyLayout-prefix.pch */, + 9FC5B9BCBEA0984869BE5AAA45AB4B63 /* AFNetworking */, + 83D2CE3987D7FF901E8FB169D451BD7E /* BAAlert */, + AF2D90B415F6F71E05718C673683E736 /* BAButton */, + F64A871D7C3681A9CFC3271A47CE6040 /* BaiduMapKit */, + CA56B18374AE294321EC88088E472B99 /* BANetManager */, + C7D3D976EAC0DF624A7B62E56D24CE66 /* BAPickView */, + ECD5A0A7D839190D86CC89F8AF227648 /* BATextView */, + 5D2CCDE2725B9FE97371395418D05A3C /* BATouchID */, + 9444544600F23E36FBF2132ACAEC91DD /* DZNEmptyDataSet */, + 41FD8F7C74067E909F88FAD3BFC34C92 /* FBRetainCycleDetector */, + AB0854D85551AEBB1D5C16F495637F4D /* FMDB */, + 505540D01EA310285DDE76DEEA7FEB19 /* IQKeyboardManager */, + FC03E132502B99F5F2ED50F3BAB8EB39 /* JMRoundedCorner */, + 486B38C2D378BC89A307496AC030C282 /* Masonry */, + 0E8FF008D3812872AF8B057FA4D5186E /* MBProgressHUD */, + 391BB56D7F659777E99DABAA3E95D8F7 /* MJExtension */, + 8E5499967C2672F5969BD23873C15AA7 /* MJRefresh */, + 79574F190DC4D52D9DB3350F69A832BC /* MLeaksFinder */, + D93A134688085932D4D22EE29A69B3FB /* MyLayout */, + 598D7D798888A8DD474B98921C5D46DA /* NullSafe */, + C7891ED54A12D749B583059BD695A42A /* ReactiveObjC */, + B1EC2F4BEBF3B4366A297050D9F89577 /* SDAutoLayout */, + 10D58619321FABBC2BBC70D73B033751 /* SDWebImage */, + B438AA15C35CADB53D7536CE21B943C4 /* UMengAnalytics-NO-IDFA */, + ED2CF32B682E3138D697FEE8876FA64D /* UMengUShare */, + 38950E4455EAB88A27E83792F74DE3CC /* YYCache */, ); - name = "Support Files"; - path = "../Target Support Files/MyLayout"; + name = Pods; sourceTree = ""; }; - F659DF71E0CF33C71CDB5AD291C436EE /* MessageUI */ = { + ECD5A0A7D839190D86CC89F8AF227648 /* BATextView */ = { isa = PBXGroup; children = ( - FDAFBE2351DABBD9D765453D62A694F4 /* BlocksKit+MessageUI.h */, - 7D77B13981F2C3CD8D38863868755197 /* MFMailComposeViewController+BlocksKit.h */, - FD67AAEC8D513BAF5C12A63FEB5AC14A /* MFMailComposeViewController+BlocksKit.m */, - 8BBC3986DFEFC61B94AAC7474F917747 /* MFMessageComposeViewController+BlocksKit.h */, - C345638781FC3EFEBE27425ADF905768 /* MFMessageComposeViewController+BlocksKit.m */, + DF95114B2DC23082C9E4025F811DDC6F /* BATextView.h */, + C494FDBBA55D3265C3C0140FC7FD8D17 /* UITextView+BAKit.h */, + D7542A991595F09E904571E427247496 /* UITextView+BAKit.m */, + C44AEEBCDB26C94FC218F0E59CC62CE0 /* Support Files */, ); - name = MessageUI; + name = BATextView; + path = BATextView; sourceTree = ""; }; - F6F7EAD9D8A4C04F54A91212DF30CAFF /* BAButton */ = { + ED2CF32B682E3138D697FEE8876FA64D /* UMengUShare */ = { isa = PBXGroup; children = ( - 22DDD211FA23314FC16271C217095002 /* BAButton.h */, - 50A31F9BD88110591D90290688433D67 /* BAButton.m */, - 1582D54B25109EC5E91AA3F0F40020F2 /* Support Files */, + FE668387B5696E0413F22E45C0EC6B73 /* Core */, + 2EDE6F794EAE8550FA0E9B2813702D3D /* Network */, + B91A49B72A0FE025CB83F5A5F372CBF1 /* Social */, + 5FDC48B884D0238E27745C03F5F00E5E /* UI */, ); - path = BAButton; + name = UMengUShare; + path = UMengUShare; sourceTree = ""; }; - FA04856AC14B9FBA63A86F2C5D698C92 /* SDAutoLayout */ = { + F00A095D90849D3B713E0CC7682041FE /* Frameworks */ = { isa = PBXGroup; children = ( - C14C1A6243FFBB0FC900BE895E7A01B3 /* SDAutoLayout.h */, - F80D4FDDD654673A1021C21D4DDD8F24 /* UITableView+SDAutoTableViewCellHeight.h */, - C461681BED27151F945752EDF2C87F36 /* UITableView+SDAutoTableViewCellHeight.m */, - 2357778874C40965E6624D6D3DA4B672 /* UIView+SDAutoLayout.h */, - 587F16F5BE4442EE547B80E02F884369 /* UIView+SDAutoLayout.m */, - 218C5ADD264604BD2E9587FB0ADF314F /* Support Files */, + 38EDBBFB74E8E449133380A37D13E19F /* libAPOpenSdk.a */, + ECBEC57B84F9854CC7B039CE8AF36ECA /* libSocialAlipayShare.a */, ); - path = SDAutoLayout; + name = Frameworks; sourceTree = ""; }; - FB4F4EE58CD0CA7D60F28B9BD2FD557D /* Resources */ = { + F64A871D7C3681A9CFC3271A47CE6040 /* BaiduMapKit */ = { isa = PBXGroup; children = ( - 6623DF3A6E50A569D2DDEE8F72B79AB8 /* MJRefresh.bundle */, + 4B2CC3FEF34AB97E1C69DA32D2111AE6 /* BMKActionPaopaoView.h */, + 7410A7410975F9556AF6F71F02D47652 /* BMKAnnotation.h */, + C19AB24B4E3E55EF93EF9D3E42622DEC /* BMKAnnotationView.h */, + FD300C04B2988F6FB94F34E7F40C2A17 /* BMKArcline.h */, + FA2DDCF5AC779145FF5360213A6ED73B /* BMKArclineView.h */, + 5BAFB149D68667A0D6431B76E5783F6F /* BMKBaseComponent.h */, + E11A5341F1CFE9AF45B9239EC8D3D85F /* BMKBaseIndoorMapInfo.h */, + ACF604C3596C865FBAAF8BB2AE352CCA /* BMKBusLineSearch.h */, + 22B7431A158DD14D3A998F7E4905B17D /* BMKBusLineSearchOption.h */, + 459AAFE1F1D9EA4D967986654FFD8E94 /* BMKCircle.h */, + 25D4ABE7819E399A9D91A6FE03EFE0AE /* BMKCircleView.h */, + D4F6611986B976C30B2750D210B5F268 /* BMKCloudPOIList.h */, + 0AEB1A61146C5142D4D5E77AB0128992 /* BMKCloudSearch.h */, + 08220E658BE225AC98C9F060988E7C99 /* BMKCloudSearchComponent.h */, + 08890F66152FB2C9DE640E0684F7C1CD /* BMKCloudSearchInfo.h */, + 6AA7706A9CDC113241DF6C48DE3BC256 /* BMKCloudVersion.h */, + 6FAA6B66D5265FCD4D66415C9FEAB562 /* BMKDistrictSearch.h */, + 3B0C634B0297ABC6F5168AFC00F9C8AE /* BMKFavPoiInfo.h */, + 4F037546AD903D466E03B855604AB7CB /* BMKFavPoiManager.h */, + 7811BB681DF349D0BE4EDD6CFE2EE56A /* BMKGeneralDelegate.h */, + 7BD75221D5D39FAB91CA933F7BB0A516 /* BMKGeocodeSearch.h */, + DC0BAAA1862835201D4F9D25160103B0 /* BMKGeocodeSearchOption.h */, + 82C1375F6DDA6BD2AED2D49ED6B30063 /* BMKGeocodeType.h */, + 8541664168DE1FB96B78AEA67B4E9762 /* BMKGeometry.h */, + 88E82E59CEAB24CE906DF78CE4C4355A /* BMKGradient.h */, + 3917A5A4685744726F35459D795C8208 /* BMKGroundOverlay.h */, + F65E91D3549F14FA9667A801796E93E6 /* BMKGroundOverlayView.h */, + 3A6863F19D6670EF972F70434A310987 /* BMKHeatMap.h */, + 44C205E043411C9776E9AB93B8B40884 /* BMKLocationComponent.h */, + 2DAA8D71933229D4EB5B0FC01815E90D /* BMKLocationService.h */, + 2C0EF8BF0F971F39EB7F550B63140569 /* BMKLocationVersion.h */, + 0501317D931CA14F1FC480A013F4364A /* BMKLocationViewDisplayParam.h */, + 177623C7BE1948054DEEB107467F9E91 /* BMKMapComponent.h */, + 79478BCFBD5CA079DBEAF71201EA144E /* BMKMapManager.h */, + DF5CEF7A0BFD5821969BAE27D9E9A1F0 /* BMKMapStatus.h */, + F3A2E37C6E7EE503652045770FFAF1C3 /* BMKMapVersion.h */, + 8C9BBCDCE898BCA27F91DAE1DBEF4371 /* BMKMapView.h */, + B17D703A3835F8829B6BC43BDD0344AD /* BMKMultiPoint.h */, + 2038DB3198491F1BAC3EF45DED8F42A7 /* BMKNavigation.h */, + 9CB768200157EF9D10A64ACB69C1CBFF /* BMKOfflineMap.h */, + A5B15B9D1A5AD58BFCC20B039DCC2380 /* BMKOfflineMapType.h */, + B4E7D9C2EB3B392236B39C337D298364 /* BMKOpenOption.h */, + 6B0FF9C37F37B7D8E3259D2DD9DE3A4D /* BMKOpenPanorama.h */, + 13CF84D9AB979C1C299E38DD3640B0F5 /* BMKOpenPoi.h */, + 0A1805608C2690B1DB1D2F3BCD4669A2 /* BMKOpenPoiOption.h */, + BDBF2EFE1CD0909950A1090E08FE04B4 /* BMKOpenRoute.h */, + 334193C938D9CBFE4064554A225BB2E5 /* BMKOpenRouteOption.h */, + C8622392B1B4AE791A1EC0CB748303DC /* BMKOverlay.h */, + 5AE11900CF5483F5F3AE31706C9EA7BC /* BMKOverlayGLBasicView.h */, + C08FCE176AA8AB645D9914A604A54C0F /* BMKOverlayPathView.h */, + E890B95F7128A9E3A635022395ABD04F /* BMKOverlayView.h */, + E7B74F4BEC5432F8CAE802632F7FE075 /* BMKPinAnnotationView.h */, + B22D583BC9E9519845EE7FA03B2D23FD /* BMKPointAnnotation.h */, + A6F32588B657850EABFB74AEDDB38C5B /* BMKPoiSearch.h */, + 8E933D8EB276BA8E1EA27AA968EAD2C5 /* BMKPoiSearchOption.h */, + FF5DF239814F256ECB6DEAB3AF1E21FF /* BMKPoiSearchType.h */, + 339F84D06D8FBC2F1F0E11D9DB3D1B06 /* BMKPolygon.h */, + 85A99A944259EBFC0F1553375D3F6612 /* BMKPolygonView.h */, + 8FB67143512F86955CBD2E22A4415075 /* BMKPolyline.h */, + C6A13A70D1B717A4EC9DFF58875F725E /* BMKPolylineView.h */, + 0A22E369C917AA057EF666A7F12DAAF6 /* BMKRadarComponent.h */, + 4C49368620D6CAF2E5410A91CAC5FDE6 /* BMKRadarManager.h */, + 1BEE4EB8302487D7E3F856E2BA809DAA /* BMKRadarOption.h */, + 07AC6A834CE3DB849BEC77BDBFD57063 /* BMKRadarResult.h */, + 11DAD57A8968440D8545058A2A1FD71C /* BMKRadarVersion.h */, + DF1CC7469F808ED02F6DC3ABF853FD6D /* BMKRouteSearch.h */, + B61A3831AC3C6608B543FB9E99A748FE /* BMKRouteSearchOption.h */, + 1E92917BCC2CB30A9506D26BAF59F243 /* BMKRouteSearchType.h */, + 2D76CB8ECA822D6FD5ED20F617CBC3AF /* BMKSearchBase.h */, + 8CDD582B3956B1DBB30BB4F23AF988C4 /* BMKSearchComponent.h */, + AAF349A33035E163768A382E51E0944E /* BMKSearchVersion.h */, + 1A00F7D10B75F5E22DE86E2667F20609 /* BMKShape.h */, + 4F72E022A651D7B44DF817233E2B9BAD /* BMKShareURLSearch.h */, + D1DF4057A74B52A69C7CDE21A4834E7D /* BMKShareUrlSearchOption.h */, + E6DB5CF4A72C51298AB0775908547ACC /* BMKSuggestionSearch.h */, + B0198BA0BE9BB00547AEFCC0FA21E46D /* BMKSuggestionSearchOption.h */, + C81C77EBCDC767363836DB3363AD1268 /* BMKTileLayer.h */, + E52F1D54AB1F3F85B2D2AB64AE320577 /* BMKTileLayerView.h */, + 4AAD40469B5CAC2D161755405DB1644A /* BMKTypes.h */, + F7A72A5FB5E0A390B3AAB256A9D5292B /* BMKUserLocation.h */, + 2902E219B43F6327F8C71C573FE3D209 /* BMKUtilsComponent.h */, + 6BD2311F3DFB0E781A177965486923EA /* BMKUtilsVersion.h */, + 0021755692C766A4A27D754D62CDE475 /* BMKVersion.h */, + 2E23056445498E6C522C1AA9D90C5817 /* Frameworks */, + 113322D3AAA8961D79EC66892E28D38C /* Resources */, + ); + name = BaiduMapKit; + path = BaiduMapKit; + sourceTree = ""; + }; + F959F6D8BD1ABAC70692712C47708E6A /* Serialization */ = { + isa = PBXGroup; + children = ( + 68660D5FE61037C194223DBF5FFC497C /* AFURLRequestSerialization.h */, + 0AD4CC755E906600F2BEAA5B269919A9 /* AFURLRequestSerialization.m */, + 980BE16B12FCFA38A053DA9760F6E773 /* AFURLResponseSerialization.h */, + 892E35422B2B31502870054B9D4FAF4F /* AFURLResponseSerialization.m */, ); - name = Resources; + name = Serialization; sourceTree = ""; }; - FEA2560D308838AF85C041A84C85C079 /* Support Files */ = { + F9854CF3684BC0374D523B71E8BE03FC /* Support Files */ = { isa = PBXGroup; children = ( - 83C22E37D16F166B00D45DADBA4BB65E /* MBProgressHUD.xcconfig */, - 5E58D4C80227500E1AD4CA3366E0A240 /* MBProgressHUD-dummy.m */, - 08392E3D0EC410F614A0C233E220C60F /* MBProgressHUD-prefix.pch */, + 0F223A84D78AE0F2009F07EDC72AE9CC /* JMRoundedCorner.xcconfig */, + D05680A3EF91F26983800EFD7ABA4953 /* JMRoundedCorner-dummy.m */, + 6AE5D6C1898313DA101FC0635D08BE5D /* JMRoundedCorner-prefix.pch */, ); name = "Support Files"; - path = "../Target Support Files/MBProgressHUD"; + path = "../Target Support Files/JMRoundedCorner"; sourceTree = ""; }; - FFDF402F08A529338D4122656D60DC3E /* Support Files */ = { + FC03E132502B99F5F2ED50F3BAB8EB39 /* JMRoundedCorner */ = { isa = PBXGroup; children = ( - DD3DA039268C9830A065E3A491D2792C /* MJExtension.xcconfig */, - F8D8F55D61EE419D9EC90824FE0F70DC /* MJExtension-dummy.m */, - A31C4AD0C13C32F787D540E870CF7E92 /* MJExtension-prefix.pch */, + 5031BD94E5D281BDF0FA49E5155AE5A7 /* UIImage+RoundedCorner.h */, + 2C9A4D99DF92CB8A163E0DE19AB5A9B8 /* UIImage+RoundedCorner.m */, + 582AA5CEDA0AAB03312DB0D55EFB9143 /* UIView+RoundedCorner.h */, + 63A4033AC2232FE5F6C3307FDC627B6A /* UIView+RoundedCorner.m */, + F9854CF3684BC0374D523B71E8BE03FC /* Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/MJExtension"; + name = JMRoundedCorner; + path = JMRoundedCorner; + sourceTree = ""; + }; + FE668387B5696E0413F22E45C0EC6B73 /* Core */ = { + isa = PBXGroup; + children = ( + 850B16A8823FE1D386F4ABEEE6088055 /* Frameworks */, + CC46372175029AC9C3EC34F36D2B6687 /* Resources */, + ); + name = Core; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 10A2C1B31768927D66B49C9DD9C6DC51 /* Headers */ = { + 0A0D9248F4B039D2E7D082627D84D2C9 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 47687F665BD725F1046EE5C119145B16 /* UIImage+RoundedCorner.h in Headers */, + C9AEEC8697B6EF9C01522F75C8323DF0 /* UIView+RoundedCorner.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0A1C2B07813030B0D51EB1D804A4439E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F1F93EE1AA5E870F2CE81325CE9EB643 /* AFAutoPurgingImageCache.h in Headers */, + 6B71CE5BA32574F407349C1DA20605B4 /* AFHTTPSessionManager.h in Headers */, + 707E818332E5033501DF2D7826C639DF /* AFImageDownloader.h in Headers */, + E7B0270BEDCBE116DDD853F76E27B0BA /* AFNetworkActivityIndicatorManager.h in Headers */, + 46401F3C7FF0B0CFE2E9B14914780835 /* AFNetworking.h in Headers */, + DE31BBF6A7963C5871A19655EF5532BE /* AFNetworkReachabilityManager.h in Headers */, + D59FC98A74E440C4725B6FDC28F5951E /* AFSecurityPolicy.h in Headers */, + C1C0D7C93BF3DE14A26757273598D0FA /* AFURLRequestSerialization.h in Headers */, + 66635EAAE52FF5571DBCDC626FB8CA86 /* AFURLResponseSerialization.h in Headers */, + F5CC06F3E0C232483A72DCCFAF393BE0 /* AFURLSessionManager.h in Headers */, + 682B0E603612B6ADBCCF30580F9A4B09 /* UIActivityIndicatorView+AFNetworking.h in Headers */, + 2EBAA518CB8B2DAF89A63637091D4615 /* UIButton+AFNetworking.h in Headers */, + 1341A7AC2439CB63D459D32EF985A414 /* UIImage+AFNetworking.h in Headers */, + D5CB999FB5FC80FC126A38AB4DF12227 /* UIImageView+AFNetworking.h in Headers */, + 5719F06B809080CDEF7E6BC75DEA1A3C /* UIKit+AFNetworking.h in Headers */, + B40756412613B53C80EE77C4C223990F /* UIProgressView+AFNetworking.h in Headers */, + F099E5987DD80E8D78E909AF81D3C587 /* UIRefreshControl+AFNetworking.h in Headers */, + 8958F2453EEBAF71BFEBD78FB48986EC /* UIWebView+AFNetworking.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 110BC916D84EA57ADB20350EB9808DAD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + BFF2AC41197FF448F673DC4553D5C19E /* BATextView.h in Headers */, + 55536A434B4BC0B1EE8BD1FDCD94192C /* UITextView+BAKit.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1B1D84BCA4F7BDAE79C37DF88C9DCE23 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + EA321C98029015AA4895C0B26891D8F8 /* MBProgressHUD.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 38CBD2ACA8057E43CA9E05F823983504 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DE57956D7C2887A24CF1AA7F829241B1 /* BAButton.h in Headers */, + 2224AA0C0EA1CFBAB4B35B1B29263871 /* BANetManager.h in Headers */, + 0208035EB2AA19980BF5A73C26F9A03E /* BANetManagerCache.h in Headers */, + 4C2F00BEDCAF6C8363EFBE8B373985AE /* UIImage+CompressImage.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 34509A2745482CFBCF03BAAFEA0DAE4E /* Headers */ = { + 3BB32FFA9CFEC89EF803C6A9C28804EC /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C10291D821E77E019EC760D33F1DAB2B /* MJRefresh.h in Headers */, - 2D7FBA552B3CED667D78641BD3DEF96C /* MJRefreshAutoFooter.h in Headers */, - 6D40913F14E30C5027EDB1E8E5267456 /* MJRefreshAutoGifFooter.h in Headers */, - 820AE72EE18049DB0D39950065ABA727 /* MJRefreshAutoNormalFooter.h in Headers */, - 60B872A80D2C7EC0A342F16970BF22BB /* MJRefreshAutoStateFooter.h in Headers */, - 1750E8156D634B9DCFCBDF366430F326 /* MJRefreshBackFooter.h in Headers */, - 729824F7571ED25599AD2A5E1E831189 /* MJRefreshBackGifFooter.h in Headers */, - 69E1CE5225A654934B2A36CCEECD0F82 /* MJRefreshBackNormalFooter.h in Headers */, - 8355E9060CF4352ED0E21569A6FED32F /* MJRefreshBackStateFooter.h in Headers */, - 1E88082E67EECA1458FA24BBF7677908 /* MJRefreshComponent.h in Headers */, - 6401732D299AF2E66A86932AC8BB931D /* MJRefreshConst.h in Headers */, - 401E263227EC555D61B8BBB94ED09D73 /* MJRefreshFooter.h in Headers */, - 6ACE435B71030CD770DECAA65380285F /* MJRefreshGifHeader.h in Headers */, - 881AB1EA374C9358F2A83F1D835D1B35 /* MJRefreshHeader.h in Headers */, - 4A55E2CB58A23956EF1822F5A6DF5F2C /* MJRefreshNormalHeader.h in Headers */, - 9347B960A275D7EEF8F79F348578B45D /* MJRefreshStateHeader.h in Headers */, - 832385F31AACCFABD48F783C577C8785 /* NSBundle+MJRefresh.h in Headers */, - 7BB5FA5A44FBC13830AE9E7731A38D7F /* UIScrollView+MJExtension.h in Headers */, - 4C359B72D6BDE27D946D1B4D5A22DE00 /* UIScrollView+MJRefresh.h in Headers */, - B10A64BAF7708212BEE77303B46759A0 /* UIView+MJExtension.h in Headers */, + 28B30D7AF077B7BBD7361FB6AC3AA2BC /* IQBarButtonItem.h in Headers */, + 71DFF4FCF490E7C2983380C32C3E05A6 /* IQKeyboardManager.h in Headers */, + D5B7D8C76ECDAE3675FED3DDD52A1A1F /* IQKeyboardManagerConstants.h in Headers */, + 35773004282D2825DD45C3EF9B32C21F /* IQKeyboardManagerConstantsInternal.h in Headers */, + 1A12AC09DAEE727DBD9D111A2B098516 /* IQKeyboardReturnKeyHandler.h in Headers */, + 3037AB601C885680CFEA52F0D9BFF3B6 /* IQNSArray+Sort.h in Headers */, + 43643239F78BFE4405AD5092ACC1B176 /* IQPreviousNextView.h in Headers */, + 53E16175D3F285FCD0AA297379790B78 /* IQTextView.h in Headers */, + F88EBCF213D5CDC9DD9761F38AC8851A /* IQTitleBarButtonItem.h in Headers */, + 4A49D2D82248088CA84188952B9E69BA /* IQToolbar.h in Headers */, + 82BA014C81EE79BD7F043D96AB562DB6 /* IQUIScrollView+Additions.h in Headers */, + 17045EA58EB53C66039B73AFDA4BB11F /* IQUITextFieldView+Additions.h in Headers */, + 612D7698019865805EFC789DCE5858AF /* IQUIView+Hierarchy.h in Headers */, + 08C263DF6F9031C2ED55A0D16722652A /* IQUIView+IQKeyboardToolbar.h in Headers */, + F02320ABC117E8ACC68CA867458B20F5 /* IQUIViewController+Additions.h in Headers */, + 5A2FF5F16ABBFABA5EC18B9AF230429E /* IQUIWindow+Hierarchy.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3DBF6EB7DA121BD0CA7AE1E53E312A04 /* Headers */ = { + 3CA0BD05EE1B89D3057A7139E82930DD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 419DA9897DEA0DF0FE6AB4A5523B8FE1 /* UIImage+RoundedCorner.h in Headers */, - E50D12E543FA3A846A02064E1D428761 /* UIView+RoundedCorner.h in Headers */, + 318BD24B1B9DCB183FF8D9C7B1ADEA97 /* BAKit_PickerView.h in Headers */, + 09E2D8F0ED0592C82A667F1A32957445 /* BAPickView_Config.h in Headers */, + 434F1BC8A60BCEA041F1A564194EC87C /* BAPickView_OC.h in Headers */, + 698931FC082239ACB64F331F831B076D /* NSDate+BAKit.h in Headers */, + 90C8D76B0E95CE0FA5E809D88852EA33 /* NSDateFormatter+BAKit.h in Headers */, + BB6727D28D7F8DE18E35DA7984DA8364 /* UIView+BAAnimation.h in Headers */, + 5B0F9E50ABC298DEB44CF52A26A87EE4 /* UIView+BARectCorner.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 50D1D9E77C044237C91A8F28E003E3D3 /* Headers */ = { + 423C1B480E8CD5D05EF4A739862A7852 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 89A601652839C7EE66DE9780D80CAD75 /* MLeakedObjectProxy.h in Headers */, - 2F256EE9E2E8BA34E7FF30CCC389FC68 /* MLeaksFinder.h in Headers */, - 87B4FA22305BCD40330ED17A2051850E /* MLeaksMessenger.h in Headers */, - 1E751FC35B22B2B304F73C9688029FE0 /* NSObject+MemoryLeak.h in Headers */, - E838A33AF16A8BD693037E7C2A54B02D /* UIApplication+MemoryLeak.h in Headers */, - B016FF2487BB74DD2F324ECA623F6CB7 /* UINavigationController+MemoryLeak.h in Headers */, - 348F552E5662196122424C1970EB40CA /* UIPageViewController+MemoryLeak.h in Headers */, - 4778F9B01748F1471E4B703346451961 /* UISplitViewController+MemoryLeak.h in Headers */, - FE39078A70D6214069FDD2C2B240FB77 /* UITabBarController+MemoryLeak.h in Headers */, - D308BACE4CEDFB04396668A9050DFC13 /* UIView+MemoryLeak.h in Headers */, - EEEDE915DA1014F06CAF97FCE00E5AD0 /* UIViewController+MemoryLeak.h in Headers */, + A563471FD2DC868AD5CD6550E48EAC6E /* SDAutoLayout.h in Headers */, + 910388D9B7DB12B52E86A0D49AE2C786 /* UITableView+SDAutoTableViewCellHeight.h in Headers */, + 3500BFC1B349FD37291B8E3F4A57C32C /* UIView+SDAutoLayout.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 657D857047A6A935B5A2E9BD049194F2 /* Headers */ = { + 4697834E9747B6B5790811BFCBE093A2 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 99D8C610BC84BE231C5D3D280F3B12AF /* MASCompositeConstraint.h in Headers */, - B2B7C90BA9C4DBD9851C75AC801B0E8E /* MASConstraint+Private.h in Headers */, - 2905381350CEFFBFFA9BC8B5D027F190 /* MASConstraint.h in Headers */, - EC6CCC98505D2067BC98B4E6223C9DF8 /* MASConstraintMaker.h in Headers */, - C6EE194D232E9FE87097C0F1DF91B9FA /* MASLayoutConstraint.h in Headers */, - 9205037BA8C22574B33FC96C5EA829A3 /* Masonry.h in Headers */, - FF682E8B083BAEBBDF38C52D89D45E37 /* MASUtilities.h in Headers */, - 3F63C119F95A6735AE627BBB1BEBC4B1 /* MASViewAttribute.h in Headers */, - EB02AEF303313F801392DE8D90AFF0F7 /* MASViewConstraint.h in Headers */, - FD39EBE3398E1A99965AC003B273450D /* NSArray+MASAdditions.h in Headers */, - A7D31BD1F3AD4ED4612467FAD332F388 /* NSArray+MASShorthandAdditions.h in Headers */, - 2979E54C4AFD27076576E82ADEED2F00 /* NSLayoutConstraint+MASDebugAdditions.h in Headers */, - DD1F717B0527C71229B3339324E35E55 /* View+MASAdditions.h in Headers */, - 432BD50F1E699EDF2EA007E850FFCEF7 /* View+MASShorthandAdditions.h in Headers */, - 331718BFB4A91CFFE026492905231562 /* ViewController+MASAdditions.h in Headers */, + D8760B9674AEF13DDE8E9653EABA23C2 /* MLeakedObjectProxy.h in Headers */, + EACEC6F4009C4374A9041907300AD7D6 /* MLeaksFinder.h in Headers */, + 564C355AC932F4CA88A75E1F428557D0 /* MLeaksMessenger.h in Headers */, + F2B1873F3C7CFD66578CF42B6C51BF04 /* NSObject+MemoryLeak.h in Headers */, + 2DBB2C804B04B105AFBC65BD957EB4EC /* UIApplication+MemoryLeak.h in Headers */, + 17BC1848666973B0308253F04C70F0BF /* UINavigationController+MemoryLeak.h in Headers */, + A1EAE5E58D9F2040BACBB482211EA611 /* UIPageViewController+MemoryLeak.h in Headers */, + E2E27D0D8EFC3DBFB31EB805A9F40F46 /* UISplitViewController+MemoryLeak.h in Headers */, + 713927C8C7FA28F971FD5292555D3EC9 /* UITabBarController+MemoryLeak.h in Headers */, + 4C19EA5D51CE0CD0A47DA12FF723BA07 /* UITouch+MemoryLeak.h in Headers */, + 50B17934049197212C6158A0C8DABD81 /* UIView+MemoryLeak.h in Headers */, + D145F5C81176E920E1CE462D4B50D88D /* UIViewController+MemoryLeak.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6BD44620AD6ABCB29E838A6C3A20B13D /* Headers */ = { + 4B8579746E0863BFF2135C8EA4D3FCC9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 66E0A7A6952653601E737DADD388541D /* FBMemoryProfiler.h in Headers */, - FD00F42C2210FD2524AE0636DC9AEDEB /* FBMemoryProfilerContainerViewController.h in Headers */, - 72540129597F65A1C93A1406894EE6BD /* FBMemoryProfilerDataSource.h in Headers */, - DB44790F7228F78EDE7FEBE39BE219E3 /* FBMemoryProfilerDeviceUtils.h in Headers */, - 9F7B4BB3FBBAF22CA25B3AAB519C07DA /* FBMemoryProfilerFloatingButtonController.h in Headers */, - F4A7718305727E8F73BB52E12A7817FB /* FBMemoryProfilerGenerationsSectionHeaderView.h in Headers */, - 93DD4B66C78639F12869052BF2358CDB /* FBMemoryProfilerMathUtils.h in Headers */, - A4E36E6C4FA07570E0953FC0B56B90E1 /* FBMemoryProfilerMovableViewController.h in Headers */, - 6D26CBA51614172CC58CB6584C0C58AD /* FBMemoryProfilerOptions.h in Headers */, - CB5928A0D4F59D8F09230DA3FAFA5C11 /* FBMemoryProfilerPluggable.h in Headers */, - 8C5D3488FF8EED0D3450C2DD37D02ECD /* FBMemoryProfilerPresentationModeDelegate.h in Headers */, - AC132C9560C2B1DDCF3AB256BD361A60 /* FBMemoryProfilerPresenting.h in Headers */, - B7B5D5AFF2A3B9C77C09E08BA520DBC3 /* FBMemoryProfilerSectionHeaderDelegate.h in Headers */, - 52D2FD213D49135B77A6F0DD43BD69B4 /* FBMemoryProfilerSegmentedControl.h in Headers */, - 99D3C5BDD5F47C3E7EBED92F9B91ED28 /* FBMemoryProfilerTextField.h in Headers */, - 6FF9531FBDD71A64E4B526F0F12C3040 /* FBMemoryProfilerView.h in Headers */, - 41EF6D150DF59842B789CFDFA5E6CBD4 /* FBMemoryProfilerViewController.h in Headers */, - C9884CE8C0A22E6F6AFE867AC31716FB /* FBMemoryProfilerWindow.h in Headers */, - 9D4833EF218C3111CF304FF6FFCC8AD0 /* FBMemoryProfilerWindowTouchesHandling.h in Headers */, - 7DD6A9FA4088C1105AA24E166FFA2DE1 /* FBRetainCycleAnalysisCache.h in Headers */, - 1AA584F301D6BC0012E168F0F0BA851D /* FBRetainCyclePresenter.h in Headers */, - 1AC7C3A74405C96F3AC6003D9BAAEDFD /* FBSingleRetainCycleViewController.h in Headers */, + 8B9A16752EC196AE20C518DEAD49AEDB /* MKAnnotationView+RACSignalSupport.h in Headers */, + 768CD4934A23B51DA213BF82E6B6D449 /* NSArray+RACSequenceAdditions.h in Headers */, + F2CB6CD10C6CFEE79A97469FD90E2439 /* NSData+RACSupport.h in Headers */, + 3735A8F00A2F14E2CC1AF9DBCB0204ED /* NSDictionary+RACSequenceAdditions.h in Headers */, + 92CB97FFD0D038C5BABE4DB06CA7BCB0 /* NSEnumerator+RACSequenceAdditions.h in Headers */, + 3E8181D81B4A0AF638056FA9EE8EF2BA /* NSFileHandle+RACSupport.h in Headers */, + C1B31690BC5CAE796DEB99FC35F5B70F /* NSIndexSet+RACSequenceAdditions.h in Headers */, + 95D9BE365F88F3E6647892440A46B77E /* NSInvocation+RACTypeParsing.h in Headers */, + 32CE86A55755C33212B96E92DF548297 /* NSNotificationCenter+RACSupport.h in Headers */, + 326927CAFD6998E858E504D0131E7717 /* NSObject+RACDeallocating.h in Headers */, + 4E1EBB47F6877FD897DA05D12B814B41 /* NSObject+RACDescription.h in Headers */, + 23C101C10FF5ECC8FE29078BAB3E0FE8 /* NSObject+RACKVOWrapper.h in Headers */, + A906E9E7472BA4B9EB9C72F6F317EE7D /* NSObject+RACLifting.h in Headers */, + 711267B481D8B91410F4D9E7A631EEEC /* NSObject+RACPropertySubscribing.h in Headers */, + A4673AAFCC562A2429C9CCEBAD970582 /* NSObject+RACSelectorSignal.h in Headers */, + 06F464B11B1FD100EE03EFE6D907AE7B /* NSOrderedSet+RACSequenceAdditions.h in Headers */, + 8FFB4BCE843B1F261E996B0091E27606 /* NSSet+RACSequenceAdditions.h in Headers */, + 9EA434971062D302D44C154CAC9A8D68 /* NSString+RACKeyPathUtilities.h in Headers */, + D216590437651582CA9B654DC07F0738 /* NSString+RACSequenceAdditions.h in Headers */, + BCF3B04D2D97433F32BFBC9DE9D97CBE /* NSString+RACSupport.h in Headers */, + 0FE9916BD7AB951F99C8A586059F8973 /* NSURLConnection+RACSupport.h in Headers */, + 496E1AECA482FEFF59EAD97CD913C9ED /* NSUserDefaults+RACSupport.h in Headers */, + 88C41ADC22C465D75518EA69F57496F8 /* RACAnnotations.h in Headers */, + 73AECD256E14E9CB1BEE2910F414A576 /* RACArraySequence.h in Headers */, + BB6E2FBF8C448CB0D1B8B9C8CC0B426A /* RACBehaviorSubject.h in Headers */, + 4F9EEB7B6227BA240455C8183E34AD31 /* RACBlockTrampoline.h in Headers */, + 85A735234E32D220ACFA55DAF5F60250 /* RACChannel.h in Headers */, + 2F0AA8E23D06411F630E51B9BC7C2E7C /* RACCommand.h in Headers */, + B119DF750B6A6AF6352B3A416E9833AF /* RACCompoundDisposable.h in Headers */, + 55E100C6F1202EFF14CD1D9CA73E6CA1 /* RACDelegateProxy.h in Headers */, + B5D5CEBD7958C2B6F44BEB0365F84878 /* RACDisposable.h in Headers */, + A00760B0ADDC18EE7A9059D5D06DEC8D /* RACDynamicSequence.h in Headers */, + BF279CD1A148F5DCCDC2B6CDC4406682 /* RACDynamicSignal.h in Headers */, + 7285BC629A75B39B9DB7061D285C79E1 /* RACEagerSequence.h in Headers */, + E9ADC2F08FD25B7881FDECC7EA78A70B /* RACEmptySequence.h in Headers */, + DAEDD041193BF71C3FA970DEB859EB33 /* RACEmptySignal.h in Headers */, + 21647889CC6757FA0040069F72B0782C /* RACErrorSignal.h in Headers */, + 215D777D7566FBBCDA6020A747A79C6E /* RACEvent.h in Headers */, + DE4F35E25C347D342D1EAA3739ADED2B /* RACEXTKeyPathCoding.h in Headers */, + EE0863A6578DD6F1C0AC7EA92D37A41E /* RACEXTRuntimeExtensions.h in Headers */, + 40DA4EEA0E1BC3C5D3200A9B90BC69A8 /* RACEXTScope.h in Headers */, + 820459CD178B77B552D286F094DE0B43 /* RACGroupedSignal.h in Headers */, + E92DD35C8BD30188DD5D34B36AF83CC8 /* RACImmediateScheduler.h in Headers */, + 888C19B07487841701EE49C8B95F30BF /* RACIndexSetSequence.h in Headers */, + EE5E7E22AB24130DA900363225BF4091 /* RACKVOChannel.h in Headers */, + C9AF959052F52EE5872D84966C01C183 /* RACKVOProxy.h in Headers */, + A881DE880F47B67A1FB7743A84C4E675 /* RACKVOTrampoline.h in Headers */, + A5C29FCEFB79434D96EB5F4DCC7CB883 /* RACmetamacros.h in Headers */, + C35D13E483AC7E6AAF30EDA13DD2F840 /* RACMulticastConnection+Private.h in Headers */, + DD9FFEF9FC2BE383CD0EBECFAF3A1C29 /* RACMulticastConnection.h in Headers */, + 1A21BBE19AA71582C8E44A5549CA28BC /* RACPassthroughSubscriber.h in Headers */, + D2260EF6B75C467EA376C70986B33602 /* RACQueueScheduler+Subclass.h in Headers */, + 3FA97B3E7DB4506B27097B6BEA18E6B2 /* RACQueueScheduler.h in Headers */, + 4058490286340DD8F35B782988B62DA9 /* RACReplaySubject.h in Headers */, + 85CC88BF2A94A02880B862A6501B2C1D /* RACReturnSignal.h in Headers */, + 68AE61CFF3786AA315960308C04C5CB8 /* RACScheduler+Private.h in Headers */, + 907178269A8169EB6FE7C9F082BADEF7 /* RACScheduler+Subclass.h in Headers */, + 70466468CE4673A8FA094386A43F7C43 /* RACScheduler.h in Headers */, + 3441FD49260098D9A3C6EC9B99C27E24 /* RACScopedDisposable.h in Headers */, + F084040D7B1CB303848EE1785157198C /* RACSequence.h in Headers */, + 5DBEE0B7F6DD9A8CE0DD449879B81D52 /* RACSerialDisposable.h in Headers */, + 7D110B14A1C00B852FFBD4102B6E66A1 /* RACSignal+Operations.h in Headers */, + 06014790C52BDB833DD91E2EA31C57CC /* RACSignal.h in Headers */, + 5893119644C74B86BB1A78997930A7C2 /* RACSignalSequence.h in Headers */, + B7F9309770F7330BD4693E264C395B93 /* RACStream+Private.h in Headers */, + E178C757CEB7B7D459841D30EE75D227 /* RACStream.h in Headers */, + C41C8DD9B5EFB8867DC2C7293D6CCC10 /* RACStringSequence.h in Headers */, + 0CBEA00CFEA3CFC43B5584BBB5AD15C5 /* RACSubject.h in Headers */, + A8511C86C70830EA57DFD7A1D83B4668 /* RACSubscriber+Private.h in Headers */, + AEA8EC22BC3946FBA4AF9FA4FCDEDE69 /* RACSubscriber.h in Headers */, + 3018EE59839005688A2865CCD3167680 /* RACSubscriptingAssignmentTrampoline.h in Headers */, + 524CCDCA583F6EB7864DA85CFDD2FA91 /* RACSubscriptionScheduler.h in Headers */, + 5651B5D1C3CC197BBC4E60B0486907B4 /* RACTargetQueueScheduler.h in Headers */, + 0EA01C3F1131E46085C373D9F037001F /* RACTestScheduler.h in Headers */, + 5384B3D4220177C54920CD90B667C14B /* RACTuple.h in Headers */, + 75410390D1EEB08A839FA543A08DE221 /* RACTupleSequence.h in Headers */, + 5C1A8BDA259349464ED5CDCE43FD51AA /* RACUnarySequence.h in Headers */, + AC2EDF67D16BDE8184310AC75138FDF3 /* RACUnit.h in Headers */, + 76216E6D51359619A86400BCFDB05A52 /* RACValueTransformer.h in Headers */, + 1BD6CBE4BFD9590D423C20A3A76B8C24 /* ReactiveObjC.h in Headers */, + 3254A0868C2064A507F6FD2042728CFC /* UIActionSheet+RACSignalSupport.h in Headers */, + 2326B72C6DDF90461B96D803AB0E718F /* UIAlertView+RACSignalSupport.h in Headers */, + EA03C058ABBF9DE06CC094EA630A6588 /* UIBarButtonItem+RACCommandSupport.h in Headers */, + A288D6376DF56482903F0C7080C78E44 /* UIButton+RACCommandSupport.h in Headers */, + 00C90D2CC7B601460E02DA15E0B14CEF /* UICollectionReusableView+RACSignalSupport.h in Headers */, + F3D9846F6653C84EC501DC04AFD47804 /* UIControl+RACSignalSupport.h in Headers */, + 6821259F4B0EA9B89D5D09E98B1D1AA1 /* UIControl+RACSignalSupportPrivate.h in Headers */, + 3D761EFC3010510CCDA246DD4ACD8C95 /* UIDatePicker+RACSignalSupport.h in Headers */, + 4F0C30DDEA8015AC0C2ACF001680ED93 /* UIGestureRecognizer+RACSignalSupport.h in Headers */, + 10E8B477B3EFF4BD97B2F86DE4BA0481 /* UIImagePickerController+RACSignalSupport.h in Headers */, + 4425D9F9A5CD1EACFE51568A15A3AEEE /* UIRefreshControl+RACCommandSupport.h in Headers */, + B8B3AD7B87C38807CFC02F6A9D5C755D /* UISegmentedControl+RACSignalSupport.h in Headers */, + 1713E141F1DA7E7EC40AB8236D2811EF /* UISlider+RACSignalSupport.h in Headers */, + 75439029BC47FE84FF09B314AC948570 /* UIStepper+RACSignalSupport.h in Headers */, + 3209214BDEE62D6A14BD122EA403E3FD /* UISwitch+RACSignalSupport.h in Headers */, + 5140B47E9F36B49A1565B2DBB70372AF /* UITableViewCell+RACSignalSupport.h in Headers */, + 388DEECFB480603D294F7E854FA5CFFA /* UITableViewHeaderFooterView+RACSignalSupport.h in Headers */, + 28B9AD50225490AA3D8EC93C02702FD1 /* UITextField+RACSignalSupport.h in Headers */, + 0F58D27F3B89D6745B7B5C689F24D844 /* UITextView+RACSignalSupport.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 73B1B961C32CEB9723CCC7CDBADC2A68 /* Headers */ = { + 864D7FF60E899EA81A55C0B7F82FC174 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 2F83CAFE70F514D552676227BB4A404C /* NSData+ImageContentType.h in Headers */, - 472A06CDF9C801074C35F7764CB235A1 /* SDImageCache.h in Headers */, - 298D697789B1AD05F58063A57A24BD33 /* SDWebImageCompat.h in Headers */, - 0232AFC8527610445D2AE3EE8DC9EEE1 /* SDWebImageDecoder.h in Headers */, - A61612C5AD7959D2952A03B68BB9F493 /* SDWebImageDownloader.h in Headers */, - 6A2B3F5556C6ED7D2561C0E644545A67 /* SDWebImageDownloaderOperation.h in Headers */, - 070A9D81A8DDACB75FC5B58FE31DC01E /* SDWebImageManager.h in Headers */, - 9C33ABEEA3669D92CBC0946D20528659 /* SDWebImageOperation.h in Headers */, - FFA2267B5FB24E6E9D37D56DBF06F4CA /* SDWebImagePrefetcher.h in Headers */, - A01B6978660551BA9BA8E1CF088E8ACC /* UIButton+WebCache.h in Headers */, - 0C28C7FF90A263CDAE9C9487ECBB0E94 /* UIImage+GIF.h in Headers */, - 494C17BD48C41F29F889ECC0BD466687 /* UIImage+MultiFormat.h in Headers */, - 8A1E281F2784BF7FB67B45BBA9BD7C82 /* UIImageView+HighlightedWebCache.h in Headers */, - E1FF22B300A27983D415780BFCA3A9EC /* UIImageView+WebCache.h in Headers */, - 0E09DAAEE47B37EA8E57D5CF715DBDA3 /* UIView+WebCacheOperation.h in Headers */, + 4CC9C69E797A8B66E96A7A1C1B1B51CC /* MJExtension.h in Headers */, + D7BF4DBA76F12C797027E90648D9AEE0 /* MJExtensionConst.h in Headers */, + 92937DC066543122186195A2941D3C60 /* MJFoundation.h in Headers */, + 1F8FEA93407CEC682A2C0C282CDEAD89 /* MJProperty.h in Headers */, + 4C6BFB4C1F6CF71C99E1FB270F0FEDAF /* MJPropertyKey.h in Headers */, + 52BA5ED3898FD3C7571E9B74782158A5 /* MJPropertyType.h in Headers */, + B915E3CFDFBA7B99411BC5430162868F /* NSObject+MJClass.h in Headers */, + CBA073485222F5F656AAF745EB499742 /* NSObject+MJCoding.h in Headers */, + 2357DDC85500B4F45E37E411B596F562 /* NSObject+MJKeyValue.h in Headers */, + DD0AA9E8B308E45F90AD7A01F8BBC4DC /* NSObject+MJProperty.h in Headers */, + DBDCE948DF1D74806D9D319F636A0E8B /* NSString+MJExtension.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 84BD82A17F5FBBACCD570B1807C4B329 /* Headers */ = { + 9077FD721AC492135E5F3B9A67F65E6E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - ADD5E90375D7A0A16EDBAA25E100FAA6 /* _YYWebImageSetter.h in Headers */, - 04E4378CD31ABC4370E6794E529EEC1D /* CALayer+YYAdd.h in Headers */, - 3DDBF272E8CDFCBA7878E8A552E6A291 /* CALayer+YYWebImage.h in Headers */, - FBED53C806353BB69FFBEDADFED1D418 /* MKAnnotationView+YYWebImage.h in Headers */, - BC2E35D7E3F56E7592CAF577B9E657AA /* NSArray+YYAdd.h in Headers */, - C6CAF5151F48A15E1B90EA2FC5EED6E0 /* NSAttributedString+YYText.h in Headers */, - 53181BA474ACF31FD44C6168F829E728 /* NSBundle+YYAdd.h in Headers */, - 67C5E43EBE2877AD3B4E94A451163AF3 /* NSData+YYAdd.h in Headers */, - B3619866A9F9AA1849CB510535CC991D /* NSDate+YYAdd.h in Headers */, - 9186611FCFEEAEE562D1EF33294EEF65 /* NSDictionary+YYAdd.h in Headers */, - E8724F7D8D0A810B231E65F0B93EA0B3 /* NSKeyedUnarchiver+YYAdd.h in Headers */, - 43C2855DEABCEB6AC756D1846AECB766 /* NSNotificationCenter+YYAdd.h in Headers */, - ADB8F0C1C148193285ED7C5A45717B55 /* NSNumber+YYAdd.h in Headers */, - 761C55AFBFD10BE0380B5552105C7CD2 /* NSObject+YYAdd.h in Headers */, - EECCF6D4F814D2002ED1CF27B3DE43B0 /* NSObject+YYAddForARC.h in Headers */, - AEBEBBD498A995A70DCE63834A1593B3 /* NSObject+YYAddForKVO.h in Headers */, - DCAF444BB8A5C3E446377587333F7415 /* NSObject+YYModel.h in Headers */, - 12D90D3667090B1EF261E0D5E075DA7D /* NSParagraphStyle+YYText.h in Headers */, - 3650C584B834268677A8F4C6B259761A /* NSString+YYAdd.h in Headers */, - 95B90C7B79E0E209A54E94F4C87DBDF5 /* NSThread+YYAdd.h in Headers */, - 41DBC560AB3DCD85C4152E417F0D8D84 /* NSTimer+YYAdd.h in Headers */, - B69BEB9B9DF6E63A34C856E63E2863ED /* UIApplication+YYAdd.h in Headers */, - 76FBD5B638A942B208EB681CADD4767D /* UIBarButtonItem+YYAdd.h in Headers */, - A8862580C4E8DC547108E3BBB60179B5 /* UIBezierPath+YYAdd.h in Headers */, - 2224DF25740387536B47C8303A1EB43E /* UIButton+YYWebImage.h in Headers */, - 9AA13D08A7BEB08C03706041D04B698B /* UIColor+YYAdd.h in Headers */, - 286C497DEFE756B68941590057A91030 /* UIControl+YYAdd.h in Headers */, - FF3C232E71E4C6A60F7A3877FC6A162D /* UIDevice+YYAdd.h in Headers */, - 2758709BC359AC175CDB336F1F839633 /* UIFont+YYAdd.h in Headers */, - 4B6CA4C3C1D6D595C6468009E4A81904 /* UIGestureRecognizer+YYAdd.h in Headers */, - 21540533D941A9A70D5F3F51EE7F84B5 /* UIImage+YYAdd.h in Headers */, - 7062F4455FBC488E3D004C79AABD93C2 /* UIImageView+YYWebImage.h in Headers */, - EE4E6C1BC29493BF3A669389D9ACDC67 /* UIPasteboard+YYText.h in Headers */, - C9A7A72AB5C44A7D593BF0530B137A3A /* UIScreen+YYAdd.h in Headers */, - 2ADCAA69B7B2AD44E140926DFB464239 /* UIScrollView+YYAdd.h in Headers */, - 7424067A8CACE3DB2A66EB68005982A6 /* UITableView+YYAdd.h in Headers */, - F2D51A804FCAE5C19E2056E56F191CA1 /* UITextField+YYAdd.h in Headers */, - 2FE39C0008CB689DE5CDCCB4A4929820 /* UIView+YYAdd.h in Headers */, - A6296D65054CD8FF3B2421B4F34C7A7B /* YYAnimatedImageView.h in Headers */, - F35B33F703C287C3C485A77CEE74897E /* YYAsyncLayer.h in Headers */, - 3167BFE069882992E2B9402CFBAEB982 /* YYCache.h in Headers */, - 33880EC1770302F409C5DE019B09B2BD /* YYCGUtilities.h in Headers */, - 3465C3C047956110FBB9E8EB020EDDDF /* YYClassInfo.h in Headers */, - BB13B238DA41C20BFEE24B7E6EDEDA70 /* YYDiskCache.h in Headers */, - 406BFD75951518E6FD0A4F10CBD93254 /* YYDispatchQueuePool.h in Headers */, - CC7D94532BCA6EA7B19872CBD118314A /* YYFileHash.h in Headers */, - C569F8F13F620D581269D19A6768C1FD /* YYFrameImage.h in Headers */, - 7621053CD7DDD9A87EF89AC8870D6761 /* YYGestureRecognizer.h in Headers */, - 0B77D000D11EE22180E186FAF868BFE8 /* YYImage.h in Headers */, - A2D515F8E13BB36CA575C018AC2E15C2 /* YYImageCache.h in Headers */, - 8A47F85A2C8AC713A32E871507E0071D /* YYImageCoder.h in Headers */, - C80D7C6DAC57742A60BCA92C85C5940F /* YYKeychain.h in Headers */, - 7DCC8A91701C7CEB5DFBF5030E918EA4 /* YYKit.h in Headers */, - 42AB8E601C83D14E8DE88DC98DF14326 /* YYKitMacro.h in Headers */, - 463739553893671B1BEA2E5AEC315D53 /* YYKVStorage.h in Headers */, - 65C9BD1E2E608768ED705A63235FC497 /* YYLabel.h in Headers */, - 37264B40140B388AA1130F9E7656C14F /* YYMemoryCache.h in Headers */, - D6841078C9D934FFA7AFA2DF323162E9 /* YYReachability.h in Headers */, - A0FF6FFCC8E7307C10103FD7AC6970E2 /* YYSentinel.h in Headers */, - 23FC2C390CCEBD27E6B7F1F16E370E75 /* YYSpriteSheetImage.h in Headers */, - 57F8A490472C6334FF1020372A3C9D0B /* YYTextArchiver.h in Headers */, - 7FC9781076EFD2FF3264F474089D6637 /* YYTextAttribute.h in Headers */, - FF0909447E18818BD3AF878F47DB435E /* YYTextContainerView.h in Headers */, - FCE2848D848F1646E37FAA8320D725BA /* YYTextDebugOption.h in Headers */, - D6F66D873FC39935F02EC41295C5DCD2 /* YYTextEffectWindow.h in Headers */, - 3B1106E8F7240255F564CA89DE1254B5 /* YYTextInput.h in Headers */, - 4CF12EE8FFA7E2E58665D838C0318D40 /* YYTextKeyboardManager.h in Headers */, - CA7B48B591CB1257A8468C8897138358 /* YYTextLayout.h in Headers */, - 23D376C1DB24F3C16D9ECDD09DB1B111 /* YYTextLine.h in Headers */, - 073B38C4ACF5293933CFAAE30141E27F /* YYTextMagnifier.h in Headers */, - 5E58BEC63EC00395969B5504E63A51AF /* YYTextParser.h in Headers */, - 137F34842F332C539BBBBE525F383183 /* YYTextRubyAnnotation.h in Headers */, - 0766686B5BF862B61E4C338AD8ADA185 /* YYTextRunDelegate.h in Headers */, - C385CD3667D28D9E8631067A052570B8 /* YYTextSelectionView.h in Headers */, - 86ED92B7BDB245B5DB78FE58091F6795 /* YYTextUtilities.h in Headers */, - DF44728D73567A6EF536F40F8A0E33CA /* YYTextView.h in Headers */, - A27D8D778B368E2F137FF980CA0614B0 /* YYThreadSafeArray.h in Headers */, - C303254DF24B7C14DA47F53252B4F616 /* YYThreadSafeDictionary.h in Headers */, - 78BA4C84514B073A0063AEBD1B8D6A83 /* YYTimer.h in Headers */, - 1885895131984E055ED6B984CCFD5AF2 /* YYTransaction.h in Headers */, - BDA1BEC0C08EC41FE116540EC96364C6 /* YYWeakProxy.h in Headers */, - F76B2D834D073963258CC62C64D09766 /* YYWebImageManager.h in Headers */, - 345B4200BB80FAC8543D82A17648A770 /* YYWebImageOperation.h in Headers */, + 8C9CE91BC3C17B920AE1AF53660852DE /* UIScrollView+EmptyDataSet.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 87ADBE052629116471EB35E69D448170 /* Headers */ = { + 9AA9D01F59888A179F3ADF0AE9349E71 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 97E57B0E252F365076EC37B240551BFB /* WebViewJavascriptBridge.h in Headers */, - AF31C947F53866CC922DBC37284AD46F /* WebViewJavascriptBridge_JS.h in Headers */, - F7DF2278950FD397FD19D86DBCFD1E59 /* WebViewJavascriptBridgeBase.h in Headers */, - 032A6C8B7A0E1DAEC294BE47AD3EE159 /* WKWebViewJavascriptBridge.h in Headers */, + D05C186B37384E7A65270AA3BB88E0B3 /* BAKit_DeviceModel.h in Headers */, + BF744BA669C583B52C7E29309759186A /* BAKit_TouchID.h in Headers */, + CDF1320392E5C8072B165CA0C372DC2A /* BATouchID.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9F9FD509AAD735AC4AB664BAA7649312 /* Headers */ = { + A93D3ABB603D66C647446B37AA29FE64 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 8517BE33C254EE906D831579DD8C72B3 /* A2BlockInvocation.h in Headers */, - 0692E35064349B6FA8C1EFD50B7B1F45 /* A2DynamicDelegate.h in Headers */, - 1FACCDACF70A7AF5AAED0F35D9AC0642 /* BKMacros.h in Headers */, - D7AFF4F4AA1900F1FDD8CCC28367CD1C /* BlocksKit+MessageUI.h in Headers */, - C2BFF405BE0AEE5C66C90E6FD8B10415 /* BlocksKit+UIKit.h in Headers */, - BE2BE12ECE566C14238DD7845DEDD84B /* BlocksKit.h in Headers */, - EF87B1AB7825C0B9244F364CEAC1EF31 /* MFMailComposeViewController+BlocksKit.h in Headers */, - 33C43B6C020C6A9CC4EE5C22650C550E /* MFMessageComposeViewController+BlocksKit.h in Headers */, - 28A0BEDF1DB5E178DEAF1D03F718557B /* NSArray+BlocksKit.h in Headers */, - D9D88ED515332296D0EE0C7129EDAAA0 /* NSCache+BlocksKit.h in Headers */, - A5DBFF76EDEC1BCDA0351DCE8407ACA9 /* NSDictionary+BlocksKit.h in Headers */, - 3CF5DE3EC202C9678B0120CB3CC93FE3 /* NSIndexSet+BlocksKit.h in Headers */, - C9B6328F023FF633ABA6879D50FC90DE /* NSInvocation+BlocksKit.h in Headers */, - 1BE7CD118C7601DDD1629547E938ED5E /* NSMutableArray+BlocksKit.h in Headers */, - 9F9CFBD464085524F455C4D19211E69E /* NSMutableDictionary+BlocksKit.h in Headers */, - 3DF2307D736F5A334CC5392A06B142C0 /* NSMutableIndexSet+BlocksKit.h in Headers */, - CC7E36A547AEE6456442AF7F5C60E2F9 /* NSMutableOrderedSet+BlocksKit.h in Headers */, - 03592DBD830EF65C1AE796A0697F46E1 /* NSMutableSet+BlocksKit.h in Headers */, - 484776F8B4CF9A89AA18C6874E246DF6 /* NSObject+A2BlockDelegate.h in Headers */, - EC783E9B9EA9DDFC778E4AA0D5065097 /* NSObject+A2DynamicDelegate.h in Headers */, - 0F0550B889810895B32BCA065DD6CFC4 /* NSObject+BKAssociatedObjects.h in Headers */, - F6516207095BAB4A00C52187CFAD097B /* NSObject+BKBlockExecution.h in Headers */, - C7E0B31A7916AABF23A79CB06E1F5272 /* NSObject+BKBlockObservation.h in Headers */, - A026405E495CA2EFF557A70D1515A689 /* NSOrderedSet+BlocksKit.h in Headers */, - 01149FA585A714569093657B85C1A350 /* NSSet+BlocksKit.h in Headers */, - 58F4C1C349633CE28F242E5FC8518636 /* NSTimer+BlocksKit.h in Headers */, - 423CD981F80732AA6C075F7F633CFBBD /* NSURLConnection+BlocksKit.h in Headers */, - E32DDF26286A2F7F77F8B90754373696 /* UIActionSheet+BlocksKit.h in Headers */, - 5467BA80FE76E5928DBC92FCA8F319DD /* UIAlertView+BlocksKit.h in Headers */, - A229FCF9FEBBF16977B33AB2FEF23830 /* UIBarButtonItem+BlocksKit.h in Headers */, - A1968C04873813D7CEB076FDFCBC479C /* UIControl+BlocksKit.h in Headers */, - B25F8085B440D68735024862A5F6AD9F /* UIGestureRecognizer+BlocksKit.h in Headers */, - 61898DE2259DB9ECC1F23C538FCE7BBB /* UIImagePickerController+BlocksKit.h in Headers */, - 455F71D95890455473B3AF068D2003D1 /* UIPopoverController+BlocksKit.h in Headers */, - 77515111C9AFE11AB1287761150614F5 /* UITextField+BlocksKit.h in Headers */, - F60CAF477B4F4573C02F675C42DFFD2D /* UIView+BlocksKit.h in Headers */, - 12F7B27FB2422AC6413E77B7F98812C4 /* UIWebView+BlocksKit.h in Headers */, + D852415DFD46E85C293E0DDE01868EA2 /* FMDatabase.h in Headers */, + F00CCFAB93A4F18419CD91217B1D5F66 /* FMDatabaseAdditions.h in Headers */, + 2012864C735C3DD88ECE425F6C981F6B /* FMDatabasePool.h in Headers */, + 99714143FA44A34F87D1F2AA6D254177 /* FMDatabaseQueue.h in Headers */, + 889D48A9B81ADF617C1D4E4E9473E3A9 /* FMDB.h in Headers */, + 398A5C11EFB816892FD5E18AD24F03D4 /* FMResultSet.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A32868AC303C3F58C7E10D6F856B6E46 /* Headers */ = { + BCF57EC6DF4DD2736C7C216D9CEB9428 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F290D9B4A7404933D4956C60893577B4 /* FBAllocationTracker.h in Headers */, - 6208247720506002F6481FE29EBB7647 /* FBAllocationTrackerDefines.h in Headers */, - 4CC110CEA5DD89210433C11EEB3EA828 /* FBAllocationTrackerFunctors.h in Headers */, - 04D809491B653AEC2D98D130ED11BEEB /* FBAllocationTrackerGeneration.h in Headers */, - 889EB82162DF2E4E07FB326C99AE444D /* FBAllocationTrackerGenerationManager.h in Headers */, - 71742AEF20E39C14BAFB479128B762C3 /* FBAllocationTrackerHelpers.h in Headers */, - 63E6E87A7E5A4EC78DA016EF5F7000E5 /* FBAllocationTrackerImpl.h in Headers */, - E890B6532DE06B762D5FBBE65CC96658 /* FBAllocationTrackerManager.h in Headers */, - 3C7EBC0661A3D5EC003D315179C1F139 /* FBAllocationTrackerNSZombieSupport.h in Headers */, - 36BFC7E736BCA8233A4004AFC712153A /* FBAllocationTrackerSummary.h in Headers */, - 6C5A6186A6B2B88FB840C2EB6B52025C /* NSObject+FBAllocationTracker.h in Headers */, + 1615F44139A14CEC7C82D546361B0609 /* MJRefresh.h in Headers */, + 7B2ED9E571E4E51168F7157F2EAE6199 /* MJRefreshAutoFooter.h in Headers */, + 0A3A685BD9A56E789E9EA83A1FECBBAE /* MJRefreshAutoGifFooter.h in Headers */, + 85BBFB5F0008B8304BF840AA6449C61F /* MJRefreshAutoNormalFooter.h in Headers */, + FF1B68BB2C26B49D0DB408D77BF73D8C /* MJRefreshAutoStateFooter.h in Headers */, + ADD69BFB0A0F3F7B7E162E410A67CF05 /* MJRefreshBackFooter.h in Headers */, + ED89F1A48BA44D203A2C4B9C6F53AC0B /* MJRefreshBackGifFooter.h in Headers */, + C16FDBA2BC10E28B8D59DE5CCF4758EC /* MJRefreshBackNormalFooter.h in Headers */, + 59CF9E95314C2B98CD4E53BA7FE282E4 /* MJRefreshBackStateFooter.h in Headers */, + 88290D5C90C12F48F09E6AC463737F1F /* MJRefreshComponent.h in Headers */, + 925EBB6CDAA2E17791E1DDCDA62A3375 /* MJRefreshConst.h in Headers */, + 99364D96200D03FC3229E6A956E10ADB /* MJRefreshFooter.h in Headers */, + 95F90F972DFDFBC3E012F069A6E24C33 /* MJRefreshGifHeader.h in Headers */, + 2AC677C7D32F72030B81CA00F24F65FD /* MJRefreshHeader.h in Headers */, + 9DDC888AA9FE29CD96DCB574AF125142 /* MJRefreshNormalHeader.h in Headers */, + 597CEE76562EB4D948504B07655C54D6 /* MJRefreshStateHeader.h in Headers */, + 2B20A7A457F69EA4CFEC2DB9CFB37FC9 /* NSBundle+MJRefresh.h in Headers */, + A67059B6451EE4D4C8827F52621E54A3 /* UIScrollView+MJExtension.h in Headers */, + D91A44E187477241B893D258E3F67A58 /* UIScrollView+MJRefresh.h in Headers */, + F88580E07538A44A13193CA98E37ADCA /* UIView+MJExtension.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A82FF018C3B22B58CCFE5A12F6CCCE3C /* Headers */ = { + BDF73468622762862D2FB76ED4AC0D8E /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 18EB290A51527C1C55C7A950C79B3F32 /* SDAutoLayout.h in Headers */, - FC7E4F4B1969F616D9F25C307B48C970 /* UITableView+SDAutoTableViewCellHeight.h in Headers */, - FD881B0D5C3773188FD9DA82CFF5D151 /* UIView+SDAutoLayout.h in Headers */, + 01E09711F001C49F92A97060414E262B /* MASCompositeConstraint.h in Headers */, + 4CBE1B46550A3FB90FDD1CB9CBA7B7FE /* MASConstraint+Private.h in Headers */, + 6249770A7D163B0F3001D5A76C5FA01C /* MASConstraint.h in Headers */, + EC48DE078CA5E55922CCE02354D475CD /* MASConstraintMaker.h in Headers */, + A6436E3CFFCBFE591E2D2A68ED90CAC6 /* MASLayoutConstraint.h in Headers */, + 49B903D576E09560C52AA92FDCC31A68 /* Masonry.h in Headers */, + 1F3BD3BC28432BB5E2F73501E06E4579 /* MASUtilities.h in Headers */, + E1E771349813022263F549BDF33CB4BB /* MASViewAttribute.h in Headers */, + A83991D7C1373DF66020C2FDFC5D7564 /* MASViewConstraint.h in Headers */, + 490CA524521F7D444EA58FA915D7E99C /* NSArray+MASAdditions.h in Headers */, + E072DA57403C4BFF9B10467BE05604C5 /* NSArray+MASShorthandAdditions.h in Headers */, + 9934AEA2C891C201D8ED5746FF42FE1B /* NSLayoutConstraint+MASDebugAdditions.h in Headers */, + 86EE1CB5473A4A07081D8DE3A2C45924 /* View+MASAdditions.h in Headers */, + 983CB852CBBFBC04C2A6BA407E34F59B /* View+MASShorthandAdditions.h in Headers */, + C88F85D3200060BD98FC13EA58121706 /* ViewController+MASAdditions.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - B981229135DBE9773A86BDB116C368D1 /* Headers */ = { + C3C7931CB0236F41CCFBA2F7FF72ECB9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 19E6319F6ECED7539AABBD9A211F7AEC /* AFAutoPurgingImageCache.h in Headers */, - F3774B1449FCE5B3CA3E1B336E11D284 /* AFHTTPSessionManager.h in Headers */, - 326A543AD4E39A2DAECA1CD385E3AEA2 /* AFImageDownloader.h in Headers */, - 3939531EB270B4145C7ADFBAB2E5695F /* AFNetworkActivityIndicatorManager.h in Headers */, - 0A08FC71C4E3B8E0F8734BCDA7CCA7CB /* AFNetworking.h in Headers */, - ED69D9B5A342FE9BD3F170D5CDDEC948 /* AFNetworkReachabilityManager.h in Headers */, - DFDAC8245626953C4BCE5A2DA6BE2A5B /* AFSecurityPolicy.h in Headers */, - 2359387620C5E815BF0594BC40311734 /* AFURLRequestSerialization.h in Headers */, - B51AA1F7701DCDBCC9B88A15320F9C2C /* AFURLResponseSerialization.h in Headers */, - 3511AE7ADBB71D05565854F0E70B7D08 /* AFURLSessionManager.h in Headers */, - 830050886B18F54E17F117FD8EFC717B /* UIActivityIndicatorView+AFNetworking.h in Headers */, - E212C2AA95E8F6EFB69A5F1455F291F8 /* UIButton+AFNetworking.h in Headers */, - C1B65C3D849FEE4FB5298A8135A765DA /* UIImage+AFNetworking.h in Headers */, - 6EC97BDB3FC508526F9E388095A7DDCC /* UIImageView+AFNetworking.h in Headers */, - 85FAB6F1D2FE0598BF2E61D7BB084B8D /* UIKit+AFNetworking.h in Headers */, - 5D52DB6DF2E6C24CECB0015A9177A2E1 /* UIProgressView+AFNetworking.h in Headers */, - ACE9C1A6E8D5121C6C5F907C7A9CFCC9 /* UIRefreshControl+AFNetworking.h in Headers */, - B5CF67F7870BAB70A76E57479B706B42 /* UIWebView+AFNetworking.h in Headers */, + BFD31B865BBF73BF07FFC196768E6267 /* BAButton.h in Headers */, + 87B3E5EC8059E756A29E20FC7A052D1A /* UIButton+BACountDown.h in Headers */, + A297DD2E044F47D05E740BFF48CDEC71 /* UIButton+BAKit.h in Headers */, + 825E5E32DB00F5D7D22818224E22B8C0 /* UIButton+BAState.h in Headers */, + 59E9272DA1911A5D9B33D93712498732 /* UIView+BARectCorner.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - CFCFC2CB5AC97562ED2187B97BC72A97 /* Headers */ = { + C7833A7EE52853DF9F44F09AA055C339 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - E532AB761BE919436A751C6592DDD7D2 /* IQBarButtonItem.h in Headers */, - CDCDA3DBC3C13EBB3CA76C7F0C17D427 /* IQKeyboardManager.h in Headers */, - 6BD2B68E6E29F37846F58B70CBB59129 /* IQKeyboardManagerConstants.h in Headers */, - C39AC358D302C1C2885195358DCF545C /* IQKeyboardManagerConstantsInternal.h in Headers */, - 2F481514A18F6CA81CFB3F21A067B7E5 /* IQKeyboardReturnKeyHandler.h in Headers */, - 7560B8ECCA334403DB3831C8D91DB262 /* IQNSArray+Sort.h in Headers */, - EA09D1CACF5BB6F95858509585C62E61 /* IQPreviousNextView.h in Headers */, - C6EA6BCD8D2B6F6F76DD7EE1771EF613 /* IQTextView.h in Headers */, - 62F742E29E102974446C4B6AD532466F /* IQTitleBarButtonItem.h in Headers */, - 25661F4D1324CEF362F927106BECC218 /* IQToolbar.h in Headers */, - 1CD7E245A5840BF91C834E899B4A92BE /* IQUIScrollView+Additions.h in Headers */, - 37ED3D242A875B92B6F981113C9CD95B /* IQUITextFieldView+Additions.h in Headers */, - 7136985E718DE3BFD007AEF4C8086B04 /* IQUIView+Hierarchy.h in Headers */, - E2A8D240C6A88B427CD489D5DFEE15B9 /* IQUIView+IQKeyboardToolbar.h in Headers */, - 63B9D67A0E4367DA9819234F90E3190C /* IQUIViewController+Additions.h in Headers */, - B12F43459477CEF4D99B07A62EC761F2 /* IQUIWindow+Hierarchy.h in Headers */, + 324AEE1266878BC24EA8C1DD42D5E7F5 /* MyBaseLayout.h in Headers */, + 51577160C4D66422FCA35CA4309743E7 /* MyDimeScale.h in Headers */, + A8CCBA3F1F4DB835E51AED0B6E185B5E /* MyFloatLayout.h in Headers */, + 774165C3EC91357AC0FF2BBF49DE931F /* MyFlowLayout.h in Headers */, + 77445AEAFE4727C5DEB71186D278B71F /* MyFrameLayout.h in Headers */, + 7F744D9E26348306653D7579B1AFDC1E /* MyLayout.h in Headers */, + BA0EF227E29990276A608FCC60FB5AF0 /* MyLayoutDef.h in Headers */, + 9C01AC7CFD24447140FD72D700ED66C1 /* MyLayoutInner.h in Headers */, + EF5F809703CEB27AC35E3379601E6954 /* MyLayoutPos.h in Headers */, + 4E1D58C8FD07687510855F78194CFC80 /* MyLayoutPosInner.h in Headers */, + 7335EB55170E40E3F900C0A4021B9F13 /* MyLayoutSize.h in Headers */, + 738F08A49CF038BC0A9BD49BA174373A /* MyLayoutSizeClass.h in Headers */, + E4AD1B2492FF31B1B8D9C7448F01B933 /* MyLayoutSizeInner.h in Headers */, + 910B24376E3E5B6B788069D1C3FC6F14 /* MyLinearLayout.h in Headers */, + 658B85296E2EDA3455CD9FC6B3F4180F /* MyMaker.h in Headers */, + 52D224DB918FEBC654E65312FBD1F9FB /* MyPathLayout.h in Headers */, + F39CF586C2E0EDCD5CF400148361F91F /* MyRelativeLayout.h in Headers */, + 399AD9BBF136293CB803BB676786BD30 /* MyTableLayout.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D27940D9155D67CE9469B95EF2E64BFE /* Headers */ = { + C82A1F4BC9E8380CAA79C8316DBB2A91 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D2EF16A810A5A08DDA175BEB2245A438 /* FBAssociationManager+Internal.h in Headers */, - 53063C18938DB19134BBBF1A083A3C96 /* FBAssociationManager.h in Headers */, - 30917968A189E35A5CFF690875109AB4 /* FBBlockInterface.h in Headers */, - 5EE98F5266EA4B084F0D8E5AF7D32195 /* FBBlockStrongLayout.h in Headers */, - 9785BBB495295FAA9892ECFCF7B91781 /* FBBlockStrongRelationDetector.h in Headers */, - 20B986E1BA479165AB677D5F3062B277 /* FBClassStrongLayout.h in Headers */, - 74DD9B0A916508400FB11D7E840F0950 /* FBClassStrongLayoutHelpers.h in Headers */, - E366F98235BF5356CD8376EA810FB719 /* FBIvarReference.h in Headers */, - B0AEA4C93754AC1C825DD0AD84BA5E59 /* FBNodeEnumerator.h in Headers */, - EE4EE2227481E4A55FFD2261B925F8EA /* FBObjectGraphConfiguration.h in Headers */, - 7105AEF79C147E1853DEF7E5B4A909F5 /* FBObjectInStructReference.h in Headers */, - 53BAF67F6307A2BC5ADC2EC7C6D1DC37 /* FBObjectiveCBlock.h in Headers */, - CBE9BC8CEAD966EC14714D5A447034D9 /* FBObjectiveCGraphElement+Internal.h in Headers */, - 805AFB3DD4E39EDCDB6B40E227F6371F /* FBObjectiveCGraphElement.h in Headers */, - C1ECC1A5FD628140D2F51950514ABC18 /* FBObjectiveCNSCFTimer.h in Headers */, - 6EF19A795B1B3BBA4F53B128F387C2C5 /* FBObjectiveCObject.h in Headers */, - 947B50A28CFF32AF1469194899AF5294 /* FBObjectReference.h in Headers */, - 90044DB4682656277A1863EC96318829 /* FBParsedStruct.h in Headers */, - D6310BCB04A0A024F31AD92AA155F583 /* FBParsedType.h in Headers */, - B9C2E6BF37CB8A6B09189D005DD76A04 /* FBRetainCycleDetector+Internal.h in Headers */, - CA9EAB13270EAF0672F577BFBF4F6F15 /* FBRetainCycleDetector.h in Headers */, - 00A40F4FE52842C643A616F04763F040 /* FBRetainCycleUtils.h in Headers */, - D15BD345C4F8967C1FC8CE69E0A7819F /* FBStandardGraphEdgeFilters.h in Headers */, - DAA9E448DBA0AEC0048AA2A15AA4646D /* FBStructEncodingParser.h in Headers */, - 7AA2CCC88CD69AC832E1FC769A07B550 /* fishhook.h in Headers */, + F6C16D658A9ECD1466CF6DACB61557CB /* NSData+ImageContentType.h in Headers */, + 270F1E86F4FADA90623D5E0B67AD5C8B /* NSImage+WebCache.h in Headers */, + AF8BDC3F660E285057AA1EC6D0D87612 /* SDImageCache.h in Headers */, + 98B3FA74D7C3085E2AE3A956E39D9FD8 /* SDImageCacheConfig.h in Headers */, + 27A153B9E381F0A914A71BCBAAAF1BE1 /* SDWebImageCompat.h in Headers */, + 65FDE8FDBCF2F4CED252E7133D6B44DD /* SDWebImageDecoder.h in Headers */, + 186FF44AA650AD44B8AE97BA553BDE89 /* SDWebImageDownloader.h in Headers */, + 3911013375A3BCAA6817F40BAD456388 /* SDWebImageDownloaderOperation.h in Headers */, + 35DACE1A84A19E6CAA0E045E6608722C /* SDWebImageManager.h in Headers */, + D0E8F48B7A113F82C5409DC0E6CFDDB5 /* SDWebImageOperation.h in Headers */, + 490C85453F915055A5F7F6E48CCDE39B /* SDWebImagePrefetcher.h in Headers */, + DA961F4D6F59851734A0DCEBE0C14762 /* UIButton+WebCache.h in Headers */, + D8170774E48CAD1B76374729C521EC12 /* UIImage+GIF.h in Headers */, + 22FDEDF4D77D979174E2F8404F0B8627 /* UIImage+MultiFormat.h in Headers */, + 26D2993721ADDE22D59CD39B008B23EC /* UIImageView+HighlightedWebCache.h in Headers */, + 06E5728E4758F6DA65FD5F94D68A5646 /* UIImageView+WebCache.h in Headers */, + E26BCF3A5AA583809A600E4DCA6EA85E /* UIView+WebCache.h in Headers */, + 6D04EB73FAB920BB1E208A7D7B94644B /* UIView+WebCacheOperation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D70C2B60AD15BF12091026A33774F9F7 /* Headers */ = { + E7A123319333F8B3F1FB8179E2C82AB5 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 695A3FA15E903AE48EB0B3BE336F2467 /* MBProgressHUD.h in Headers */, + E3EA008B59CE78D5B393437366769BC0 /* BaseType.h in Headers */, + BCB77E95D1D2C7739AAC8284A057F871 /* FBAssociationManager+Internal.h in Headers */, + CDC456529F00D8491AC8A8616FC2BC65 /* FBAssociationManager.h in Headers */, + 17335BA1380AE6AED8CD25A44290798C /* FBBlockInterface.h in Headers */, + 6C0C802617374C786CC7139203D20801 /* FBBlockStrongLayout.h in Headers */, + F20082A4085F5E3007801440DBBE995C /* FBBlockStrongRelationDetector.h in Headers */, + 2D62B803E161E9F5510ED0EAF293EB7F /* FBClassStrongLayout.h in Headers */, + 9C0079311546383FCE4158E2D938FBB8 /* FBClassStrongLayoutHelpers.h in Headers */, + 195132C2DA66BD3AC18039534A418AF4 /* FBIvarReference.h in Headers */, + 1D79EA95FF188871930BC9DB0EF76077 /* FBNodeEnumerator.h in Headers */, + 4B5FEB1B4D1FD21BBD4D89990C3A65F6 /* FBObjectGraphConfiguration.h in Headers */, + 2AB111D38BFC2D501249664984E1A48F /* FBObjectInStructReference.h in Headers */, + 35B39A7A2A63892DCB722C1E1063E152 /* FBObjectiveCBlock.h in Headers */, + AB43F097B242078CC539D21528AEF1D4 /* FBObjectiveCGraphElement+Internal.h in Headers */, + 0A51F101E665672CEE3564F22BEF39B4 /* FBObjectiveCGraphElement.h in Headers */, + CF7AFBD61708A69B9725AE2B6BB16423 /* FBObjectiveCNSCFTimer.h in Headers */, + BDE55DB986952CED890714089FF520DA /* FBObjectiveCObject.h in Headers */, + A1B868F66E6E2705FD6B4F4200FC5476 /* FBObjectReference.h in Headers */, + 32170BF7817BCD2E27F114DF85BEC1FB /* FBRetainCycleDetector+Internal.h in Headers */, + EDDE7064989C1242DF4A6EC18A95F347 /* FBRetainCycleDetector.h in Headers */, + 1F4E38A56447A2A214F10261C4521567 /* FBRetainCycleUtils.h in Headers */, + B24AEB4999F36F67F80710C3A8B38198 /* FBStandardGraphEdgeFilters.h in Headers */, + 9E598F4B8C367DF0061C6F22761D534D /* FBStructEncodingParser.h in Headers */, + 97ECECDB9891F0320F610EBFFDDD42BD /* fishhook.h in Headers */, + 2473EEC1DD96DA1BDB5854EBF13DA3D9 /* Struct.h in Headers */, + 91AEF94DFC71F2AA66CB0310A9280B24 /* Type.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - DC2FD204418061BE115950CB22583994 /* Headers */ = { + EE0B3CFD81BEF0CE609D4F8119EF5973 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 432F9F0DCFD2F1A6CA1DCE23A33C1848 /* MyBaseLayout.h in Headers */, - AA4A149C8F5C3BAC314D180BAF86E90D /* MyDimeScale.h in Headers */, - 2EE24D06F06A46ED8D00E372A01F7300 /* MyFloatLayout.h in Headers */, - 9A2EED60547F71716011B01315633A17 /* MyFlowLayout.h in Headers */, - 7503B51AC5F8C9E3FD1B7F03D1FAC7BA /* MyFrameLayout.h in Headers */, - 76430179F5E39F544A6CC8CE5F5E7375 /* MyLayout.h in Headers */, - 2CE53012972EDDF89E0334BDDAF4A92C /* MyLayoutDef.h in Headers */, - FEACEFA0564ED9C31AB66F4A181F7DED /* MyLayoutDime.h in Headers */, - 87625EFEAC6393D6640AACD14541137D /* MyLayoutDimeInner.h in Headers */, - DDBDED87A2A54F30705EE3E2279FF4C2 /* MyLayoutInner.h in Headers */, - 0730F351065B86DA2E16F00C83D0FDE8 /* MyLayoutMeasure.h in Headers */, - 9FADD74420CCA674B263E796321B5230 /* MyLayoutPos.h in Headers */, - B911C96FEE11AF555371C685AF39EC35 /* MyLayoutPosInner.h in Headers */, - 8A5BD2A6B0E00ABAF752157C3A395CDC /* MyLayoutSizeClass.h in Headers */, - 144A5898941351DDDD561B3811BE9BDA /* MyLinearLayout.h in Headers */, - 7D5941BA16DB6CAAA4CF96F28BF1A34D /* MyMaker.h in Headers */, - 19CF814B377FEF554E3A07450DCC4602 /* MyRelativeLayout.h in Headers */, - 98190A252E5EF0E5337B94F9FFB9FBCB /* MyTableLayout.h in Headers */, + 0A0AA20A2348D0758B66C7AA855C105C /* YYCache.h in Headers */, + 24366EC109185894F228F3E2917122CC /* YYDiskCache.h in Headers */, + 249137C66E3211FB55A11A8D1D8B5FB3 /* YYKVStorage.h in Headers */, + DA1C76394F3B8B3EDCBEEDEF36F458F8 /* YYMemoryCache.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F95AF419D96CDED026D79CDD7A3B3023 /* Headers */ = { + FE528B3A0FDD06AA8A4F7E68C6BC37DD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C37D2F9A62232C28DAF2E51CF1364F21 /* MJExtension.h in Headers */, - 0F7EC02E944F8719A5EBDC9D29F9E99F /* MJExtensionConst.h in Headers */, - 13695CE9BF36F26CA806C5CD2D6ADECA /* MJFoundation.h in Headers */, - DAF1CE8756287B465E0DE48A6133FB79 /* MJProperty.h in Headers */, - 366A613AE07EAA35B5789F6123FB48AF /* MJPropertyKey.h in Headers */, - 91CAC2B69903F5F3D7C25A95CA77A600 /* MJPropertyType.h in Headers */, - CA1EB1DB5C89E63A19ED05C55E35AF23 /* NSObject+MJClass.h in Headers */, - 118227C43F283C87130BEE2BFABC7EBD /* NSObject+MJCoding.h in Headers */, - 4330562BA1A299CBD37F4602B1A4C95A /* NSObject+MJKeyValue.h in Headers */, - C16442D25F534C602780E6FD44C6A698 /* NSObject+MJProperty.h in Headers */, - 86D3C675657C8AFE6F73E5D0F209E990 /* NSString+MJExtension.h in Headers */, + F673BF559B086F2E1E7A4F089F6EA0CD /* BAActionSheet.h in Headers */, + 2F9C6A75A81786C913877F2B10829446 /* BAActionSheetCell.h in Headers */, + E6C19504109FFF1EF6FF66919E731574 /* BAAlert.h in Headers */, + E72B4CFB4C7690B821BA27013BE26017 /* BAAlert_Config.h in Headers */, + 02291AFBA9778DD02AC1BCC3A37DD998 /* BAAlert_OC.h in Headers */, + F390892683F928EB38E95D670531D2E9 /* CALayer+Animation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 07A1458F0ECFD7D943DC4EF15E916F34 /* MyLayout */ = { + 04CF549EBEEE7BC87AEAE35397184D94 /* MJRefresh */ = { isa = PBXNativeTarget; - buildConfigurationList = F3F87A8415DD8DB506984857C8A93C50 /* Build configuration list for PBXNativeTarget "MyLayout" */; + buildConfigurationList = 35FA3F9D780F0A57E55222615ED55C72 /* Build configuration list for PBXNativeTarget "MJRefresh" */; buildPhases = ( - 831B4D468BEFFA36C070B3E5FCEB0A24 /* Sources */, - 24D1976AC00C86A01629B00C8315F7C0 /* Frameworks */, - DC2FD204418061BE115950CB22583994 /* Headers */, + E742ED1631851E8E4DF869C1ECDD955D /* Sources */, + E1FFA9BD201F7FCE2311B14D2E5AA8C0 /* Frameworks */, + BCF57EC6DF4DD2736C7C216D9CEB9428 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = MyLayout; - productName = MyLayout; - productReference = B696538C145D3F1CF93CE278A6D90206 /* libMyLayout.a */; + name = MJRefresh; + productName = MJRefresh; + productReference = 7749FA9768C0B4098EF0400CDF294203 /* libMJRefresh.a */; + productType = "com.apple.product-type.library.static"; + }; + 0C26DF3C4A7B81F517436CE80F07F368 /* BANetManager */ = { + isa = PBXNativeTarget; + buildConfigurationList = 565605472A25614E25F097CAAC7E3305 /* Build configuration list for PBXNativeTarget "BANetManager" */; + buildPhases = ( + CEBA4AB29C20B790C6D91F47EF9D0185 /* Sources */, + 276D108F2AC1678329F05B6AC008E8F3 /* Frameworks */, + 38CBD2ACA8057E43CA9E05F823983504 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + AA1A236BEE5ECC5BA733BB22244790C6 /* PBXTargetDependency */, + C9F1CB3D347146B609FEC83DC89BEC28 /* PBXTargetDependency */, + ); + name = BANetManager; + productName = BANetManager; + productReference = 4D8FA3DEBAC05AD570B7ED05D853B068 /* libBANetManager.a */; productType = "com.apple.product-type.library.static"; }; - 24F2D2C1278EF320F595B3F56C58DA67 /* WebViewJavascriptBridge */ = { + 1D77298ECE42FEF88367950A2D83E5C1 /* BATextView */ = { isa = PBXNativeTarget; - buildConfigurationList = FC74DF8137986F15045F3DF1999CB950 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */; + buildConfigurationList = CFE2B09E24FA2C8AA203FFDAA5F30A94 /* Build configuration list for PBXNativeTarget "BATextView" */; buildPhases = ( - 0B56FB38076EAA5068696F163000CE89 /* Sources */, - 1D54816B04BD53B4C4719CEBF111AA2B /* Frameworks */, - 87ADBE052629116471EB35E69D448170 /* Headers */, + 2135B17E49870212AF1B9CBB5C0A7832 /* Sources */, + A4EA756151CBB70FB351768786619D31 /* Frameworks */, + 110BC916D84EA57ADB20350EB9808DAD /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = WebViewJavascriptBridge; - productName = WebViewJavascriptBridge; - productReference = 1905F135A73F32BC7B6C8573855235AA /* libWebViewJavascriptBridge.a */; + name = BATextView; + productName = BATextView; + productReference = A829375743110C8BFCCDFD99BADD23F7 /* libBATextView.a */; productType = "com.apple.product-type.library.static"; }; - 274F790B97E5AE8A7AB64D8F83473603 /* Pods-BABaseProject-BABaseProjectTests */ = { + 3B0CD7617B4912791A5E244AB6D56105 /* Pods-BABaseProject-BABaseProjectUITests */ = { isa = PBXNativeTarget; - buildConfigurationList = 5EF4A3C2BD99128EFAF8CC9F42A8E3D3 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectTests" */; + buildConfigurationList = 8E741ACFA66A0A2CAB1454F8C19D21F2 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectUITests" */; buildPhases = ( - 358308E826F86E2878145B4257E6EEA2 /* Sources */, - ABED467BCE084E492B6A0E6E20E4CE7A /* Frameworks */, + 7B5E5F4B965BCE948526003E8BF9E99B /* Sources */, + 43940D4BFC76623893D58D22EF244EA5 /* Frameworks */, ); buildRules = ( ); dependencies = ( - FE6946277D2951DC9D59D2A9D27203B0 /* PBXTargetDependency */, - 4D6FFD2671580477568F450CA2BC25E1 /* PBXTargetDependency */, - 5B09D824EB86B3694A5370F877A78BD9 /* PBXTargetDependency */, - 67EB0BBFC77BAD8A19AFCBF21FD2EC50 /* PBXTargetDependency */, - D2C509D783BB7FC1BA23C9C2AD97C331 /* PBXTargetDependency */, - 7E0E591F6420F20EB8A798A61FA97EA8 /* PBXTargetDependency */, - 24B27FA426BD882E0815BD91DA53FD2E /* PBXTargetDependency */, - 2A94B6005448DD054D056AEA4E978CD4 /* PBXTargetDependency */, - 7C32F174C87298702E2D5449CF817FFD /* PBXTargetDependency */, - 8386233EE4EB74BD5921A6586C00477F /* PBXTargetDependency */, - CE3CD266A95F48477020043190BF99C4 /* PBXTargetDependency */, - 78906F5F39A7027C1FCD2C5B8A95A8EA /* PBXTargetDependency */, - ECA699A5905B71703D7C78D5D8BEF963 /* PBXTargetDependency */, - 696372CD7DFD048937F381CCF7964DEC /* PBXTargetDependency */, - 362B2D68F338FBA0162C2D98DB834766 /* PBXTargetDependency */, - 30DB1273A589CE144345FDBD3B01ECDA /* PBXTargetDependency */, - 1A132924A66A28DF280C7A471C899F14 /* PBXTargetDependency */, - 316EFB96EC8CFDF9E3CBDF4927EEC7AA /* PBXTargetDependency */, - FF7213FF113A4EBA9A1DF706214765AE /* PBXTargetDependency */, + 00D3F8702FB896FBB56A724C73BAB63D /* PBXTargetDependency */, + 81EC0D4AF5445823ACF7AD0F473CBC11 /* PBXTargetDependency */, + 0501A6BFD0FF1A014A2F47DB0E574211 /* PBXTargetDependency */, + DE2625E9EDC9FFE78C65F9BC753DA979 /* PBXTargetDependency */, + 1184564A04CE060CEFD92ABAAE5016F7 /* PBXTargetDependency */, + 238A7EEFDD00C784DE2187A9173B236E /* PBXTargetDependency */, + 82DBCD90ED1E5B735DB5A4B7067C2B22 /* PBXTargetDependency */, + 85CF22CC022E0690549C08A6D952F081 /* PBXTargetDependency */, + 09EE6CEE269BF4B11E54E7172619ED10 /* PBXTargetDependency */, + FE10E5C2237F5B99B30CDEAD97E441D6 /* PBXTargetDependency */, + 2E0B10CA5F749CC6920E2C8A8546A7C2 /* PBXTargetDependency */, + BDB2ED981DB36CB1C46F2102C2E7A485 /* PBXTargetDependency */, + 66D7767DE39FC684535F1D445B142104 /* PBXTargetDependency */, + 172F34457EDA3A92A0E084A4AFFDA5BB /* PBXTargetDependency */, + FC52A5BB3882C24DBAC1FFD9147EDC83 /* PBXTargetDependency */, + 71FF7C99B1B3E06DA3C31F21E48018CD /* PBXTargetDependency */, + 3E9042DB34B3A64F56CAA543BE0E2D5F /* PBXTargetDependency */, + A8380DE1DDE0D47A99D5DF07E2121886 /* PBXTargetDependency */, + 2C0D10B13BC0C1DA9F35597F51A2969A /* PBXTargetDependency */, + 663DCF3314F6F622FDDDB5D1BD86BC83 /* PBXTargetDependency */, + AB485869BA5E524333B2F62927410A3C /* PBXTargetDependency */, + 882E30771BF5DDB43A353E89A2BD5CFD /* PBXTargetDependency */, + AA8086387432F3A7D9576C222F672F5B /* PBXTargetDependency */, + ); + name = "Pods-BABaseProject-BABaseProjectUITests"; + productName = "Pods-BABaseProject-BABaseProjectUITests"; + productReference = C6A3F2B7E15A00B6B57797E93320091E /* libPods-BABaseProject-BABaseProjectUITests.a */; + productType = "com.apple.product-type.library.static"; + }; + 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */ = { + isa = PBXNativeTarget; + buildConfigurationList = B5D16F1430E3813C6D9A8E7A6E3A4E3F /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */; + buildPhases = ( + 2261311B0BB20FFAAC730C6BC4FAC607 /* Sources */, + 337A15437F2D8E9608BBC9A7F937EB94 /* Frameworks */, + 9077FD721AC492135E5F3B9A67F65E6E /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DZNEmptyDataSet; + productName = DZNEmptyDataSet; + productReference = C2E84E8CAD885AA6C73FD3BE110F988F /* libDZNEmptyDataSet.a */; + productType = "com.apple.product-type.library.static"; + }; + 586F2DFA9BDCC6675C2546793A69E5CC /* MBProgressHUD */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6B44251FA50022CA55D4B2FBE1468C76 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildPhases = ( + FCC28E36A289F7E991B78A63CD0251F9 /* Sources */, + F9AC974E3329F79899A7B3BE290FC894 /* Frameworks */, + 1B1D84BCA4F7BDAE79C37DF88C9DCE23 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MBProgressHUD; + productName = MBProgressHUD; + productReference = 5FE5FD2FE709C150152C039EFAC5A269 /* libMBProgressHUD.a */; + productType = "com.apple.product-type.library.static"; + }; + 59D5617659A538B39BECA1B9B72A2957 /* Pods-BABaseProject-BABaseProjectTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EF951972107F12E7DC4365E07D0F78C6 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectTests" */; + buildPhases = ( + 00C73B5A5F9582A31EA116BC20FFE657 /* Sources */, + BA07D21115FC94333B28618552257239 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 5BA4CCEB24F0705F91F9A02F93443FB2 /* PBXTargetDependency */, + C4E2CDFE5CAAD10E25136996705892DA /* PBXTargetDependency */, + A6F384D42E73EB5B8AB6C1823FBB8157 /* PBXTargetDependency */, + BEA93A5A9ADB55D04E73172859810198 /* PBXTargetDependency */, + 1B3E89F971EB38652EEDDD364F2669A1 /* PBXTargetDependency */, + 88AEB3558C9072DDCC177774AE75918B /* PBXTargetDependency */, + 06ADCF444ED40B94B44E063FDEDD1DE0 /* PBXTargetDependency */, + B408108E1F209256A950A0DD2B3D60C3 /* PBXTargetDependency */, + DE671A2F23B7D79596B1CCF1BD50B319 /* PBXTargetDependency */, + AE40EE4D013AAF2CE5FAC968C6A282EC /* PBXTargetDependency */, + F09ECFFBFE306D170CA061178CCD4F47 /* PBXTargetDependency */, + A160CDC37E6440231941D2E75D1A0866 /* PBXTargetDependency */, + 903D53A7F0CC55880341822C02146A5A /* PBXTargetDependency */, + FF7267B584FC98C040CBC394DC3E88EA /* PBXTargetDependency */, + 66E50335F02EB006AB7A1158B17D3F4D /* PBXTargetDependency */, + 90E265E6DD74AB78686DB2F9E7F3C10B /* PBXTargetDependency */, + DB2EA9EEF268DEF3DC27375A524E8DAB /* PBXTargetDependency */, + CFDE2793D3A44553FC8C38A1EA4828DD /* PBXTargetDependency */, + 232A6C93F0FCA54DA5F94070B411070E /* PBXTargetDependency */, + 1E9C9CC5BF95E8338EACE824AC76010B /* PBXTargetDependency */, + 8C10D5325538264C425BD2B830325195 /* PBXTargetDependency */, + 213318695F138F3B089F693130B83083 /* PBXTargetDependency */, + B93046D37D4D34BBA01A1414A4DB10C3 /* PBXTargetDependency */, ); name = "Pods-BABaseProject-BABaseProjectTests"; productName = "Pods-BABaseProject-BABaseProjectTests"; - productReference = 57768CBA856A51F8D31835601F2C7CF5 /* libPods-BABaseProject-BABaseProjectTests.a */; + productReference = 5CCEE69A9392F2636E8527AC05DFC45E /* libPods-BABaseProject-BABaseProjectTests.a */; productType = "com.apple.product-type.library.static"; }; - 37D7380A52EE2E9B49BECEE4DC247D19 /* YYKit */ = { + 5EAA6D463A9A35AD53DFDE7BD90DB91D /* JMRoundedCorner */ = { isa = PBXNativeTarget; - buildConfigurationList = CD52FA788653A1AC4FF3AFD3DD0E833C /* Build configuration list for PBXNativeTarget "YYKit" */; + buildConfigurationList = 9F5A6001FB1652CF7FC1794C41632F71 /* Build configuration list for PBXNativeTarget "JMRoundedCorner" */; buildPhases = ( - DA9B89A0A4D9022D855750CD7B6D2788 /* Sources */, - 18DC669D75F24ED4F05E2C4F0153E4D2 /* Frameworks */, - 84BD82A17F5FBBACCD570B1807C4B329 /* Headers */, + 21EAB9A79BC94AA95C56E77F8EE83954 /* Sources */, + 4C3BB007BD8D3387F8BDE4E08917DCEE /* Frameworks */, + 0A0D9248F4B039D2E7D082627D84D2C9 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = YYKit; - productName = YYKit; - productReference = 240D5346C40C8A4793704A345166F6E2 /* libYYKit.a */; + name = JMRoundedCorner; + productName = JMRoundedCorner; + productReference = AD19CE05FF3E73AB501E972F5D82955A /* libJMRoundedCorner.a */; productType = "com.apple.product-type.library.static"; }; - 39818EAD9B4F5290D508A9F1E9C33CB6 /* NullSafe */ = { + 6B5503127B165F8F1EF1105805C54DD6 /* SDWebImage */ = { isa = PBXNativeTarget; - buildConfigurationList = 32AFD7C10BB80D4284D8930821E27595 /* Build configuration list for PBXNativeTarget "NullSafe" */; + buildConfigurationList = 72BC768282764110A3EB7F9A23878DCE /* Build configuration list for PBXNativeTarget "SDWebImage" */; buildPhases = ( - 97710A67195C22391F48F84261DA8BD4 /* Sources */, - A98F23017BE117F7F07DA2E36558D86C /* Frameworks */, + 056C0891E6D2A3A4FE1413A15291F91A /* Sources */, + 5B5697A5A886EAD879C9E3899735A579 /* Frameworks */, + C82A1F4BC9E8380CAA79C8316DBB2A91 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = NullSafe; - productName = NullSafe; - productReference = E1C0048F5E133A922700A51EE9BE7EB4 /* libNullSafe.a */; + name = SDWebImage; + productName = SDWebImage; + productReference = 24E732E61E783895CF9D3245E9C94340 /* libSDWebImage.a */; productType = "com.apple.product-type.library.static"; }; - 53480ED0BE09FF49E34B1702D485CAAB /* Masonry */ = { + 7126A8FF47B4545643C04540D6F9CB0B /* MyLayout */ = { isa = PBXNativeTarget; - buildConfigurationList = B6653DB75D219E078020C341A7D83ECE /* Build configuration list for PBXNativeTarget "Masonry" */; + buildConfigurationList = 9B18BF6CC251E82E7850E6800E1B0018 /* Build configuration list for PBXNativeTarget "MyLayout" */; buildPhases = ( - BF5A9E7C1BAD1634608A9C22251F3B36 /* Sources */, - FAB9E9D9BBDB93399D3C2B91469EC4B6 /* Frameworks */, - 657D857047A6A935B5A2E9BD049194F2 /* Headers */, + 8A6920CF55C18BC7105372A0EC3BF236 /* Sources */, + 5AFD1D588CCD6F175B115D022B4160ED /* Frameworks */, + C7833A7EE52853DF9F44F09AA055C339 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = Masonry; - productName = Masonry; - productReference = BEC29C2C4693655F7BFBD6BE0DB1D2CE /* libMasonry.a */; + name = MyLayout; + productName = MyLayout; + productReference = 4D2277AF8337A1D2124234F055750FB0 /* libMyLayout.a */; productType = "com.apple.product-type.library.static"; }; - 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */ = { + 720000A04716EA94A7F8EAE4F7FFE0A2 /* ReactiveObjC */ = { isa = PBXNativeTarget; - buildConfigurationList = 179CF0FDE19D418A643646D7ECD893E9 /* Build configuration list for PBXNativeTarget "FBAllocationTracker" */; + buildConfigurationList = 3C8668E36EAB83CD7A1D448C0A18A340 /* Build configuration list for PBXNativeTarget "ReactiveObjC" */; buildPhases = ( - 463F8E33F2BED79FF35340ECC2D18247 /* Sources */, - BA22D54174502D0E45D7A86A50C7D202 /* Frameworks */, - A32868AC303C3F58C7E10D6F856B6E46 /* Headers */, + 538968F467379B2A0E4EFC6725C96E5D /* Sources */, + ECDA50A72D7377044DC78A4EC42582AE /* Frameworks */, + 4B8579746E0863BFF2135C8EA4D3FCC9 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = FBAllocationTracker; - productName = FBAllocationTracker; - productReference = B25BBB87AC06B7F8FFCDDD4F34D11D86 /* libFBAllocationTracker.a */; + name = ReactiveObjC; + productName = ReactiveObjC; + productReference = 376E4A3CBF92F4FE4EB23EA625C1543C /* libReactiveObjC.a */; productType = "com.apple.product-type.library.static"; }; - 67C2E0E0C5FE7DE41F6A50F738BEFC7D /* SDAutoLayout */ = { + 8642CC820CE8C5B88C113D7F47AF4BC3 /* FMDB */ = { isa = PBXNativeTarget; - buildConfigurationList = E7628EF13FBEB74B7164FCBEADFE0A21 /* Build configuration list for PBXNativeTarget "SDAutoLayout" */; + buildConfigurationList = 1BA066B3D32C553BF37E3322F9113F02 /* Build configuration list for PBXNativeTarget "FMDB" */; buildPhases = ( - 36271EF385CFE2353BC80E39BFD5CD28 /* Sources */, - 703B851E235F160823E85E4781227D2E /* Frameworks */, - A82FF018C3B22B58CCFE5A12F6CCCE3C /* Headers */, + ADE36E87832B736E1FAF9E50036C1530 /* Sources */, + 025694188CB9A7D96CC58750018B4FFC /* Frameworks */, + A93D3ABB603D66C647446B37AA29FE64 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = SDAutoLayout; - productName = SDAutoLayout; - productReference = 7815EC8CFEF112D81BC88DCC35995367 /* libSDAutoLayout.a */; + name = FMDB; + productName = FMDB; + productReference = 89A0A131F0363897C5566635EB56DC6E /* libFMDB.a */; productType = "com.apple.product-type.library.static"; }; - 70BC44266C6FFE30D2C57129458E070B /* MJRefresh */ = { + 904F4F27FD314010A3812EB2A9306183 /* IQKeyboardManager */ = { isa = PBXNativeTarget; - buildConfigurationList = 04C1DB49FA812C21EEEBEE206A0ED54E /* Build configuration list for PBXNativeTarget "MJRefresh" */; + buildConfigurationList = 3A073C78D19617C74EEAEA91C3038721 /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */; buildPhases = ( - 9D8B89A7675E808BD8C416226560B263 /* Sources */, - 91247678E3E2D23B0BF2C3EF48002167 /* Frameworks */, - 34509A2745482CFBCF03BAAFEA0DAE4E /* Headers */, + D7C932479C1FCEB09BB1AD1D3D44A87C /* Sources */, + 64786C9E4ED20F0FD5D947A7C759FE3B /* Frameworks */, + 3BB32FFA9CFEC89EF803C6A9C28804EC /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = MJRefresh; - productName = MJRefresh; - productReference = D49E82DDCE38B66E39BBC64B88C05650 /* libMJRefresh.a */; + name = IQKeyboardManager; + productName = IQKeyboardManager; + productReference = 1ED5844300CA1B971687CFC8C8570F5D /* libIQKeyboardManager.a */; productType = "com.apple.product-type.library.static"; }; - 8C8C1779E3959B3BF107B00990F45010 /* FBMemoryProfiler */ = { + 92844E36EBBF88C45D432D8DBD41E81B /* BAAlert */ = { isa = PBXNativeTarget; - buildConfigurationList = 394BD9C4773EF541E1BBD3BE140F6B1F /* Build configuration list for PBXNativeTarget "FBMemoryProfiler" */; + buildConfigurationList = CC13840A64A15E8F8BFA46C1D169310D /* Build configuration list for PBXNativeTarget "BAAlert" */; buildPhases = ( - 27769D2C6BDCE96A87F1ADE4208C0307 /* Sources */, - 39A13DB7DB9B67A6E3C314E61D45CB33 /* Frameworks */, - 6BD44620AD6ABCB29E838A6C3A20B13D /* Headers */, + 2DBE36C715FB48FA9BEC2FA52D92972E /* Sources */, + AFD9B6EDB4FA1C9D5052E3F284B819ED /* Frameworks */, + FE528B3A0FDD06AA8A4F7E68C6BC37DD /* Headers */, ); buildRules = ( ); dependencies = ( - E48036CDBB8094332FA22382A683890A /* PBXTargetDependency */, - 24C7ECED8CBA5B6C7ACE0249507A2CA4 /* PBXTargetDependency */, ); - name = FBMemoryProfiler; - productName = FBMemoryProfiler; - productReference = 144C440F0AFC5C445523C400AF409A6A /* libFBMemoryProfiler.a */; + name = BAAlert; + productName = BAAlert; + productReference = 3E00F3186D0D77F2C61BF519E7E17E57 /* libBAAlert.a */; productType = "com.apple.product-type.library.static"; }; - 928353533005A4198EBDA5B700D37B64 /* AFNetworking */ = { + 9DC8D9E02903E93BD0B2FEC9D846EA20 /* Masonry */ = { isa = PBXNativeTarget; - buildConfigurationList = 77CF2A7107BC61A2E90025871305961D /* Build configuration list for PBXNativeTarget "AFNetworking" */; + buildConfigurationList = 34CAE1CB89EDBF2E53735CC5D4E5E69F /* Build configuration list for PBXNativeTarget "Masonry" */; buildPhases = ( - 5091D722EFC3A558FE7F6A62671FD745 /* Sources */, - 508C962B3E08E8DA04956BF349A3CDFD /* Frameworks */, - B981229135DBE9773A86BDB116C368D1 /* Headers */, + 27E8E3A06AAFF112FF7BC4F0117165D8 /* Sources */, + 6FD8312A1AEB348F49A81C438DB25115 /* Frameworks */, + BDF73468622762862D2FB76ED4AC0D8E /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = AFNetworking; - productName = AFNetworking; - productReference = 769D05CD721EEA4FFB52AE8D6AFFF199 /* libAFNetworking.a */; + name = Masonry; + productName = Masonry; + productReference = AB0FFA39D3FD61256F6D72E11701B042 /* libMasonry.a */; productType = "com.apple.product-type.library.static"; }; - 985F42852C5AD70E725D4F06503F5C5A /* BAButton */ = { + 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */ = { isa = PBXNativeTarget; - buildConfigurationList = B356FF642446B3E0FFB91D6325B7E493 /* Build configuration list for PBXNativeTarget "BAButton" */; + buildConfigurationList = 483FBC4A668BF7F1A8767452E7E188AC /* Build configuration list for PBXNativeTarget "AFNetworking" */; buildPhases = ( - D5B0B842F5F227D0CC2355E99F842452 /* Sources */, - 2C6DE07433816ECB482DB1EA1D853578 /* Frameworks */, - 10A2C1B31768927D66B49C9DD9C6DC51 /* Headers */, + AAEE4C1DF970D446DF57CA3DDD16AD00 /* Sources */, + F3284DBE3CA8932733932AD2A48445B2 /* Frameworks */, + 0A1C2B07813030B0D51EB1D804A4439E /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = BAButton; - productName = BAButton; - productReference = 70871709F538ED14CF03B137C02A8E45 /* libBAButton.a */; + name = AFNetworking; + productName = AFNetworking; + productReference = CCCFBDDF63B471BDF11A4AD364CAE939 /* libAFNetworking.a */; productType = "com.apple.product-type.library.static"; }; - 9EAB3E42EF957541E6C3C76D35FD008E /* MJExtension */ = { + A316B54C67E947D23CECD230FA5BFAEF /* MJExtension */ = { isa = PBXNativeTarget; - buildConfigurationList = ECCC06F4F1551987F0834A094FDCB1CA /* Build configuration list for PBXNativeTarget "MJExtension" */; + buildConfigurationList = 64EE246612F53A73C8FBFCEC3A61508A /* Build configuration list for PBXNativeTarget "MJExtension" */; buildPhases = ( - 8E893BB92D126D8850E931C08E2EE1B8 /* Sources */, - 747242460B935FEA3E994652BD8C2E0B /* Frameworks */, - F95AF419D96CDED026D79CDD7A3B3023 /* Headers */, + 9087206CF402094899352A19C262EFF6 /* Sources */, + B57134F14D0B782971053CD2EB92CC0C /* Frameworks */, + 864D7FF60E899EA81A55C0B7F82FC174 /* Headers */, ); buildRules = ( ); @@ -4013,197 +4586,182 @@ ); name = MJExtension; productName = MJExtension; - productReference = EC5CEF7487FECB58388614ED120649BD /* libMJExtension.a */; + productReference = F33C0B0C1B44159104500693CB5435BE /* libMJExtension.a */; productType = "com.apple.product-type.library.static"; }; - A0D476EE36FD46C7A5020DBF09EBD0FA /* SDWebImage */ = { + A9CEADE82CB20E7F255491FE1C30086C /* Pods-BABaseProject */ = { isa = PBXNativeTarget; - buildConfigurationList = DDF9C8C86D38D59FE81FD251040E7076 /* Build configuration list for PBXNativeTarget "SDWebImage" */; + buildConfigurationList = 80328601AA8657DFB696B49F812800A4 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject" */; buildPhases = ( - 95EC2118EB00FD3A5B7903FBA579AA80 /* Sources */, - AB2DF1EA2C3D54AB784B3446C4C994E1 /* Frameworks */, - 73B1B961C32CEB9723CCC7CDBADC2A68 /* Headers */, + D11FC003B8212DB15DF8BF6041651A19 /* Sources */, + AFB3129C86FDE9B97F0E5646C1039FD7 /* Frameworks */, ); buildRules = ( ); dependencies = ( + B1FB3020C8067A3F027DEAE03199EFB8 /* PBXTargetDependency */, + FA3E5088309CD820BE55F01EAC2E65EB /* PBXTargetDependency */, + 05FDB1236D980EEAF58680B3F729CF81 /* PBXTargetDependency */, + 55870960F80E0DC8F0D52C0F51308B43 /* PBXTargetDependency */, + 9F46A4B5AD21CBA81B8C30F001F598C4 /* PBXTargetDependency */, + F246A8AAFC20F61B0053D35C76C4E43B /* PBXTargetDependency */, + 0C4DCABF52F301BCE737F1915953D24F /* PBXTargetDependency */, + 837482C1019E584241931C196BC03411 /* PBXTargetDependency */, + D8DF22D1066B63BEA02AFCB2CC76C398 /* PBXTargetDependency */, + 0B57D5633C05F1AD168201BCB9D1BC4A /* PBXTargetDependency */, + 24E68FCA5C59AEC695E95CE42265DF65 /* PBXTargetDependency */, + 88854B66290599207A1FBA4237934BF2 /* PBXTargetDependency */, + 695CB72B62AD089FEB5C057150089AF7 /* PBXTargetDependency */, + 566055327948B6ACE05AEB7BB2462B0E /* PBXTargetDependency */, + 10C6F385DB5F35E2890CEABD9E48B771 /* PBXTargetDependency */, + DD7ECBD38517D126876A15791791E45B /* PBXTargetDependency */, + 4430B278F217447652903157BA30F8D9 /* PBXTargetDependency */, + 997AEEEB11FAB4C2FCF92690E3DF2D41 /* PBXTargetDependency */, + 6CE7B61EB9DA825AE900104AEC4B9FC6 /* PBXTargetDependency */, + CFEE943B65484D20E4AC183C2EC487E6 /* PBXTargetDependency */, + 6A0F2B5AF993D5495AA873898D18944A /* PBXTargetDependency */, + 30E8F3DF42C1FEA298B3388DE8E15EE5 /* PBXTargetDependency */, + 3F9B0D24C2404656B87730ABC66B0714 /* PBXTargetDependency */, ); - name = SDWebImage; - productName = SDWebImage; - productReference = EBF706F17C94E152003A5AF47B58798A /* libSDWebImage.a */; + name = "Pods-BABaseProject"; + productName = "Pods-BABaseProject"; + productReference = C98FD91FE871F648F9FD7A5F9A45DB1E /* libPods-BABaseProject.a */; productType = "com.apple.product-type.library.static"; }; - B58AE9150F017AC1E3E69371EC850776 /* JMRoundedCorner */ = { + AC139CEF10BCCB200972B4617F3CA14E /* MLeaksFinder */ = { isa = PBXNativeTarget; - buildConfigurationList = 6F06302A65E05938C8B34CE8BA30D8EA /* Build configuration list for PBXNativeTarget "JMRoundedCorner" */; + buildConfigurationList = 2DFCACCE7364EC7F86DAF625072B1695 /* Build configuration list for PBXNativeTarget "MLeaksFinder" */; buildPhases = ( - E1019BB30C737FB75A70C72CEB214BF3 /* Sources */, - BDED716E87AA5CEF190AB0859B4C3D80 /* Frameworks */, - 3DBF6EB7DA121BD0CA7AE1E53E312A04 /* Headers */, + E3D9DFCB79B440EF11D2B4AAAE0DEEC1 /* Sources */, + 304BE8E8A1CD6D0A65F67B9405E33C3E /* Frameworks */, + 4697834E9747B6B5790811BFCBE093A2 /* Headers */, ); buildRules = ( ); dependencies = ( + DABC5697527E29B8D278DA0C9B660632 /* PBXTargetDependency */, ); - name = JMRoundedCorner; - productName = JMRoundedCorner; - productReference = 7B76F296A3C646F332E6530AD4E84E33 /* libJMRoundedCorner.a */; + name = MLeaksFinder; + productName = MLeaksFinder; + productReference = 0DB6007E6C18F3CE8A03EF9DA8F30502 /* libMLeaksFinder.a */; productType = "com.apple.product-type.library.static"; }; - D058B89EB3B3DF45457A2DCD3971AFFE /* MBProgressHUD */ = { + AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */ = { isa = PBXNativeTarget; - buildConfigurationList = 1F97048AF18C3EFEDE731BDEECCD58A8 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */; + buildConfigurationList = 259FE69886D71D4163FC508CF5F099B1 /* Build configuration list for PBXNativeTarget "FBRetainCycleDetector" */; buildPhases = ( - 2CED23AFC52674AB0C9E061F4F941B04 /* Sources */, - 988FA15379A4032C312C2049FB88101A /* Frameworks */, - D70C2B60AD15BF12091026A33774F9F7 /* Headers */, + E0D10A8DE739F8CFFE84E78BA51488DB /* Sources */, + C8B04F4754F962B5C28827F9129BFE2E /* Frameworks */, + E7A123319333F8B3F1FB8179E2C82AB5 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = MBProgressHUD; - productName = MBProgressHUD; - productReference = 288B72AA3C58E307C4389C3C52273715 /* libMBProgressHUD.a */; + name = FBRetainCycleDetector; + productName = FBRetainCycleDetector; + productReference = DEFFACBDB5976EC63F435EED20E997ED /* libFBRetainCycleDetector.a */; productType = "com.apple.product-type.library.static"; }; - D0D0C9D20C43FA94D4C88FBFE2601B8E /* IQKeyboardManager */ = { + B6F3D6D69304DDD34A584B5BE13EED49 /* BATouchID */ = { isa = PBXNativeTarget; - buildConfigurationList = F640212A56B1085DEA4FE11E32E5020D /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */; + buildConfigurationList = AC66A9134382479987EA12BCB01E4825 /* Build configuration list for PBXNativeTarget "BATouchID" */; buildPhases = ( - 6FB78DE9D03FACA26E76D4C9445FEF1E /* Sources */, - 8D741FE3E49419A8E41EC5C8203D4D88 /* Frameworks */, - CFCFC2CB5AC97562ED2187B97BC72A97 /* Headers */, + 2928CA56D4A4CED4F0CA63BF3200900C /* Sources */, + 64ABB930934D7BBCC7618A9342E09C9C /* Frameworks */, + 9AA9D01F59888A179F3ADF0AE9349E71 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = IQKeyboardManager; - productName = IQKeyboardManager; - productReference = F38779F1A83D21F874604E26DEE40E0A /* libIQKeyboardManager.a */; + name = BATouchID; + productName = BATouchID; + productReference = 603E32B34ED8D61D048F1ECC77FA35EA /* libBATouchID.a */; productType = "com.apple.product-type.library.static"; }; - DA1A7295DF2A99609DA0EEBF5E83233D /* BlocksKit */ = { + BEBC67318C6C143D4D7E5C99A2B61B2A /* SDAutoLayout */ = { isa = PBXNativeTarget; - buildConfigurationList = 7B67B960A5D1DDC3FB6CC2E37DBBFD9F /* Build configuration list for PBXNativeTarget "BlocksKit" */; + buildConfigurationList = C92B3C7851C9C92D7F9068A142B82D03 /* Build configuration list for PBXNativeTarget "SDAutoLayout" */; buildPhases = ( - E413456B4BA31114D969632602A4C889 /* Sources */, - 87D63FC8B5A5501852974C5E1F3328A6 /* Frameworks */, - 9F9FD509AAD735AC4AB664BAA7649312 /* Headers */, + 2325AD914AB5D50449F44EA9199D8148 /* Sources */, + 1FB2CAF09B049412D2B70F2A22C2BD63 /* Frameworks */, + 423C1B480E8CD5D05EF4A739862A7852 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = BlocksKit; - productName = BlocksKit; - productReference = 4538FD40297CA79DB8CDE665A81DE8A3 /* libBlocksKit.a */; + name = SDAutoLayout; + productName = SDAutoLayout; + productReference = BB94B2FF6E22C5506C00E70FDE67E95C /* libSDAutoLayout.a */; productType = "com.apple.product-type.library.static"; }; - DED33CF4E43969F4E40F313A8A826DC6 /* Pods-BABaseProject-BABaseProjectUITests */ = { + C2A16C4461578CE67FD49F604F436B41 /* NullSafe */ = { isa = PBXNativeTarget; - buildConfigurationList = A2FE19F8A233862897CE37B947932F81 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectUITests" */; + buildConfigurationList = 0AB72C9BE331DDAF6770CD6CF5BE74EE /* Build configuration list for PBXNativeTarget "NullSafe" */; buildPhases = ( - F47CD9FDB10262C1E179953B9FAD1972 /* Sources */, - 14FE64D42570C0C6DFD635529D1CA24C /* Frameworks */, + 3F65CDCF923CBFAF615EA6758F8BE8D7 /* Sources */, + 89AFA9A69DB2C7631C9988689473B991 /* Frameworks */, ); buildRules = ( ); dependencies = ( - 909A3B5A85919D94FFD2FB1C14CC8687 /* PBXTargetDependency */, - B93C022BF273999FEB20E297746FBF98 /* PBXTargetDependency */, - 01B48A90CD20C50BFEF75B1CE1669F46 /* PBXTargetDependency */, - 79934DD54FEF2BEC1A0CDA770C03FCE7 /* PBXTargetDependency */, - 23ED474D1163ADE9F3900D8A00F33228 /* PBXTargetDependency */, - D1AC4BF095C3F25D3F16FCC03591125D /* PBXTargetDependency */, - D2CD88F82F8DABDE10E65D17CB2B1F84 /* PBXTargetDependency */, - EA0ADEC7EF65A41957C8776967FD897F /* PBXTargetDependency */, - 8F5AA06EDC793970CAF4CA7F14C351A4 /* PBXTargetDependency */, - E07705CA20F6CAD10B8EBD749D910B6E /* PBXTargetDependency */, - E64F5E87C9746BD458FD8C52A168406E /* PBXTargetDependency */, - C9153277503E5E3037CCFF647F0307CD /* PBXTargetDependency */, - EE9CBE9109E650688963817F1336CEB7 /* PBXTargetDependency */, - 8D12B7E368E5E05C15E2890967A69DCD /* PBXTargetDependency */, - 5FCDEC442D4EC5FBD45640255DF17315 /* PBXTargetDependency */, - 9C04E97379BA92761E1A6DAD9044C693 /* PBXTargetDependency */, - 0C5C5BB07D4B4F82748EF9AB8F8ECD7C /* PBXTargetDependency */, - 5FA9F6DF4F488E96FAEBA9141A464ADE /* PBXTargetDependency */, - EEF5290DA10391AA66846B017487EED2 /* PBXTargetDependency */, ); - name = "Pods-BABaseProject-BABaseProjectUITests"; - productName = "Pods-BABaseProject-BABaseProjectUITests"; - productReference = 0035845876E7EC58331336E8112E7986 /* libPods-BABaseProject-BABaseProjectUITests.a */; + name = NullSafe; + productName = NullSafe; + productReference = 9EEF55682496FB97F53E754637C62F61 /* libNullSafe.a */; productType = "com.apple.product-type.library.static"; }; - E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */ = { + CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */ = { isa = PBXNativeTarget; - buildConfigurationList = 099D1BDED7384515086DE1419E0988FB /* Build configuration list for PBXNativeTarget "FBRetainCycleDetector" */; + buildConfigurationList = ACF41AC665BD88F01AC89270394892FD /* Build configuration list for PBXNativeTarget "YYCache" */; buildPhases = ( - 143A42EDFFDAB89490085B60C7B1537F /* Sources */, - 3DEB6CF58693553526051BAD1BB58A32 /* Frameworks */, - D27940D9155D67CE9469B95EF2E64BFE /* Headers */, + 96FF40031D4B89F73DBD67E5494F73B4 /* Sources */, + AA25CBA949EE1F715A5CDA9F84F0DDF1 /* Frameworks */, + EE0B3CFD81BEF0CE609D4F8119EF5973 /* Headers */, ); buildRules = ( ); dependencies = ( ); - name = FBRetainCycleDetector; - productName = FBRetainCycleDetector; - productReference = 93264B354E37C0A94E976DFF6F868698 /* libFBRetainCycleDetector.a */; + name = YYCache; + productName = YYCache; + productReference = 6F678A7BE9D389183549EDD18E78D90C /* libYYCache.a */; productType = "com.apple.product-type.library.static"; }; - EBE33197DFF5736FB990D1E852CCCDEE /* MLeaksFinder */ = { + D5A9684BC81FF3836EEDB27552011C18 /* BAButton */ = { isa = PBXNativeTarget; - buildConfigurationList = 4637285CC782A7CF55FAA8679A2E71C7 /* Build configuration list for PBXNativeTarget "MLeaksFinder" */; + buildConfigurationList = E402F415AC13FF31230807ECB2E00E30 /* Build configuration list for PBXNativeTarget "BAButton" */; buildPhases = ( - 21ADF8E4A2CEFF8DF9BD83066E16052A /* Sources */, - 62C68FB07092B5938E292DADBCE3C4C1 /* Frameworks */, - 50D1D9E77C044237C91A8F28E003E3D3 /* Headers */, + 21F0F5C74113F922C753CDA2DF7765A2 /* Sources */, + 647EB643955B3A451A81AD53AA3D73BE /* Frameworks */, + C3C7931CB0236F41CCFBA2F7FF72ECB9 /* Headers */, ); buildRules = ( ); dependencies = ( - AE28AE4009B8E0060787989334002D2A /* PBXTargetDependency */, ); - name = MLeaksFinder; - productName = MLeaksFinder; - productReference = E3357C2D50236DED53B1C1A8BF1F135F /* libMLeaksFinder.a */; + name = BAButton; + productName = BAButton; + productReference = FA46F427EA857EA63616BE9AD90CF75F /* libBAButton.a */; productType = "com.apple.product-type.library.static"; }; - F277FD5DFB62731C36EBF6B7E286CCA9 /* Pods-BABaseProject */ = { + DBD02925B68D475A927D89F1925CBD89 /* BAPickView */ = { isa = PBXNativeTarget; - buildConfigurationList = 5C1B5CB240EE32F872BA3D240699B75F /* Build configuration list for PBXNativeTarget "Pods-BABaseProject" */; + buildConfigurationList = 6B5869143E339731A5364B730B024A55 /* Build configuration list for PBXNativeTarget "BAPickView" */; buildPhases = ( - 9BDFBD83E96EA82005895161378BFC78 /* Sources */, - 4B3D76B8213892AB020D16833FB55532 /* Frameworks */, + A54A03AC91676DBC3E44C15CCF351ABD /* Sources */, + 6AD0378404548633841923037FCBAC54 /* Frameworks */, + 3CA0BD05EE1B89D3057A7139E82930DD /* Headers */, ); buildRules = ( ); dependencies = ( - 9160C380EC0CFBD84FC0DF6209F71078 /* PBXTargetDependency */, - 3FA7032B3AC136D26C1A30B4C2BDE35E /* PBXTargetDependency */, - 4295409E3FC01A9F51414D0BB31BC656 /* PBXTargetDependency */, - 0C8430B48B4F842102CE13B5C6CE61D9 /* PBXTargetDependency */, - 67AAB59B55F1805DB4E67377CC20E382 /* PBXTargetDependency */, - 038C934249C63DE025DA19C90FE04CD3 /* PBXTargetDependency */, - 333A681BB022266C3FFBDD7C563AA03B /* PBXTargetDependency */, - AD5B5A1A798C722B19A1557713A412D5 /* PBXTargetDependency */, - 708E912D310B841CA0D62F0EDB011610 /* PBXTargetDependency */, - BFF5AFA2FB3A5F9A5927771B6E78E3AE /* PBXTargetDependency */, - F90A62DBB9CF423A2ABB7E8C27F51FE5 /* PBXTargetDependency */, - 134ACA01319F0311296C678BE8C838C8 /* PBXTargetDependency */, - A34ED7DE809651A9E1D7864520F41340 /* PBXTargetDependency */, - 29C8E9DBA1C0F0DAE3977530C6E589EE /* PBXTargetDependency */, - 41514425ED539F1130E8741923C95A5C /* PBXTargetDependency */, - 1B3AF1D3D244745FC777C39601803D7A /* PBXTargetDependency */, - 06F2C82D8A621BD270AC6606D3CD6B51 /* PBXTargetDependency */, - 275BCC2CBF5CDEA43995A92947C0A6CC /* PBXTargetDependency */, - 4796D9E70310CB4DDC9B0483F9FD3744 /* PBXTargetDependency */, ); - name = "Pods-BABaseProject"; - productName = "Pods-BABaseProject"; - productReference = E70291ACEF1EAD6C0819A7A42F40F502 /* libPods-BABaseProject.a */; + name = BAPickView; + productName = BAPickView; + productReference = C217BF798B10CE24A5CFD2D08FD44F53 /* libBAPickView.a */; productType = "com.apple.product-type.library.static"; }; /* End PBXNativeTarget section */ @@ -4212,7 +4770,7 @@ D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0730; + LastSwiftUpdateCheck = 0830; LastUpgradeCheck = 0700; }; buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; @@ -4223,863 +4781,953 @@ en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 8BF31E0DC007D0C028B2DF6206A25624 /* Products */; + productRefGroup = 27C349FC6F031915656B5008ECD231E0 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 928353533005A4198EBDA5B700D37B64 /* AFNetworking */, - 985F42852C5AD70E725D4F06503F5C5A /* BAButton */, - DA1A7295DF2A99609DA0EEBF5E83233D /* BlocksKit */, - 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */, - 8C8C1779E3959B3BF107B00990F45010 /* FBMemoryProfiler */, - E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */, - D0D0C9D20C43FA94D4C88FBFE2601B8E /* IQKeyboardManager */, - B58AE9150F017AC1E3E69371EC850776 /* JMRoundedCorner */, - 53480ED0BE09FF49E34B1702D485CAAB /* Masonry */, - D058B89EB3B3DF45457A2DCD3971AFFE /* MBProgressHUD */, - 9EAB3E42EF957541E6C3C76D35FD008E /* MJExtension */, - 70BC44266C6FFE30D2C57129458E070B /* MJRefresh */, - EBE33197DFF5736FB990D1E852CCCDEE /* MLeaksFinder */, - 07A1458F0ECFD7D943DC4EF15E916F34 /* MyLayout */, - 39818EAD9B4F5290D508A9F1E9C33CB6 /* NullSafe */, - F277FD5DFB62731C36EBF6B7E286CCA9 /* Pods-BABaseProject */, - 274F790B97E5AE8A7AB64D8F83473603 /* Pods-BABaseProject-BABaseProjectTests */, - DED33CF4E43969F4E40F313A8A826DC6 /* Pods-BABaseProject-BABaseProjectUITests */, - 67C2E0E0C5FE7DE41F6A50F738BEFC7D /* SDAutoLayout */, - A0D476EE36FD46C7A5020DBF09EBD0FA /* SDWebImage */, - 24F2D2C1278EF320F595B3F56C58DA67 /* WebViewJavascriptBridge */, - 37D7380A52EE2E9B49BECEE4DC247D19 /* YYKit */, + 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */, + 92844E36EBBF88C45D432D8DBD41E81B /* BAAlert */, + D5A9684BC81FF3836EEDB27552011C18 /* BAButton */, + 0C26DF3C4A7B81F517436CE80F07F368 /* BANetManager */, + DBD02925B68D475A927D89F1925CBD89 /* BAPickView */, + 1D77298ECE42FEF88367950A2D83E5C1 /* BATextView */, + B6F3D6D69304DDD34A584B5BE13EED49 /* BATouchID */, + 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */, + AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */, + 8642CC820CE8C5B88C113D7F47AF4BC3 /* FMDB */, + 904F4F27FD314010A3812EB2A9306183 /* IQKeyboardManager */, + 5EAA6D463A9A35AD53DFDE7BD90DB91D /* JMRoundedCorner */, + 9DC8D9E02903E93BD0B2FEC9D846EA20 /* Masonry */, + 586F2DFA9BDCC6675C2546793A69E5CC /* MBProgressHUD */, + A316B54C67E947D23CECD230FA5BFAEF /* MJExtension */, + 04CF549EBEEE7BC87AEAE35397184D94 /* MJRefresh */, + AC139CEF10BCCB200972B4617F3CA14E /* MLeaksFinder */, + 7126A8FF47B4545643C04540D6F9CB0B /* MyLayout */, + C2A16C4461578CE67FD49F604F436B41 /* NullSafe */, + A9CEADE82CB20E7F255491FE1C30086C /* Pods-BABaseProject */, + 59D5617659A538B39BECA1B9B72A2957 /* Pods-BABaseProject-BABaseProjectTests */, + 3B0CD7617B4912791A5E244AB6D56105 /* Pods-BABaseProject-BABaseProjectUITests */, + 720000A04716EA94A7F8EAE4F7FFE0A2 /* ReactiveObjC */, + BEBC67318C6C143D4D7E5C99A2B61B2A /* SDAutoLayout */, + 6B5503127B165F8F1EF1105805C54DD6 /* SDWebImage */, + CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 0B56FB38076EAA5068696F163000CE89 /* Sources */ = { + 00C73B5A5F9582A31EA116BC20FFE657 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9B5FC4788D032DAC752CC0766A747AEE /* Pods-BABaseProject-BABaseProjectTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 056C0891E6D2A3A4FE1413A15291F91A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EF158C4CCD34CE03299979AE56845597 /* WebViewJavascriptBridge-dummy.m in Sources */, - 6C0487DAEC4ED162E3D685D83CBD6758 /* WebViewJavascriptBridge.m in Sources */, - 67CCED21027F765C38659F2051CF41B1 /* WebViewJavascriptBridge_JS.m in Sources */, - BD7807408225E207A377796273876905 /* WebViewJavascriptBridgeBase.m in Sources */, - 4FF1D5ABDD8F9D39920D0C629D545670 /* WKWebViewJavascriptBridge.m in Sources */, + 75E8694E6675A18460CC5FF0DA15C4AC /* NSData+ImageContentType.m in Sources */, + D0ECB12BC4FAC9C9DEA13E51DCD42E6E /* NSImage+WebCache.m in Sources */, + 2228684E255D03B0A95084FF8C5F78AD /* SDImageCache.m in Sources */, + 428F7F5939C25BC63348A0F068E21F7B /* SDImageCacheConfig.m in Sources */, + 99B6512419FFD9949F6510C02A15A973 /* SDWebImage-dummy.m in Sources */, + 078DAC06201563D7DFB5C55831B72CFC /* SDWebImageCompat.m in Sources */, + E244613E222DCB5A2406C048A1F7986F /* SDWebImageDecoder.m in Sources */, + 19CB48FC7AC9D4A7371CCA619ADD85FE /* SDWebImageDownloader.m in Sources */, + 6B99D2D80C641E0F351CBDEAAB0FF929 /* SDWebImageDownloaderOperation.m in Sources */, + 33C9BBA493BFCA903EFF1462B7B67D89 /* SDWebImageManager.m in Sources */, + A34B005B792D9949D839B2DF0808B765 /* SDWebImagePrefetcher.m in Sources */, + A36D266A14F17B087426D90762D61716 /* UIButton+WebCache.m in Sources */, + E4CC118CECD9FA374CCA32C3D3B01B7E /* UIImage+GIF.m in Sources */, + 44075E10A74C1321109A17F1AFEE8158 /* UIImage+MultiFormat.m in Sources */, + 0378E93F8FA705BAB02D429BA15A8BD1 /* UIImageView+HighlightedWebCache.m in Sources */, + 8F6647F255ECD395D38B819217A508E4 /* UIImageView+WebCache.m in Sources */, + A7BE167232C57C8CF5BDE3CA6A1EB77D /* UIView+WebCache.m in Sources */, + 8EDB9F8D78E3B9E94363E4A0FFDA532C /* UIView+WebCacheOperation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 143A42EDFFDAB89490085B60C7B1537F /* Sources */ = { + 2135B17E49870212AF1B9CBB5C0A7832 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4038F2778527875EBCCD377311FDEE75 /* FBAssociationManager.mm in Sources */, - BCC6D57F0B554C41C761BCD2F52927C2 /* FBBlockStrongLayout.m in Sources */, - AF7F298DAC4788868748184B44B98915 /* FBBlockStrongRelationDetector.m in Sources */, - 3EC83B36FA479649971142515128F938 /* FBClassStrongLayout.m in Sources */, - 2276F933F3775D6C59749D45521268D5 /* FBClassStrongLayoutHelpers.m in Sources */, - 3CCD46AA36C4A376E6D4D640F675CB43 /* FBIvarReference.m in Sources */, - 0F99703632B0614C473CBB32B23FC79F /* FBNodeEnumerator.mm in Sources */, - F6F39D36AC3FD30B5C3DB93B2BEEAD5F /* FBObjectGraphConfiguration.m in Sources */, - 8EAB6853B8F74DB098A88D6E9DC1A6BD /* FBObjectInStructReference.m in Sources */, - 6E33AC5DFF0361416D54D5A53EB7F196 /* FBObjectiveCBlock.m in Sources */, - FA63DECDF8259994E63CC4F81D26D9A5 /* FBObjectiveCGraphElement.m in Sources */, - D218A27EE5D7D0BA149BDD479A4FA272 /* FBObjectiveCNSCFTimer.mm in Sources */, - F42768A24AD7007A6C73A8174FE9A9CF /* FBObjectiveCObject.m in Sources */, - D951EF099FDCDECB5113C834D273A1E1 /* FBParsedStruct.m in Sources */, - 8D1CA82FB4A856C90CDAFD70277575F1 /* FBParsedType.m in Sources */, - 6D34C29ECA85648B6DD5529BEB48FFCD /* FBRetainCycleDetector-dummy.m in Sources */, - DF697C3E209D61D482E569CE723DF45C /* FBRetainCycleDetector.mm in Sources */, - AA0FEB5DAAD5F404858C39AEDA67F09C /* FBRetainCycleUtils.m in Sources */, - 2F3044B21B81C821082E67B2EA37961A /* FBStandardGraphEdgeFilters.mm in Sources */, - BA46A2C2953A82300E1D49BD9036AD39 /* FBStructEncodingParser.mm in Sources */, - 828BE170E62BBDAD675DE8A16AD2A6F0 /* fishhook.c in Sources */, + EBF571C96020B3840B90A9D80A511F5F /* BATextView-dummy.m in Sources */, + 8C25E0182BA34FA1B1AD59A0F851755B /* UITextView+BAKit.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 21ADF8E4A2CEFF8DF9BD83066E16052A /* Sources */ = { + 21EAB9A79BC94AA95C56E77F8EE83954 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 0B5A22DB32C45417EA429BCD6BD30AED /* MLeakedObjectProxy.m in Sources */, - B585A282CC68B8E2AD2967543D85331D /* MLeaksFinder-dummy.m in Sources */, - AFD32C6E8D253BFCD6389646EEB98143 /* MLeaksMessenger.m in Sources */, - C8374AFC18A6204FB1FA23E1F401A268 /* NSObject+MemoryLeak.m in Sources */, - 4722F520DE1E7EFE1E8EC4C3FC44CAC4 /* UIApplication+MemoryLeak.m in Sources */, - 5FE8F1C8E7FC2C2BFCA1E85D3FD6A121 /* UINavigationController+MemoryLeak.m in Sources */, - E229CA32ACE34EDEADB722D274FC4FAA /* UIPageViewController+MemoryLeak.m in Sources */, - F7CEBF9EDD9E89A5A00044D0F8FCB1B6 /* UISplitViewController+MemoryLeak.m in Sources */, - 94D614D8B64A95E9D9EDCE3ABA79D2F8 /* UITabBarController+MemoryLeak.m in Sources */, - 014F045F0956DB497E4FDEFBF00FFCCC /* UIView+MemoryLeak.m in Sources */, - 4275AA7FC28DD01FBC70E13B98D2FEA8 /* UIViewController+MemoryLeak.m in Sources */, + 375F406E11C336D937C08DDAE88C4ED4 /* JMRoundedCorner-dummy.m in Sources */, + 7B03977453EC7062E7485C8711A5B67E /* UIImage+RoundedCorner.m in Sources */, + 0FBE35E90EC20A754FE148388194F18B /* UIView+RoundedCorner.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 27769D2C6BDCE96A87F1ADE4208C0307 /* Sources */ = { + 21F0F5C74113F922C753CDA2DF7765A2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C026CACFE3DEEA4E7FFB7D41721D6CDF /* FBMemoryProfiler-dummy.m in Sources */, - 0DFD3B43C8895C738F3553552AFBB0AA /* FBMemoryProfiler.mm in Sources */, - CE2519EE6B6B796589E9AB8223543EB4 /* FBMemoryProfilerContainerViewController.m in Sources */, - D87E1893A7F22806AFF9CDF066A26979 /* FBMemoryProfilerDataSource.m in Sources */, - D6C1513DEDA0B77E3E3D232772F24CD3 /* FBMemoryProfilerDeviceUtils.m in Sources */, - F0652DA225748A5D27C0D8D7F2DADC36 /* FBMemoryProfilerFloatingButtonController.m in Sources */, - AE3E7B75E93B501181C432885F21A9DA /* FBMemoryProfilerGenerationsSectionHeaderView.m in Sources */, - 3516F9FFA8FF239324AA90BB278F054D /* FBMemoryProfilerMathUtils.m in Sources */, - 60AB0AF555E1740F5BDC6D73E47DD4F2 /* FBMemoryProfilerOptions.m in Sources */, - 60A38F3E4D9F2C510C0998304458357C /* FBMemoryProfilerSegmentedControl.m in Sources */, - 87770391544EEFFE524350CD59FA39F5 /* FBMemoryProfilerTextField.m in Sources */, - 4CBDCE45596026507958F76E1192CEEF /* FBMemoryProfilerView.m in Sources */, - 4245B5321654797B4991A47934C62842 /* FBMemoryProfilerViewController.m in Sources */, - 0555D2F5823F13EADB9325C869622A6E /* FBMemoryProfilerWindow.m in Sources */, - 6FF0235D26EEC959800694F16B1E7C0A /* FBRetainCycleAnalysisCache.m in Sources */, - 9A7B94DB95A6B7CB58211BC811742AC9 /* FBRetainCyclePresenter.m in Sources */, - 8B5DCDAEE0AC9174EB575E2E7F74D471 /* FBSingleRetainCycleViewController.m in Sources */, + 8130F6C217CEC1E91603C9659C8B5C24 /* BAButton-dummy.m in Sources */, + 95665C9CCFD65CA886F92B7E1CB780C4 /* UIButton+BACountDown.m in Sources */, + C99EE99A2BD1F31240E2BC87EF556D47 /* UIButton+BAKit.m in Sources */, + 939C3DA8E67BAB44457845D82C3B8D6D /* UIButton+BAState.m in Sources */, + DE755C1C9EEE8E6E49D88DD041D49AA4 /* UIView+BARectCorner.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 2CED23AFC52674AB0C9E061F4F941B04 /* Sources */ = { + 2261311B0BB20FFAAC730C6BC4FAC607 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - AA496B2DDFA155A386C4C7275422792E /* MBProgressHUD-dummy.m in Sources */, - B3512189EBC0492FD0D5223C279DC343 /* MBProgressHUD.m in Sources */, + 853A9C3D08C8663BC7CD6B9F3B2CDF82 /* DZNEmptyDataSet-dummy.m in Sources */, + 35DE995FE1330AC6A960B9A41EBA5BE1 /* UIScrollView+EmptyDataSet.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 358308E826F86E2878145B4257E6EEA2 /* Sources */ = { + 2325AD914AB5D50449F44EA9199D8148 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9888880720FEF4C3875B61493319B4A8 /* Pods-BABaseProject-BABaseProjectTests-dummy.m in Sources */, + 6F939D57C2FA1C35A059F9090913B8EE /* SDAutoLayout-dummy.m in Sources */, + F90C80BC5933114AD0B3E3AC614525B1 /* UITableView+SDAutoTableViewCellHeight.m in Sources */, + 4F2409AD0BC2345435F1790C9E6711A7 /* UIView+SDAutoLayout.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 36271EF385CFE2353BC80E39BFD5CD28 /* Sources */ = { + 27E8E3A06AAFF112FF7BC4F0117165D8 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - EC4752A6952E143D1A868F2F2400C8BF /* SDAutoLayout-dummy.m in Sources */, - 00F68793C69EA34656C0BC51623A4E1C /* UITableView+SDAutoTableViewCellHeight.m in Sources */, - 438B2CD8E9394A35B01949DF7744297B /* UIView+SDAutoLayout.m in Sources */, + F390D582745DF3516ADD4D910A2ACFFA /* MASCompositeConstraint.m in Sources */, + 1AF513D8D71B663D5422760106B13723 /* MASConstraint.m in Sources */, + 99E00D593F76D7E6C96300345E211282 /* MASConstraintMaker.m in Sources */, + 61C611ABFFC5FFF35ACE70883CB8F523 /* MASLayoutConstraint.m in Sources */, + 5B46C39A3F939EDB676981756CC24007 /* Masonry-dummy.m in Sources */, + CEF7E139022FFA4F5C99D4DC5DE67990 /* MASViewAttribute.m in Sources */, + D8D72BEC4364E9F77BCC6B8AB4E30DF3 /* MASViewConstraint.m in Sources */, + 14B65CE3038761FA8F6F5D1ECED6A562 /* NSArray+MASAdditions.m in Sources */, + B953667D411D1DCD919CBD314F568A92 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, + 548BBD5B63FA097F419829C3EE8EA068 /* View+MASAdditions.m in Sources */, + 466869E41EB306F74C8A6E87CC1539BF /* ViewController+MASAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 463F8E33F2BED79FF35340ECC2D18247 /* Sources */ = { + 2928CA56D4A4CED4F0CA63BF3200900C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 479EB0898EB9291A645CE0DC9E77FEF8 /* FBAllocationTracker-dummy.m in Sources */, - 5CF6F21E35E657C52C7A316DE5CC91B6 /* FBAllocationTrackerGeneration.mm in Sources */, - 4EB136A70316D23DE42D192ADC878FD0 /* FBAllocationTrackerGenerationManager.mm in Sources */, - C008E56970D39AAD5545E4234012E77C /* FBAllocationTrackerImpl.mm in Sources */, - 811F1EA799D99DC4CC52152AC6727F8F /* FBAllocationTrackerManager.mm in Sources */, - 2654BD200044926EB279FCB467E518E9 /* FBAllocationTrackerNSZombieSupport.mm in Sources */, - 480BCDADA52E3673CDE007C04345147E /* FBAllocationTrackerSummary.m in Sources */, - 97EC044ED22E077311919CCACAD8153E /* NSObject+FBAllocationTracker.mm in Sources */, + B21F04A0C203727DAA5D19FEC6606B94 /* BAKit_DeviceModel.m in Sources */, + 4803F176BEFA1B1DDA46E4685C29C9E5 /* BAKit_TouchID.m in Sources */, + EBF77604EBDDA71E2C50ABE736B6A995 /* BATouchID-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5091D722EFC3A558FE7F6A62671FD745 /* Sources */ = { + 2DBE36C715FB48FA9BEC2FA52D92972E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1F44F182C55C5320BFF4F74CB5E4092A /* AFAutoPurgingImageCache.m in Sources */, - 290931DC1EE8D0B72C83555DA72253DD /* AFHTTPSessionManager.m in Sources */, - 4DF585895E8CD3C010BF93D6DF48B54F /* AFImageDownloader.m in Sources */, - D9C39D054A13CEBB837551208CE66FDB /* AFNetworkActivityIndicatorManager.m in Sources */, - 9A0D670D80FE9FE0B4499FC3212F055C /* AFNetworking-dummy.m in Sources */, - B19379F938132B183E44912BC25DB806 /* AFNetworkReachabilityManager.m in Sources */, - 0BC82D8C499A16ED0C138139D053BB7F /* AFSecurityPolicy.m in Sources */, - 4664724C03598493E1CEB48C745F447F /* AFURLRequestSerialization.m in Sources */, - 1EBEFB5E6D7DC300C503592C80CC8E16 /* AFURLResponseSerialization.m in Sources */, - 85764374184EC2477AACD1ECF9A5A390 /* AFURLSessionManager.m in Sources */, - 2CDA1380006B420F20274ACC6B56DCA5 /* UIActivityIndicatorView+AFNetworking.m in Sources */, - D9370F40F152201BA2D91F6779F615F9 /* UIButton+AFNetworking.m in Sources */, - BD128F4DAE238F64FA6F88DE2235DC9F /* UIImageView+AFNetworking.m in Sources */, - DFAE6413E25C223E9FD2650F19B1FAF3 /* UIProgressView+AFNetworking.m in Sources */, - 9177FA86BC19AB14D506D2D634CD1063 /* UIRefreshControl+AFNetworking.m in Sources */, - CCE866B885DF2C81514BD21FC247BF2E /* UIWebView+AFNetworking.m in Sources */, + CF60CDD7FC54D81361766A68E9BB70C8 /* BAActionSheet.m in Sources */, + 3FAD482A58C0DF35FF2B74E883C1865B /* BAActionSheetCell.m in Sources */, + 9E8A25E2EB31D3751C563994A7DC71A5 /* BAAlert-dummy.m in Sources */, + A8D8C81D5D7B58215ED5DC8EAEB20424 /* BAAlert.m in Sources */, + 30ED24B307C7A36FB5FE4B28D75ADFE9 /* CALayer+Animation.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6FB78DE9D03FACA26E76D4C9445FEF1E /* Sources */ = { + 3F65CDCF923CBFAF615EA6758F8BE8D7 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - AEE9839CCD5CF8AA0DC3D411CC2B9402 /* IQBarButtonItem.m in Sources */, - E531777A14ED917021F4BDC75DE4E9DE /* IQKeyboardManager-dummy.m in Sources */, - 149AB7AF81F8643F035A484727F92D63 /* IQKeyboardManager.m in Sources */, - BA15999F5676ACB799A4A4CA4241210F /* IQKeyboardReturnKeyHandler.m in Sources */, - F8CA8FA6938CAD4AF94B8322E65E71A6 /* IQNSArray+Sort.m in Sources */, - 2AEE9D9F9CB72B98F5DAE5AE1906462B /* IQPreviousNextView.m in Sources */, - FE4C33EB7702BC7EDE592ACD89C2EAB5 /* IQTextView.m in Sources */, - 6EAE44A4D1A4916FA680BCE11E63795B /* IQTitleBarButtonItem.m in Sources */, - 6DB6465EB0B439C49BAE38708AB21C6D /* IQToolbar.m in Sources */, - 685A7C29642B2A05030F6EE34BD55879 /* IQUIScrollView+Additions.m in Sources */, - 6479867A7C6B6817CD88E0E9B6255206 /* IQUITextFieldView+Additions.m in Sources */, - E058ED481784DB809A21261133DE5FCC /* IQUIView+Hierarchy.m in Sources */, - 40D26CACC0D931F5FDE0F3EE76188A45 /* IQUIView+IQKeyboardToolbar.m in Sources */, - 57F2D418F2B371587BBB1571962C5BA7 /* IQUIViewController+Additions.m in Sources */, - 006F18B57BBD06D92D1B57F6BE1BD9F7 /* IQUIWindow+Hierarchy.m in Sources */, + B0C95A64C2DF64B2CE8F10BB44E44F37 /* NullSafe-dummy.m in Sources */, + 26F516FA78F17CC80E8A8AA0787577D4 /* NullSafe.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 831B4D468BEFFA36C070B3E5FCEB0A24 /* Sources */ = { + 538968F467379B2A0E4EFC6725C96E5D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 27E8139ED32F1A2770ABC880760DA012 /* MyBaseLayout.m in Sources */, - 1E48D4BBDE4668F857067186BA24B29F /* MyDimeScale.m in Sources */, - 5B12C60EB6C020374FCE09EB30C1FEEA /* MyFloatLayout.m in Sources */, - C4DE5268953918477EE495B4507DC8F6 /* MyFlowLayout.m in Sources */, - DC385EC127CD7D7BEE66F48D28002372 /* MyFrameLayout.m in Sources */, - F24DD04970442BA79A94F4490928744D /* MyLayout-dummy.m in Sources */, - E1517AF43BB1A6D83BB1974D83F663EF /* MyLayoutDime.m in Sources */, - 3F142396BD956585FAF5E4307AD20A57 /* MyLayoutMeasure.m in Sources */, - ECC5CE14CD52A0B4261142912113523F /* MyLayoutPos.m in Sources */, - EFFB0528C2A3CF06634EA593BA9B124A /* MyLayoutSizeClass.m in Sources */, - 58D579EA720938163D34D6CEF757C640 /* MyLinearLayout.m in Sources */, - A21536447A1FE467F02792FD307BD2BB /* MyMaker.m in Sources */, - AE7A0DA2E693624A321511A6B14FAFF3 /* MyRelativeLayout.m in Sources */, - E4B7C339ADB74AF708C5759AD2A34271 /* MyTableLayout.m in Sources */, + A2BB3206E41D307B932B2B9E9DB93D29 /* MKAnnotationView+RACSignalSupport.m in Sources */, + E12695AC9D3F7A09372C6DD20CFBEAD7 /* NSArray+RACSequenceAdditions.m in Sources */, + 0BF0406B99C9D40B97754DEF3F1BB40B /* NSData+RACSupport.m in Sources */, + F2D2E00D6D56AFDDCD5E4C870E5C23BC /* NSDictionary+RACSequenceAdditions.m in Sources */, + 5FAAFB7774A9CF9C75C3B930C5538F56 /* NSEnumerator+RACSequenceAdditions.m in Sources */, + AD8B5C73E4469C0C98A263777F305710 /* NSFileHandle+RACSupport.m in Sources */, + FA768A4F72E8CD1F358A566049F6F78D /* NSIndexSet+RACSequenceAdditions.m in Sources */, + 528CB1724C6F2D469237AC1148FC0184 /* NSInvocation+RACTypeParsing.m in Sources */, + 4383226A07F73DA32817AE21693C6EB1 /* NSNotificationCenter+RACSupport.m in Sources */, + 38D21D09D7DC5C341EAD47F13CCA34CD /* NSObject+RACDeallocating.m in Sources */, + DAE39F8E699DCC6049163E7293494401 /* NSObject+RACDescription.m in Sources */, + E2C4D5A6AC8758AE155AE8282CAA85A6 /* NSObject+RACKVOWrapper.m in Sources */, + 3892AD2E3C45334DD27E8686245CC509 /* NSObject+RACLifting.m in Sources */, + CDE542FD1A5A11E7D0376375D561E9B5 /* NSObject+RACPropertySubscribing.m in Sources */, + A6C0859344AF583A7E835D1EB2A61CF1 /* NSObject+RACSelectorSignal.m in Sources */, + 3A5AFEAEBF16D153E69669B9B61A2D79 /* NSOrderedSet+RACSequenceAdditions.m in Sources */, + AA6B5B9FA2B8FE2455163E0FB2249906 /* NSSet+RACSequenceAdditions.m in Sources */, + 0D74BB49C7FCD6D149369AF58E560D37 /* NSString+RACKeyPathUtilities.m in Sources */, + 8DA09345A151E6C8FF767D4457442349 /* NSString+RACSequenceAdditions.m in Sources */, + B745A8E8B2AE642E5EF29A477F7D3428 /* NSString+RACSupport.m in Sources */, + AFEC22C633375B36456C7848FDB4A94D /* NSURLConnection+RACSupport.m in Sources */, + 18A8F7B9490D287E5EE7787C35FB7A37 /* NSUserDefaults+RACSupport.m in Sources */, + 08BEF10BA299EEDC0A0787F7A488E1E8 /* RACArraySequence.m in Sources */, + 7DE5229A02A082342649D63AE3D9BDB7 /* RACBehaviorSubject.m in Sources */, + 4E9ED3B511284582E51B9F174A04D7E5 /* RACBlockTrampoline.m in Sources */, + E381BACE805B2AD472E03A1156D9054C /* RACChannel.m in Sources */, + F519D1ACAC1396A2C05C5272F88FD526 /* RACCommand.m in Sources */, + 1861BD680146448213C3485056697C29 /* RACCompoundDisposable.m in Sources */, + 567041C667DABD3C23072A5398212368 /* RACCompoundDisposableProvider.d in Sources */, + 4A5370224316C4FDC97DFDE77E543185 /* RACDelegateProxy.m in Sources */, + 1E9F08BC9F8D7DB75AEC6943DF63747B /* RACDisposable.m in Sources */, + BAC5042E83AE7F65D4341B9CB941F341 /* RACDynamicSequence.m in Sources */, + 9583FD3FEB50DF2110A43EB6DD7765BE /* RACDynamicSignal.m in Sources */, + 1E0ABF8AF92A609FA30D28620E76ABAF /* RACEagerSequence.m in Sources */, + 4D4481D7CCAB65F56FCE65940D66E398 /* RACEmptySequence.m in Sources */, + E2F414ED0D18F10AB46E2A73D961696B /* RACEmptySignal.m in Sources */, + 6C7A3365D10F96F281FB0181BFEAC7AB /* RACErrorSignal.m in Sources */, + 2006BFE5ED826610538CE41074CA85D6 /* RACEvent.m in Sources */, + 89BB399DD4ECCB1A6DB93384DE41B8C0 /* RACEXTRuntimeExtensions.m in Sources */, + 202AF6D3D075E0A02AF90E4B4880C802 /* RACGroupedSignal.m in Sources */, + D73AB015637CF9C779610A91DAA0307C /* RACImmediateScheduler.m in Sources */, + 688B82109A6B9EBFA545C40F9981230D /* RACIndexSetSequence.m in Sources */, + 65211C8401943694C84504AD2841AF41 /* RACKVOChannel.m in Sources */, + F9928811ED6D5CF357E847654C1BAA1C /* RACKVOProxy.m in Sources */, + C8884A693922DDC345E3FDAFCBEEEBAC /* RACKVOTrampoline.m in Sources */, + 2779B4204D238B10720B1D2D39EBB8BC /* RACMulticastConnection.m in Sources */, + 3EDF9409FF56DD9231E3F5C508293AF7 /* RACPassthroughSubscriber.m in Sources */, + E9CF168BFBD6CF942B0B78C3931AA8F6 /* RACQueueScheduler.m in Sources */, + 511E62CC288F9D0BAB773E7508C54BD2 /* RACReplaySubject.m in Sources */, + 1E934391B59C68B729E3E2CB6CDF3AE7 /* RACReturnSignal.m in Sources */, + E6D8B8B5C270268865260902A54F6E21 /* RACScheduler.m in Sources */, + 2840200811C169B537D1AB30BD1BE5BE /* RACScopedDisposable.m in Sources */, + 6A7AEB37893207A008195A51B9E94772 /* RACSequence.m in Sources */, + 1C9B1CF8D54D6E13EB64E5DD4D9BCE30 /* RACSerialDisposable.m in Sources */, + B57DA2EF743D46651B10283F2F8C79CF /* RACSignal+Operations.m in Sources */, + 154F16EC176ACD9BD1510EEA6013FBFE /* RACSignal.m in Sources */, + D6BF473AFAA64B302157344251239F9B /* RACSignalProvider.d in Sources */, + 6B1B0B7AA37EE1D9E4DF6480BFBEF3B3 /* RACSignalSequence.m in Sources */, + 95CB5A60FC847EE6652F07A2D5026926 /* RACStream.m in Sources */, + 791CD6031B6267F1C4035A0FDE50753E /* RACStringSequence.m in Sources */, + 1940150B3B5DA4FA97D8217A85CD7DE3 /* RACSubject.m in Sources */, + 28C7CBBF6E282E66DA76FD2CE4C4CE5A /* RACSubscriber.m in Sources */, + E862E5CD709BA7304F5E80F1C409FF0D /* RACSubscriptingAssignmentTrampoline.m in Sources */, + 1538CDC5EE69D8FF5CAB596D5C08C4E5 /* RACSubscriptionScheduler.m in Sources */, + 8442562E89006042C5F1AEC0E7597322 /* RACTargetQueueScheduler.m in Sources */, + 12FB4F1EED567495CE59A60213867892 /* RACTestScheduler.m in Sources */, + F3F1360A716B0907F986122F0B0A5F20 /* RACTuple.m in Sources */, + 63834DBC3194C7E71951973418FBB170 /* RACTupleSequence.m in Sources */, + 6ABDBB0428E5672AEA19FCFBBFFD2F12 /* RACUnarySequence.m in Sources */, + D3515C73F9E2E4E52D329299760642A8 /* RACUnit.m in Sources */, + A2E9E9D97C3F9E421371240AB925AAF1 /* RACValueTransformer.m in Sources */, + E8282933FB50EABD6C7ECE449B3A16FD /* ReactiveObjC-dummy.m in Sources */, + E4FFC42D0FCC4DD4E79B931206552F1E /* UIActionSheet+RACSignalSupport.m in Sources */, + BABB8E8AE74B58D9DC37F30962D684BB /* UIAlertView+RACSignalSupport.m in Sources */, + DAD0FAE59A407688AF3D1AC65B3BC400 /* UIBarButtonItem+RACCommandSupport.m in Sources */, + BCBB7013F639112A6CE80E0F0F992102 /* UIButton+RACCommandSupport.m in Sources */, + 8D96DA6EBC17B5E077606546B89A1948 /* UICollectionReusableView+RACSignalSupport.m in Sources */, + 717931389BD269B98A41E303FFB044D4 /* UIControl+RACSignalSupport.m in Sources */, + B09ACCABBCE259273E3C3D08E277D8D0 /* UIControl+RACSignalSupportPrivate.m in Sources */, + C6DADCD0353AEE5BAAAA1D7FC324CC45 /* UIDatePicker+RACSignalSupport.m in Sources */, + 4B3D72803EAFFC67F70C9F33E18E0E80 /* UIGestureRecognizer+RACSignalSupport.m in Sources */, + 0C98068993F234C035CFF4B331F31774 /* UIImagePickerController+RACSignalSupport.m in Sources */, + BF74696EF094DB98236F1466B59649C1 /* UIRefreshControl+RACCommandSupport.m in Sources */, + 684FBDB6507EDA2227AB548F3E7A0777 /* UISegmentedControl+RACSignalSupport.m in Sources */, + 25AB8C276F7E356D09D38ED8E87DC314 /* UISlider+RACSignalSupport.m in Sources */, + C8C314277319859A56ACC3981AE1B73F /* UIStepper+RACSignalSupport.m in Sources */, + FB6B82B23C0980BA952729E43124A788 /* UISwitch+RACSignalSupport.m in Sources */, + 90D6D6EC05ACD0CFCDA05FBFFF888B75 /* UITableViewCell+RACSignalSupport.m in Sources */, + 003C49BF565553CCC13B5972C8BDE7D3 /* UITableViewHeaderFooterView+RACSignalSupport.m in Sources */, + 1A53E8AE5C2491328F12FA8C7DB6A836 /* UITextField+RACSignalSupport.m in Sources */, + 6DD8A0E2B36DDF8E41ECB8C44EEE3832 /* UITextView+RACSignalSupport.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8E893BB92D126D8850E931C08E2EE1B8 /* Sources */ = { + 7B5E5F4B965BCE948526003E8BF9E99B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6D348920EA6AF71077AE9C157BEFAA51 /* MJExtension-dummy.m in Sources */, - 2FD3739A31A56E4D7D594C783E9E9541 /* MJExtensionConst.m in Sources */, - 38915EB1AED5A57209BC2BE02D7568AC /* MJFoundation.m in Sources */, - C3AFA6FFBAD63141CDC0FE98B7AE18DA /* MJProperty.m in Sources */, - 259A59B384798F57C2020DD58C8B13F0 /* MJPropertyKey.m in Sources */, - 609B35523D8E082C07EFC109017DC9A9 /* MJPropertyType.m in Sources */, - 7649AFAAF84436233C7AA0236EF4B018 /* NSObject+MJClass.m in Sources */, - 14B6D7130587884124D610519251CAE3 /* NSObject+MJCoding.m in Sources */, - 0963AEF6E13013896F86C1DFD5F50D37 /* NSObject+MJKeyValue.m in Sources */, - 58B6E3E637373E5BA0376AE185982C28 /* NSObject+MJProperty.m in Sources */, - A7DFDB4F664DF052B3099D7014A3A642 /* NSString+MJExtension.m in Sources */, + 57189DCEA6F5EA977652E83C20F22875 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 95EC2118EB00FD3A5B7903FBA579AA80 /* Sources */ = { + 8A6920CF55C18BC7105372A0EC3BF236 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 85DDB01FB12CCFD1CA6153C26F73FCEF /* NSData+ImageContentType.m in Sources */, - 9433314F14BA4B2BE7917A4EDCB33411 /* SDImageCache.m in Sources */, - B4A350C1110440DB9C2976B76FB287A2 /* SDWebImage-dummy.m in Sources */, - B8183467EBAD504A3B55B4F223BD5672 /* SDWebImageCompat.m in Sources */, - 7F74DA1420D4CDCEAAC6C1E4EF5416FA /* SDWebImageDecoder.m in Sources */, - 4C4CBFEBE60D51CB1BFF276CC4FA95F2 /* SDWebImageDownloader.m in Sources */, - 838048D18B74B177ABC6978BB37D1A68 /* SDWebImageDownloaderOperation.m in Sources */, - ABEBCC026684BAA917A433DD31DD6CD7 /* SDWebImageManager.m in Sources */, - 89B9F20354AF4A9C511EADE8E028A603 /* SDWebImagePrefetcher.m in Sources */, - 4B918BB6FA350CA4E2E48FB612333308 /* UIButton+WebCache.m in Sources */, - 2C2D3EE50DF207F2424F46700850053B /* UIImage+GIF.m in Sources */, - 40E4052826DAD23726890F26961637B7 /* UIImage+MultiFormat.m in Sources */, - F2C12D297EC4A13542A4587C99E44EB0 /* UIImageView+HighlightedWebCache.m in Sources */, - 22C1F5CCA9410E78E62B7A9EBC670EAF /* UIImageView+WebCache.m in Sources */, - 48F8FC2F0AECC4C025ABC140065A9D43 /* UIView+WebCacheOperation.m in Sources */, + AD9F2B872334F242E611A5C9CCF86018 /* MyBaseLayout.m in Sources */, + 72D7D35B9C7D780503A1E69B61342386 /* MyDimeScale.m in Sources */, + 0CD9E8E4AF19BA77BA1634BB0D8DE16C /* MyFloatLayout.m in Sources */, + 3F8E1511E1B765762C9448C1A150671F /* MyFlowLayout.m in Sources */, + E904764D8FB281B24C4D5A729A9610C5 /* MyFrameLayout.m in Sources */, + 8AEF0AA29FB2BC2B6E9CF59F1CAEB323 /* MyLayout-dummy.m in Sources */, + BF57D0D3C431D5624A5524D5FEFFF552 /* MyLayoutPos.m in Sources */, + 3E3E0923CD2596B21F5699BD8A9F444A /* MyLayoutSize.m in Sources */, + F0D3B46458CCF360ABD737BE7179D4D0 /* MyLayoutSizeClass.m in Sources */, + 54C569700D18D40210BD66A54C295E23 /* MyLinearLayout.m in Sources */, + 059149D1FE43FEEBB99B03417454CB57 /* MyMaker.m in Sources */, + AB67E47EF7869038D5E0A57EA08CB693 /* MyPathLayout.m in Sources */, + 05132F1E088CE4719C7F227B04243365 /* MyRelativeLayout.m in Sources */, + 2319AE811644B493BAFC885669A9A3C1 /* MyTableLayout.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 97710A67195C22391F48F84261DA8BD4 /* Sources */ = { + 9087206CF402094899352A19C262EFF6 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C13F1C5C4E2DCB6F7E0F9F01FA2C2124 /* NullSafe-dummy.m in Sources */, - B38BA63DE02341E9AB873784FFA6FE7E /* NullSafe.m in Sources */, + 20EB55C7F6500666DA055783E6803BCE /* MJExtension-dummy.m in Sources */, + 4A658AACD7DC9B7012BFA2A1E21A524E /* MJExtensionConst.m in Sources */, + F0A828EC72CD7FB7ABFDD5B5736EF7F8 /* MJFoundation.m in Sources */, + 8E7BC04EF0E086E356FF20FB72CFCF02 /* MJProperty.m in Sources */, + 9F39FCC5EFE5F66AFA01AB0F2E9065FA /* MJPropertyKey.m in Sources */, + 0DAE61EE8CFDFB7FB297590A54105F92 /* MJPropertyType.m in Sources */, + C214E3582DE2BE5E85F81912A8D66702 /* NSObject+MJClass.m in Sources */, + EAEEC5EDA062152C206B868F228B2D08 /* NSObject+MJCoding.m in Sources */, + 34B22D755CA7E16A822E9C09ACFBECD9 /* NSObject+MJKeyValue.m in Sources */, + 3A135E858450F155E28A1F19CF0D0332 /* NSObject+MJProperty.m in Sources */, + BD35528AF6A5D15D4BAE46A5D414177F /* NSString+MJExtension.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9BDFBD83E96EA82005895161378BFC78 /* Sources */ = { + 96FF40031D4B89F73DBD67E5494F73B4 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 566D8F1463DF3601861C0E0C304CDC1E /* Pods-BABaseProject-dummy.m in Sources */, + FD75BF9A064E7F30DEB21CA6B0C5F174 /* YYCache-dummy.m in Sources */, + FD6FD2A233EAD00D04FA88DD394857C7 /* YYCache.m in Sources */, + 657B5E1587868A2227379DF94D13F237 /* YYDiskCache.m in Sources */, + CC222B9474D9C43EAFE8D7205B452B6F /* YYKVStorage.m in Sources */, + 4FD48058F41DC4DE8E50732088ECAE2C /* YYMemoryCache.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9D8B89A7675E808BD8C416226560B263 /* Sources */ = { + A54A03AC91676DBC3E44C15CCF351ABD /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E9C9E045A4DEC75BF1F8EAC82F66B6C3 /* MJRefresh-dummy.m in Sources */, - 626A921BA28D1E219568AFA9A9F67ABB /* MJRefreshAutoFooter.m in Sources */, - 09E03A16C24F7463E5DB6A84F1396E0A /* MJRefreshAutoGifFooter.m in Sources */, - 3B6EFBA75F4732825DE1A1E8CA7B9417 /* MJRefreshAutoNormalFooter.m in Sources */, - A0305454E9E336002754077CA24F927A /* MJRefreshAutoStateFooter.m in Sources */, - B683CFA709BB62B56AC13D3017F56010 /* MJRefreshBackFooter.m in Sources */, - 591F302AE7DF328BC509C4A31544F090 /* MJRefreshBackGifFooter.m in Sources */, - 3A1E775BBC5949BF87E7A743D89F003B /* MJRefreshBackNormalFooter.m in Sources */, - EEA84C1A209F5417A75FB129CC3F22ED /* MJRefreshBackStateFooter.m in Sources */, - 1F3585F149FCF78A54BE4D46FE15FCEC /* MJRefreshComponent.m in Sources */, - 42B48D4AFDE43C0D1C3204C8DE7556AC /* MJRefreshConst.m in Sources */, - 11BD0A6C1E6B49EBA6EC80B24EC274B1 /* MJRefreshFooter.m in Sources */, - 6246319AFA5965F24CF21A3F0863A9E4 /* MJRefreshGifHeader.m in Sources */, - 3FF8EF9B70D8D84033BF59952D32A730 /* MJRefreshHeader.m in Sources */, - 24EF18CED914BFB97D469CF93BB5D7B9 /* MJRefreshNormalHeader.m in Sources */, - B3E688BC4BC0E79707E6E9D05FE00DC7 /* MJRefreshStateHeader.m in Sources */, - 0E1FA3BC542694799F3C4CD261299859 /* NSBundle+MJRefresh.m in Sources */, - A9596B04A7B443EA2E5A50E3990A1C39 /* UIScrollView+MJExtension.m in Sources */, - B679B503BFDBF9612F6796287CF3FB22 /* UIScrollView+MJRefresh.m in Sources */, - 97824FC0FDC3A4D8FF80AE6717C0F83D /* UIView+MJExtension.m in Sources */, + 5F46FA2DA1E9903D4E4AC2296A5E2D3B /* BAKit_PickerView.m in Sources */, + B068500226B60EC7436ABD5E0F2FE33E /* BAPickView-dummy.m in Sources */, + E7BAB4DFB5CFC24C291C46D44DF3DF52 /* NSDate+BAKit.m in Sources */, + DA31E6B835805273D8285C2FC8118DF4 /* NSDateFormatter+BAKit.m in Sources */, + D7324A85467742EE0D02E130B33A814F /* UIView+BAAnimation.m in Sources */, + 2FFC0B37153ECB644FB44590FA7870F0 /* UIView+BARectCorner.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BF5A9E7C1BAD1634608A9C22251F3B36 /* Sources */ = { + AAEE4C1DF970D446DF57CA3DDD16AD00 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F4AA2299205DADFF55B7C602DAF95973 /* MASCompositeConstraint.m in Sources */, - 1B2F3D8DDFDA028A5FBF9D9571A59F20 /* MASConstraint.m in Sources */, - 067D10BA1984BA3497E9211A65FC2048 /* MASConstraintMaker.m in Sources */, - 4FF8E2D1193DD5C5E02861F16802AEBD /* MASLayoutConstraint.m in Sources */, - 712980BAE00F43D62C7D3B63840D3DF4 /* Masonry-dummy.m in Sources */, - 635C6117BA4F7576BC19343A7965A8BD /* MASViewAttribute.m in Sources */, - 71B4B31C29150345DDAEAE1C9CCE8F1E /* MASViewConstraint.m in Sources */, - D33286950C9CB1F933C6829BD2638007 /* NSArray+MASAdditions.m in Sources */, - 3FE106A8255FE6832D30B96EC0466D90 /* NSLayoutConstraint+MASDebugAdditions.m in Sources */, - 6FC6586871A6303509B134E0B50AB287 /* View+MASAdditions.m in Sources */, - E0AB941C52556A640214FB7024D47C6F /* ViewController+MASAdditions.m in Sources */, + A906A376A93C1C83BB89E8F63A663F43 /* AFAutoPurgingImageCache.m in Sources */, + E81A3DDBBA7965126D98EEA4C35E7363 /* AFHTTPSessionManager.m in Sources */, + 211646AEE68A3577495B0DF917A0DCDC /* AFImageDownloader.m in Sources */, + F8B71BB9667E21385D7AAEFEC796BAE4 /* AFNetworkActivityIndicatorManager.m in Sources */, + 63299DE5DEA29075FADA35711169188E /* AFNetworking-dummy.m in Sources */, + 19CFCF718B674B91847980FA20429558 /* AFNetworkReachabilityManager.m in Sources */, + 0A1CE7CE58B28609B573D4058ABDD616 /* AFSecurityPolicy.m in Sources */, + FB9AA5207284E33FFC55FEB308BFA71F /* AFURLRequestSerialization.m in Sources */, + C4D12D56B5E4323CDE6A77AEF30D4D9F /* AFURLResponseSerialization.m in Sources */, + 064EC4AA8FCCD08F2037037B1E672DBF /* AFURLSessionManager.m in Sources */, + 7B12269BEFA5305C78EC3D22AB2B1CEC /* UIActivityIndicatorView+AFNetworking.m in Sources */, + 2612D2B9BEA56B8CB2B361AA0BAB599F /* UIButton+AFNetworking.m in Sources */, + 2BCD3F861A5F4CF448072C4692AD130D /* UIImageView+AFNetworking.m in Sources */, + D486C538AE3151018303619712539B4C /* UIProgressView+AFNetworking.m in Sources */, + 12FCB056A2B7051B0D91B16CAFE85C1D /* UIRefreshControl+AFNetworking.m in Sources */, + 17E74D623462991F19748A7F99CF8ED6 /* UIWebView+AFNetworking.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - D5B0B842F5F227D0CC2355E99F842452 /* Sources */ = { + ADE36E87832B736E1FAF9E50036C1530 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 38FF77DC6F076F9A8F92A58A51FCD6EB /* BAButton-dummy.m in Sources */, - 89B8672D6374A9BA279D225EC45F5269 /* BAButton.m in Sources */, + 2C41E93CF9F63753E9F5D4AF7410C9E6 /* FMDatabase.m in Sources */, + 7CDBF7EA5C30D66F866F8E3BA32F1712 /* FMDatabaseAdditions.m in Sources */, + 9C0908154FC1320D13F5FA40C47E47D7 /* FMDatabasePool.m in Sources */, + 903D16EEE10FFB91B8B4742586EDC09F /* FMDatabaseQueue.m in Sources */, + C40CFE1274D588CA1A9DF9394BF76EAE /* FMDB-dummy.m in Sources */, + F42D3D33B0FD8814A3C33FC46FE1690A /* FMResultSet.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - DA9B89A0A4D9022D855750CD7B6D2788 /* Sources */ = { + CEBA4AB29C20B790C6D91F47EF9D0185 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E5962B95DFB52657991ABE4323CECC00 /* _YYWebImageSetter.m in Sources */, - 4C5E9DE7937995E6B6A34315FF8DB64B /* CALayer+YYAdd.m in Sources */, - C41DFB2F9A72BB8A1566E5F80EA3B7F9 /* CALayer+YYWebImage.m in Sources */, - 9F6FD5E4DE5C4EB64AAA465E68FCC765 /* MKAnnotationView+YYWebImage.m in Sources */, - 04A855F7BAE10AE697401F7D3532E938 /* NSArray+YYAdd.m in Sources */, - 580D3BA1BD0F93D614DF27F1B35787FB /* NSAttributedString+YYText.m in Sources */, - F8E226DB411BFD87FC3F7681F98114FE /* NSBundle+YYAdd.m in Sources */, - 5B28F893F9F0F2271C3485FC68C3B44F /* NSData+YYAdd.m in Sources */, - 895BA4F70452014AED2484F225AF281B /* NSDate+YYAdd.m in Sources */, - B0578F009CD0016215E2077CCA012D3D /* NSDictionary+YYAdd.m in Sources */, - 79BBDEE83CFBBD010F88DD3AECC8D3CB /* NSKeyedUnarchiver+YYAdd.m in Sources */, - B409757E827F566779676A8CC6292714 /* NSNotificationCenter+YYAdd.m in Sources */, - B3DD4C828576A28788D84A44FC89F507 /* NSNumber+YYAdd.m in Sources */, - 5B58B5C42016663F06F4ADA6C93686DC /* NSObject+YYAdd.m in Sources */, - F5283F0FBFD102881B2A2EB1D997582E /* NSObject+YYAddForARC.m in Sources */, - CFB39679AA924EF94E92284FBCA6D420 /* NSObject+YYAddForKVO.m in Sources */, - 28A8E94E82C0259F99D8C3608B3BEB2C /* NSObject+YYModel.m in Sources */, - 272A3B51FD7D1A3586E668A57678DFC1 /* NSParagraphStyle+YYText.m in Sources */, - ACBCDF4294B6A8BB7C742B0F36CFE333 /* NSString+YYAdd.m in Sources */, - 5FA5D8F71A7A996186EF67FB1C8B506F /* NSThread+YYAdd.m in Sources */, - AC3B86EEF0CC4B6F9C1D3CF7BF3464A9 /* NSTimer+YYAdd.m in Sources */, - EA59D93C0DB8BD6C255DCFED262FE017 /* UIApplication+YYAdd.m in Sources */, - 79C4895ED4C0FF8F9954811BED35B463 /* UIBarButtonItem+YYAdd.m in Sources */, - 0ECC49B53E7D68F3713FC8BD8977FE90 /* UIBezierPath+YYAdd.m in Sources */, - C8DCB77D91697CBB4A82E655D488995A /* UIButton+YYWebImage.m in Sources */, - 8ADEC33740B3F65850D44F280433A537 /* UIColor+YYAdd.m in Sources */, - A588D6AC3B0CD9ED62BE3A79BE14804F /* UIControl+YYAdd.m in Sources */, - 4E52F4ADB8675237829C8E518F9AC3D0 /* UIDevice+YYAdd.m in Sources */, - DDC8B02294294C26BB8EBF7A193F6C89 /* UIFont+YYAdd.m in Sources */, - 94EDC5A6C629777B263C3A096E0C17A4 /* UIGestureRecognizer+YYAdd.m in Sources */, - DC4B3D230C0FA7D1E458C488DF32521F /* UIImage+YYAdd.m in Sources */, - CE55153EA111B691F0B655F5E600DC41 /* UIImageView+YYWebImage.m in Sources */, - B875B8B4DA2926082103E045C3FA0859 /* UIPasteboard+YYText.m in Sources */, - FE01BA6A01FF9850658526DEB6E3762B /* UIScreen+YYAdd.m in Sources */, - E6AD346A0F4A297D39790831FCA99D4F /* UIScrollView+YYAdd.m in Sources */, - F66926E808A751FB587DB34778255261 /* UITableView+YYAdd.m in Sources */, - 589E73DB3A4CD8B6771CDF132831E548 /* UITextField+YYAdd.m in Sources */, - 9E0D6C12E4BCE33C366C03A5BB160075 /* UIView+YYAdd.m in Sources */, - 71E44C38C78705E62F5006CD4CD9AE0A /* YYAnimatedImageView.m in Sources */, - EABD201E9E05DB1BD9AD6CF4E53CCD77 /* YYAsyncLayer.m in Sources */, - 37CED1748DCD857838B8675B49829B29 /* YYCache.m in Sources */, - 585E2E63139D737DD4D2EA85F22A8CDC /* YYCGUtilities.m in Sources */, - C917316460959B6CF1EB0B86FAF75F08 /* YYClassInfo.m in Sources */, - 2C05968F3869597E4B6FAB9636D60745 /* YYDiskCache.m in Sources */, - 7AF49791C7DB2BCD21812ECF9374A23F /* YYDispatchQueuePool.m in Sources */, - A81FB6D717B889488054755BDF512939 /* YYFileHash.m in Sources */, - E78D867BC671930C71FBAFB37C5FADF0 /* YYFrameImage.m in Sources */, - B7B0539A534536A68A64E9C64470C638 /* YYGestureRecognizer.m in Sources */, - 964CAE9ED6B18D7B25B79F1E758251CA /* YYImage.m in Sources */, - 270C2EB8E082940CA1D04C6A184B2700 /* YYImageCache.m in Sources */, - B5960FA454047E967D034479FC414DAE /* YYImageCoder.m in Sources */, - BF078560F6BFCE3DD248BC196B9CF57F /* YYKeychain.m in Sources */, - 0C8757279372BAA15C4AD87A46860FA2 /* YYKit-dummy.m in Sources */, - 9065B8EA484A5A99B3474095A6BB309C /* YYKVStorage.m in Sources */, - D658EC157FFA1E2ACD564F568916BA05 /* YYLabel.m in Sources */, - 91F4814E8D85EC992C5369058494581D /* YYMemoryCache.m in Sources */, - EE84FC76482B28CB044E8F6197BC583C /* YYReachability.m in Sources */, - 6BFD89D70358066D5EE988CD3A2C30BA /* YYSentinel.m in Sources */, - A8BFB72779F4EB75AC96FCC0153E67F3 /* YYSpriteSheetImage.m in Sources */, - 8738F34AA01C691B1BE6EEE5B85359C1 /* YYTextArchiver.m in Sources */, - DB5250056F65EAC9E3DB8049CDB39B6D /* YYTextAttribute.m in Sources */, - B9041D9CBCD4064A65F76768A2DD0009 /* YYTextContainerView.m in Sources */, - 0F780CD12343E2A5BFBF5026C004D97F /* YYTextDebugOption.m in Sources */, - 45DBD613925B852D1636F679D8DDB7CF /* YYTextEffectWindow.m in Sources */, - 3C8186E2FE94E7D9FA0876B0868654FC /* YYTextInput.m in Sources */, - E3216E4ADB979F2B578496DB76FBCA1B /* YYTextKeyboardManager.m in Sources */, - 43C53567AD4C9249F883F094C861D4CB /* YYTextLayout.m in Sources */, - 5AD5B04804880BBB9F0E48E8B57BC2BA /* YYTextLine.m in Sources */, - E86616CEA9B7E604BAEE94D045766BF6 /* YYTextMagnifier.m in Sources */, - 6DECEFEAE5BD55B2C4E900F1733B0981 /* YYTextParser.m in Sources */, - C7167A91FAF83E6CBC3C2A0CCE3D6035 /* YYTextRubyAnnotation.m in Sources */, - 95185334069730FB4E89CB76064A13E8 /* YYTextRunDelegate.m in Sources */, - E3BE7988875533E3A8771A0B5F83B871 /* YYTextSelectionView.m in Sources */, - EF5C372405CD6F1E270BF8FC0F8D0D73 /* YYTextUtilities.m in Sources */, - 2D738D02D48D3153D7038EE6807923A9 /* YYTextView.m in Sources */, - 2344E01BC94E6F79AFCB264030184D73 /* YYThreadSafeArray.m in Sources */, - F4C34EE47D747EB08072D0E6B0885D22 /* YYThreadSafeDictionary.m in Sources */, - 1A1A87D09BFBF8057A958C6CF5F73F18 /* YYTimer.m in Sources */, - 77A72BB8553F41A1676C87C771B6C1A2 /* YYTransaction.m in Sources */, - 54FB72C5966076D8AA1AB3C3C9D97A5F /* YYWeakProxy.m in Sources */, - FF8234F24E5A500CA0A50E2698DFB5FE /* YYWebImageManager.m in Sources */, - 90710737D6B3921B2559258205BC8F91 /* YYWebImageOperation.m in Sources */, + 9951C5DCBF0A1ACF8C3434402FC487DD /* BANetManager-dummy.m in Sources */, + 56ADB19187037D7702F9FAF37761F6D6 /* BANetManager.m in Sources */, + BC21D943A752BDA01E4D04CF9808D6AB /* BANetManagerCache.m in Sources */, + A30B72113FFCBF49735A9CECC944D95D /* UIImage+CompressImage.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E1019BB30C737FB75A70C72CEB214BF3 /* Sources */ = { + D11FC003B8212DB15DF8BF6041651A19 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B9289F61BBAF56C928694903618E9BF9 /* JMRoundedCorner-dummy.m in Sources */, - 14D0600F30531EEA137F11A720E5A83F /* UIImage+RoundedCorner.m in Sources */, - E11B19AC0B8CABC8494F45603A799AF7 /* UIView+RoundedCorner.m in Sources */, + 5932389EA3182D47CDE0A64DB20CB53A /* Pods-BABaseProject-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E413456B4BA31114D969632602A4C889 /* Sources */ = { + D7C932479C1FCEB09BB1AD1D3D44A87C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B23CD73FCB9CFCC88B1C93981171B9B9 /* A2BlockInvocation.m in Sources */, - 8A74EBC631493F2059CC51F432F91000 /* A2DynamicDelegate.m in Sources */, - 35CE3230014A5B98952EF4BE7F67D537 /* BlocksKit-dummy.m in Sources */, - BEDA54044F0DF5FBFE690B4E4570F823 /* MFMailComposeViewController+BlocksKit.m in Sources */, - 326BFC0387011D29CF5FF94116B88C92 /* MFMessageComposeViewController+BlocksKit.m in Sources */, - CE805A5D1DE6AA36CE6E7DABE520A7D4 /* NSArray+BlocksKit.m in Sources */, - 757166ADE968DEB86A4E9EDB1FA80B73 /* NSCache+BlocksKit.m in Sources */, - B6388C754910F72F2745D640E4EBB15E /* NSDictionary+BlocksKit.m in Sources */, - 3C6227087A9E105DB1B3A2B09B06BBA0 /* NSIndexSet+BlocksKit.m in Sources */, - 240DAD6C58BCFE616348F02803A3399E /* NSInvocation+BlocksKit.m in Sources */, - D23E725899C1A0D2448D5904EB3A8070 /* NSMutableArray+BlocksKit.m in Sources */, - 6AB319828573AEF267BA6AEB9F6BF7BC /* NSMutableDictionary+BlocksKit.m in Sources */, - 2BE321E2414962431B1A996611CBDE20 /* NSMutableIndexSet+BlocksKit.m in Sources */, - 874763D0455E6B9F5EA8EB0B8B06322D /* NSMutableOrderedSet+BlocksKit.m in Sources */, - B6D0E1870507C02ED40FB019A046AA99 /* NSMutableSet+BlocksKit.m in Sources */, - EC3C8B0E311C697F5AEA2881DB783D8A /* NSObject+A2BlockDelegate.m in Sources */, - 03F90390BB70FCFBECE813E3BC9DDA54 /* NSObject+A2DynamicDelegate.m in Sources */, - 45D33F39444225E8034E30AEDE7B3981 /* NSObject+BKAssociatedObjects.m in Sources */, - 2CBDD27BF2EBBD24A8BD3EA71DBCC648 /* NSObject+BKBlockExecution.m in Sources */, - 305D76C2BB2420B6732696C216B01B3B /* NSObject+BKBlockObservation.m in Sources */, - 28D7A6F790D250BCB5AA898F9EAFD960 /* NSOrderedSet+BlocksKit.m in Sources */, - 541F9B734C20637D5171176AC001B554 /* NSSet+BlocksKit.m in Sources */, - 3999EC69559D210C2FC9DCD3153E2B82 /* NSTimer+BlocksKit.m in Sources */, - 91C81CE21EDBED17E288C71E49ED9332 /* NSURLConnection+BlocksKit.m in Sources */, - 819B7F18C58B774F03C2B0689D5C80EE /* UIActionSheet+BlocksKit.m in Sources */, - 88D1CB619D6DE78880B03B6A986E4978 /* UIAlertView+BlocksKit.m in Sources */, - 74C5DC9948611A66BF92CD76395881A5 /* UIBarButtonItem+BlocksKit.m in Sources */, - DB761995E336C71ED4B3291F5EC1D4BC /* UIControl+BlocksKit.m in Sources */, - 7BB965A7FC99305E8567CB48667BB771 /* UIGestureRecognizer+BlocksKit.m in Sources */, - DF8E6CB243D7C0493F416AB463C8BAB2 /* UIImagePickerController+BlocksKit.m in Sources */, - 1F82D8EB1EF83781CA1DBCB8D4CA8005 /* UIPopoverController+BlocksKit.m in Sources */, - A2F19F816F2752816146D876FB861F06 /* UITextField+BlocksKit.m in Sources */, - 419465AC1FD47D619AEA221B345262A5 /* UIView+BlocksKit.m in Sources */, - A1227E5CF161196660480E34B67B50E1 /* UIWebView+BlocksKit.m in Sources */, + 8E3DC47D9C8F8C484B8B535FB46BF78A /* IQBarButtonItem.m in Sources */, + BE55E6CA41B94B735275119D91CC67C3 /* IQKeyboardManager-dummy.m in Sources */, + BF8165F578E449953F94600BE6AA9114 /* IQKeyboardManager.m in Sources */, + 94D6FC9E345F03396C02EEF2AD6A25B7 /* IQKeyboardReturnKeyHandler.m in Sources */, + 629393440ABCD73AD3D16C75C633B585 /* IQNSArray+Sort.m in Sources */, + BC04BC7CCC9DE1E6F262CCDEB98A3588 /* IQPreviousNextView.m in Sources */, + 4B0E2A3FCD260DDC14AC986F7DC9A433 /* IQTextView.m in Sources */, + F65005F3BA971FE1877ADDE49A494052 /* IQTitleBarButtonItem.m in Sources */, + C2BB4AD69433B10C2D930E85DB32F7DC /* IQToolbar.m in Sources */, + B69F47477A7A892F0185011363F212EA /* IQUIScrollView+Additions.m in Sources */, + 262F09111C574E80A4C77C5FC75D2FC5 /* IQUITextFieldView+Additions.m in Sources */, + 3F9B7B96F95416ABF95F00E750EDB4FC /* IQUIView+Hierarchy.m in Sources */, + E3D78C20D648BB0234F93D8C9E69ED4D /* IQUIView+IQKeyboardToolbar.m in Sources */, + A4223E648086FEF52D8BEF6BC331EDC9 /* IQUIViewController+Additions.m in Sources */, + DC3F788B3CCFAAEC642ACC6AE1A236E5 /* IQUIWindow+Hierarchy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - F47CD9FDB10262C1E179953B9FAD1972 /* Sources */ = { + E0D10A8DE739F8CFFE84E78BA51488DB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5A7A913439FDB234260579F29FDAF849 /* Pods-BABaseProject-BABaseProjectUITests-dummy.m in Sources */, + 7EC91A130840ED564223B9D074144840 /* FBAssociationManager.mm in Sources */, + 2E396DC8A4A1A517C66D660BFB119AE6 /* FBBlockStrongLayout.m in Sources */, + 8BDF1F8DA30C465DB6FF17EA58D0721E /* FBBlockStrongRelationDetector.m in Sources */, + 98C97192F61D773184E25D2998F220DB /* FBClassStrongLayout.mm in Sources */, + 85363CAA183427442D879B35DDDB0CE3 /* FBClassStrongLayoutHelpers.m in Sources */, + BBE4F5204B74712CAC86088D18B3E910 /* FBIvarReference.m in Sources */, + 5990488A3CE23CAC30C3A5737C3668F1 /* FBNodeEnumerator.mm in Sources */, + 7A9A1597781BC33CE61C149A11A8670A /* FBObjectGraphConfiguration.m in Sources */, + BAEE4B12537A4CA864CA8B6EF93F7D4A /* FBObjectInStructReference.m in Sources */, + DE05DC4A672845CAF53EF550D7B3E27D /* FBObjectiveCBlock.m in Sources */, + 5D52B79671BB1E3204FE57591AB56C2D /* FBObjectiveCGraphElement.mm in Sources */, + 510006C67F22B784ECA56DECA7277787 /* FBObjectiveCNSCFTimer.mm in Sources */, + CA2565BAA19A87BE87C96E472A87906C /* FBObjectiveCObject.m in Sources */, + 445559F744F9B0BADD377849C1C2B50F /* FBRetainCycleDetector-dummy.m in Sources */, + 03E287270BE3786DBC8FA7D51FDB6C3B /* FBRetainCycleDetector.mm in Sources */, + 0C301DFB402DF26D912413BB335720A0 /* FBRetainCycleUtils.m in Sources */, + 374E3648990739367CCF8E10601C79C5 /* FBStandardGraphEdgeFilters.mm in Sources */, + 7B00546EE080C2038F79D70C01900062 /* FBStructEncodingParser.mm in Sources */, + 4FE0DD2BD99DED481207CC51E6FBB31E /* fishhook.c in Sources */, + 24BCE8CFE943E7FEEE9C77AF19CCD3B5 /* Struct.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E3D9DFCB79B440EF11D2B4AAAE0DEEC1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C440CA5708F04DC122548142E76A0A8B /* MLeakedObjectProxy.m in Sources */, + B8C9C795F8301C2B982A50134284A219 /* MLeaksFinder-dummy.m in Sources */, + 0FCD50CDA3E8426D5A8EBEE334AD97AF /* MLeaksMessenger.m in Sources */, + 7ED7150308ABEE5094716C24B19321A3 /* NSObject+MemoryLeak.m in Sources */, + CA3019565485463D53694B16F8F34811 /* UIApplication+MemoryLeak.m in Sources */, + 762CE7EC21F162AF572CA8AD2DE8CE89 /* UINavigationController+MemoryLeak.m in Sources */, + C8B5C706FEB92B68B931A6FFA85E8DE9 /* UIPageViewController+MemoryLeak.m in Sources */, + 09AE1CD603FEA2710DB6CDF79034CCE0 /* UISplitViewController+MemoryLeak.m in Sources */, + BD271081D9C75795FB497E6FD6E96FBA /* UITabBarController+MemoryLeak.m in Sources */, + 937E5142168172919C2324C670510223 /* UITouch+MemoryLeak.m in Sources */, + 864C519065467C5CF9340F9E40F5C19C /* UIView+MemoryLeak.m in Sources */, + 6EA4EFB7F28637623953B1832EB6D55D /* UIViewController+MemoryLeak.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E742ED1631851E8E4DF869C1ECDD955D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + F56F1AD0D978F250A30E1980549A7EB6 /* MJRefresh-dummy.m in Sources */, + 97CA04C5B77CB7773C7F0871D0E1C581 /* MJRefreshAutoFooter.m in Sources */, + A5CC736BE68ABCDF971C27B076E538AB /* MJRefreshAutoGifFooter.m in Sources */, + EBA632EA41470F059E86A82C018FCC6E /* MJRefreshAutoNormalFooter.m in Sources */, + 6CA5641617C855A7102C7787BB154D89 /* MJRefreshAutoStateFooter.m in Sources */, + 514663D13BAD254F684191EA8897EDA8 /* MJRefreshBackFooter.m in Sources */, + DE130FE41810425BC7D6AE496D9F217A /* MJRefreshBackGifFooter.m in Sources */, + 236524396AB978EB013E1EDB702DB0D4 /* MJRefreshBackNormalFooter.m in Sources */, + 24D62FF5048CF5339C87189530FFE3D4 /* MJRefreshBackStateFooter.m in Sources */, + B0C13321D8E8246F0213C8EF755503E3 /* MJRefreshComponent.m in Sources */, + FBFE53983A247600ECF47853C2F01D4D /* MJRefreshConst.m in Sources */, + 234E79261AC257C75B8644DA099FF1C2 /* MJRefreshFooter.m in Sources */, + A974DE47B402E6956FB9B85EAEBE8426 /* MJRefreshGifHeader.m in Sources */, + 00165B02644225D503F585E39D462662 /* MJRefreshHeader.m in Sources */, + 3046977628F90F18E0C16226B3E9CC66 /* MJRefreshNormalHeader.m in Sources */, + 161B3785F561102FEFC4411D7F83DD50 /* MJRefreshStateHeader.m in Sources */, + BD9F745169ADBBD029EE0C69E68E60D4 /* NSBundle+MJRefresh.m in Sources */, + 8BE30B72D3E9BFF954B9208B3F7D656F /* UIScrollView+MJExtension.m in Sources */, + C9F6937BC265DA8CDB70746F57C570AE /* UIScrollView+MJRefresh.m in Sources */, + 729B628E992E517000943F0B724DEDCB /* UIView+MJExtension.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FCC28E36A289F7E991B78A63CD0251F9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6837AD005926AB2974513453DB787C5A /* MBProgressHUD-dummy.m in Sources */, + E6EB93F9F0E4C5727BFC3147BA91C599 /* MBProgressHUD.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 01B48A90CD20C50BFEF75B1CE1669F46 /* PBXTargetDependency */ = { + 00D3F8702FB896FBB56A724C73BAB63D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BlocksKit; - target = DA1A7295DF2A99609DA0EEBF5E83233D /* BlocksKit */; - targetProxy = A034049FCCECB82AC243382A7550899D /* PBXContainerItemProxy */; + name = AFNetworking; + target = 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */; + targetProxy = 15564FFC1CE7EF8D30E599B3EA2BA1AF /* PBXContainerItemProxy */; }; - 038C934249C63DE025DA19C90FE04CD3 /* PBXTargetDependency */ = { + 0501A6BFD0FF1A014A2F47DB0E574211 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BAButton; + target = D5A9684BC81FF3836EEDB27552011C18 /* BAButton */; + targetProxy = 08EE0E840599CB144428D80DC4FC10B1 /* PBXContainerItemProxy */; + }; + 05FDB1236D980EEAF58680B3F729CF81 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BAButton; + target = D5A9684BC81FF3836EEDB27552011C18 /* BAButton */; + targetProxy = 5E8BC6F209F2C3A86C2B01D6D850EE36 /* PBXContainerItemProxy */; + }; + 06ADCF444ED40B94B44E063FDEDD1DE0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BATouchID; + target = B6F3D6D69304DDD34A584B5BE13EED49 /* BATouchID */; + targetProxy = B97168ABDD04929D10A63DF955DF8621 /* PBXContainerItemProxy */; + }; + 09EE6CEE269BF4B11E54E7172619ED10 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FBRetainCycleDetector; - target = E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */; - targetProxy = 7DF55054DBE09CAE642AE97A2F8E4D71 /* PBXContainerItemProxy */; + target = AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */; + targetProxy = FCA8812C8EA50ED3C601C6198A4BE252 /* PBXContainerItemProxy */; }; - 06F2C82D8A621BD270AC6606D3CD6B51 /* PBXTargetDependency */ = { + 0B57D5633C05F1AD168201BCB9D1BC4A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDWebImage; - target = A0D476EE36FD46C7A5020DBF09EBD0FA /* SDWebImage */; - targetProxy = 1BC3C451DE8906FBB7A26A588A188F16 /* PBXContainerItemProxy */; + name = FMDB; + target = 8642CC820CE8C5B88C113D7F47AF4BC3 /* FMDB */; + targetProxy = 4AF09F6F674AE5220208018E8289C18D /* PBXContainerItemProxy */; }; - 0C5C5BB07D4B4F82748EF9AB8F8ECD7C /* PBXTargetDependency */ = { + 0C4DCABF52F301BCE737F1915953D24F /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDWebImage; - target = A0D476EE36FD46C7A5020DBF09EBD0FA /* SDWebImage */; - targetProxy = 2DF1D82D2F5E35DE6F9A4955079E08B5 /* PBXContainerItemProxy */; + name = BATouchID; + target = B6F3D6D69304DDD34A584B5BE13EED49 /* BATouchID */; + targetProxy = 1E253136F1BA441D33A424866D915B67 /* PBXContainerItemProxy */; }; - 0C8430B48B4F842102CE13B5C6CE61D9 /* PBXTargetDependency */ = { + 10C6F385DB5F35E2890CEABD9E48B771 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBAllocationTracker; - target = 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */; - targetProxy = 534FFF47D668F103967E4772020EF06A /* PBXContainerItemProxy */; + name = MJRefresh; + target = 04CF549EBEEE7BC87AEAE35397184D94 /* MJRefresh */; + targetProxy = AC4ADD2A266DBEBBA8E402F9E86FE449 /* PBXContainerItemProxy */; }; - 134ACA01319F0311296C678BE8C838C8 /* PBXTargetDependency */ = { + 1184564A04CE060CEFD92ABAAE5016F7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MLeaksFinder; - target = EBE33197DFF5736FB990D1E852CCCDEE /* MLeaksFinder */; - targetProxy = 6A0A0FE677977080090E3589148F31B3 /* PBXContainerItemProxy */; + name = BAPickView; + target = DBD02925B68D475A927D89F1925CBD89 /* BAPickView */; + targetProxy = 32FC691E010CCD70F16BC38B98E93001 /* PBXContainerItemProxy */; + }; + 172F34457EDA3A92A0E084A4AFFDA5BB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJExtension; + target = A316B54C67E947D23CECD230FA5BFAEF /* MJExtension */; + targetProxy = 5D8E2662D7599400306837AD5F31904F /* PBXContainerItemProxy */; + }; + 1B3E89F971EB38652EEDDD364F2669A1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BAPickView; + target = DBD02925B68D475A927D89F1925CBD89 /* BAPickView */; + targetProxy = BB0D179F7EBA93F611E28F525681A003 /* PBXContainerItemProxy */; }; - 1A132924A66A28DF280C7A471C899F14 /* PBXTargetDependency */ = { + 1E9C9CC5BF95E8338EACE824AC76010B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ReactiveObjC; + target = 720000A04716EA94A7F8EAE4F7FFE0A2 /* ReactiveObjC */; + targetProxy = B4A5C1EAD6DD1080ABA4B2F6A44650CB /* PBXContainerItemProxy */; + }; + 213318695F138F3B089F693130B83083 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; - target = A0D476EE36FD46C7A5020DBF09EBD0FA /* SDWebImage */; - targetProxy = E7451B537E2D37B4B84D7E57DE6A082A /* PBXContainerItemProxy */; + target = 6B5503127B165F8F1EF1105805C54DD6 /* SDWebImage */; + targetProxy = 8899F3986499D89F048258BF94425BF1 /* PBXContainerItemProxy */; }; - 1B3AF1D3D244745FC777C39601803D7A /* PBXTargetDependency */ = { + 232A6C93F0FCA54DA5F94070B411070E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDAutoLayout; - target = 67C2E0E0C5FE7DE41F6A50F738BEFC7D /* SDAutoLayout */; - targetProxy = A0E8B4E1F8C638CF16E512E79E5250B9 /* PBXContainerItemProxy */; + name = NullSafe; + target = C2A16C4461578CE67FD49F604F436B41 /* NullSafe */; + targetProxy = 16D43129D79FB377DFFF114C2E9E0776 /* PBXContainerItemProxy */; }; - 23ED474D1163ADE9F3900D8A00F33228 /* PBXTargetDependency */ = { + 238A7EEFDD00C784DE2187A9173B236E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBMemoryProfiler; - target = 8C8C1779E3959B3BF107B00990F45010 /* FBMemoryProfiler */; - targetProxy = 66D3A62BA0DA7529EE36641CCB9DC37B /* PBXContainerItemProxy */; + name = BATextView; + target = 1D77298ECE42FEF88367950A2D83E5C1 /* BATextView */; + targetProxy = E8050173A43BE11C8F24AE806272926C /* PBXContainerItemProxy */; }; - 24B27FA426BD882E0815BD91DA53FD2E /* PBXTargetDependency */ = { + 24E68FCA5C59AEC695E95CE42265DF65 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = IQKeyboardManager; - target = D0D0C9D20C43FA94D4C88FBFE2601B8E /* IQKeyboardManager */; - targetProxy = 91B9B9DDD31187272D3644FFD07C8B47 /* PBXContainerItemProxy */; + target = 904F4F27FD314010A3812EB2A9306183 /* IQKeyboardManager */; + targetProxy = 4F0699D34D2F418D8AD373926B8C2DCF /* PBXContainerItemProxy */; }; - 24C7ECED8CBA5B6C7ACE0249507A2CA4 /* PBXTargetDependency */ = { + 2C0D10B13BC0C1DA9F35597F51A2969A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBRetainCycleDetector; - target = E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */; - targetProxy = 34F4AA7FAFCDFD925774D521A0C86B73 /* PBXContainerItemProxy */; + name = NullSafe; + target = C2A16C4461578CE67FD49F604F436B41 /* NullSafe */; + targetProxy = 18D91D58B6BC8DD129D1F5E610C32633 /* PBXContainerItemProxy */; + }; + 2E0B10CA5F749CC6920E2C8A8546A7C2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IQKeyboardManager; + target = 904F4F27FD314010A3812EB2A9306183 /* IQKeyboardManager */; + targetProxy = FD81F75C23145EB097D073524D3739F3 /* PBXContainerItemProxy */; }; - 275BCC2CBF5CDEA43995A92947C0A6CC /* PBXTargetDependency */ = { + 30E8F3DF42C1FEA298B3388DE8E15EE5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = WebViewJavascriptBridge; - target = 24F2D2C1278EF320F595B3F56C58DA67 /* WebViewJavascriptBridge */; - targetProxy = 0B4FDDCD836D17771440EDFAA1B8BB98 /* PBXContainerItemProxy */; + name = SDWebImage; + target = 6B5503127B165F8F1EF1105805C54DD6 /* SDWebImage */; + targetProxy = 89C49D2FB913492633D0FCBCB6C02CBF /* PBXContainerItemProxy */; }; - 29C8E9DBA1C0F0DAE3977530C6E589EE /* PBXTargetDependency */ = { + 3E9042DB34B3A64F56CAA543BE0E2D5F /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MyLayout; - target = 07A1458F0ECFD7D943DC4EF15E916F34 /* MyLayout */; - targetProxy = 1D50494C3615B659D1654D1EA70E0DCC /* PBXContainerItemProxy */; + name = Masonry; + target = 9DC8D9E02903E93BD0B2FEC9D846EA20 /* Masonry */; + targetProxy = 2EA207C279828E1FDAB7777DDBB2B790 /* PBXContainerItemProxy */; }; - 2A94B6005448DD054D056AEA4E978CD4 /* PBXTargetDependency */ = { + 3F9B0D24C2404656B87730ABC66B0714 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = JMRoundedCorner; - target = B58AE9150F017AC1E3E69371EC850776 /* JMRoundedCorner */; - targetProxy = C842508F17786AF0BBC9ED6486AC5E07 /* PBXContainerItemProxy */; + name = YYCache; + target = CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */; + targetProxy = 88E3AFC64C41EA3A5764DA03E2F2022F /* PBXContainerItemProxy */; }; - 30DB1273A589CE144345FDBD3B01ECDA /* PBXTargetDependency */ = { + 4430B278F217447652903157BA30F8D9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDAutoLayout; - target = 67C2E0E0C5FE7DE41F6A50F738BEFC7D /* SDAutoLayout */; - targetProxy = 12EBCBEA5794BCEDFA0BF75D032DF156 /* PBXContainerItemProxy */; + name = Masonry; + target = 9DC8D9E02903E93BD0B2FEC9D846EA20 /* Masonry */; + targetProxy = 2162BDA9C21C1582A7398BB76C9CACE7 /* PBXContainerItemProxy */; }; - 316EFB96EC8CFDF9E3CBDF4927EEC7AA /* PBXTargetDependency */ = { + 55870960F80E0DC8F0D52C0F51308B43 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = WebViewJavascriptBridge; - target = 24F2D2C1278EF320F595B3F56C58DA67 /* WebViewJavascriptBridge */; - targetProxy = 60ACAA8BB2FF01C45B9EB27579D163D4 /* PBXContainerItemProxy */; + name = BANetManager; + target = 0C26DF3C4A7B81F517436CE80F07F368 /* BANetManager */; + targetProxy = 16A32234F5E3DFC0934AB07F50A4A1C1 /* PBXContainerItemProxy */; }; - 333A681BB022266C3FFBDD7C563AA03B /* PBXTargetDependency */ = { + 566055327948B6ACE05AEB7BB2462B0E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = IQKeyboardManager; - target = D0D0C9D20C43FA94D4C88FBFE2601B8E /* IQKeyboardManager */; - targetProxy = 47BA41182245B64AE306E925F9C6310B /* PBXContainerItemProxy */; + name = MJExtension; + target = A316B54C67E947D23CECD230FA5BFAEF /* MJExtension */; + targetProxy = A09BD46FCB625F2A0F25B7164F6480ED /* PBXContainerItemProxy */; }; - 362B2D68F338FBA0162C2D98DB834766 /* PBXTargetDependency */ = { + 5BA4CCEB24F0705F91F9A02F93443FB2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = NullSafe; - target = 39818EAD9B4F5290D508A9F1E9C33CB6 /* NullSafe */; - targetProxy = D87E940E232B368613693DBBFB079754 /* PBXContainerItemProxy */; + name = AFNetworking; + target = 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */; + targetProxy = EA7F42F6F6313E422F71304AD0D4E4AE /* PBXContainerItemProxy */; }; - 3FA7032B3AC136D26C1A30B4C2BDE35E /* PBXTargetDependency */ = { + 663DCF3314F6F622FDDDB5D1BD86BC83 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BAButton; - target = 985F42852C5AD70E725D4F06503F5C5A /* BAButton */; - targetProxy = 87150E209460FF2B4C13219C665A6479 /* PBXContainerItemProxy */; + name = ReactiveObjC; + target = 720000A04716EA94A7F8EAE4F7FFE0A2 /* ReactiveObjC */; + targetProxy = 870E373173CD997DF72214E719B8FFF0 /* PBXContainerItemProxy */; }; - 41514425ED539F1130E8741923C95A5C /* PBXTargetDependency */ = { + 66D7767DE39FC684535F1D445B142104 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MBProgressHUD; + target = 586F2DFA9BDCC6675C2546793A69E5CC /* MBProgressHUD */; + targetProxy = 7A108BA74BBD8013B7E682A5F0CDBF36 /* PBXContainerItemProxy */; + }; + 66E50335F02EB006AB7A1158B17D3F4D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MJRefresh; + target = 04CF549EBEEE7BC87AEAE35397184D94 /* MJRefresh */; + targetProxy = 1FE82DB67E0C68E549C543463661A712 /* PBXContainerItemProxy */; + }; + 695CB72B62AD089FEB5C057150089AF7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MBProgressHUD; + target = 586F2DFA9BDCC6675C2546793A69E5CC /* MBProgressHUD */; + targetProxy = 2AA33B57220A590C2939BF4326FC0F3F /* PBXContainerItemProxy */; + }; + 6A0F2B5AF993D5495AA873898D18944A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SDAutoLayout; + target = BEBC67318C6C143D4D7E5C99A2B61B2A /* SDAutoLayout */; + targetProxy = 7EB5CAFBE68F03E86DB587DB40BE7ED1 /* PBXContainerItemProxy */; + }; + 6CE7B61EB9DA825AE900104AEC4B9FC6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = NullSafe; - target = 39818EAD9B4F5290D508A9F1E9C33CB6 /* NullSafe */; - targetProxy = EE24BFCE61832390A9C8FE7B33463E50 /* PBXContainerItemProxy */; + target = C2A16C4461578CE67FD49F604F436B41 /* NullSafe */; + targetProxy = 030BCC40A429EA604CBBE459D722A72F /* PBXContainerItemProxy */; }; - 4295409E3FC01A9F51414D0BB31BC656 /* PBXTargetDependency */ = { + 71FF7C99B1B3E06DA3C31F21E48018CD /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BlocksKit; - target = DA1A7295DF2A99609DA0EEBF5E83233D /* BlocksKit */; - targetProxy = 0227BD8ABDC3748CE8F9566966D0D908 /* PBXContainerItemProxy */; + name = MLeaksFinder; + target = AC139CEF10BCCB200972B4617F3CA14E /* MLeaksFinder */; + targetProxy = DD40FF5286831E588B25B4B2B1CCF514 /* PBXContainerItemProxy */; }; - 4796D9E70310CB4DDC9B0483F9FD3744 /* PBXTargetDependency */ = { + 81EC0D4AF5445823ACF7AD0F473CBC11 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = YYKit; - target = 37D7380A52EE2E9B49BECEE4DC247D19 /* YYKit */; - targetProxy = 65A3D3E4B3F8F34B167BBBFCB8703383 /* PBXContainerItemProxy */; + name = BAAlert; + target = 92844E36EBBF88C45D432D8DBD41E81B /* BAAlert */; + targetProxy = EABCD96654A253A5B1AF12D759ADA2B5 /* PBXContainerItemProxy */; }; - 4D6FFD2671580477568F450CA2BC25E1 /* PBXTargetDependency */ = { + 82DBCD90ED1E5B735DB5A4B7067C2B22 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BAButton; - target = 985F42852C5AD70E725D4F06503F5C5A /* BAButton */; - targetProxy = 331CF2990AB76637E223B2D5631074D5 /* PBXContainerItemProxy */; + name = BATouchID; + target = B6F3D6D69304DDD34A584B5BE13EED49 /* BATouchID */; + targetProxy = 1B15B3D679F86388A02EEE21C9FDEC96 /* PBXContainerItemProxy */; }; - 5B09D824EB86B3694A5370F877A78BD9 /* PBXTargetDependency */ = { + 837482C1019E584241931C196BC03411 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BlocksKit; - target = DA1A7295DF2A99609DA0EEBF5E83233D /* BlocksKit */; - targetProxy = 7D398D1EEEEFE309936F44E7A70F3A7A /* PBXContainerItemProxy */; + name = DZNEmptyDataSet; + target = 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */; + targetProxy = F013F222D1229D6336090BA2277ED706 /* PBXContainerItemProxy */; }; - 5FA9F6DF4F488E96FAEBA9141A464ADE /* PBXTargetDependency */ = { + 85CF22CC022E0690549C08A6D952F081 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = WebViewJavascriptBridge; - target = 24F2D2C1278EF320F595B3F56C58DA67 /* WebViewJavascriptBridge */; - targetProxy = 05AFEC554C233BDBB345720866B1A93D /* PBXContainerItemProxy */; + name = DZNEmptyDataSet; + target = 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */; + targetProxy = 22AB899D6F28621DA37280B79858BAD9 /* PBXContainerItemProxy */; }; - 5FCDEC442D4EC5FBD45640255DF17315 /* PBXTargetDependency */ = { + 882E30771BF5DDB43A353E89A2BD5CFD /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = NullSafe; - target = 39818EAD9B4F5290D508A9F1E9C33CB6 /* NullSafe */; - targetProxy = B816890B3CBCE0F7BF0E2E0BA2E48106 /* PBXContainerItemProxy */; + name = SDWebImage; + target = 6B5503127B165F8F1EF1105805C54DD6 /* SDWebImage */; + targetProxy = DDBE573EFD39FA218B281015C60E10A0 /* PBXContainerItemProxy */; }; - 67AAB59B55F1805DB4E67377CC20E382 /* PBXTargetDependency */ = { + 88854B66290599207A1FBA4237934BF2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBMemoryProfiler; - target = 8C8C1779E3959B3BF107B00990F45010 /* FBMemoryProfiler */; - targetProxy = D6536C86D8F75FC2F608FAD0BD6ED65A /* PBXContainerItemProxy */; + name = JMRoundedCorner; + target = 5EAA6D463A9A35AD53DFDE7BD90DB91D /* JMRoundedCorner */; + targetProxy = 3D329C51A0C1C9505D2220FE5129F3A9 /* PBXContainerItemProxy */; }; - 67EB0BBFC77BAD8A19AFCBF21FD2EC50 /* PBXTargetDependency */ = { + 88AEB3558C9072DDCC177774AE75918B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBAllocationTracker; - target = 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */; - targetProxy = 4D46B8EEA18711968208C448EEF3FAB1 /* PBXContainerItemProxy */; + name = BATextView; + target = 1D77298ECE42FEF88367950A2D83E5C1 /* BATextView */; + targetProxy = 96946E1931594BE9D055BAC35749BF09 /* PBXContainerItemProxy */; }; - 696372CD7DFD048937F381CCF7964DEC /* PBXTargetDependency */ = { + 8C10D5325538264C425BD2B830325195 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MyLayout; - target = 07A1458F0ECFD7D943DC4EF15E916F34 /* MyLayout */; - targetProxy = 33B4F9C0A558A130F3218EC8513FDC9A /* PBXContainerItemProxy */; + name = SDAutoLayout; + target = BEBC67318C6C143D4D7E5C99A2B61B2A /* SDAutoLayout */; + targetProxy = 882A7F3A48A52727637E9D7D6BE4EDC4 /* PBXContainerItemProxy */; }; - 708E912D310B841CA0D62F0EDB011610 /* PBXTargetDependency */ = { + 903D53A7F0CC55880341822C02146A5A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = MBProgressHUD; - target = D058B89EB3B3DF45457A2DCD3971AFFE /* MBProgressHUD */; - targetProxy = 460A76C7A01BC1E018AB1F659CE2F6EF /* PBXContainerItemProxy */; + target = 586F2DFA9BDCC6675C2546793A69E5CC /* MBProgressHUD */; + targetProxy = A8C58B61A02D9B98666C65144A501AF1 /* PBXContainerItemProxy */; }; - 78906F5F39A7027C1FCD2C5B8A95A8EA /* PBXTargetDependency */ = { + 90E265E6DD74AB78686DB2F9E7F3C10B /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = MLeaksFinder; - target = EBE33197DFF5736FB990D1E852CCCDEE /* MLeaksFinder */; - targetProxy = DF7F6C7604DF0B07418963313F301FDE /* PBXContainerItemProxy */; + target = AC139CEF10BCCB200972B4617F3CA14E /* MLeaksFinder */; + targetProxy = 37FF3D1517E687FD1CA8F9AAD9F7E5BC /* PBXContainerItemProxy */; }; - 79934DD54FEF2BEC1A0CDA770C03FCE7 /* PBXTargetDependency */ = { + 997AEEEB11FAB4C2FCF92690E3DF2D41 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBAllocationTracker; - target = 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */; - targetProxy = E3539B2455F142C6129F1BE3748887DC /* PBXContainerItemProxy */; + name = MyLayout; + target = 7126A8FF47B4545643C04540D6F9CB0B /* MyLayout */; + targetProxy = E4392790DAF568A7A25B933ED0B0492B /* PBXContainerItemProxy */; }; - 7C32F174C87298702E2D5449CF817FFD /* PBXTargetDependency */ = { + 9F46A4B5AD21CBA81B8C30F001F598C4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MBProgressHUD; - target = D058B89EB3B3DF45457A2DCD3971AFFE /* MBProgressHUD */; - targetProxy = 51E42EA16726673C03A561D7BFBD923B /* PBXContainerItemProxy */; + name = BAPickView; + target = DBD02925B68D475A927D89F1925CBD89 /* BAPickView */; + targetProxy = 2FA5B815424135D7EA95D85E8C50E86B /* PBXContainerItemProxy */; }; - 7E0E591F6420F20EB8A798A61FA97EA8 /* PBXTargetDependency */ = { + A160CDC37E6440231941D2E75D1A0866 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBRetainCycleDetector; - target = E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */; - targetProxy = 2174BDB21B47A223011CBBDEE1E1104B /* PBXContainerItemProxy */; + name = JMRoundedCorner; + target = 5EAA6D463A9A35AD53DFDE7BD90DB91D /* JMRoundedCorner */; + targetProxy = 7589128AB3A15D869EEC07BA73AEC954 /* PBXContainerItemProxy */; + }; + A6F384D42E73EB5B8AB6C1823FBB8157 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = BAButton; + target = D5A9684BC81FF3836EEDB27552011C18 /* BAButton */; + targetProxy = A6D2CE6E2F6B9EABAEDA1E590FAE9790 /* PBXContainerItemProxy */; + }; + A8380DE1DDE0D47A99D5DF07E2121886 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MyLayout; + target = 7126A8FF47B4545643C04540D6F9CB0B /* MyLayout */; + targetProxy = 97379C2B6728AC3CFC623C4DF650CFD8 /* PBXContainerItemProxy */; }; - 8386233EE4EB74BD5921A6586C00477F /* PBXTargetDependency */ = { + AA1A236BEE5ECC5BA733BB22244790C6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MJExtension; - target = 9EAB3E42EF957541E6C3C76D35FD008E /* MJExtension */; - targetProxy = 04D5996D41CBFD139614FBE57FDA1DEB /* PBXContainerItemProxy */; + name = AFNetworking; + target = 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */; + targetProxy = 47546FFDA067C17E98D54F9443BB344E /* PBXContainerItemProxy */; }; - 8D12B7E368E5E05C15E2890967A69DCD /* PBXTargetDependency */ = { + AA8086387432F3A7D9576C222F672F5B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MyLayout; - target = 07A1458F0ECFD7D943DC4EF15E916F34 /* MyLayout */; - targetProxy = 4374486EA19D970AAD70DB08DB629B8A /* PBXContainerItemProxy */; + name = YYCache; + target = CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */; + targetProxy = FF99BE7E3DFB6D5902F98945F836E7BC /* PBXContainerItemProxy */; }; - 8F5AA06EDC793970CAF4CA7F14C351A4 /* PBXTargetDependency */ = { + AB485869BA5E524333B2F62927410A3C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MBProgressHUD; - target = D058B89EB3B3DF45457A2DCD3971AFFE /* MBProgressHUD */; - targetProxy = E976AE5BA4E92138E2EB6E2873C3B577 /* PBXContainerItemProxy */; + name = SDAutoLayout; + target = BEBC67318C6C143D4D7E5C99A2B61B2A /* SDAutoLayout */; + targetProxy = ECFFB802D763E9D906B6950043D55B17 /* PBXContainerItemProxy */; }; - 909A3B5A85919D94FFD2FB1C14CC8687 /* PBXTargetDependency */ = { + AE40EE4D013AAF2CE5FAC968C6A282EC /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = AFNetworking; - target = 928353533005A4198EBDA5B700D37B64 /* AFNetworking */; - targetProxy = E9D4CE8B9573BCA4DE0A827B97D35E36 /* PBXContainerItemProxy */; + name = FMDB; + target = 8642CC820CE8C5B88C113D7F47AF4BC3 /* FMDB */; + targetProxy = 728DB2CD7A05722F864A5FCB1F3980D1 /* PBXContainerItemProxy */; }; - 9160C380EC0CFBD84FC0DF6209F71078 /* PBXTargetDependency */ = { + B1FB3020C8067A3F027DEAE03199EFB8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AFNetworking; - target = 928353533005A4198EBDA5B700D37B64 /* AFNetworking */; - targetProxy = D5166D53E6C8B2887340FABFAC9B6561 /* PBXContainerItemProxy */; + target = 9E033EDB5EC0819481B0546434FA577B /* AFNetworking */; + targetProxy = 1F7355F2D81D4F9E0C250D1F79279DBD /* PBXContainerItemProxy */; }; - 9C04E97379BA92761E1A6DAD9044C693 /* PBXTargetDependency */ = { + B408108E1F209256A950A0DD2B3D60C3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SDAutoLayout; - target = 67C2E0E0C5FE7DE41F6A50F738BEFC7D /* SDAutoLayout */; - targetProxy = EEE0CBB5BA8B3A8D57E3F8BB83BA8BDC /* PBXContainerItemProxy */; + name = DZNEmptyDataSet; + target = 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */; + targetProxy = 42AD9A5DFC81D83AFBE920DB70F02FFC /* PBXContainerItemProxy */; }; - A34ED7DE809651A9E1D7864520F41340 /* PBXTargetDependency */ = { + B93046D37D4D34BBA01A1414A4DB10C3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Masonry; - target = 53480ED0BE09FF49E34B1702D485CAAB /* Masonry */; - targetProxy = 4B119CF795F097AB76FCA0758E445F51 /* PBXContainerItemProxy */; + name = YYCache; + target = CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */; + targetProxy = CE48A2895A82FCE586ED2A5C033AAF46 /* PBXContainerItemProxy */; }; - AD5B5A1A798C722B19A1557713A412D5 /* PBXTargetDependency */ = { + BDB2ED981DB36CB1C46F2102C2E7A485 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = JMRoundedCorner; - target = B58AE9150F017AC1E3E69371EC850776 /* JMRoundedCorner */; - targetProxy = 1FBC68C8F8C1AC781D24127E569B95EC /* PBXContainerItemProxy */; + target = 5EAA6D463A9A35AD53DFDE7BD90DB91D /* JMRoundedCorner */; + targetProxy = C291347E0FAAA95D4902B212BF8B7447 /* PBXContainerItemProxy */; }; - AE28AE4009B8E0060787989334002D2A /* PBXTargetDependency */ = { + BEA93A5A9ADB55D04E73172859810198 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBRetainCycleDetector; - target = E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */; - targetProxy = 8C81CFF18971EEF318B6F202A8E569C2 /* PBXContainerItemProxy */; + name = BANetManager; + target = 0C26DF3C4A7B81F517436CE80F07F368 /* BANetManager */; + targetProxy = 98AE78743B7477F24109295A0A01BEFA /* PBXContainerItemProxy */; }; - B93C022BF273999FEB20E297746FBF98 /* PBXTargetDependency */ = { + C4E2CDFE5CAAD10E25136996705892DA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = BAButton; - target = 985F42852C5AD70E725D4F06503F5C5A /* BAButton */; - targetProxy = 06247CAECF6C94CA6D04D0AC532B177E /* PBXContainerItemProxy */; + name = BAAlert; + target = 92844E36EBBF88C45D432D8DBD41E81B /* BAAlert */; + targetProxy = A9CF6877635A023A214A8D28C8B131D1 /* PBXContainerItemProxy */; }; - BFF5AFA2FB3A5F9A5927771B6E78E3AE /* PBXTargetDependency */ = { + C9F1CB3D347146B609FEC83DC89BEC28 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MJExtension; - target = 9EAB3E42EF957541E6C3C76D35FD008E /* MJExtension */; - targetProxy = 2304709AD76C08429E71020C2312240B /* PBXContainerItemProxy */; + name = YYCache; + target = CEB869244C24B7157BF5DD56B91AD5DD /* YYCache */; + targetProxy = 8EDA3C4542EA7726BB29C1EC9CBCC59B /* PBXContainerItemProxy */; }; - C9153277503E5E3037CCFF647F0307CD /* PBXTargetDependency */ = { + CFDE2793D3A44553FC8C38A1EA4828DD /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MLeaksFinder; - target = EBE33197DFF5736FB990D1E852CCCDEE /* MLeaksFinder */; - targetProxy = 297D668FA3F94CE351A136C8FA061AAE /* PBXContainerItemProxy */; + name = MyLayout; + target = 7126A8FF47B4545643C04540D6F9CB0B /* MyLayout */; + targetProxy = 00D30C29733C70CA478F538F7237DD60 /* PBXContainerItemProxy */; }; - CE3CD266A95F48477020043190BF99C4 /* PBXTargetDependency */ = { + CFEE943B65484D20E4AC183C2EC487E6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MJRefresh; - target = 70BC44266C6FFE30D2C57129458E070B /* MJRefresh */; - targetProxy = 27D8C65026898D7EE8589D682804F959 /* PBXContainerItemProxy */; + name = ReactiveObjC; + target = 720000A04716EA94A7F8EAE4F7FFE0A2 /* ReactiveObjC */; + targetProxy = A260BC5C95B11BA9D2101051335C6B19 /* PBXContainerItemProxy */; }; - D1AC4BF095C3F25D3F16FCC03591125D /* PBXTargetDependency */ = { + D8DF22D1066B63BEA02AFCB2CC76C398 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = FBRetainCycleDetector; - target = E3E12B8BB339234054946D8B39A93687 /* FBRetainCycleDetector */; - targetProxy = 0016359E689D56206143840C165BF624 /* PBXContainerItemProxy */; - }; - D2C509D783BB7FC1BA23C9C2AD97C331 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = FBMemoryProfiler; - target = 8C8C1779E3959B3BF107B00990F45010 /* FBMemoryProfiler */; - targetProxy = 606C37F9AFD09B0D64702A39C087CD5C /* PBXContainerItemProxy */; + target = AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */; + targetProxy = 9F47A25A7223BB66F5DA9C114E94B525 /* PBXContainerItemProxy */; }; - D2CD88F82F8DABDE10E65D17CB2B1F84 /* PBXTargetDependency */ = { + DABC5697527E29B8D278DA0C9B660632 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = IQKeyboardManager; - target = D0D0C9D20C43FA94D4C88FBFE2601B8E /* IQKeyboardManager */; - targetProxy = 9217FA6B57A70EEECA6B4F96468B098A /* PBXContainerItemProxy */; + name = FBRetainCycleDetector; + target = AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */; + targetProxy = 7B0FB4C6C0B3BB3067207623C9F0E458 /* PBXContainerItemProxy */; }; - E07705CA20F6CAD10B8EBD749D910B6E /* PBXTargetDependency */ = { + DB2EA9EEF268DEF3DC27375A524E8DAB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MJExtension; - target = 9EAB3E42EF957541E6C3C76D35FD008E /* MJExtension */; - targetProxy = F8640315975976DFA4749ED2C72FF532 /* PBXContainerItemProxy */; + name = Masonry; + target = 9DC8D9E02903E93BD0B2FEC9D846EA20 /* Masonry */; + targetProxy = 0BDC3A76D1C16655A49C44CAA5D7AC30 /* PBXContainerItemProxy */; }; - E48036CDBB8094332FA22382A683890A /* PBXTargetDependency */ = { + DD7ECBD38517D126876A15791791E45B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = FBAllocationTracker; - target = 5A0DF836BAB98D7819952604EA22C47E /* FBAllocationTracker */; - targetProxy = 14AB2F8A2BFAD078FE5571FD144248D1 /* PBXContainerItemProxy */; + name = MLeaksFinder; + target = AC139CEF10BCCB200972B4617F3CA14E /* MLeaksFinder */; + targetProxy = 718BB2EEEE0C684F6C23E59CA5338CE0 /* PBXContainerItemProxy */; }; - E64F5E87C9746BD458FD8C52A168406E /* PBXTargetDependency */ = { + DE2625E9EDC9FFE78C65F9BC753DA979 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = MJRefresh; - target = 70BC44266C6FFE30D2C57129458E070B /* MJRefresh */; - targetProxy = 401F4F8197F6B0BD6A5409D19A5B1621 /* PBXContainerItemProxy */; + name = BANetManager; + target = 0C26DF3C4A7B81F517436CE80F07F368 /* BANetManager */; + targetProxy = FA736B8CC593D6328470A759E9D251B5 /* PBXContainerItemProxy */; }; - EA0ADEC7EF65A41957C8776967FD897F /* PBXTargetDependency */ = { + DE671A2F23B7D79596B1CCF1BD50B319 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = JMRoundedCorner; - target = B58AE9150F017AC1E3E69371EC850776 /* JMRoundedCorner */; - targetProxy = A1CE7EE360C46564A850510AFE5F0028 /* PBXContainerItemProxy */; + name = FBRetainCycleDetector; + target = AF9D6EADD8E530631B349B6FDC56DA82 /* FBRetainCycleDetector */; + targetProxy = 0D2CD62B6BF5D90FB99D41F04FD8485D /* PBXContainerItemProxy */; }; - ECA699A5905B71703D7C78D5D8BEF963 /* PBXTargetDependency */ = { + F09ECFFBFE306D170CA061178CCD4F47 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Masonry; - target = 53480ED0BE09FF49E34B1702D485CAAB /* Masonry */; - targetProxy = 51BEF212E228CF167500F0DEC9BA578E /* PBXContainerItemProxy */; + name = IQKeyboardManager; + target = 904F4F27FD314010A3812EB2A9306183 /* IQKeyboardManager */; + targetProxy = 5B709639F4BCAB70B4CA7FEB3CD584B5 /* PBXContainerItemProxy */; }; - EE9CBE9109E650688963817F1336CEB7 /* PBXTargetDependency */ = { + F246A8AAFC20F61B0053D35C76C4E43B /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Masonry; - target = 53480ED0BE09FF49E34B1702D485CAAB /* Masonry */; - targetProxy = FEDD61BDB33FC3DD39015C16338D334A /* PBXContainerItemProxy */; + name = BATextView; + target = 1D77298ECE42FEF88367950A2D83E5C1 /* BATextView */; + targetProxy = DF571C10C2396B57059330B44E0ECA90 /* PBXContainerItemProxy */; }; - EEF5290DA10391AA66846B017487EED2 /* PBXTargetDependency */ = { + FA3E5088309CD820BE55F01EAC2E65EB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = YYKit; - target = 37D7380A52EE2E9B49BECEE4DC247D19 /* YYKit */; - targetProxy = 115A4A8E40B5F5F2D5FA00D78B7A0A6C /* PBXContainerItemProxy */; + name = BAAlert; + target = 92844E36EBBF88C45D432D8DBD41E81B /* BAAlert */; + targetProxy = 133A01B8B7CAB11B4ED1A3A4DD0D7CB3 /* PBXContainerItemProxy */; }; - F90A62DBB9CF423A2ABB7E8C27F51FE5 /* PBXTargetDependency */ = { + FC52A5BB3882C24DBAC1FFD9147EDC83 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = MJRefresh; - target = 70BC44266C6FFE30D2C57129458E070B /* MJRefresh */; - targetProxy = 8DBED064513B4AF86D97B5960B3C6E98 /* PBXContainerItemProxy */; + target = 04CF549EBEEE7BC87AEAE35397184D94 /* MJRefresh */; + targetProxy = C5B082A108AB9C18DE322810C99F8CE9 /* PBXContainerItemProxy */; }; - FE6946277D2951DC9D59D2A9D27203B0 /* PBXTargetDependency */ = { + FE10E5C2237F5B99B30CDEAD97E441D6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = AFNetworking; - target = 928353533005A4198EBDA5B700D37B64 /* AFNetworking */; - targetProxy = 590E930858C92176F2D966737FD12015 /* PBXContainerItemProxy */; + name = FMDB; + target = 8642CC820CE8C5B88C113D7F47AF4BC3 /* FMDB */; + targetProxy = 98B94FA25D5F43AE6DE67B6007F3703E /* PBXContainerItemProxy */; }; - FF7213FF113A4EBA9A1DF706214765AE /* PBXTargetDependency */ = { + FF7267B584FC98C040CBC394DC3E88EA /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = YYKit; - target = 37D7380A52EE2E9B49BECEE4DC247D19 /* YYKit */; - targetProxy = 84C447EB9BEE790435C92A7673C04E13 /* PBXContainerItemProxy */; + name = MJExtension; + target = A316B54C67E947D23CECD230FA5BFAEF /* MJExtension */; + targetProxy = 107421B0B3FDFAD887316C73472E7DE0 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 0209AD5EF76567F95309E2883ADEE275 /* Debug */ = { + 093B6F9C1B8FF2A78EA0B58BCD2FC3D6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8C5B5FD6E8E85386F12D5FC11C9400DC /* NullSafe.xcconfig */; + baseConfigurationReference = A52CDB4442685E57F1B88305266C9F1D /* SDAutoLayout.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/NullSafe/NullSafe-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5088,18 +5736,20 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 084FC4A07EC34209662C66F29F7681AD /* Release */ = { + 0A361B35D8AF0BEA57B9A0C54F1C3BC5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 02AEDD35E2700E165B5CB89AA20E1873 /* BlocksKit.xcconfig */; + baseConfigurationReference = B9D77A1C8ADF8EA8960EFF7B7EE025EC /* BAPickView.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BlocksKit/BlocksKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + GCC_PREFIX_HEADER = "Target Support Files/BAPickView/BAPickView-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5111,15 +5761,86 @@ }; name = Release; }; - 0ACF4A2CE6A79F9ABF81F07FCB27B547 /* Release */ = { + 0FFBE392B1643AEC4D6E2E63220A24E7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 96E8B655AACCAB7E846D22DC0C30768E /* Pods-BABaseProject-BABaseProjectUITests.release.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 10E30809479DFBBB8F6701AF8348ECBF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 41FBC58145CB22498B5323EA12E897BC /* Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 11D837E9061713962DAFC1C3FD7C40E3 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7404FD9BABC3A7C4D989C68E8970534B /* IQKeyboardManager.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 11E94ECC57CE5C64EA2FE893DFCE665B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FCA70A234DD2E2530A95ABC854B27153 /* FBMemoryProfiler.xcconfig */; + baseConfigurationReference = EEA522201A6FF495C79C40CF9DD1C4D0 /* BAAlert.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBMemoryProfiler/FBMemoryProfiler-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/BAAlert/BAAlert-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; @@ -5132,16 +5853,18 @@ }; name = Release; }; - 112FC4B89056EDCD50C15D8EFFCD8CDE /* Release */ = { + 14DC5BAF9F2D73AE90C675175085A05D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F3909CA2318F98A6D06C2D6EF9B13CB5 /* SDWebImage.xcconfig */; + baseConfigurationReference = 3BEDD5BAE75C2F69070518B977228435 /* FMDB.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5153,16 +5876,18 @@ }; name = Release; }; - 16E57C29E5B1B9D23920F62649259807 /* Debug */ = { + 1A4F0BD86664B903C9DA41C163AA5A4F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4956183838E6D4475A0100F5E64B7A59 /* BAButton.xcconfig */; + baseConfigurationReference = 6A619FCF79752BC0D90C35E5AC4F2AF0 /* ReactiveObjC.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BAButton/BAButton-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + GCC_PREFIX_HEADER = "Target Support Files/ReactiveObjC/ReactiveObjC-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5174,16 +5899,18 @@ }; name = Debug; }; - 1A9BC1E36EFE0659915816EF942199FB /* Debug */ = { + 1B13DAF8291B4EB3F0019C7B5E5769DC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3C9159BD8374EF1395DC9A245DFF9D5F /* WebViewJavascriptBridge.xcconfig */; + baseConfigurationReference = 616AA544CB59F83B5C4BF3AA454C4AF9 /* DZNEmptyDataSet.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5195,15 +5922,17 @@ }; name = Debug; }; - 1AFA89153325A09AD73AD0F15FE4EC4E /* Release */ = { + 24455948D3A3C98235995A605DB59FFB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 83C22E37D16F166B00D45DADBA4BB65E /* MBProgressHUD.xcconfig */; + baseConfigurationReference = 0F56087B0D929D2319DBF8C9C05F1B1C /* MJExtension.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/MJExtension/MJExtension-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; @@ -5216,17 +5945,19 @@ }; name = Release; }; - 21CA62285CEED9F61E8E8B63BC6BAC28 /* Debug */ = { + 2654C170127CD2274E649C3E60007E43 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 537A830133BA682BF29287F9257C56FF /* FBAllocationTracker.xcconfig */; + baseConfigurationReference = 2C9AC5DA082BEA613499A94FC20CAFDD /* MLeaksFinder.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBAllocationTracker/FBAllocationTracker-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5235,17 +5966,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 2DAE732D13CB652A1ECC83370B3C00E5 /* Debug */ = { + 2B14B11887182D5C343DD7F87AFE5961 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 073F5B5E980E9A9C18CFA123714CFE6A /* Masonry.xcconfig */; + baseConfigurationReference = D6942A984722D6CFE2F9E9E4B3668EE9 /* MJRefresh.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5258,17 +5991,19 @@ }; name = Debug; }; - 3C51C0C1DF1AF101E0EF749B8E660489 /* Release */ = { + 2D6505E4F84AB187E42E7D1F17C02FC3 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C293CFC6829F5D0B4FA34A7E97BE9036 /* AFNetworking.xcconfig */; + baseConfigurationReference = 4ECD915F5623EE5A7BFCD8A9F40327C5 /* MBProgressHUD.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5277,17 +6012,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 3EEB05637D12C1AB91E8E236DB408EF5 /* Release */ = { + 2F1F358ADFE4B11DFEF068B875BC0CEB /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 537A830133BA682BF29287F9257C56FF /* FBAllocationTracker.xcconfig */; + baseConfigurationReference = 7A618BF26B9A80D3691D22FE02234F00 /* FBRetainCycleDetector.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBAllocationTracker/FBAllocationTracker-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; @@ -5300,38 +6037,42 @@ }; name = Release; }; - 448797BEF20FE1D0E4D5803354A4E856 /* Release */ = { + 32914395DBB6CD29D1AE988D38BFFE9D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5B529932F0709F27B7751914DCF639CF /* Pods-BABaseProject.release.xcconfig */; + baseConfigurationReference = 663A19FFB2BDB3088FC83BCB69A56988 /* MyLayout.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; + GCC_PREFIX_HEADER = "Target Support Files/MyLayout/MyLayout-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRIVATE_HEADERS_FOLDER_PATH = ""; PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Release; }; - 45B746D2D553386D5188C776B4AD0974 /* Debug */ = { + 33F22695E6F67717E4DBDBFA691BE86F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CDD4E2472E289FF16D67669DD34C6A /* YYKit.xcconfig */; + baseConfigurationReference = 6A619FCF79752BC0D90C35E5AC4F2AF0 /* ReactiveObjC.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/YYKit/YYKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/ReactiveObjC/ReactiveObjC-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5340,13 +6081,14 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 47BEF9D903506B003EA5C2B249729489 /* Debug */ = { + 34FE9531DA9AF2820790339988D5FF41 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; @@ -5354,23 +6096,23 @@ CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - ENABLE_TESTABILITY = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -5378,22 +6120,71 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; - ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; STRIP_INSTALLED_PRODUCT = NO; SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3544CD479A0FD72A9C446A16A5466F3C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EEA522201A6FF495C79C40CF9DD1C4D0 /* BAAlert.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/BAAlert/BAAlert-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; }; name = Debug; }; - 48A19EC5276F5574B996179F25506915 /* Release */ = { + 3CDD08A01697B300F45061029116096C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9837A57BA5AF03815FE5F5F17770E66C /* JMRoundedCorner.xcconfig */; + baseConfigurationReference = 93AFB7B99EC71CD1AC1A9AC6A2F12A4B /* BATouchID.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/BATouchID/BATouchID-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 405186D1A95DCF9873465C417DC808C4 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D6942A984722D6CFE2F9E9E4B3668EE9 /* MJRefresh.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5405,15 +6196,40 @@ }; name = Release; }; - 4AF263A792FA43CA5AF7407A3EBB78B4 /* Release */ = { + 42C48C75BE42E419ADA0DE72ACA0AC22 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D615F0566F405F9ED0B6C36DBAA5780C /* SDAutoLayout.xcconfig */; + baseConfigurationReference = 5B529932F0709F27B7751914DCF639CF /* Pods-BABaseProject.release.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 45A7AFAF4DD118C310B9CD2D8134F6B5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 46379A297FC67C6E204CA4FE3BC093BB /* SDWebImage.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; @@ -5426,17 +6242,65 @@ }; name = Release; }; - 4B6321052A94E5BC5BB2D5A222AC6277 /* Release */ = { + 5771515F714D93FFFFF7B3644C874286 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E029EA548246F048B3F048B3B7479B7F /* MJRefresh.xcconfig */; + baseConfigurationReference = B9D77A1C8ADF8EA8960EFF7B7EE025EC /* BAPickView.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/BAPickView/BAPickView-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 5A6ACE61C4D128598EA7472C87982601 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 141FCE7E92B2539D3BA3A82D56E9CFCD /* Masonry.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 5E2F95937BD27829D299193A3165F929 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3BEDD5BAE75C2F69070518B977228435 /* FMDB.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/FMDB/FMDB-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5445,19 +6309,21 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 4DC1974BCACAE08C882D2C8551884C07 /* Release */ = { + 605C111D2DA53A41CC54EE2AD85C304C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8E038A6E85654AE5656DB97C353FB4B1 /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */; + baseConfigurationReference = B9040C60CE4E764E44E8C39C5572A776 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACH_O_TYPE = staticlib; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; @@ -5466,17 +6332,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 5DC4DF26C310D1A1A5CEC18F5CDDA5AE /* Debug */ = { + 6362807A51833C24D63CFEDC9ABDA822 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9837A57BA5AF03815FE5F5F17770E66C /* JMRoundedCorner.xcconfig */; + baseConfigurationReference = 7A618BF26B9A80D3691D22FE02234F00 /* FBRetainCycleDetector.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5489,16 +6357,18 @@ }; name = Debug; }; - 67CC5EF85C528FDF7F060AD5315A94DD /* Debug */ = { + 67D5DA4362D4CB4A60E208B9D2F265CF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F3909CA2318F98A6D06C2D6EF9B13CB5 /* SDWebImage.xcconfig */; + baseConfigurationReference = 660A7FF695AADDEB5FB5BDD9E27428A1 /* NullSafe.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + GCC_PREFIX_HEADER = "Target Support Files/NullSafe/NullSafe-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5510,16 +6380,18 @@ }; name = Debug; }; - 6E567F71AA68C04A59139601E6A455B8 /* Release */ = { + 6CA42F62CE0652819ED46936FE31E065 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3C9159BD8374EF1395DC9A245DFF9D5F /* WebViewJavascriptBridge.xcconfig */; + baseConfigurationReference = 141FCE7E92B2539D3BA3A82D56E9CFCD /* Masonry.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 5.0; + GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5531,16 +6403,18 @@ }; name = Release; }; - 70A52A8850FC2F85F983BDD24AAB0EC9 /* Release */ = { + 72D1B831316303C2E356BBAC53FEF78A /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3CA468691084FABF8B4121A25DBBED2C /* IQKeyboardManager.xcconfig */; + baseConfigurationReference = D8102957964045D9CE1780BC8C2B4D72 /* AFNetworking.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5552,17 +6426,19 @@ }; name = Release; }; - 71234AAFA88FE337209EA00A09740F89 /* Debug */ = { + 81D27BBFE39221A11085CC94C71E9978 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D615F0566F405F9ED0B6C36DBAA5780C /* SDAutoLayout.xcconfig */; + baseConfigurationReference = 4ECD915F5623EE5A7BFCD8A9F40327C5 /* MBProgressHUD.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5571,18 +6447,20 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 74925A4479719BD884DEA2038BAAA35C /* Release */ = { + 824402AC5263C3192472B9272B3EA360 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 14AAB5D81DDF9197E0128299DDB440A8 /* MLeaksFinder.xcconfig */; + baseConfigurationReference = 0F223A84D78AE0F2009F07EDC72AE9CC /* JMRoundedCorner.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + GCC_PREFIX_HEADER = "Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5594,15 +6472,17 @@ }; name = Release; }; - 768642F7511D54FB9BE405DD407474DF /* Debug */ = { + 864257C72797C3D88C7F59CD746CD135 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 14AAB5D81DDF9197E0128299DDB440A8 /* MLeaksFinder.xcconfig */; + baseConfigurationReference = 0F56087B0D929D2319DBF8C9C05F1B1C /* MJExtension.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/MJExtension/MJExtension-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5615,16 +6495,18 @@ }; name = Debug; }; - 80EE96C354F26F909C6EBE5E162235BD /* Debug */ = { + 9090F11143C43D5C92D8F88C8AA6743A /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 02AEDD35E2700E165B5CB89AA20E1873 /* BlocksKit.xcconfig */; + baseConfigurationReference = 6AF284593655C892B7FBC584208FC6B3 /* BAButton.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BlocksKit/BlocksKit-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + GCC_PREFIX_HEADER = "Target Support Files/BAButton/BAButton-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5636,15 +6518,17 @@ }; name = Debug; }; - 8256B9222F30ED0909D42D3A293952C1 /* Debug */ = { + 90A588C46F0F65445BD1A10F420461BC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = FCA70A234DD2E2530A95ABC854B27153 /* FBMemoryProfiler.xcconfig */; + baseConfigurationReference = A52CDB4442685E57F1B88305266C9F1D /* SDAutoLayout.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBMemoryProfiler/FBMemoryProfiler-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5657,16 +6541,18 @@ }; name = Debug; }; - 88164417D76A1B076CD30042893230F7 /* Release */ = { + 91312F2E63C22CD2A84DBF13A217F68E /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B31F5EAC0CD3EAA27BE46699DBF4ABF3 /* FBRetainCycleDetector.xcconfig */; + baseConfigurationReference = 616AA544CB59F83B5C4BF3AA454C4AF9 /* DZNEmptyDataSet.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + GCC_PREFIX_HEADER = "Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5678,17 +6564,19 @@ }; name = Release; }; - 88A8577A10F9BD8BFC4492D5C15C6337 /* Debug */ = { + 92F415033A0E6011D4C9F2D59DB4F419 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A02E0C9A11F077B870A72CA725FE5BB1 /* MyLayout.xcconfig */; + baseConfigurationReference = 7404FD9BABC3A7C4D989C68E8970534B /* IQKeyboardManager.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MyLayout/MyLayout-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5697,17 +6585,19 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - 903FBF203C5658B140DF3CBEF5D2090D /* Release */ = { + 976C4943D231E104A573DC7F80DC4D16 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 073F5B5E980E9A9C18CFA123714CFE6A /* Masonry.xcconfig */; + baseConfigurationReference = 293F15EC612DC15503D82054E16136CC /* YYCache.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/Masonry/Masonry-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; @@ -5720,38 +6610,42 @@ }; name = Release; }; - 90A53E83ED02757862927F1FA73F2896 /* Debug */ = { + 9D682F614F824833F21535A583E0A0FE /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9040C60CE4E764E44E8C39C5572A776 /* Pods-BABaseProject-BABaseProjectTests.debug.xcconfig */; + baseConfigurationReference = 663A19FFB2BDB3088FC83BCB69A56988 /* MyLayout.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; + GCC_PREFIX_HEADER = "Target Support Files/MyLayout/MyLayout-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRIVATE_HEADERS_FOLDER_PATH = ""; PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - 90B4D11D505F86542006276D26F555A3 /* Debug */ = { + C03F4B6759472A395054C07F83766928 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E029EA548246F048B3F048B3B7479B7F /* MJRefresh.xcconfig */; + baseConfigurationReference = 6AF284593655C892B7FBC584208FC6B3 /* BAButton.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MJRefresh/MJRefresh-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/BAButton/BAButton-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5760,17 +6654,67 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; + name = Release; + }; + C104F7F091290C3D1E248192F07FE689 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + 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; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; name = Debug; }; - 9413B669A6203AD71A048A8F824ECDD9 /* Debug */ = { + C3C74C953EF042275ABEED13DE60BB4F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 83C22E37D16F166B00D45DADBA4BB65E /* MBProgressHUD.xcconfig */; + baseConfigurationReference = 293F15EC612DC15503D82054E16136CC /* YYCache.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/YYCache/YYCache-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5783,17 +6727,19 @@ }; name = Debug; }; - 97B878411D4C260BAF29125F60A684D3 /* Release */ = { + C80DF4F9B4FAAA82A16A787A3C2A6E8F /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4956183838E6D4475A0100F5E64B7A59 /* BAButton.xcconfig */; + baseConfigurationReference = 0F223A84D78AE0F2009F07EDC72AE9CC /* JMRoundedCorner.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/BAButton/BAButton-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MTL_ENABLE_DEBUG_INFO = NO; + GCC_PREFIX_HEADER = "Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -5802,18 +6748,20 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - 99E4742C71374C30BEFC8419CF7F39B6 /* Release */ = { + C86B25D3CB554282333396277D0DC93B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DD3DA039268C9830A065E3A491D2792C /* MJExtension.xcconfig */; + baseConfigurationReference = 93AFB7B99EC71CD1AC1A9AC6A2F12A4B /* BATouchID.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MJExtension/MJExtension-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + GCC_PREFIX_HEADER = "Target Support Files/BATouchID/BATouchID-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5825,16 +6773,18 @@ }; name = Release; }; - 9BBCEB1D129AA9B074362BB224DD3B72 /* Debug */ = { + C9562DAF63F0D98156A979EC0A6ED47C /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3CA468691084FABF8B4121A25DBBED2C /* IQKeyboardManager.xcconfig */; + baseConfigurationReference = 46379A297FC67C6E204CA4FE3BC093BB /* SDWebImage.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + GCC_PREFIX_HEADER = "Target Support Files/SDWebImage/SDWebImage-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5846,74 +6796,40 @@ }; name = Debug; }; - AA5943F0CA2AEACDC57A8C96BA571D0B /* Debug */ = { + D95050B7039A54EA43B9B291E80400F4 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3324676947E0C5C9262CF719A16784E0 /* Pods-BABaseProject.debug.xcconfig */; + baseConfigurationReference = F149A61901C3091F204FAD2C10BDC48F /* BATextView.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; + GCC_PREFIX_HEADER = "Target Support Files/BATextView/BATextView-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRIVATE_HEADERS_FOLDER_PATH = ""; PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - AAF678CED40D3499169D10F63CA0719E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - 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; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - B7DA9A202B6B64ABF5C4658C6DA2FBB2 /* Debug */ = { + DAB0C72316DB3B2440CBCA696B62BBC7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B31F5EAC0CD3EAA27BE46699DBF4ABF3 /* FBRetainCycleDetector.xcconfig */; + baseConfigurationReference = 57FEE02EF51A521F034E03F903606B20 /* BANetManager.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/BANetManager/BANetManager-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; @@ -5926,11 +6842,13 @@ }; name = Debug; }; - BB8245971C48B7F4951704BD3CDDCACA /* Release */ = { + E384304CE791336CE962D97F5BBB2FF8 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 96E8B655AACCAB7E846D22DC0C30768E /* Pods-BABaseProject-BABaseProjectUITests.release.xcconfig */; + baseConfigurationReference = 8E038A6E85654AE5656DB97C353FB4B1 /* Pods-BABaseProject-BABaseProjectTests.release.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; @@ -5947,37 +6865,41 @@ }; name = Release; }; - CED771A664C98E19A8157AB4AA2D76F0 /* Debug */ = { + E7E13DCFB3DCE11521841197214F474F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 41FBC58145CB22498B5323EA12E897BC /* Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig */; + baseConfigurationReference = F149A61901C3091F204FAD2C10BDC48F /* BATextView.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/BATextView/BATextView-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRIVATE_HEADERS_FOLDER_PATH = ""; PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - D8D40233353D40926E35A98D3BDB4261 /* Release */ = { + E86FAAC112F51E2FAE77901D928D9CF2 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8C5B5FD6E8E85386F12D5FC11C9400DC /* NullSafe.xcconfig */; + baseConfigurationReference = 57FEE02EF51A521F034E03F903606B20 /* BANetManager.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/NullSafe/NullSafe-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + GCC_PREFIX_HEADER = "Target Support Files/BANetManager/BANetManager-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; @@ -5989,17 +6911,19 @@ }; name = Release; }; - D9C97EB576CE94D4E00FD675005D2868 /* Debug */ = { + ECBD7A2361DC4F8555FCEC287138C15B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C293CFC6829F5D0B4FA34A7E97BE9036 /* AFNetworking.xcconfig */; + baseConfigurationReference = 660A7FF695AADDEB5FB5BDD9E27428A1 /* NullSafe.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = dwarf; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = YES; + GCC_PREFIX_HEADER = "Target Support Files/NullSafe/NullSafe-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 4.3; + MTL_ENABLE_DEBUG_INFO = NO; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -6008,19 +6932,21 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Debug; + name = Release; }; - DEAE642743B71B9584A08DDFBF841287 /* Release */ = { + ECE63EAF36995029186705EFEC639D23 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = B9CDD4E2472E289FF16D67669DD34C6A /* YYKit.xcconfig */; + baseConfigurationReference = 2C9AC5DA082BEA613499A94FC20CAFDD /* MLeaksFinder.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/YYKit/YYKit-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -6029,40 +6955,44 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; - DEF77D0713347E4939E127602F325659 /* Debug */ = { + F05F2640FB64EEF9888A02357C0BCE32 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DD3DA039268C9830A065E3A491D2792C /* MJExtension.xcconfig */; + baseConfigurationReference = 3324676947E0C5C9262CF719A16784E0 /* Pods-BABaseProject.debug.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MJExtension/MJExtension-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACH_O_TYPE = staticlib; MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - PUBLIC_HEADERS_FOLDER_PATH = ""; SDKROOT = iphoneos; SKIP_INSTALL = YES; }; name = Debug; }; - E7DA7AB6D778CF188A1E24EF5FFFF758 /* Release */ = { + FF778088B62C05BE1205DAE628D151DF /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A02E0C9A11F077B870A72CA725FE5BB1 /* MyLayout.xcconfig */; + baseConfigurationReference = D8102957964045D9CE1780BC8C2B4D72 /* AFNetworking.xcconfig */; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/MyLayout/MyLayout-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/AFNetworking/AFNetworking-prefix.pch"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PRIVATE_HEADERS_FOLDER_PATH = ""; @@ -6071,214 +7001,250 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; }; - name = Release; + name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 04C1DB49FA812C21EEEBEE206A0ED54E /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { + 0AB72C9BE331DDAF6770CD6CF5BE74EE /* Build configuration list for PBXNativeTarget "NullSafe" */ = { isa = XCConfigurationList; buildConfigurations = ( - 90B4D11D505F86542006276D26F555A3 /* Debug */, - 4B6321052A94E5BC5BB2D5A222AC6277 /* Release */, + 67D5DA4362D4CB4A60E208B9D2F265CF /* Debug */, + ECBD7A2361DC4F8555FCEC287138C15B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 099D1BDED7384515086DE1419E0988FB /* Build configuration list for PBXNativeTarget "FBRetainCycleDetector" */ = { + 1BA066B3D32C553BF37E3322F9113F02 /* Build configuration list for PBXNativeTarget "FMDB" */ = { isa = XCConfigurationList; buildConfigurations = ( - B7DA9A202B6B64ABF5C4658C6DA2FBB2 /* Debug */, - 88164417D76A1B076CD30042893230F7 /* Release */, + 5E2F95937BD27829D299193A3165F929 /* Debug */, + 14DC5BAF9F2D73AE90C675175085A05D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 179CF0FDE19D418A643646D7ECD893E9 /* Build configuration list for PBXNativeTarget "FBAllocationTracker" */ = { + 259FE69886D71D4163FC508CF5F099B1 /* Build configuration list for PBXNativeTarget "FBRetainCycleDetector" */ = { isa = XCConfigurationList; buildConfigurations = ( - 21CA62285CEED9F61E8E8B63BC6BAC28 /* Debug */, - 3EEB05637D12C1AB91E8E236DB408EF5 /* Release */, + 6362807A51833C24D63CFEDC9ABDA822 /* Debug */, + 2F1F358ADFE4B11DFEF068B875BC0CEB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1F97048AF18C3EFEDE731BDEECCD58A8 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9413B669A6203AD71A048A8F824ECDD9 /* Debug */, - 1AFA89153325A09AD73AD0F15FE4EC4E /* Release */, + C104F7F091290C3D1E248192F07FE689 /* Debug */, + 34FE9531DA9AF2820790339988D5FF41 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 2DFCACCE7364EC7F86DAF625072B1695 /* Build configuration list for PBXNativeTarget "MLeaksFinder" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ECE63EAF36995029186705EFEC639D23 /* Debug */, + 2654C170127CD2274E649C3E60007E43 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 34CAE1CB89EDBF2E53735CC5D4E5E69F /* Build configuration list for PBXNativeTarget "Masonry" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5A6ACE61C4D128598EA7472C87982601 /* Debug */, + 6CA42F62CE0652819ED46936FE31E065 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 35FA3F9D780F0A57E55222615ED55C72 /* Build configuration list for PBXNativeTarget "MJRefresh" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2B14B11887182D5C343DD7F87AFE5961 /* Debug */, + 405186D1A95DCF9873465C417DC808C4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3A073C78D19617C74EEAEA91C3038721 /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 11D837E9061713962DAFC1C3FD7C40E3 /* Debug */, + 92F415033A0E6011D4C9F2D59DB4F419 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3C8668E36EAB83CD7A1D448C0A18A340 /* Build configuration list for PBXNativeTarget "ReactiveObjC" */ = { isa = XCConfigurationList; buildConfigurations = ( - 47BEF9D903506B003EA5C2B249729489 /* Debug */, - AAF678CED40D3499169D10F63CA0719E /* Release */, + 1A4F0BD86664B903C9DA41C163AA5A4F /* Debug */, + 33F22695E6F67717E4DBDBFA691BE86F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 32AFD7C10BB80D4284D8930821E27595 /* Build configuration list for PBXNativeTarget "NullSafe" */ = { + 483FBC4A668BF7F1A8767452E7E188AC /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0209AD5EF76567F95309E2883ADEE275 /* Debug */, - D8D40233353D40926E35A98D3BDB4261 /* Release */, + FF778088B62C05BE1205DAE628D151DF /* Debug */, + 72D1B831316303C2E356BBAC53FEF78A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 394BD9C4773EF541E1BBD3BE140F6B1F /* Build configuration list for PBXNativeTarget "FBMemoryProfiler" */ = { + 565605472A25614E25F097CAAC7E3305 /* Build configuration list for PBXNativeTarget "BANetManager" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8256B9222F30ED0909D42D3A293952C1 /* Debug */, - 0ACF4A2CE6A79F9ABF81F07FCB27B547 /* Release */, + DAB0C72316DB3B2440CBCA696B62BBC7 /* Debug */, + E86FAAC112F51E2FAE77901D928D9CF2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 4637285CC782A7CF55FAA8679A2E71C7 /* Build configuration list for PBXNativeTarget "MLeaksFinder" */ = { + 64EE246612F53A73C8FBFCEC3A61508A /* Build configuration list for PBXNativeTarget "MJExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( - 768642F7511D54FB9BE405DD407474DF /* Debug */, - 74925A4479719BD884DEA2038BAAA35C /* Release */, + 864257C72797C3D88C7F59CD746CD135 /* Debug */, + 24455948D3A3C98235995A605DB59FFB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5C1B5CB240EE32F872BA3D240699B75F /* Build configuration list for PBXNativeTarget "Pods-BABaseProject" */ = { + 6B44251FA50022CA55D4B2FBE1468C76 /* Build configuration list for PBXNativeTarget "MBProgressHUD" */ = { isa = XCConfigurationList; buildConfigurations = ( - AA5943F0CA2AEACDC57A8C96BA571D0B /* Debug */, - 448797BEF20FE1D0E4D5803354A4E856 /* Release */, + 2D6505E4F84AB187E42E7D1F17C02FC3 /* Debug */, + 81D27BBFE39221A11085CC94C71E9978 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5EF4A3C2BD99128EFAF8CC9F42A8E3D3 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectTests" */ = { + 6B5869143E339731A5364B730B024A55 /* Build configuration list for PBXNativeTarget "BAPickView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 90A53E83ED02757862927F1FA73F2896 /* Debug */, - 4DC1974BCACAE08C882D2C8551884C07 /* Release */, + 5771515F714D93FFFFF7B3644C874286 /* Debug */, + 0A361B35D8AF0BEA57B9A0C54F1C3BC5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 6F06302A65E05938C8B34CE8BA30D8EA /* Build configuration list for PBXNativeTarget "JMRoundedCorner" */ = { + 72BC768282764110A3EB7F9A23878DCE /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5DC4DF26C310D1A1A5CEC18F5CDDA5AE /* Debug */, - 48A19EC5276F5574B996179F25506915 /* Release */, + C9562DAF63F0D98156A979EC0A6ED47C /* Debug */, + 45A7AFAF4DD118C310B9CD2D8134F6B5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 77CF2A7107BC61A2E90025871305961D /* Build configuration list for PBXNativeTarget "AFNetworking" */ = { + 80328601AA8657DFB696B49F812800A4 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject" */ = { isa = XCConfigurationList; buildConfigurations = ( - D9C97EB576CE94D4E00FD675005D2868 /* Debug */, - 3C51C0C1DF1AF101E0EF749B8E660489 /* Release */, + F05F2640FB64EEF9888A02357C0BCE32 /* Debug */, + 42C48C75BE42E419ADA0DE72ACA0AC22 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 7B67B960A5D1DDC3FB6CC2E37DBBFD9F /* Build configuration list for PBXNativeTarget "BlocksKit" */ = { + 8E741ACFA66A0A2CAB1454F8C19D21F2 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 80EE96C354F26F909C6EBE5E162235BD /* Debug */, - 084FC4A07EC34209662C66F29F7681AD /* Release */, + 10E30809479DFBBB8F6701AF8348ECBF /* Debug */, + 0FFBE392B1643AEC4D6E2E63220A24E7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - A2FE19F8A233862897CE37B947932F81 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectUITests" */ = { + 9B18BF6CC251E82E7850E6800E1B0018 /* Build configuration list for PBXNativeTarget "MyLayout" */ = { isa = XCConfigurationList; buildConfigurations = ( - CED771A664C98E19A8157AB4AA2D76F0 /* Debug */, - BB8245971C48B7F4951704BD3CDDCACA /* Release */, + 9D682F614F824833F21535A583E0A0FE /* Debug */, + 32914395DBB6CD29D1AE988D38BFFE9D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B356FF642446B3E0FFB91D6325B7E493 /* Build configuration list for PBXNativeTarget "BAButton" */ = { + 9F5A6001FB1652CF7FC1794C41632F71 /* Build configuration list for PBXNativeTarget "JMRoundedCorner" */ = { isa = XCConfigurationList; buildConfigurations = ( - 16E57C29E5B1B9D23920F62649259807 /* Debug */, - 97B878411D4C260BAF29125F60A684D3 /* Release */, + C80DF4F9B4FAAA82A16A787A3C2A6E8F /* Debug */, + 824402AC5263C3192472B9272B3EA360 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B6653DB75D219E078020C341A7D83ECE /* Build configuration list for PBXNativeTarget "Masonry" */ = { + AC66A9134382479987EA12BCB01E4825 /* Build configuration list for PBXNativeTarget "BATouchID" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2DAE732D13CB652A1ECC83370B3C00E5 /* Debug */, - 903FBF203C5658B140DF3CBEF5D2090D /* Release */, + 3CDD08A01697B300F45061029116096C /* Debug */, + C86B25D3CB554282333396277D0DC93B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CD52FA788653A1AC4FF3AFD3DD0E833C /* Build configuration list for PBXNativeTarget "YYKit" */ = { + ACF41AC665BD88F01AC89270394892FD /* Build configuration list for PBXNativeTarget "YYCache" */ = { isa = XCConfigurationList; buildConfigurations = ( - 45B746D2D553386D5188C776B4AD0974 /* Debug */, - DEAE642743B71B9584A08DDFBF841287 /* Release */, + C3C74C953EF042275ABEED13DE60BB4F /* Debug */, + 976C4943D231E104A573DC7F80DC4D16 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DDF9C8C86D38D59FE81FD251040E7076 /* Build configuration list for PBXNativeTarget "SDWebImage" */ = { + B5D16F1430E3813C6D9A8E7A6E3A4E3F /* Build configuration list for PBXNativeTarget "DZNEmptyDataSet" */ = { isa = XCConfigurationList; buildConfigurations = ( - 67CC5EF85C528FDF7F060AD5315A94DD /* Debug */, - 112FC4B89056EDCD50C15D8EFFCD8CDE /* Release */, + 1B13DAF8291B4EB3F0019C7B5E5769DC /* Debug */, + 91312F2E63C22CD2A84DBF13A217F68E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E7628EF13FBEB74B7164FCBEADFE0A21 /* Build configuration list for PBXNativeTarget "SDAutoLayout" */ = { + C92B3C7851C9C92D7F9068A142B82D03 /* Build configuration list for PBXNativeTarget "SDAutoLayout" */ = { isa = XCConfigurationList; buildConfigurations = ( - 71234AAFA88FE337209EA00A09740F89 /* Debug */, - 4AF263A792FA43CA5AF7407A3EBB78B4 /* Release */, + 90A588C46F0F65445BD1A10F420461BC /* Debug */, + 093B6F9C1B8FF2A78EA0B58BCD2FC3D6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - ECCC06F4F1551987F0834A094FDCB1CA /* Build configuration list for PBXNativeTarget "MJExtension" */ = { + CC13840A64A15E8F8BFA46C1D169310D /* Build configuration list for PBXNativeTarget "BAAlert" */ = { isa = XCConfigurationList; buildConfigurations = ( - DEF77D0713347E4939E127602F325659 /* Debug */, - 99E4742C71374C30BEFC8419CF7F39B6 /* Release */, + 3544CD479A0FD72A9C446A16A5466F3C /* Debug */, + 11E94ECC57CE5C64EA2FE893DFCE665B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F3F87A8415DD8DB506984857C8A93C50 /* Build configuration list for PBXNativeTarget "MyLayout" */ = { + CFE2B09E24FA2C8AA203FFDAA5F30A94 /* Build configuration list for PBXNativeTarget "BATextView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 88A8577A10F9BD8BFC4492D5C15C6337 /* Debug */, - E7DA7AB6D778CF188A1E24EF5FFFF758 /* Release */, + D95050B7039A54EA43B9B291E80400F4 /* Debug */, + E7E13DCFB3DCE11521841197214F474F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F640212A56B1085DEA4FE11E32E5020D /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */ = { + E402F415AC13FF31230807ECB2E00E30 /* Build configuration list for PBXNativeTarget "BAButton" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9BBCEB1D129AA9B074362BB224DD3B72 /* Debug */, - 70A52A8850FC2F85F983BDD24AAB0EC9 /* Release */, + 9090F11143C43D5C92D8F88C8AA6743A /* Debug */, + C03F4B6759472A395054C07F83766928 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - FC74DF8137986F15045F3DF1999CB950 /* Build configuration list for PBXNativeTarget "WebViewJavascriptBridge" */ = { + EF951972107F12E7DC4365E07D0F78C6 /* Build configuration list for PBXNativeTarget "Pods-BABaseProject-BABaseProjectTests" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A9BC1E36EFE0659915816EF942199FB /* Debug */, - 6E567F71AA68C04A59139601E6A455B8 /* Release */, + 605C111D2DA53A41CC54EE2AD85C304C /* Debug */, + E384304CE791336CE962D97F5BBB2FF8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/AFNetworking.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/AFNetworking.xcscheme index 506dd96..c7db8e9 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/AFNetworking.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/AFNetworking.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAAlert.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAAlert.xcscheme new file mode 100644 index 0000000..11bbce5 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAAlert.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAButton.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAButton.xcscheme index e2f87f2..2de7f28 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAButton.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAButton.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BANetManager.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BANetManager.xcscheme new file mode 100644 index 0000000..06c3f85 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BANetManager.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAPickView.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAPickView.xcscheme new file mode 100644 index 0000000..8482a73 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BAPickView.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATextView.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATextView.xcscheme new file mode 100644 index 0000000..b88014c --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATextView.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATouchID.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATouchID.xcscheme new file mode 100644 index 0000000..337b251 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BATouchID.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BlocksKit.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BlocksKit.xcscheme deleted file mode 100644 index f3adb9b..0000000 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/BlocksKit.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme new file mode 100644 index 0000000..a3b4619 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme deleted file mode 100644 index 0db8a41..0000000 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme deleted file mode 100644 index ea69d36..0000000 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme index e4b1267..c9d8591 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FMDB.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FMDB.xcscheme new file mode 100644 index 0000000..7a0080b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/FMDB.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme index da07d67..a116e19 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme index 3ffe5b0..2999927 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MBProgressHUD.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MBProgressHUD.xcscheme index b1e1dc4..44d5e42 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MBProgressHUD.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MBProgressHUD.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJExtension.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJExtension.xcscheme index 507e2a9..4faa893 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJExtension.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJExtension.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJRefresh.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJRefresh.xcscheme index 32de2c9..0068484 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJRefresh.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MJRefresh.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MLeaksFinder.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MLeaksFinder.xcscheme index 1520da1..c8463ef 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MLeaksFinder.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MLeaksFinder.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Masonry.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Masonry.xcscheme index d41b8cf..3dcb352 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Masonry.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Masonry.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MyLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MyLayout.xcscheme index f4606fa..c083620 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MyLayout.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/MyLayout.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/NullSafe.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/NullSafe.xcscheme index 0cb9253..86ba253 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/NullSafe.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/NullSafe.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme index 63edc59..4118fd0 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme index a7ee7ae..b002f9d 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme index b06acc9..5367576 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/ReactiveObjC.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/ReactiveObjC.xcscheme new file mode 100644 index 0000000..f0ace0f --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/ReactiveObjC.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDAutoLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDAutoLayout.xcscheme index cac787b..603e3be 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDAutoLayout.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDAutoLayout.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDWebImage.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDWebImage.xcscheme index b4eac1e..dc6add6 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDWebImage.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -14,7 +14,7 @@ buildForArchiving = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme deleted file mode 100644 index d9b05c5..0000000 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYCache.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYCache.xcscheme new file mode 100644 index 0000000..f8d4a27 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYCache.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYKit.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYKit.xcscheme deleted file mode 100644 index cdb8a6b..0000000 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/YYKit.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/xcschememanagement.plist index 2cc0323..d7dd8f6 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/boai.xcuserdatad/xcschemes/xcschememanagement.plist @@ -9,22 +9,37 @@ isShown + BAAlert.xcscheme + + isShown + + BAButton.xcscheme isShown - BlocksKit.xcscheme + BANetManager.xcscheme + + isShown + + + BAPickView.xcscheme + + isShown + + + BATextView.xcscheme isShown - FBAllocationTracker.xcscheme + BATouchID.xcscheme isShown - FBMemoryProfiler.xcscheme + DZNEmptyDataSet.xcscheme isShown @@ -34,6 +49,11 @@ isShown + FMDB.xcscheme + + isShown + + IQKeyboardManager.xcscheme isShown @@ -94,22 +114,22 @@ isShown - SDAutoLayout.xcscheme + ReactiveObjC.xcscheme isShown - SDWebImage.xcscheme + SDAutoLayout.xcscheme isShown - WebViewJavascriptBridge.xcscheme + SDWebImage.xcscheme isShown - YYKit.xcscheme + YYCache.xcscheme isShown @@ -117,112 +137,132 @@ SuppressBuildableAutocreation - 07A1458F0ECFD7D943DC4EF15E916F34 + 04CF549EBEEE7BC87AEAE35397184D94 + + primary + + + 0C26DF3C4A7B81F517436CE80F07F368 + + primary + + + 1D77298ECE42FEF88367950A2D83E5C1 + + primary + + + 3B0CD7617B4912791A5E244AB6D56105 + + primary + + + 5437890023F30CA85DFCA260CA914D48 primary - 24F2D2C1278EF320F595B3F56C58DA67 + 586F2DFA9BDCC6675C2546793A69E5CC primary - 274F790B97E5AE8A7AB64D8F83473603 + 59D5617659A538B39BECA1B9B72A2957 primary - 37D7380A52EE2E9B49BECEE4DC247D19 + 5EAA6D463A9A35AD53DFDE7BD90DB91D primary - 39818EAD9B4F5290D508A9F1E9C33CB6 + 6B5503127B165F8F1EF1105805C54DD6 primary - 53480ED0BE09FF49E34B1702D485CAAB + 7126A8FF47B4545643C04540D6F9CB0B primary - 5A0DF836BAB98D7819952604EA22C47E + 720000A04716EA94A7F8EAE4F7FFE0A2 primary - 67C2E0E0C5FE7DE41F6A50F738BEFC7D + 8642CC820CE8C5B88C113D7F47AF4BC3 primary - 70BC44266C6FFE30D2C57129458E070B + 904F4F27FD314010A3812EB2A9306183 primary - 8C8C1779E3959B3BF107B00990F45010 + 92844E36EBBF88C45D432D8DBD41E81B primary - 928353533005A4198EBDA5B700D37B64 + 9DC8D9E02903E93BD0B2FEC9D846EA20 primary - 985F42852C5AD70E725D4F06503F5C5A + 9E033EDB5EC0819481B0546434FA577B primary - 9EAB3E42EF957541E6C3C76D35FD008E + A316B54C67E947D23CECD230FA5BFAEF primary - A0D476EE36FD46C7A5020DBF09EBD0FA + A9CEADE82CB20E7F255491FE1C30086C primary - B58AE9150F017AC1E3E69371EC850776 + AC139CEF10BCCB200972B4617F3CA14E primary - D058B89EB3B3DF45457A2DCD3971AFFE + AF9D6EADD8E530631B349B6FDC56DA82 primary - D0D0C9D20C43FA94D4C88FBFE2601B8E + B6F3D6D69304DDD34A584B5BE13EED49 primary - DA1A7295DF2A99609DA0EEBF5E83233D + BEBC67318C6C143D4D7E5C99A2B61B2A primary - DED33CF4E43969F4E40F313A8A826DC6 + C2A16C4461578CE67FD49F604F436B41 primary - E3E12B8BB339234054946D8B39A93687 + CEB869244C24B7157BF5DD56B91AD5DD primary - EBE33197DFF5736FB990D1E852CCCDEE + D5A9684BC81FF3836EEDB27552011C18 primary - F277FD5DFB62731C36EBF6B7E286CCA9 + DBD02925B68D475A927D89F1925CBD89 primary diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/AFNetworking.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/AFNetworking.xcscheme new file mode 100644 index 0000000..e3206b5 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/AFNetworking.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BAButton.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BAButton.xcscheme new file mode 100644 index 0000000..09fd81b --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BAButton.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BACustomAlertView.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BACustomAlertView.xcscheme new file mode 100644 index 0000000..9bd5c76 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BACustomAlertView.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BlocksKit.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BlocksKit.xcscheme new file mode 100644 index 0000000..016c3d6 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/BlocksKit.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme new file mode 100644 index 0000000..84d005e --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/DZNEmptyDataSet.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme new file mode 100644 index 0000000..fe7a494 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBAllocationTracker.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme new file mode 100644 index 0000000..7d00174 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBMemoryProfiler.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme new file mode 100644 index 0000000..ed92dfa --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FBRetainCycleDetector.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FMDB.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FMDB.xcscheme new file mode 100644 index 0000000..caf139a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/FMDB.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme new file mode 100644 index 0000000..97587e2 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme new file mode 100644 index 0000000..3b02131 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/JMRoundedCorner.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MBProgressHUD.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MBProgressHUD.xcscheme new file mode 100644 index 0000000..6dd7f50 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MBProgressHUD.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJExtension.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJExtension.xcscheme new file mode 100644 index 0000000..3749749 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJExtension.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJRefresh.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJRefresh.xcscheme new file mode 100644 index 0000000..f1257a7 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MJRefresh.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MLeaksFinder.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MLeaksFinder.xcscheme new file mode 100644 index 0000000..e919f55 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MLeaksFinder.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Masonry.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Masonry.xcscheme new file mode 100644 index 0000000..47e3ba3 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Masonry.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MyLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MyLayout.xcscheme new file mode 100644 index 0000000..cdb0279 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/MyLayout.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/NullSafe.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/NullSafe.xcscheme new file mode 100644 index 0000000..9f7287d --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/NullSafe.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme new file mode 100644 index 0000000..3335c3a --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectTests.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme new file mode 100644 index 0000000..d8a2360 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject-BABaseProjectUITests.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme new file mode 100644 index 0000000..cd91685 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/Pods-BABaseProject.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDAutoLayout.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDAutoLayout.xcscheme new file mode 100644 index 0000000..ca8daff --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDAutoLayout.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDWebImage.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDWebImage.xcscheme new file mode 100644 index 0000000..0136179 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/SDWebImage.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme new file mode 100644 index 0000000..573d443 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/WebViewJavascriptBridge.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/YYKit.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/YYKit.xcscheme new file mode 100644 index 0000000..ca11402 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/YYKit.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..93155bc --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/luxiaofeng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,382 @@ + + + + + SchemeUserState + + AFNetworking.xcscheme + + orderHint + 1 + + BAButton.xcscheme + + orderHint + 2 + + BACustomAlertView.xcscheme + + orderHint + 23 + + BlocksKit.xcscheme + + orderHint + 3 + + FBAllocationTracker.xcscheme + + orderHint + 4 + + FBMemoryProfiler.xcscheme + + orderHint + 5 + + FBRetainCycleDetector.xcscheme + + orderHint + 6 + + IQKeyboardManager.xcscheme + + orderHint + 7 + + JMRoundedCorner.xcscheme + + orderHint + 8 + + MBProgressHUD.xcscheme + + orderHint + 10 + + MJExtension.xcscheme + + orderHint + 11 + + MJRefresh.xcscheme + + orderHint + 12 + + MLeaksFinder.xcscheme + + orderHint + 13 + + Masonry.xcscheme + + orderHint + 9 + + MyLayout.xcscheme + + orderHint + 14 + + NullSafe.xcscheme + + orderHint + 15 + + Pods-BABaseProject-BABaseProjectTests.xcscheme + + orderHint + 17 + + Pods-BABaseProject-BABaseProjectUITests.xcscheme + + orderHint + 18 + + Pods-BABaseProject.xcscheme + + orderHint + 16 + + SDAutoLayout.xcscheme + + orderHint + 19 + + SDWebImage.xcscheme + + orderHint + 20 + + WebViewJavascriptBridge.xcscheme + + orderHint + 21 + + YYKit.xcscheme + + orderHint + 22 + + + SuppressBuildableAutocreation + + 03F5BBFD7D8A6BB90CB59F110CD162CA + + primary + + + 04CF549EBEEE7BC87AEAE35397184D94 + + primary + + + 07A1458F0ECFD7D943DC4EF15E916F34 + + primary + + + 24F2D2C1278EF320F595B3F56C58DA67 + + primary + + + 274F790B97E5AE8A7AB64D8F83473603 + + primary + + + 362413C1766944FAB7F4304F37B692EA + + primary + + + 37D7380A52EE2E9B49BECEE4DC247D19 + + primary + + + 39818EAD9B4F5290D508A9F1E9C33CB6 + + primary + + + 41A0385EF78F63D07BACEC60C9C684D5 + + primary + + + 53480ED0BE09FF49E34B1702D485CAAB + + primary + + + 5437890023F30CA85DFCA260CA914D48 + + primary + + + 586F2DFA9BDCC6675C2546793A69E5CC + + primary + + + 5A0DF836BAB98D7819952604EA22C47E + + primary + + + 5EAA6D463A9A35AD53DFDE7BD90DB91D + + primary + + + 64593443C981ACA9F81179ADFCBBB8A6 + + primary + + + 67C2E0E0C5FE7DE41F6A50F738BEFC7D + + primary + + + 70BC44266C6FFE30D2C57129458E070B + + primary + + + 7126A8FF47B4545643C04540D6F9CB0B + + primary + + + 8642CC820CE8C5B88C113D7F47AF4BC3 + + primary + + + 8C8C1779E3959B3BF107B00990F45010 + + primary + + + 924D33FD29EE4B8C2EEC6C575F5861AC + + primary + + + 928353533005A4198EBDA5B700D37B64 + + primary + + + 93D7B2561440B88E4738C0CC1655A302 + + primary + + + 95D1E99F0FDCEC61540199A0FAB9167E + + primary + + + 9650B5ADCE86F1A055FAFC635284BDB5 + + primary + + + 985F42852C5AD70E725D4F06503F5C5A + + primary + + + 9DC8D9E02903E93BD0B2FEC9D846EA20 + + primary + + + 9E033EDB5EC0819481B0546434FA577B + + primary + + + 9EAB3E42EF957541E6C3C76D35FD008E + + primary + + + A0D476EE36FD46C7A5020DBF09EBD0FA + + primary + + + A1CA83E959654FBDDE495F0BB01A1CB9 + + primary + + + A316B54C67E947D23CECD230FA5BFAEF + + primary + + + AC139CEF10BCCB200972B4617F3CA14E + + primary + + + AF9D6EADD8E530631B349B6FDC56DA82 + + primary + + + B58AE9150F017AC1E3E69371EC850776 + + primary + + + C0C4F1C1CC25391AE3BD662EA33F4AF9 + + primary + + + C2A16C4461578CE67FD49F604F436B41 + + primary + + + C6FDFF78E966BC8FD65617A358FBB9CC + + primary + + + CE29A19A691D90DD821DCCDBCEF1ECD1 + + primary + + + D058B89EB3B3DF45457A2DCD3971AFFE + + primary + + + D0D0C9D20C43FA94D4C88FBFE2601B8E + + primary + + + D97CB4CF4315107B77472F281F904C7D + + primary + + + DA1A7295DF2A99609DA0EEBF5E83233D + + primary + + + DA73D2B9DDCC706253D46A0B3094C075 + + primary + + + DC9BDED81B1BC7A731324FD904FDE08A + + primary + + + DED33CF4E43969F4E40F313A8A826DC6 + + primary + + + E3E12B8BB339234054946D8B39A93687 + + primary + + + E87AB5B3EE1D6317663874B69E97F86B + + primary + + + EBE33197DFF5736FB990D1E852CCCDEE + + primary + + + F1B102AF2BAD5027C4E89E7E5411926F + + primary + + + F277FD5DFB62731C36EBF6B7E286CCA9 + + primary + + + + + diff --git a/Pods/Pods.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..4bcd472 --- /dev/null +++ b/Pods/Pods.xcodeproj/xcuserdata/sunboyan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,139 @@ + + + + + SchemeUserState + + AFNetworking.xcscheme + + orderHint + 0 + + BAAlert.xcscheme + + orderHint + 2 + + BAButton.xcscheme + + orderHint + 3 + + BANetManager.xcscheme + + orderHint + 4 + + BAPickView.xcscheme + + orderHint + 5 + + BATextView.xcscheme + + orderHint + 6 + + BATouchID.xcscheme + + orderHint + 7 + + DZNEmptyDataSet.xcscheme + + orderHint + 8 + + FBRetainCycleDetector.xcscheme + + orderHint + 9 + + FMDB.xcscheme + + orderHint + 10 + + IQKeyboardManager.xcscheme + + orderHint + 11 + + JMRoundedCorner.xcscheme + + orderHint + 12 + + MBProgressHUD.xcscheme + + orderHint + 14 + + MJExtension.xcscheme + + orderHint + 15 + + MJRefresh.xcscheme + + orderHint + 16 + + MLeaksFinder.xcscheme + + orderHint + 17 + + Masonry.xcscheme + + orderHint + 13 + + MyLayout.xcscheme + + orderHint + 18 + + NullSafe.xcscheme + + orderHint + 19 + + Pods-BABaseProject-BABaseProjectTests.xcscheme + + orderHint + 21 + + Pods-BABaseProject-BABaseProjectUITests.xcscheme + + orderHint + 22 + + Pods-BABaseProject.xcscheme + + orderHint + 20 + + ReactiveObjC.xcscheme + + orderHint + 23 + + SDAutoLayout.xcscheme + + orderHint + 24 + + SDWebImage.xcscheme + + orderHint + 25 + + YYCache.xcscheme + + orderHint + 26 + + + + diff --git a/Pods/ReactiveObjC/LICENSE.md b/Pods/ReactiveObjC/LICENSE.md new file mode 100644 index 0000000..49bc374 --- /dev/null +++ b/Pods/ReactiveObjC/LICENSE.md @@ -0,0 +1,19 @@ +**Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Pods/ReactiveObjC/README.md b/Pods/ReactiveObjC/README.md new file mode 100644 index 0000000..ab43c42 --- /dev/null +++ b/Pods/ReactiveObjC/README.md @@ -0,0 +1,547 @@ +# ReactiveObjC + +_NOTE: This is legacy introduction to the Objective-C ReactiveCocoa, which is +now known as ReactiveObjC. For the updated version that uses Swift, please see +[ReactiveCocoa][] or [ReactiveSwift][]_ + +ReactiveObjC (formally ReactiveCocoa or RAC) is an Objective-C framework +inspired by [Functional Reactive Programming][]. It provides APIs for +**composing and transforming streams of values**. + +If you're already familiar with functional reactive programming or know the basic +premise of ReactiveObjC, check out the other documentation in this folder for a +framework overview and more in-depth information about how it all works in practice. + +## New to ReactiveObjC? + +ReactiveObjC is documented like crazy, and there's a wealth of introductory +material available to explain what RAC is and how you can use it. + +If you want to learn more, we recommend these resources, roughly in order: + + 1. [Introduction](#introduction) + 1. [When to use ReactiveObjC](#when-to-use-reactiveobjc) + 1. [Framework Overview][] + 1. [Basic Operators][] + 1. [Header documentation](ReactiveObjC/) + 1. Previously answered [Stack Overflow](https://github.com/ReactiveCocoa/ReactiveCocoa/wiki) + questions and [GitHub issues](https://github.com/ReactiveCocoa/ReactiveCocoa/issues?labels=question&state=closed) + 1. The rest of this folder + 1. [Functional Reactive Programming on iOS](https://leanpub.com/iosfrp/) + (eBook) + +If you have any further questions, please feel free to [file an issue](https://github.com/ReactiveCocoa/ReactiveObjC/issues/new). + +## Introduction + +ReactiveObjC is inspired by [functional reactive +programming](http://blog.maybeapps.com/post/42894317939/input-and-output). +Rather than using mutable variables which are replaced and modified in-place, +RAC provides signals (represented by `RACSignal`) that capture present and +future values. + +By chaining, combining, and reacting to signals, software can be written +declaratively, without the need for code that continually observes and updates +values. + +For example, a text field can be bound to the latest time, even as it changes, +instead of using additional code that watches the clock and updates the +text field every second. It works much like KVO, but with blocks instead of +overriding `-observeValueForKeyPath:ofObject:change:context:`. + +Signals can also represent asynchronous operations, much like [futures and +promises][]. This greatly simplifies asynchronous software, including networking +code. + +One of the major advantages of RAC is that it provides a single, unified +approach to dealing with asynchronous behaviors, including delegate methods, +callback blocks, target-action mechanisms, notifications, and KVO. + +Here's a simple example: + +```objc +// When self.username changes, logs the new name to the console. +// +// RACObserve(self, username) creates a new RACSignal that sends the current +// value of self.username, then the new value whenever it changes. +// -subscribeNext: will execute the block whenever the signal sends a value. +[RACObserve(self, username) subscribeNext:^(NSString *newName) { + NSLog(@"%@", newName); +}]; +``` + +But unlike KVO notifications, signals can be chained together and operated on: + +```objc +// Only logs names that starts with "j". +// +// -filter returns a new RACSignal that only sends a new value when its block +// returns YES. +[[RACObserve(self, username) + filter:^(NSString *newName) { + return [newName hasPrefix:@"j"]; + }] + subscribeNext:^(NSString *newName) { + NSLog(@"%@", newName); + }]; +``` + +Signals can also be used to derive state. Instead of observing properties and +setting other properties in response to the new values, RAC makes it possible to +express properties in terms of signals and operations: + +```objc +// Creates a one-way binding so that self.createEnabled will be +// true whenever self.password and self.passwordConfirmation +// are equal. +// +// RAC() is a macro that makes the binding look nicer. +// +// +combineLatest:reduce: takes an array of signals, executes the block with the +// latest value from each signal whenever any of them changes, and returns a new +// RACSignal that sends the return value of that block as values. +RAC(self, createEnabled) = [RACSignal + combineLatest:@[ RACObserve(self, password), RACObserve(self, passwordConfirmation) ] + reduce:^(NSString *password, NSString *passwordConfirm) { + return @([passwordConfirm isEqualToString:password]); + }]; +``` + +Signals can be built on any stream of values over time, not just KVO. For +example, they can also represent button presses: + +```objc +// Logs a message whenever the button is pressed. +// +// RACCommand creates signals to represent UI actions. Each signal can +// represent a button press, for example, and have additional work associated +// with it. +// +// -rac_command is an addition to NSButton. The button will send itself on that +// command whenever it's pressed. +self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) { + NSLog(@"button was pressed!"); + return [RACSignal empty]; +}]; +``` + +Or asynchronous network operations: + +```objc +// Hooks up a "Log in" button to log in over the network. +// +// This block will be run whenever the login command is executed, starting +// the login process. +self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) { + // The hypothetical -logIn method returns a signal that sends a value when + // the network request finishes. + return [client logIn]; +}]; + +// -executionSignals returns a signal that includes the signals returned from +// the above block, one for each time the command is executed. +[self.loginCommand.executionSignals subscribeNext:^(RACSignal *loginSignal) { + // Log a message whenever we log in successfully. + [loginSignal subscribeCompleted:^{ + NSLog(@"Logged in successfully!"); + }]; +}]; + +// Executes the login command when the button is pressed. +self.loginButton.rac_command = self.loginCommand; +``` + +Signals can also represent timers, other UI events, or anything else that +changes over time. + +Using signals for asynchronous operations makes it possible to build up more +complex behavior by chaining and transforming those signals. Work can easily be +triggered after a group of operations completes: + +```objc +// Performs 2 network operations and logs a message to the console when they are +// both completed. +// +// +merge: takes an array of signals and returns a new RACSignal that passes +// through the values of all of the signals and completes when all of the +// signals complete. +// +// -subscribeCompleted: will execute the block when the signal completes. +[[RACSignal + merge:@[ [client fetchUserRepos], [client fetchOrgRepos] ]] + subscribeCompleted:^{ + NSLog(@"They're both done!"); + }]; +``` + +Signals can be chained to sequentially execute asynchronous operations, instead +of nesting callbacks with blocks. This is similar to how [futures and promises][] +are usually used: + +```objc +// Logs in the user, then loads any cached messages, then fetches the remaining +// messages from the server. After that's all done, logs a message to the +// console. +// +// The hypothetical -logInUser methods returns a signal that completes after +// logging in. +// +// -flattenMap: will execute its block whenever the signal sends a value, and +// returns a new RACSignal that merges all of the signals returned from the block +// into a single signal. +[[[[client + logInUser] + flattenMap:^(User *user) { + // Return a signal that loads cached messages for the user. + return [client loadCachedMessagesForUser:user]; + }] + flattenMap:^(NSArray *messages) { + // Return a signal that fetches any remaining messages. + return [client fetchMessagesAfterMessage:messages.lastObject]; + }] + subscribeNext:^(NSArray *newMessages) { + NSLog(@"New messages: %@", newMessages); + } completed:^{ + NSLog(@"Fetched all messages."); + }]; +``` + +RAC even makes it easy to bind to the result of an asynchronous operation: + +```objc +// Creates a one-way binding so that self.imageView.image will be set as the user's +// avatar as soon as it's downloaded. +// +// The hypothetical -fetchUserWithUsername: method returns a signal which sends +// the user. +// +// -deliverOn: creates new signals that will do their work on other queues. In +// this example, it's used to move work to a background queue and then back to the main thread. +// +// -map: calls its block with each user that's fetched and returns a new +// RACSignal that sends values returned from the block. +RAC(self.imageView, image) = [[[[client + fetchUserWithUsername:@"joshaber"] + deliverOn:[RACScheduler scheduler]] + map:^(User *user) { + // Download the avatar (this is done on a background queue). + return [[NSImage alloc] initWithContentsOfURL:user.avatarURL]; + }] + // Now the assignment will be done on the main thread. + deliverOn:RACScheduler.mainThreadScheduler]; +``` + +That demonstrates some of what RAC can do, but it doesn't demonstrate why RAC is +so powerful. It's hard to appreciate RAC from README-sized examples, but it +makes it possible to write code with less state, less boilerplate, better code +locality, and better expression of intent. + +For more sample code, check out [C-41][] or [GroceryList][], which are real iOS +apps written using ReactiveObjC. Additional information about RAC can be found +in this folder. + +## When to use ReactiveObjC + +Upon first glance, ReactiveObjC is very abstract, and it can be difficult to +understand how to apply it to concrete problems. + +Here are some of the use cases that RAC excels at. + +### Handling asynchronous or event-driven data sources + +Much of Cocoa programming is focused on reacting to user events or changes in +application state. Code that deals with such events can quickly become very +complex and spaghetti-like, with lots of callbacks and state variables to handle +ordering issues. + +Patterns that seem superficially different, like UI callbacks, network +responses, and KVO notifications, actually have a lot in common. [RACSignal][] +unifies all these different APIs so that they can be composed together and +manipulated in the same way. + +For example, the following code: + +```objc + +static void *ObservationContext = &ObservationContext; + +- (void)viewDidLoad { + [super viewDidLoad]; + + [LoginManager.sharedManager addObserver:self forKeyPath:@"loggingIn" options:NSKeyValueObservingOptionInitial context:&ObservationContext]; + [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(loggedOut:) name:UserDidLogOutNotification object:LoginManager.sharedManager]; + + [self.usernameTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged]; + [self.passwordTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged]; + [self.logInButton addTarget:self action:@selector(logInPressed:) forControlEvents:UIControlEventTouchUpInside]; +} + +- (void)dealloc { + [LoginManager.sharedManager removeObserver:self forKeyPath:@"loggingIn" context:ObservationContext]; + [NSNotificationCenter.defaultCenter removeObserver:self]; +} + +- (void)updateLogInButton { + BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0; + BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn; + self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn; +} + +- (IBAction)logInPressed:(UIButton *)sender { + [[LoginManager sharedManager] + logInWithUsername:self.usernameTextField.text + password:self.passwordTextField.text + success:^{ + self.loggedIn = YES; + } failure:^(NSError *error) { + [self presentError:error]; + }]; +} + +- (void)loggedOut:(NSNotification *)notification { + self.loggedIn = NO; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if (context == ObservationContext) { + [self updateLogInButton]; + } else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} +``` + +… could be expressed in RAC like so: + +```objc +- (void)viewDidLoad { + [super viewDidLoad]; + + @weakify(self); + + RAC(self.logInButton, enabled) = [RACSignal + combineLatest:@[ + self.usernameTextField.rac_textSignal, + self.passwordTextField.rac_textSignal, + RACObserve(LoginManager.sharedManager, loggingIn), + RACObserve(self, loggedIn) + ] reduce:^(NSString *username, NSString *password, NSNumber *loggingIn, NSNumber *loggedIn) { + return @(username.length > 0 && password.length > 0 && !loggingIn.boolValue && !loggedIn.boolValue); + }]; + + [[self.logInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) { + @strongify(self); + + RACSignal *loginSignal = [LoginManager.sharedManager + logInWithUsername:self.usernameTextField.text + password:self.passwordTextField.text]; + + [loginSignal subscribeError:^(NSError *error) { + @strongify(self); + [self presentError:error]; + } completed:^{ + @strongify(self); + self.loggedIn = YES; + }]; + }]; + + RAC(self, loggedIn) = [[NSNotificationCenter.defaultCenter + rac_addObserverForName:UserDidLogOutNotification object:nil] + mapReplace:@NO]; +} +``` + +### Chaining dependent operations + +Dependencies are most often found in network requests, where a previous request +to the server needs to complete before the next one can be constructed, and so +on: + +```objc +[client logInWithSuccess:^{ + [client loadCachedMessagesWithSuccess:^(NSArray *messages) { + [client fetchMessagesAfterMessage:messages.lastObject success:^(NSArray *nextMessages) { + NSLog(@"Fetched all messages."); + } failure:^(NSError *error) { + [self presentError:error]; + }]; + } failure:^(NSError *error) { + [self presentError:error]; + }]; +} failure:^(NSError *error) { + [self presentError:error]; +}]; +``` + +ReactiveObjC makes this pattern particularly easy: + +```objc +[[[[client logIn] + then:^{ + return [client loadCachedMessages]; + }] + flattenMap:^(NSArray *messages) { + return [client fetchMessagesAfterMessage:messages.lastObject]; + }] + subscribeError:^(NSError *error) { + [self presentError:error]; + } completed:^{ + NSLog(@"Fetched all messages."); + }]; +``` + +### Parallelizing independent work + +Working with independent data sets in parallel and then combining them into +a final result is non-trivial in Cocoa, and often involves a lot of +synchronization: + +```objc +__block NSArray *databaseObjects; +__block NSArray *fileContents; + +NSOperationQueue *backgroundQueue = [[NSOperationQueue alloc] init]; +NSBlockOperation *databaseOperation = [NSBlockOperation blockOperationWithBlock:^{ + databaseObjects = [databaseClient fetchObjectsMatchingPredicate:predicate]; +}]; + +NSBlockOperation *filesOperation = [NSBlockOperation blockOperationWithBlock:^{ + NSMutableArray *filesInProgress = [NSMutableArray array]; + for (NSString *path in files) { + [filesInProgress addObject:[NSData dataWithContentsOfFile:path]]; + } + + fileContents = [filesInProgress copy]; +}]; + +NSBlockOperation *finishOperation = [NSBlockOperation blockOperationWithBlock:^{ + [self finishProcessingDatabaseObjects:databaseObjects fileContents:fileContents]; + NSLog(@"Done processing"); +}]; + +[finishOperation addDependency:databaseOperation]; +[finishOperation addDependency:filesOperation]; +[backgroundQueue addOperation:databaseOperation]; +[backgroundQueue addOperation:filesOperation]; +[backgroundQueue addOperation:finishOperation]; +``` + +The above code can be cleaned up and optimized by simply composing signals: + +```objc +RACSignal *databaseSignal = [[databaseClient + fetchObjectsMatchingPredicate:predicate] + subscribeOn:[RACScheduler scheduler]]; + +RACSignal *fileSignal = [RACSignal startEagerlyWithScheduler:[RACScheduler scheduler] block:^(id subscriber) { + NSMutableArray *filesInProgress = [NSMutableArray array]; + for (NSString *path in files) { + [filesInProgress addObject:[NSData dataWithContentsOfFile:path]]; + } + + [subscriber sendNext:[filesInProgress copy]]; + [subscriber sendCompleted]; +}]; + +[[RACSignal + combineLatest:@[ databaseSignal, fileSignal ] + reduce:^ id (NSArray *databaseObjects, NSArray *fileContents) { + [self finishProcessingDatabaseObjects:databaseObjects fileContents:fileContents]; + return nil; + }] + subscribeCompleted:^{ + NSLog(@"Done processing"); + }]; +``` + +### Simplifying collection transformations + +Higher-order functions like `map`, `filter`, `fold`/`reduce` are sorely missing +from Foundation, leading to loop-focused code like this: + +```objc +NSMutableArray *results = [NSMutableArray array]; +for (NSString *str in strings) { + if (str.length < 2) { + continue; + } + + NSString *newString = [str stringByAppendingString:@"foobar"]; + [results addObject:newString]; +} +``` + +[RACSequence][] allows any Cocoa collection to be manipulated in a uniform and +declarative way: + +```objc +RACSequence *results = [[strings.rac_sequence + filter:^ BOOL (NSString *str) { + return str.length >= 2; + }] + map:^(NSString *str) { + return [str stringByAppendingString:@"foobar"]; + }]; +``` + +## System Requirements + +ReactiveObjC supports OS X 10.8+ and iOS 8.0+. + +## Importing ReactiveObjC + +To add RAC to your application: + + 1. Add the ReactiveObjC repository as a submodule of your application's + repository. + 1. Run `git submodule update --init --recursive` from within the ReactiveObjC folder. + 1. Drag and drop `ReactiveObjC.xcodeproj` into your + application's Xcode project or workspace. + 1. On the "Build Phases" tab of your application target, add RAC to the "Link + Binary With Libraries" phase. + 1. Add `ReactiveObjC.framework`. RAC must also be added to any + "Copy Frameworks" build phase. If you don't already have one, simply add + a "Copy Files" build phase and target the "Frameworks" destination. + 1. Add `"$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts/include" + $(inherited)` to the "Header Search Paths" build setting (this is only + necessary for archive builds, but it has no negative effect otherwise). + 1. **For iOS targets**, add `-ObjC` to the "Other Linker Flags" build setting. + 1. **If you added RAC to a project (not a workspace)**, you will also need to + add the appropriate RAC target to the "Target Dependencies" of your + application. + +To see a project already set up with RAC, check out [C-41][] or [GroceryList][], +which are real iOS apps written using ReactiveObjC. + +## More Info + +ReactiveObjC is inspired by .NET's [Reactive +Extensions](http://msdn.microsoft.com/en-us/data/gg577609) (Rx). Most of the +principles of Rx apply to RAC as well. There are some really good Rx resources +out there: + +* [Reactive Extensions MSDN entry](http://msdn.microsoft.com/en-us/library/hh242985.aspx) +* [Reactive Extensions for .NET Introduction](http://leecampbell.blogspot.com/2010/08/reactive-extensions-for-net.html) +* [Rx - Channel 9 videos](http://channel9.msdn.com/tags/Rx/) +* [Reactive Extensions wiki](http://rxwiki.wikidot.com/) +* [101 Rx Samples](http://rxwiki.wikidot.com/101samples) +* [Programming Reactive Extensions and LINQ](http://www.amazon.com/Programming-Reactive-Extensions-Jesse-Liberty/dp/1430237473) + +RAC and Rx are both frameworks inspired by functional reactive programming. Here +are some resources related to FRP: + +* [What is FRP? - Elm Language](http://elm-lang.org/learn/What-is-FRP.elm) +* [What is Functional Reactive Programming - Stack Overflow](http://stackoverflow.com/questions/1028250/what-is-functional-reactive-programming/1030631#1030631) +* [Specification for a Functional Reactive Language - Stack Overflow](http://stackoverflow.com/questions/5875929/specification-for-a-functional-reactive-programming-language#5878525) +* [Principles of Reactive Programming on Coursera](https://www.coursera.org/course/reactive) + +[ReactiveCocoa]: https://github.com/ReactiveCocoa/ReactiveCocoa +[ReactiveSwift]: https://github.com/ReactiveCocoa/ReactiveSwift +[Basic Operators]: Documentation/BasicOperators.md +[Framework Overview]: Documentation/FrameworkOverview.md +[Functional Reactive Programming]: http://en.wikipedia.org/wiki/Functional_reactive_programming +[GroceryList]: https://github.com/jspahrsummers/GroceryList +[RACSequence]: ReactiveObjC/RACSequence.h +[RACSignal]: ReactiveOjC/RACSignal.h +[futures and promises]: http://en.wikipedia.org/wiki/Futures_and_promises +[C-41]: https://github.com/AshFurrow/C-41 diff --git a/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.h new file mode 100644 index 0000000..5be9789 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.h @@ -0,0 +1,34 @@ +// +// MKAnnotationView+RACSignalSupport.h +// ReactiveObjC +// +// Created by Zak Remer on 3/31/15. +// Copyright (c) 2015 GitHub. All rights reserved. +// + +#import +#import + +@class RACSignal<__covariant ValueType>; +@class RACUnit; + +NS_ASSUME_NONNULL_BEGIN + +@interface MKAnnotationView (RACSignalSupport) + +/// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon +/// the receiver. +/// +/// Examples +/// +/// [[[self.cancelButton +/// rac_signalForControlEvents:UIControlEventTouchUpInside] +/// takeUntil:self.rac_prepareForReuseSignal] +/// subscribeNext:^(UIButton *x) { +/// // do other things +/// }]; +@property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.m new file mode 100644 index 0000000..d138a79 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/MKAnnotationView+RACSignalSupport.m @@ -0,0 +1,31 @@ +// +// MKAnnotationView+RACSignalSupport.m +// ReactiveObjC +// +// Created by Zak Remer on 3/31/15. +// Copyright (c) 2015 GitHub. All rights reserved. +// + +#import "MKAnnotationView+RACSignalSupport.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACSelectorSignal.h" +#import "RACSignal+Operations.h" +#import "RACUnit.h" +#import + +@implementation MKAnnotationView (RACSignalSupport) + +- (RACSignal *)rac_prepareForReuseSignal { + RACSignal *signal = objc_getAssociatedObject(self, _cmd); + if (signal != nil) return signal; + + signal = [[[self + rac_signalForSelector:@selector(prepareForReuse)] + mapReplace:RACUnit.defaultUnit] + setNameWithFormat:@"%@ -rac_prepareForReuseSignal", RACDescription(self)]; + + objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h new file mode 100644 index 0000000..9cd5605 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.h @@ -0,0 +1,24 @@ +// +// NSArray+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSArray<__covariant ObjectType> (RACSequenceAdditions) + +/// Creates and returns a sequence corresponding to the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.m new file mode 100644 index 0000000..4eaebb8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSArray+RACSequenceAdditions.m @@ -0,0 +1,18 @@ +// +// NSArray+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSArray+RACSequenceAdditions.h" +#import "RACArraySequence.h" + +@implementation NSArray (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + return [RACArraySequence sequenceWithArray:self offset:0]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.h new file mode 100644 index 0000000..5551fbb --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.h @@ -0,0 +1,26 @@ +// +// NSData+RACSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 5/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACScheduler; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSData (RACSupport) + +// Read the data at the URL using -[NSData initWithContentsOfURL:options:error:]. +// Sends the data or the error. +// +// scheduler - cannot be nil. ++ (RACSignal *)rac_readContentsOfURL:(nullable NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.m new file mode 100644 index 0000000..977ba4a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSData+RACSupport.m @@ -0,0 +1,35 @@ +// +// NSData+RACSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 5/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "NSData+RACSupport.h" +#import "RACReplaySubject.h" +#import "RACScheduler.h" + +@implementation NSData (RACSupport) + ++ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL options:(NSDataReadingOptions)options scheduler:(RACScheduler *)scheduler { + NSCParameterAssert(scheduler != nil); + + RACReplaySubject *subject = [RACReplaySubject subject]; + [subject setNameWithFormat:@"+rac_readContentsOfURL: %@ options: %lu scheduler: %@", URL, (unsigned long)options, scheduler]; + + [scheduler schedule:^{ + NSError *error = nil; + NSData *data = [[NSData alloc] initWithContentsOfURL:URL options:options error:&error]; + if (data == nil) { + [subject sendError:error]; + } else { + [subject sendNext:data]; + [subject sendCompleted]; + } + }]; + + return subject; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h new file mode 100644 index 0000000..84c7955 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.h @@ -0,0 +1,35 @@ +// +// NSDictionary+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; +@class RACTwoTuple<__covariant First, __covariant Second>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSDictionary<__covariant KeyType, __covariant ObjectType> (RACSequenceAdditions) + +/// Creates and returns a sequence of key/value tuples. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *> *rac_sequence; + +/// Creates and returns a sequence corresponding to the keys in the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_keySequence; + +/// Creates and returns a sequence corresponding to the values in the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_valueSequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.m new file mode 100644 index 0000000..2998b9a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSDictionary+RACSequenceAdditions.m @@ -0,0 +1,34 @@ +// +// NSDictionary+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSDictionary+RACSequenceAdditions.h" +#import "NSArray+RACSequenceAdditions.h" +#import "RACSequence.h" +#import "RACTuple.h" + +@implementation NSDictionary (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + NSDictionary *immutableDict = [self copy]; + + // TODO: First class support for dictionary sequences. + return [immutableDict.allKeys.rac_sequence map:^(id key) { + id value = immutableDict[key]; + return RACTuplePack(key, value); + }]; +} + +- (RACSequence *)rac_keySequence { + return self.allKeys.rac_sequence; +} + +- (RACSequence *)rac_valueSequence { + return self.allValues.rac_sequence; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h new file mode 100644 index 0000000..82e779b --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.h @@ -0,0 +1,24 @@ +// +// NSEnumerator+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Uri Baghin on 07/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSEnumerator (RACSequenceAdditions) + +/// Creates and returns a sequence corresponding to the receiver. +/// +/// The receiver is exhausted lazily as the sequence is enumerated. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.m new file mode 100644 index 0000000..59b6380 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSEnumerator+RACSequenceAdditions.m @@ -0,0 +1,22 @@ +// +// NSEnumerator+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Uri Baghin on 07/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSEnumerator+RACSequenceAdditions.h" +#import "RACSequence.h" + +@implementation NSEnumerator (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + return [RACSequence sequenceWithHeadBlock:^{ + return [self nextObject]; + } tailBlock:^{ + return self.rac_sequence; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h new file mode 100644 index 0000000..70d8ff3 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.h @@ -0,0 +1,23 @@ +// +// NSFileHandle+RACSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 5/10/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSFileHandle (RACSupport) + +// Read any available data in the background and send it. Completes when data +// length is <= 0. +- (RACSignal *)rac_readInBackground; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.m new file mode 100644 index 0000000..9d1c42f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSFileHandle+RACSupport.m @@ -0,0 +1,40 @@ +// +// NSFileHandle+RACSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 5/10/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSFileHandle+RACSupport.h" +#import "NSNotificationCenter+RACSupport.h" +#import "NSObject+RACDescription.h" +#import "RACReplaySubject.h" +#import "RACDisposable.h" + +@implementation NSFileHandle (RACSupport) + +- (RACSignal *)rac_readInBackground { + RACReplaySubject *subject = [RACReplaySubject subject]; + [subject setNameWithFormat:@"%@ -rac_readInBackground", RACDescription(self)]; + + RACSignal *dataNotification = [[[NSNotificationCenter defaultCenter] rac_addObserverForName:NSFileHandleReadCompletionNotification object:self] map:^(NSNotification *note) { + return note.userInfo[NSFileHandleNotificationDataItem]; + }]; + + __block RACDisposable *subscription = [dataNotification subscribeNext:^(NSData *data) { + if (data.length > 0) { + [subject sendNext:data]; + [self readInBackgroundAndNotify]; + } else { + [subject sendCompleted]; + [subscription dispose]; + } + }]; + + [self readInBackgroundAndNotify]; + + return subject; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h new file mode 100644 index 0000000..5075f4a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.h @@ -0,0 +1,25 @@ +// +// NSIndexSet+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Sergey Gavrilyuk on 12/17/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSIndexSet (RACSequenceAdditions) + +/// Creates and returns a sequence of indexes (as `NSNumber`s) corresponding to +/// the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.m new file mode 100644 index 0000000..e2866b8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSIndexSet+RACSequenceAdditions.m @@ -0,0 +1,18 @@ +// +// NSIndexSet+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Sergey Gavrilyuk on 12/17/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSIndexSet+RACSequenceAdditions.h" +#import "RACIndexSetSequence.h" + +@implementation NSIndexSet (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + return [RACIndexSetSequence sequenceWithIndexSet:self]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h b/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h new file mode 100644 index 0000000..a7ac23b --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.h @@ -0,0 +1,56 @@ +// +// NSInvocation+RACTypeParsing.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACTuple; + +// A private category of methods to handle wrapping and unwrapping of values. +@interface NSInvocation (RACTypeParsing) + +// Sets the argument for the invocation at the given index by unboxing the given +// object based on the type signature of the argument. +// +// This does not support C arrays or unions. +// +// Note that calling this on a char * or const char * argument can cause all +// arguments to be retained. +// +// object - The object to unbox and set as the argument. +// index - The index of the argument to set. +- (void)rac_setArgument:(id)object atIndex:(NSUInteger)index; + +// Gets the argument for the invocation at the given index based on the +// invocation's method signature. The value is then wrapped in the appropriate +// object type. +// +// This does not support C arrays or unions. +// +// index - The index of the argument to get. +// +// Returns the argument of the invocation, wrapped in an object. +- (id)rac_argumentAtIndex:(NSUInteger)index; + +// Arguments tuple for the invocation. +// +// The arguments tuple excludes implicit variables `self` and `_cmd`. +// +// See -rac_argumentAtIndex: and -rac_setArgumentAtIndex: for further +// description of the underlying behavior. +@property (nonatomic, copy) RACTuple *rac_argumentsTuple; + +// Gets the return value from the invocation based on the invocation's method +// signature. The value is then wrapped in the appropriate object type. +// +// This does not support C arrays or unions. +// +// Returns the return value of the invocation, wrapped in an object. Voids are +// returned as `RACUnit.defaultUnit`. +- (id)rac_returnValue; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.m b/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.m new file mode 100644 index 0000000..92b5b7d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSInvocation+RACTypeParsing.m @@ -0,0 +1,232 @@ +// +// NSInvocation+RACTypeParsing.m +// ReactiveObjC +// +// Created by Josh Abernathy on 11/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "NSInvocation+RACTypeParsing.h" +#import "RACTuple.h" +#import "RACUnit.h" +#import + +@implementation NSInvocation (RACTypeParsing) + +- (void)rac_setArgument:(id)object atIndex:(NSUInteger)index { +#define PULL_AND_SET(type, selector) \ + do { \ + type val = [object selector]; \ + [self setArgument:&val atIndex:(NSInteger)index]; \ + } while (0) + + const char *argType = [self.methodSignature getArgumentTypeAtIndex:index]; + // Skip const type qualifier. + if (argType[0] == 'r') { + argType++; + } + + if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { + [self setArgument:&object atIndex:(NSInteger)index]; + } else if (strcmp(argType, @encode(char)) == 0) { + PULL_AND_SET(char, charValue); + } else if (strcmp(argType, @encode(int)) == 0) { + PULL_AND_SET(int, intValue); + } else if (strcmp(argType, @encode(short)) == 0) { + PULL_AND_SET(short, shortValue); + } else if (strcmp(argType, @encode(long)) == 0) { + PULL_AND_SET(long, longValue); + } else if (strcmp(argType, @encode(long long)) == 0) { + PULL_AND_SET(long long, longLongValue); + } else if (strcmp(argType, @encode(unsigned char)) == 0) { + PULL_AND_SET(unsigned char, unsignedCharValue); + } else if (strcmp(argType, @encode(unsigned int)) == 0) { + PULL_AND_SET(unsigned int, unsignedIntValue); + } else if (strcmp(argType, @encode(unsigned short)) == 0) { + PULL_AND_SET(unsigned short, unsignedShortValue); + } else if (strcmp(argType, @encode(unsigned long)) == 0) { + PULL_AND_SET(unsigned long, unsignedLongValue); + } else if (strcmp(argType, @encode(unsigned long long)) == 0) { + PULL_AND_SET(unsigned long long, unsignedLongLongValue); + } else if (strcmp(argType, @encode(float)) == 0) { + PULL_AND_SET(float, floatValue); + } else if (strcmp(argType, @encode(double)) == 0) { + PULL_AND_SET(double, doubleValue); + } else if (strcmp(argType, @encode(BOOL)) == 0) { + PULL_AND_SET(BOOL, boolValue); + } else if (strcmp(argType, @encode(char *)) == 0) { + const char *cString = [object UTF8String]; + [self setArgument:&cString atIndex:(NSInteger)index]; + [self retainArguments]; + } else if (strcmp(argType, @encode(void (^)(void))) == 0) { + [self setArgument:&object atIndex:(NSInteger)index]; + } else { + NSCParameterAssert([object isKindOfClass:NSValue.class]); + + NSUInteger valueSize = 0; + NSGetSizeAndAlignment([object objCType], &valueSize, NULL); + +#if DEBUG + NSUInteger argSize = 0; + NSGetSizeAndAlignment(argType, &argSize, NULL); + NSCAssert(valueSize == argSize, @"Value size does not match argument size in -rac_setArgument: %@ atIndex: %lu", object, (unsigned long)index); +#endif + + unsigned char valueBytes[valueSize]; + [object getValue:valueBytes]; + + [self setArgument:valueBytes atIndex:(NSInteger)index]; + } + +#undef PULL_AND_SET +} + +- (id)rac_argumentAtIndex:(NSUInteger)index { +#define WRAP_AND_RETURN(type) \ + do { \ + type val = 0; \ + [self getArgument:&val atIndex:(NSInteger)index]; \ + return @(val); \ + } while (0) + + const char *argType = [self.methodSignature getArgumentTypeAtIndex:index]; + // Skip const type qualifier. + if (argType[0] == 'r') { + argType++; + } + + if (strcmp(argType, @encode(id)) == 0 || strcmp(argType, @encode(Class)) == 0) { + __autoreleasing id returnObj; + [self getArgument:&returnObj atIndex:(NSInteger)index]; + return returnObj; + } else if (strcmp(argType, @encode(char)) == 0) { + WRAP_AND_RETURN(char); + } else if (strcmp(argType, @encode(int)) == 0) { + WRAP_AND_RETURN(int); + } else if (strcmp(argType, @encode(short)) == 0) { + WRAP_AND_RETURN(short); + } else if (strcmp(argType, @encode(long)) == 0) { + WRAP_AND_RETURN(long); + } else if (strcmp(argType, @encode(long long)) == 0) { + WRAP_AND_RETURN(long long); + } else if (strcmp(argType, @encode(unsigned char)) == 0) { + WRAP_AND_RETURN(unsigned char); + } else if (strcmp(argType, @encode(unsigned int)) == 0) { + WRAP_AND_RETURN(unsigned int); + } else if (strcmp(argType, @encode(unsigned short)) == 0) { + WRAP_AND_RETURN(unsigned short); + } else if (strcmp(argType, @encode(unsigned long)) == 0) { + WRAP_AND_RETURN(unsigned long); + } else if (strcmp(argType, @encode(unsigned long long)) == 0) { + WRAP_AND_RETURN(unsigned long long); + } else if (strcmp(argType, @encode(float)) == 0) { + WRAP_AND_RETURN(float); + } else if (strcmp(argType, @encode(double)) == 0) { + WRAP_AND_RETURN(double); + } else if (strcmp(argType, @encode(BOOL)) == 0) { + WRAP_AND_RETURN(BOOL); + } else if (strcmp(argType, @encode(char *)) == 0) { + WRAP_AND_RETURN(const char *); + } else if (strcmp(argType, @encode(void (^)(void))) == 0) { + __unsafe_unretained id block = nil; + [self getArgument:&block atIndex:(NSInteger)index]; + return [block copy]; + } else { + NSUInteger valueSize = 0; + NSGetSizeAndAlignment(argType, &valueSize, NULL); + + unsigned char valueBytes[valueSize]; + [self getArgument:valueBytes atIndex:(NSInteger)index]; + + return [NSValue valueWithBytes:valueBytes objCType:argType]; + } + + return nil; + +#undef WRAP_AND_RETURN +} + +- (RACTuple *)rac_argumentsTuple { + NSUInteger numberOfArguments = self.methodSignature.numberOfArguments; + NSMutableArray *argumentsArray = [NSMutableArray arrayWithCapacity:numberOfArguments - 2]; + for (NSUInteger index = 2; index < numberOfArguments; index++) { + [argumentsArray addObject:[self rac_argumentAtIndex:index] ?: RACTupleNil.tupleNil]; + } + + return [RACTuple tupleWithObjectsFromArray:argumentsArray]; +} + +- (void)setRac_argumentsTuple:(RACTuple *)arguments { + NSCAssert(arguments.count == self.methodSignature.numberOfArguments - 2, @"Number of supplied arguments (%lu), does not match the number expected by the signature (%lu)", (unsigned long)arguments.count, (unsigned long)self.methodSignature.numberOfArguments - 2); + + NSUInteger index = 2; + for (id arg in arguments) { + [self rac_setArgument:(arg == RACTupleNil.tupleNil ? nil : arg) atIndex:index]; + index++; + } +} + +- (id)rac_returnValue { +#define WRAP_AND_RETURN(type) \ + do { \ + type val = 0; \ + [self getReturnValue:&val]; \ + return @(val); \ + } while (0) + + const char *returnType = self.methodSignature.methodReturnType; + // Skip const type qualifier. + if (returnType[0] == 'r') { + returnType++; + } + + if (strcmp(returnType, @encode(id)) == 0 || strcmp(returnType, @encode(Class)) == 0 || strcmp(returnType, @encode(void (^)(void))) == 0) { + __autoreleasing id returnObj; + [self getReturnValue:&returnObj]; + return returnObj; + } else if (strcmp(returnType, @encode(char)) == 0) { + WRAP_AND_RETURN(char); + } else if (strcmp(returnType, @encode(int)) == 0) { + WRAP_AND_RETURN(int); + } else if (strcmp(returnType, @encode(short)) == 0) { + WRAP_AND_RETURN(short); + } else if (strcmp(returnType, @encode(long)) == 0) { + WRAP_AND_RETURN(long); + } else if (strcmp(returnType, @encode(long long)) == 0) { + WRAP_AND_RETURN(long long); + } else if (strcmp(returnType, @encode(unsigned char)) == 0) { + WRAP_AND_RETURN(unsigned char); + } else if (strcmp(returnType, @encode(unsigned int)) == 0) { + WRAP_AND_RETURN(unsigned int); + } else if (strcmp(returnType, @encode(unsigned short)) == 0) { + WRAP_AND_RETURN(unsigned short); + } else if (strcmp(returnType, @encode(unsigned long)) == 0) { + WRAP_AND_RETURN(unsigned long); + } else if (strcmp(returnType, @encode(unsigned long long)) == 0) { + WRAP_AND_RETURN(unsigned long long); + } else if (strcmp(returnType, @encode(float)) == 0) { + WRAP_AND_RETURN(float); + } else if (strcmp(returnType, @encode(double)) == 0) { + WRAP_AND_RETURN(double); + } else if (strcmp(returnType, @encode(BOOL)) == 0) { + WRAP_AND_RETURN(BOOL); + } else if (strcmp(returnType, @encode(char *)) == 0) { + WRAP_AND_RETURN(const char *); + } else if (strcmp(returnType, @encode(void)) == 0) { + return RACUnit.defaultUnit; + } else { + NSUInteger valueSize = 0; + NSGetSizeAndAlignment(returnType, &valueSize, NULL); + + unsigned char valueBytes[valueSize]; + [self getReturnValue:valueBytes]; + + return [NSValue valueWithBytes:valueBytes objCType:returnType]; + } + + return nil; + +#undef WRAP_AND_RETURN +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h new file mode 100644 index 0000000..49cd4fb --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.h @@ -0,0 +1,22 @@ +// +// NSNotificationCenter+RACSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 5/10/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSNotificationCenter (RACSupport) + +// Sends the NSNotification every time the notification is posted. +- (RACSignal *)rac_addObserverForName:(nullable NSString *)notificationName object:(nullable id)object; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.m new file mode 100644 index 0000000..9929514 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSNotificationCenter+RACSupport.m @@ -0,0 +1,31 @@ +// +// NSNotificationCenter+RACSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 5/10/12. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSNotificationCenter+RACSupport.h" +#import +#import "RACSignal.h" +#import "RACSubscriber.h" +#import "RACDisposable.h" + +@implementation NSNotificationCenter (RACSupport) + +- (RACSignal *)rac_addObserverForName:(NSString *)notificationName object:(id)object { + @unsafeify(object); + return [[RACSignal createSignal:^(id subscriber) { + @strongify(object); + id observer = [self addObserverForName:notificationName object:object queue:nil usingBlock:^(NSNotification *note) { + [subscriber sendNext:note]; + }]; + + return [RACDisposable disposableWithBlock:^{ + [self removeObserver:observer]; + }]; + }] setNameWithFormat:@"-rac_addObserverForName: %@ object: <%@: %p>", notificationName, [object class], object]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h new file mode 100644 index 0000000..2f845d7 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.h @@ -0,0 +1,30 @@ +// +// NSObject+RACDeallocating.h +// ReactiveObjC +// +// Created by Kazuo Koga on 2013/03/15. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACCompoundDisposable; +@class RACDisposable; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (RACDeallocating) + +/// The compound disposable which will be disposed of when the receiver is +/// deallocated. +@property (atomic, readonly, strong) RACCompoundDisposable *rac_deallocDisposable; + +/// Returns a signal that will complete immediately before the receiver is fully +/// deallocated. If already deallocated when the signal is subscribed to, +/// a `completed` event will be sent immediately. +- (RACSignal *)rac_willDeallocSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.m new file mode 100644 index 0000000..49ed176 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDeallocating.m @@ -0,0 +1,103 @@ +// +// NSObject+RACDeallocating.m +// ReactiveObjC +// +// Created by Kazuo Koga on 2013/03/15. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSObject+RACDeallocating.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACReplaySubject.h" +#import +#import + +static const void *RACObjectCompoundDisposable = &RACObjectCompoundDisposable; + +static NSMutableSet *swizzledClasses() { + static dispatch_once_t onceToken; + static NSMutableSet *swizzledClasses = nil; + dispatch_once(&onceToken, ^{ + swizzledClasses = [[NSMutableSet alloc] init]; + }); + + return swizzledClasses; +} + +static void swizzleDeallocIfNeeded(Class classToSwizzle) { + @synchronized (swizzledClasses()) { + NSString *className = NSStringFromClass(classToSwizzle); + if ([swizzledClasses() containsObject:className]) return; + + SEL deallocSelector = sel_registerName("dealloc"); + + __block void (*originalDealloc)(__unsafe_unretained id, SEL) = NULL; + + id newDealloc = ^(__unsafe_unretained id self) { + RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable); + [compoundDisposable dispose]; + + if (originalDealloc == NULL) { + struct objc_super superInfo = { + .receiver = self, + .super_class = class_getSuperclass(classToSwizzle) + }; + + void (*msgSend)(struct objc_super *, SEL) = (__typeof__(msgSend))objc_msgSendSuper; + msgSend(&superInfo, deallocSelector); + } else { + originalDealloc(self, deallocSelector); + } + }; + + IMP newDeallocIMP = imp_implementationWithBlock(newDealloc); + + if (!class_addMethod(classToSwizzle, deallocSelector, newDeallocIMP, "v@:")) { + // The class already contains a method implementation. + Method deallocMethod = class_getInstanceMethod(classToSwizzle, deallocSelector); + + // We need to store original implementation before setting new implementation + // in case method is called at the time of setting. + originalDealloc = (__typeof__(originalDealloc))method_getImplementation(deallocMethod); + + // We need to store original implementation again, in case it just changed. + originalDealloc = (__typeof__(originalDealloc))method_setImplementation(deallocMethod, newDeallocIMP); + } + + [swizzledClasses() addObject:className]; + } +} + +@implementation NSObject (RACDeallocating) + +- (RACSignal *)rac_willDeallocSignal { + RACSignal *signal = objc_getAssociatedObject(self, _cmd); + if (signal != nil) return signal; + + RACReplaySubject *subject = [RACReplaySubject subject]; + + [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + [subject sendCompleted]; + }]]; + + objc_setAssociatedObject(self, _cmd, subject, OBJC_ASSOCIATION_RETAIN); + + return subject; +} + +- (RACCompoundDisposable *)rac_deallocDisposable { + @synchronized (self) { + RACCompoundDisposable *compoundDisposable = objc_getAssociatedObject(self, RACObjectCompoundDisposable); + if (compoundDisposable != nil) return compoundDisposable; + + swizzleDeallocIfNeeded(self.class); + + compoundDisposable = [RACCompoundDisposable compoundDisposable]; + objc_setAssociatedObject(self, RACObjectCompoundDisposable, compoundDisposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + return compoundDisposable; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h new file mode 100644 index 0000000..066e102 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.h @@ -0,0 +1,16 @@ +// +// NSObject+RACDescription.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +// A simplified description of the object, which does not invoke -description +// (and thus should be much faster in many cases). +// +// This is for debugging purposes only, and will return a constant string +// unless the RAC_DEBUG_SIGNAL_NAMES environment variable is set. +NSString *RACDescription(id object); diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.m new file mode 100644 index 0000000..1b21427 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACDescription.m @@ -0,0 +1,50 @@ +// +// NSObject+RACDescription.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSObject+RACDescription.h" +#import "RACTuple.h" + +@implementation NSValue (RACDescription) + +- (NSString *)rac_description { + return self.description; +} + +@end + +@implementation NSString (RACDescription) + +- (NSString *)rac_description { + return self.description; +} + +@end + +@implementation RACTuple (RACDescription) + +- (NSString *)rac_description { + if (getenv("RAC_DEBUG_SIGNAL_NAMES") != NULL) { + return self.allObjects.description; + } else { + return @"(description skipped)"; + } +} + +@end + +NSString *RACDescription(id object) { + if (getenv("RAC_DEBUG_SIGNAL_NAMES") != NULL) { + if ([object respondsToSelector:@selector(rac_description)]) { + return [object rac_description]; + } else { + return [[NSString alloc] initWithFormat:@"<%@: %p>", [object class], object]; + } + } else { + return @"(description skipped)"; + } +} diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h new file mode 100644 index 0000000..48e6a04 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.h @@ -0,0 +1,46 @@ +// +// NSObject+RACKVOWrapper.h +// ReactiveObjC +// +// Created by Josh Abernathy on 10/11/11. +// Copyright (c) 2011 GitHub. All rights reserved. +// + +#import + +@class RACDisposable; +@class RACKVOTrampoline; + +// A private category providing a block based interface to KVO. +@interface NSObject (RACKVOWrapper) + +// Adds the given block as the callbacks for when the key path changes. +// +// Unlike direct KVO observation, this handles deallocation of `weak` properties +// by generating an appropriate notification. This will only occur if there is +// an `@property` declaration visible in the observed class, with the `weak` +// memory management attribute. +// +// The observation does not need to be explicitly removed. It will be removed +// when the observer or the receiver deallocate. +// +// keyPath - The key path to observe. Must not be nil. +// options - The KVO observation options. +// observer - The object that requested the observation. May be nil. +// block - The block called when the value at the key path changes. It is +// passed the current value of the key path and the extended KVO +// change dictionary including RAC-specific keys and values. Must not +// be nil. +// +// Returns a disposable that can be used to stop the observation. +- (RACDisposable *)rac_observeKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer block:(void (^)(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent))block; + +@end + +typedef void (^RACKVOBlock)(id target, id observer, NSDictionary *change); + +@interface NSObject (RACUnavailableKVOWrapper) + +- (RACKVOTrampoline *)rac_addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block __attribute((unavailable("Use rac_observeKeyPath:options:observer:block: instead."))); + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.m new file mode 100644 index 0000000..dab0918 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACKVOWrapper.m @@ -0,0 +1,200 @@ +// +// NSObject+RACKVOWrapper.m +// ReactiveObjC +// +// Created by Josh Abernathy on 10/11/11. +// Copyright (c) 2011 GitHub. All rights reserved. +// + +#import "NSObject+RACKVOWrapper.h" +#import +#import +#import "NSObject+RACDeallocating.h" +#import "NSString+RACKeyPathUtilities.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACKVOTrampoline.h" +#import "RACSerialDisposable.h" + +@implementation NSObject (RACKVOWrapper) + +- (RACDisposable *)rac_observeKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)weakObserver block:(void (^)(id, NSDictionary *, BOOL, BOOL))block { + NSCParameterAssert(block != nil); + NSCParameterAssert(keyPath.rac_keyPathComponents.count > 0); + + keyPath = [keyPath copy]; + + NSObject *strongObserver = weakObserver; + + NSArray *keyPathComponents = keyPath.rac_keyPathComponents; + BOOL keyPathHasOneComponent = (keyPathComponents.count == 1); + NSString *keyPathHead = keyPathComponents[0]; + NSString *keyPathTail = keyPath.rac_keyPathByDeletingFirstKeyPathComponent; + + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + // The disposable that groups all disposal necessary to clean up the callbacks + // added to the value of the first key path component. + RACSerialDisposable *firstComponentSerialDisposable = [RACSerialDisposable serialDisposableWithDisposable:[RACCompoundDisposable compoundDisposable]]; + RACCompoundDisposable * (^firstComponentDisposable)(void) = ^{ + return (RACCompoundDisposable *)firstComponentSerialDisposable.disposable; + }; + + [disposable addDisposable:firstComponentSerialDisposable]; + + BOOL shouldAddDeallocObserver = NO; + + objc_property_t property = class_getProperty(object_getClass(self), keyPathHead.UTF8String); + if (property != NULL) { + rac_propertyAttributes *attributes = rac_copyPropertyAttributes(property); + if (attributes != NULL) { + @onExit { + free(attributes); + }; + + BOOL isObject = attributes->objectClass != nil || strstr(attributes->type, @encode(id)) == attributes->type; + BOOL isProtocol = attributes->objectClass == NSClassFromString(@"Protocol"); + BOOL isBlock = strcmp(attributes->type, @encode(void(^)())) == 0; + BOOL isWeak = attributes->weak; + + // If this property isn't actually an object (or is a Class object), + // no point in observing the deallocation of the wrapper returned by + // KVC. + // + // If this property is an object, but not declared `weak`, we + // don't need to watch for it spontaneously being set to nil. + // + // Attempting to observe non-weak properties will result in + // broken behavior for dynamic getters, so don't even try. + shouldAddDeallocObserver = isObject && isWeak && !isBlock && !isProtocol; + } + } + + // Adds the callback block to the value's deallocation. Also adds the logic to + // clean up the callback to the firstComponentDisposable. + void (^addDeallocObserverToPropertyValue)(NSObject *) = ^(NSObject *value) { + if (!shouldAddDeallocObserver) return; + + // If a key path value is the observer, commonly when a key path begins + // with "self", we prevent deallocation triggered callbacks for any such key + // path components. Thus, the observer's deallocation is not considered a + // change to the key path. + if (value == weakObserver) return; + + NSDictionary *change = @{ + NSKeyValueChangeKindKey: @(NSKeyValueChangeSetting), + NSKeyValueChangeNewKey: NSNull.null, + }; + + RACCompoundDisposable *valueDisposable = value.rac_deallocDisposable; + RACDisposable *deallocDisposable = [RACDisposable disposableWithBlock:^{ + block(nil, change, YES, keyPathHasOneComponent); + }]; + + [valueDisposable addDisposable:deallocDisposable]; + [firstComponentDisposable() addDisposable:[RACDisposable disposableWithBlock:^{ + [valueDisposable removeDisposable:deallocDisposable]; + }]]; + }; + + // Adds the callback block to the remaining path components on the value. Also + // adds the logic to clean up the callbacks to the firstComponentDisposable. + void (^addObserverToValue)(NSObject *) = ^(NSObject *value) { + RACDisposable *observerDisposable = [value rac_observeKeyPath:keyPathTail options:(options & ~NSKeyValueObservingOptionInitial) observer:weakObserver block:block]; + [firstComponentDisposable() addDisposable:observerDisposable]; + }; + + // Observe only the first key path component, when the value changes clean up + // the callbacks on the old value, add callbacks to the new value and call the + // callback block as needed. + // + // Note this does not use NSKeyValueObservingOptionInitial so this only + // handles changes to the value, callbacks to the initial value must be added + // separately. + NSKeyValueObservingOptions trampolineOptions = (options | NSKeyValueObservingOptionPrior) & ~NSKeyValueObservingOptionInitial; + RACKVOTrampoline *trampoline = [[RACKVOTrampoline alloc] initWithTarget:self observer:strongObserver keyPath:keyPathHead options:trampolineOptions block:^(id trampolineTarget, id trampolineObserver, NSDictionary *change) { + // If this is a prior notification, clean up all the callbacks added to the + // previous value and call the callback block. Everything else is deferred + // until after we get the notification after the change. + if ([change[NSKeyValueChangeNotificationIsPriorKey] boolValue]) { + [firstComponentDisposable() dispose]; + + if ((options & NSKeyValueObservingOptionPrior) != 0) { + block([trampolineTarget valueForKeyPath:keyPath], change, NO, keyPathHasOneComponent); + } + + return; + } + + // From here the notification is not prior. + NSObject *value = [trampolineTarget valueForKey:keyPathHead]; + + // If the value has changed but is nil, there is no need to add callbacks to + // it, just call the callback block. + if (value == nil) { + block(nil, change, NO, keyPathHasOneComponent); + return; + } + + // From here the notification is not prior and the value is not nil. + + // Create a new firstComponentDisposable while getting rid of the old one at + // the same time, in case this is being called concurrently. + RACDisposable *oldFirstComponentDisposable = [firstComponentSerialDisposable swapInDisposable:[RACCompoundDisposable compoundDisposable]]; + [oldFirstComponentDisposable dispose]; + + addDeallocObserverToPropertyValue(value); + + // If there are no further key path components, there is no need to add the + // other callbacks, just call the callback block with the value itself. + if (keyPathHasOneComponent) { + block(value, change, NO, keyPathHasOneComponent); + return; + } + + // The value has changed, is not nil, and there are more key path components + // to consider. Add the callbacks to the value for the remaining key path + // components and call the callback block with the current value of the full + // key path. + addObserverToValue(value); + block([value valueForKeyPath:keyPathTail], change, NO, keyPathHasOneComponent); + }]; + + // Stop the KVO observation when this one is disposed of. + [disposable addDisposable:trampoline]; + + // Add the callbacks to the initial value if needed. + NSObject *value = [self valueForKey:keyPathHead]; + if (value != nil) { + addDeallocObserverToPropertyValue(value); + + if (!keyPathHasOneComponent) { + addObserverToValue(value); + } + } + + // Call the block with the initial value if needed. + if ((options & NSKeyValueObservingOptionInitial) != 0) { + id initialValue = [self valueForKeyPath:keyPath]; + NSDictionary *initialChange = @{ + NSKeyValueChangeKindKey: @(NSKeyValueChangeSetting), + NSKeyValueChangeNewKey: initialValue ?: NSNull.null, + }; + block(initialValue, initialChange, NO, keyPathHasOneComponent); + } + + + RACCompoundDisposable *observerDisposable = strongObserver.rac_deallocDisposable; + RACCompoundDisposable *selfDisposable = self.rac_deallocDisposable; + // Dispose of this observation if the receiver or the observer deallocate. + [observerDisposable addDisposable:disposable]; + [selfDisposable addDisposable:disposable]; + + return [RACDisposable disposableWithBlock:^{ + [disposable dispose]; + [observerDisposable removeDisposable:disposable]; + [selfDisposable removeDisposable:disposable]; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h new file mode 100644 index 0000000..3c79260 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.h @@ -0,0 +1,51 @@ +// +// NSObject+RACLifting.h +// ReactiveObjC +// +// Created by Josh Abernathy on 10/13/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; +@class RACTuple; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (RACLifting) + +/// Lifts the selector on the receiver into the reactive world. The selector will +/// be invoked whenever any signal argument sends a value, but only after each +/// signal has sent an initial value. +/// +/// It will replay the most recently sent value to new subscribers. +/// +/// This does not support C arrays or unions. +/// +/// selector - The selector on self to invoke. +/// firstSignal - The signal corresponding to the first method argument. This +/// must not be nil. +/// ... - A list of RACSignals corresponding to the remaining arguments. +/// There must be a non-nil signal for each method argument. +/// +/// Examples +/// +/// [button rac_liftSelector:@selector(setTitleColor:forState:) withSignals:textColorSignal, [RACSignal return:@(UIControlStateNormal)], nil]; +/// +/// Returns a signal which sends the return value from each invocation of the +/// selector. If the selector returns void, it instead sends RACUnit.defaultUnit. +/// It completes only after all the signal arguments complete. +- (RACSignal *)rac_liftSelector:(SEL)selector withSignals:(RACSignal *)firstSignal, ... NS_REQUIRES_NIL_TERMINATION; + +/// Like -rac_liftSelector:withSignals:, but accepts an array instead of +/// a variadic list of arguments. +- (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals; + +/// Like -rac_liftSelector:withSignals:, but accepts a signal sending tuples of +/// arguments instead of a variadic list of arguments. +- (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.m new file mode 100644 index 0000000..8342e1a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACLifting.m @@ -0,0 +1,78 @@ +// +// NSObject+RACLifting.m +// ReactiveObjC +// +// Created by Josh Abernathy on 10/13/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "NSObject+RACLifting.h" +#import +#import "NSInvocation+RACTypeParsing.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "RACSignal+Operations.h" +#import "RACTuple.h" + +@implementation NSObject (RACLifting) + +- (RACSignal *)rac_liftSelector:(SEL)selector withSignalOfArguments:(RACSignal *)arguments { + NSCParameterAssert(selector != NULL); + NSCParameterAssert(arguments != nil); + + @unsafeify(self); + + NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector]; + NSCAssert(methodSignature != nil, @"%@ does not respond to %@", self, NSStringFromSelector(selector)); + + return [[[[arguments + takeUntil:self.rac_willDeallocSignal] + map:^(RACTuple *arguments) { + @strongify(self); + + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; + invocation.selector = selector; + invocation.rac_argumentsTuple = arguments; + [invocation invokeWithTarget:self]; + + return invocation.rac_returnValue; + }] + replayLast] + setNameWithFormat:@"%@ -rac_liftSelector: %s withSignalsOfArguments: %@", RACDescription(self), sel_getName(selector), arguments]; +} + +- (RACSignal *)rac_liftSelector:(SEL)selector withSignalsFromArray:(NSArray *)signals { + NSCParameterAssert(signals != nil); + NSCParameterAssert(signals.count > 0); + + NSMethodSignature *methodSignature = [self methodSignatureForSelector:selector]; + NSCAssert(methodSignature != nil, @"%@ does not respond to %@", self, NSStringFromSelector(selector)); + + NSUInteger numberOfArguments __attribute__((unused)) = methodSignature.numberOfArguments - 2; + NSCAssert(numberOfArguments == signals.count, @"Wrong number of signals for %@ (expected %lu, got %lu)", NSStringFromSelector(selector), (unsigned long)numberOfArguments, (unsigned long)signals.count); + + return [[self + rac_liftSelector:selector withSignalOfArguments:[RACSignal combineLatest:signals]] + setNameWithFormat:@"%@ -rac_liftSelector: %s withSignalsFromArray: %@", RACDescription(self), sel_getName(selector), signals]; +} + +- (RACSignal *)rac_liftSelector:(SEL)selector withSignals:(RACSignal *)firstSignal, ... { + NSCParameterAssert(firstSignal != nil); + + NSMutableArray *signals = [NSMutableArray array]; + + va_list args; + va_start(args, firstSignal); + for (id currentSignal = firstSignal; currentSignal != nil; currentSignal = va_arg(args, id)) { + NSCAssert([currentSignal isKindOfClass:RACSignal.class], @"Argument %@ is not a RACSignal", currentSignal); + + [signals addObject:currentSignal]; + } + va_end(args); + + return [[self + rac_liftSelector:selector withSignalsFromArray:signals] + setNameWithFormat:@"%@ -rac_liftSelector: %s withSignals: %@", RACDescription(self), sel_getName(selector), signals]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h new file mode 100644 index 0000000..e976061 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.h @@ -0,0 +1,120 @@ +// +// NSObject+RACPropertySubscribing.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/2/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import +#import "RACmetamacros.h" + +/// Creates a signal which observes `KEYPATH` on `TARGET` for changes. +/// +/// In either case, the observation continues until `TARGET` _or self_ is +/// deallocated. If any intermediate object is deallocated instead, it will be +/// assumed to have been set to nil. +/// +/// Make sure to `@strongify(self)` when using this macro within a block! The +/// macro will _always_ reference `self`, which can silently introduce a retain +/// cycle within a block. As a result, you should make sure that `self` is a weak +/// reference (e.g., created by `@weakify` and `@strongify`) before the +/// expression that uses `RACObserve`. +/// +/// Examples +/// +/// // Observes self, and doesn't stop until self is deallocated. +/// RACSignal *selfSignal = RACObserve(self, arrayController.items); +/// +/// // Observes the array controller, and stops when self _or_ the array +/// // controller is deallocated. +/// RACSignal *arrayControllerSignal = RACObserve(self.arrayController, items); +/// +/// // Observes obj.arrayController, and stops when self _or_ the array +/// // controller is deallocated. +/// RACSignal *signal2 = RACObserve(obj.arrayController, items); +/// +/// @weakify(self); +/// RACSignal *signal3 = [anotherSignal flattenMap:^(NSArrayController *arrayController) { +/// // Avoids a retain cycle because of RACObserve implicitly referencing +/// // self. +/// @strongify(self); +/// return RACObserve(arrayController, items); +/// }]; +/// +/// Returns a signal which sends the current value of the key path on +/// subscription, then sends the new value every time it changes, and sends +/// completed if self or observer is deallocated. +#define _RACObserve(TARGET, KEYPATH) \ +({ \ + __weak id target_ = (TARGET); \ + [target_ rac_valuesForKeyPath:@keypath(TARGET, KEYPATH) observer:self]; \ +}) + +#if __clang__ && (__clang_major__ >= 8) +#define RACObserve(TARGET, KEYPATH) _RACObserve(TARGET, KEYPATH) +#else +#define RACObserve(TARGET, KEYPATH) \ +({ \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wreceiver-is-weak\"") \ + _RACObserve(TARGET, KEYPATH) \ + _Pragma("clang diagnostic pop") \ +}) +#endif + +@class RACDisposable; +@class RACTwoTuple<__covariant First, __covariant Second>; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSObject (RACPropertySubscribing) + +/// Creates a signal to observe the value at the given key path. +/// +/// The initial value is sent on subscription, the subsequent values are sent +/// from whichever thread the change occured on, even if it doesn't have a valid +/// scheduler. +/// +/// Returns a signal that immediately sends the receiver's current value at the +/// given keypath, then any changes thereafter. +#if OS_OBJECT_HAVE_OBJC_SUPPORT +- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer; +#else +// Swift builds with OS_OBJECT_HAVE_OBJC_SUPPORT=0 for Playgrounds and LLDB :( +- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(NSObject *)observer; +#endif + +/// Creates a signal to observe the changes of the given key path. +/// +/// The initial value is sent on subscription if `NSKeyValueObservingOptionInitial` is set. +/// The subsequent values are sent from whichever thread the change occured on, +/// even if it doesn't have a valid scheduler. +/// +/// Returns a signal that sends tuples containing the current value at the key +/// path and the change dictionary for each KVO callback. +#if OS_OBJECT_HAVE_OBJC_SUPPORT +- (RACSignal *> *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)observer; +#else +- (RACSignal *> *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(NSObject *)observer; +#endif + +@end + +NS_ASSUME_NONNULL_END + +#define RACAble(...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ + (_RACAbleObject(self, __VA_ARGS__)) \ + (_RACAbleObject(__VA_ARGS__)) + +#define _RACAbleObject(object, property) [object rac_signalForKeyPath:@keypath(object, property) observer:self] + +#define RACAbleWithStart(...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ + (_RACAbleWithStartObject(self, __VA_ARGS__)) \ + (_RACAbleWithStartObject(__VA_ARGS__)) + +#define _RACAbleWithStartObject(object, property) [object rac_signalWithStartingValueForKeyPath:@keypath(object, property) observer:self] diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.m new file mode 100644 index 0000000..4ec208f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACPropertySubscribing.m @@ -0,0 +1,84 @@ +// +// NSObject+RACPropertySubscribing.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/2/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "NSObject+RACPropertySubscribing.h" +#import +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACKVOWrapper.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACKVOTrampoline.h" +#import "RACSubscriber.h" +#import "RACSignal+Operations.h" +#import "RACTuple.h" +#import + +@implementation NSObject (RACPropertySubscribing) + +- (RACSignal *)rac_valuesForKeyPath:(NSString *)keyPath observer:(__weak NSObject *)observer { + return [[[self + rac_valuesAndChangesForKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:observer] + map:^(RACTuple *value) { + // -map: because it doesn't require the block trampoline that -reduceEach: uses + return value[0]; + }] + setNameWithFormat:@"RACObserve(%@, %@)", RACDescription(self), keyPath]; +} + +- (RACSignal *)rac_valuesAndChangesForKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options observer:(__weak NSObject *)weakObserver { + NSObject *strongObserver = weakObserver; + keyPath = [keyPath copy]; + + NSRecursiveLock *objectLock = [[NSRecursiveLock alloc] init]; + objectLock.name = @"org.reactivecocoa.ReactiveObjC.NSObjectRACPropertySubscribing"; + + __weak NSObject *weakSelf = self; + + RACSignal *deallocSignal = [[RACSignal + zip:@[ + self.rac_willDeallocSignal, + strongObserver.rac_willDeallocSignal ?: [RACSignal never] + ]] + doCompleted:^{ + // Forces deallocation to wait if the object variables are currently + // being read on another thread. + [objectLock lock]; + @onExit { + [objectLock unlock]; + }; + }]; + + return [[[RACSignal + createSignal:^ RACDisposable * (id subscriber) { + // Hold onto the lock the whole time we're setting up the KVO + // observation, because any resurrection that might be caused by our + // retaining below must be balanced out by the time -dealloc returns + // (if another thread is waiting on the lock above). + [objectLock lock]; + @onExit { + [objectLock unlock]; + }; + + __strong NSObject *observer __attribute__((objc_precise_lifetime)) = weakObserver; + __strong NSObject *self __attribute__((objc_precise_lifetime)) = weakSelf; + + if (self == nil) { + [subscriber sendCompleted]; + return nil; + } + + return [self rac_observeKeyPath:keyPath options:options observer:observer block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { + [subscriber sendNext:RACTuplePack(value, change)]; + }]; + }] + takeUntil:deallocSignal] + setNameWithFormat:@"%@ -rac_valueAndChangesForKeyPath: %@ options: %lu observer: %@", RACDescription(self), keyPath, (unsigned long)options, RACDescription(strongObserver)]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h new file mode 100644 index 0000000..bb3672e --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.h @@ -0,0 +1,84 @@ +// +// NSObject+RACSelectorSignal.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/18/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACTuple; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +/// The domain for any errors originating from -rac_signalForSelector:. +extern NSString * const RACSelectorSignalErrorDomain; + +/// -rac_signalForSelector: was going to add a new method implementation for +/// `selector`, but another thread added an implementation before it was able to. +/// +/// This will _not_ occur for cases where a method implementation exists before +/// -rac_signalForSelector: is invoked. +extern const NSInteger RACSelectorSignalErrorMethodSwizzlingRace; + +@interface NSObject (RACSelectorSignal) + +/// Creates a signal associated with the receiver, which will send a tuple of the +/// method's arguments each time the given selector is invoked. +/// +/// If the selector is already implemented on the receiver, the existing +/// implementation will be invoked _before_ the signal fires. +/// +/// If the selector is not yet implemented on the receiver, the injected +/// implementation will have a `void` return type and accept only object +/// arguments. Invoking the added implementation with non-object values, or +/// expecting a return value, will result in undefined behavior. +/// +/// This is useful for changing an event or delegate callback into a signal. For +/// example, on an NSView: +/// +/// [[view rac_signalForSelector:@selector(mouseDown:)] subscribeNext:^(RACTuple *args) { +/// NSEvent *event = args.first; +/// NSLog(@"mouse button pressed: %@", event); +/// }]; +/// +/// selector - The selector for whose invocations are to be observed. If it +/// doesn't exist, it will be implemented to accept object arguments +/// and return void. This cannot have C arrays or unions as arguments +/// or C arrays, unions, structs, complex or vector types as return +/// type. +/// +/// Returns a signal which will send a tuple of arguments upon each invocation of +/// the selector, then completes when the receiver is deallocated. `next` events +/// will be sent synchronously from the thread that invoked the method. If +/// a runtime call fails, the signal will send an error in the +/// RACSelectorSignalErrorDomain. +- (RACSignal *)rac_signalForSelector:(SEL)selector; + +/// Behaves like -rac_signalForSelector:, but if the selector is not yet +/// implemented on the receiver, its method signature is looked up within +/// `protocol`, and may accept non-object arguments. +/// +/// If the selector is not yet implemented and has a return value, the injected +/// method will return all zero bits (equal to `nil`, `NULL`, 0, 0.0f, etc.). +/// +/// selector - The selector for whose invocations are to be observed. If it +/// doesn't exist, it will be implemented using information from +/// `protocol`, and may accept non-object arguments and return +/// a value. This cannot have C arrays or unions as arguments or +/// return type. +/// protocol - The protocol in which `selector` is declared. This will be used +/// for type information if the selector is not already implemented on +/// the receiver. This must not be `NULL`, and `selector` must exist +/// in this protocol. +/// +/// Returns a signal which will send a tuple of arguments on each invocation of +/// the selector, or an error in RACSelectorSignalErrorDomain if a runtime +/// call fails. +- (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.m b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.m new file mode 100644 index 0000000..b835e74 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSObject+RACSelectorSignal.m @@ -0,0 +1,329 @@ +// +// NSObject+RACSelectorSignal.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/18/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSObject+RACSelectorSignal.h" +#import +#import "NSInvocation+RACTypeParsing.h" +#import "NSObject+RACDeallocating.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSubject.h" +#import "RACTuple.h" +#import "NSObject+RACDescription.h" +#import +#import + +NSString * const RACSelectorSignalErrorDomain = @"RACSelectorSignalErrorDomain"; +const NSInteger RACSelectorSignalErrorMethodSwizzlingRace = 1; + +static NSString * const RACSignalForSelectorAliasPrefix = @"rac_alias_"; +static NSString * const RACSubclassSuffix = @"_RACSelectorSignal"; +static void *RACSubclassAssociationKey = &RACSubclassAssociationKey; + +static NSMutableSet *swizzledClasses() { + static NSMutableSet *set; + static dispatch_once_t pred; + + dispatch_once(&pred, ^{ + set = [[NSMutableSet alloc] init]; + }); + + return set; +} + +@implementation NSObject (RACSelectorSignal) + +static BOOL RACForwardInvocation(id self, NSInvocation *invocation) { + SEL aliasSelector = RACAliasForSelector(invocation.selector); + RACSubject *subject = objc_getAssociatedObject(self, aliasSelector); + + Class class = object_getClass(invocation.target); + BOOL respondsToAlias = [class instancesRespondToSelector:aliasSelector]; + if (respondsToAlias) { + invocation.selector = aliasSelector; + [invocation invoke]; + } + + if (subject == nil) return respondsToAlias; + + [subject sendNext:invocation.rac_argumentsTuple]; + return YES; +} + +static void RACSwizzleForwardInvocation(Class class) { + SEL forwardInvocationSEL = @selector(forwardInvocation:); + Method forwardInvocationMethod = class_getInstanceMethod(class, forwardInvocationSEL); + + // Preserve any existing implementation of -forwardInvocation:. + void (*originalForwardInvocation)(id, SEL, NSInvocation *) = NULL; + if (forwardInvocationMethod != NULL) { + originalForwardInvocation = (__typeof__(originalForwardInvocation))method_getImplementation(forwardInvocationMethod); + } + + // Set up a new version of -forwardInvocation:. + // + // If the selector has been passed to -rac_signalForSelector:, invoke + // the aliased method, and forward the arguments to any attached signals. + // + // If the selector has not been passed to -rac_signalForSelector:, + // invoke any existing implementation of -forwardInvocation:. If there + // was no existing implementation, throw an unrecognized selector + // exception. + id newForwardInvocation = ^(id self, NSInvocation *invocation) { + BOOL matched = RACForwardInvocation(self, invocation); + if (matched) return; + + if (originalForwardInvocation == NULL) { + [self doesNotRecognizeSelector:invocation.selector]; + } else { + originalForwardInvocation(self, forwardInvocationSEL, invocation); + } + }; + + class_replaceMethod(class, forwardInvocationSEL, imp_implementationWithBlock(newForwardInvocation), "v@:@"); +} + +static void RACSwizzleRespondsToSelector(Class class) { + SEL respondsToSelectorSEL = @selector(respondsToSelector:); + + // Preserve existing implementation of -respondsToSelector:. + Method respondsToSelectorMethod = class_getInstanceMethod(class, respondsToSelectorSEL); + BOOL (*originalRespondsToSelector)(id, SEL, SEL) = (__typeof__(originalRespondsToSelector))method_getImplementation(respondsToSelectorMethod); + + // Set up a new version of -respondsToSelector: that returns YES for methods + // added by -rac_signalForSelector:. + // + // If the selector has a method defined on the receiver's actual class, and + // if that method's implementation is _objc_msgForward, then returns whether + // the instance has a signal for the selector. + // Otherwise, call the original -respondsToSelector:. + id newRespondsToSelector = ^ BOOL (id self, SEL selector) { + Method method = rac_getImmediateInstanceMethod(class, selector); + + if (method != NULL && method_getImplementation(method) == _objc_msgForward) { + SEL aliasSelector = RACAliasForSelector(selector); + if (objc_getAssociatedObject(self, aliasSelector) != nil) return YES; + } + + return originalRespondsToSelector(self, respondsToSelectorSEL, selector); + }; + + class_replaceMethod(class, respondsToSelectorSEL, imp_implementationWithBlock(newRespondsToSelector), method_getTypeEncoding(respondsToSelectorMethod)); +} + +static void RACSwizzleGetClass(Class class, Class statedClass) { + SEL selector = @selector(class); + Method method = class_getInstanceMethod(class, selector); + IMP newIMP = imp_implementationWithBlock(^(id self) { + return statedClass; + }); + class_replaceMethod(class, selector, newIMP, method_getTypeEncoding(method)); +} + +static void RACSwizzleMethodSignatureForSelector(Class class) { + IMP newIMP = imp_implementationWithBlock(^(id self, SEL selector) { + // Don't send the -class message to the receiver because we've changed + // that to return the original class. + Class actualClass = object_getClass(self); + Method method = class_getInstanceMethod(actualClass, selector); + if (method == NULL) { + // Messages that the original class dynamically implements fall + // here. + // + // Call the original class' -methodSignatureForSelector:. + struct objc_super target = { + .super_class = class_getSuperclass(class), + .receiver = self, + }; + NSMethodSignature * (*messageSend)(struct objc_super *, SEL, SEL) = (__typeof__(messageSend))objc_msgSendSuper; + return messageSend(&target, @selector(methodSignatureForSelector:), selector); + } + + char const *encoding = method_getTypeEncoding(method); + return [NSMethodSignature signatureWithObjCTypes:encoding]; + }); + + SEL selector = @selector(methodSignatureForSelector:); + Method methodSignatureForSelectorMethod = class_getInstanceMethod(class, selector); + class_replaceMethod(class, selector, newIMP, method_getTypeEncoding(methodSignatureForSelectorMethod)); +} + +// It's hard to tell which struct return types use _objc_msgForward, and +// which use _objc_msgForward_stret instead, so just exclude all struct, array, +// union, complex and vector return types. +static void RACCheckTypeEncoding(const char *typeEncoding) { +#if !NS_BLOCK_ASSERTIONS + // Some types, including vector types, are not encoded. In these cases the + // signature starts with the size of the argument frame. + NSCAssert(*typeEncoding < '1' || *typeEncoding > '9', @"unknown method return type not supported in type encoding: %s", typeEncoding); + NSCAssert(strstr(typeEncoding, "(") != typeEncoding, @"union method return type not supported"); + NSCAssert(strstr(typeEncoding, "{") != typeEncoding, @"struct method return type not supported"); + NSCAssert(strstr(typeEncoding, "[") != typeEncoding, @"array method return type not supported"); + NSCAssert(strstr(typeEncoding, @encode(_Complex float)) != typeEncoding, @"complex float method return type not supported"); + NSCAssert(strstr(typeEncoding, @encode(_Complex double)) != typeEncoding, @"complex double method return type not supported"); + NSCAssert(strstr(typeEncoding, @encode(_Complex long double)) != typeEncoding, @"complex long double method return type not supported"); + +#endif // !NS_BLOCK_ASSERTIONS +} + +static RACSignal *NSObjectRACSignalForSelector(NSObject *self, SEL selector, Protocol *protocol) { + SEL aliasSelector = RACAliasForSelector(selector); + + @synchronized (self) { + RACSubject *subject = objc_getAssociatedObject(self, aliasSelector); + if (subject != nil) return subject; + + Class class = RACSwizzleClass(self); + NSCAssert(class != nil, @"Could not swizzle class of %@", self); + + subject = [[RACSubject subject] setNameWithFormat:@"%@ -rac_signalForSelector: %s", RACDescription(self), sel_getName(selector)]; + objc_setAssociatedObject(self, aliasSelector, subject, OBJC_ASSOCIATION_RETAIN); + + [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + [subject sendCompleted]; + }]]; + + Method targetMethod = class_getInstanceMethod(class, selector); + if (targetMethod == NULL) { + const char *typeEncoding; + if (protocol == NULL) { + typeEncoding = RACSignatureForUndefinedSelector(selector); + } else { + // Look for the selector as an optional instance method. + struct objc_method_description methodDescription = protocol_getMethodDescription(protocol, selector, NO, YES); + + if (methodDescription.name == NULL) { + // Then fall back to looking for a required instance + // method. + methodDescription = protocol_getMethodDescription(protocol, selector, YES, YES); + NSCAssert(methodDescription.name != NULL, @"Selector %@ does not exist in <%s>", NSStringFromSelector(selector), protocol_getName(protocol)); + } + + typeEncoding = methodDescription.types; + } + + RACCheckTypeEncoding(typeEncoding); + + // Define the selector to call -forwardInvocation:. + if (!class_addMethod(class, selector, _objc_msgForward, typeEncoding)) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: [NSString stringWithFormat:NSLocalizedString(@"A race condition occurred implementing %@ on class %@", nil), NSStringFromSelector(selector), class], + NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Invoke -rac_signalForSelector: again to override the implementation.", nil) + }; + + return [RACSignal error:[NSError errorWithDomain:RACSelectorSignalErrorDomain code:RACSelectorSignalErrorMethodSwizzlingRace userInfo:userInfo]]; + } + } else if (method_getImplementation(targetMethod) != _objc_msgForward) { + // Make a method alias for the existing method implementation. + const char *typeEncoding = method_getTypeEncoding(targetMethod); + + RACCheckTypeEncoding(typeEncoding); + + BOOL addedAlias __attribute__((unused)) = class_addMethod(class, aliasSelector, method_getImplementation(targetMethod), typeEncoding); + NSCAssert(addedAlias, @"Original implementation for %@ is already copied to %@ on %@", NSStringFromSelector(selector), NSStringFromSelector(aliasSelector), class); + + // Redefine the selector to call -forwardInvocation:. + class_replaceMethod(class, selector, _objc_msgForward, method_getTypeEncoding(targetMethod)); + } + + return subject; + } +} + +static SEL RACAliasForSelector(SEL originalSelector) { + NSString *selectorName = NSStringFromSelector(originalSelector); + return NSSelectorFromString([RACSignalForSelectorAliasPrefix stringByAppendingString:selectorName]); +} + +static const char *RACSignatureForUndefinedSelector(SEL selector) { + const char *name = sel_getName(selector); + NSMutableString *signature = [NSMutableString stringWithString:@"v@:"]; + + while ((name = strchr(name, ':')) != NULL) { + [signature appendString:@"@"]; + name++; + } + + return signature.UTF8String; +} + +static Class RACSwizzleClass(NSObject *self) { + Class statedClass = self.class; + Class baseClass = object_getClass(self); + + // The "known dynamic subclass" is the subclass generated by RAC. + // It's stored as an associated object on every instance that's already + // been swizzled, so that even if something else swizzles the class of + // this instance, we can still access the RAC generated subclass. + Class knownDynamicSubclass = objc_getAssociatedObject(self, RACSubclassAssociationKey); + if (knownDynamicSubclass != Nil) return knownDynamicSubclass; + + NSString *className = NSStringFromClass(baseClass); + + if (statedClass != baseClass) { + // If the class is already lying about what it is, it's probably a KVO + // dynamic subclass or something else that we shouldn't subclass + // ourselves. + // + // Just swizzle -forwardInvocation: in-place. Since the object's class + // was almost certainly dynamically changed, we shouldn't see another of + // these classes in the hierarchy. + // + // Additionally, swizzle -respondsToSelector: because the default + // implementation may be ignorant of methods added to this class. + @synchronized (swizzledClasses()) { + if (![swizzledClasses() containsObject:className]) { + RACSwizzleForwardInvocation(baseClass); + RACSwizzleRespondsToSelector(baseClass); + RACSwizzleGetClass(baseClass, statedClass); + RACSwizzleGetClass(object_getClass(baseClass), statedClass); + RACSwizzleMethodSignatureForSelector(baseClass); + [swizzledClasses() addObject:className]; + } + } + + return baseClass; + } + + const char *subclassName = [className stringByAppendingString:RACSubclassSuffix].UTF8String; + Class subclass = objc_getClass(subclassName); + + if (subclass == nil) { + subclass = objc_allocateClassPair(baseClass, subclassName, 0); + if (subclass == nil) return nil; + + RACSwizzleForwardInvocation(subclass); + RACSwizzleRespondsToSelector(subclass); + + RACSwizzleGetClass(subclass, statedClass); + RACSwizzleGetClass(object_getClass(subclass), statedClass); + + RACSwizzleMethodSignatureForSelector(subclass); + + objc_registerClassPair(subclass); + } + + object_setClass(self, subclass); + objc_setAssociatedObject(self, RACSubclassAssociationKey, subclass, OBJC_ASSOCIATION_ASSIGN); + return subclass; +} + +- (RACSignal *)rac_signalForSelector:(SEL)selector { + NSCParameterAssert(selector != NULL); + + return NSObjectRACSignalForSelector(self, selector, NULL); +} + +- (RACSignal *)rac_signalForSelector:(SEL)selector fromProtocol:(Protocol *)protocol { + NSCParameterAssert(selector != NULL); + NSCParameterAssert(protocol != NULL); + + return NSObjectRACSignalForSelector(self, selector, protocol); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h new file mode 100644 index 0000000..8032f27 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.h @@ -0,0 +1,24 @@ +// +// NSOrderedSet+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSOrderedSet<__covariant ObjectType> (RACSequenceAdditions) + +/// Creates and returns a sequence corresponding to the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.m new file mode 100644 index 0000000..31792d4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSOrderedSet+RACSequenceAdditions.m @@ -0,0 +1,19 @@ +// +// NSOrderedSet+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSOrderedSet+RACSequenceAdditions.h" +#import "NSArray+RACSequenceAdditions.h" + +@implementation NSOrderedSet (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + // TODO: First class support for ordered set sequences. + return self.array.rac_sequence; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h new file mode 100644 index 0000000..658f08b --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.h @@ -0,0 +1,24 @@ +// +// NSSet+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSSet<__covariant ObjectType> (RACSequenceAdditions) + +/// Creates and returns a sequence corresponding to the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.m new file mode 100644 index 0000000..8c7355f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSSet+RACSequenceAdditions.m @@ -0,0 +1,19 @@ +// +// NSSet+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSSet+RACSequenceAdditions.h" +#import "NSArray+RACSequenceAdditions.h" + +@implementation NSSet (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + // TODO: First class support for set sequences. + return self.allObjects.rac_sequence; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h new file mode 100644 index 0000000..d937704 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.h @@ -0,0 +1,34 @@ +// +// NSString+RACKeyPathUtilities.h +// ReactiveObjC +// +// Created by Uri Baghin on 05/05/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +// A private category of methods to extract parts of a key path. +@interface NSString (RACKeyPathUtilities) + +// Returns an array of the components of the receiver. +// +// Calling this method on a string that isn't a key path is considered undefined +// behavior. +- (NSArray *)rac_keyPathComponents; + +// Returns a key path with all the components of the receiver except for the +// last one. +// +// Calling this method on a string that isn't a key path is considered undefined +// behavior. +- (NSString *)rac_keyPathByDeletingLastKeyPathComponent; + +// Returns a key path with all the components of the receiver expect for the +// first one. +// +// Calling this method on a string that isn't a key path is considered undefined +// behavior. +- (NSString *)rac_keyPathByDeletingFirstKeyPathComponent; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.m b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.m new file mode 100644 index 0000000..d62c052 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACKeyPathUtilities.m @@ -0,0 +1,36 @@ +// +// NSString+RACKeyPathUtilities.m +// ReactiveObjC +// +// Created by Uri Baghin on 05/05/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSString+RACKeyPathUtilities.h" + +@implementation NSString (RACKeyPathUtilities) + +- (NSArray *)rac_keyPathComponents { + if (self.length == 0) { + return nil; + } + return [self componentsSeparatedByString:@"."]; +} + +- (NSString *)rac_keyPathByDeletingLastKeyPathComponent { + NSUInteger lastDotIndex = [self rangeOfString:@"." options:NSBackwardsSearch].location; + if (lastDotIndex == NSNotFound) { + return nil; + } + return [self substringToIndex:lastDotIndex]; +} + +- (NSString *)rac_keyPathByDeletingFirstKeyPathComponent { + NSUInteger firstDotIndex = [self rangeOfString:@"."].location; + if (firstDotIndex == NSNotFound) { + return nil; + } + return [self substringFromIndex:firstDotIndex + 1]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h new file mode 100644 index 0000000..f708469 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.h @@ -0,0 +1,25 @@ +// +// NSString+RACSequenceAdditions.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import + +@class RACSequence<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (RACSequenceAdditions) + +/// Creates and returns a sequence containing strings corresponding to each +/// composed character sequence in the receiver. +/// +/// Mutating the receiver will not affect the sequence after it's been created. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.m b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.m new file mode 100644 index 0000000..cbcc31b --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSequenceAdditions.m @@ -0,0 +1,18 @@ +// +// NSString+RACSequenceAdditions.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "NSString+RACSequenceAdditions.h" +#import "RACStringSequence.h" + +@implementation NSString (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + return [RACStringSequence sequenceWithString:self offset:0]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.h new file mode 100644 index 0000000..e08960d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.h @@ -0,0 +1,26 @@ +// +// NSString+RACSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 5/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACScheduler; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSString (RACSupport) + +// Reads in the contents of the file using +[NSString stringWithContentsOfURL:usedEncoding:error:]. +// Note that encoding won't be valid until the signal completes successfully. +// +// scheduler - cannot be nil. ++ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL usedEncoding:(NSStringEncoding *)encoding scheduler:(RACScheduler *)scheduler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.m new file mode 100644 index 0000000..033bb56 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSString+RACSupport.m @@ -0,0 +1,37 @@ +// +// NSString+RACSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 5/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "NSString+RACSupport.h" +#import "RACReplaySubject.h" +#import "RACScheduler.h" + +@implementation NSString (RACSupport) + ++ (RACSignal *)rac_readContentsOfURL:(NSURL *)URL usedEncoding:(NSStringEncoding *)encoding scheduler:(RACScheduler *)scheduler { + NSCParameterAssert(URL != nil); + NSCParameterAssert(encoding != nil); + NSCParameterAssert(scheduler != nil); + + RACReplaySubject *subject = [RACReplaySubject subject]; + [subject setNameWithFormat:@"+rac_readContentsOfURL: %@ usedEncoding:scheduler: %@", URL, scheduler]; + + [scheduler schedule:^{ + NSError *error = nil; + NSString *string = [NSString stringWithContentsOfURL:URL usedEncoding:encoding error:&error]; + if (string == nil) { + [subject sendError:error]; + } else { + [subject sendNext:string]; + [subject sendCompleted]; + } + }]; + + return subject; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h new file mode 100644 index 0000000..c1c5731 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.h @@ -0,0 +1,30 @@ +// +// NSURLConnection+RACSupport.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACTwoTuple<__covariant First, __covariant Second>; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSURLConnection (RACSupport) + +/// Lazily loads data for the given request in the background. +/// +/// request - The URL request to load. This must not be nil. +/// +/// Returns a signal which will begin loading the request upon each subscription, +/// then send a tuple of the received response and downloaded data, and complete +/// on a background thread. If any errors occur, the returned signal will error +/// out. ++ (RACSignal *> *)rac_sendAsynchronousRequest:(NSURLRequest *)request; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.m new file mode 100644 index 0000000..7acd322 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSURLConnection+RACSupport.m @@ -0,0 +1,54 @@ +// +// NSURLConnection+RACSupport.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSURLConnection+RACSupport.h" +#import "RACDisposable.h" +#import "RACSignal.h" +#import "RACSubscriber.h" +#import "RACTuple.h" + +@implementation NSURLConnection (RACSupport) + ++ (RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest *)request { + NSCParameterAssert(request != nil); + + return [[RACSignal + createSignal:^(id subscriber) { + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; + queue.name = @"org.reactivecocoa.ReactiveObjC.NSURLConnectionRACSupport"; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { + // The docs say that `nil` data means an error occurred, but + // `nil` responses can also occur in practice (circumstances + // unknown). Consider either to be an error. + // + // Note that _empty_ data is not necessarily erroneous, as there + // may be headers but no HTTP body. + if (response == nil || data == nil) { + [subscriber sendError:error]; + } else { + [subscriber sendNext:RACTuplePack(response, data)]; + [subscriber sendCompleted]; + } + }]; +#pragma clang diagnostic pop + + return [RACDisposable disposableWithBlock:^{ + // It's not clear if this will actually cancel the connection, + // but we can at least prevent _some_ unnecessary work -- + // without writing all the code for a proper delegate, which + // doesn't really belong in RAC. + queue.suspended = YES; + [queue cancelAllOperations]; + }]; + }] + setNameWithFormat:@"+rac_sendAsynchronousRequest: %@", request]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h b/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h new file mode 100644 index 0000000..bfc1605 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.h @@ -0,0 +1,31 @@ +// +// NSUserDefaults+RACSupport.h +// ReactiveObjC +// +// Created by Matt Diephouse on 12/19/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface NSUserDefaults (RACSupport) + +/// Creates and returns a terminal for binding the user defaults key. +/// +/// **Note:** The value in the user defaults is *asynchronously* updated with +/// values sent to the channel. +/// +/// key - The user defaults key to create the channel terminal for. +/// +/// Returns a channel terminal that sends the value of the user defaults key +/// upon subscription, sends an updated value whenever the default changes, and +/// updates the default asynchronously with values it receives. +- (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.m b/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.m new file mode 100644 index 0000000..6036595 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/NSUserDefaults+RACSupport.m @@ -0,0 +1,58 @@ +// +// NSUserDefaults+RACSupport.m +// ReactiveObjC +// +// Created by Matt Diephouse on 12/19/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "NSUserDefaults+RACSupport.h" +#import +#import "NSNotificationCenter+RACSupport.h" +#import "NSObject+RACDeallocating.h" +#import "RACChannel.h" +#import "RACScheduler.h" +#import "RACSignal+Operations.h" + +@implementation NSUserDefaults (RACSupport) + +- (RACChannelTerminal *)rac_channelTerminalForKey:(NSString *)key { + NSParameterAssert(key != nil); + + RACChannel *channel = [RACChannel new]; + + RACScheduler *scheduler = [RACScheduler scheduler]; + __block BOOL ignoreNextValue = NO; + + @weakify(self); + [[[[[[[NSNotificationCenter.defaultCenter + rac_addObserverForName:NSUserDefaultsDidChangeNotification object:self] + map:^(id _) { + @strongify(self); + return [self objectForKey:key]; + }] + startWith:[self objectForKey:key]] + // Don't send values that were set on the other side of the terminal. + filter:^ BOOL (id _) { + if (RACScheduler.currentScheduler == scheduler && ignoreNextValue) { + ignoreNextValue = NO; + return NO; + } + return YES; + }] + distinctUntilChanged] + takeUntil:self.rac_willDeallocSignal] + subscribe:channel.leadingTerminal]; + + [[channel.leadingTerminal + deliverOn:scheduler] + subscribeNext:^(id value) { + @strongify(self); + ignoreNextValue = YES; + [self setObject:value forKey:key]; + }]; + + return channel.followingTerminal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACAnnotations.h b/Pods/ReactiveObjC/ReactiveObjC/RACAnnotations.h new file mode 100644 index 0000000..ed58ef9 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACAnnotations.h @@ -0,0 +1,11 @@ +// +// RACAnnotations.h +// ReactiveObjC +// +// Created by Eric Horacek on 3/31/17. +// Copyright © 2017 GitHub. All rights reserved. +// + +#ifndef RAC_WARN_UNUSED_RESULT +#define RAC_WARN_UNUSED_RESULT __attribute__((warn_unused_result)) +#endif diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.h new file mode 100644 index 0000000..9bf049d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.h @@ -0,0 +1,18 @@ +// +// RACArraySequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACSequence.h" + +// Private class that adapts an array to the RACSequence interface. +@interface RACArraySequence : RACSequence + +// Returns a sequence for enumerating over the given array, starting from the +// given offset. The array will be copied to prevent mutation. ++ (RACSequence *)sequenceWithArray:(NSArray *)array offset:(NSUInteger)offset; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.m new file mode 100644 index 0000000..797d48f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACArraySequence.m @@ -0,0 +1,125 @@ +// +// RACArraySequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACArraySequence.h" + +@interface RACArraySequence () + +// Redeclared from the superclass and marked deprecated to prevent using `array` +// where `backingArray` is intended. +@property (nonatomic, copy, readonly) NSArray *array __attribute__((deprecated)); + +// The array being sequenced. +@property (nonatomic, copy, readonly) NSArray *backingArray; + +// The index in the array from which the sequence starts. +@property (nonatomic, assign, readonly) NSUInteger offset; + +@end + +@implementation RACArraySequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithArray:(NSArray *)array offset:(NSUInteger)offset { + NSCParameterAssert(offset <= array.count); + + if (offset == array.count) return self.empty; + + RACArraySequence *seq = [[self alloc] init]; + seq->_backingArray = [array copy]; + seq->_offset = offset; + return seq; +} + +#pragma mark RACSequence + +- (id)head { + return self.backingArray[self.offset]; +} + +- (RACSequence *)tail { + RACSequence *sequence = [self.class sequenceWithArray:self.backingArray offset:self.offset + 1]; + sequence.name = self.name; + return sequence; +} + +#pragma mark NSFastEnumeration + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id[])stackbuf count:(NSUInteger)len { + NSCParameterAssert(len > 0); + + if (state->state >= self.backingArray.count) { + // Enumeration has completed. + return 0; + } + + if (state->state == 0) { + state->state = self.offset; + + // Since a sequence doesn't mutate, this just needs to be set to + // something non-NULL. + state->mutationsPtr = state->extra; + } + + state->itemsPtr = stackbuf; + + NSUInteger startIndex = state->state; + NSUInteger index = 0; + + for (id value in self.backingArray) { + // Constructing an index set for -enumerateObjectsAtIndexes: can actually be + // slower than just skipping the items we don't care about. + if (index < startIndex) { + ++index; + continue; + } + + stackbuf[index - startIndex] = value; + + ++index; + if (index - startIndex >= len) break; + } + + NSCAssert(index > startIndex, @"Final index (%lu) should be greater than start index (%lu)", (unsigned long)index, (unsigned long)startIndex); + + state->state = index; + return index - startIndex; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-implementations" +- (NSArray *)array { + return [self.backingArray subarrayWithRange:NSMakeRange(self.offset, self.backingArray.count - self.offset)]; +} +#pragma clang diagnostic pop + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)coder { + self = [super initWithCoder:coder]; + if (self == nil) return nil; + + _backingArray = [coder decodeObjectForKey:@"array"]; + _offset = 0; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + // Encoding is handled in RACSequence. + [super encodeWithCoder:coder]; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, array = %@ }", self.class, self, self.name, self.backingArray]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h b/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h new file mode 100644 index 0000000..a462656 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.h @@ -0,0 +1,22 @@ +// +// RACBehaviorSubject.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubject.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A behavior subject sends the last value it received when it is subscribed to. +@interface RACBehaviorSubject : RACSubject + +/// Creates a new behavior subject with a default value. If it hasn't received +/// any values when it gets subscribed to, it sends the default value. ++ (instancetype)behaviorSubjectWithDefaultValue:(nullable ValueType)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.m b/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.m new file mode 100644 index 0000000..857289f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACBehaviorSubject.m @@ -0,0 +1,56 @@ +// +// RACBehaviorSubject.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACBehaviorSubject.h" +#import "RACDisposable.h" +#import "RACScheduler+Private.h" + +@interface RACBehaviorSubject () + +// This property should only be used while synchronized on self. +@property (nonatomic, strong) ValueType currentValue; + +@end + +@implementation RACBehaviorSubject + +#pragma mark Lifecycle + ++ (instancetype)behaviorSubjectWithDefaultValue:(id)value { + RACBehaviorSubject *subject = [self subject]; + subject.currentValue = value; + return subject; +} + +#pragma mark RACSignal + +- (RACDisposable *)subscribe:(id)subscriber { + RACDisposable *subscriptionDisposable = [super subscribe:subscriber]; + + RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ + @synchronized (self) { + [subscriber sendNext:self.currentValue]; + } + }]; + + return [RACDisposable disposableWithBlock:^{ + [subscriptionDisposable dispose]; + [schedulingDisposable dispose]; + }]; +} + +#pragma mark RACSubscriber + +- (void)sendNext:(id)value { + @synchronized (self) { + self.currentValue = value; + [super sendNext:value]; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h b/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h new file mode 100644 index 0000000..c0e89bc --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.h @@ -0,0 +1,30 @@ +// +// RACBlockTrampoline.h +// ReactiveObjC +// +// Created by Josh Abernathy on 10/21/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACTuple; + +// A private class that allows a limited type of dynamic block invocation. +@interface RACBlockTrampoline : NSObject + +// Invokes the given block with the given arguments. All of the block's +// argument types must be objects and it must be typed to return an object. +// +// At this time, it only supports blocks that take up to 15 arguments. Any more +// is just cray. +// +// block - The block to invoke. Must accept as many arguments as are given in +// the arguments array. Cannot be nil. +// arguments - The arguments with which to invoke the block. `RACTupleNil`s will +// be passed as nils. +// +// Returns the return value of invoking the block. ++ (id)invokeBlock:(id)block withArguments:(RACTuple *)arguments; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.m b/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.m new file mode 100644 index 0000000..a2d589f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACBlockTrampoline.m @@ -0,0 +1,155 @@ +// +// RACBlockTrampoline.m +// ReactiveObjC +// +// Created by Josh Abernathy on 10/21/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACBlockTrampoline.h" +#import "RACTuple.h" + +@interface RACBlockTrampoline () +@property (nonatomic, readonly, copy) id block; +@end + +@implementation RACBlockTrampoline + +#pragma mark API + +- (instancetype)initWithBlock:(id)block { + self = [super init]; + + _block = [block copy]; + + return self; +} + ++ (id)invokeBlock:(id)block withArguments:(RACTuple *)arguments { + NSCParameterAssert(block != NULL); + + RACBlockTrampoline *trampoline = [[self alloc] initWithBlock:block]; + return [trampoline invokeWithArguments:arguments]; +} + +- (id)invokeWithArguments:(RACTuple *)arguments { + SEL selector = [self selectorForArgumentCount:arguments.count]; + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:selector]]; + invocation.selector = selector; + invocation.target = self; + + for (NSUInteger i = 0; i < arguments.count; i++) { + id arg = arguments[i]; + NSInteger argIndex = (NSInteger)(i + 2); + [invocation setArgument:&arg atIndex:argIndex]; + } + + [invocation invoke]; + + __unsafe_unretained id returnVal; + [invocation getReturnValue:&returnVal]; + return returnVal; +} + +- (SEL)selectorForArgumentCount:(NSUInteger)count { + NSCParameterAssert(count > 0); + + switch (count) { + case 0: return NULL; + case 1: return @selector(performWith:); + case 2: return @selector(performWith::); + case 3: return @selector(performWith:::); + case 4: return @selector(performWith::::); + case 5: return @selector(performWith:::::); + case 6: return @selector(performWith::::::); + case 7: return @selector(performWith:::::::); + case 8: return @selector(performWith::::::::); + case 9: return @selector(performWith:::::::::); + case 10: return @selector(performWith::::::::::); + case 11: return @selector(performWith:::::::::::); + case 12: return @selector(performWith::::::::::::); + case 13: return @selector(performWith:::::::::::::); + case 14: return @selector(performWith::::::::::::::); + case 15: return @selector(performWith:::::::::::::::); + } + + NSCAssert(NO, @"The argument count is too damn high! Only blocks of up to 15 arguments are currently supported."); + return NULL; +} + +- (id)performWith:(id)obj1 { + id (^block)(id) = self.block; + return block(obj1); +} + +- (id)performWith:(id)obj1 :(id)obj2 { + id (^block)(id, id) = self.block; + return block(obj1, obj2); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 { + id (^block)(id, id, id) = self.block; + return block(obj1, obj2, obj3); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 { + id (^block)(id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 { + id (^block)(id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 { + id (^block)(id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 { + id (^block)(id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 { + id (^block)(id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 { + id (^block)(id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 { + id (^block)(id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 { + id (^block)(id, id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 { + id (^block)(id, id, id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 { + id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 :(id)obj14 { + id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14); +} + +- (id)performWith:(id)obj1 :(id)obj2 :(id)obj3 :(id)obj4 :(id)obj5 :(id)obj6 :(id)obj7 :(id)obj8 :(id)obj9 :(id)obj10 :(id)obj11 :(id)obj12 :(id)obj13 :(id)obj14 :(id)obj15 { + id (^block)(id, id, id, id, id, id, id, id, id, id, id, id, id, id, id) = self.block; + return block(obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8, obj9, obj10, obj11, obj12, obj13, obj14, obj15); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACChannel.h b/Pods/ReactiveObjC/ReactiveObjC/RACChannel.h new file mode 100644 index 0000000..847f174 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACChannel.h @@ -0,0 +1,77 @@ +// +// RACChannel.h +// ReactiveObjC +// +// Created by Uri Baghin on 01/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" +#import "RACSubscriber.h" + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +/// A two-way channel. +/// +/// Conceptually, RACChannel can be thought of as a bidirectional connection, +/// composed of two controllable signals that work in parallel. +/// +/// For example, when connecting between a view and a model: +/// +/// Model View +/// `leadingTerminal` ------> `followingTerminal` +/// `leadingTerminal` <------ `followingTerminal` +/// +/// The initial value of the model and all future changes to it are _sent on_ the +/// `leadingTerminal`, and _received by_ subscribers of the `followingTerminal`. +/// +/// Likewise, whenever the user changes the value of the view, that value is sent +/// on the `followingTerminal`, and received in the model from the +/// `leadingTerminal`. However, the initial value of the view is not received +/// from the `leadingTerminal` (only future changes). +@interface RACChannel : NSObject + +/// The terminal which "leads" the channel, by sending its latest value +/// immediately to new subscribers of the `followingTerminal`. +/// +/// New subscribers to this terminal will not receive a starting value, but will +/// receive all future values that are sent to the `followingTerminal`. +@property (nonatomic, strong, readonly) RACChannelTerminal *leadingTerminal; + +/// The terminal which "follows" the lead of the other terminal, only sending +/// _future_ values to the subscribers of the `leadingTerminal`. +/// +/// The latest value sent to the `leadingTerminal` (if any) will be sent +/// immediately to new subscribers of this terminal, and then all future values +/// as well. +@property (nonatomic, strong, readonly) RACChannelTerminal *followingTerminal; + +@end + +/// Represents one end of a RACChannel. +/// +/// An terminal is similar to a socket or pipe -- it represents one end of +/// a connection (the RACChannel, in this case). Values sent to this terminal +/// will _not_ be received by its subscribers. Instead, the values will be sent +/// to the subscribers of the RACChannel's _other_ terminal. +/// +/// For example, when using the `followingTerminal`, _sent_ values can only be +/// _received_ from the `leadingTerminal`, and vice versa. +/// +/// To make it easy to terminate a RACChannel, `error` and `completed` events +/// sent to either terminal will be received by the subscribers of _both_ +/// terminals. +/// +/// Do not instantiate this class directly. Create a RACChannel instead. +@interface RACChannelTerminal : RACSignal + +- (instancetype)init __attribute__((unavailable("Instantiate a RACChannel instead"))); + +// Redeclaration of the RACSubscriber method. Made in order to specify a generic type. +- (void)sendNext:(nullable ValueType)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACChannel.m b/Pods/ReactiveObjC/ReactiveObjC/RACChannel.m new file mode 100644 index 0000000..e8f617c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACChannel.m @@ -0,0 +1,88 @@ +// +// RACChannel.m +// ReactiveObjC +// +// Created by Uri Baghin on 01/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACChannel.h" +#import "RACDisposable.h" +#import "RACReplaySubject.h" +#import "RACSignal+Operations.h" + +@interface RACChannelTerminal () + +/// The values for this terminal. +@property (nonatomic, strong, readonly) RACSignal *values; + +/// A subscriber will will send values to the other terminal. +@property (nonatomic, strong, readonly) id otherTerminal; + +- (instancetype)initWithValues:(RACSignal *)values otherTerminal:(id)otherTerminal; + +@end + +@implementation RACChannel + +- (instancetype)init { + self = [super init]; + + // We don't want any starting value from the leadingSubject, but we do want + // error and completion to be replayed. + RACReplaySubject *leadingSubject = [[RACReplaySubject replaySubjectWithCapacity:0] setNameWithFormat:@"leadingSubject"]; + RACReplaySubject *followingSubject = [[RACReplaySubject replaySubjectWithCapacity:1] setNameWithFormat:@"followingSubject"]; + + // Propagate errors and completion to everything. + [[leadingSubject ignoreValues] subscribe:followingSubject]; + [[followingSubject ignoreValues] subscribe:leadingSubject]; + + _leadingTerminal = [[[RACChannelTerminal alloc] initWithValues:leadingSubject otherTerminal:followingSubject] setNameWithFormat:@"leadingTerminal"]; + _followingTerminal = [[[RACChannelTerminal alloc] initWithValues:followingSubject otherTerminal:leadingSubject] setNameWithFormat:@"followingTerminal"]; + + return self; +} + +@end + +@implementation RACChannelTerminal + +#pragma mark Lifecycle + +- (instancetype)initWithValues:(RACSignal *)values otherTerminal:(id)otherTerminal { + NSCParameterAssert(values != nil); + NSCParameterAssert(otherTerminal != nil); + + self = [super init]; + + _values = values; + _otherTerminal = otherTerminal; + + return self; +} + +#pragma mark RACSignal + +- (RACDisposable *)subscribe:(id)subscriber { + return [self.values subscribe:subscriber]; +} + +#pragma mark + +- (void)sendNext:(id)value { + [self.otherTerminal sendNext:value]; +} + +- (void)sendError:(NSError *)error { + [self.otherTerminal sendError:error]; +} + +- (void)sendCompleted { + [self.otherTerminal sendCompleted]; +} + +- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable { + [self.otherTerminal didSubscribeWithDisposable:disposable]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACCommand.h b/Pods/ReactiveObjC/ReactiveObjC/RACCommand.h new file mode 100644 index 0000000..4a26860 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACCommand.h @@ -0,0 +1,116 @@ +// +// RACCommand.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/3/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +/// The domain for errors originating within `RACCommand`. +extern NSString * const RACCommandErrorDomain; + +/// -execute: was invoked while the command was disabled. +extern const NSInteger RACCommandErrorNotEnabled; + +/// A `userInfo` key for an error, associated with the `RACCommand` that the +/// error originated from. +/// +/// This is included only when the error code is `RACCommandErrorNotEnabled`. +extern NSString * const RACUnderlyingCommandErrorKey; + +/// A command is a signal triggered in response to some action, typically +/// UI-related. +@interface RACCommand<__contravariant InputType, __covariant ValueType> : NSObject + +/// A signal of the signals returned by successful invocations of -execute: +/// (i.e., while the receiver is `enabled`). +/// +/// Errors will be automatically caught upon the inner signals, and sent upon +/// `errors` instead. If you _want_ to receive inner errors, use -execute: or +/// -[RACSignal materialize]. +/// +/// Only executions that begin _after_ subscription will be sent upon this +/// signal. All inner signals will arrive upon the main thread. +@property (nonatomic, strong, readonly) RACSignal *> *executionSignals; + +/// A signal of whether this command is currently executing. +/// +/// This will send YES whenever -execute: is invoked and the created signal has +/// not yet terminated. Once all executions have terminated, `executing` will +/// send NO. +/// +/// This signal will send its current value upon subscription, and then all +/// future values on the main thread. +@property (nonatomic, strong, readonly) RACSignal *executing; + +/// A signal of whether this command is able to execute. +/// +/// This will send NO if: +/// +/// - The command was created with an `enabledSignal`, and NO is sent upon that +/// signal, or +/// - `allowsConcurrentExecution` is NO and the command has started executing. +/// +/// Once the above conditions are no longer met, the signal will send YES. +/// +/// This signal will send its current value upon subscription, and then all +/// future values on the main thread. +@property (nonatomic, strong, readonly) RACSignal *enabled; + +/// Forwards any errors that occur within signals returned by -execute:. +/// +/// When an error occurs on a signal returned from -execute:, this signal will +/// send the associated NSError value as a `next` event (since an `error` event +/// would terminate the stream). +/// +/// After subscription, this signal will send all future errors on the main +/// thread. +@property (nonatomic, strong, readonly) RACSignal *errors; + +/// Whether the command allows multiple executions to proceed concurrently. +/// +/// The default value for this property is NO. +@property (atomic, assign) BOOL allowsConcurrentExecution; + +/// Invokes -initWithEnabled:signalBlock: with a nil `enabledSignal`. +- (instancetype)initWithSignalBlock:(RACSignal * (^)(InputType _Nullable input))signalBlock; + +/// Initializes a command that is conditionally enabled. +/// +/// This is the designated initializer for this class. +/// +/// enabledSignal - A signal of BOOLs which indicate whether the command should +/// be enabled. `enabled` will be based on the latest value sent +/// from this signal. Before any values are sent, `enabled` will +/// default to YES. This argument may be nil. +/// signalBlock - A block which will map each input value (passed to -execute:) +/// to a signal of work. The returned signal will be multicasted +/// to a replay subject, sent on `executionSignals`, then +/// subscribed to synchronously. Neither the block nor the +/// returned signal may be nil. +- (instancetype)initWithEnabled:(nullable RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(InputType _Nullable input))signalBlock; + +/// If the receiver is enabled, this method will: +/// +/// 1. Invoke the `signalBlock` given at the time of initialization. +/// 2. Multicast the returned signal to a RACReplaySubject. +/// 3. Send the multicasted signal on `executionSignals`. +/// 4. Subscribe (connect) to the original signal on the main thread. +/// +/// input - The input value to pass to the receiver's `signalBlock`. This may be +/// nil. +/// +/// Returns the multicasted signal, after subscription. If the receiver is not +/// enabled, returns a signal that will send an error with code +/// RACCommandErrorNotEnabled. +- (RACSignal *)execute:(nullable InputType)input; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACCommand.m b/Pods/ReactiveObjC/ReactiveObjC/RACCommand.m new file mode 100644 index 0000000..4bf7e62 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACCommand.m @@ -0,0 +1,202 @@ +// +// RACCommand.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/3/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACCommand.h" +#import +#import "NSArray+RACSequenceAdditions.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACPropertySubscribing.h" +#import "RACMulticastConnection.h" +#import "RACReplaySubject.h" +#import "RACScheduler.h" +#import "RACSequence.h" +#import "RACSignal+Operations.h" +#import + +NSString * const RACCommandErrorDomain = @"RACCommandErrorDomain"; +NSString * const RACUnderlyingCommandErrorKey = @"RACUnderlyingCommandErrorKey"; + +const NSInteger RACCommandErrorNotEnabled = 1; + +@interface RACCommand () { + // Atomic backing variable for `allowsConcurrentExecution`. + volatile uint32_t _allowsConcurrentExecution; +} + +/// A subject that sends added execution signals. +@property (nonatomic, strong, readonly) RACSubject *addedExecutionSignalsSubject; + +/// A subject that sends the new value of `allowsConcurrentExecution` whenever it changes. +@property (nonatomic, strong, readonly) RACSubject *allowsConcurrentExecutionSubject; + +// `enabled`, but without a hop to the main thread. +// +// Values from this signal may arrive on any thread. +@property (nonatomic, strong, readonly) RACSignal *immediateEnabled; + +// The signal block that the receiver was initialized with. +@property (nonatomic, copy, readonly) RACSignal * (^signalBlock)(id input); + +@end + +@implementation RACCommand + +#pragma mark Properties + +- (BOOL)allowsConcurrentExecution { + return _allowsConcurrentExecution != 0; +} + +- (void)setAllowsConcurrentExecution:(BOOL)allowed { + if (allowed) { + OSAtomicOr32Barrier(1, &_allowsConcurrentExecution); + } else { + OSAtomicAnd32Barrier(0, &_allowsConcurrentExecution); + } + + [self.allowsConcurrentExecutionSubject sendNext:@(_allowsConcurrentExecution)]; +} + +#pragma mark Lifecycle + +- (instancetype)init { + NSCAssert(NO, @"Use -initWithSignalBlock: instead"); + return nil; +} + +- (instancetype)initWithSignalBlock:(RACSignal * (^)(id input))signalBlock { + return [self initWithEnabled:nil signalBlock:signalBlock]; +} + +- (void)dealloc { + [_addedExecutionSignalsSubject sendCompleted]; + [_allowsConcurrentExecutionSubject sendCompleted]; +} + +- (instancetype)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock { + NSCParameterAssert(signalBlock != nil); + + self = [super init]; + + _addedExecutionSignalsSubject = [RACSubject new]; + _allowsConcurrentExecutionSubject = [RACSubject new]; + _signalBlock = [signalBlock copy]; + + _executionSignals = [[[self.addedExecutionSignalsSubject + map:^(RACSignal *signal) { + return [signal catchTo:[RACSignal empty]]; + }] + deliverOn:RACScheduler.mainThreadScheduler] + setNameWithFormat:@"%@ -executionSignals", self]; + + // `errors` needs to be multicasted so that it picks up all + // `activeExecutionSignals` that are added. + // + // In other words, if someone subscribes to `errors` _after_ an execution + // has started, it should still receive any error from that execution. + RACMulticastConnection *errorsConnection = [[[self.addedExecutionSignalsSubject + flattenMap:^(RACSignal *signal) { + return [[signal + ignoreValues] + catch:^(NSError *error) { + return [RACSignal return:error]; + }]; + }] + deliverOn:RACScheduler.mainThreadScheduler] + publish]; + + _errors = [errorsConnection.signal setNameWithFormat:@"%@ -errors", self]; + [errorsConnection connect]; + + RACSignal *immediateExecuting = [[[[self.addedExecutionSignalsSubject + flattenMap:^(RACSignal *signal) { + return [[[signal + catchTo:[RACSignal empty]] + then:^{ + return [RACSignal return:@-1]; + }] + startWith:@1]; + }] + scanWithStart:@0 reduce:^(NSNumber *running, NSNumber *next) { + return @(running.integerValue + next.integerValue); + }] + map:^(NSNumber *count) { + return @(count.integerValue > 0); + }] + startWith:@NO]; + + _executing = [[[[[immediateExecuting + deliverOn:RACScheduler.mainThreadScheduler] + // This is useful before the first value arrives on the main thread. + startWith:@NO] + distinctUntilChanged] + replayLast] + setNameWithFormat:@"%@ -executing", self]; + + RACSignal *moreExecutionsAllowed = [RACSignal + if:[self.allowsConcurrentExecutionSubject startWith:@NO] + then:[RACSignal return:@YES] + else:[immediateExecuting not]]; + + if (enabledSignal == nil) { + enabledSignal = [RACSignal return:@YES]; + } else { + enabledSignal = [enabledSignal startWith:@YES]; + } + + _immediateEnabled = [[[[RACSignal + combineLatest:@[ enabledSignal, moreExecutionsAllowed ]] + and] + takeUntil:self.rac_willDeallocSignal] + replayLast]; + + _enabled = [[[[[self.immediateEnabled + take:1] + concat:[[self.immediateEnabled skip:1] deliverOn:RACScheduler.mainThreadScheduler]] + distinctUntilChanged] + replayLast] + setNameWithFormat:@"%@ -enabled", self]; + + return self; +} + +#pragma mark Execution + +- (RACSignal *)execute:(id)input { + // `immediateEnabled` is guaranteed to send a value upon subscription, so + // -first is acceptable here. + BOOL enabled = [[self.immediateEnabled first] boolValue]; + if (!enabled) { + NSError *error = [NSError errorWithDomain:RACCommandErrorDomain code:RACCommandErrorNotEnabled userInfo:@{ + NSLocalizedDescriptionKey: NSLocalizedString(@"The command is disabled and cannot be executed", nil), + RACUnderlyingCommandErrorKey: self + }]; + + return [RACSignal error:error]; + } + + RACSignal *signal = self.signalBlock(input); + NSCAssert(signal != nil, @"nil signal returned from signal block for value: %@", input); + + // We subscribe to the signal on the main thread so that it occurs _after_ + // -addActiveExecutionSignal: completes below. + // + // This means that `executing` and `enabled` will send updated values before + // the signal actually starts performing work. + RACMulticastConnection *connection = [[signal + subscribeOn:RACScheduler.mainThreadScheduler] + multicast:[RACReplaySubject subject]]; + + [self.addedExecutionSignalsSubject sendNext:connection.signal]; + + [connection connect]; + return [connection.signal setNameWithFormat:@"%@ -execute: %@", self, RACDescription(input)]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h new file mode 100644 index 0000000..b4e4dea --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.h @@ -0,0 +1,52 @@ +// +// RACCompoundDisposable.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACDisposable.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A disposable of disposables. When it is disposed, it disposes of all its +/// contained disposables. +/// +/// If -addDisposable: is called after the compound disposable has been disposed +/// of, the given disposable is immediately disposed. This allows a compound +/// disposable to act as a stand-in for a disposable that will be delivered +/// asynchronously. +@interface RACCompoundDisposable : RACDisposable + +/// Creates and returns a new compound disposable. ++ (instancetype)compoundDisposable; + +/// Creates and returns a new compound disposable containing the given +/// disposables. ++ (instancetype)compoundDisposableWithDisposables:(nullable NSArray *)disposables; + +/// Adds the given disposable. If the receiving disposable has already been +/// disposed of, the given disposable is disposed immediately. +/// +/// This method is thread-safe. +/// +/// disposable - The disposable to add. This may be nil, in which case nothing +/// happens. +- (void)addDisposable:(nullable RACDisposable *)disposable; + +/// Removes the specified disposable from the compound disposable (regardless of +/// its disposed status), or does nothing if it's not in the compound disposable. +/// +/// This is mainly useful for limiting the memory usage of the compound +/// disposable for long-running operations. +/// +/// This method is thread-safe. +/// +/// disposable - The disposable to remove. This argument may be nil (to make the +/// use of weak references easier). +- (void)removeDisposable:(nullable RACDisposable *)disposable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.m b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.m new file mode 100644 index 0000000..5e38b7d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposable.m @@ -0,0 +1,250 @@ +// +// RACCompoundDisposable.m +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACCompoundDisposable.h" +#import "RACCompoundDisposableProvider.h" +#import + +// The number of child disposables for which space will be reserved directly in +// `RACCompoundDisposable`. +// +// This number has been empirically determined to provide a good tradeoff +// between performance, memory usage, and `RACCompoundDisposable` instance size +// in a moderately complex GUI application. +// +// Profile any change! +#define RACCompoundDisposableInlineCount 2 + +static CFMutableArrayRef RACCreateDisposablesArray(void) { + // Compare values using only pointer equality. + CFArrayCallBacks callbacks = kCFTypeArrayCallBacks; + callbacks.equal = NULL; + + return CFArrayCreateMutable(NULL, 0, &callbacks); +} + +@interface RACCompoundDisposable () { + // Used for synchronization. + pthread_mutex_t _mutex; + + #if RACCompoundDisposableInlineCount + // A fast array to the first N of the receiver's disposables. + // + // Once this is full, `_disposables` will be created and used for additional + // disposables. + // + // This array should only be manipulated while _mutex is held. + RACDisposable *_inlineDisposables[RACCompoundDisposableInlineCount]; + #endif + + // Contains the receiver's disposables. + // + // This array should only be manipulated while _mutex is held. If + // `_disposed` is YES, this may be NULL. + CFMutableArrayRef _disposables; + + // Whether the receiver has already been disposed. + // + // This ivar should only be accessed while _mutex is held. + BOOL _disposed; +} + +@end + +@implementation RACCompoundDisposable + +#pragma mark Properties + +- (BOOL)isDisposed { + pthread_mutex_lock(&_mutex); + BOOL disposed = _disposed; + pthread_mutex_unlock(&_mutex); + + return disposed; +} + +#pragma mark Lifecycle + ++ (instancetype)compoundDisposable { + return [[self alloc] initWithDisposables:nil]; +} + ++ (instancetype)compoundDisposableWithDisposables:(NSArray *)disposables { + return [[self alloc] initWithDisposables:disposables]; +} + +- (instancetype)init { + self = [super init]; + + const int result __attribute__((unused)) = pthread_mutex_init(&_mutex, NULL); + NSCAssert(0 == result, @"Failed to initialize mutex with error %d.", result); + + return self; +} + +- (instancetype)initWithDisposables:(NSArray *)otherDisposables { + self = [self init]; + + #if RACCompoundDisposableInlineCount + [otherDisposables enumerateObjectsUsingBlock:^(RACDisposable *disposable, NSUInteger index, BOOL *stop) { + self->_inlineDisposables[index] = disposable; + + // Stop after this iteration if we've reached the end of the inlined + // array. + if (index == RACCompoundDisposableInlineCount - 1) *stop = YES; + }]; + #endif + + if (otherDisposables.count > RACCompoundDisposableInlineCount) { + _disposables = RACCreateDisposablesArray(); + + CFRange range = CFRangeMake(RACCompoundDisposableInlineCount, (CFIndex)otherDisposables.count - RACCompoundDisposableInlineCount); + CFArrayAppendArray(_disposables, (__bridge CFArrayRef)otherDisposables, range); + } + + return self; +} + +- (instancetype)initWithBlock:(void (^)(void))block { + RACDisposable *disposable = [RACDisposable disposableWithBlock:block]; + return [self initWithDisposables:@[ disposable ]]; +} + +- (void)dealloc { + #if RACCompoundDisposableInlineCount + for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { + _inlineDisposables[i] = nil; + } + #endif + + if (_disposables != NULL) { + CFRelease(_disposables); + _disposables = NULL; + } + + const int result __attribute__((unused)) = pthread_mutex_destroy(&_mutex); + NSCAssert(0 == result, @"Failed to destroy mutex with error %d.", result); +} + +#pragma mark Addition and Removal + +- (void)addDisposable:(RACDisposable *)disposable { + NSCParameterAssert(disposable != self); + if (disposable == nil || disposable.disposed) return; + + BOOL shouldDispose = NO; + + pthread_mutex_lock(&_mutex); + { + if (_disposed) { + shouldDispose = YES; + } else { + #if RACCompoundDisposableInlineCount + for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { + if (_inlineDisposables[i] == nil) { + _inlineDisposables[i] = disposable; + goto foundSlot; + } + } + #endif + + if (_disposables == NULL) _disposables = RACCreateDisposablesArray(); + CFArrayAppendValue(_disposables, (__bridge void *)disposable); + + if (RACCOMPOUNDDISPOSABLE_ADDED_ENABLED()) { + RACCOMPOUNDDISPOSABLE_ADDED(self.description.UTF8String, disposable.description.UTF8String, CFArrayGetCount(_disposables) + RACCompoundDisposableInlineCount); + } + + #if RACCompoundDisposableInlineCount + foundSlot:; + #endif + } + } + pthread_mutex_unlock(&_mutex); + + // Performed outside of the lock in case the compound disposable is used + // recursively. + if (shouldDispose) [disposable dispose]; +} + +- (void)removeDisposable:(RACDisposable *)disposable { + if (disposable == nil) return; + + pthread_mutex_lock(&_mutex); + { + if (!_disposed) { + #if RACCompoundDisposableInlineCount + for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { + if (_inlineDisposables[i] == disposable) _inlineDisposables[i] = nil; + } + #endif + + if (_disposables != NULL) { + CFIndex count = CFArrayGetCount(_disposables); + for (CFIndex i = count - 1; i >= 0; i--) { + const void *item = CFArrayGetValueAtIndex(_disposables, i); + if (item == (__bridge void *)disposable) { + CFArrayRemoveValueAtIndex(_disposables, i); + } + } + + if (RACCOMPOUNDDISPOSABLE_REMOVED_ENABLED()) { + RACCOMPOUNDDISPOSABLE_REMOVED(self.description.UTF8String, disposable.description.UTF8String, CFArrayGetCount(_disposables) + RACCompoundDisposableInlineCount); + } + } + } + } + pthread_mutex_unlock(&_mutex); +} + +#pragma mark RACDisposable + +static void disposeEach(const void *value, void *context) { + RACDisposable *disposable = (__bridge id)value; + [disposable dispose]; +} + +- (void)dispose { + #if RACCompoundDisposableInlineCount + RACDisposable *inlineCopy[RACCompoundDisposableInlineCount]; + #endif + + CFArrayRef remainingDisposables = NULL; + + pthread_mutex_lock(&_mutex); + { + _disposed = YES; + + #if RACCompoundDisposableInlineCount + for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { + inlineCopy[i] = _inlineDisposables[i]; + _inlineDisposables[i] = nil; + } + #endif + + remainingDisposables = _disposables; + _disposables = NULL; + } + pthread_mutex_unlock(&_mutex); + + #if RACCompoundDisposableInlineCount + // Dispose outside of the lock in case the compound disposable is used + // recursively. + for (unsigned i = 0; i < RACCompoundDisposableInlineCount; i++) { + [inlineCopy[i] dispose]; + } + #endif + + if (remainingDisposables == NULL) return; + + CFIndex count = CFArrayGetCount(remainingDisposables); + CFArrayApplyFunction(remainingDisposables, CFRangeMake(0, count), &disposeEach, NULL); + CFRelease(remainingDisposables); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposableProvider.d b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposableProvider.d new file mode 100644 index 0000000..847db19 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACCompoundDisposableProvider.d @@ -0,0 +1,4 @@ +provider RACCompoundDisposable { + probe added(char *compoundDisposable, char *disposable, long newTotal); + probe removed(char *compoundDisposable, char *disposable, long newTotal); +}; diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.h b/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.h new file mode 100644 index 0000000..2ddfd24 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.h @@ -0,0 +1,32 @@ +// +// RACDelegateProxy.h +// ReactiveObjC +// +// Created by Cody Krieger on 5/19/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +// A private delegate object suitable for using +// -rac_signalForSelector:fromProtocol: upon. +@interface RACDelegateProxy : NSObject + +// The delegate to which messages should be forwarded if not handled by +// any -signalForSelector: applications. +@property (nonatomic, unsafe_unretained) id rac_proxiedDelegate; + +// Creates a delegate proxy capable of responding to selectors from `protocol`. +- (instancetype)initWithProtocol:(Protocol *)protocol; + +// Calls -rac_signalForSelector:fromProtocol: using the `protocol` specified +// during initialization. +- (RACSignal *)signalForSelector:(SEL)selector; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.m b/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.m new file mode 100644 index 0000000..c1f07c3 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDelegateProxy.m @@ -0,0 +1,75 @@ +// +// RACDelegateProxy.m +// ReactiveObjC +// +// Created by Cody Krieger on 5/19/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACDelegateProxy.h" +#import "NSObject+RACSelectorSignal.h" +#import + +@interface RACDelegateProxy () { + // Declared as an ivar to avoid method naming conflicts. + Protocol *_protocol; +} + +@end + +@implementation RACDelegateProxy + +#pragma mark Lifecycle + +- (instancetype)initWithProtocol:(Protocol *)protocol { + NSCParameterAssert(protocol != NULL); + + self = [super init]; + + class_addProtocol(self.class, protocol); + + _protocol = protocol; + + return self; +} + +#pragma mark API + +- (RACSignal *)signalForSelector:(SEL)selector { + return [self rac_signalForSelector:selector fromProtocol:_protocol]; +} + +#pragma mark NSObject + +- (BOOL)isProxy { + return YES; +} + +- (void)forwardInvocation:(NSInvocation *)invocation { + [invocation invokeWithTarget:self.rac_proxiedDelegate]; +} + +- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { + // Look for the selector as an optional instance method. + struct objc_method_description methodDescription = protocol_getMethodDescription(_protocol, selector, NO, YES); + + if (methodDescription.name == NULL) { + // Then fall back to looking for a required instance + // method. + methodDescription = protocol_getMethodDescription(_protocol, selector, YES, YES); + if (methodDescription.name == NULL) return [super methodSignatureForSelector:selector]; + } + + return [NSMethodSignature signatureWithObjCTypes:methodDescription.types]; +} + +- (BOOL)respondsToSelector:(SEL)selector { + // Add the delegate to the autorelease pool, so it doesn't get deallocated + // between this method call and -forwardInvocation:. + __autoreleasing id delegate = self.rac_proxiedDelegate; + if ([delegate respondsToSelector:selector]) return YES; + + return [super respondsToSelector:selector]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.h b/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.h new file mode 100644 index 0000000..3232076 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.h @@ -0,0 +1,39 @@ +// +// RACDisposable.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACScopedDisposable; + +NS_ASSUME_NONNULL_BEGIN + +/// A disposable encapsulates the work necessary to tear down and cleanup a +/// subscription. +@interface RACDisposable : NSObject + +/// Whether the receiver has been disposed. +/// +/// Use of this property is discouraged, since it may be set to `YES` +/// concurrently at any time. +/// +/// This property is not KVO-compliant. +@property (atomic, assign, getter = isDisposed, readonly) BOOL disposed; + ++ (instancetype)disposableWithBlock:(void (^)(void))block; + +/// Performs the disposal work. Can be called multiple times, though subsequent +/// calls won't do anything. +- (void)dispose; + +/// Returns a new disposable which will dispose of this disposable when it gets +/// dealloc'd. +- (RACScopedDisposable *)asScopedDisposable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.m b/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.m new file mode 100644 index 0000000..25f2669 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDisposable.m @@ -0,0 +1,90 @@ +// +// RACDisposable.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACDisposable.h" +#import "RACScopedDisposable.h" +#import + +@interface RACDisposable () { + // A copied block of type void (^)(void) containing the logic for disposal, + // a pointer to `self` if no logic should be performed upon disposal, or + // NULL if the receiver is already disposed. + // + // This should only be used atomically. + void * volatile _disposeBlock; +} + +@end + +@implementation RACDisposable + +#pragma mark Properties + +- (BOOL)isDisposed { + return _disposeBlock == NULL; +} + +#pragma mark Lifecycle + +- (instancetype)init { + self = [super init]; + + _disposeBlock = (__bridge void *)self; + OSMemoryBarrier(); + + return self; +} + +- (instancetype)initWithBlock:(void (^)(void))block { + NSCParameterAssert(block != nil); + + self = [super init]; + + _disposeBlock = (void *)CFBridgingRetain([block copy]); + OSMemoryBarrier(); + + return self; +} + ++ (instancetype)disposableWithBlock:(void (^)(void))block { + return [[self alloc] initWithBlock:block]; +} + +- (void)dealloc { + if (_disposeBlock == NULL || _disposeBlock == (__bridge void *)self) return; + + CFRelease(_disposeBlock); + _disposeBlock = NULL; +} + +#pragma mark Disposal + +- (void)dispose { + void (^disposeBlock)(void) = NULL; + + while (YES) { + void *blockPtr = _disposeBlock; + if (OSAtomicCompareAndSwapPtrBarrier(blockPtr, NULL, &_disposeBlock)) { + if (blockPtr != (__bridge void *)self) { + disposeBlock = CFBridgingRelease(blockPtr); + } + + break; + } + } + + if (disposeBlock != nil) disposeBlock(); +} + +#pragma mark Scoped Disposables + +- (RACScopedDisposable *)asScopedDisposable { + return [RACScopedDisposable scopedDisposableWithDisposable:self]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.h new file mode 100644 index 0000000..545ea18 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.h @@ -0,0 +1,20 @@ +// +// RACDynamicSequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACSequence.h" + +// Private class that implements a sequence dynamically using blocks. +@interface RACDynamicSequence : RACSequence + +// Returns a sequence which evaluates `dependencyBlock` only once, the first +// time either `headBlock` or `tailBlock` is evaluated. The result of +// `dependencyBlock` will be passed into `headBlock` and `tailBlock` when +// invoked. ++ (RACSequence *)sequenceWithLazyDependency:(id (^)(void))dependencyBlock headBlock:(id (^)(id dependency))headBlock tailBlock:(RACSequence *(^)(id dependency))tailBlock; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.m new file mode 100644 index 0000000..177a225 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSequence.m @@ -0,0 +1,197 @@ +// +// RACDynamicSequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACDynamicSequence.h" +#import + +// Determines how RACDynamicSequences will be deallocated before the next one is +// shifted onto the autorelease pool. +// +// This avoids stack overflows when deallocating long chains of dynamic +// sequences. +#define DEALLOC_OVERFLOW_GUARD 100 + +@interface RACDynamicSequence () { + // The value for the "head" property, if it's been evaluated already. + // + // Because it's legal for head to be nil, this ivar is valid any time + // headBlock is nil. + // + // This ivar should only be accessed while synchronized on self. + id _head; + + // The value for the "tail" property, if it's been evaluated already. + // + // Because it's legal for tail to be nil, this ivar is valid any time + // tailBlock is nil. + // + // This ivar should only be accessed while synchronized on self. + RACSequence *_tail; + + // The result of an evaluated `dependencyBlock`. + // + // This ivar is valid any time `hasDependency` is YES and `dependencyBlock` + // is nil. + // + // This ivar should only be accessed while synchronized on self. + id _dependency; +} + +// A block used to evaluate head. This should be set to nil after `_head` has been +// initialized. +// +// This is marked `strong` instead of `copy` because of some bizarre block +// copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. +// +// The signature of this block varies based on the value of `hasDependency`: +// +// - If YES, this block is of type `id (^)(id)`. +// - If NO, this block is of type `id (^)(void)`. +// +// This property should only be accessed while synchronized on self. +@property (nonatomic, strong) id headBlock; + +// A block used to evaluate tail. This should be set to nil after `_tail` has been +// initialized. +// +// This is marked `strong` instead of `copy` because of some bizarre block +// copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. +// +// The signature of this block varies based on the value of `hasDependency`: +// +// - If YES, this block is of type `RACSequence * (^)(id)`. +// - If NO, this block is of type `RACSequence * (^)(void)`. +// +// This property should only be accessed while synchronized on self. +@property (nonatomic, strong) id tailBlock; + +// Whether the receiver was initialized with a `dependencyBlock`. +// +// This property should only be accessed while synchronized on self. +@property (nonatomic, assign) BOOL hasDependency; + +// A dependency which must be evaluated before `headBlock` and `tailBlock`. This +// should be set to nil after `_dependency` and `dependencyBlockExecuted` have +// been set. +// +// This is marked `strong` instead of `copy` because of some bizarre block +// copying bug. See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/506. +// +// This property should only be accessed while synchronized on self. +@property (nonatomic, strong) id (^dependencyBlock)(void); + +@end + +@implementation RACDynamicSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithHeadBlock:(id (^)(void))headBlock tailBlock:(RACSequence *(^)(void))tailBlock { + NSCParameterAssert(headBlock != nil); + + RACDynamicSequence *seq = [[RACDynamicSequence alloc] init]; + seq.headBlock = [headBlock copy]; + seq.tailBlock = [tailBlock copy]; + seq.hasDependency = NO; + return seq; +} + ++ (RACSequence *)sequenceWithLazyDependency:(id (^)(void))dependencyBlock headBlock:(id (^)(id dependency))headBlock tailBlock:(RACSequence *(^)(id dependency))tailBlock { + NSCParameterAssert(dependencyBlock != nil); + NSCParameterAssert(headBlock != nil); + + RACDynamicSequence *seq = [[RACDynamicSequence alloc] init]; + seq.headBlock = [headBlock copy]; + seq.tailBlock = [tailBlock copy]; + seq.dependencyBlock = [dependencyBlock copy]; + seq.hasDependency = YES; + return seq; +} + +- (void)dealloc { + static volatile int32_t directDeallocCount = 0; + + if (OSAtomicIncrement32(&directDeallocCount) >= DEALLOC_OVERFLOW_GUARD) { + OSAtomicAdd32(-DEALLOC_OVERFLOW_GUARD, &directDeallocCount); + + // Put this sequence's tail onto the autorelease pool so we stop + // recursing. + __autoreleasing RACSequence *tail __attribute__((unused)) = _tail; + } + + _tail = nil; +} + +#pragma mark RACSequence + +- (id)head { + @synchronized (self) { + id untypedHeadBlock = self.headBlock; + if (untypedHeadBlock == nil) return _head; + + if (self.hasDependency) { + if (self.dependencyBlock != nil) { + _dependency = self.dependencyBlock(); + self.dependencyBlock = nil; + } + + id (^headBlock)(id) = untypedHeadBlock; + _head = headBlock(_dependency); + } else { + id (^headBlock)(void) = untypedHeadBlock; + _head = headBlock(); + } + + self.headBlock = nil; + return _head; + } +} + +- (RACSequence *)tail { + @synchronized (self) { + id untypedTailBlock = self.tailBlock; + if (untypedTailBlock == nil) return _tail; + + if (self.hasDependency) { + if (self.dependencyBlock != nil) { + _dependency = self.dependencyBlock(); + self.dependencyBlock = nil; + } + + RACSequence * (^tailBlock)(id) = untypedTailBlock; + _tail = tailBlock(_dependency); + } else { + RACSequence * (^tailBlock)(void) = untypedTailBlock; + _tail = tailBlock(); + } + + if (_tail.name == nil) _tail.name = self.name; + + self.tailBlock = nil; + return _tail; + } +} + +#pragma mark NSObject + +- (NSString *)description { + id head = @"(unresolved)"; + id tail = @"(unresolved)"; + + @synchronized (self) { + if (self.headBlock == nil) head = _head; + if (self.tailBlock == nil) { + tail = _tail; + if (tail == self) tail = @"(self)"; + } + } + + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, head = %@, tail = %@ }", self.class, self, self.name, head, tail]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.h new file mode 100644 index 0000000..cadd7bc --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.h @@ -0,0 +1,17 @@ +// +// RACDynamicSignal.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" + +// A private `RACSignal` subclasses that implements its subscription behavior +// using a block. +@interface RACDynamicSignal : RACSignal + ++ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.m new file mode 100644 index 0000000..e2388bd --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACDynamicSignal.m @@ -0,0 +1,54 @@ +// +// RACDynamicSignal.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACDynamicSignal.h" +#import +#import "RACCompoundDisposable.h" +#import "RACPassthroughSubscriber.h" +#import "RACScheduler+Private.h" +#import "RACSubscriber.h" +#import + +@interface RACDynamicSignal () + +// The block to invoke for each subscriber. +@property (nonatomic, copy, readonly) RACDisposable * (^didSubscribe)(id subscriber); + +@end + +@implementation RACDynamicSignal + +#pragma mark Lifecycle + ++ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe { + RACDynamicSignal *signal = [[self alloc] init]; + signal->_didSubscribe = [didSubscribe copy]; + return [signal setNameWithFormat:@"+createSignal:"]; +} + +#pragma mark Managing Subscribers + +- (RACDisposable *)subscribe:(id)subscriber { + NSCParameterAssert(subscriber != nil); + + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable]; + + if (self.didSubscribe != NULL) { + RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ + RACDisposable *innerDisposable = self.didSubscribe(subscriber); + [disposable addDisposable:innerDisposable]; + }]; + + [disposable addDisposable:schedulingDisposable]; + } + + return disposable; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.h new file mode 100644 index 0000000..04ddf7e --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.h @@ -0,0 +1,14 @@ +// +// RACEagerSequence.h +// ReactiveObjC +// +// Created by Uri Baghin on 02/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACArraySequence.h" + +// Private class that implements an eager sequence. +@interface RACEagerSequence : RACArraySequence + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.m new file mode 100644 index 0000000..b1f94fc --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEagerSequence.m @@ -0,0 +1,66 @@ +// +// RACEagerSequence.m +// ReactiveObjC +// +// Created by Uri Baghin on 02/01/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACEagerSequence.h" +#import "NSObject+RACDescription.h" +#import "RACArraySequence.h" + +@implementation RACEagerSequence + +#pragma mark RACStream + ++ (RACSequence *)return:(id)value { + return [[self sequenceWithArray:@[ value ] offset:0] setNameWithFormat:@"+return: %@", RACDescription(value)]; +} + +- (RACSequence *)bind:(RACSequenceBindBlock (^)(void))block { + NSCParameterAssert(block != nil); + RACStreamBindBlock bindBlock = block(); + NSArray *currentArray = self.array; + NSMutableArray *resultArray = [NSMutableArray arrayWithCapacity:currentArray.count]; + + for (id value in currentArray) { + BOOL stop = NO; + RACSequence *boundValue = (id)bindBlock(value, &stop); + if (boundValue == nil) break; + + for (id x in boundValue) { + [resultArray addObject:x]; + } + + if (stop) break; + } + + return [[self.class sequenceWithArray:resultArray offset:0] setNameWithFormat:@"[%@] -bind:", self.name]; +} + +- (RACSequence *)concat:(RACSequence *)sequence { + NSCParameterAssert(sequence != nil); + NSCParameterAssert([sequence isKindOfClass:RACSequence.class]); + + NSArray *array = [self.array arrayByAddingObjectsFromArray:sequence.array]; + return [[self.class sequenceWithArray:array offset:0] setNameWithFormat:@"[%@] -concat: %@", self.name, sequence]; +} + +#pragma mark Extended methods + +- (RACSequence *)eagerSequence { + return self; +} + +- (RACSequence *)lazySequence { + return [RACArraySequence sequenceWithArray:self.array offset:0]; +} + +- (id)foldRightWithStart:(id)start reduce:(id (^)(id, RACSequence *rest))reduce { + return [super foldRightWithStart:start reduce:^(id first, RACSequence *rest) { + return reduce(first, rest.eagerSequence); + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.h new file mode 100644 index 0000000..1bb7708 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.h @@ -0,0 +1,16 @@ +// +// RACEmptySequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACSequence.h" + +// Private class representing an empty sequence. +@interface RACEmptySequence : RACSequence + ++ (RACEmptySequence *)empty; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.m new file mode 100644 index 0000000..bd3dc2e --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySequence.m @@ -0,0 +1,71 @@ +// +// RACEmptySequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACEmptySequence.h" + +@implementation RACEmptySequence + +#pragma mark Lifecycle + ++ (instancetype)empty { + static id singleton; + static dispatch_once_t pred; + + dispatch_once(&pred, ^{ + singleton = [[self alloc] init]; + }); + + return singleton; +} + +#pragma mark RACSequence + +- (id)head { + return nil; +} + +- (RACSequence *)tail { + return nil; +} + +- (RACSequence *)bind:(RACStreamBindBlock)bindBlock passingThroughValuesFromSequence:(RACSequence *)passthroughSequence { + return passthroughSequence ?: self; +} + +#pragma mark NSCoding + +- (Class)classForCoder { + // Empty sequences should be encoded as themselves, not array sequences. + return self.class; +} + +- (instancetype)initWithCoder:(NSCoder *)coder { + // Return the singleton. + return self.class.empty; +} + +- (void)encodeWithCoder:(NSCoder *)coder { +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ name = %@ }", self.class, self, self.name]; +} + +- (NSUInteger)hash { + // This hash isn't ideal, but it's better than -[RACSequence hash], which + // would just be zero because we have no head. + return (NSUInteger)(__bridge void *)self; +} + +- (BOOL)isEqual:(RACSequence *)seq { + return (self == seq); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.h new file mode 100644 index 0000000..dc53451 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.h @@ -0,0 +1,17 @@ +// +// RACEmptySignal.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" + +// A private `RACSignal` subclasses that synchronously sends completed to any +// subscribers. +@interface RACEmptySignal<__covariant ValueType> : RACSignal + ++ (RACSignal *)empty; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.m new file mode 100644 index 0000000..d47ac27 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEmptySignal.m @@ -0,0 +1,62 @@ +// +// RACEmptySignal.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACEmptySignal.h" +#import "RACScheduler+Private.h" +#import "RACSubscriber.h" + +@implementation RACEmptySignal + +#pragma mark Properties + +// Only allow this signal's name to be customized in DEBUG, since it's +// a singleton in release builds (see +empty). +- (void)setName:(NSString *)name { +#ifdef DEBUG + [super setName:name]; +#endif +} + +- (NSString *)name { +#ifdef DEBUG + return super.name; +#else + return @"+empty"; +#endif +} + +#pragma mark Lifecycle + ++ (RACSignal *)empty { +#ifdef DEBUG + // Create multiple instances of this class in DEBUG so users can set custom + // names on each. + return [[[self alloc] init] setNameWithFormat:@"+empty"]; +#else + static id singleton; + static dispatch_once_t pred; + + dispatch_once(&pred, ^{ + singleton = [[self alloc] init]; + }); + + return singleton; +#endif +} + +#pragma mark Subscription + +- (RACDisposable *)subscribe:(id)subscriber { + NSCParameterAssert(subscriber != nil); + + return [RACScheduler.subscriptionScheduler schedule:^{ + [subscriber sendCompleted]; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.h new file mode 100644 index 0000000..3a72d4d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.h @@ -0,0 +1,17 @@ +// +// RACErrorSignal.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" + +// A private `RACSignal` subclass that synchronously sends an error to any +// subscriber. +@interface RACErrorSignal : RACSignal + ++ (RACSignal *)error:(NSError *)error; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.m new file mode 100644 index 0000000..1d08a2f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACErrorSignal.m @@ -0,0 +1,47 @@ +// +// RACErrorSignal.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACErrorSignal.h" +#import "RACScheduler+Private.h" +#import "RACSubscriber.h" + +@interface RACErrorSignal () + +// The error to send upon subscription. +@property (nonatomic, strong, readonly) NSError *error; + +@end + +@implementation RACErrorSignal + +#pragma mark Lifecycle + ++ (RACSignal *)error:(NSError *)error { + RACErrorSignal *signal = [[self alloc] init]; + signal->_error = error; + +#ifdef DEBUG + [signal setNameWithFormat:@"+error: %@", error]; +#else + signal.name = @"+error:"; +#endif + + return signal; +} + +#pragma mark Subscription + +- (RACDisposable *)subscribe:(id)subscriber { + NSCParameterAssert(subscriber != nil); + + return [RACScheduler.subscriptionScheduler schedule:^{ + [subscriber sendError:self.error]; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEvent.h b/Pods/ReactiveObjC/ReactiveObjC/RACEvent.h new file mode 100644 index 0000000..68ba13c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEvent.h @@ -0,0 +1,55 @@ +// +// RACEvent.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-01-07. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// Describes the type of a RACEvent. +/// +/// RACEventTypeCompleted - A `completed` event. +/// RACEventTypeError - An `error` event. +/// RACEventTypeNext - A `next` event. +typedef NS_ENUM(NSUInteger, RACEventType) { + RACEventTypeCompleted, + RACEventTypeError, + RACEventTypeNext +}; + +/// Represents an event sent by a RACSignal. +/// +/// This corresponds to the `Notification` class in Rx. +@interface RACEvent<__covariant ValueType> : NSObject + +/// Returns a singleton RACEvent representing the `completed` event. ++ (RACEvent *)completedEvent; + +/// Returns a new event of type RACEventTypeError, containing the given error. ++ (RACEvent *)eventWithError:(nullable NSError *)error; + +/// Returns a new event of type RACEventTypeNext, containing the given value. ++ (RACEvent *)eventWithValue:(nullable ValueType)value; + +/// The type of event represented by the receiver. +@property (nonatomic, assign, readonly) RACEventType eventType; + +/// Returns whether the receiver is of type RACEventTypeCompleted or +/// RACEventTypeError. +@property (nonatomic, getter = isFinished, assign, readonly) BOOL finished; + +/// The error associated with an event of type RACEventTypeError. This will be +/// nil for all other event types. +@property (nonatomic, strong, readonly, nullable) NSError *error; + +/// The value associated with an event of type RACEventTypeNext. This will be +/// nil for all other event types. +@property (nonatomic, strong, readonly, nullable) ValueType value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACEvent.m b/Pods/ReactiveObjC/ReactiveObjC/RACEvent.m new file mode 100644 index 0000000..01f9fff --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACEvent.m @@ -0,0 +1,112 @@ +// +// RACEvent.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-01-07. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACEvent.h" + +@interface RACEvent () + +// An object associated with this event. This will be used for the error and +// value properties. +@property (nonatomic, strong, readonly) id object; + +// Initializes the receiver with the given type and object. +- (instancetype)initWithEventType:(RACEventType)type object:(id)object; + +@end + +@implementation RACEvent + +#pragma mark Properties + +- (BOOL)isFinished { + return self.eventType == RACEventTypeCompleted || self.eventType == RACEventTypeError; +} + +- (NSError *)error { + return (self.eventType == RACEventTypeError ? self.object : nil); +} + +- (id)value { + return (self.eventType == RACEventTypeNext ? self.object : nil); +} + +#pragma mark Lifecycle + ++ (instancetype)completedEvent { + static dispatch_once_t pred; + static id singleton; + + dispatch_once(&pred, ^{ + singleton = [[self alloc] initWithEventType:RACEventTypeCompleted object:nil]; + }); + + return singleton; +} + ++ (instancetype)eventWithError:(NSError *)error { + return [[self alloc] initWithEventType:RACEventTypeError object:error]; +} + ++ (instancetype)eventWithValue:(id)value { + return [[self alloc] initWithEventType:RACEventTypeNext object:value]; +} + +- (instancetype)initWithEventType:(RACEventType)type object:(id)object { + self = [super init]; + + _eventType = type; + _object = object; + + return self; +} + +#pragma mark NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +#pragma mark NSObject + +- (NSString *)description { + NSString *eventDescription = nil; + + switch (self.eventType) { + case RACEventTypeCompleted: + eventDescription = @"completed"; + break; + + case RACEventTypeError: + eventDescription = [NSString stringWithFormat:@"error = %@", self.object]; + break; + + case RACEventTypeNext: + eventDescription = [NSString stringWithFormat:@"next = %@", self.object]; + break; + + default: + NSCAssert(NO, @"Unrecognized event type: %i", (int)self.eventType); + } + + return [NSString stringWithFormat:@"<%@: %p>{ %@ }", self.class, self, eventDescription]; +} + +- (NSUInteger)hash { + return self.eventType ^ [self.object hash]; +} + +- (BOOL)isEqual:(id)event { + if (event == self) return YES; + if (![event isKindOfClass:RACEvent.class]) return NO; + if (self.eventType != [event eventType]) return NO; + + // Catches the nil case too. + return self.object == [event object] || [self.object isEqual:[event object]]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.h new file mode 100644 index 0000000..0668076 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.h @@ -0,0 +1,23 @@ +// +// RACGroupedSignal.h +// ReactiveObjC +// +// Created by Josh Abernathy on 5/2/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubject.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A grouped signal is used by -[RACSignal groupBy:transform:]. +@interface RACGroupedSignal : RACSubject + +/// The key shared by the group. +@property (nonatomic, readonly, copy) id key; + ++ (instancetype)signalWithKey:(id)key; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.m new file mode 100644 index 0000000..a391ef2 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACGroupedSignal.m @@ -0,0 +1,25 @@ +// +// RACGroupedSignal.m +// ReactiveObjC +// +// Created by Josh Abernathy on 5/2/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACGroupedSignal.h" + +@interface RACGroupedSignal () +@property (nonatomic, copy) id key; +@end + +@implementation RACGroupedSignal + +#pragma mark API + ++ (instancetype)signalWithKey:(id)key { + RACGroupedSignal *subject = [self subject]; + subject.key = key; + return subject; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h new file mode 100644 index 0000000..edafe06 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.h @@ -0,0 +1,14 @@ +// +// RACImmediateScheduler.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" + +// A private scheduler which immediately executes its scheduled blocks. +@interface RACImmediateScheduler : RACScheduler + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.m new file mode 100644 index 0000000..7237801 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACImmediateScheduler.m @@ -0,0 +1,54 @@ +// +// RACImmediateScheduler.m +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACImmediateScheduler.h" +#import "RACScheduler+Private.h" + +@implementation RACImmediateScheduler + +#pragma mark Lifecycle + +- (instancetype)init { + return [super initWithName:@"org.reactivecocoa.ReactiveObjC.RACScheduler.immediateScheduler"]; +} + +#pragma mark RACScheduler + +- (RACDisposable *)schedule:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + block(); + return nil; +} + +- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(block != NULL); + + [NSThread sleepUntilDate:date]; + block(); + + return nil; +} + +- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { + NSCAssert(NO, @"+[RACScheduler immediateScheduler] does not support %@.", NSStringFromSelector(_cmd)); + return nil; +} + +- (RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock { + for (__block NSUInteger remaining = 1; remaining > 0; remaining--) { + recursiveBlock(^{ + remaining++; + }); + } + + return nil; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h new file mode 100644 index 0000000..c5a5a9a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.h @@ -0,0 +1,16 @@ +// +// RACIndexSetSequence.h +// ReactiveObjC +// +// Created by Sergey Gavrilyuk on 12/18/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSequence.h" + +// Private class that adapts an array to the RACSequence interface. +@interface RACIndexSetSequence : RACSequence + ++ (RACSequence *)sequenceWithIndexSet:(NSIndexSet *)indexSet; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.m new file mode 100644 index 0000000..8931c6c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACIndexSetSequence.m @@ -0,0 +1,111 @@ +// +// RACIndexSetSequence.m +// ReactiveObjC +// +// Created by Sergey Gavrilyuk on 12/18/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACIndexSetSequence.h" + +@interface RACIndexSetSequence () + +// A buffer holding the `NSUInteger` values to enumerate over. +// +// This is mostly used for memory management. Most access should go through +// `indexes` instead. +@property (nonatomic, strong, readonly) NSData *data; + +// The indexes that this sequence should enumerate. +@property (nonatomic, readonly) const NSUInteger *indexes; + +// The number of indexes to enumerate. +@property (nonatomic, readonly) NSUInteger count; + +@end + +@implementation RACIndexSetSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithIndexSet:(NSIndexSet *)indexSet { + NSUInteger count = indexSet.count; + + if (count == 0) return self.empty; + + NSUInteger sizeInBytes = sizeof(NSUInteger) * count; + + NSMutableData *data = [[NSMutableData alloc] initWithCapacity:sizeInBytes]; + [indexSet getIndexes:data.mutableBytes maxCount:count inIndexRange:NULL]; + + RACIndexSetSequence *seq = [[self alloc] init]; + seq->_data = data; + seq->_indexes = data.bytes; + seq->_count = count; + return seq; +} + ++ (instancetype)sequenceWithIndexSetSequence:(RACIndexSetSequence *)indexSetSequence offset:(NSUInteger)offset { + NSCParameterAssert(offset < indexSetSequence.count); + + RACIndexSetSequence *seq = [[self alloc] init]; + seq->_data = indexSetSequence.data; + seq->_indexes = indexSetSequence.indexes + offset; + seq->_count = indexSetSequence.count - offset; + return seq; +} + +#pragma mark RACSequence + +- (id)head { + return @(self.indexes[0]); +} + +- (RACSequence *)tail { + if (self.count <= 1) return [RACSequence empty]; + + return [self.class sequenceWithIndexSetSequence:self offset:1]; +} + +#pragma mark NSFastEnumeration + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id[])stackbuf count:(NSUInteger)len { + NSCParameterAssert(len > 0); + + if (state->state >= self.count) { + // Enumeration has completed. + return 0; + } + + if (state->state == 0) { + // Enumeration begun, mark the mutation flag. + state->mutationsPtr = state->extra; + } + + state->itemsPtr = stackbuf; + + unsigned long index = 0; + while (index < MIN(self.count - state->state, len)) { + stackbuf[index] = @(self.indexes[index + state->state]); + ++index; + } + + state->state += index; + return index; +} + +#pragma mark NSObject + +- (NSString *)description { + NSMutableString *indexesStr = [NSMutableString string]; + + for (unsigned int i = 0; i < self.count; ++i) { + if (i > 0) [indexesStr appendString:@", "]; + + [indexesStr appendFormat:@"%lu", (unsigned long)self.indexes[i]]; + } + + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, indexes = %@ }", self.class, self, self.name, indexesStr]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.h b/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.h new file mode 100644 index 0000000..05986cf --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.h @@ -0,0 +1,107 @@ +// +// RACKVOChannel.h +// ReactiveObjC +// +// Created by Uri Baghin on 27/12/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACChannel.h" +#import +#import "RACmetamacros.h" + +/// Creates a RACKVOChannel to the given key path. When the targeted object +/// deallocates, the channel will complete. +/// +/// If RACChannelTo() is used as an expression, it returns a RACChannelTerminal that +/// can be used to watch the specified property for changes, and set new values +/// for it. The terminal will start with the property's current value upon +/// subscription. +/// +/// If RACChannelTo() is used on the left-hand side of an assignment, there must a +/// RACChannelTerminal on the right-hand side of the assignment. The two will be +/// subscribed to one another: the property's value is immediately set to the +/// value of the channel terminal on the right-hand side, and subsequent changes +/// to either terminal will be reflected on the other. +/// +/// There are two different versions of this macro: +/// +/// - RACChannelTo(TARGET, KEYPATH, NILVALUE) will create a channel to the `KEYPATH` +/// of `TARGET`. If the terminal is ever sent a `nil` value, the property will +/// be set to `NILVALUE` instead. `NILVALUE` may itself be `nil` for object +/// properties, but an NSValue should be used for primitive properties, to +/// avoid an exception if `nil` is sent (which might occur if an intermediate +/// object is set to `nil`). +/// - RACChannelTo(TARGET, KEYPATH) is the same as the above, but `NILVALUE` defaults to +/// `nil`. +/// +/// Examples +/// +/// RACChannelTerminal *integerChannel = RACChannelTo(self, integerProperty, @42); +/// +/// // Sets self.integerProperty to 5. +/// [integerChannel sendNext:@5]; +/// +/// // Logs the current value of self.integerProperty, and all future changes. +/// [integerChannel subscribeNext:^(id value) { +/// NSLog(@"value: %@", value); +/// }]; +/// +/// // Binds properties to each other, taking the initial value from the right +/// side. +/// RACChannelTo(view, objectProperty) = RACChannelTo(model, objectProperty); +/// RACChannelTo(view, integerProperty, @2) = RACChannelTo(model, integerProperty, @10); +#define RACChannelTo(TARGET, ...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ + (RACChannelTo_(TARGET, __VA_ARGS__, nil)) \ + (RACChannelTo_(TARGET, __VA_ARGS__)) + +/// Do not use this directly. Use the RACChannelTo macro above. +#define RACChannelTo_(TARGET, KEYPATH, NILVALUE) \ + [[RACKVOChannel alloc] initWithTarget:(TARGET) keyPath:@keypath(TARGET, KEYPATH) nilValue:(NILVALUE)][@keypath(RACKVOChannel.new, followingTerminal)] + +NS_ASSUME_NONNULL_BEGIN + +/// A RACChannel that observes a KVO-compliant key path for changes. +@interface RACKVOChannel : RACChannel + +/// Initializes a channel that will observe the given object and key path. +/// +/// The current value of the key path, and future KVO notifications for the given +/// key path, will be sent to subscribers of the channel's `followingTerminal`. +/// Values sent to the `followingTerminal` will be set at the given key path using +/// key-value coding. +/// +/// When the target object deallocates, the channel will complete. Signal errors +/// are considered undefined behavior. +/// +/// This is the designated initializer for this class. +/// +/// target - The object to bind to. +/// keyPath - The key path to observe and set the value of. +/// nilValue - The value to set at the key path whenever a `nil` value is +/// received. This may be nil when connecting to object properties, but +/// an NSValue should be used for primitive properties, to avoid an +/// exception if `nil` is received (which might occur if an intermediate +/// object is set to `nil`). +#if OS_OBJECT_HAVE_OBJC_SUPPORT +- (instancetype)initWithTarget:(__weak NSObject *)target keyPath:(NSString *)keyPath nilValue:(nullable ValueType)nilValue; +#else +// Swift builds with OS_OBJECT_HAVE_OBJC_SUPPORT=0 for Playgrounds and LLDB :( +- (instancetype)initWithTarget:(NSObject *)target keyPath:(NSString *)keyPath nilValue:(nullable ValueType)nilValue; +#endif + +- (instancetype)init __attribute__((unavailable("Use -initWithTarget:keyPath:nilValue: instead"))); + +@end + +/// Methods needed for the convenience macro. Do not call explicitly. +@interface RACKVOChannel (RACChannelTo) + +- (RACChannelTerminal *)objectForKeyedSubscript:(NSString *)key; +- (void)setObject:(RACChannelTerminal *)otherTerminal forKeyedSubscript:(NSString *)key; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.m b/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.m new file mode 100644 index 0000000..24bd1fe --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOChannel.m @@ -0,0 +1,207 @@ +// +// RACKVOChannel.m +// ReactiveObjC +// +// Created by Uri Baghin on 27/12/2012. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACKVOChannel.h" +#import +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACKVOWrapper.h" +#import "NSString+RACKeyPathUtilities.h" +#import "RACChannel.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSignal+Operations.h" + +// Key for the array of RACKVOChannel's additional thread local +// data in the thread dictionary. +static NSString * const RACKVOChannelDataDictionaryKey = @"RACKVOChannelKey"; + +// Wrapper class for additional thread local data. +@interface RACKVOChannelData : NSObject + +// The flag used to ignore updates the channel itself has triggered. +@property (nonatomic, assign) BOOL ignoreNextUpdate; + +// A pointer to the owner of the data. Only use this for pointer comparison, +// never as an object reference. +@property (nonatomic, assign) void *owner; + ++ (instancetype)dataForChannel:(RACKVOChannel *)channel; + +@end + +@interface RACKVOChannel () + +// The object whose key path the channel is wrapping. +@property (atomic, weak) NSObject *target; + +// The key path the channel is wrapping. +@property (nonatomic, copy, readonly) NSString *keyPath; + +// Returns the existing thread local data container or nil if none exists. +@property (nonatomic, strong, readonly) RACKVOChannelData *currentThreadData; + +// Creates the thread local data container for the channel. +- (void)createCurrentThreadData; + +// Destroy the thread local data container for the channel. +- (void)destroyCurrentThreadData; + +@end + +@implementation RACKVOChannel + +#pragma mark Properties + +- (RACKVOChannelData *)currentThreadData { + NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; + + for (RACKVOChannelData *data in dataArray) { + if (data.owner == (__bridge void *)self) return data; + } + + return nil; +} + +#pragma mark Lifecycle + +- (instancetype)initWithTarget:(__weak NSObject *)target keyPath:(NSString *)keyPath nilValue:(id)nilValue { + NSCParameterAssert(keyPath.rac_keyPathComponents.count > 0); + + NSObject *strongTarget = target; + + self = [super init]; + + _target = target; + _keyPath = [keyPath copy]; + + [self.leadingTerminal setNameWithFormat:@"[-initWithTarget: %@ keyPath: %@ nilValue: %@] -leadingTerminal", target, keyPath, nilValue]; + [self.followingTerminal setNameWithFormat:@"[-initWithTarget: %@ keyPath: %@ nilValue: %@] -followingTerminal", target, keyPath, nilValue]; + + if (strongTarget == nil) { + [self.leadingTerminal sendCompleted]; + return self; + } + + // Observe the key path on target for changes and forward the changes to the + // terminal. + // + // Intentionally capturing `self` strongly in the blocks below, so the + // channel object stays alive while observing. + RACDisposable *observationDisposable = [strongTarget rac_observeKeyPath:keyPath options:NSKeyValueObservingOptionInitial observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) { + // If the change wasn't triggered by deallocation, only affects the last + // path component, and ignoreNextUpdate is set, then it was triggered by + // this channel and should not be forwarded. + if (!causedByDealloc && affectedOnlyLastComponent && self.currentThreadData.ignoreNextUpdate) { + [self destroyCurrentThreadData]; + return; + } + + [self.leadingTerminal sendNext:value]; + }]; + + NSString *keyPathByDeletingLastKeyPathComponent = keyPath.rac_keyPathByDeletingLastKeyPathComponent; + NSArray *keyPathComponents = keyPath.rac_keyPathComponents; + NSUInteger keyPathComponentsCount = keyPathComponents.count; + NSString *lastKeyPathComponent = keyPathComponents.lastObject; + + // Update the value of the property with the values received. + [[self.leadingTerminal + finally:^{ + [observationDisposable dispose]; + }] + subscribeNext:^(id x) { + // Check the value of the second to last key path component. Since the + // channel can only update the value of a property on an object, and not + // update intermediate objects, it can only update the value of the whole + // key path if this object is not nil. + NSObject *object = (keyPathComponentsCount > 1 ? [self.target valueForKeyPath:keyPathByDeletingLastKeyPathComponent] : self.target); + if (object == nil) return; + + // Set the ignoreNextUpdate flag before setting the value so this channel + // ignores the value in the subsequent -didChangeValueForKey: callback. + [self createCurrentThreadData]; + self.currentThreadData.ignoreNextUpdate = YES; + + [object setValue:x ?: nilValue forKey:lastKeyPathComponent]; + } error:^(NSError *error) { + NSCAssert(NO, @"Received error in %@: %@", self, error); + + // Log the error if we're running with assertions disabled. + NSLog(@"Received error in %@: %@", self, error); + }]; + + // Capture `self` weakly for the target's deallocation disposable, so we can + // freely deallocate if we complete before then. + @weakify(self); + + [strongTarget.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + @strongify(self); + [self.leadingTerminal sendCompleted]; + self.target = nil; + }]]; + + return self; +} + +- (void)createCurrentThreadData { + NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; + if (dataArray == nil) { + dataArray = [NSMutableArray array]; + NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey] = dataArray; + [dataArray addObject:[RACKVOChannelData dataForChannel:self]]; + return; + } + + for (RACKVOChannelData *data in dataArray) { + if (data.owner == (__bridge void *)self) return; + } + + [dataArray addObject:[RACKVOChannelData dataForChannel:self]]; +} + +- (void)destroyCurrentThreadData { + NSMutableArray *dataArray = NSThread.currentThread.threadDictionary[RACKVOChannelDataDictionaryKey]; + NSUInteger index = [dataArray indexOfObjectPassingTest:^ BOOL (RACKVOChannelData *data, NSUInteger idx, BOOL *stop) { + return data.owner == (__bridge void *)self; + }]; + + if (index != NSNotFound) [dataArray removeObjectAtIndex:index]; +} + +@end + +@implementation RACKVOChannel (RACChannelTo) + +- (RACChannelTerminal *)objectForKeyedSubscript:(NSString *)key { + NSCParameterAssert(key != nil); + + RACChannelTerminal *terminal = [self valueForKey:key]; + NSCAssert([terminal isKindOfClass:RACChannelTerminal.class], @"Key \"%@\" does not identify a channel terminal", key); + + return terminal; +} + +- (void)setObject:(RACChannelTerminal *)otherTerminal forKeyedSubscript:(NSString *)key { + NSCParameterAssert(otherTerminal != nil); + + RACChannelTerminal *selfTerminal = [self objectForKeyedSubscript:key]; + [otherTerminal subscribe:selfTerminal]; + [[selfTerminal skip:1] subscribe:otherTerminal]; +} + +@end + +@implementation RACKVOChannelData + ++ (instancetype)dataForChannel:(RACKVOChannel *)channel { + RACKVOChannelData *data = [[self alloc] init]; + data->_owner = (__bridge void *)channel; + return data; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.h b/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.h new file mode 100644 index 0000000..7e49793 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.h @@ -0,0 +1,34 @@ +// +// RACKVOProxy.h +// ReactiveObjC +// +// Created by Richard Speyer on 4/10/14. +// Copyright (c) 2014 GitHub, Inc. All rights reserved. +// + +#import + +/// A singleton that can act as a proxy between a KVO observation and a RAC +/// subscriber, in order to protect against KVO lifetime issues. +@interface RACKVOProxy : NSObject + +/// Returns the singleton KVO proxy object. ++ (instancetype)sharedProxy; + +/// Registers an observer with the proxy, such that when the proxy receives a +/// KVO change with the given context, it forwards it to the observer. +/// +/// observer - True observer of the KVO change. Must not be nil. +/// context - Arbitrary context object used to differentiate multiple +/// observations of the same keypath. Must be unique, cannot be nil. +- (void)addObserver:(__weak NSObject *)observer forContext:(void *)context; + +/// Removes an observer from the proxy. Parameters must match those passed to +/// addObserver:forContext:. +/// +/// observer - True observer of the KVO change. Must not be nil. +/// context - Arbitrary context object used to differentiate multiple +/// observations of the same keypath. Must be unique, cannot be nil. +- (void)removeObserver:(NSObject *)observer forContext:(void *)context; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.m b/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.m new file mode 100644 index 0000000..706b3a1 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOProxy.m @@ -0,0 +1,69 @@ +// +// RACKVOProxy.m +// ReactiveObjC +// +// Created by Richard Speyer on 4/10/14. +// Copyright (c) 2014 GitHub, Inc. All rights reserved. +// + +#import "RACKVOProxy.h" + +@interface RACKVOProxy() + +@property (strong, nonatomic, readonly) NSMapTable *trampolines; +@property (strong, nonatomic, readonly) dispatch_queue_t queue; + +@end + +@implementation RACKVOProxy + ++ (instancetype)sharedProxy { + static RACKVOProxy *proxy; + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + proxy = [[self alloc] init]; + }); + + return proxy; +} + +- (instancetype)init { + self = [super init]; + + _queue = dispatch_queue_create("org.reactivecocoa.ReactiveObjC.RACKVOProxy", DISPATCH_QUEUE_SERIAL); + _trampolines = [NSMapTable strongToWeakObjectsMapTable]; + + return self; +} + +- (void)addObserver:(__weak NSObject *)observer forContext:(void *)context { + NSValue *valueContext = [NSValue valueWithPointer:context]; + + dispatch_sync(self.queue, ^{ + [self.trampolines setObject:observer forKey:valueContext]; + }); +} + +- (void)removeObserver:(NSObject *)observer forContext:(void *)context { + NSValue *valueContext = [NSValue valueWithPointer:context]; + + dispatch_sync(self.queue, ^{ + [self.trampolines removeObjectForKey:valueContext]; + }); +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + NSValue *valueContext = [NSValue valueWithPointer:context]; + __block NSObject *trueObserver; + + dispatch_sync(self.queue, ^{ + trueObserver = [self.trampolines objectForKey:valueContext]; + }); + + if (trueObserver != nil) { + [trueObserver observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h b/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h new file mode 100644 index 0000000..be44fe9 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.h @@ -0,0 +1,31 @@ +// +// RACKVOTrampoline.h +// ReactiveObjC +// +// Created by Josh Abernathy on 1/15/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import +#import "NSObject+RACKVOWrapper.h" +#import "RACDisposable.h" + +// A private trampoline object that represents a KVO observation. +// +// Disposing of the trampoline will stop observation. +@interface RACKVOTrampoline : RACDisposable + +// Initializes the receiver with the given parameters. +// +// target - The object whose key path should be observed. Cannot be nil. +// observer - The object that gets notified when the value at the key path +// changes. Can be nil. +// keyPath - The key path on `target` to observe. Cannot be nil. +// options - Any key value observing options to use in the observation. +// block - The block to call when the value at the observed key path changes. +// Cannot be nil. +// +// Returns the initialized object. +- (instancetype)initWithTarget:(__weak NSObject *)target observer:(__weak NSObject *)observer keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.m b/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.m new file mode 100644 index 0000000..22428d8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACKVOTrampoline.m @@ -0,0 +1,109 @@ +// +// RACKVOTrampoline.m +// ReactiveObjC +// +// Created by Josh Abernathy on 1/15/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACKVOTrampoline.h" +#import "NSObject+RACDeallocating.h" +#import "RACCompoundDisposable.h" +#import "RACKVOProxy.h" + +@interface RACKVOTrampoline () + +// The keypath which the trampoline is observing. +@property (nonatomic, readonly, copy) NSString *keyPath; + +// These properties should only be manipulated while synchronized on the +// receiver. +@property (nonatomic, readonly, copy) RACKVOBlock block; +@property (nonatomic, readonly, unsafe_unretained) NSObject *unsafeTarget; +@property (nonatomic, readonly, weak) NSObject *weakTarget; +@property (nonatomic, readonly, weak) NSObject *observer; + +@end + +@implementation RACKVOTrampoline + +#pragma mark Lifecycle + +- (instancetype)initWithTarget:(__weak NSObject *)target observer:(__weak NSObject *)observer keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(RACKVOBlock)block { + NSCParameterAssert(keyPath != nil); + NSCParameterAssert(block != nil); + + NSObject *strongTarget = target; + if (strongTarget == nil) return nil; + + self = [super init]; + + _keyPath = [keyPath copy]; + + _block = [block copy]; + _weakTarget = target; + _unsafeTarget = strongTarget; + _observer = observer; + + [RACKVOProxy.sharedProxy addObserver:self forContext:(__bridge void *)self]; + [strongTarget addObserver:RACKVOProxy.sharedProxy forKeyPath:self.keyPath options:options context:(__bridge void *)self]; + + [strongTarget.rac_deallocDisposable addDisposable:self]; + [self.observer.rac_deallocDisposable addDisposable:self]; + + return self; +} + +- (void)dealloc { + [self dispose]; +} + +#pragma mark Observation + +- (void)dispose { + NSObject *target; + NSObject *observer; + + @synchronized (self) { + _block = nil; + + // The target should still exist at this point, because we still need to + // tear down its KVO observation. Therefore, we can use the unsafe + // reference (and need to, because the weak one will have been zeroed by + // now). + target = self.unsafeTarget; + observer = self.observer; + + _unsafeTarget = nil; + _observer = nil; + } + + [target.rac_deallocDisposable removeDisposable:self]; + [observer.rac_deallocDisposable removeDisposable:self]; + + [target removeObserver:RACKVOProxy.sharedProxy forKeyPath:self.keyPath context:(__bridge void *)self]; + [RACKVOProxy.sharedProxy removeObserver:self forContext:(__bridge void *)self]; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if (context != (__bridge void *)self) { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + return; + } + + RACKVOBlock block; + id observer; + id target; + + @synchronized (self) { + block = self.block; + observer = self.observer; + target = self.weakTarget; + } + + if (block == nil || target == nil) return; + + block(target, observer, change); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection+Private.h b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection+Private.h new file mode 100644 index 0000000..9b150f1 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection+Private.h @@ -0,0 +1,17 @@ +// +// RACMulticastConnection+Private.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACMulticastConnection.h" + +@class RACSubject; + +@interface RACMulticastConnection<__covariant ValueType> () + +- (instancetype)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.h b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.h new file mode 100644 index 0000000..7b7dbf8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.h @@ -0,0 +1,53 @@ +// +// RACMulticastConnection.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import "RACAnnotations.h" + +@class RACDisposable; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +/// A multicast connection encapsulates the idea of sharing one subscription to a +/// signal to many subscribers. This is most often needed if the subscription to +/// the underlying signal involves side-effects or shouldn't be called more than +/// once. +/// +/// The multicasted signal is only subscribed to when +/// -[RACMulticastConnection connect] is called. Until that happens, no values +/// will be sent on `signal`. See -[RACMulticastConnection autoconnect] for how +/// -[RACMulticastConnection connect] can be called automatically. +/// +/// Note that you shouldn't create RACMulticastConnection manually. Instead use +/// -[RACSignal publish] or -[RACSignal multicast:]. +@interface RACMulticastConnection<__covariant ValueType> : NSObject + +/// The multicasted signal. +@property (nonatomic, strong, readonly) RACSignal *signal; + +/// Connect to the underlying signal by subscribing to it. Calling this multiple +/// times does nothing but return the existing connection's disposable. +/// +/// Returns the disposable for the subscription to the multicasted signal. +- (RACDisposable *)connect; + +/// Connects to the underlying signal when the returned signal is first +/// subscribed to, and disposes of the subscription to the multicasted signal +/// when the returned signal has no subscribers. +/// +/// If new subscribers show up after being disposed, they'll subscribe and then +/// be immediately disposed of. The returned signal will never re-connect to the +/// multicasted signal. +/// +/// Returns the autoconnecting signal. +- (RACSignal *)autoconnect RAC_WARN_UNUSED_RESULT; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.m b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.m new file mode 100644 index 0000000..f598245 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACMulticastConnection.m @@ -0,0 +1,84 @@ +// +// RACMulticastConnection.m +// ReactiveObjC +// +// Created by Josh Abernathy on 4/11/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACMulticastConnection.h" +#import "RACMulticastConnection+Private.h" +#import "RACDisposable.h" +#import "RACSerialDisposable.h" +#import "RACSubject.h" +#import + +@interface RACMulticastConnection () { + RACSubject *_signal; + + // When connecting, a caller should attempt to atomically swap the value of this + // from `0` to `1`. + // + // If the swap is successful the caller is resposible for subscribing `_signal` + // to `sourceSignal` and storing the returned disposable in `serialDisposable`. + // + // If the swap is unsuccessful it means that `_sourceSignal` has already been + // connected and the caller has no action to take. + int32_t volatile _hasConnected; +} + +@property (nonatomic, readonly, strong) RACSignal *sourceSignal; +@property (strong) RACSerialDisposable *serialDisposable; +@end + +@implementation RACMulticastConnection + +#pragma mark Lifecycle + +- (instancetype)initWithSourceSignal:(RACSignal *)source subject:(RACSubject *)subject { + NSCParameterAssert(source != nil); + NSCParameterAssert(subject != nil); + + self = [super init]; + + _sourceSignal = source; + _serialDisposable = [[RACSerialDisposable alloc] init]; + _signal = subject; + + return self; +} + +#pragma mark Connecting + +- (RACDisposable *)connect { + BOOL shouldConnect = OSAtomicCompareAndSwap32Barrier(0, 1, &_hasConnected); + + if (shouldConnect) { + self.serialDisposable.disposable = [self.sourceSignal subscribe:_signal]; + } + + return self.serialDisposable; +} + +- (RACSignal *)autoconnect { + __block volatile int32_t subscriberCount = 0; + + return [[RACSignal + createSignal:^(id subscriber) { + OSAtomicIncrement32Barrier(&subscriberCount); + + RACDisposable *subscriptionDisposable = [self.signal subscribe:subscriber]; + RACDisposable *connectionDisposable = [self connect]; + + return [RACDisposable disposableWithBlock:^{ + [subscriptionDisposable dispose]; + + if (OSAtomicDecrement32Barrier(&subscriberCount) == 0) { + [connectionDisposable dispose]; + } + }]; + }] + setNameWithFormat:@"[%@] -autoconnect", self.signal.name]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h b/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h new file mode 100644 index 0000000..bfad4a4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.h @@ -0,0 +1,29 @@ +// +// RACPassthroughSubscriber.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-06-13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import +#import "RACSubscriber.h" + +@class RACCompoundDisposable; +@class RACSignal<__covariant ValueType>; + +// A private subscriber that passes through all events to another subscriber +// while not disposed. +@interface RACPassthroughSubscriber : NSObject + +// Initializes the receiver to pass through events until disposed. +// +// subscriber - The subscriber to forward events to. This must not be nil. +// signal - The signal that will be sending events to the receiver. +// disposable - When this disposable is disposed, no more events will be +// forwarded. This must not be nil. +// +// Returns an initialized passthrough subscriber. +- (instancetype)initWithSubscriber:(id)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.m b/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.m new file mode 100644 index 0000000..c8a7ab5 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACPassthroughSubscriber.m @@ -0,0 +1,106 @@ +// +// RACPassthroughSubscriber.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-06-13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACPassthroughSubscriber.h" +#import "RACCompoundDisposable.h" +#import "RACSignal.h" +#import "RACSignalProvider.h" + +#if !defined(DTRACE_PROBES_DISABLED) || !DTRACE_PROBES_DISABLED + +static const char *cleanedDTraceString(NSString *original) { + return [original stringByReplacingOccurrencesOfString:@"\\s+" withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, original.length)].UTF8String; +} + +static const char *cleanedSignalDescription(RACSignal *signal) { + NSString *desc = signal.description; + + NSRange range = [desc rangeOfString:@" name:"]; + if (range.location != NSNotFound) { + desc = [desc stringByReplacingCharactersInRange:range withString:@""]; + } + + return cleanedDTraceString(desc); +} + +#endif + +@interface RACPassthroughSubscriber () + +// The subscriber to which events should be forwarded. +@property (nonatomic, strong, readonly) id innerSubscriber; + +// The signal sending events to this subscriber. +// +// This property isn't `weak` because it's only used for DTrace probes, so +// a zeroing weak reference would incur an unnecessary performance penalty in +// normal usage. +@property (nonatomic, unsafe_unretained, readonly) RACSignal *signal; + +// A disposable representing the subscription. When disposed, no further events +// should be sent to the `innerSubscriber`. +@property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; + +@end + +@implementation RACPassthroughSubscriber + +#pragma mark Lifecycle + +- (instancetype)initWithSubscriber:(id)subscriber signal:(RACSignal *)signal disposable:(RACCompoundDisposable *)disposable { + NSCParameterAssert(subscriber != nil); + + self = [super init]; + + _innerSubscriber = subscriber; + _signal = signal; + _disposable = disposable; + + [self.innerSubscriber didSubscribeWithDisposable:self.disposable]; + return self; +} + +#pragma mark RACSubscriber + +- (void)sendNext:(id)value { + if (self.disposable.disposed) return; + + if (RACSIGNAL_NEXT_ENABLED()) { + RACSIGNAL_NEXT(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString([value description])); + } + + [self.innerSubscriber sendNext:value]; +} + +- (void)sendError:(NSError *)error { + if (self.disposable.disposed) return; + + if (RACSIGNAL_ERROR_ENABLED()) { + RACSIGNAL_ERROR(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description), cleanedDTraceString(error.description)); + } + + [self.innerSubscriber sendError:error]; +} + +- (void)sendCompleted { + if (self.disposable.disposed) return; + + if (RACSIGNAL_COMPLETED_ENABLED()) { + RACSIGNAL_COMPLETED(cleanedSignalDescription(self.signal), cleanedDTraceString(self.innerSubscriber.description)); + } + + [self.innerSubscriber sendCompleted]; +} + +- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable { + if (disposable != self.disposable) { + [self.disposable addDisposable:disposable]; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h new file mode 100644 index 0000000..74c4586 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler+Subclass.h @@ -0,0 +1,44 @@ +// +// RACQueueScheduler+Subclass.h +// ReactiveObjC +// +// Created by Josh Abernathy on 6/6/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACQueueScheduler.h" +#import "RACScheduler+Subclass.h" + +NS_ASSUME_NONNULL_BEGIN + +/// An interface for use by GCD queue-based subclasses. +/// +/// See RACScheduler+Subclass.h for subclassing notes. +@interface RACQueueScheduler () + +/// The queue on which blocks are enqueued. +#if OS_OBJECT_USE_OBJC +@property (nonatomic, strong, readonly) dispatch_queue_t queue; +#else +// Swift builds with OS_OBJECT_HAVE_OBJC_SUPPORT=0 for Playgrounds and LLDB :( +@property (nonatomic, assign, readonly) dispatch_queue_t queue; +#endif + +/// Initializes the receiver with the name of the scheduler and the queue which +/// the scheduler should use. +/// +/// name - The name of the scheduler. If nil, a default name will be used. +/// queue - The queue upon which the receiver should enqueue scheduled blocks. +/// This argument must not be NULL. +/// +/// Returns the initialized object. +- (instancetype)initWithName:(nullable NSString *)name queue:(dispatch_queue_t)queue; + +/// Converts a date into a GCD time using dispatch_walltime(). +/// +/// date - The date to convert. This must not be nil. ++ (dispatch_time_t)wallTimeWithDate:(NSDate *)date; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.h new file mode 100644 index 0000000..3b317b0 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.h @@ -0,0 +1,22 @@ +// +// RACQueueScheduler.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +/// An abstract scheduler which asynchronously enqueues all its work to a Grand +/// Central Dispatch queue. +/// +/// Because RACQueueScheduler is abstract, it should not be instantiated +/// directly. Create a subclass using the `RACQueueScheduler+Subclass.h` +/// interface and use that instead. +@interface RACQueueScheduler : RACScheduler +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.m new file mode 100644 index 0000000..d9dd189 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACQueueScheduler.m @@ -0,0 +1,106 @@ +// +// RACQueueScheduler.m +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACQueueScheduler.h" +#import "RACDisposable.h" +#import "RACQueueScheduler+Subclass.h" +#import "RACScheduler+Private.h" + +@implementation RACQueueScheduler + +#pragma mark Lifecycle + +- (instancetype)initWithName:(NSString *)name queue:(dispatch_queue_t)queue { + NSCParameterAssert(queue != NULL); + + self = [super initWithName:name]; + + _queue = queue; +#if !OS_OBJECT_USE_OBJC + dispatch_retain(_queue); +#endif + + return self; +} + +#if !OS_OBJECT_USE_OBJC + +- (void)dealloc { + if (_queue != NULL) { + dispatch_release(_queue); + _queue = NULL; + } +} + +#endif + +#pragma mark Date Conversions + ++ (dispatch_time_t)wallTimeWithDate:(NSDate *)date { + NSCParameterAssert(date != nil); + + double seconds = 0; + double frac = modf(date.timeIntervalSince1970, &seconds); + + struct timespec walltime = { + .tv_sec = (time_t)fmin(fmax(seconds, LONG_MIN), LONG_MAX), + .tv_nsec = (long)fmin(fmax(frac * NSEC_PER_SEC, LONG_MIN), LONG_MAX) + }; + + return dispatch_walltime(&walltime, 0); +} + +#pragma mark RACScheduler + +- (RACDisposable *)schedule:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + RACDisposable *disposable = [[RACDisposable alloc] init]; + + dispatch_async(self.queue, ^{ + if (disposable.disposed) return; + [self performAsCurrentScheduler:block]; + }); + + return disposable; +} + +- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(block != NULL); + + RACDisposable *disposable = [[RACDisposable alloc] init]; + + dispatch_after([self.class wallTimeWithDate:date], self.queue, ^{ + if (disposable.disposed) return; + [self performAsCurrentScheduler:block]; + }); + + return disposable; +} + +- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(interval > 0.0 && interval < INT64_MAX / NSEC_PER_SEC); + NSCParameterAssert(leeway >= 0.0 && leeway < INT64_MAX / NSEC_PER_SEC); + NSCParameterAssert(block != NULL); + + uint64_t intervalInNanoSecs = (uint64_t)(interval * NSEC_PER_SEC); + uint64_t leewayInNanoSecs = (uint64_t)(leeway * NSEC_PER_SEC); + + dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.queue); + dispatch_source_set_timer(timer, [self.class wallTimeWithDate:date], intervalInNanoSecs, leewayInNanoSecs); + dispatch_source_set_event_handler(timer, block); + dispatch_resume(timer); + + return [RACDisposable disposableWithBlock:^{ + dispatch_source_cancel(timer); + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.h b/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.h new file mode 100644 index 0000000..b82c8a0 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.h @@ -0,0 +1,26 @@ +// +// RACReplaySubject.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/14/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubject.h" + +NS_ASSUME_NONNULL_BEGIN + +extern const NSUInteger RACReplaySubjectUnlimitedCapacity; + +/// A replay subject saves the values it is sent (up to its defined capacity) +/// and resends those to new subscribers. It will also replay an error or +/// completion. +@interface RACReplaySubject : RACSubject + +/// Creates a new replay subject with the given capacity. A capacity of +/// RACReplaySubjectUnlimitedCapacity means values are never trimmed. ++ (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.m b/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.m new file mode 100644 index 0000000..30475fa --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACReplaySubject.m @@ -0,0 +1,111 @@ +// +// RACReplaySubject.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/14/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACReplaySubject.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACScheduler+Private.h" +#import "RACSubscriber.h" +#import "RACTuple.h" + +const NSUInteger RACReplaySubjectUnlimitedCapacity = NSUIntegerMax; + +@interface RACReplaySubject () + +@property (nonatomic, assign, readonly) NSUInteger capacity; + +// These properties should only be modified while synchronized on self. +@property (nonatomic, strong, readonly) NSMutableArray *valuesReceived; +@property (nonatomic, assign) BOOL hasCompleted; +@property (nonatomic, assign) BOOL hasError; +@property (nonatomic, strong) NSError *error; + +@end + + +@implementation RACReplaySubject + +#pragma mark Lifecycle + ++ (instancetype)replaySubjectWithCapacity:(NSUInteger)capacity { + return [(RACReplaySubject *)[self alloc] initWithCapacity:capacity]; +} + +- (instancetype)init { + return [self initWithCapacity:RACReplaySubjectUnlimitedCapacity]; +} + +- (instancetype)initWithCapacity:(NSUInteger)capacity { + self = [super init]; + + _capacity = capacity; + _valuesReceived = (capacity == RACReplaySubjectUnlimitedCapacity ? [NSMutableArray array] : [NSMutableArray arrayWithCapacity:capacity]); + + return self; +} + +#pragma mark RACSignal + +- (RACDisposable *)subscribe:(id)subscriber { + RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; + + RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{ + @synchronized (self) { + for (id value in self.valuesReceived) { + if (compoundDisposable.disposed) return; + + [subscriber sendNext:(value == RACTupleNil.tupleNil ? nil : value)]; + } + + if (compoundDisposable.disposed) return; + + if (self.hasCompleted) { + [subscriber sendCompleted]; + } else if (self.hasError) { + [subscriber sendError:self.error]; + } else { + RACDisposable *subscriptionDisposable = [super subscribe:subscriber]; + [compoundDisposable addDisposable:subscriptionDisposable]; + } + } + }]; + + [compoundDisposable addDisposable:schedulingDisposable]; + + return compoundDisposable; +} + +#pragma mark RACSubscriber + +- (void)sendNext:(id)value { + @synchronized (self) { + [self.valuesReceived addObject:value ?: RACTupleNil.tupleNil]; + [super sendNext:value]; + + if (self.capacity != RACReplaySubjectUnlimitedCapacity && self.valuesReceived.count > self.capacity) { + [self.valuesReceived removeObjectsInRange:NSMakeRange(0, self.valuesReceived.count - self.capacity)]; + } + } +} + +- (void)sendCompleted { + @synchronized (self) { + self.hasCompleted = YES; + [super sendCompleted]; + } +} + +- (void)sendError:(NSError *)e { + @synchronized (self) { + self.hasError = YES; + self.error = e; + [super sendError:e]; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.h new file mode 100644 index 0000000..00360d2 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.h @@ -0,0 +1,17 @@ +// +// RACReturnSignal.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" + +// A private `RACSignal` subclasses that synchronously sends a value to any +// subscribers, then completes. +@interface RACReturnSignal<__covariant ValueType> : RACSignal + ++ (RACSignal *)return:(ValueType)value; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.m new file mode 100644 index 0000000..dca319d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACReturnSignal.m @@ -0,0 +1,90 @@ +// +// RACReturnSignal.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-10-10. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACReturnSignal.h" +#import "RACScheduler+Private.h" +#import "RACSubscriber.h" +#import "RACUnit.h" + +@interface RACReturnSignal () + +// The value to send upon subscription. +@property (nonatomic, strong, readonly) id value; + +@end + +@implementation RACReturnSignal + +#pragma mark Properties + +// Only allow this signal's name to be customized in DEBUG, since it's +// potentially a singleton in release builds (see +return:). +- (void)setName:(NSString *)name { +#ifdef DEBUG + [super setName:name]; +#endif +} + +- (NSString *)name { +#ifdef DEBUG + return super.name; +#else + return @"+return:"; +#endif +} + +#pragma mark Lifecycle + ++ (RACSignal *)return:(id)value { +#ifndef DEBUG + // In release builds, use singletons for two very common cases. + if (value == RACUnit.defaultUnit) { + static RACReturnSignal *unitSingleton; + static dispatch_once_t unitPred; + + dispatch_once(&unitPred, ^{ + unitSingleton = [[self alloc] init]; + unitSingleton->_value = RACUnit.defaultUnit; + }); + + return unitSingleton; + } else if (value == nil) { + static RACReturnSignal *nilSingleton; + static dispatch_once_t nilPred; + + dispatch_once(&nilPred, ^{ + nilSingleton = [[self alloc] init]; + nilSingleton->_value = nil; + }); + + return nilSingleton; + } +#endif + + RACReturnSignal *signal = [[self alloc] init]; + signal->_value = value; + +#ifdef DEBUG + [signal setNameWithFormat:@"+return: %@", value]; +#endif + + return signal; +} + +#pragma mark Subscription + +- (RACDisposable *)subscribe:(id)subscriber { + NSCParameterAssert(subscriber != nil); + + return [RACScheduler.subscriptionScheduler schedule:^{ + [subscriber sendNext:self.value]; + [subscriber sendCompleted]; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Private.h b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Private.h new file mode 100644 index 0000000..55d6096 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Private.h @@ -0,0 +1,38 @@ +// +// RACScheduler+Private.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/29/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +// The thread-specific current scheduler key. +extern NSString * const RACSchedulerCurrentSchedulerKey; + +// A private interface for internal RAC use only. +@interface RACScheduler () + +// A dedicated scheduler that fills two requirements: +// +// 1. By the time subscription happens, we need a valid +currentScheduler. +// 2. Subscription should happen as soon as possible. +// +// To fulfill those two, if we already have a valid +currentScheduler, it +// immediately executes scheduled blocks. If we don't, it will execute scheduled +// blocks with a private background scheduler. ++ (instancetype)subscriptionScheduler; + +// Initializes the receiver with the given name. +// +// name - The name of the scheduler. If nil, a default name will be used. +// +// Returns the initialized object. +- (instancetype)initWithName:(nullable NSString *)name; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h new file mode 100644 index 0000000..34d1037 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler+Subclass.h @@ -0,0 +1,33 @@ +// +// RACScheduler.m +// ReactiveObjC +// +// Created by Miķelis Vindavs on 5/27/14. +// Copyright (c) 2014 GitHub, Inc. All rights reserved. +// + +#import +#import "RACScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +/// An interface for use by subclasses. +/// +/// Subclasses should use `-performAsCurrentScheduler:` to do the actual block +/// invocation so that +[RACScheduler currentScheduler] behaves as expected. +/// +/// **Note that RACSchedulers are expected to be serial**. Subclasses must honor +/// that contract. See `RACTargetQueueScheduler` for a queue-based scheduler +/// which will enforce the serialization guarantee. +@interface RACScheduler () + +/// Performs the given block with the receiver as the current scheduler for +/// its thread. This should only be called by subclasses to perform their +/// scheduled blocks. +/// +/// block - The block to execute. Cannot be NULL. +- (void)performAsCurrentScheduler:(void (^)(void))block; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.h new file mode 100644 index 0000000..c780e33 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.h @@ -0,0 +1,146 @@ +// +// RACScheduler.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// The priority for the scheduler. +/// +/// RACSchedulerPriorityHigh - High priority. +/// RACSchedulerPriorityDefault - Default priority. +/// RACSchedulerPriorityLow - Low priority. +/// RACSchedulerPriorityBackground - Background priority. +typedef enum : long { + RACSchedulerPriorityHigh = DISPATCH_QUEUE_PRIORITY_HIGH, + RACSchedulerPriorityDefault = DISPATCH_QUEUE_PRIORITY_DEFAULT, + RACSchedulerPriorityLow = DISPATCH_QUEUE_PRIORITY_LOW, + RACSchedulerPriorityBackground = DISPATCH_QUEUE_PRIORITY_BACKGROUND, +} RACSchedulerPriority; + +/// Scheduled with -scheduleRecursiveBlock:, this type of block is passed a block +/// with which it can call itself recursively. +typedef void (^RACSchedulerRecursiveBlock)(void (^reschedule)(void)); + +@class RACDisposable; + +/// Schedulers are used to control when and where work is performed. +@interface RACScheduler : NSObject + +/// A singleton scheduler that immediately executes the blocks it is given. +/// +/// **Note:** Unlike most other schedulers, this does not set the current +/// scheduler. There may still be a valid +currentScheduler if this is used +/// within a block scheduled on a different scheduler. ++ (RACScheduler *)immediateScheduler; + +/// A singleton scheduler that executes blocks in the main thread. ++ (RACScheduler *)mainThreadScheduler; + +/// Creates and returns a new background scheduler with the given priority and +/// name. The name is for debug and instrumentation purposes only. +/// +/// Scheduler creation is cheap. It's unnecessary to save the result of this +/// method call unless you want to serialize some actions on the same background +/// scheduler. ++ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority name:(nullable NSString *)name; + +/// Invokes +schedulerWithPriority:name: with a default name. ++ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority; + +/// Invokes +schedulerWithPriority: with RACSchedulerPriorityDefault. ++ (RACScheduler *)scheduler; + +/// The current scheduler. This will only be valid when used from within a +/// -[RACScheduler schedule:] block or when on the main thread. ++ (nullable RACScheduler *)currentScheduler; + +/// Schedule the given block for execution on the scheduler. +/// +/// Scheduled blocks will be executed in the order in which they were scheduled. +/// +/// block - The block to schedule for execution. Cannot be nil. +/// +/// Returns a disposable which can be used to cancel the scheduled block before +/// it begins executing, or nil if cancellation is not supported. +- (nullable RACDisposable *)schedule:(void (^)(void))block; + +/// Schedule the given block for execution on the scheduler at or after +/// a specific time. +/// +/// Note that blocks scheduled for a certain time will not preempt any other +/// scheduled work that is executing at the time. +/// +/// When invoked on the +immediateScheduler, the calling thread **will block** +/// until the specified time. +/// +/// date - The earliest time at which `block` should begin executing. The block +/// may not execute immediately at this time, whether due to system load +/// or another block on the scheduler currently being run. Cannot be nil. +/// block - The block to schedule for execution. Cannot be nil. +/// +/// Returns a disposable which can be used to cancel the scheduled block before +/// it begins executing, or nil if cancellation is not supported. +- (nullable RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block; + +/// Schedule the given block for execution on the scheduler after the delay. +/// +/// Converts the delay into an NSDate, then invokes `-after:schedule:`. +- (nullable RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block; + +/// Reschedule the given block at a particular interval, starting at a specific +/// time, and with a given leeway for deferral. +/// +/// Note that blocks scheduled for a certain time will not preempt any other +/// scheduled work that is executing at the time. +/// +/// Regardless of the value of `leeway`, the given block may not execute exactly +/// at `when` or exactly on successive intervals, whether due to system load or +/// because another block is currently being run on the scheduler. +/// +/// It is considered undefined behavior to invoke this method on the +/// +immediateScheduler. +/// +/// date - The earliest time at which `block` should begin executing. The +/// block may not execute immediately at this time, whether due to +/// system load or another block on the scheduler currently being +/// run. Cannot be nil. +/// interval - The interval at which the block should be rescheduled, starting +/// from `date`. This will use the system wall clock, to avoid +/// skew when the computer goes to sleep. +/// leeway - A hint to the system indicating the number of seconds that each +/// scheduling can be deferred. Note that this is just a hint, and +/// there may be some additional latency no matter what. +/// block - The block to repeatedly schedule for execution. Cannot be nil. +/// +/// Returns a disposable which can be used to cancel the automatic scheduling and +/// rescheduling, or nil if cancellation is not supported. +- (nullable RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block; + +/// Schedule the given recursive block for execution on the scheduler. The +/// scheduler will automatically flatten any recursive scheduling into iteration +/// instead, so this can be used without issue for blocks that may keep invoking +/// themselves forever. +/// +/// Scheduled blocks will be executed in the order in which they were scheduled. +/// +/// recursiveBlock - The block to schedule for execution. When invoked, the +/// recursive block will be passed a `void (^)(void)` block +/// which will reschedule the recursive block at the end of the +/// receiver's queue. This passed-in block will automatically +/// skip scheduling if the scheduling of the `recursiveBlock` +/// was disposed in the meantime. +/// +/// Returns a disposable which can be used to cancel the scheduled block before +/// it begins executing, or to stop it from rescheduling if it's already begun +/// execution. +- (nullable RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.m new file mode 100644 index 0000000..e260e13 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScheduler.m @@ -0,0 +1,211 @@ +// +// RACScheduler.m +// ReactiveObjC +// +// Created by Josh Abernathy on 4/16/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACImmediateScheduler.h" +#import "RACScheduler+Private.h" +#import "RACSubscriptionScheduler.h" +#import "RACTargetQueueScheduler.h" + +// The key for the thread-specific current scheduler. +NSString * const RACSchedulerCurrentSchedulerKey = @"RACSchedulerCurrentSchedulerKey"; + +@interface RACScheduler () +@property (nonatomic, readonly, copy) NSString *name; +@end + +@implementation RACScheduler + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, self.name]; +} + +#pragma mark Initializers + +- (instancetype)initWithName:(NSString *)name { + self = [super init]; + + if (name == nil) { + _name = [NSString stringWithFormat:@"org.reactivecocoa.ReactiveObjC.%@.anonymousScheduler", self.class]; + } else { + _name = [name copy]; + } + + return self; +} + +#pragma mark Schedulers + ++ (RACScheduler *)immediateScheduler { + static dispatch_once_t onceToken; + static RACScheduler *immediateScheduler; + dispatch_once(&onceToken, ^{ + immediateScheduler = [[RACImmediateScheduler alloc] init]; + }); + + return immediateScheduler; +} + ++ (RACScheduler *)mainThreadScheduler { + static dispatch_once_t onceToken; + static RACScheduler *mainThreadScheduler; + dispatch_once(&onceToken, ^{ + mainThreadScheduler = [[RACTargetQueueScheduler alloc] initWithName:@"org.reactivecocoa.ReactiveObjC.RACScheduler.mainThreadScheduler" targetQueue:dispatch_get_main_queue()]; + }); + + return mainThreadScheduler; +} + ++ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority name:(NSString *)name { + return [[RACTargetQueueScheduler alloc] initWithName:name targetQueue:dispatch_get_global_queue(priority, 0)]; +} + ++ (RACScheduler *)schedulerWithPriority:(RACSchedulerPriority)priority { + return [self schedulerWithPriority:priority name:@"org.reactivecocoa.ReactiveObjC.RACScheduler.backgroundScheduler"]; +} + ++ (RACScheduler *)scheduler { + return [self schedulerWithPriority:RACSchedulerPriorityDefault]; +} + ++ (RACScheduler *)subscriptionScheduler { + static dispatch_once_t onceToken; + static RACScheduler *subscriptionScheduler; + dispatch_once(&onceToken, ^{ + subscriptionScheduler = [[RACSubscriptionScheduler alloc] init]; + }); + + return subscriptionScheduler; +} + ++ (BOOL)isOnMainThread { + return [NSOperationQueue.currentQueue isEqual:NSOperationQueue.mainQueue] || [NSThread isMainThread]; +} + ++ (RACScheduler *)currentScheduler { + RACScheduler *scheduler = NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey]; + if (scheduler != nil) return scheduler; + if ([self.class isOnMainThread]) return RACScheduler.mainThreadScheduler; + + return nil; +} + +#pragma mark Scheduling + +- (RACDisposable *)schedule:(void (^)(void))block { + NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); + return nil; +} + +- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { + NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); + return nil; +} + +- (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block { + return [self after:[NSDate dateWithTimeIntervalSinceNow:delay] schedule:block]; +} + +- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { + NSCAssert(NO, @"%@ must be implemented by subclasses.", NSStringFromSelector(_cmd)); + return nil; +} + +- (RACDisposable *)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + [self scheduleRecursiveBlock:[recursiveBlock copy] addingToDisposable:disposable]; + return disposable; +} + +- (void)scheduleRecursiveBlock:(RACSchedulerRecursiveBlock)recursiveBlock addingToDisposable:(RACCompoundDisposable *)disposable { + @autoreleasepool { + RACCompoundDisposable *selfDisposable = [RACCompoundDisposable compoundDisposable]; + [disposable addDisposable:selfDisposable]; + + __weak RACDisposable *weakSelfDisposable = selfDisposable; + + RACDisposable *schedulingDisposable = [self schedule:^{ + @autoreleasepool { + // At this point, we've been invoked, so our disposable is now useless. + [disposable removeDisposable:weakSelfDisposable]; + } + + if (disposable.disposed) return; + + void (^reallyReschedule)(void) = ^{ + if (disposable.disposed) return; + [self scheduleRecursiveBlock:recursiveBlock addingToDisposable:disposable]; + }; + + // Protects the variables below. + // + // This doesn't actually need to be __block qualified, but Clang + // complains otherwise. :C + __block NSLock *lock = [[NSLock alloc] init]; + lock.name = [NSString stringWithFormat:@"%@ %s", self, sel_getName(_cmd)]; + + __block NSUInteger rescheduleCount = 0; + + // Set to YES once synchronous execution has finished. Further + // rescheduling should occur immediately (rather than being + // flattened). + __block BOOL rescheduleImmediately = NO; + + @autoreleasepool { + recursiveBlock(^{ + [lock lock]; + BOOL immediate = rescheduleImmediately; + if (!immediate) ++rescheduleCount; + [lock unlock]; + + if (immediate) reallyReschedule(); + }); + } + + [lock lock]; + NSUInteger synchronousCount = rescheduleCount; + rescheduleImmediately = YES; + [lock unlock]; + + for (NSUInteger i = 0; i < synchronousCount; i++) { + reallyReschedule(); + } + }]; + + [selfDisposable addDisposable:schedulingDisposable]; + } +} + +- (void)performAsCurrentScheduler:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + // If we're using a concurrent queue, we could end up in here concurrently, + // in which case we *don't* want to clear the current scheduler immediately + // after our block is done executing, but only *after* all our concurrent + // invocations are done. + + RACScheduler *previousScheduler = RACScheduler.currentScheduler; + NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = self; + + @autoreleasepool { + block(); + } + + if (previousScheduler != nil) { + NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = previousScheduler; + } else { + [NSThread.currentThread.threadDictionary removeObjectForKey:RACSchedulerCurrentSchedulerKey]; + } +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.h b/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.h new file mode 100644 index 0000000..ff1067c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.h @@ -0,0 +1,22 @@ +// +// RACScopedDisposable.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/28/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACDisposable.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A disposable that calls its own -dispose when it is dealloc'd. +@interface RACScopedDisposable : RACDisposable + +/// Creates a new scoped disposable that will also dispose of the given +/// disposable when it is dealloc'd. ++ (instancetype)scopedDisposableWithDisposable:(RACDisposable *)disposable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.m b/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.m new file mode 100644 index 0000000..2da50cb --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACScopedDisposable.m @@ -0,0 +1,32 @@ +// +// RACScopedDisposable.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/28/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScopedDisposable.h" + +@implementation RACScopedDisposable + +#pragma mark Lifecycle + ++ (instancetype)scopedDisposableWithDisposable:(RACDisposable *)disposable { + return [self disposableWithBlock:^{ + [disposable dispose]; + }]; +} + +- (void)dealloc { + [self dispose]; +} + +#pragma mark RACDisposable + +- (RACScopedDisposable *)asScopedDisposable { + // totally already are + return self; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACSequence.h new file mode 100644 index 0000000..e807a05 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSequence.h @@ -0,0 +1,419 @@ +// +// RACSequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import +#import "RACStream.h" + +@class RACTuple; +@class RACScheduler; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +/// Represents an immutable sequence of values. Unless otherwise specified, the +/// sequences' values are evaluated lazily on demand. Like Cocoa collections, +/// sequences cannot contain nil. +/// +/// Most inherited RACStream methods that accept a block will execute the block +/// _at most_ once for each value that is evaluated in the returned sequence. +/// Side effects are subject to the behavior described in +/// +sequenceWithHeadBlock:tailBlock:. +/// +/// Implemented as a class cluster. A minimal implementation for a subclass +/// consists simply of -head and -tail. +@interface RACSequence<__covariant ValueType> : RACStream + +/// The first object in the sequence, or nil if the sequence is empty. +/// +/// Subclasses must provide an implementation of this method. +@property (nonatomic, strong, readonly, nullable) ValueType head; + +/// All but the first object in the sequence, or nil if there are no other +/// objects. +/// +/// Subclasses must provide an implementation of this method. +@property (nonatomic, strong, readonly, nullable) RACSequence *tail; + +/// Evaluates the full sequence to produce an equivalently-sized array. +@property (nonatomic, copy, readonly) NSArray *array; + +/// Returns an enumerator of all objects in the sequence. +@property (nonatomic, copy, readonly) NSEnumerator *objectEnumerator; + +/// Converts a sequence into an eager sequence. +/// +/// An eager sequence fully evaluates all of its values immediately. Sequences +/// derived from an eager sequence will also be eager. +/// +/// Returns a new eager sequence, or the receiver if the sequence is already +/// eager. +@property (nonatomic, copy, readonly) RACSequence *eagerSequence; + +/// Converts a sequence into a lazy sequence. +/// +/// A lazy sequence evaluates its values on demand, as they are accessed. +/// Sequences derived from a lazy sequence will also be lazy. +/// +/// Returns a new lazy sequence, or the receiver if the sequence is already lazy. +@property (nonatomic, copy, readonly) RACSequence *lazySequence; + +/// Invokes -signalWithScheduler: with a new RACScheduler. +- (RACSignal *)signal; + +/// Evaluates the full sequence on the given scheduler. +/// +/// Each item is evaluated in its own scheduled block, such that control of the +/// scheduler is yielded between each value. +/// +/// Returns a signal which sends the receiver's values on the given scheduler as +/// they're evaluated. +- (RACSignal *)signalWithScheduler:(RACScheduler *)scheduler; + +/// Applies a left fold to the sequence. +/// +/// This is the same as iterating the sequence along with a provided start value. +/// This uses a constant amount of memory. A left fold is left-associative so in +/// the sequence [1,2,3] the block would applied in the following order: +/// reduce(reduce(reduce(start, 1), 2), 3) +/// +/// start - The starting value for the fold. Used as `accumulator` for the +/// first fold. +/// reduce - The block used to combine the accumulated value and the next value. +/// Cannot be nil. +/// +/// Returns a reduced value. +- (id)foldLeftWithStart:(nullable id)start reduce:(id _Nullable (^)(id _Nullable accumulator, ValueType _Nullable value))reduce; + +/// Applies a right fold to the sequence. +/// +/// A right fold is equivalent to recursion on the list. The block is evaluated +/// from the right to the left in list. It is right associative so it's applied +/// to the rightmost elements first. For example, in the sequence [1,2,3] the +/// block is applied in the order: +/// reduce(1, reduce(2, reduce(3, start))) +/// +/// start - The starting value for the fold. +/// reduce - The block used to combine the accumulated value and the next head. +/// The block is given the accumulated value and the value of the rest +/// of the computation (result of the recursion). This is computed when +/// you retrieve its value using `rest.head`. This allows you to +/// prevent unnecessary computation by not accessing `rest.head` if you +/// don't need to. +/// +/// Returns a reduced value. +- (id)foldRightWithStart:(nullable id)start reduce:(id _Nullable (^)(id _Nullable first, RACSequence *rest))reduce; + +/// Check if any value in sequence passes the block. +/// +/// block - The block predicate used to check each item. Cannot be nil. +/// +/// Returns a boolean indiciating if any value in the sequence passed. +- (BOOL)any:(BOOL (^)(ValueType _Nullable value))block; + +/// Check if all values in the sequence pass the block. +/// +/// block - The block predicate used to check each item. Cannot be nil. +/// +/// Returns a boolean indicating if all values in the sequence passed. +- (BOOL)all:(BOOL (^)(ValueType _Nullable value))block; + +/// Returns the first object that passes the block. +/// +/// block - The block predicate used to check each item. Cannot be nil. +/// +/// Returns an object that passes the block or nil if no objects passed. +- (nullable ValueType)objectPassingTest:(BOOL (^)(ValueType _Nullable value))block; + +/// Creates a sequence that dynamically generates its values. +/// +/// headBlock - Invoked the first time -head is accessed. +/// tailBlock - Invoked the first time -tail is accessed. +/// +/// The results from each block are memoized, so each block will be invoked at +/// most once, no matter how many times the head and tail properties of the +/// sequence are accessed. +/// +/// Any side effects in `headBlock` or `tailBlock` should be thread-safe, since +/// the sequence may be evaluated at any time from any thread. Not only that, but +/// -tail may be accessed before -head, or both may be accessed simultaneously. +/// As noted above, side effects will only be triggered the _first_ time -head or +/// -tail is invoked. +/// +/// Returns a sequence that lazily invokes the given blocks to provide head and +/// tail. `headBlock` must not be nil. ++ (RACSequence *)sequenceWithHeadBlock:(ValueType _Nullable (^)(void))headBlock tailBlock:(nullable RACSequence *(^)(void))tailBlock; + +@end + +@interface RACSequence<__covariant ValueType> (RACStream) + +/// Returns a sequence that immediately sends the given value and then completes. ++ (RACSequence *)return:(nullable ValueType)value; + +/// Returns a sequence that immediately completes. ++ (RACSequence *)empty; + +/// A block which accepts a value from a RACSequence and returns a new sequence. +/// +/// Setting `stop` to `YES` will cause the bind to terminate after the returned +/// value. Returning `nil` will result in immediate termination. +typedef RACSequence * _Nullable (^RACSequenceBindBlock)(ValueType _Nullable value, BOOL *stop); + +/// Lazily binds a block to the values in the receiver. +/// +/// This should only be used if you need to terminate the bind early, or close +/// over some state. -flattenMap: is more appropriate for all other cases. +/// +/// block - A block returning a RACSequenceBindBlock. This block will be invoked +/// each time the bound sequence is re-evaluated. This block must not be +/// nil or return nil. +/// +/// Returns a new sequence which represents the combined result of all lazy +/// applications of `block`. +- (RACSequence *)bind:(RACSequenceBindBlock (^)(void))block; + +/// Subscribes to `sequence` when the source sequence completes. +- (RACSequence *)concat:(RACSequence *)sequence; + +/// Zips the values in the receiver with those of the given sequence to create +/// RACTuples. +/// +/// The first `next` of each sequence will be combined, then the second `next`, +/// and so forth, until either sequence completes or errors. +/// +/// sequence - The sequence to zip with. This must not be `nil`. +/// +/// Returns a new sequence of RACTuples, representing the combined values of the +/// two sequences. Any error from one of the original sequence will be forwarded +/// on the returned sequence. +- (RACSequence *)zipWith:(RACSequence *)sequence; + +@end + +/// Redeclarations of operations built on the RACStream primitives with more +/// precise type information. +@interface RACSequence<__covariant ValueType> (RACStreamOperations) + +/// Maps `block` across the values in the receiver and flattens the result. +/// +/// Note that operators applied _after_ -flattenMap: behave differently from +/// operators _within_ -flattenMap:. See the Examples section below. +/// +/// This corresponds to the `SelectMany` method in Rx. +/// +/// block - A block which accepts the values in the receiver and returns a new +/// instance of the receiver's class. Returning `nil` from this block is +/// equivalent to returning an empty sequence. +/// +/// Returns a new sequence which represents the combined sequences resulting +/// from mapping `block`. +- (RACSequence *)flattenMap:(__kindof RACSequence * _Nullable (^)(ValueType _Nullable value))block; + +/// Flattens a sequence of sequences. +/// +/// This corresponds to the `Merge` method in Rx. +/// +/// Returns a sequence consisting of the combined sequences obtained from the +/// receiver. +- (RACSequence *)flatten; + +/// Maps `block` across the values in the receiver. +/// +/// This corresponds to the `Select` method in Rx. +/// +/// Returns a new sequence with the mapped values. +- (RACSequence *)map:(id _Nullable (^)(ValueType _Nullable value))block; + +/// Replaces each value in the receiver with the given object. +/// +/// Returns a new sequence which includes the given object once for each value in +/// the receiver. +- (RACSequence *)mapReplace:(nullable id)object; + +/// Filters out values in the receiver that don't pass the given test. +/// +/// This corresponds to the `Where` method in Rx. +/// +/// Returns a new sequence with only those values that passed. +- (RACSequence *)filter:(BOOL (^)(id _Nullable value))block; + +/// Filters out values in the receiver that equal (via -isEqual:) the provided +/// value. +/// +/// value - The value can be `nil`, in which case it ignores `nil` values. +/// +/// Returns a new sequence containing only the values which did not compare +/// equal to `value`. +- (RACSequence *)ignore:(nullable ValueType)value; + +/// Unpacks each RACTuple in the receiver and maps the values to a new value. +/// +/// reduceBlock - The block which reduces each RACTuple's values into one value. +/// It must take as many arguments as the number of tuple elements +/// to process. Each argument will be an object argument. The +/// return value must be an object. This argument cannot be nil. +/// +/// Returns a new sequence of reduced tuple values. +- (RACSequence *)reduceEach:(id _Nullable (^)())reduceBlock; + +/// Returns a sequence consisting of `value`, followed by the values in the +/// receiver. +- (RACSequence *)startWith:(nullable ValueType)value; + +/// Skips the first `skipCount` values in the receiver. +/// +/// Returns the receiver after skipping the first `skipCount` values. If +/// `skipCount` is greater than the number of values in the sequence, an empty +/// sequence is returned. +- (RACSequence *)skip:(NSUInteger)skipCount; + +/// Returns a sequence of the first `count` values in the receiver. If `count` is +/// greater than or equal to the number of values in the sequence, a sequence +/// equivalent to the receiver is returned. +- (RACSequence *)take:(NSUInteger)count; + +/// Zips the values in the given sequences to create RACTuples. +/// +/// The first value of each sequence will be combined, then the second value, +/// and so forth, until at least one of the sequences is exhausted. +/// +/// sequences - The sequence to combine. If this collection is empty, the +/// returned sequence will be empty. +/// +/// Returns a new sequence containing RACTuples of the zipped values from the +/// sequences. ++ (RACSequence *)zip:(id)sequence; + +/// Zips sequences using +zip:, then reduces the resulting tuples into a single +/// value using -reduceEach: +/// +/// sequences - The sequences to combine. If this collection is empty, the +/// returned sequence will be empty. +/// reduceBlock - The block which reduces the values from all the sequences +/// into one value. It must take as many arguments as the +/// number of sequences given. Each argument will be an object +/// argument. The return value must be an object. This argument +/// must not be nil. +/// +/// Example: +/// +/// [RACSequence zip:@[ stringSequence, intSequence ] +/// reduce:^(NSString *string, NSNumber *number) { +/// return [NSString stringWithFormat:@"%@: %@", string, number]; +/// }]; +/// +/// Returns a new sequence containing the results from each invocation of +/// `reduceBlock`. ++ (RACSequence *)zip:(id)sequences reduce:(id _Nullable (^)())reduceBlock; + +/// Returns a sequence obtained by concatenating `sequences` in order. ++ (RACSequence *)concat:(id)sequences; + +/// Combines values in the receiver from left to right using the given block. +/// +/// The algorithm proceeds as follows: +/// +/// 1. `startingValue` is passed into the block as the `running` value, and the +/// first element of the receiver is passed into the block as the `next` value. +/// 2. The result of the invocation is added to the returned sequence. +/// 3. The result of the invocation (`running`) and the next element of the +/// receiver (`next`) is passed into `block`. +/// 4. Steps 2 and 3 are repeated until all values have been processed. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Examples +/// +/// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; +/// +/// // Contains 1, 3, 6, 10 +/// RACSequence *sums = [numbers scanWithStart:@0 reduce:^(NSNumber *sum, NSNumber *next) { +/// return @(sum.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new sequence that consists of each application of `reduceBlock`. If +/// the receiver is empty, an empty sequence is returned. +- (RACSequence *)scanWithStart:(nullable id)startingValue reduce:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next))reduceBlock; + +/// Combines values in the receiver from left to right using the given block +/// which also takes zero-based index of the values. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. This block takes zero-based index value as the last +/// parameter. If the receiver is empty, this block will never +/// be invoked. Cannot be nil. +/// +/// Returns a new sequence that consists of each application of `reduceBlock`. +/// If the receiver is empty, an empty sequence is returned. +- (RACSequence *)scanWithStart:(nullable id)startingValue reduceWithIndex:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next, NSUInteger index))reduceBlock; + +/// Combines each previous and current value into one object. +/// +/// This method is similar to -scanWithStart:reduce:, but only ever operates on +/// the previous and current values (instead of the whole sequence), and does +/// not pass the return value of `reduceBlock` into the next invocation of it. +/// +/// start - The value passed into `reduceBlock` as `previous` for the +/// first value. +/// reduceBlock - The block that combines the previous value and the current +/// value to create the reduced value. Cannot be nil. +/// +/// Examples +/// +/// RACSequence *numbers = [@[ @1, @2, @3, @4 ].rac_sequence; +/// +/// // Contains 1, 3, 5, 7 +/// RACSequence *sums = [numbers combinePreviousWithStart:@0 reduce:^(NSNumber *previous, NSNumber *next) { +/// return @(previous.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new sequence consisting of the return values from each application of +/// `reduceBlock`. +- (RACSequence *)combinePreviousWithStart:(nullable ValueType)start reduce:(id _Nullable (^)(ValueType _Nullable previous, ValueType _Nullable current))reduceBlock; + +/// Takes values until the given block returns `YES`. +/// +/// Returns a RACSequence of the initial values in the receiver that fail +/// `predicate`. If `predicate` never returns `YES`, a sequence equivalent to +/// the receiver is returned. +- (RACSequence *)takeUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Takes values until the given block returns `NO`. +/// +/// Returns a sequence of the initial values in the receiver that pass +/// `predicate`. If `predicate` never returns `NO`, a sequence equivalent to the +/// receiver is returned. +- (RACSequence *)takeWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Skips values until the given block returns `YES`. +/// +/// Returns a sequence containing the values of the receiver that follow any +/// initial values failing `predicate`. If `predicate` never returns `YES`, +/// an empty sequence is returned. +- (RACSequence *)skipUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Skips values until the given block returns `NO`. +/// +/// Returns a sequence containing the values of the receiver that follow any +/// initial values passing `predicate`. If `predicate` never returns `NO`, an +/// empty sequence is returned. +- (RACSequence *)skipWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Returns a sequence of values for which -isEqual: returns NO when compared to +/// the previous value. +- (RACSequence *)distinctUntilChanged; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACSequence.m new file mode 100644 index 0000000..baf8302 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSequence.m @@ -0,0 +1,371 @@ +// +// RACSequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACSequence.h" +#import "RACArraySequence.h" +#import "RACDynamicSequence.h" +#import "RACEagerSequence.h" +#import "RACEmptySequence.h" +#import "RACScheduler.h" +#import "RACSignal.h" +#import "RACSubscriber.h" +#import "RACTuple.h" +#import "RACUnarySequence.h" + +// An enumerator over sequences. +@interface RACSequenceEnumerator : NSEnumerator + +// The sequence the enumerator is enumerating. +// +// This will change as the enumerator is exhausted. This property should only be +// accessed while synchronized on self. +@property (nonatomic, strong) RACSequence *sequence; + +@end + +@interface RACSequence () + +// Performs one iteration of lazy binding, passing through values from `current` +// until the sequence is exhausted, then recursively binding the remaining +// values in the receiver. +// +// Returns a new sequence which contains `current`, followed by the combined +// result of all applications of `block` to the remaining values in the receiver. +- (RACSequence *)bind:(RACSequenceBindBlock)block passingThroughValuesFromSequence:(RACSequence *)current; + +@end + +@implementation RACSequenceEnumerator + +- (id)nextObject { + id object = nil; + + @synchronized (self) { + object = self.sequence.head; + self.sequence = self.sequence.tail; + } + + return object; +} + +@end + +@implementation RACSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithHeadBlock:(id (^)(void))headBlock tailBlock:(RACSequence *(^)(void))tailBlock { + return [[RACDynamicSequence sequenceWithHeadBlock:headBlock tailBlock:tailBlock] setNameWithFormat:@"+sequenceWithHeadBlock:tailBlock:"]; +} + +#pragma mark Class cluster primitives + +- (id)head { + NSCAssert(NO, @"%s must be overridden by subclasses", __func__); + return nil; +} + +- (RACSequence *)tail { + NSCAssert(NO, @"%s must be overridden by subclasses", __func__); + return nil; +} + +#pragma mark RACStream + ++ (RACSequence *)empty { + return RACEmptySequence.empty; +} + ++ (RACSequence *)return:(id)value { + return [RACUnarySequence return:value]; +} + +- (RACSequence *)bind:(RACSequenceBindBlock (^)(void))block { + RACSequenceBindBlock bindBlock = block(); + return [[self bind:bindBlock passingThroughValuesFromSequence:nil] setNameWithFormat:@"[%@] -bind:", self.name]; +} + +- (RACSequence *)bind:(RACSequenceBindBlock)bindBlock passingThroughValuesFromSequence:(RACSequence *)passthroughSequence { + // Store values calculated in the dependency here instead, avoiding any kind + // of temporary collection and boxing. + // + // This relies on the implementation of RACDynamicSequence synchronizing + // access to its head, tail, and dependency, and we're only doing it because + // we really need the performance. + __block RACSequence *valuesSeq = self; + __block RACSequence *current = passthroughSequence; + __block BOOL stop = NO; + + RACSequence *sequence = [RACDynamicSequence sequenceWithLazyDependency:^ id { + while (current.head == nil) { + if (stop) return nil; + + // We've exhausted the current sequence, create a sequence from the + // next value. + id value = valuesSeq.head; + + if (value == nil) { + // We've exhausted all the sequences. + stop = YES; + return nil; + } + + current = (id)bindBlock(value, &stop); + if (current == nil) { + stop = YES; + return nil; + } + + valuesSeq = valuesSeq.tail; + } + + NSCAssert([current isKindOfClass:RACSequence.class], @"-bind: block returned an object that is not a sequence: %@", current); + return nil; + } headBlock:^(id _) { + return current.head; + } tailBlock:^ id (id _) { + if (stop) return nil; + + return [valuesSeq bind:bindBlock passingThroughValuesFromSequence:current.tail]; + }]; + + sequence.name = self.name; + return sequence; +} + +- (RACSequence *)concat:(RACSequence *)sequence { + NSCParameterAssert(sequence != nil); + + return [[[RACArraySequence sequenceWithArray:@[ self, sequence ] offset:0] + flatten] + setNameWithFormat:@"[%@] -concat: %@", self.name, sequence]; +} + +- (RACSequence *)zipWith:(RACSequence *)sequence { + NSCParameterAssert(sequence != nil); + + return [[RACSequence + sequenceWithHeadBlock:^ id { + if (self.head == nil || sequence.head == nil) return nil; + return RACTuplePack(self.head, sequence.head); + } tailBlock:^ id { + if (self.tail == nil || [[RACSequence empty] isEqual:self.tail]) return nil; + if (sequence.tail == nil || [[RACSequence empty] isEqual:sequence.tail]) return nil; + + return [self.tail zipWith:sequence.tail]; + }] + setNameWithFormat:@"[%@] -zipWith: %@", self.name, sequence]; +} + +#pragma mark Extended methods + +- (NSArray *)array { + NSMutableArray *array = [NSMutableArray array]; + for (id obj in self) { + [array addObject:obj]; + } + + return [array copy]; +} + +- (NSEnumerator *)objectEnumerator { + RACSequenceEnumerator *enumerator = [[RACSequenceEnumerator alloc] init]; + enumerator.sequence = self; + return enumerator; +} + +- (RACSignal *)signal { + return [[self signalWithScheduler:[RACScheduler scheduler]] setNameWithFormat:@"[%@] -signal", self.name]; +} + +- (RACSignal *)signalWithScheduler:(RACScheduler *)scheduler { + return [[RACSignal createSignal:^(id subscriber) { + __block RACSequence *sequence = self; + + return [scheduler scheduleRecursiveBlock:^(void (^reschedule)(void)) { + if (sequence.head == nil) { + [subscriber sendCompleted]; + return; + } + + [subscriber sendNext:sequence.head]; + + sequence = sequence.tail; + reschedule(); + }]; + }] setNameWithFormat:@"[%@] -signalWithScheduler: %@", self.name, scheduler]; +} + +- (id)foldLeftWithStart:(id)start reduce:(id (^)(id, id))reduce { + NSCParameterAssert(reduce != NULL); + + if (self.head == nil) return start; + + for (id value in self) { + start = reduce(start, value); + } + + return start; +} + +- (id)foldRightWithStart:(id)start reduce:(id (^)(id, RACSequence *))reduce { + NSCParameterAssert(reduce != NULL); + + if (self.head == nil) return start; + + RACSequence *rest = [RACSequence sequenceWithHeadBlock:^{ + if (self.tail) { + return [self.tail foldRightWithStart:start reduce:reduce]; + } else { + return start; + } + } tailBlock:nil]; + + return reduce(self.head, rest); +} + +- (BOOL)any:(BOOL (^)(id))block { + NSCParameterAssert(block != NULL); + + return [self objectPassingTest:block] != nil; +} + +- (BOOL)all:(BOOL (^)(id))block { + NSCParameterAssert(block != NULL); + + NSNumber *result = [self foldLeftWithStart:@YES reduce:^(NSNumber *accumulator, id value) { + return @(accumulator.boolValue && block(value)); + }]; + + return result.boolValue; +} + +- (id)objectPassingTest:(BOOL (^)(id))block { + NSCParameterAssert(block != NULL); + + return [self filter:block].head; +} + +- (RACSequence *)eagerSequence { + return [RACEagerSequence sequenceWithArray:self.array offset:0]; +} + +- (RACSequence *)lazySequence { + return self; +} + +#pragma mark NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +#pragma mark NSCoding + +- (Class)classForCoder { + // Most sequences should be archived as RACArraySequences. + return RACArraySequence.class; +} + +- (id)initWithCoder:(NSCoder *)coder { + if (![self isKindOfClass:RACArraySequence.class]) return [[RACArraySequence alloc] initWithCoder:coder]; + + // Decoding is handled in RACArraySequence. + return [super init]; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + [coder encodeObject:self.array forKey:@"array"]; +} + +#pragma mark NSFastEnumeration + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(__unsafe_unretained id *)stackbuf count:(NSUInteger)len { + if (state->state == ULONG_MAX) { + // Enumeration has completed. + return 0; + } + + // We need to traverse the sequence itself on repeated calls to this + // method, so use the 'state' field to track the current head. + RACSequence *(^getSequence)(void) = ^{ + return (__bridge RACSequence *)(void *)state->state; + }; + + void (^setSequence)(RACSequence *) = ^(RACSequence *sequence) { + // Release the old sequence and retain the new one. + CFBridgingRelease((void *)state->state); + + state->state = (unsigned long)CFBridgingRetain(sequence); + }; + + void (^complete)(void) = ^{ + // Release any stored sequence. + setSequence(nil); + state->state = ULONG_MAX; + }; + + if (state->state == 0) { + // Since a sequence doesn't mutate, this just needs to be set to + // something non-NULL. + state->mutationsPtr = state->extra; + + setSequence(self); + } + + state->itemsPtr = stackbuf; + + NSUInteger enumeratedCount = 0; + while (enumeratedCount < len) { + RACSequence *seq = getSequence(); + + // Because the objects in a sequence may be generated lazily, we want to + // prevent them from being released until the enumerator's used them. + __autoreleasing id obj = seq.head; + if (obj == nil) { + complete(); + break; + } + + stackbuf[enumeratedCount++] = obj; + + if (seq.tail == nil) { + complete(); + break; + } + + setSequence(seq.tail); + } + + return enumeratedCount; +} + +#pragma mark NSObject + +- (NSUInteger)hash { + return [self.head hash]; +} + +- (BOOL)isEqual:(RACSequence *)seq { + if (self == seq) return YES; + if (![seq isKindOfClass:RACSequence.class]) return NO; + + for (id selfObj in self) { + id seqObj = seq.head; + + // Handles the nil case too. + if (![seqObj isEqual:selfObj]) return NO; + + seq = seq.tail; + } + + // self is now depleted -- the argument should be too. + return (seq.head == nil); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.h b/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.h new file mode 100644 index 0000000..c45fb75 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.h @@ -0,0 +1,47 @@ +// +// RACSerialDisposable.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACDisposable.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A disposable that contains exactly one other disposable and allows it to be +/// swapped out atomically. +@interface RACSerialDisposable : RACDisposable + +/// The inner disposable managed by the serial disposable. +/// +/// This property is thread-safe for reading and writing. However, if you want to +/// read the current value _and_ write a new one atomically, use +/// -swapInDisposable: instead. +/// +/// Disposing of the receiver will also dispose of the current disposable set for +/// this property, then set the property to nil. If any new disposable is set +/// after the receiver is disposed, it will be disposed immediately and this +/// property will remain set to nil. +@property (atomic, strong, nullable) RACDisposable *disposable; + +/// Creates a serial disposable which will wrap the given disposable. +/// +/// disposable - The value to set for `disposable`. This may be nil. +/// +/// Returns a RACSerialDisposable. ++ (instancetype)serialDisposableWithDisposable:(nullable RACDisposable *)disposable; + +/// Atomically swaps the receiver's `disposable` for `newDisposable`. +/// +/// newDisposable - The new value for `disposable`. If the receiver has already +/// been disposed, this disposable will be too, and `disposable` +/// will remain set to nil. This argument may be nil. +/// +/// Returns the previous value for the `disposable` property. +- (nullable RACDisposable *)swapInDisposable:(nullable RACDisposable *)newDisposable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.m b/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.m new file mode 100644 index 0000000..38a9f1a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSerialDisposable.m @@ -0,0 +1,121 @@ +// +// RACSerialDisposable.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSerialDisposable.h" +#import + +@interface RACSerialDisposable () { + // The receiver's `disposable`. This variable must only be referenced while + // _mutex is held. + RACDisposable * _disposable; + + // YES if the receiver has been disposed. This variable must only be accessed + // while _mutex is held. + BOOL _disposed; + + // A mutex to protect access to _disposable and _disposed. + pthread_mutex_t _mutex; +} + +@end + +@implementation RACSerialDisposable + +#pragma mark Properties + +- (BOOL)isDisposed { + pthread_mutex_lock(&_mutex); + const BOOL disposed = _disposed; + pthread_mutex_unlock(&_mutex); + + return disposed; +} + +- (RACDisposable *)disposable { + pthread_mutex_lock(&_mutex); + RACDisposable * const result = _disposable; + pthread_mutex_unlock(&_mutex); + + return result; +} + +- (void)setDisposable:(RACDisposable *)disposable { + [self swapInDisposable:disposable]; +} + +#pragma mark Lifecycle + ++ (instancetype)serialDisposableWithDisposable:(RACDisposable *)disposable { + RACSerialDisposable *serialDisposable = [[self alloc] init]; + serialDisposable.disposable = disposable; + return serialDisposable; +} + +- (instancetype)init { + self = [super init]; + if (self == nil) return nil; + + const int result __attribute__((unused)) = pthread_mutex_init(&_mutex, NULL); + NSCAssert(0 == result, @"Failed to initialize mutex with error %d", result); + + return self; +} + +- (instancetype)initWithBlock:(void (^)(void))block { + self = [self init]; + if (self == nil) return nil; + + self.disposable = [RACDisposable disposableWithBlock:block]; + + return self; +} + +- (void)dealloc { + const int result __attribute__((unused)) = pthread_mutex_destroy(&_mutex); + NSCAssert(0 == result, @"Failed to destroy mutex with error %d", result); +} + +#pragma mark Inner Disposable + +- (RACDisposable *)swapInDisposable:(RACDisposable *)newDisposable { + RACDisposable *existingDisposable; + BOOL alreadyDisposed; + + pthread_mutex_lock(&_mutex); + alreadyDisposed = _disposed; + if (!alreadyDisposed) { + existingDisposable = _disposable; + _disposable = newDisposable; + } + pthread_mutex_unlock(&_mutex); + + if (alreadyDisposed) { + [newDisposable dispose]; + return nil; + } + + return existingDisposable; +} + +#pragma mark Disposal + +- (void)dispose { + RACDisposable *existingDisposable; + + pthread_mutex_lock(&_mutex); + if (!_disposed) { + existingDisposable = _disposable; + _disposed = YES; + _disposable = nil; + } + pthread_mutex_unlock(&_mutex); + + [existingDisposable dispose]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.h b/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.h new file mode 100644 index 0000000..d2e1782 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.h @@ -0,0 +1,713 @@ +// +// RACSignal+Operations.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-09-06. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import "RACSignal.h" + +@class RACCommand; +@class RACDisposable; +@class RACMulticastConnection<__covariant ValueType>; +@class RACScheduler; +@class RACSequence<__covariant ValueType>; +@class RACSubject; +@class RACTuple; +@class RACTwoTuple<__covariant First, __covariant Second>; +@class RACEvent<__covariant ValueType>; +@class RACGroupedSignal; +@protocol RACSubscriber; + +NS_ASSUME_NONNULL_BEGIN + +/// The domain for errors originating in RACSignal operations. +extern NSString * const RACSignalErrorDomain; + +/// The error code used with -timeout:. +extern const NSInteger RACSignalErrorTimedOut; + +/// The error code used when a value passed into +switch:cases:default: does not +/// match any of the cases, and no default was given. +extern const NSInteger RACSignalErrorNoMatchingCase; + +@interface RACSignal<__covariant ValueType> (Operations) + +/// Do the given block on `next`. This should be used to inject side effects into +/// the signal. +- (RACSignal *)doNext:(void (^)(ValueType _Nullable x))block RAC_WARN_UNUSED_RESULT; + +/// Do the given block on `error`. This should be used to inject side effects +/// into the signal. +- (RACSignal *)doError:(void (^)(NSError * _Nonnull error))block RAC_WARN_UNUSED_RESULT; + +/// Do the given block on `completed`. This should be used to inject side effects +/// into the signal. +- (RACSignal *)doCompleted:(void (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Sends `next`s only if we don't receive another `next` in `interval` seconds. +/// +/// If a `next` is received, and then another `next` is received before +/// `interval` seconds have passed, the first value is discarded. +/// +/// After `interval` seconds have passed since the most recent `next` was sent, +/// the most recent `next` is forwarded on the scheduler that the value was +/// originally received on. If +[RACScheduler currentScheduler] was nil at the +/// time, a private background scheduler is used. +/// +/// Returns a signal which sends throttled and delayed `next` events. Completion +/// and errors are always forwarded immediately. +- (RACSignal *)throttle:(NSTimeInterval)interval RAC_WARN_UNUSED_RESULT; + +/// Throttles `next`s for which `predicate` returns YES. +/// +/// When `predicate` returns YES for a `next`: +/// +/// 1. If another `next` is received before `interval` seconds have passed, the +/// prior value is discarded. This happens regardless of whether the new +/// value will be throttled. +/// 2. After `interval` seconds have passed since the value was originally +/// received, it will be forwarded on the scheduler that it was received +/// upon. If +[RACScheduler currentScheduler] was nil at the time, a private +/// background scheduler is used. +/// +/// When `predicate` returns NO for a `next`, it is forwarded immediately, +/// without any throttling. +/// +/// interval - The number of seconds for which to buffer the latest value that +/// passes `predicate`. +/// predicate - Passed each `next` from the receiver, this block returns +/// whether the given value should be throttled. This argument must +/// not be nil. +/// +/// Returns a signal which sends `next` events, throttled when `predicate` +/// returns YES. Completion and errors are always forwarded immediately. +- (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id _Nullable next))predicate RAC_WARN_UNUSED_RESULT; + +/// Forwards `next` and `completed` events after delaying for `interval` seconds +/// on the current scheduler (on which the events were delivered). +/// +/// If +[RACScheduler currentScheduler] is nil when `next` or `completed` is +/// received, a private background scheduler is used. +/// +/// Returns a signal which sends delayed `next` and `completed` events. Errors +/// are always forwarded immediately. +- (RACSignal *)delay:(NSTimeInterval)interval RAC_WARN_UNUSED_RESULT; + +/// Resubscribes when the signal completes. +- (RACSignal *)repeat RAC_WARN_UNUSED_RESULT; + +/// Executes the given block each time a subscription is created. +/// +/// block - A block which defines the subscription side effects. Cannot be `nil`. +/// +/// Example: +/// +/// // Write new file, with backup. +/// [[[[fileManager +/// rac_createFileAtPath:path contents:data] +/// initially:^{ +/// // 2. Second, backup current file +/// [fileManager moveItemAtPath:path toPath:backupPath error:nil]; +/// }] +/// initially:^{ +/// // 1. First, acquire write lock. +/// [writeLock lock]; +/// }] +/// finally:^{ +/// [writeLock unlock]; +/// }]; +/// +/// Returns a signal that passes through all events of the receiver, plus +/// introduces side effects which occur prior to any subscription side effects +/// of the receiver. +- (RACSignal *)initially:(void (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Executes the given block when the signal completes or errors. +- (RACSignal *)finally:(void (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Divides the receiver's `next`s into buffers which deliver every `interval` +/// seconds. +/// +/// interval - The interval in which values are grouped into one buffer. +/// scheduler - The scheduler upon which the returned signal will deliver its +/// values. This must not be nil or +[RACScheduler +/// immediateScheduler]. +/// +/// Returns a signal which sends RACTuples of the buffered values at each +/// interval on `scheduler`. When the receiver completes, any currently-buffered +/// values will be sent immediately. +- (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler; + +/// Collects all receiver's `next`s into a NSArray. Nil values will be converted +/// to NSNull. +/// +/// This corresponds to the `ToArray` method in Rx. +/// +/// Returns a signal which sends a single NSArray when the receiver completes +/// successfully. +- (RACSignal *> *)collect RAC_WARN_UNUSED_RESULT; + +/// Takes the last `count` `next`s after the receiving signal completes. +- (RACSignal *)takeLast:(NSUInteger)count RAC_WARN_UNUSED_RESULT; + +/// Combines the latest values from the receiver and the given signal into +/// 2-tuples, once both have sent at least one `next`. +/// +/// Any additional `next`s will result in a new RACTuple with the latest values +/// from both signals. +/// +/// signal - The signal to combine with. This argument must not be nil. +/// +/// Returns a signal which sends RACTuples of the combined values, forwards any +/// `error` events, and completes when both input signals complete. +- (RACSignal *> *)combineLatestWith:(RACSignal *)signal RAC_WARN_UNUSED_RESULT; + +/// Combines the latest values from the given signals into RACTuples, once all +/// the signals have sent at least one `next`. +/// +/// Any additional `next`s will result in a new RACTuple with the latest values +/// from all signals. +/// +/// signals - The signals to combine. If this collection is empty, the returned +/// signal will immediately complete upon subscription. +/// +/// Returns a signal which sends RACTuples of the combined values, forwards any +/// `error` events, and completes when all input signals complete. ++ (RACSignal *)combineLatest:(id)signals RAC_WARN_UNUSED_RESULT; + +/// Combines signals using +combineLatest:, then reduces the resulting tuples +/// into a single value using -reduceEach:. +/// +/// signals - The signals to combine. If this collection is empty, the +/// returned signal will immediately complete upon subscription. +/// reduceBlock - The block which reduces the latest values from all the +/// signals into one value. It must take as many arguments as the +/// number of signals given. Each argument will be an object +/// argument. The return value must be an object. This argument +/// must not be nil. +/// +/// Example: +/// +/// [RACSignal combineLatest:@[ stringSignal, intSignal ] reduce:^(NSString *string, NSNumber *number) { +/// return [NSString stringWithFormat:@"%@: %@", string, number]; +/// }]; +/// +/// Returns a signal which sends the results from each invocation of +/// `reduceBlock`. ++ (RACSignal *)combineLatest:(id)signals reduce:(ValueType _Nullable (^)())reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Merges the receiver and the given signal with `+merge:` and returns the +/// resulting signal. +- (RACSignal *)merge:(RACSignal *)signal RAC_WARN_UNUSED_RESULT; + +/// Sends the latest `next` from any of the signals. +/// +/// Returns a signal that passes through values from each of the given signals, +/// and sends `completed` when all of them complete. If any signal sends an error, +/// the returned signal sends `error` immediately. ++ (RACSignal *)merge:(id)signals RAC_WARN_UNUSED_RESULT; + +/// Merges the signals sent by the receiver into a flattened signal, but only +/// subscribes to `maxConcurrent` number of signals at a time. New signals are +/// queued and subscribed to as other signals complete. +/// +/// If an error occurs on any of the signals, it is sent on the returned signal. +/// It completes only after the receiver and all sent signals have completed. +/// +/// This corresponds to `Merge(IObservable>, Int32)` +/// in Rx. +/// +/// maxConcurrent - the maximum number of signals to subscribe to at a +/// time. If 0, it subscribes to an unlimited number of +/// signals. +- (RACSignal *)flatten:(NSUInteger)maxConcurrent RAC_WARN_UNUSED_RESULT; + +/// Ignores all `next`s from the receiver, waits for the receiver to complete, +/// then subscribes to a new signal. +/// +/// block - A block which will create or obtain a new signal to subscribe to, +/// executed only after the receiver completes. This block must not be +/// nil, and it must not return a nil signal. +/// +/// Returns a signal which will pass through the events of the signal created in +/// `block`. If the receiver errors out, the returned signal will error as well. +- (RACSignal *)then:(RACSignal * (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Concats the inner signals of a signal of signals. +- (RACSignal *)concat RAC_WARN_UNUSED_RESULT; + +/// Aggregates the `next` values of the receiver into a single combined value. +/// +/// The algorithm proceeds as follows: +/// +/// 1. `start` is passed into the block as the `running` value, and the first +/// element of the receiver is passed into the block as the `next` value. +/// 2. The result of the invocation (`running`) and the next element of the +/// receiver (`next`) is passed into `reduceBlock`. +/// 3. Steps 2 and 3 are repeated until all values have been processed. +/// 4. The last result of `reduceBlock` is sent on the returned signal. +/// +/// This method is similar to -scanWithStart:reduce:, except that only the +/// final result is sent on the returned signal. +/// +/// start - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Returns a signal that will send the aggregated value when the receiver +/// completes, then itself complete. If the receiver never sends any values, +/// `start` will be sent instead. +- (RACSignal *)aggregateWithStart:(id)start reduce:(id (^)(id running, id next))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Aggregates the `next` values of the receiver into a single combined value. +/// This is indexed version of -aggregateWithStart:reduce:. +/// +/// start - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. This block takes zero-based index value as the last +/// parameter. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Returns a signal that will send the aggregated value when the receiver +/// completes, then itself complete. If the receiver never sends any values, +/// `start` will be sent instead. +- (RACSignal *)aggregateWithStart:(id)start reduceWithIndex:(id (^)(id running, id next, NSUInteger index))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Aggregates the `next` values of the receiver into a single combined value. +/// +/// This invokes `startFactory` block on each subscription, then calls +/// -aggregateWithStart:reduce: with the return value of the block as start value. +/// +/// startFactory - The block that returns start value which will be combined +/// with the first element of the receiver. Cannot be nil. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Returns a signal that will send the aggregated value when the receiver +/// completes, then itself complete. If the receiver never sends any values, +/// the return value of `startFactory` will be sent instead. +- (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory reduce:(id (^)(id running, id next))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Invokes -setKeyPath:onObject:nilValue: with `nil` for the nil value. +/// +/// WARNING: Under certain conditions, this method is known to be thread-unsafe. +/// See the description in -setKeyPath:onObject:nilValue:. +- (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object; + +/// Binds the receiver to an object, automatically setting the given key path on +/// every `next`. When the signal completes, the binding is automatically +/// disposed of. +/// +/// WARNING: Under certain conditions, this method is known to be thread-unsafe. +/// A crash can result if `object` is deallocated concurrently on +/// another thread within a window of time between a value being sent +/// on this signal and immediately prior to the invocation of +/// -setValue:forKeyPath:, which sets the property. To prevent this, +/// ensure `object` is deallocated on the same thread the receiver +/// sends on, or ensure that the returned disposable is disposed of +/// before `object` deallocates. +/// See https://github.com/ReactiveCocoa/ReactiveCocoa/pull/1184 +/// +/// Sending an error on the signal is considered undefined behavior, and will +/// generate an assertion failure in Debug builds. +/// +/// A given key on an object should only have one active signal bound to it at any +/// given time. Binding more than one signal to the same property is considered +/// undefined behavior. +/// +/// keyPath - The key path to update with `next`s from the receiver. +/// object - The object that `keyPath` is relative to. +/// nilValue - The value to set at the key path whenever `nil` is sent by the +/// receiver. This may be nil when binding to object properties, but +/// an NSValue should be used for primitive properties, to avoid an +/// exception if `nil` is sent (which might occur if an intermediate +/// object is set to `nil`). +/// +/// Returns a disposable which can be used to terminate the binding. +- (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object nilValue:(nullable id)nilValue; + +/// Sends NSDate.date every `interval` seconds. +/// +/// interval - The time interval in seconds at which the current time is sent. +/// scheduler - The scheduler upon which the current NSDate should be sent. This +/// must not be nil or +[RACScheduler immediateScheduler]. +/// +/// Returns a signal that sends the current date/time every `interval` on +/// `scheduler`. ++ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler RAC_WARN_UNUSED_RESULT; + +/// Sends NSDate.date at intervals of at least `interval` seconds, up to +/// approximately `interval` + `leeway` seconds. +/// +/// The created signal will defer sending each `next` for at least `interval` +/// seconds, and for an additional amount of time up to `leeway` seconds in the +/// interest of performance or power consumption. Note that some additional +/// latency is to be expected, even when specifying a `leeway` of 0. +/// +/// interval - The base interval between `next`s. +/// scheduler - The scheduler upon which the current NSDate should be sent. This +/// must not be nil or +[RACScheduler immediateScheduler]. +/// leeway - The maximum amount of additional time the `next` can be deferred. +/// +/// Returns a signal that sends the current date/time at intervals of at least +/// `interval seconds` up to approximately `interval` + `leeway` seconds on +/// `scheduler`. ++ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler withLeeway:(NSTimeInterval)leeway RAC_WARN_UNUSED_RESULT; + +/// Takes `next`s until the `signalTrigger` sends `next` or `completed`. +/// +/// Returns a signal which passes through all events from the receiver until +/// `signalTrigger` sends `next` or `completed`, at which point the returned signal +/// will send `completed`. +- (RACSignal *)takeUntil:(RACSignal *)signalTrigger RAC_WARN_UNUSED_RESULT; + +/// Takes `next`s until the `replacement` sends an event. +/// +/// replacement - The signal which replaces the receiver as soon as it sends an +/// event. +/// +/// Returns a signal which passes through `next`s and `error` from the receiver +/// until `replacement` sends an event, at which point the returned signal will +/// send that event and switch to passing through events from `replacement` +/// instead, regardless of whether the receiver has sent events already. +- (RACSignal *)takeUntilReplacement:(RACSignal *)replacement RAC_WARN_UNUSED_RESULT; + +/// Subscribes to the returned signal when an error occurs. +- (RACSignal *)catch:(RACSignal * (^)(NSError * _Nonnull error))catchBlock RAC_WARN_UNUSED_RESULT; + +/// Subscribes to the given signal when an error occurs. +- (RACSignal *)catchTo:(RACSignal *)signal RAC_WARN_UNUSED_RESULT; + +/// Returns a signal that will either immediately send the return value of +/// `tryBlock` and complete, or error using the `NSError` passed out from the +/// block. +/// +/// tryBlock - An action that performs some computation that could fail. If the +/// block returns nil, the block must return an error via the +/// `errorPtr` parameter. +/// +/// Example: +/// +/// [RACSignal try:^(NSError **error) { +/// return [NSJSONSerialization JSONObjectWithData:someJSONData options:0 error:error]; +/// }]; ++ (RACSignal *)try:(nullable ValueType (^)(NSError **errorPtr))tryBlock RAC_WARN_UNUSED_RESULT; + +/// Runs `tryBlock` against each of the receiver's values, passing values +/// until `tryBlock` returns NO, or the receiver completes. +/// +/// tryBlock - An action to run against each of the receiver's values. +/// The block should return YES to indicate that the action was +/// successful. This block must not be nil. +/// +/// Example: +/// +/// // The returned signal will send an error if data values cannot be +/// // written to `someFileURL`. +/// [signal try:^(NSData *data, NSError **errorPtr) { +/// return [data writeToURL:someFileURL options:NSDataWritingAtomic error:errorPtr]; +/// }]; +/// +/// Returns a signal which passes through all the values of the receiver. If +/// `tryBlock` fails for any value, the returned signal will error using the +/// `NSError` passed out from the block. +- (RACSignal *)try:(BOOL (^)(id _Nullable value, NSError **errorPtr))tryBlock RAC_WARN_UNUSED_RESULT; + +/// Runs `mapBlock` against each of the receiver's values, mapping values until +/// `mapBlock` returns nil, or the receiver completes. +/// +/// mapBlock - An action to map each of the receiver's values. The block should +/// return a non-nil value to indicate that the action was successful. +/// This block must not be nil. +/// +/// Example: +/// +/// // The returned signal will send an error if data cannot be read from +/// // `fileURL`. +/// [signal tryMap:^(NSURL *fileURL, NSError **errorPtr) { +/// return [NSData dataWithContentsOfURL:fileURL options:0 error:errorPtr]; +/// }]; +/// +/// Returns a signal which transforms all the values of the receiver. If +/// `mapBlock` returns nil for any value, the returned signal will error using +/// the `NSError` passed out from the block. +- (RACSignal *)tryMap:(id (^)(id _Nullable value, NSError **errorPtr))mapBlock RAC_WARN_UNUSED_RESULT; + +/// Returns the first `next`. Note that this is a blocking call. +- (nullable ValueType)first; + +/// Returns the first `next` or `defaultValue` if the signal completes or errors +/// without sending a `next`. Note that this is a blocking call. +- (nullable ValueType)firstOrDefault:(nullable ValueType)defaultValue; + +/// Returns the first `next` or `defaultValue` if the signal completes or errors +/// without sending a `next`. If an error occurs success will be NO and error +/// will be populated. Note that this is a blocking call. +/// +/// Both success and error may be NULL. +- (nullable ValueType)firstOrDefault:(nullable ValueType)defaultValue success:(nullable BOOL *)success error:(NSError * _Nullable * _Nullable)error; + +/// Blocks the caller and waits for the signal to complete. +/// +/// error - If not NULL, set to any error that occurs. +/// +/// Returns whether the signal completed successfully. If NO, `error` will be set +/// to the error that occurred. +- (BOOL)waitUntilCompleted:(NSError * _Nullable * _Nullable)error; + +/// Defers creation of a signal until the signal's actually subscribed to. +/// +/// This can be used to effectively turn a hot signal into a cold signal. ++ (RACSignal *)defer:(RACSignal * (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Every time the receiver sends a new RACSignal, subscribes and sends `next`s and +/// `error`s only for that signal. +/// +/// The receiver must be a signal of signals. +/// +/// Returns a signal which passes through `next`s and `error`s from the latest +/// signal sent by the receiver, and sends `completed` when both the receiver and +/// the last sent signal complete. +- (RACSignal *)switchToLatest RAC_WARN_UNUSED_RESULT; + +/// Switches between the signals in `cases` as well as `defaultSignal` based on +/// the latest value sent by `signal`. +/// +/// signal - A signal of objects used as keys in the `cases` dictionary. +/// This argument must not be nil. +/// cases - A dictionary that has signals as values. This argument must +/// not be nil. A RACTupleNil key in this dictionary will match +/// nil `next` events that are received on `signal`. +/// defaultSignal - The signal to pass through after `signal` sends a value for +/// which `cases` does not contain a signal. If nil, any +/// unmatched values will result in +/// a RACSignalErrorNoMatchingCase error. +/// +/// Returns a signal which passes through `next`s and `error`s from one of the +/// the signals in `cases` or `defaultSignal`, and sends `completed` when both +/// `signal` and the last used signal complete. If no `defaultSignal` is given, +/// an unmatched `next` will result in an error on the returned signal. ++ (RACSignal *)switch:(RACSignal *)signal cases:(NSDictionary *)cases default:(nullable RACSignal *)defaultSignal RAC_WARN_UNUSED_RESULT; + +/// Switches between `trueSignal` and `falseSignal` based on the latest value +/// sent by `boolSignal`. +/// +/// boolSignal - A signal of BOOLs determining whether `trueSignal` or +/// `falseSignal` should be active. This argument must not be nil. +/// trueSignal - The signal to pass through after `boolSignal` has sent YES. +/// This argument must not be nil. +/// falseSignal - The signal to pass through after `boolSignal` has sent NO. This +/// argument must not be nil. +/// +/// Returns a signal which passes through `next`s and `error`s from `trueSignal` +/// and/or `falseSignal`, and sends `completed` when both `boolSignal` and the +/// last switched signal complete. ++ (RACSignal *)if:(RACSignal *)boolSignal then:(RACSignal *)trueSignal else:(RACSignal *)falseSignal RAC_WARN_UNUSED_RESULT; + +/// Adds every `next` to an array. Nils are represented by NSNulls. Note that +/// this is a blocking call. +/// +/// **This is not the same as the `ToArray` method in Rx.** See -collect for +/// that behavior instead. +/// +/// Returns the array of `next` values, or nil if an error occurs. +- (nullable NSArray *)toArray; + +/// Adds every `next` to a sequence. Nils are represented by NSNulls. +/// +/// This corresponds to the `ToEnumerable` method in Rx. +/// +/// Returns a sequence which provides values from the signal as they're sent. +/// Trying to retrieve a value from the sequence which has not yet been sent will +/// block. +@property (nonatomic, strong, readonly) RACSequence *sequence; + +/// Creates and returns a multicast connection. This allows you to share a single +/// subscription to the underlying signal. +- (RACMulticastConnection *)publish RAC_WARN_UNUSED_RESULT; + +/// Creates and returns a multicast connection that pushes values into the given +/// subject. This allows you to share a single subscription to the underlying +/// signal. +- (RACMulticastConnection *)multicast:(RACSubject *)subject RAC_WARN_UNUSED_RESULT; + +/// Multicasts the signal to a RACReplaySubject of unlimited capacity, and +/// immediately connects to the resulting RACMulticastConnection. +/// +/// Returns the connected, multicasted signal. +- (RACSignal *)replay; + +/// Multicasts the signal to a RACReplaySubject of capacity 1, and immediately +/// connects to the resulting RACMulticastConnection. +/// +/// Returns the connected, multicasted signal. +- (RACSignal *)replayLast; + +/// Multicasts the signal to a RACReplaySubject of unlimited capacity, and +/// lazily connects to the resulting RACMulticastConnection. +/// +/// This means the returned signal will subscribe to the multicasted signal only +/// when the former receives its first subscription. +/// +/// Returns the lazily connected, multicasted signal. +- (RACSignal *)replayLazily; + +/// Sends an error after `interval` seconds if the source doesn't complete +/// before then. +/// +/// The error will be in the RACSignalErrorDomain and have a code of +/// RACSignalErrorTimedOut. +/// +/// interval - The number of seconds after which the signal should error out. +/// scheduler - The scheduler upon which any timeout error should be sent. This +/// must not be nil or +[RACScheduler immediateScheduler]. +/// +/// Returns a signal that passes through the receiver's events, until the stream +/// finishes or times out, at which point an error will be sent on `scheduler`. +- (RACSignal *)timeout:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler RAC_WARN_UNUSED_RESULT; + +/// Creates and returns a signal that delivers its events on the given scheduler. +/// Any side effects of the receiver will still be performed on the original +/// thread. +/// +/// This is ideal when the signal already performs its work on the desired +/// thread, but you want to handle its events elsewhere. +/// +/// This corresponds to the `ObserveOn` method in Rx. +- (RACSignal *)deliverOn:(RACScheduler *)scheduler RAC_WARN_UNUSED_RESULT; + +/// Creates and returns a signal that executes its side effects and delivers its +/// events on the given scheduler. +/// +/// Use of this operator should be avoided whenever possible, because the +/// receiver's side effects may not be safe to run on another thread. If you just +/// want to receive the signal's events on `scheduler`, use -deliverOn: instead. +- (RACSignal *)subscribeOn:(RACScheduler *)scheduler RAC_WARN_UNUSED_RESULT; + +/// Creates and returns a signal that delivers its events on the main thread. +/// If events are already being sent on the main thread, they may be passed on +/// without delay. An event will instead be queued for later delivery on the main +/// thread if sent on another thread, or if a previous event is already being +/// processed, or has been queued. +/// +/// Any side effects of the receiver will still be performed on the original +/// thread. +/// +/// This can be used when a signal will cause UI updates, to avoid potential +/// flicker caused by delayed delivery of events, such as the first event from +/// a RACObserve at view instantiation. +- (RACSignal *)deliverOnMainThread RAC_WARN_UNUSED_RESULT; + +/// Groups each received object into a group, as determined by calling `keyBlock` +/// with that object. The object sent is transformed by calling `transformBlock` +/// with the object. If `transformBlock` is nil, it sends the original object. +/// +/// The returned signal is a signal of RACGroupedSignal. +- (RACSignal *)groupBy:(id _Nullable (^)(id _Nullable object))keyBlock transform:(nullable id _Nullable (^)(id _Nullable object))transformBlock RAC_WARN_UNUSED_RESULT; + +/// Calls -[RACSignal groupBy:keyBlock transform:nil]. +- (RACSignal *)groupBy:(id _Nullable (^)(id _Nullable object))keyBlock RAC_WARN_UNUSED_RESULT; + +/// Sends an [NSNumber numberWithBool:YES] if the receiving signal sends any +/// objects. +- (RACSignal *)any RAC_WARN_UNUSED_RESULT; + +/// Sends an [NSNumber numberWithBool:YES] if the receiving signal sends any +/// objects that pass `predicateBlock`. +/// +/// predicateBlock - cannot be nil. +- (RACSignal *)any:(BOOL (^)(id _Nullable object))predicateBlock RAC_WARN_UNUSED_RESULT; + +/// Sends an [NSNumber numberWithBool:YES] if all the objects the receiving +/// signal sends pass `predicateBlock`. +/// +/// predicateBlock - cannot be nil. +- (RACSignal *)all:(BOOL (^)(id _Nullable object))predicateBlock RAC_WARN_UNUSED_RESULT; + +/// Resubscribes to the receiving signal if an error occurs, up until it has +/// retried the given number of times. +/// +/// retryCount - if 0, it keeps retrying until it completes. +- (RACSignal *)retry:(NSInteger)retryCount RAC_WARN_UNUSED_RESULT; + +/// Resubscribes to the receiving signal if an error occurs. +- (RACSignal *)retry RAC_WARN_UNUSED_RESULT; + +/// Sends the latest value from the receiver only when `sampler` sends a value. +/// The returned signal could repeat values if `sampler` fires more often than +/// the receiver. Values from `sampler` are ignored before the receiver sends +/// its first value. +/// +/// sampler - The signal that controls when the latest value from the receiver +/// is sent. Cannot be nil. +- (RACSignal *)sample:(RACSignal *)sampler RAC_WARN_UNUSED_RESULT; + +/// Ignores all `next`s from the receiver. +/// +/// Returns a signal which only passes through `error` or `completed` events from +/// the receiver. +- (RACSignal *)ignoreValues RAC_WARN_UNUSED_RESULT; + +/// Converts each of the receiver's events into a RACEvent object. +/// +/// Returns a signal which sends the receiver's events as RACEvents, and +/// completes after the receiver sends `completed` or `error`. +- (RACSignal *> *)materialize RAC_WARN_UNUSED_RESULT; + +/// Converts each RACEvent in the receiver back into "real" RACSignal events. +/// +/// Returns a signal which sends `next` for each value RACEvent, `error` for each +/// error RACEvent, and `completed` for each completed RACEvent. +- (RACSignal *)dematerialize RAC_WARN_UNUSED_RESULT; + +/// Inverts each NSNumber-wrapped BOOL sent by the receiver. It will assert if +/// the receiver sends anything other than NSNumbers. +/// +/// Returns a signal of inverted NSNumber-wrapped BOOLs. +- (RACSignal *)not RAC_WARN_UNUSED_RESULT; + +/// Performs a boolean AND on all of the RACTuple of NSNumbers in sent by the receiver. +/// +/// Asserts if the receiver sends anything other than a RACTuple of one or more NSNumbers. +/// +/// Returns a signal that applies AND to each NSNumber in the tuple. +- (RACSignal *)and RAC_WARN_UNUSED_RESULT; + +/// Performs a boolean OR on all of the RACTuple of NSNumbers in sent by the receiver. +/// +/// Asserts if the receiver sends anything other than a RACTuple of one or more NSNumbers. +/// +/// Returns a signal that applies OR to each NSNumber in the tuple. +- (RACSignal *)or RAC_WARN_UNUSED_RESULT; + +/// Sends the result of calling the block with arguments as packed in each RACTuple +/// sent by the receiver. +/// +/// The receiver must send tuple values, where the first element of the tuple is +/// a block, taking a number of parameters equal to the count of the remaining +/// elements of the tuple, and returning an object. Each block must take at least +/// one argument, so each tuple must contain at least 2 elements. +/// +/// Example: +/// +/// RACSignal *adder = [RACSignal return:^(NSNumber *a, NSNumber *b) { +/// return @(a.intValue + b.intValue); +/// }]; +/// RACSignal *sums = [[RACSignal +/// combineLatest:@[ adder, as, bs ]] +/// reduceApply]; +/// +/// Returns a signal of the result of applying the first element of each tuple +/// to the remaining elements. +- (RACSignal *)reduceApply RAC_WARN_UNUSED_RESULT; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.m b/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.m new file mode 100644 index 0000000..ec250a4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignal+Operations.m @@ -0,0 +1,1333 @@ +// +// RACSignal+Operations.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-09-06. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSignal+Operations.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "RACBlockTrampoline.h" +#import "RACCommand.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACEvent.h" +#import "RACGroupedSignal.h" +#import "RACMulticastConnection+Private.h" +#import "RACReplaySubject.h" +#import "RACScheduler.h" +#import "RACSerialDisposable.h" +#import "RACSignalSequence.h" +#import "RACStream+Private.h" +#import "RACSubject.h" +#import "RACSubscriber+Private.h" +#import "RACSubscriber.h" +#import "RACTuple.h" +#import "RACUnit.h" +#import +#import + +NSString * const RACSignalErrorDomain = @"RACSignalErrorDomain"; + +const NSInteger RACSignalErrorTimedOut = 1; +const NSInteger RACSignalErrorNoMatchingCase = 2; + +// Subscribes to the given signal with the given blocks. +// +// If the signal errors or completes, the corresponding block is invoked. If the +// disposable passed to the block is _not_ disposed, then the signal is +// subscribed to again. +static RACDisposable *subscribeForever (RACSignal *signal, void (^next)(id), void (^error)(NSError *, RACDisposable *), void (^completed)(RACDisposable *)) { + next = [next copy]; + error = [error copy]; + completed = [completed copy]; + + RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; + + RACSchedulerRecursiveBlock recursiveBlock = ^(void (^recurse)(void)) { + RACCompoundDisposable *selfDisposable = [RACCompoundDisposable compoundDisposable]; + [compoundDisposable addDisposable:selfDisposable]; + + __weak RACDisposable *weakSelfDisposable = selfDisposable; + + RACDisposable *subscriptionDisposable = [signal subscribeNext:next error:^(NSError *e) { + @autoreleasepool { + error(e, compoundDisposable); + [compoundDisposable removeDisposable:weakSelfDisposable]; + } + + recurse(); + } completed:^{ + @autoreleasepool { + completed(compoundDisposable); + [compoundDisposable removeDisposable:weakSelfDisposable]; + } + + recurse(); + }]; + + [selfDisposable addDisposable:subscriptionDisposable]; + }; + + // Subscribe once immediately, and then use recursive scheduling for any + // further resubscriptions. + recursiveBlock(^{ + RACScheduler *recursiveScheduler = RACScheduler.currentScheduler ?: [RACScheduler scheduler]; + + RACDisposable *schedulingDisposable = [recursiveScheduler scheduleRecursiveBlock:recursiveBlock]; + [compoundDisposable addDisposable:schedulingDisposable]; + }); + + return compoundDisposable; +} + +@implementation RACSignal (Operations) + +- (RACSignal *)doNext:(void (^)(id x))block { + NSCParameterAssert(block != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + return [self subscribeNext:^(id x) { + block(x); + [subscriber sendNext:x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + [subscriber sendCompleted]; + }]; + }] setNameWithFormat:@"[%@] -doNext:", self.name]; +} + +- (RACSignal *)doError:(void (^)(NSError *error))block { + NSCParameterAssert(block != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + return [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + block(error); + [subscriber sendError:error]; + } completed:^{ + [subscriber sendCompleted]; + }]; + }] setNameWithFormat:@"[%@] -doError:", self.name]; +} + +- (RACSignal *)doCompleted:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + return [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + block(); + [subscriber sendCompleted]; + }]; + }] setNameWithFormat:@"[%@] -doCompleted:", self.name]; +} + +- (RACSignal *)throttle:(NSTimeInterval)interval { + return [[self throttle:interval valuesPassingTest:^(id _) { + return YES; + }] setNameWithFormat:@"[%@] -throttle: %f", self.name, (double)interval]; +} + +- (RACSignal *)throttle:(NSTimeInterval)interval valuesPassingTest:(BOOL (^)(id next))predicate { + NSCParameterAssert(interval >= 0); + NSCParameterAssert(predicate != nil); + + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; + + // We may never use this scheduler, but we need to set it up ahead of + // time so that our scheduled blocks are run serially if we do. + RACScheduler *scheduler = [RACScheduler scheduler]; + + // Information about any currently-buffered `next` event. + __block id nextValue = nil; + __block BOOL hasNextValue = NO; + RACSerialDisposable *nextDisposable = [[RACSerialDisposable alloc] init]; + + void (^flushNext)(BOOL send) = ^(BOOL send) { + @synchronized (compoundDisposable) { + [nextDisposable.disposable dispose]; + + if (!hasNextValue) return; + if (send) [subscriber sendNext:nextValue]; + + nextValue = nil; + hasNextValue = NO; + } + }; + + RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { + RACScheduler *delayScheduler = RACScheduler.currentScheduler ?: scheduler; + BOOL shouldThrottle = predicate(x); + + @synchronized (compoundDisposable) { + flushNext(NO); + if (!shouldThrottle) { + [subscriber sendNext:x]; + return; + } + + nextValue = x; + hasNextValue = YES; + nextDisposable.disposable = [delayScheduler afterDelay:interval schedule:^{ + flushNext(YES); + }]; + } + } error:^(NSError *error) { + [compoundDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + flushNext(YES); + [subscriber sendCompleted]; + }]; + + [compoundDisposable addDisposable:subscriptionDisposable]; + return compoundDisposable; + }] setNameWithFormat:@"[%@] -throttle: %f valuesPassingTest:", self.name, (double)interval]; +} + +- (RACSignal *)delay:(NSTimeInterval)interval { + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + // We may never use this scheduler, but we need to set it up ahead of + // time so that our scheduled blocks are run serially if we do. + RACScheduler *scheduler = [RACScheduler scheduler]; + + void (^schedule)(dispatch_block_t) = ^(dispatch_block_t block) { + RACScheduler *delayScheduler = RACScheduler.currentScheduler ?: scheduler; + RACDisposable *schedulerDisposable = [delayScheduler afterDelay:interval schedule:block]; + [disposable addDisposable:schedulerDisposable]; + }; + + RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { + schedule(^{ + [subscriber sendNext:x]; + }); + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + schedule(^{ + [subscriber sendCompleted]; + }); + }]; + + [disposable addDisposable:subscriptionDisposable]; + return disposable; + }] setNameWithFormat:@"[%@] -delay: %f", self.name, (double)interval]; +} + +- (RACSignal *)repeat { + return [[RACSignal createSignal:^(id subscriber) { + return subscribeForever(self, + ^(id x) { + [subscriber sendNext:x]; + }, + ^(NSError *error, RACDisposable *disposable) { + [disposable dispose]; + [subscriber sendError:error]; + }, + ^(RACDisposable *disposable) { + // Resubscribe. + }); + }] setNameWithFormat:@"[%@] -repeat", self.name]; +} + +- (RACSignal *)catch:(RACSignal * (^)(NSError *error))catchBlock { + NSCParameterAssert(catchBlock != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + RACSerialDisposable *catchDisposable = [[RACSerialDisposable alloc] init]; + + RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + RACSignal *signal = catchBlock(error); + NSCAssert(signal != nil, @"Expected non-nil signal from catch block on %@", self); + catchDisposable.disposable = [signal subscribe:subscriber]; + } completed:^{ + [subscriber sendCompleted]; + }]; + + return [RACDisposable disposableWithBlock:^{ + [catchDisposable dispose]; + [subscriptionDisposable dispose]; + }]; + }] setNameWithFormat:@"[%@] -catch:", self.name]; +} + +- (RACSignal *)catchTo:(RACSignal *)signal { + return [[self catch:^(NSError *error) { + return signal; + }] setNameWithFormat:@"[%@] -catchTo: %@", self.name, signal]; +} + ++ (RACSignal *)try:(id (^)(NSError **errorPtr))tryBlock { + NSCParameterAssert(tryBlock != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + NSError *error; + id value = tryBlock(&error); + RACSignal *signal = (value == nil ? [RACSignal error:error] : [RACSignal return:value]); + return [signal subscribe:subscriber]; + }] setNameWithFormat:@"+try:"]; +} + +- (RACSignal *)try:(BOOL (^)(id value, NSError **errorPtr))tryBlock { + NSCParameterAssert(tryBlock != NULL); + + return [[self flattenMap:^(id value) { + NSError *error = nil; + BOOL passed = tryBlock(value, &error); + return (passed ? [RACSignal return:value] : [RACSignal error:error]); + }] setNameWithFormat:@"[%@] -try:", self.name]; +} + +- (RACSignal *)tryMap:(id (^)(id value, NSError **errorPtr))mapBlock { + NSCParameterAssert(mapBlock != NULL); + + return [[self flattenMap:^(id value) { + NSError *error = nil; + id mappedValue = mapBlock(value, &error); + return (mappedValue == nil ? [RACSignal error:error] : [RACSignal return:mappedValue]); + }] setNameWithFormat:@"[%@] -tryMap:", self.name]; +} + +- (RACSignal *)initially:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + return [[RACSignal defer:^{ + block(); + return self; + }] setNameWithFormat:@"[%@] -initially:", self.name]; +} + +- (RACSignal *)finally:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + return [[[self + doError:^(NSError *error) { + block(); + }] + doCompleted:^{ + block(); + }] + setNameWithFormat:@"[%@] -finally:", self.name]; +} + +- (RACSignal *)bufferWithTime:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { + NSCParameterAssert(scheduler != nil); + NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); + + return [[RACSignal createSignal:^(id subscriber) { + RACSerialDisposable *timerDisposable = [[RACSerialDisposable alloc] init]; + NSMutableArray *values = [NSMutableArray array]; + + void (^flushValues)() = ^{ + @synchronized (values) { + [timerDisposable.disposable dispose]; + + if (values.count == 0) return; + + RACTuple *tuple = [RACTuple tupleWithObjectsFromArray:values]; + [values removeAllObjects]; + [subscriber sendNext:tuple]; + } + }; + + RACDisposable *selfDisposable = [self subscribeNext:^(id x) { + @synchronized (values) { + if (values.count == 0) { + timerDisposable.disposable = [scheduler afterDelay:interval schedule:flushValues]; + } + + [values addObject:x ?: RACTupleNil.tupleNil]; + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + flushValues(); + [subscriber sendCompleted]; + }]; + + return [RACDisposable disposableWithBlock:^{ + [selfDisposable dispose]; + [timerDisposable dispose]; + }]; + }] setNameWithFormat:@"[%@] -bufferWithTime: %f onScheduler: %@", self.name, (double)interval, scheduler]; +} + +- (RACSignal *)collect { + return [[self aggregateWithStartFactory:^{ + return [[NSMutableArray alloc] init]; + } reduce:^(NSMutableArray *collectedValues, id x) { + [collectedValues addObject:(x ?: NSNull.null)]; + return collectedValues; + }] setNameWithFormat:@"[%@] -collect", self.name]; +} + +- (RACSignal *)takeLast:(NSUInteger)count { + return [[RACSignal createSignal:^(id subscriber) { + NSMutableArray *valuesTaken = [NSMutableArray arrayWithCapacity:count]; + return [self subscribeNext:^(id x) { + [valuesTaken addObject:x ? : RACTupleNil.tupleNil]; + + while (valuesTaken.count > count) { + [valuesTaken removeObjectAtIndex:0]; + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + for (id value in valuesTaken) { + [subscriber sendNext:value == RACTupleNil.tupleNil ? nil : value]; + } + + [subscriber sendCompleted]; + }]; + }] setNameWithFormat:@"[%@] -takeLast: %lu", self.name, (unsigned long)count]; +} + +- (RACSignal *)combineLatestWith:(RACSignal *)signal { + NSCParameterAssert(signal != nil); + + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + __block id lastSelfValue = nil; + __block BOOL selfCompleted = NO; + + __block id lastOtherValue = nil; + __block BOOL otherCompleted = NO; + + void (^sendNext)(void) = ^{ + @synchronized (disposable) { + if (lastSelfValue == nil || lastOtherValue == nil) return; + [subscriber sendNext:RACTuplePack(lastSelfValue, lastOtherValue)]; + } + }; + + RACDisposable *selfDisposable = [self subscribeNext:^(id x) { + @synchronized (disposable) { + lastSelfValue = x ?: RACTupleNil.tupleNil; + sendNext(); + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + @synchronized (disposable) { + selfCompleted = YES; + if (otherCompleted) [subscriber sendCompleted]; + } + }]; + + [disposable addDisposable:selfDisposable]; + + RACDisposable *otherDisposable = [signal subscribeNext:^(id x) { + @synchronized (disposable) { + lastOtherValue = x ?: RACTupleNil.tupleNil; + sendNext(); + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + @synchronized (disposable) { + otherCompleted = YES; + if (selfCompleted) [subscriber sendCompleted]; + } + }]; + + [disposable addDisposable:otherDisposable]; + + return disposable; + }] setNameWithFormat:@"[%@] -combineLatestWith: %@", self.name, signal]; +} + ++ (RACSignal *)combineLatest:(id)signals { + return [[self join:signals block:^(RACSignal *left, RACSignal *right) { + return [left combineLatestWith:right]; + }] setNameWithFormat:@"+combineLatest: %@", signals]; +} + ++ (RACSignal *)combineLatest:(id)signals reduce:(id (^)())reduceBlock { + NSCParameterAssert(reduceBlock != nil); + + RACSignal *result = [self combineLatest:signals]; + + // Although we assert this condition above, older versions of this method + // supported this argument being nil. Avoid crashing Release builds of + // apps that depended on that. + if (reduceBlock != nil) result = [result reduceEach:reduceBlock]; + + return [result setNameWithFormat:@"+combineLatest: %@ reduce:", signals]; +} + +- (RACSignal *)merge:(RACSignal *)signal { + return [[RACSignal + merge:@[ self, signal ]] + setNameWithFormat:@"[%@] -merge: %@", self.name, signal]; +} + ++ (RACSignal *)merge:(id)signals { + NSMutableArray *copiedSignals = [[NSMutableArray alloc] init]; + for (RACSignal *signal in signals) { + [copiedSignals addObject:signal]; + } + + return [[[RACSignal + createSignal:^ RACDisposable * (id subscriber) { + for (RACSignal *signal in copiedSignals) { + [subscriber sendNext:signal]; + } + + [subscriber sendCompleted]; + return nil; + }] + flatten] + setNameWithFormat:@"+merge: %@", copiedSignals]; +} + +- (RACSignal *)flatten:(NSUInteger)maxConcurrent { + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *compoundDisposable = [[RACCompoundDisposable alloc] init]; + + // Contains disposables for the currently active subscriptions. + // + // This should only be used while synchronized on `subscriber`. + NSMutableArray *activeDisposables = [[NSMutableArray alloc] initWithCapacity:maxConcurrent]; + + // Whether the signal-of-signals has completed yet. + // + // This should only be used while synchronized on `subscriber`. + __block BOOL selfCompleted = NO; + + // Subscribes to the given signal. + __block void (^subscribeToSignal)(RACSignal *); + + // Weak reference to the above, to avoid a leak. + __weak __block void (^recur)(RACSignal *); + + // Sends completed to the subscriber if all signals are finished. + // + // This should only be used while synchronized on `subscriber`. + void (^completeIfAllowed)(void) = ^{ + if (selfCompleted && activeDisposables.count == 0) { + [subscriber sendCompleted]; + } + }; + + // The signals waiting to be started. + // + // This array should only be used while synchronized on `subscriber`. + NSMutableArray *queuedSignals = [NSMutableArray array]; + + recur = subscribeToSignal = ^(RACSignal *signal) { + RACSerialDisposable *serialDisposable = [[RACSerialDisposable alloc] init]; + + @synchronized (subscriber) { + [compoundDisposable addDisposable:serialDisposable]; + [activeDisposables addObject:serialDisposable]; + } + + serialDisposable.disposable = [signal subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + __strong void (^subscribeToSignal)(RACSignal *) = recur; + RACSignal *nextSignal; + + @synchronized (subscriber) { + [compoundDisposable removeDisposable:serialDisposable]; + [activeDisposables removeObjectIdenticalTo:serialDisposable]; + + if (queuedSignals.count == 0) { + completeIfAllowed(); + return; + } + + nextSignal = queuedSignals[0]; + [queuedSignals removeObjectAtIndex:0]; + } + + subscribeToSignal(nextSignal); + }]; + }; + + [compoundDisposable addDisposable:[self subscribeNext:^(RACSignal *signal) { + if (signal == nil) return; + + NSCAssert([signal isKindOfClass:RACSignal.class], @"Expected a RACSignal, got %@", signal); + + @synchronized (subscriber) { + if (maxConcurrent > 0 && activeDisposables.count >= maxConcurrent) { + [queuedSignals addObject:signal]; + + // If we need to wait, skip subscribing to this + // signal. + return; + } + } + + subscribeToSignal(signal); + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + @synchronized (subscriber) { + selfCompleted = YES; + completeIfAllowed(); + } + }]]; + + [compoundDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + // A strong reference is held to `subscribeToSignal` until we're + // done, preventing it from deallocating early. + subscribeToSignal = nil; + }]]; + + return compoundDisposable; + }] setNameWithFormat:@"[%@] -flatten: %lu", self.name, (unsigned long)maxConcurrent]; +} + +- (RACSignal *)then:(RACSignal * (^)(void))block { + NSCParameterAssert(block != nil); + + return [[[self + ignoreValues] + concat:[RACSignal defer:block]] + setNameWithFormat:@"[%@] -then:", self.name]; +} + +- (RACSignal *)concat { + return [[self flatten:1] setNameWithFormat:@"[%@] -concat", self.name]; +} + +- (RACSignal *)aggregateWithStartFactory:(id (^)(void))startFactory reduce:(id (^)(id running, id next))reduceBlock { + NSCParameterAssert(startFactory != NULL); + NSCParameterAssert(reduceBlock != NULL); + + return [[RACSignal defer:^{ + return [self aggregateWithStart:startFactory() reduce:reduceBlock]; + }] setNameWithFormat:@"[%@] -aggregateWithStartFactory:reduce:", self.name]; +} + +- (RACSignal *)aggregateWithStart:(id)start reduce:(id (^)(id running, id next))reduceBlock { + return [[self + aggregateWithStart:start + reduceWithIndex:^(id running, id next, NSUInteger index) { + return reduceBlock(running, next); + }] + setNameWithFormat:@"[%@] -aggregateWithStart: %@ reduce:", self.name, RACDescription(start)]; +} + +- (RACSignal *)aggregateWithStart:(id)start reduceWithIndex:(id (^)(id, id, NSUInteger))reduceBlock { + return [[[[self + scanWithStart:start reduceWithIndex:reduceBlock] + startWith:start] + takeLast:1] + setNameWithFormat:@"[%@] -aggregateWithStart: %@ reduceWithIndex:", self.name, RACDescription(start)]; +} + +- (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object { + return [self setKeyPath:keyPath onObject:object nilValue:nil]; +} + +- (RACDisposable *)setKeyPath:(NSString *)keyPath onObject:(NSObject *)object nilValue:(id)nilValue { + NSCParameterAssert(keyPath != nil); + NSCParameterAssert(object != nil); + + keyPath = [keyPath copy]; + + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + // Purposely not retaining 'object', since we want to tear down the binding + // when it deallocates normally. + __block void * volatile objectPtr = (__bridge void *)object; + + RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { + // Possibly spec, possibly compiler bug, but this __bridge cast does not + // result in a retain here, effectively an invisible __unsafe_unretained + // qualifier. Using objc_precise_lifetime gives the __strong reference + // desired. The explicit use of __strong is strictly defensive. + __strong NSObject *object __attribute__((objc_precise_lifetime)) = (__bridge __strong id)objectPtr; + [object setValue:x ?: nilValue forKeyPath:keyPath]; + } error:^(NSError *error) { + __strong NSObject *object __attribute__((objc_precise_lifetime)) = (__bridge __strong id)objectPtr; + + NSCAssert(NO, @"Received error from %@ in binding for key path \"%@\" on %@: %@", self, keyPath, object, error); + + // Log the error if we're running with assertions disabled. + NSLog(@"Received error from %@ in binding for key path \"%@\" on %@: %@", self, keyPath, object, error); + + [disposable dispose]; + } completed:^{ + [disposable dispose]; + }]; + + [disposable addDisposable:subscriptionDisposable]; + + #if DEBUG + static void *bindingsKey = &bindingsKey; + NSMutableDictionary *bindings; + + @synchronized (object) { + bindings = objc_getAssociatedObject(object, bindingsKey); + if (bindings == nil) { + bindings = [NSMutableDictionary dictionary]; + objc_setAssociatedObject(object, bindingsKey, bindings, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + } + + @synchronized (bindings) { + NSCAssert(bindings[keyPath] == nil, @"Signal %@ is already bound to key path \"%@\" on object %@, adding signal %@ is undefined behavior", [bindings[keyPath] nonretainedObjectValue], keyPath, object, self); + + bindings[keyPath] = [NSValue valueWithNonretainedObject:self]; + } + #endif + + RACDisposable *clearPointerDisposable = [RACDisposable disposableWithBlock:^{ + #if DEBUG + @synchronized (bindings) { + [bindings removeObjectForKey:keyPath]; + } + #endif + + while (YES) { + void *ptr = objectPtr; + if (OSAtomicCompareAndSwapPtrBarrier(ptr, NULL, &objectPtr)) { + break; + } + } + }]; + + [disposable addDisposable:clearPointerDisposable]; + + [object.rac_deallocDisposable addDisposable:disposable]; + + RACCompoundDisposable *objectDisposable = object.rac_deallocDisposable; + return [RACDisposable disposableWithBlock:^{ + [objectDisposable removeDisposable:disposable]; + [disposable dispose]; + }]; +} + ++ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { + return [[RACSignal interval:interval onScheduler:scheduler withLeeway:0.0] setNameWithFormat:@"+interval: %f onScheduler: %@", (double)interval, scheduler]; +} + ++ (RACSignal *)interval:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler withLeeway:(NSTimeInterval)leeway { + NSCParameterAssert(scheduler != nil); + NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); + + return [[RACSignal createSignal:^(id subscriber) { + return [scheduler after:[NSDate dateWithTimeIntervalSinceNow:interval] repeatingEvery:interval withLeeway:leeway schedule:^{ + [subscriber sendNext:[NSDate date]]; + }]; + }] setNameWithFormat:@"+interval: %f onScheduler: %@ withLeeway: %f", (double)interval, scheduler, (double)leeway]; +} + +- (RACSignal *)takeUntil:(RACSignal *)signalTrigger { + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + void (^triggerCompletion)(void) = ^{ + [disposable dispose]; + [subscriber sendCompleted]; + }; + + RACDisposable *triggerDisposable = [signalTrigger subscribeNext:^(id _) { + triggerCompletion(); + } completed:^{ + triggerCompletion(); + }]; + + [disposable addDisposable:triggerDisposable]; + + if (!disposable.disposed) { + RACDisposable *selfDisposable = [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + [disposable dispose]; + [subscriber sendCompleted]; + }]; + + [disposable addDisposable:selfDisposable]; + } + + return disposable; + }] setNameWithFormat:@"[%@] -takeUntil: %@", self.name, signalTrigger]; +} + +- (RACSignal *)takeUntilReplacement:(RACSignal *)replacement { + return [RACSignal createSignal:^(id subscriber) { + RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; + + RACDisposable *replacementDisposable = [replacement subscribeNext:^(id x) { + [selfDisposable dispose]; + [subscriber sendNext:x]; + } error:^(NSError *error) { + [selfDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + [selfDisposable dispose]; + [subscriber sendCompleted]; + }]; + + if (!selfDisposable.disposed) { + selfDisposable.disposable = [[self + concat:[RACSignal never]] + subscribe:subscriber]; + } + + return [RACDisposable disposableWithBlock:^{ + [selfDisposable dispose]; + [replacementDisposable dispose]; + }]; + }]; +} + +- (RACSignal *)switchToLatest { + return [[RACSignal createSignal:^(id subscriber) { + RACMulticastConnection *connection = [self publish]; + + RACDisposable *subscriptionDisposable = [[connection.signal + flattenMap:^(RACSignal *x) { + NSCAssert(x == nil || [x isKindOfClass:RACSignal.class], @"-switchToLatest requires that the source signal (%@) send signals. Instead we got: %@", self, x); + + // -concat:[RACSignal never] prevents completion of the receiver from + // prematurely terminating the inner signal. + return [x takeUntil:[connection.signal concat:[RACSignal never]]]; + }] + subscribe:subscriber]; + + RACDisposable *connectionDisposable = [connection connect]; + return [RACDisposable disposableWithBlock:^{ + [subscriptionDisposable dispose]; + [connectionDisposable dispose]; + }]; + }] setNameWithFormat:@"[%@] -switchToLatest", self.name]; +} + ++ (RACSignal *)switch:(RACSignal *)signal cases:(NSDictionary *)cases default:(RACSignal *)defaultSignal { + NSCParameterAssert(signal != nil); + NSCParameterAssert(cases != nil); + + for (id key in cases) { + id value __attribute__((unused)) = cases[key]; + NSCAssert([value isKindOfClass:RACSignal.class], @"Expected all cases to be RACSignals, %@ isn't", value); + } + + NSDictionary *copy = [cases copy]; + + return [[[signal + map:^(id key) { + if (key == nil) key = RACTupleNil.tupleNil; + + RACSignal *signal = copy[key] ?: defaultSignal; + if (signal == nil) { + NSString *description = [NSString stringWithFormat:NSLocalizedString(@"No matching signal found for value %@", @""), key]; + return [RACSignal error:[NSError errorWithDomain:RACSignalErrorDomain code:RACSignalErrorNoMatchingCase userInfo:@{ NSLocalizedDescriptionKey: description }]]; + } + + return signal; + }] + switchToLatest] + setNameWithFormat:@"+switch: %@ cases: %@ default: %@", signal, cases, defaultSignal]; +} + ++ (RACSignal *)if:(RACSignal *)boolSignal then:(RACSignal *)trueSignal else:(RACSignal *)falseSignal { + NSCParameterAssert(boolSignal != nil); + NSCParameterAssert(trueSignal != nil); + NSCParameterAssert(falseSignal != nil); + + return [[[boolSignal + map:^(NSNumber *value) { + NSCAssert([value isKindOfClass:NSNumber.class], @"Expected %@ to send BOOLs, not %@", boolSignal, value); + + return (value.boolValue ? trueSignal : falseSignal); + }] + switchToLatest] + setNameWithFormat:@"+if: %@ then: %@ else: %@", boolSignal, trueSignal, falseSignal]; +} + +- (id)first { + return [self firstOrDefault:nil]; +} + +- (id)firstOrDefault:(id)defaultValue { + return [self firstOrDefault:defaultValue success:NULL error:NULL]; +} + +- (id)firstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error { + NSCondition *condition = [[NSCondition alloc] init]; + condition.name = [NSString stringWithFormat:@"[%@] -firstOrDefault: %@ success:error:", self.name, defaultValue]; + + __block id value = defaultValue; + __block BOOL done = NO; + + // Ensures that we don't pass values across thread boundaries by reference. + __block NSError *localError; + __block BOOL localSuccess; + + [[self take:1] subscribeNext:^(id x) { + [condition lock]; + + value = x; + localSuccess = YES; + + done = YES; + [condition broadcast]; + [condition unlock]; + } error:^(NSError *e) { + [condition lock]; + + if (!done) { + localSuccess = NO; + localError = e; + + done = YES; + [condition broadcast]; + } + + [condition unlock]; + } completed:^{ + [condition lock]; + + localSuccess = YES; + + done = YES; + [condition broadcast]; + [condition unlock]; + }]; + + [condition lock]; + while (!done) { + [condition wait]; + } + + if (success != NULL) *success = localSuccess; + if (error != NULL) *error = localError; + + [condition unlock]; + return value; +} + +- (BOOL)waitUntilCompleted:(NSError **)error { + BOOL success = NO; + + [[[self + ignoreValues] + setNameWithFormat:@"[%@] -waitUntilCompleted:", self.name] + firstOrDefault:nil success:&success error:error]; + + return success; +} + ++ (RACSignal *)defer:(RACSignal * (^)(void))block { + NSCParameterAssert(block != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + return [block() subscribe:subscriber]; + }] setNameWithFormat:@"+defer:"]; +} + +- (NSArray *)toArray { + return [[[self collect] first] copy]; +} + +- (RACSequence *)sequence { + return [[RACSignalSequence sequenceWithSignal:self] setNameWithFormat:@"[%@] -sequence", self.name]; +} + +- (RACMulticastConnection *)publish { + RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name]; + RACMulticastConnection *connection = [self multicast:subject]; + return connection; +} + +- (RACMulticastConnection *)multicast:(RACSubject *)subject { + [subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name]; + RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject]; + return connection; +} + +- (RACSignal *)replay { + RACReplaySubject *subject = [[RACReplaySubject subject] setNameWithFormat:@"[%@] -replay", self.name]; + + RACMulticastConnection *connection = [self multicast:subject]; + [connection connect]; + + return connection.signal; +} + +- (RACSignal *)replayLast { + RACReplaySubject *subject = [[RACReplaySubject replaySubjectWithCapacity:1] setNameWithFormat:@"[%@] -replayLast", self.name]; + + RACMulticastConnection *connection = [self multicast:subject]; + [connection connect]; + + return connection.signal; +} + +- (RACSignal *)replayLazily { + RACMulticastConnection *connection = [self multicast:[RACReplaySubject subject]]; + return [[RACSignal + defer:^{ + [connection connect]; + return connection.signal; + }] + setNameWithFormat:@"[%@] -replayLazily", self.name]; +} + +- (RACSignal *)timeout:(NSTimeInterval)interval onScheduler:(RACScheduler *)scheduler { + NSCParameterAssert(scheduler != nil); + NSCParameterAssert(scheduler != RACScheduler.immediateScheduler); + + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + RACDisposable *timeoutDisposable = [scheduler afterDelay:interval schedule:^{ + [disposable dispose]; + [subscriber sendError:[NSError errorWithDomain:RACSignalErrorDomain code:RACSignalErrorTimedOut userInfo:nil]]; + }]; + + [disposable addDisposable:timeoutDisposable]; + + RACDisposable *subscriptionDisposable = [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [disposable dispose]; + [subscriber sendError:error]; + } completed:^{ + [disposable dispose]; + [subscriber sendCompleted]; + }]; + + [disposable addDisposable:subscriptionDisposable]; + return disposable; + }] setNameWithFormat:@"[%@] -timeout: %f onScheduler: %@", self.name, (double)interval, scheduler]; +} + +- (RACSignal *)deliverOn:(RACScheduler *)scheduler { + return [[RACSignal createSignal:^(id subscriber) { + return [self subscribeNext:^(id x) { + [scheduler schedule:^{ + [subscriber sendNext:x]; + }]; + } error:^(NSError *error) { + [scheduler schedule:^{ + [subscriber sendError:error]; + }]; + } completed:^{ + [scheduler schedule:^{ + [subscriber sendCompleted]; + }]; + }]; + }] setNameWithFormat:@"[%@] -deliverOn: %@", self.name, scheduler]; +} + +- (RACSignal *)subscribeOn:(RACScheduler *)scheduler { + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + + RACDisposable *schedulingDisposable = [scheduler schedule:^{ + RACDisposable *subscriptionDisposable = [self subscribe:subscriber]; + + [disposable addDisposable:subscriptionDisposable]; + }]; + + [disposable addDisposable:schedulingDisposable]; + return disposable; + }] setNameWithFormat:@"[%@] -subscribeOn: %@", self.name, scheduler]; +} + +- (RACSignal *)deliverOnMainThread { + return [[RACSignal createSignal:^(id subscriber) { + __block volatile int32_t queueLength = 0; + + void (^performOnMainThread)(dispatch_block_t) = ^(dispatch_block_t block) { + int32_t queued = OSAtomicIncrement32(&queueLength); + if (NSThread.isMainThread && queued == 1) { + block(); + OSAtomicDecrement32(&queueLength); + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + block(); + OSAtomicDecrement32(&queueLength); + }); + } + }; + + return [self subscribeNext:^(id x) { + performOnMainThread(^{ + [subscriber sendNext:x]; + }); + } error:^(NSError *error) { + performOnMainThread(^{ + [subscriber sendError:error]; + }); + } completed:^{ + performOnMainThread(^{ + [subscriber sendCompleted]; + }); + }]; + }] setNameWithFormat:@"[%@] -deliverOnMainThread", self.name]; +} + +- (RACSignal *)groupBy:(id (^)(id object))keyBlock transform:(id (^)(id object))transformBlock { + NSCParameterAssert(keyBlock != NULL); + + return [[RACSignal createSignal:^(id subscriber) { + NSMutableDictionary *groups = [NSMutableDictionary dictionary]; + NSMutableArray *orderedGroups = [NSMutableArray array]; + + return [self subscribeNext:^(id x) { + id key = keyBlock(x); + RACGroupedSignal *groupSubject = nil; + @synchronized(groups) { + groupSubject = groups[key]; + if (groupSubject == nil) { + groupSubject = [RACGroupedSignal signalWithKey:key]; + groups[key] = groupSubject; + [orderedGroups addObject:groupSubject]; + [subscriber sendNext:groupSubject]; + } + } + + [groupSubject sendNext:transformBlock != NULL ? transformBlock(x) : x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + + [orderedGroups makeObjectsPerformSelector:@selector(sendError:) withObject:error]; + } completed:^{ + [subscriber sendCompleted]; + + [orderedGroups makeObjectsPerformSelector:@selector(sendCompleted)]; + }]; + }] setNameWithFormat:@"[%@] -groupBy:transform:", self.name]; +} + +- (RACSignal *)groupBy:(id (^)(id object))keyBlock { + return [[self groupBy:keyBlock transform:nil] setNameWithFormat:@"[%@] -groupBy:", self.name]; +} + +- (RACSignal *)any { + return [[self any:^(id x) { + return YES; + }] setNameWithFormat:@"[%@] -any", self.name]; +} + +- (RACSignal *)any:(BOOL (^)(id object))predicateBlock { + NSCParameterAssert(predicateBlock != NULL); + + return [[[self materialize] bind:^{ + return ^(RACEvent *event, BOOL *stop) { + if (event.finished) { + *stop = YES; + return [RACSignal return:@NO]; + } + + if (predicateBlock(event.value)) { + *stop = YES; + return [RACSignal return:@YES]; + } + + return [RACSignal empty]; + }; + }] setNameWithFormat:@"[%@] -any:", self.name]; +} + +- (RACSignal *)all:(BOOL (^)(id object))predicateBlock { + NSCParameterAssert(predicateBlock != NULL); + + return [[[self materialize] bind:^{ + return ^(RACEvent *event, BOOL *stop) { + if (event.eventType == RACEventTypeCompleted) { + *stop = YES; + return [RACSignal return:@YES]; + } + + if (event.eventType == RACEventTypeError || !predicateBlock(event.value)) { + *stop = YES; + return [RACSignal return:@NO]; + } + + return [RACSignal empty]; + }; + }] setNameWithFormat:@"[%@] -all:", self.name]; +} + +- (RACSignal *)retry:(NSInteger)retryCount { + return [[RACSignal createSignal:^(id subscriber) { + __block NSInteger currentRetryCount = 0; + return subscribeForever(self, + ^(id x) { + [subscriber sendNext:x]; + }, + ^(NSError *error, RACDisposable *disposable) { + if (retryCount == 0 || currentRetryCount < retryCount) { + // Resubscribe. + currentRetryCount++; + return; + } + + [disposable dispose]; + [subscriber sendError:error]; + }, + ^(RACDisposable *disposable) { + [disposable dispose]; + [subscriber sendCompleted]; + }); + }] setNameWithFormat:@"[%@] -retry: %lu", self.name, (unsigned long)retryCount]; +} + +- (RACSignal *)retry { + return [[self retry:0] setNameWithFormat:@"[%@] -retry", self.name]; +} + +- (RACSignal *)sample:(RACSignal *)sampler { + NSCParameterAssert(sampler != nil); + + return [[RACSignal createSignal:^(id subscriber) { + NSLock *lock = [[NSLock alloc] init]; + __block id lastValue; + __block BOOL hasValue = NO; + + RACSerialDisposable *samplerDisposable = [[RACSerialDisposable alloc] init]; + RACDisposable *sourceDisposable = [self subscribeNext:^(id x) { + [lock lock]; + hasValue = YES; + lastValue = x; + [lock unlock]; + } error:^(NSError *error) { + [samplerDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + [samplerDisposable dispose]; + [subscriber sendCompleted]; + }]; + + samplerDisposable.disposable = [sampler subscribeNext:^(id _) { + BOOL shouldSend = NO; + id value; + [lock lock]; + shouldSend = hasValue; + value = lastValue; + [lock unlock]; + + if (shouldSend) { + [subscriber sendNext:value]; + } + } error:^(NSError *error) { + [sourceDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + [sourceDisposable dispose]; + [subscriber sendCompleted]; + }]; + + return [RACDisposable disposableWithBlock:^{ + [samplerDisposable dispose]; + [sourceDisposable dispose]; + }]; + }] setNameWithFormat:@"[%@] -sample: %@", self.name, sampler]; +} + +- (RACSignal *)ignoreValues { + return [[self filter:^(id _) { + return NO; + }] setNameWithFormat:@"[%@] -ignoreValues", self.name]; +} + +- (RACSignal *)materialize { + return [[RACSignal createSignal:^(id subscriber) { + return [self subscribeNext:^(id x) { + [subscriber sendNext:[RACEvent eventWithValue:x]]; + } error:^(NSError *error) { + [subscriber sendNext:[RACEvent eventWithError:error]]; + [subscriber sendCompleted]; + } completed:^{ + [subscriber sendNext:RACEvent.completedEvent]; + [subscriber sendCompleted]; + }]; + }] setNameWithFormat:@"[%@] -materialize", self.name]; +} + +- (RACSignal *)dematerialize { + return [[self bind:^{ + return ^(RACEvent *event, BOOL *stop) { + switch (event.eventType) { + case RACEventTypeCompleted: + *stop = YES; + return [RACSignal empty]; + + case RACEventTypeError: + *stop = YES; + return [RACSignal error:event.error]; + + case RACEventTypeNext: + return [RACSignal return:event.value]; + } + }; + }] setNameWithFormat:@"[%@] -dematerialize", self.name]; +} + +- (RACSignal *)not { + return [[self map:^(NSNumber *value) { + NSCAssert([value isKindOfClass:NSNumber.class], @"-not must only be used on a signal of NSNumbers. Instead, got: %@", value); + + return @(!value.boolValue); + }] setNameWithFormat:@"[%@] -not", self.name]; +} + +- (RACSignal *)and { + return [[self map:^(RACTuple *tuple) { + NSCAssert([tuple isKindOfClass:RACTuple.class], @"-and must only be used on a signal of RACTuples of NSNumbers. Instead, received: %@", tuple); + NSCAssert(tuple.count > 0, @"-and must only be used on a signal of RACTuples of NSNumbers, with at least 1 value in the tuple"); + + return @([tuple.rac_sequence all:^(NSNumber *number) { + NSCAssert([number isKindOfClass:NSNumber.class], @"-and must only be used on a signal of RACTuples of NSNumbers. Instead, tuple contains a non-NSNumber value: %@", tuple); + + return number.boolValue; + }]); + }] setNameWithFormat:@"[%@] -and", self.name]; +} + +- (RACSignal *)or { + return [[self map:^(RACTuple *tuple) { + NSCAssert([tuple isKindOfClass:RACTuple.class], @"-or must only be used on a signal of RACTuples of NSNumbers. Instead, received: %@", tuple); + NSCAssert(tuple.count > 0, @"-or must only be used on a signal of RACTuples of NSNumbers, with at least 1 value in the tuple"); + + return @([tuple.rac_sequence any:^(NSNumber *number) { + NSCAssert([number isKindOfClass:NSNumber.class], @"-or must only be used on a signal of RACTuples of NSNumbers. Instead, tuple contains a non-NSNumber value: %@", tuple); + + return number.boolValue; + }]); + }] setNameWithFormat:@"[%@] -or", self.name]; +} + +- (RACSignal *)reduceApply { + return [[self map:^(RACTuple *tuple) { + NSCAssert([tuple isKindOfClass:RACTuple.class], @"-reduceApply must only be used on a signal of RACTuples. Instead, received: %@", tuple); + NSCAssert(tuple.count > 1, @"-reduceApply must only be used on a signal of RACTuples, with at least a block in tuple[0] and its first argument in tuple[1]"); + + // We can't use -array, because we need to preserve RACTupleNil + NSMutableArray *tupleArray = [NSMutableArray arrayWithCapacity:tuple.count]; + for (id val in tuple) { + [tupleArray addObject:val]; + } + RACTuple *arguments = [RACTuple tupleWithObjectsFromArray:[tupleArray subarrayWithRange:NSMakeRange(1, tupleArray.count - 1)]]; + + return [RACBlockTrampoline invokeBlock:tuple[0] withArguments:arguments]; + }] setNameWithFormat:@"[%@] -reduceApply", self.name]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignal.h b/Pods/ReactiveObjC/ReactiveObjC/RACSignal.h new file mode 100644 index 0000000..51acc6f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignal.h @@ -0,0 +1,479 @@ +// +// RACSignal.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/1/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import "RACAnnotations.h" +#import "RACStream.h" + +@class RACDisposable; +@class RACScheduler; +@class RACSubject; +@class RACTuple; +@class RACTwoTuple<__covariant First, __covariant Second>; +@protocol RACSubscriber; + +NS_ASSUME_NONNULL_BEGIN + +@interface RACSignal<__covariant ValueType> : RACStream + +/// Creates a new signal. This is the preferred way to create a new signal +/// operation or behavior. +/// +/// Events can be sent to new subscribers immediately in the `didSubscribe` +/// block, but the subscriber will not be able to dispose of the signal until +/// a RACDisposable is returned from `didSubscribe`. In the case of infinite +/// signals, this won't _ever_ happen if events are sent immediately. +/// +/// To ensure that the signal is disposable, events can be scheduled on the +/// +[RACScheduler currentScheduler] (so that they're deferred, not sent +/// immediately), or they can be sent in the background. The RACDisposable +/// returned by the `didSubscribe` block should cancel any such scheduling or +/// asynchronous work. +/// +/// didSubscribe - Called when the signal is subscribed to. The new subscriber is +/// passed in. You can then manually control the by +/// sending it -sendNext:, -sendError:, and -sendCompleted, +/// as defined by the operation you're implementing. This block +/// should return a RACDisposable which cancels any ongoing work +/// triggered by the subscription, and cleans up any resources or +/// disposables created as part of it. When the disposable is +/// disposed of, the signal must not send any more events to the +/// `subscriber`. If no cleanup is necessary, return nil. +/// +/// **Note:** The `didSubscribe` block is called every time a new subscriber +/// subscribes. Any side effects within the block will thus execute once for each +/// subscription, not necessarily on one thread, and possibly even +/// simultaneously! ++ (RACSignal *)createSignal:(RACDisposable * _Nullable (^)(id subscriber))didSubscribe RAC_WARN_UNUSED_RESULT; + +/// Returns a signal that immediately sends the given error. ++ (RACSignal *)error:(nullable NSError *)error RAC_WARN_UNUSED_RESULT; + +/// Returns a signal that never completes. ++ (RACSignal *)never RAC_WARN_UNUSED_RESULT; + +/// Immediately schedules the given block on the given scheduler. The block is +/// given a subscriber to which it can send events. +/// +/// scheduler - The scheduler on which `block` will be scheduled and results +/// delivered. Cannot be nil. +/// block - The block to invoke. Cannot be NULL. +/// +/// Returns a signal which will send all events sent on the subscriber given to +/// `block`. All events will be sent on `scheduler` and it will replay any missed +/// events to new subscribers. ++ (RACSignal *)startEagerlyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id subscriber))block; + +/// Invokes the given block only on the first subscription. The block is given a +/// subscriber to which it can send events. +/// +/// Note that disposing of the subscription to the returned signal will *not* +/// dispose of the underlying subscription. If you need that behavior, see +/// -[RACMulticastConnection autoconnect]. The underlying subscription will never +/// be disposed of. Because of this, `block` should never return an infinite +/// signal since there would be no way of ending it. +/// +/// scheduler - The scheduler on which the block should be scheduled. Note that +/// if given +[RACScheduler immediateScheduler], the block will be +/// invoked synchronously on the first subscription. Cannot be nil. +/// block - The block to invoke on the first subscription. Cannot be NULL. +/// +/// Returns a signal which will pass through the events sent to the subscriber +/// given to `block` and replay any missed events to new subscribers. ++ (RACSignal *)startLazilyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id subscriber))block RAC_WARN_UNUSED_RESULT; + +@end + +@interface RACSignal<__covariant ValueType> (RACStream) + +/// Returns a signal that immediately sends the given value and then completes. ++ (RACSignal *)return:(nullable ValueType)value RAC_WARN_UNUSED_RESULT; + +/// Returns a signal that immediately completes. ++ (RACSignal *)empty RAC_WARN_UNUSED_RESULT; + +/// A block which accepts a value from a RACSignal and returns a new signal. +/// +/// Setting `stop` to `YES` will cause the bind to terminate after the returned +/// value. Returning `nil` will result in immediate termination. +typedef RACSignal * _Nullable (^RACSignalBindBlock)(ValueType _Nullable value, BOOL *stop); + +/// Lazily binds a block to the values in the receiver. +/// +/// This should only be used if you need to terminate the bind early, or close +/// over some state. -flattenMap: is more appropriate for all other cases. +/// +/// block - A block returning a RACSignalBindBlock. This block will be invoked +/// each time the bound signal is re-evaluated. This block must not be +/// nil or return nil. +/// +/// Returns a new signal which represents the combined result of all lazy +/// applications of `block`. +- (RACSignal *)bind:(RACSignalBindBlock (^)(void))block RAC_WARN_UNUSED_RESULT; + +/// Subscribes to `signal` when the source signal completes. +- (RACSignal *)concat:(RACSignal *)signal RAC_WARN_UNUSED_RESULT; + +/// Zips the values in the receiver with those of the given signal to create +/// RACTuples. +/// +/// The first `next` of each signal will be combined, then the second `next`, +/// and so forth, until either signal completes or errors. +/// +/// signal - The signal to zip with. This must not be `nil`. +/// +/// Returns a new signal of RACTuples, representing the combined values of the +/// two signals. Any error from one of the original signals will be forwarded on +/// the returned signal. +- (RACSignal *> *)zipWith:(RACSignal *)signal RAC_WARN_UNUSED_RESULT; + +@end + +/// Redeclarations of operations built on the RACStream primitives with more +/// precise ValueType information. +/// +/// In cases where the ValueType of the result of the operation is not able to +/// be inferred, the ValueType is erased in the result. +/// +/// In cases where instancetype is a valid return type, the operation is not +/// redeclared here. +@interface RACSignal<__covariant ValueType> (RACStreamOperations) + +/// Maps `block` across the values in the receiver and flattens the result. +/// +/// Note that operators applied _after_ -flattenMap: behave differently from +/// operators _within_ -flattenMap:. See the Examples section below. +/// +/// This corresponds to the `SelectMany` method in Rx. +/// +/// block - A block which accepts the values in the receiver and returns a new +/// instance of the receiver's class. Returning `nil` from this block is +/// equivalent to returning an empty signal. +/// +/// Examples +/// +/// [signal flattenMap:^(id x) { +/// // Logs each time a returned signal completes. +/// return [[RACSignal return:x] logCompleted]; +/// }]; +/// +/// [[signal +/// flattenMap:^(id x) { +/// return [RACSignal return:x]; +/// }] +/// // Logs only once, when all of the signals complete. +/// logCompleted]; +/// +/// Returns a new signal which represents the combined signals resulting from +/// mapping `block`. +- (RACSignal *)flattenMap:(__kindof RACSignal * _Nullable (^)(ValueType _Nullable value))block RAC_WARN_UNUSED_RESULT; + +/// Flattens a signal of signals. +/// +/// This corresponds to the `Merge` method in Rx. +/// +/// Returns a signal consisting of the combined signals obtained from the +/// receiver. +- (RACSignal *)flatten RAC_WARN_UNUSED_RESULT; + +/// Maps `block` across the values in the receiver. +/// +/// This corresponds to the `Select` method in Rx. +/// +/// Returns a new signal with the mapped values. +- (RACSignal *)map:(id _Nullable (^)(ValueType _Nullable value))block RAC_WARN_UNUSED_RESULT; + +/// Replaces each value in the receiver with the given object. +/// +/// Returns a new signal which includes the given object once for each value in +/// the receiver. +- (RACSignal *)mapReplace:(nullable id)object RAC_WARN_UNUSED_RESULT; + +/// Filters out values in the receiver that don't pass the given test. +/// +/// This corresponds to the `Where` method in Rx. +/// +/// Returns a new signal with only those values that passed. +- (RACSignal *)filter:(BOOL (^)(ValueType _Nullable value))block RAC_WARN_UNUSED_RESULT; + +/// Filters out values in the receiver that equal (via -isEqual:) the provided +/// value. +/// +/// value - The value can be `nil`, in which case it ignores `nil` values. +/// +/// Returns a new signal containing only the values which did not compare equal +/// to `value`. +- (RACSignal *)ignore:(nullable ValueType)value RAC_WARN_UNUSED_RESULT; + +/// Unpacks each RACTuple in the receiver and maps the values to a new value. +/// +/// reduceBlock - The block which reduces each RACTuple's values into one value. +/// It must take as many arguments as the number of tuple elements +/// to process. Each argument will be an object argument. The +/// return value must be an object. This argument cannot be nil. +/// +/// Returns a new signal of reduced tuple values. +- (RACSignal *)reduceEach:(id _Nullable (^)())reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Returns a signal consisting of `value`, followed by the values in the +/// receiver. +- (RACSignal *)startWith:(nullable ValueType)value RAC_WARN_UNUSED_RESULT; + +/// Skips the first `skipCount` values in the receiver. +/// +/// Returns the receiver after skipping the first `skipCount` values. If +/// `skipCount` is greater than the number of values in the signal, an empty +/// signal is returned. +- (RACSignal *)skip:(NSUInteger)skipCount RAC_WARN_UNUSED_RESULT; + +/// Returns a signal of the first `count` values in the receiver. If `count` is +/// greater than or equal to the number of values in the signal, a signal +/// equivalent to the receiver is returned. +- (RACSignal *)take:(NSUInteger)count RAC_WARN_UNUSED_RESULT; + +/// Zips the values in the given signals to create RACTuples. +/// +/// The first value of each signals will be combined, then the second value, and +/// so forth, until at least one of the signals is exhausted. +/// +/// signals - The signals to combine. If this collection is empty, the returned +/// signal will be empty. +/// +/// Returns a new signal containing RACTuples of the zipped values from the +/// signals. ++ (RACSignal *)zip:(id)signals RAC_WARN_UNUSED_RESULT; + +/// Zips signals using +zip:, then reduces the resulting tuples into a single +/// value using -reduceEach: +/// +/// signals - The signals to combine. If this collection is empty, the +/// returned signal will be empty. +/// reduceBlock - The block which reduces the values from all the signals +/// into one value. It must take as many arguments as the +/// number of signals given. Each argument will be an object +/// argument. The return value must be an object. This argument +/// must not be nil. +/// +/// Example: +/// +/// [RACSignal zip:@[ stringSignal, intSignal ] +/// reduce:^(NSString *string, NSNumber *number) { +/// return [NSString stringWithFormat:@"%@: %@", string, number]; +/// }]; +/// +/// Returns a new signal containing the results from each invocation of +/// `reduceBlock`. ++ (RACSignal *)zip:(id)signals reduce:(id _Nullable (^)())reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Returns a signal obtained by concatenating `signals` in order. ++ (RACSignal *)concat:(id)signals RAC_WARN_UNUSED_RESULT; + +/// Combines values in the receiver from left to right using the given block. +/// +/// The algorithm proceeds as follows: +/// +/// 1. `startingValue` is passed into the block as the `running` value, and the +/// first element of the receiver is passed into the block as the `next` value. +/// 2. The result of the invocation is added to the returned signal. +/// 3. The result of the invocation (`running`) and the next element of the +/// receiver (`next`) is passed into `block`. +/// 4. Steps 2 and 3 are repeated until all values have been processed. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Examples +/// +/// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; +/// +/// // Contains 1, 3, 6, 10 +/// RACSequence *sums = [numbers scanWithStart:@0 reduce:^(NSNumber *sum, NSNumber *next) { +/// return @(sum.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new signal that consists of each application of `reduceBlock`. If +/// the receiver is empty, an empty signal is returned. +- (RACSignal *)scanWithStart:(nullable id)startingValue reduce:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Combines values in the receiver from left to right using the given block +/// which also takes zero-based index of the values. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. This block takes zero-based index value as the last +/// parameter. If the receiver is empty, this block will never +/// be invoked. Cannot be nil. +/// +/// Returns a new signal that consists of each application of `reduceBlock`. If +/// the receiver is empty, an empty signal is returned. +- (RACSignal *)scanWithStart:(nullable id)startingValue reduceWithIndex:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next, NSUInteger index))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Combines each previous and current value into one object. +/// +/// This method is similar to -scanWithStart:reduce:, but only ever operates on +/// the previous and current values (instead of the whole signal), and does not +/// pass the return value of `reduceBlock` into the next invocation of it. +/// +/// start - The value passed into `reduceBlock` as `previous` for the +/// first value. +/// reduceBlock - The block that combines the previous value and the current +/// value to create the reduced value. Cannot be nil. +/// +/// Examples +/// +/// RACSignal *numbers = [@[ @1, @2, @3, @4 ].rac_sequence +/// signalWithScheduler:RACScheduler.immediateScheduler]; +/// +/// // Contains 1, 3, 5, 7 +/// RACSignal *sums = [numbers combinePreviousWithStart:@0 reduce:^(NSNumber *previous, NSNumber *next) { +/// return @(previous.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new signal consisting of the return values from each application of +/// `reduceBlock`. +- (RACSignal *)combinePreviousWithStart:(nullable ValueType)start reduce:(id _Nullable (^)(ValueType _Nullable previous, ValueType _Nullable current))reduceBlock RAC_WARN_UNUSED_RESULT; + +/// Takes values until the given block returns `YES`. +/// +/// Returns a signal of the initial values in the receiver that fail `predicate`. +/// If `predicate` never returns `YES`, a signal equivalent to the receiver is +/// returned. +- (RACSignal *)takeUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate RAC_WARN_UNUSED_RESULT; + +/// Takes values until the given block returns `NO`. +/// +/// Returns a signal of the initial values in the receiver that pass `predicate`. +/// If `predicate` never returns `NO`, a signal equivalent to the receiver is +/// returned. +- (RACSignal *)takeWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate RAC_WARN_UNUSED_RESULT; + +/// Skips values until the given block returns `YES`. +/// +/// Returns a signal containing the values of the receiver that follow any +/// initial values failing `predicate`. If `predicate` never returns `YES`, +/// an empty signal is returned. +- (RACSignal *)skipUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate RAC_WARN_UNUSED_RESULT; + +/// Skips values until the given block returns `NO`. +/// +/// Returns a signal containing the values of the receiver that follow any +/// initial values passing `predicate`. If `predicate` never returns `NO`, an +/// empty signal is returned. +- (RACSignal *)skipWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate RAC_WARN_UNUSED_RESULT; + +/// Returns a signal of values for which -isEqual: returns NO when compared to the +/// previous value. +- (RACSignal *)distinctUntilChanged RAC_WARN_UNUSED_RESULT; + +@end + +@interface RACSignal<__covariant ValueType> (Subscription) + +/// Subscribes `subscriber` to changes on the receiver. The receiver defines which +/// events it actually sends and in what situations the events are sent. +/// +/// Subscription will always happen on a valid RACScheduler. If the +/// +[RACScheduler currentScheduler] cannot be determined at the time of +/// subscription (e.g., because the calling code is running on a GCD queue or +/// NSOperationQueue), subscription will occur on a private background scheduler. +/// On the main thread, subscriptions will always occur immediately, with a +/// +[RACScheduler currentScheduler] of +[RACScheduler mainThreadScheduler]. +/// +/// This method must be overridden by any subclasses. +/// +/// Returns nil or a disposable. You can call -[RACDisposable dispose] if you +/// need to end your subscription before it would "naturally" end, either by +/// completing or erroring. Once the disposable has been disposed, the subscriber +/// won't receive any more events from the subscription. +- (RACDisposable *)subscribe:(id)subscriber; + +/// Convenience method to subscribe to the `next` event. +/// +/// This corresponds to `IObserver.OnNext` in Rx. +- (RACDisposable *)subscribeNext:(void (^)(ValueType _Nullable x))nextBlock; + +/// Convenience method to subscribe to the `next` and `completed` events. +- (RACDisposable *)subscribeNext:(void (^)(ValueType _Nullable x))nextBlock completed:(void (^)(void))completedBlock; + +/// Convenience method to subscribe to the `next`, `completed`, and `error` events. +- (RACDisposable *)subscribeNext:(void (^)(ValueType _Nullable x))nextBlock error:(void (^)(NSError * _Nullable error))errorBlock completed:(void (^)(void))completedBlock; + +/// Convenience method to subscribe to `error` events. +/// +/// This corresponds to the `IObserver.OnError` in Rx. +- (RACDisposable *)subscribeError:(void (^)(NSError * _Nullable error))errorBlock; + +/// Convenience method to subscribe to `completed` events. +/// +/// This corresponds to the `IObserver.OnCompleted` in Rx. +- (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock; + +/// Convenience method to subscribe to `next` and `error` events. +- (RACDisposable *)subscribeNext:(void (^)(ValueType _Nullable x))nextBlock error:(void (^)(NSError * _Nullable error))errorBlock; + +/// Convenience method to subscribe to `error` and `completed` events. +- (RACDisposable *)subscribeError:(void (^)(NSError * _Nullable error))errorBlock completed:(void (^)(void))completedBlock; + +@end + +/// Additional methods to assist with debugging. +@interface RACSignal<__covariant ValueType> (Debugging) + +/// Logs all events that the receiver sends. +- (RACSignal *)logAll RAC_WARN_UNUSED_RESULT; + +/// Logs each `next` that the receiver sends. +- (RACSignal *)logNext RAC_WARN_UNUSED_RESULT; + +/// Logs any error that the receiver sends. +- (RACSignal *)logError RAC_WARN_UNUSED_RESULT; + +/// Logs any `completed` event that the receiver sends. +- (RACSignal *)logCompleted RAC_WARN_UNUSED_RESULT; + +@end + +/// Additional methods to assist with unit testing. +/// +/// **These methods should never ship in production code.** +@interface RACSignal<__covariant ValueType> (Testing) + +/// Spins the main run loop for a short while, waiting for the receiver to send a `next`. +/// +/// **Because this method executes the run loop recursively, it should only be used +/// on the main thread, and only from a unit test.** +/// +/// defaultValue - Returned if the receiver completes or errors before sending +/// a `next`, or if the method times out. This argument may be +/// nil. +/// success - If not NULL, set to whether the receiver completed +/// successfully. +/// error - If not NULL, set to any error that occurred. +/// +/// Returns the first value received, or `defaultValue` if no value is received +/// before the signal finishes or the method times out. +- (nullable ValueType)asynchronousFirstOrDefault:(nullable ValueType)defaultValue success:(nullable BOOL *)success error:(NSError * _Nullable * _Nullable)error; + +/// Spins the main run loop for a short while, waiting for the receiver to complete. +/// +/// **Because this method executes the run loop recursively, it should only be used +/// on the main thread, and only from a unit test.** +/// +/// error - If not NULL, set to any error that occurs. +/// +/// Returns whether the signal completed successfully before timing out. If NO, +/// `error` will be set to any error that occurred. +- (BOOL)asynchronouslyWaitUntilCompleted:(NSError * _Nullable * _Nullable)error; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignal.m b/Pods/ReactiveObjC/ReactiveObjC/RACSignal.m new file mode 100644 index 0000000..89f1259 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignal.m @@ -0,0 +1,401 @@ +// +// RACSignal.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/15/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACDynamicSignal.h" +#import "RACEmptySignal.h" +#import "RACErrorSignal.h" +#import "RACMulticastConnection.h" +#import "RACReplaySubject.h" +#import "RACReturnSignal.h" +#import "RACScheduler.h" +#import "RACSerialDisposable.h" +#import "RACSignal+Operations.h" +#import "RACSubject.h" +#import "RACSubscriber+Private.h" +#import "RACTuple.h" +#import + +@implementation RACSignal + +#pragma mark Lifecycle + ++ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe { + return [RACDynamicSignal createSignal:didSubscribe]; +} + ++ (RACSignal *)error:(NSError *)error { + return [RACErrorSignal error:error]; +} + ++ (RACSignal *)never { + return [[self createSignal:^ RACDisposable * (id subscriber) { + return nil; + }] setNameWithFormat:@"+never"]; +} + ++ (RACSignal *)startEagerlyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id subscriber))block { + NSCParameterAssert(scheduler != nil); + NSCParameterAssert(block != NULL); + + RACSignal *signal = [self startLazilyWithScheduler:scheduler block:block]; + // Subscribe to force the lazy signal to call its block. + [[signal publish] connect]; + return [signal setNameWithFormat:@"+startEagerlyWithScheduler: %@ block:", scheduler]; +} + ++ (RACSignal *)startLazilyWithScheduler:(RACScheduler *)scheduler block:(void (^)(id subscriber))block { + NSCParameterAssert(scheduler != nil); + NSCParameterAssert(block != NULL); + + RACMulticastConnection *connection = [[RACSignal + createSignal:^ id (id subscriber) { + block(subscriber); + return nil; + }] + multicast:[RACReplaySubject subject]]; + + return [[[RACSignal + createSignal:^ id (id subscriber) { + [connection.signal subscribe:subscriber]; + [connection connect]; + return nil; + }] + subscribeOn:scheduler] + setNameWithFormat:@"+startLazilyWithScheduler: %@ block:", scheduler]; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p> name: %@", self.class, self, self.name]; +} + +@end + +@implementation RACSignal (RACStream) + ++ (RACSignal *)empty { + return [RACEmptySignal empty]; +} + ++ (RACSignal *)return:(id)value { + return [RACReturnSignal return:value]; +} + +- (RACSignal *)bind:(RACSignalBindBlock (^)(void))block { + NSCParameterAssert(block != NULL); + + /* + * -bind: should: + * + * 1. Subscribe to the original signal of values. + * 2. Any time the original signal sends a value, transform it using the binding block. + * 3. If the binding block returns a signal, subscribe to it, and pass all of its values through to the subscriber as they're received. + * 4. If the binding block asks the bind to terminate, complete the _original_ signal. + * 5. When _all_ signals complete, send completed to the subscriber. + * + * If any signal sends an error at any point, send that to the subscriber. + */ + + return [[RACSignal createSignal:^(id subscriber) { + RACSignalBindBlock bindingBlock = block(); + + __block volatile int32_t signalCount = 1; // indicates self + + RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; + + void (^completeSignal)(RACDisposable *) = ^(RACDisposable *finishedDisposable) { + if (OSAtomicDecrement32Barrier(&signalCount) == 0) { + [subscriber sendCompleted]; + [compoundDisposable dispose]; + } else { + [compoundDisposable removeDisposable:finishedDisposable]; + } + }; + + void (^addSignal)(RACSignal *) = ^(RACSignal *signal) { + OSAtomicIncrement32Barrier(&signalCount); + + RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; + [compoundDisposable addDisposable:selfDisposable]; + + RACDisposable *disposable = [signal subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [compoundDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + @autoreleasepool { + completeSignal(selfDisposable); + } + }]; + + selfDisposable.disposable = disposable; + }; + + @autoreleasepool { + RACSerialDisposable *selfDisposable = [[RACSerialDisposable alloc] init]; + [compoundDisposable addDisposable:selfDisposable]; + + RACDisposable *bindingDisposable = [self subscribeNext:^(id x) { + // Manually check disposal to handle synchronous errors. + if (compoundDisposable.disposed) return; + + BOOL stop = NO; + id signal = bindingBlock(x, &stop); + + @autoreleasepool { + if (signal != nil) addSignal(signal); + if (signal == nil || stop) { + [selfDisposable dispose]; + completeSignal(selfDisposable); + } + } + } error:^(NSError *error) { + [compoundDisposable dispose]; + [subscriber sendError:error]; + } completed:^{ + @autoreleasepool { + completeSignal(selfDisposable); + } + }]; + + selfDisposable.disposable = bindingDisposable; + } + + return compoundDisposable; + }] setNameWithFormat:@"[%@] -bind:", self.name]; +} + +- (RACSignal *)concat:(RACSignal *)signal { + return [[RACSignal createSignal:^(id subscriber) { + RACCompoundDisposable *compoundDisposable = [[RACCompoundDisposable alloc] init]; + + RACDisposable *sourceDisposable = [self subscribeNext:^(id x) { + [subscriber sendNext:x]; + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + RACDisposable *concattedDisposable = [signal subscribe:subscriber]; + [compoundDisposable addDisposable:concattedDisposable]; + }]; + + [compoundDisposable addDisposable:sourceDisposable]; + return compoundDisposable; + }] setNameWithFormat:@"[%@] -concat: %@", self.name, signal]; +} + +- (RACSignal *)zipWith:(RACSignal *)signal { + NSCParameterAssert(signal != nil); + + return [[RACSignal createSignal:^(id subscriber) { + __block BOOL selfCompleted = NO; + NSMutableArray *selfValues = [NSMutableArray array]; + + __block BOOL otherCompleted = NO; + NSMutableArray *otherValues = [NSMutableArray array]; + + void (^sendCompletedIfNecessary)(void) = ^{ + @synchronized (selfValues) { + BOOL selfEmpty = (selfCompleted && selfValues.count == 0); + BOOL otherEmpty = (otherCompleted && otherValues.count == 0); + if (selfEmpty || otherEmpty) [subscriber sendCompleted]; + } + }; + + void (^sendNext)(void) = ^{ + @synchronized (selfValues) { + if (selfValues.count == 0) return; + if (otherValues.count == 0) return; + + RACTuple *tuple = RACTuplePack(selfValues[0], otherValues[0]); + [selfValues removeObjectAtIndex:0]; + [otherValues removeObjectAtIndex:0]; + + [subscriber sendNext:tuple]; + sendCompletedIfNecessary(); + } + }; + + RACDisposable *selfDisposable = [self subscribeNext:^(id x) { + @synchronized (selfValues) { + [selfValues addObject:x ?: RACTupleNil.tupleNil]; + sendNext(); + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + @synchronized (selfValues) { + selfCompleted = YES; + sendCompletedIfNecessary(); + } + }]; + + RACDisposable *otherDisposable = [signal subscribeNext:^(id x) { + @synchronized (selfValues) { + [otherValues addObject:x ?: RACTupleNil.tupleNil]; + sendNext(); + } + } error:^(NSError *error) { + [subscriber sendError:error]; + } completed:^{ + @synchronized (selfValues) { + otherCompleted = YES; + sendCompletedIfNecessary(); + } + }]; + + return [RACDisposable disposableWithBlock:^{ + [selfDisposable dispose]; + [otherDisposable dispose]; + }]; + }] setNameWithFormat:@"[%@] -zipWith: %@", self.name, signal]; +} + +@end + +@implementation RACSignal (Subscription) + +- (RACDisposable *)subscribe:(id)subscriber { + NSCAssert(NO, @"This method must be overridden by subclasses"); + return nil; +} + +- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock { + NSCParameterAssert(nextBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock completed:(void (^)(void))completedBlock { + NSCParameterAssert(nextBlock != NULL); + NSCParameterAssert(completedBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:completedBlock]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock completed:(void (^)(void))completedBlock { + NSCParameterAssert(nextBlock != NULL); + NSCParameterAssert(errorBlock != NULL); + NSCParameterAssert(completedBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:errorBlock completed:completedBlock]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeError:(void (^)(NSError *error))errorBlock { + NSCParameterAssert(errorBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:errorBlock completed:NULL]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeCompleted:(void (^)(void))completedBlock { + NSCParameterAssert(completedBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:NULL completed:completedBlock]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock error:(void (^)(NSError *error))errorBlock { + NSCParameterAssert(nextBlock != NULL); + NSCParameterAssert(errorBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:errorBlock completed:NULL]; + return [self subscribe:o]; +} + +- (RACDisposable *)subscribeError:(void (^)(NSError *))errorBlock completed:(void (^)(void))completedBlock { + NSCParameterAssert(completedBlock != NULL); + NSCParameterAssert(errorBlock != NULL); + + RACSubscriber *o = [RACSubscriber subscriberWithNext:NULL error:errorBlock completed:completedBlock]; + return [self subscribe:o]; +} + +@end + +@implementation RACSignal (Debugging) + +- (RACSignal *)logAll { + return [[[self logNext] logError] logCompleted]; +} + +- (RACSignal *)logNext { + return [[self doNext:^(id x) { + NSLog(@"%@ next: %@", self, x); + }] setNameWithFormat:@"%@", self.name]; +} + +- (RACSignal *)logError { + return [[self doError:^(NSError *error) { + NSLog(@"%@ error: %@", self, error); + }] setNameWithFormat:@"%@", self.name]; +} + +- (RACSignal *)logCompleted { + return [[self doCompleted:^{ + NSLog(@"%@ completed", self); + }] setNameWithFormat:@"%@", self.name]; +} + +@end + +@implementation RACSignal (Testing) + +static const NSTimeInterval RACSignalAsynchronousWaitTimeout = 10; + +- (id)asynchronousFirstOrDefault:(id)defaultValue success:(BOOL *)success error:(NSError **)error { + NSCAssert([NSThread isMainThread], @"%s should only be used from the main thread", __func__); + + __block id result = defaultValue; + __block BOOL done = NO; + + // Ensures that we don't pass values across thread boundaries by reference. + __block NSError *localError; + __block BOOL localSuccess = YES; + + [[[[self + take:1] + timeout:RACSignalAsynchronousWaitTimeout onScheduler:[RACScheduler scheduler]] + deliverOn:RACScheduler.mainThreadScheduler] + subscribeNext:^(id x) { + result = x; + done = YES; + } error:^(NSError *e) { + if (!done) { + localSuccess = NO; + localError = e; + done = YES; + } + } completed:^{ + done = YES; + }]; + + do { + [NSRunLoop.mainRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + } while (!done); + + if (success != NULL) *success = localSuccess; + if (error != NULL) *error = localError; + + return result; +} + +- (BOOL)asynchronouslyWaitUntilCompleted:(NSError **)error { + BOOL success = NO; + [[self ignoreValues] asynchronousFirstOrDefault:nil success:&success error:error]; + return success; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignalProvider.d b/Pods/ReactiveObjC/ReactiveObjC/RACSignalProvider.d new file mode 100644 index 0000000..8add9a1 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignalProvider.d @@ -0,0 +1,5 @@ +provider RACSignal { + probe next(char *signal, char *subscriber, char *valueDescription); + probe completed(char *signal, char *subscriber); + probe error(char *signal, char *subscriber, char *errorDescription); +}; diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.h new file mode 100644 index 0000000..dadf5fe --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.h @@ -0,0 +1,19 @@ +// +// RACSignalSequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-11-09. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSequence.h" + +@class RACSignal<__covariant ValueType>; + +// Private class that adapts a RACSignal to the RACSequence interface. +@interface RACSignalSequence : RACSequence + +// Returns a sequence for enumerating over the given signal. ++ (RACSequence *)sequenceWithSignal:(RACSignal *)signal; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.m new file mode 100644 index 0000000..14cea6b --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSignalSequence.m @@ -0,0 +1,79 @@ +// +// RACSignalSequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-11-09. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSignalSequence.h" +#import "RACDisposable.h" +#import "RACReplaySubject.h" +#import "RACSignal+Operations.h" + +@interface RACSignalSequence () + +// Replays the signal given on initialization. +@property (nonatomic, strong, readonly) RACReplaySubject *subject; + +@end + +@implementation RACSignalSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithSignal:(RACSignal *)signal { + RACSignalSequence *seq = [[self alloc] init]; + + RACReplaySubject *subject = [RACReplaySubject subject]; + [signal subscribeNext:^(id value) { + [subject sendNext:value]; + } error:^(NSError *error) { + [subject sendError:error]; + } completed:^{ + [subject sendCompleted]; + }]; + + seq->_subject = subject; + return seq; +} + +#pragma mark RACSequence + +- (id)head { + id value = [self.subject firstOrDefault:self]; + + if (value == self) { + return nil; + } else { + return value ?: NSNull.null; + } +} + +- (RACSequence *)tail { + RACSequence *sequence = [self.class sequenceWithSignal:[self.subject skip:1]]; + sequence.name = self.name; + return sequence; +} + +- (NSArray *)array { + return self.subject.toArray; +} + +#pragma mark NSObject + +- (NSString *)description { + // Synchronously accumulate the values that have been sent so far. + NSMutableArray *values = [NSMutableArray array]; + RACDisposable *disposable = [self.subject subscribeNext:^(id value) { + @synchronized (values) { + [values addObject:value ?: NSNull.null]; + } + }]; + + [disposable dispose]; + + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, values = %@ … }", self.class, self, self.name, values]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACStream+Private.h b/Pods/ReactiveObjC/ReactiveObjC/RACStream+Private.h new file mode 100644 index 0000000..9c7f48c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACStream+Private.h @@ -0,0 +1,23 @@ +// +// RACStream+Private.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACStream.h" + +@interface RACStream () + +// Combines a list of streams using the logic of the given block. +// +// streams - The streams to combine. +// block - An operator that combines two streams and returns a new one. The +// returned stream should contain 2-tuples of the streams' combined +// values. +// +// Returns a combined stream. ++ (__kindof RACStream *)join:(id)streams block:(RACStream * (^)(id, id))block; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACStream.h b/Pods/ReactiveObjC/ReactiveObjC/RACStream.h new file mode 100644 index 0000000..0ae04de --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACStream.h @@ -0,0 +1,331 @@ +// +// RACStream.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-31. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACStream; + +NS_ASSUME_NONNULL_BEGIN + +/// An abstract class representing any stream of values. +/// +/// This class represents a monad, upon which many stream-based operations can +/// be built. +/// +/// When subclassing RACStream, only the methods in the main @interface body need +/// to be overridden. +@interface RACStream<__covariant ValueType> : NSObject + +/// Returns an empty stream. ++ (__kindof RACStream *)empty; + +/// Lifts `value` into the stream monad. +/// +/// Returns a stream containing only the given value. ++ (__kindof RACStream *)return:(nullable ValueType)value; + +/// A block which accepts a value from a RACStream and returns a new instance +/// of the same stream class. +/// +/// Setting `stop` to `YES` will cause the bind to terminate after the returned +/// value. Returning `nil` will result in immediate termination. +typedef RACStream * _Nullable (^RACStreamBindBlock)(ValueType _Nullable value, BOOL *stop); + +/// Lazily binds a block to the values in the receiver. +/// +/// This should only be used if you need to terminate the bind early, or close +/// over some state. -flattenMap: is more appropriate for all other cases. +/// +/// block - A block returning a RACStreamBindBlock. This block will be invoked +/// each time the bound stream is re-evaluated. This block must not be +/// nil or return nil. +/// +/// Returns a new stream which represents the combined result of all lazy +/// applications of `block`. +- (__kindof RACStream *)bind:(RACStreamBindBlock (^)(void))block; + +/// Appends the values of `stream` to the values in the receiver. +/// +/// stream - A stream to concatenate. This must be an instance of the same +/// concrete class as the receiver, and should not be `nil`. +/// +/// Returns a new stream representing the receiver followed by `stream`. +- (__kindof RACStream *)concat:(RACStream *)stream; + +/// Zips the values in the receiver with those of the given stream to create +/// RACTuples. +/// +/// The first value of each stream will be combined, then the second value, and +/// so forth, until at least one of the streams is exhausted. +/// +/// stream - The stream to zip with. This must be an instance of the same +/// concrete class as the receiver, and should not be `nil`. +/// +/// Returns a new stream of RACTuples, representing the zipped values of the +/// two streams. +- (__kindof RACStream *)zipWith:(RACStream *)stream; + +@end + +/// This extension contains functionality to support naming streams for +/// debugging. +/// +/// Subclasses do not need to override the methods here. +@interface RACStream () + +/// The name of the stream. This is for debugging/human purposes only. +@property (copy) NSString *name; + +/// Sets the name of the receiver to the given format string. +/// +/// This is for debugging purposes only, and won't do anything unless the +/// RAC_DEBUG_SIGNAL_NAMES environment variable is set. +/// +/// Returns the receiver, for easy method chaining. +- (instancetype)setNameWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1, 2); + +@end + +/// Operations built on the RACStream primitives. +/// +/// These methods do not need to be overridden, although subclasses may +/// occasionally gain better performance from doing so. +@interface RACStream<__covariant ValueType> (Operations) + +/// Maps `block` across the values in the receiver and flattens the result. +/// +/// Note that operators applied _after_ -flattenMap: behave differently from +/// operators _within_ -flattenMap:. See the Examples section below. +/// +/// This corresponds to the `SelectMany` method in Rx. +/// +/// block - A block which accepts the values in the receiver and returns a new +/// instance of the receiver's class. Returning `nil` from this block is +/// equivalent to returning an empty signal. +/// +/// Examples +/// +/// [signal flattenMap:^(id x) { +/// // Logs each time a returned signal completes. +/// return [[RACSignal return:x] logCompleted]; +/// }]; +/// +/// [[signal +/// flattenMap:^(id x) { +/// return [RACSignal return:x]; +/// }] +/// // Logs only once, when all of the signals complete. +/// logCompleted]; +/// +/// Returns a new stream which represents the combined streams resulting from +/// mapping `block`. +- (__kindof RACStream *)flattenMap:(__kindof RACStream * _Nullable (^)(ValueType _Nullable value))block; + +/// Flattens a stream of streams. +/// +/// This corresponds to the `Merge` method in Rx. +/// +/// Returns a stream consisting of the combined streams obtained from the +/// receiver. +- (__kindof RACStream *)flatten; + +/// Maps `block` across the values in the receiver. +/// +/// This corresponds to the `Select` method in Rx. +/// +/// Returns a new stream with the mapped values. +- (__kindof RACStream *)map:(id _Nullable (^)(ValueType _Nullable value))block; + +/// Replaces each value in the receiver with the given object. +/// +/// Returns a new stream which includes the given object once for each value in +/// the receiver. +- (__kindof RACStream *)mapReplace:(nullable id)object; + +/// Filters out values in the receiver that don't pass the given test. +/// +/// This corresponds to the `Where` method in Rx. +/// +/// Returns a new stream with only those values that passed. +- (__kindof RACStream *)filter:(BOOL (^)(ValueType _Nullable value))block; + +/// Filters out values in the receiver that equal (via -isEqual:) the provided value. +/// +/// value - The value can be `nil`, in which case it ignores `nil` values. +/// +/// Returns a new stream containing only the values which did not compare equal +/// to `value`. +- (__kindof RACStream *)ignore:(nullable ValueType)value; + +/// Unpacks each RACTuple in the receiver and maps the values to a new value. +/// +/// reduceBlock - The block which reduces each RACTuple's values into one value. +/// It must take as many arguments as the number of tuple elements +/// to process. Each argument will be an object argument. The +/// return value must be an object. This argument cannot be nil. +/// +/// Returns a new stream of reduced tuple values. +- (__kindof RACStream *)reduceEach:(id _Nullable (^)())reduceBlock; + +/// Returns a stream consisting of `value`, followed by the values in the +/// receiver. +- (__kindof RACStream *)startWith:(nullable ValueType)value; + +/// Skips the first `skipCount` values in the receiver. +/// +/// Returns the receiver after skipping the first `skipCount` values. If +/// `skipCount` is greater than the number of values in the stream, an empty +/// stream is returned. +- (__kindof RACStream *)skip:(NSUInteger)skipCount; + +/// Returns a stream of the first `count` values in the receiver. If `count` is +/// greater than or equal to the number of values in the stream, a stream +/// equivalent to the receiver is returned. +- (__kindof RACStream *)take:(NSUInteger)count; + +/// Zips the values in the given streams to create RACTuples. +/// +/// The first value of each stream will be combined, then the second value, and +/// so forth, until at least one of the streams is exhausted. +/// +/// streams - The streams to combine. These must all be instances of the same +/// concrete class implementing the protocol. If this collection is +/// empty, the returned stream will be empty. +/// +/// Returns a new stream containing RACTuples of the zipped values from the +/// streams. ++ (__kindof RACStream *)zip:(id)streams; + +/// Zips streams using +zip:, then reduces the resulting tuples into a single +/// value using -reduceEach: +/// +/// streams - The streams to combine. These must all be instances of the +/// same concrete class implementing the protocol. If this +/// collection is empty, the returned stream will be empty. +/// reduceBlock - The block which reduces the values from all the streams +/// into one value. It must take as many arguments as the +/// number of streams given. Each argument will be an object +/// argument. The return value must be an object. This argument +/// must not be nil. +/// +/// Example: +/// +/// [RACStream zip:@[ stringSignal, intSignal ] reduce:^(NSString *string, NSNumber *number) { +/// return [NSString stringWithFormat:@"%@: %@", string, number]; +/// }]; +/// +/// Returns a new stream containing the results from each invocation of +/// `reduceBlock`. ++ (__kindof RACStream *)zip:(id)streams reduce:(id _Nullable (^)())reduceBlock; + +/// Returns a stream obtained by concatenating `streams` in order. ++ (__kindof RACStream *)concat:(id)streams; + +/// Combines values in the receiver from left to right using the given block. +/// +/// The algorithm proceeds as follows: +/// +/// 1. `startingValue` is passed into the block as the `running` value, and the +/// first element of the receiver is passed into the block as the `next` value. +/// 2. The result of the invocation is added to the returned stream. +/// 3. The result of the invocation (`running`) and the next element of the +/// receiver (`next`) is passed into `block`. +/// 4. Steps 2 and 3 are repeated until all values have been processed. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. If the receiver is empty, this block will never be +/// invoked. Cannot be nil. +/// +/// Examples +/// +/// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; +/// +/// // Contains 1, 3, 6, 10 +/// RACSequence *sums = [numbers scanWithStart:@0 reduce:^(NSNumber *sum, NSNumber *next) { +/// return @(sum.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new stream that consists of each application of `reduceBlock`. If the +/// receiver is empty, an empty stream is returned. +- (__kindof RACStream *)scanWithStart:(nullable id)startingValue reduce:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next))reduceBlock; + +/// Combines values in the receiver from left to right using the given block +/// which also takes zero-based index of the values. +/// +/// startingValue - The value to be combined with the first element of the +/// receiver. This value may be `nil`. +/// reduceBlock - The block that describes how to combine values of the +/// receiver. This block takes zero-based index value as the last +/// parameter. If the receiver is empty, this block will never +/// be invoked. Cannot be nil. +/// +/// Returns a new stream that consists of each application of `reduceBlock`. If the +/// receiver is empty, an empty stream is returned. +- (__kindof RACStream *)scanWithStart:(nullable id)startingValue reduceWithIndex:(id _Nullable (^)(id _Nullable running, ValueType _Nullable next, NSUInteger index))reduceBlock; + +/// Combines each previous and current value into one object. +/// +/// This method is similar to -scanWithStart:reduce:, but only ever operates on +/// the previous and current values (instead of the whole stream), and does not +/// pass the return value of `reduceBlock` into the next invocation of it. +/// +/// start - The value passed into `reduceBlock` as `previous` for the +/// first value. +/// reduceBlock - The block that combines the previous value and the current +/// value to create the reduced value. Cannot be nil. +/// +/// Examples +/// +/// RACSequence *numbers = @[ @1, @2, @3, @4 ].rac_sequence; +/// +/// // Contains 1, 3, 5, 7 +/// RACSequence *sums = [numbers combinePreviousWithStart:@0 reduce:^(NSNumber *previous, NSNumber *next) { +/// return @(previous.integerValue + next.integerValue); +/// }]; +/// +/// Returns a new stream consisting of the return values from each application of +/// `reduceBlock`. +- (__kindof RACStream *)combinePreviousWithStart:(nullable ValueType)start reduce:(id _Nullable (^)(ValueType _Nullable previous, ValueType _Nullable current))reduceBlock; + +/// Takes values until the given block returns `YES`. +/// +/// Returns a stream of the initial values in the receiver that fail `predicate`. +/// If `predicate` never returns `YES`, a stream equivalent to the receiver is +/// returned. +- (__kindof RACStream *)takeUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Takes values until the given block returns `NO`. +/// +/// Returns a stream of the initial values in the receiver that pass `predicate`. +/// If `predicate` never returns `NO`, a stream equivalent to the receiver is +/// returned. +- (__kindof RACStream *)takeWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Skips values until the given block returns `YES`. +/// +/// Returns a stream containing the values of the receiver that follow any +/// initial values failing `predicate`. If `predicate` never returns `YES`, +/// an empty stream is returned. +- (__kindof RACStream *)skipUntilBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Skips values until the given block returns `NO`. +/// +/// Returns a stream containing the values of the receiver that follow any +/// initial values passing `predicate`. If `predicate` never returns `NO`, an +/// empty stream is returned. +- (__kindof RACStream *)skipWhileBlock:(BOOL (^)(ValueType _Nullable x))predicate; + +/// Returns a stream of values for which -isEqual: returns NO when compared to the +/// previous value. +- (__kindof RACStream *)distinctUntilChanged; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACStream.m b/Pods/ReactiveObjC/ReactiveObjC/RACStream.m new file mode 100644 index 0000000..c362eb8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACStream.m @@ -0,0 +1,355 @@ +// +// RACStream.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-31. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACStream.h" +#import "NSObject+RACDescription.h" +#import "RACBlockTrampoline.h" +#import "RACTuple.h" + +@implementation RACStream + +#pragma mark Lifecycle + +- (instancetype)init { + self = [super init]; + + self.name = @""; + return self; +} + +#pragma mark Abstract methods + ++ (__kindof RACStream *)empty { + NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil]; +} + +- (__kindof RACStream *)bind:(RACStreamBindBlock (^)(void))block { + NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil]; +} + ++ (__kindof RACStream *)return:(id)value { + NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil]; +} + +- (__kindof RACStream *)concat:(RACStream *)stream { + NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil]; +} + +- (__kindof RACStream *)zipWith:(RACStream *)stream { + NSString *reason = [NSString stringWithFormat:@"%@ must be overridden by subclasses", NSStringFromSelector(_cmd)]; + @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil]; +} + +#pragma mark Naming + +- (instancetype)setNameWithFormat:(NSString *)format, ... { + if (getenv("RAC_DEBUG_SIGNAL_NAMES") == NULL) return self; + + NSCParameterAssert(format != nil); + + va_list args; + va_start(args, format); + + NSString *str = [[NSString alloc] initWithFormat:format arguments:args]; + va_end(args); + + self.name = str; + return self; +} + +@end + +@implementation RACStream (Operations) + +- (__kindof RACStream *)flattenMap:(__kindof RACStream * (^)(id value))block { + Class class = self.class; + + return [[self bind:^{ + return ^(id value, BOOL *stop) { + id stream = block(value) ?: [class empty]; + NSCAssert([stream isKindOfClass:RACStream.class], @"Value returned from -flattenMap: is not a stream: %@", stream); + + return stream; + }; + }] setNameWithFormat:@"[%@] -flattenMap:", self.name]; +} + +- (__kindof RACStream *)flatten { + return [[self flattenMap:^(id value) { + return value; + }] setNameWithFormat:@"[%@] -flatten", self.name]; +} + +- (__kindof RACStream *)map:(id (^)(id value))block { + NSCParameterAssert(block != nil); + + Class class = self.class; + + return [[self flattenMap:^(id value) { + return [class return:block(value)]; + }] setNameWithFormat:@"[%@] -map:", self.name]; +} + +- (__kindof RACStream *)mapReplace:(id)object { + return [[self map:^(id _) { + return object; + }] setNameWithFormat:@"[%@] -mapReplace: %@", self.name, RACDescription(object)]; +} + +- (__kindof RACStream *)combinePreviousWithStart:(id)start reduce:(id (^)(id previous, id next))reduceBlock { + NSCParameterAssert(reduceBlock != NULL); + return [[[self + scanWithStart:RACTuplePack(start) + reduce:^(RACTuple *previousTuple, id next) { + id value = reduceBlock(previousTuple[0], next); + return RACTuplePack(next, value); + }] + map:^(RACTuple *tuple) { + return tuple[1]; + }] + setNameWithFormat:@"[%@] -combinePreviousWithStart: %@ reduce:", self.name, RACDescription(start)]; +} + +- (__kindof RACStream *)filter:(BOOL (^)(id value))block { + NSCParameterAssert(block != nil); + + Class class = self.class; + + return [[self flattenMap:^ id (id value) { + if (block(value)) { + return [class return:value]; + } else { + return class.empty; + } + }] setNameWithFormat:@"[%@] -filter:", self.name]; +} + +- (__kindof RACStream *)ignore:(id)value { + return [[self filter:^ BOOL (id innerValue) { + return innerValue != value && ![innerValue isEqual:value]; + }] setNameWithFormat:@"[%@] -ignore: %@", self.name, RACDescription(value)]; +} + +- (__kindof RACStream *)reduceEach:(id (^)())reduceBlock { + NSCParameterAssert(reduceBlock != nil); + + __weak RACStream *stream __attribute__((unused)) = self; + return [[self map:^(RACTuple *t) { + NSCAssert([t isKindOfClass:RACTuple.class], @"Value from stream %@ is not a tuple: %@", stream, t); + return [RACBlockTrampoline invokeBlock:reduceBlock withArguments:t]; + }] setNameWithFormat:@"[%@] -reduceEach:", self.name]; +} + +- (__kindof RACStream *)startWith:(id)value { + return [[[self.class return:value] + concat:self] + setNameWithFormat:@"[%@] -startWith: %@", self.name, RACDescription(value)]; +} + +- (__kindof RACStream *)skip:(NSUInteger)skipCount { + Class class = self.class; + + return [[self bind:^{ + __block NSUInteger skipped = 0; + + return ^(id value, BOOL *stop) { + if (skipped >= skipCount) return [class return:value]; + + skipped++; + return class.empty; + }; + }] setNameWithFormat:@"[%@] -skip: %lu", self.name, (unsigned long)skipCount]; +} + +- (__kindof RACStream *)take:(NSUInteger)count { + Class class = self.class; + + if (count == 0) return class.empty; + + return [[self bind:^{ + __block NSUInteger taken = 0; + + return ^ id (id value, BOOL *stop) { + if (taken < count) { + ++taken; + if (taken == count) *stop = YES; + return [class return:value]; + } else { + return nil; + } + }; + }] setNameWithFormat:@"[%@] -take: %lu", self.name, (unsigned long)count]; +} + ++ (__kindof RACStream *)join:(id)streams block:(RACStream * (^)(id, id))block { + RACStream *current = nil; + + // Creates streams of successively larger tuples by combining the input + // streams one-by-one. + for (RACStream *stream in streams) { + // For the first stream, just wrap its values in a RACTuple. That way, + // if only one stream is given, the result is still a stream of tuples. + if (current == nil) { + current = [stream map:^(id x) { + return RACTuplePack(x); + }]; + + continue; + } + + current = block(current, stream); + } + + if (current == nil) return [self empty]; + + return [current map:^(RACTuple *xs) { + // Right now, each value is contained in its own tuple, sorta like: + // + // (((1), 2), 3) + // + // We need to unwrap all the layers and create a tuple out of the result. + NSMutableArray *values = [[NSMutableArray alloc] init]; + + while (xs != nil) { + [values insertObject:xs.last ?: RACTupleNil.tupleNil atIndex:0]; + xs = (xs.count > 1 ? xs.first : nil); + } + + return [RACTuple tupleWithObjectsFromArray:values]; + }]; +} + ++ (__kindof RACStream *)zip:(id)streams { + return [[self join:streams block:^(RACStream *left, RACStream *right) { + return [left zipWith:right]; + }] setNameWithFormat:@"+zip: %@", streams]; +} + ++ (__kindof RACStream *)zip:(id)streams reduce:(id (^)())reduceBlock { + NSCParameterAssert(reduceBlock != nil); + + RACStream *result = [self zip:streams]; + + // Although we assert this condition above, older versions of this method + // supported this argument being nil. Avoid crashing Release builds of + // apps that depended on that. + if (reduceBlock != nil) result = [result reduceEach:reduceBlock]; + + return [result setNameWithFormat:@"+zip: %@ reduce:", streams]; +} + ++ (__kindof RACStream *)concat:(id)streams { + RACStream *result = self.empty; + for (RACStream *stream in streams) { + result = [result concat:stream]; + } + + return [result setNameWithFormat:@"+concat: %@", streams]; +} + +- (__kindof RACStream *)scanWithStart:(id)startingValue reduce:(id (^)(id running, id next))reduceBlock { + NSCParameterAssert(reduceBlock != nil); + + return [[self + scanWithStart:startingValue + reduceWithIndex:^(id running, id next, NSUInteger index) { + return reduceBlock(running, next); + }] + setNameWithFormat:@"[%@] -scanWithStart: %@ reduce:", self.name, RACDescription(startingValue)]; +} + +- (__kindof RACStream *)scanWithStart:(id)startingValue reduceWithIndex:(id (^)(id, id, NSUInteger))reduceBlock { + NSCParameterAssert(reduceBlock != nil); + + Class class = self.class; + + return [[self bind:^{ + __block id running = startingValue; + __block NSUInteger index = 0; + + return ^(id value, BOOL *stop) { + running = reduceBlock(running, value, index++); + return [class return:running]; + }; + }] setNameWithFormat:@"[%@] -scanWithStart: %@ reduceWithIndex:", self.name, RACDescription(startingValue)]; +} + +- (__kindof RACStream *)takeUntilBlock:(BOOL (^)(id x))predicate { + NSCParameterAssert(predicate != nil); + + Class class = self.class; + + return [[self bind:^{ + return ^ id (id value, BOOL *stop) { + if (predicate(value)) return nil; + + return [class return:value]; + }; + }] setNameWithFormat:@"[%@] -takeUntilBlock:", self.name]; +} + +- (__kindof RACStream *)takeWhileBlock:(BOOL (^)(id x))predicate { + NSCParameterAssert(predicate != nil); + + return [[self takeUntilBlock:^ BOOL (id x) { + return !predicate(x); + }] setNameWithFormat:@"[%@] -takeWhileBlock:", self.name]; +} + +- (__kindof RACStream *)skipUntilBlock:(BOOL (^)(id x))predicate { + NSCParameterAssert(predicate != nil); + + Class class = self.class; + + return [[self bind:^{ + __block BOOL skipping = YES; + + return ^ id (id value, BOOL *stop) { + if (skipping) { + if (predicate(value)) { + skipping = NO; + } else { + return class.empty; + } + } + + return [class return:value]; + }; + }] setNameWithFormat:@"[%@] -skipUntilBlock:", self.name]; +} + +- (__kindof RACStream *)skipWhileBlock:(BOOL (^)(id x))predicate { + NSCParameterAssert(predicate != nil); + + return [[self skipUntilBlock:^ BOOL (id x) { + return !predicate(x); + }] setNameWithFormat:@"[%@] -skipWhileBlock:", self.name]; +} + +- (__kindof RACStream *)distinctUntilChanged { + Class class = self.class; + + return [[self bind:^{ + __block id lastValue = nil; + __block BOOL initial = YES; + + return ^(id x, BOOL *stop) { + if (!initial && (lastValue == x || [x isEqual:lastValue])) return [class empty]; + + initial = NO; + lastValue = x; + return [class return:x]; + }; + }] setNameWithFormat:@"[%@] -distinctUntilChanged", self.name]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.h new file mode 100644 index 0000000..6597fc8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.h @@ -0,0 +1,18 @@ +// +// RACStringSequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACSequence.h" + +// Private class that adapts a string to the RACSequence interface. +@interface RACStringSequence : RACSequence + +// Returns a sequence for enumerating over the given string, starting from the +// given character offset. The string will be copied to prevent mutation. ++ (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.m new file mode 100644 index 0000000..809db5d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACStringSequence.m @@ -0,0 +1,65 @@ +// +// RACStringSequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2012-10-29. +// Copyright (c) 2012 GitHub. All rights reserved. +// + +#import "RACStringSequence.h" + +@interface RACStringSequence () + +// The string being sequenced. +@property (nonatomic, copy, readonly) NSString *string; + +// The index in the string from which the sequence starts. +@property (nonatomic, assign, readonly) NSUInteger offset; + +@end + +@implementation RACStringSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithString:(NSString *)string offset:(NSUInteger)offset { + NSCParameterAssert(offset <= string.length); + + if (offset == string.length) return self.empty; + + RACStringSequence *seq = [[self alloc] init]; + seq->_string = [string copy]; + seq->_offset = offset; + return seq; +} + +#pragma mark RACSequence + +- (id)head { + return [self.string substringWithRange:NSMakeRange(self.offset, 1)]; +} + +- (RACSequence *)tail { + RACSequence *sequence = [self.class sequenceWithString:self.string offset:self.offset + 1]; + sequence.name = self.name; + return sequence; +} + +- (NSArray *)array { + NSUInteger substringLength = self.string.length - self.offset; + NSMutableArray *array = [NSMutableArray arrayWithCapacity:substringLength]; + + [self.string enumerateSubstringsInRange:NSMakeRange(self.offset, substringLength) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { + [array addObject:substring]; + }]; + + return [array copy]; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, string = %@ }", self.class, self, self.name, [self.string substringFromIndex:self.offset]]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubject.h b/Pods/ReactiveObjC/ReactiveObjC/RACSubject.h new file mode 100644 index 0000000..79807d9 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubject.h @@ -0,0 +1,29 @@ +// +// RACSubject.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/9/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSignal.h" +#import "RACSubscriber.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A subject can be thought of as a signal that you can manually control by +/// sending next, completed, and error. +/// +/// They're most helpful in bridging the non-RAC world to RAC, since they let you +/// manually control the sending of events. +@interface RACSubject : RACSignal + +/// Returns a new subject. ++ (instancetype)subject; + +// Redeclaration of the RACSubscriber method. Made in order to specify a generic type. +- (void)sendNext:(nullable ValueType)value; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubject.m b/Pods/ReactiveObjC/ReactiveObjC/RACSubject.m new file mode 100644 index 0000000..1031b06 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubject.m @@ -0,0 +1,126 @@ +// +// RACSubject.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/9/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubject.h" +#import +#import "RACCompoundDisposable.h" +#import "RACPassthroughSubscriber.h" + +@interface RACSubject () + +// Contains all current subscribers to the receiver. +// +// This should only be used while synchronized on `self`. +@property (nonatomic, strong, readonly) NSMutableArray *subscribers; + +// Contains all of the receiver's subscriptions to other signals. +@property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; + +// Enumerates over each of the receiver's `subscribers` and invokes `block` for +// each. +- (void)enumerateSubscribersUsingBlock:(void (^)(id subscriber))block; + +@end + +@implementation RACSubject + +#pragma mark Lifecycle + ++ (instancetype)subject { + return [[self alloc] init]; +} + +- (instancetype)init { + self = [super init]; + if (self == nil) return nil; + + _disposable = [RACCompoundDisposable compoundDisposable]; + _subscribers = [[NSMutableArray alloc] initWithCapacity:1]; + + return self; +} + +- (void)dealloc { + [self.disposable dispose]; +} + +#pragma mark Subscription + +- (RACDisposable *)subscribe:(id)subscriber { + NSCParameterAssert(subscriber != nil); + + RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable]; + subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable]; + + NSMutableArray *subscribers = self.subscribers; + @synchronized (subscribers) { + [subscribers addObject:subscriber]; + } + + [disposable addDisposable:[RACDisposable disposableWithBlock:^{ + @synchronized (subscribers) { + // Since newer subscribers are generally shorter-lived, search + // starting from the end of the list. + NSUInteger index = [subscribers indexOfObjectWithOptions:NSEnumerationReverse passingTest:^ BOOL (id obj, NSUInteger index, BOOL *stop) { + return obj == subscriber; + }]; + + if (index != NSNotFound) [subscribers removeObjectAtIndex:index]; + } + }]]; + + return disposable; +} + +- (void)enumerateSubscribersUsingBlock:(void (^)(id subscriber))block { + NSArray *subscribers; + @synchronized (self.subscribers) { + subscribers = [self.subscribers copy]; + } + + for (id subscriber in subscribers) { + block(subscriber); + } +} + +#pragma mark RACSubscriber + +- (void)sendNext:(id)value { + [self enumerateSubscribersUsingBlock:^(id subscriber) { + [subscriber sendNext:value]; + }]; +} + +- (void)sendError:(NSError *)error { + [self.disposable dispose]; + + [self enumerateSubscribersUsingBlock:^(id subscriber) { + [subscriber sendError:error]; + }]; +} + +- (void)sendCompleted { + [self.disposable dispose]; + + [self enumerateSubscribersUsingBlock:^(id subscriber) { + [subscriber sendCompleted]; + }]; +} + +- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)d { + if (d.disposed) return; + [self.disposable addDisposable:d]; + + @weakify(self, d); + [d addDisposable:[RACDisposable disposableWithBlock:^{ + @strongify(self, d); + [self.disposable removeDisposable:d]; + }]]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber+Private.h b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber+Private.h new file mode 100644 index 0000000..f898d1c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber+Private.h @@ -0,0 +1,17 @@ +// +// RACSubscriber+Private.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-06-13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSubscriber.h" + +// A simple block-based subscriber. +@interface RACSubscriber : NSObject + +// Creates a new subscriber with the given blocks. ++ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.h b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.h new file mode 100644 index 0000000..417e0c4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.h @@ -0,0 +1,55 @@ +// +// RACSubscriber.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/1/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACCompoundDisposable; + +NS_ASSUME_NONNULL_BEGIN + +/// Represents any object which can directly receive values from a RACSignal. +/// +/// You generally shouldn't need to implement this protocol. +[RACSignal +/// createSignal:], RACSignal's subscription methods, or RACSubject should work +/// for most uses. +/// +/// Implementors of this protocol may receive messages and values from multiple +/// threads simultaneously, and so should be thread-safe. Subscribers will also +/// be weakly referenced so implementations must allow that. +@protocol RACSubscriber +@required + +/// Sends the next value to subscribers. +/// +/// value - The value to send. This can be `nil`. +- (void)sendNext:(nullable id)value; + +/// Sends the error to subscribers. +/// +/// error - The error to send. This can be `nil`. +/// +/// This terminates the subscription, and invalidates the subscriber (such that +/// it cannot subscribe to anything else in the future). +- (void)sendError:(nullable NSError *)error; + +/// Sends completed to subscribers. +/// +/// This terminates the subscription, and invalidates the subscriber (such that +/// it cannot subscribe to anything else in the future). +- (void)sendCompleted; + +/// Sends the subscriber a disposable that represents one of its subscriptions. +/// +/// A subscriber may receive multiple disposables if it gets subscribed to +/// multiple signals; however, any error or completed events must terminate _all_ +/// subscriptions. +- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)disposable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.m b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.m new file mode 100644 index 0000000..4ed4960 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriber.m @@ -0,0 +1,111 @@ +// +// RACSubscriber.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/1/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubscriber.h" +#import "RACSubscriber+Private.h" +#import +#import "RACCompoundDisposable.h" + +@interface RACSubscriber () + +// These callbacks should only be accessed while synchronized on self. +@property (nonatomic, copy) void (^next)(id value); +@property (nonatomic, copy) void (^error)(NSError *error); +@property (nonatomic, copy) void (^completed)(void); + +@property (nonatomic, strong, readonly) RACCompoundDisposable *disposable; + +@end + +@implementation RACSubscriber + +#pragma mark Lifecycle + ++ (instancetype)subscriberWithNext:(void (^)(id x))next error:(void (^)(NSError *error))error completed:(void (^)(void))completed { + RACSubscriber *subscriber = [[self alloc] init]; + + subscriber->_next = [next copy]; + subscriber->_error = [error copy]; + subscriber->_completed = [completed copy]; + + return subscriber; +} + +- (instancetype)init { + self = [super init]; + + @unsafeify(self); + + RACDisposable *selfDisposable = [RACDisposable disposableWithBlock:^{ + @strongify(self); + + @synchronized (self) { + self.next = nil; + self.error = nil; + self.completed = nil; + } + }]; + + _disposable = [RACCompoundDisposable compoundDisposable]; + [_disposable addDisposable:selfDisposable]; + + return self; +} + +- (void)dealloc { + [self.disposable dispose]; +} + +#pragma mark RACSubscriber + +- (void)sendNext:(id)value { + @synchronized (self) { + void (^nextBlock)(id) = [self.next copy]; + if (nextBlock == nil) return; + + nextBlock(value); + } +} + +- (void)sendError:(NSError *)e { + @synchronized (self) { + void (^errorBlock)(NSError *) = [self.error copy]; + [self.disposable dispose]; + + if (errorBlock == nil) return; + errorBlock(e); + } +} + +- (void)sendCompleted { + @synchronized (self) { + void (^completedBlock)(void) = [self.completed copy]; + [self.disposable dispose]; + + if (completedBlock == nil) return; + completedBlock(); + } +} + +- (void)didSubscribeWithDisposable:(RACCompoundDisposable *)otherDisposable { + if (otherDisposable.disposed) return; + + RACCompoundDisposable *selfDisposable = self.disposable; + [selfDisposable addDisposable:otherDisposable]; + + @unsafeify(otherDisposable); + + // If this subscription terminates, purge its disposable to avoid unbounded + // memory growth. + [otherDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + @strongify(otherDisposable); + [selfDisposable removeDisposable:otherDisposable]; + }]]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h new file mode 100644 index 0000000..930e446 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.h @@ -0,0 +1,58 @@ +// +// RACSubscriptingAssignmentTrampoline.h +// ReactiveObjC +// +// Created by Josh Abernathy on 9/24/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +/// Assigns a signal to an object property, automatically setting the given key +/// path on every `next`. When the signal completes, the binding is automatically +/// disposed of. +/// +/// There are two different versions of this macro: +/// +/// - RAC(TARGET, KEYPATH, NILVALUE) will bind the `KEYPATH` of `TARGET` to the +/// given signal. If the signal ever sends a `nil` value, the property will be +/// set to `NILVALUE` instead. `NILVALUE` may itself be `nil` for object +/// properties, but an NSValue should be used for primitive properties, to +/// avoid an exception if `nil` is sent (which might occur if an intermediate +/// object is set to `nil`). +/// - RAC(TARGET, KEYPATH) is the same as the above, but `NILVALUE` defaults to +/// `nil`. +/// +/// See -[RACSignal setKeyPath:onObject:nilValue:] for more information about the +/// binding's semantics. +/// +/// Examples +/// +/// RAC(self, objectProperty) = objectSignal; +/// RAC(self, stringProperty, @"foobar") = stringSignal; +/// RAC(self, integerProperty, @42) = integerSignal; +/// +/// WARNING: Under certain conditions, use of this macro can be thread-unsafe. +/// See the documentation of -setKeyPath:onObject:nilValue:. +#define RAC(TARGET, ...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__)) \ + (RAC_(TARGET, __VA_ARGS__, nil)) \ + (RAC_(TARGET, __VA_ARGS__)) + +/// Do not use this directly. Use the RAC macro above. +#define RAC_(TARGET, KEYPATH, NILVALUE) \ + [[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET) nilValue:(NILVALUE)][@keypath(TARGET, KEYPATH)] + +@interface RACSubscriptingAssignmentTrampoline : NSObject + +- (nullable instancetype)initWithTarget:(nullable id)target nilValue:(nullable id)nilValue; +- (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.m b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.m new file mode 100644 index 0000000..085ab0f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptingAssignmentTrampoline.m @@ -0,0 +1,42 @@ +// +// RACSubscriptingAssignmentTrampoline.m +// ReactiveObjC +// +// Created by Josh Abernathy on 9/24/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubscriptingAssignmentTrampoline.h" +#import "RACSignal+Operations.h" + +@interface RACSubscriptingAssignmentTrampoline () + +// The object to bind to. +@property (nonatomic, strong, readonly) id target; + +// A value to use when `nil` is sent on the bound signal. +@property (nonatomic, strong, readonly) id nilValue; + +@end + +@implementation RACSubscriptingAssignmentTrampoline + +- (instancetype)initWithTarget:(id)target nilValue:(id)nilValue { + // This is often a programmer error, but this prevents crashes if the target + // object has unexpectedly deallocated. + if (target == nil) return nil; + + self = [super init]; + if (self == nil) return nil; + + _target = target; + _nilValue = nilValue; + + return self; +} + +- (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath { + [signal setKeyPath:keyPath onObject:self.target nilValue:self.nilValue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h new file mode 100644 index 0000000..97f88be --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.h @@ -0,0 +1,19 @@ +// +// RACSubscriptionScheduler.h +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +// A private scheduler used only for subscriptions. See the private +// +[RACScheduler subscriptionScheduler] method for more information. +@interface RACSubscriptionScheduler : RACScheduler + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.m new file mode 100644 index 0000000..d503dee --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACSubscriptionScheduler.m @@ -0,0 +1,53 @@ +// +// RACSubscriptionScheduler.m +// ReactiveObjC +// +// Created by Josh Abernathy on 11/30/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACSubscriptionScheduler.h" +#import "RACScheduler+Private.h" + +@interface RACSubscriptionScheduler () + +// A private background scheduler on which to subscribe if the +currentScheduler +// is unknown. +@property (nonatomic, strong, readonly) RACScheduler *backgroundScheduler; + +@end + +@implementation RACSubscriptionScheduler + +#pragma mark Lifecycle + +- (instancetype)init { + self = [super initWithName:@"org.reactivecocoa.ReactiveObjC.RACScheduler.subscriptionScheduler"]; + + _backgroundScheduler = [RACScheduler scheduler]; + + return self; +} + +#pragma mark RACScheduler + +- (RACDisposable *)schedule:(void (^)(void))block { + NSCParameterAssert(block != NULL); + + if (RACScheduler.currentScheduler == nil) return [self.backgroundScheduler schedule:block]; + + block(); + return nil; +} + +- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { + RACScheduler *scheduler = RACScheduler.currentScheduler ?: self.backgroundScheduler; + return [scheduler after:date schedule:block]; +} + +- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { + RACScheduler *scheduler = RACScheduler.currentScheduler ?: self.backgroundScheduler; + return [scheduler after:date repeatingEvery:interval withLeeway:leeway schedule:block]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h new file mode 100644 index 0000000..0161811 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.h @@ -0,0 +1,28 @@ +// +// RACTargetQueueScheduler.h +// ReactiveObjC +// +// Created by Josh Abernathy on 6/6/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACQueueScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A scheduler that enqueues blocks on a private serial queue, targeting an +/// arbitrary GCD queue. +@interface RACTargetQueueScheduler : RACQueueScheduler + +/// Initializes the receiver with a serial queue that will target the given +/// `targetQueue`. +/// +/// name - The name of the scheduler. If nil, a default name will be used. +/// targetQueue - The queue to target. Cannot be NULL. +/// +/// Returns the initialized object. +- (instancetype)initWithName:(nullable NSString *)name targetQueue:(dispatch_queue_t)targetQueue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.m new file mode 100644 index 0000000..6e1dcaf --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTargetQueueScheduler.m @@ -0,0 +1,31 @@ +// +// RACTargetQueueScheduler.m +// ReactiveObjC +// +// Created by Josh Abernathy on 6/6/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACTargetQueueScheduler.h" +#import "RACQueueScheduler+Subclass.h" + +@implementation RACTargetQueueScheduler + +#pragma mark Lifecycle + +- (instancetype)initWithName:(NSString *)name targetQueue:(dispatch_queue_t)targetQueue { + NSCParameterAssert(targetQueue != NULL); + + if (name == nil) { + name = [NSString stringWithFormat:@"org.reactivecocoa.ReactiveObjC.RACTargetQueueScheduler(%s)", dispatch_queue_get_label(targetQueue)]; + } + + dispatch_queue_t queue = dispatch_queue_create(name.UTF8String, DISPATCH_QUEUE_SERIAL); + if (queue == NULL) return nil; + + dispatch_set_target_queue(queue, targetQueue); + + return [super initWithName:name queue:queue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.h b/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.h new file mode 100644 index 0000000..bf460e0 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.h @@ -0,0 +1,46 @@ +// +// RACTestScheduler.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-06. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACScheduler.h" + +NS_ASSUME_NONNULL_BEGIN + +/// A special kind of scheduler that steps through virtualized time. +/// +/// This scheduler class can be used in unit tests to verify asynchronous +/// behaviors without spending significant time waiting. +/// +/// This class can be used from multiple threads, but only one thread can `step` +/// through the enqueued actions at a time. Other threads will wait while the +/// scheduled blocks are being executed. +@interface RACTestScheduler : RACScheduler + +/// Initializes a new test scheduler. +- (instancetype)init; + +/// Executes the next scheduled block, if any. +/// +/// This method will block until the scheduled action has completed. +- (void)step; + +/// Executes up to the next `ticks` scheduled blocks. +/// +/// This method will block until the scheduled actions have completed. +/// +/// ticks - The number of scheduled blocks to execute. If there aren't this many +/// blocks enqueued, all scheduled blocks are executed. +- (void)step:(NSUInteger)ticks; + +/// Executes all of the scheduled blocks on the receiver. +/// +/// This method will block until the scheduled actions have completed. +- (void)stepAll; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.m b/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.m new file mode 100644 index 0000000..316edf0 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTestScheduler.m @@ -0,0 +1,221 @@ +// +// RACTestScheduler.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-06. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACTestScheduler.h" +#import +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACScheduler+Private.h" + +@interface RACTestSchedulerAction : NSObject + +// The date at which the action should be executed. +// +// This absolute time will not actually be honored. This date is only used for +// comparison, to determine which block should be run _next_. +@property (nonatomic, copy, readonly) NSDate *date; + +// The scheduled block. +@property (nonatomic, copy, readonly) void (^block)(void); + +// A disposable for this action. +// +// When disposed, the action should not start executing if it hasn't already. +@property (nonatomic, strong, readonly) RACDisposable *disposable; + +// Initializes a new scheduler action. +- (instancetype)initWithDate:(NSDate *)date block:(void (^)(void))block; + +@end + +static CFComparisonResult RACCompareScheduledActions(const void *ptr1, const void *ptr2, void *info) { + RACTestSchedulerAction *action1 = (__bridge id)ptr1; + RACTestSchedulerAction *action2 = (__bridge id)ptr2; + return CFDateCompare((__bridge CFDateRef)action1.date, (__bridge CFDateRef)action2.date, NULL); +} + +static const void *RACRetainScheduledAction(CFAllocatorRef allocator, const void *ptr) { + return CFRetain(ptr); +} + +static void RACReleaseScheduledAction(CFAllocatorRef allocator, const void *ptr) { + CFRelease(ptr); +} + +@interface RACTestScheduler () + +// All of the RACTestSchedulerActions that have been enqueued and not yet +// executed. +// +// The minimum value in the heap represents the action to execute next. +// +// This property should only be used while synchronized on self. +@property (nonatomic, assign, readonly) CFBinaryHeapRef scheduledActions; + +// The number of blocks that have been directly enqueued with -schedule: so +// far. +// +// This is used to ensure unique dates when two blocks are enqueued +// simultaneously. +// +// This property should only be used while synchronized on self. +@property (nonatomic, assign) NSUInteger numberOfDirectlyScheduledBlocks; + +@end + +@implementation RACTestScheduler + +#pragma mark Lifecycle + +- (instancetype)init { + self = [super initWithName:@"org.reactivecocoa.ReactiveObjC.RACTestScheduler"]; + + CFBinaryHeapCallBacks callbacks = (CFBinaryHeapCallBacks){ + .version = 0, + .retain = &RACRetainScheduledAction, + .release = &RACReleaseScheduledAction, + .copyDescription = &CFCopyDescription, + .compare = &RACCompareScheduledActions + }; + + _scheduledActions = CFBinaryHeapCreate(NULL, 0, &callbacks, NULL); + return self; +} + +- (void)dealloc { + [self stepAll]; + + if (_scheduledActions != NULL) { + CFBridgingRelease(_scheduledActions); + _scheduledActions = NULL; + } +} + +#pragma mark Execution + +- (void)step { + [self step:1]; +} + +- (void)step:(NSUInteger)ticks { + @synchronized (self) { + for (NSUInteger i = 0; i < ticks; i++) { + const void *actionPtr = NULL; + if (!CFBinaryHeapGetMinimumIfPresent(self.scheduledActions, &actionPtr)) break; + + RACTestSchedulerAction *action = (__bridge id)actionPtr; + CFBinaryHeapRemoveMinimumValue(self.scheduledActions); + + if (action.disposable.disposed) continue; + + RACScheduler *previousScheduler = RACScheduler.currentScheduler; + NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = self; + + action.block(); + + if (previousScheduler != nil) { + NSThread.currentThread.threadDictionary[RACSchedulerCurrentSchedulerKey] = previousScheduler; + } else { + [NSThread.currentThread.threadDictionary removeObjectForKey:RACSchedulerCurrentSchedulerKey]; + } + } + } +} + +- (void)stepAll { + [self step:NSUIntegerMax]; +} + +#pragma mark RACScheduler + +- (RACDisposable *)schedule:(void (^)(void))block { + NSCParameterAssert(block != nil); + + @synchronized (self) { + NSDate *uniqueDate = [NSDate dateWithTimeIntervalSinceReferenceDate:self.numberOfDirectlyScheduledBlocks]; + self.numberOfDirectlyScheduledBlocks++; + + RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:uniqueDate block:block]; + CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); + + return action.disposable; + } +} + +- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(block != nil); + + @synchronized (self) { + RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:date block:block]; + CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); + + return action.disposable; + } +} + +- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(block != nil); + NSCParameterAssert(interval >= 0); + NSCParameterAssert(leeway >= 0); + + RACCompoundDisposable *compoundDisposable = [RACCompoundDisposable compoundDisposable]; + + @weakify(self); + @synchronized (self) { + __block RACDisposable *thisDisposable = nil; + + void (^reschedulingBlock)(void) = ^{ + @strongify(self); + + [compoundDisposable removeDisposable:thisDisposable]; + + // Schedule the next interval. + RACDisposable *schedulingDisposable = [self after:[date dateByAddingTimeInterval:interval] repeatingEvery:interval withLeeway:leeway schedule:block]; + [compoundDisposable addDisposable:schedulingDisposable]; + + block(); + }; + + RACTestSchedulerAction *action = [[RACTestSchedulerAction alloc] initWithDate:date block:reschedulingBlock]; + CFBinaryHeapAddValue(self.scheduledActions, (__bridge void *)action); + + thisDisposable = action.disposable; + [compoundDisposable addDisposable:thisDisposable]; + } + + return compoundDisposable; +} + +@end + +@implementation RACTestSchedulerAction + +#pragma mark Lifecycle + +- (instancetype)initWithDate:(NSDate *)date block:(void (^)(void))block { + NSCParameterAssert(date != nil); + NSCParameterAssert(block != nil); + + self = [super init]; + + _date = [date copy]; + _block = [block copy]; + _disposable = [[RACDisposable alloc] init]; + + return self; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ date: %@ }", self.class, self, self.date]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTuple.h b/Pods/ReactiveObjC/ReactiveObjC/RACTuple.h new file mode 100644 index 0000000..f566f7a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTuple.h @@ -0,0 +1,251 @@ +// +// RACTuple.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/12/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import +#import "RACmetamacros.h" + +@class RACSequence; + +/// Creates a new tuple with the given values. At least one value must be given. +/// Values can be nil. +#define RACTuplePack(...) \ + RACTuplePack_(__VA_ARGS__) + +/// Declares new object variables and unpacks a RACTuple into them. +/// +/// This macro should be used on the left side of an assignment, with the +/// tuple on the right side. Nothing else should appear on the same line, and the +/// macro should not be the only statement in a conditional or loop body. +/// +/// If the tuple has more values than there are variables listed, the excess +/// values are ignored. +/// +/// If the tuple has fewer values than there are variables listed, the excess +/// variables are initialized to nil. +/// +/// Examples +/// +/// RACTupleUnpack(NSString *string, NSNumber *num) = [RACTuple tupleWithObjects:@"foo", @5, nil]; +/// NSLog(@"string: %@", string); +/// NSLog(@"num: %@", num); +/// +/// /* The above is equivalent to: */ +/// RACTuple *t = [RACTuple tupleWithObjects:@"foo", @5, nil]; +/// NSString *string = t[0]; +/// NSNumber *num = t[1]; +/// NSLog(@"string: %@", string); +/// NSLog(@"num: %@", num); +#define RACTupleUnpack(...) \ + RACTupleUnpack_(__VA_ARGS__) + +@class RACTwoTuple<__covariant First, __covariant Second>; +@class RACThreeTuple<__covariant First, __covariant Second, __covariant Third>; +@class RACFourTuple<__covariant First, __covariant Second, __covariant Third, __covariant Fourth>; +@class RACFiveTuple<__covariant First, __covariant Second, __covariant Third, __covariant Fourth, __covariant Fifth>; + +NS_ASSUME_NONNULL_BEGIN + +/// A sentinel object that represents nils in the tuple. +/// +/// It should never be necessary to create a tuple nil yourself. Just use +/// +tupleNil. +@interface RACTupleNil : NSObject +/// A singleton instance. ++ (RACTupleNil *)tupleNil; +@end + + +/// A tuple is an ordered collection of objects. It may contain nils, represented +/// by RACTupleNil. +@interface RACTuple : NSObject + +@property (nonatomic, readonly) NSUInteger count; + +/// These properties all return the object at that index or nil if the number of +/// objects is less than the index. +@property (nonatomic, readonly, nullable) id first; +@property (nonatomic, readonly, nullable) id second; +@property (nonatomic, readonly, nullable) id third; +@property (nonatomic, readonly, nullable) id fourth; +@property (nonatomic, readonly, nullable) id fifth; +@property (nonatomic, readonly, nullable) id last; + +/// Creates a new tuple out of the array. Does not convert nulls to nils. ++ (instancetype)tupleWithObjectsFromArray:(NSArray *)array; + +/// Creates a new tuple out of the array. If `convert` is YES, it also converts +/// every NSNull to RACTupleNil. ++ (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert; + +/// Creates a new tuple with the given objects. Use RACTupleNil to represent +/// nils. ++ (instancetype)tupleWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION; + +/// Returns the object at `index` or nil if the object is a RACTupleNil. Unlike +/// NSArray and friends, it's perfectly fine to ask for the object at an index +/// past the tuple's count - 1. It will simply return nil. +- (nullable id)objectAtIndex:(NSUInteger)index; + +/// Returns an array of all the objects. RACTupleNils are converted to NSNulls. +- (NSArray *)allObjects; + +/// Appends `obj` to the receiver. +/// +/// obj - The object to add to the tuple. This argument may be nil. +/// +/// Returns a new tuple. +- (__kindof RACTuple *)tupleByAddingObject:(nullable id)obj; + +@end + +@interface RACTuple (RACSequenceAdditions) + +/// Returns a sequence of all the objects. RACTupleNils are converted to NSNulls. +@property (nonatomic, copy, readonly) RACSequence *rac_sequence; + +@end + +@interface RACTuple (ObjectSubscripting) +/// Returns the object at that index or nil if the number of objects is less +/// than the index. +- (nullable id)objectAtIndexedSubscript:(NSUInteger)idx; +@end + +/// A tuple with exactly one generic value. +@interface RACOneTuple<__covariant First> : RACTuple + ++ (instancetype)tupleWithObjects:(id)object, ... __attribute((unavailable("Use pack: instead."))); + +- (RACTwoTuple *)tupleByAddingObject:(nullable id)obj; + +/// Creates a new tuple with the given values. ++ (RACOneTuple *)pack:(First)first; + +@property (nonatomic, readonly, nullable) First first; + +@end + +/// A tuple with exactly two generic values. +@interface RACTwoTuple<__covariant First, __covariant Second> : RACTuple + ++ (instancetype)tupleWithObjects:(id)object, ... __attribute((unavailable("Use pack:: instead."))); + +- (RACThreeTuple *)tupleByAddingObject:(nullable id)obj; + +/// Creates a new tuple with the given value. ++ (RACTwoTuple *)pack:(First)first :(Second)second; + +@property (nonatomic, readonly, nullable) First first; +@property (nonatomic, readonly, nullable) Second second; + +@end + +/// A tuple with exactly three generic values. +@interface RACThreeTuple<__covariant First, __covariant Second, __covariant Third> : RACTuple + ++ (instancetype)tupleWithObjects:(id)object, ... __attribute((unavailable("Use pack::: instead."))); + +- (RACFourTuple *)tupleByAddingObject:(nullable id)obj; + +/// Creates a new tuple with the given values. ++ (instancetype)pack:(nullable First)first :(nullable Second)second :(nullable Third)third; + +@property (nonatomic, readonly, nullable) First first; +@property (nonatomic, readonly, nullable) Second second; +@property (nonatomic, readonly, nullable) Third third; + +@end + +/// A tuple with exactly four generic values. +@interface RACFourTuple<__covariant First, __covariant Second, __covariant Third, __covariant Fourth> : RACTuple + ++ (instancetype)tupleWithObjects:(id)object, ... __attribute((unavailable("Use pack:::: instead."))); + +- (RACFiveTuple *)tupleByAddingObject:(nullable id)obj; + +/// Creates a new tuple with the given values. ++ (instancetype)pack:(nullable First)first :(nullable Second)second :(nullable Third)third :(nullable Fourth)fourth; + +@property (nonatomic, readonly, nullable) First first; +@property (nonatomic, readonly, nullable) Second second; +@property (nonatomic, readonly, nullable) Third third; +@property (nonatomic, readonly, nullable) Fourth fourth; + +@end + +/// A tuple with exactly five generic values. +@interface RACFiveTuple<__covariant First, __covariant Second, __covariant Third, __covariant Fourth, __covariant Fifth> : RACTuple + ++ (instancetype)tupleWithObjects:(id)object, ... __attribute((unavailable("Use pack::::: instead."))); + +/// Creates a new tuple with the given values. ++ (instancetype)pack:(nullable First)first :(nullable Second)second :(nullable Third)third :(nullable Fourth)fourth :(nullable Fifth)fifth; + +@property (nonatomic, readonly, nullable) First first; +@property (nonatomic, readonly, nullable) Second second; +@property (nonatomic, readonly, nullable) Third third; +@property (nonatomic, readonly, nullable) Fourth fourth; +@property (nonatomic, readonly, nullable) Fifth fifth; + +@end + +/// This and everything below is for internal use only. +/// +/// See RACTuplePack() and RACTupleUnpack() instead. +#define RACTuplePack_(...) \ + ([RACTuplePack_class_name(__VA_ARGS__) tupleWithObjectsFromArray:@[ metamacro_foreach(RACTuplePack_object_or_ractuplenil,, __VA_ARGS__) ]]) + +#define RACTuplePack_object_or_ractuplenil(INDEX, ARG) \ + (ARG) ?: RACTupleNil.tupleNil, + +/// Returns the class that should be used to create a tuple with the provided +/// variadic arguments to RACTuplePack_(). Supports up to 20 arguments. +#define RACTuplePack_class_name(...) \ + metamacro_at(20, __VA_ARGS__, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACTuple, RACFiveTuple, RACFourTuple, RACThreeTuple, RACTwoTuple, RACOneTuple) + +#define RACTupleUnpack_(...) \ + metamacro_foreach(RACTupleUnpack_decl,, __VA_ARGS__) \ + \ + int RACTupleUnpack_state = 0; \ + \ + RACTupleUnpack_after: \ + ; \ + metamacro_foreach(RACTupleUnpack_assign,, __VA_ARGS__) \ + if (RACTupleUnpack_state != 0) RACTupleUnpack_state = 2; \ + \ + while (RACTupleUnpack_state != 2) \ + if (RACTupleUnpack_state == 1) { \ + goto RACTupleUnpack_after; \ + } else \ + for (; RACTupleUnpack_state != 1; RACTupleUnpack_state = 1) \ + [RACTupleUnpackingTrampoline trampoline][ @[ metamacro_foreach(RACTupleUnpack_value,, __VA_ARGS__) ] ] + +#define RACTupleUnpack_state metamacro_concat(RACTupleUnpack_state, __LINE__) +#define RACTupleUnpack_after metamacro_concat(RACTupleUnpack_after, __LINE__) +#define RACTupleUnpack_loop metamacro_concat(RACTupleUnpack_loop, __LINE__) + +#define RACTupleUnpack_decl_name(INDEX) \ + metamacro_concat(metamacro_concat(RACTupleUnpack, __LINE__), metamacro_concat(_var, INDEX)) + +#define RACTupleUnpack_decl(INDEX, ARG) \ + __strong id RACTupleUnpack_decl_name(INDEX); + +#define RACTupleUnpack_assign(INDEX, ARG) \ + __strong ARG = RACTupleUnpack_decl_name(INDEX); + +#define RACTupleUnpack_value(INDEX, ARG) \ + [NSValue valueWithPointer:&RACTupleUnpack_decl_name(INDEX)], + +@interface RACTupleUnpackingTrampoline : NSObject + ++ (instancetype)trampoline; +- (void)setObject:(nullable RACTuple *)tuple forKeyedSubscript:(NSArray *)variables; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTuple.m b/Pods/ReactiveObjC/ReactiveObjC/RACTuple.m new file mode 100644 index 0000000..6cf7536 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTuple.m @@ -0,0 +1,436 @@ +// +// RACTuple.m +// ReactiveObjC +// +// Created by Josh Abernathy on 4/12/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACTuple.h" +#import +#import "RACTupleSequence.h" + +@implementation RACTupleNil + ++ (RACTupleNil *)tupleNil { + static dispatch_once_t onceToken; + static RACTupleNil *tupleNil = nil; + dispatch_once(&onceToken, ^{ + tupleNil = [[self alloc] init]; + }); + + return tupleNil; +} + +#pragma mark NSCopying + +- (id)copyWithZone:(NSZone *)zone { + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)coder { + // Always return the singleton. + return self.class.tupleNil; +} + +- (void)encodeWithCoder:(NSCoder *)coder { +} + +@end + + +@interface RACTuple () + +- (instancetype)initWithBackingArray:(NSArray *)backingArray NS_DESIGNATED_INITIALIZER; + +@property (nonatomic, readonly) NSArray *backingArray; + +@end + + +@implementation RACTuple + +- (instancetype)init { + return [self initWithBackingArray:@[]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + self = [super init]; + + _backingArray = [backingArray copy]; + + return self; +} + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p> %@", self.class, self, self.allObjects]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + if (![object isKindOfClass:self.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +- (NSUInteger)hash { + return self.backingArray.hash; +} + +#pragma mark NSFastEnumeration + +- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len { + return [self.backingArray countByEnumeratingWithState:state objects:buffer count:len]; +} + +#pragma mark NSCopying + +- (instancetype)copyWithZone:(NSZone *)zone { + // we're immutable, bitches! + return self; +} + +#pragma mark NSCoding + +- (instancetype)initWithCoder:(NSCoder *)coder { + self = [self init]; + + _backingArray = [coder decodeObjectForKey:@keypath(self.backingArray)]; + + return self; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + if (self.backingArray != nil) [coder encodeObject:self.backingArray forKey:@keypath(self.backingArray)]; +} + +#pragma mark API + ++ (instancetype)tupleWithObjectsFromArray:(NSArray *)array { + return [self tupleWithObjectsFromArray:array convertNullsToNils:NO]; +} + ++ (instancetype)tupleWithObjectsFromArray:(NSArray *)array convertNullsToNils:(BOOL)convert { + if (!convert) { + return [[self alloc] initWithBackingArray:array]; + } + + NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:array.count]; + for (id object in array) { + [newArray addObject:(object == NSNull.null ? RACTupleNil.tupleNil : object)]; + } + + return [[self alloc] initWithBackingArray:newArray]; +} + ++ (instancetype)tupleWithObjects:(id)object, ... { + va_list args; + va_start(args, object); + + NSUInteger count = 0; + for (id currentObject = object; currentObject != nil; currentObject = va_arg(args, id)) { + ++count; + } + + va_end(args); + + if (count == 0) { + return [[self alloc] init]; + } + + NSMutableArray *objects = [[NSMutableArray alloc] initWithCapacity:count]; + + va_start(args, object); + for (id currentObject = object; currentObject != nil; currentObject = va_arg(args, id)) { + [objects addObject:currentObject]; + } + + va_end(args); + + return [[self alloc] initWithBackingArray:objects]; +} + +- (id)objectAtIndex:(NSUInteger)index { + if (index >= self.count) return nil; + + id object = self.backingArray[index]; + return (object == RACTupleNil.tupleNil ? nil : object); +} + +- (NSArray *)allObjects { + NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:self.backingArray.count]; + for (id object in self.backingArray) { + [newArray addObject:(object == RACTupleNil.tupleNil ? NSNull.null : object)]; + } + + return newArray; +} + +- (instancetype)tupleByAddingObject:(id)obj { + NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; + return [self.class tupleWithObjectsFromArray:newArray]; +} + +- (NSUInteger)count { + return self.backingArray.count; +} + +- (id)first { + return self[0]; +} + +- (id)second { + return self[1]; +} + +- (id)third { + return self[2]; +} + +- (id)fourth { + return self[3]; +} + +- (id)fifth { + return self[4]; +} + +- (id)last { + return self[self.count - 1]; +} + +@end + + +@implementation RACTuple (RACSequenceAdditions) + +- (RACSequence *)rac_sequence { + return [RACTupleSequence sequenceWithTupleBackingArray:self.backingArray offset:0]; +} + +@end + +@implementation RACTuple (ObjectSubscripting) + +- (id)objectAtIndexedSubscript:(NSUInteger)idx { + return [self objectAtIndex:idx]; +} + +@end + +@implementation RACOneTuple + +- (instancetype)init { + return [self initWithBackingArray:@[ RACTupleNil.tupleNil ]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + NSParameterAssert(backingArray.count == 1); + return [super initWithBackingArray:backingArray]; +} + +- (RACTwoTuple *)tupleByAddingObject:(id)obj { + NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; + return [RACTwoTuple tupleWithObjectsFromArray:newArray]; +} + ++ (instancetype)pack:(id)first { + return [self tupleWithObjectsFromArray:@[ + first ?: RACTupleNil.tupleNil, + ]]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + + // We consider a RACTuple with an identical backing array as equal. + if (![object isKindOfClass:RACTuple.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +@dynamic first; + +@end + +@implementation RACTwoTuple + +- (instancetype)init { + return [self initWithBackingArray:@[ RACTupleNil.tupleNil, RACTupleNil.tupleNil ]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + NSParameterAssert(backingArray.count == 2); + return [super initWithBackingArray:backingArray]; +} + +- (RACThreeTuple *)tupleByAddingObject:(id)obj { + NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; + return [RACThreeTuple tupleWithObjectsFromArray:newArray]; +} + ++ (instancetype)pack:(id)first :(id)second { + return [self tupleWithObjectsFromArray:@[ + first ?: RACTupleNil.tupleNil, + second ?: RACTupleNil.tupleNil, + ]]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + + // We consider a RACTuple with an identical backing array as equal. + if (![object isKindOfClass:RACTuple.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +@dynamic first; +@dynamic second; + +@end + +@implementation RACThreeTuple + +- (instancetype)init { + return [super initWithBackingArray:@[ RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil ]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + NSParameterAssert(backingArray.count == 3); + return [super initWithBackingArray:backingArray]; +} + +- (RACFourTuple *)tupleByAddingObject:(id)obj { + NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; + return [RACFourTuple tupleWithObjectsFromArray:newArray]; +} + ++ (instancetype)pack:(id)first :(id)second :(id)third { + return [self tupleWithObjectsFromArray:@[ + first ?: RACTupleNil.tupleNil, + second ?: RACTupleNil.tupleNil, + third ?: RACTupleNil.tupleNil, + ]]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + + // We consider a RACTuple with an identical backing array as equal. + if (![object isKindOfClass:RACTuple.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +@dynamic first; +@dynamic second; +@dynamic third; + +@end + +@implementation RACFourTuple + +- (instancetype)init { + return [self initWithBackingArray:@[ RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil ]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + NSParameterAssert(backingArray.count == 4); + return [super initWithBackingArray:backingArray]; +} + +- (RACFiveTuple *)tupleByAddingObject:(id)obj { + NSArray *newArray = [self.backingArray arrayByAddingObject:obj ?: RACTupleNil.tupleNil]; + return [RACFiveTuple tupleWithObjectsFromArray:newArray]; +} + ++ (instancetype)pack:(id)first :(id)second :(id)third :(id)fourth { + return [self tupleWithObjectsFromArray:@[ + first ?: RACTupleNil.tupleNil, + second ?: RACTupleNil.tupleNil, + third ?: RACTupleNil.tupleNil, + fourth ?: RACTupleNil.tupleNil, + ]]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + + // We consider a RACTuple with an identical backing array as equal. + if (![object isKindOfClass:RACTuple.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +@dynamic first; +@dynamic second; +@dynamic third; +@dynamic fourth; + +@end + +@implementation RACFiveTuple + +- (instancetype)init { + return [self initWithBackingArray:@[ RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil, RACTupleNil.tupleNil ]]; +} + +- (instancetype)initWithBackingArray:(NSArray *)backingArray { + NSParameterAssert(backingArray.count == 5); + return [super initWithBackingArray:backingArray]; +} + ++ (instancetype)pack:(id)first :(id)second :(id)third :(id)fourth :(id)fifth { + return [self tupleWithObjectsFromArray:@[ + first ?: RACTupleNil.tupleNil, + second ?: RACTupleNil.tupleNil, + third ?: RACTupleNil.tupleNil, + fourth ?: RACTupleNil.tupleNil, + fifth ?: RACTupleNil.tupleNil, + ]]; +} + +- (BOOL)isEqual:(RACTuple *)object { + if (object == self) return YES; + + // We consider a RACTuple with an identical backing array as equal. + if (![object isKindOfClass:RACTuple.class]) return NO; + + return [self.backingArray isEqual:object.backingArray]; +} + +@dynamic first; +@dynamic second; +@dynamic third; +@dynamic fourth; +@dynamic fifth; + +@end + +@implementation RACTupleUnpackingTrampoline + +#pragma mark Lifecycle + ++ (instancetype)trampoline { + static dispatch_once_t onceToken; + static id trampoline = nil; + dispatch_once(&onceToken, ^{ + trampoline = [[self alloc] init]; + }); + + return trampoline; +} + +- (void)setObject:(RACTuple *)tuple forKeyedSubscript:(NSArray *)variables { + NSCParameterAssert(variables != nil); + + [variables enumerateObjectsUsingBlock:^(NSValue *value, NSUInteger index, BOOL *stop) { + __strong id *ptr = (__strong id *)value.pointerValue; + *ptr = tuple[index]; + }]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.h new file mode 100644 index 0000000..4aca794 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.h @@ -0,0 +1,18 @@ +// +// RACTupleSequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSequence.h" + +// Private class that adapts a RACTuple to the RACSequence interface. +@interface RACTupleSequence : RACSequence + +// Returns a sequence for enumerating over the given backing array (from a +// RACTuple), starting from the given offset. ++ (RACSequence *)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.m new file mode 100644 index 0000000..ee725ea --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACTupleSequence.m @@ -0,0 +1,68 @@ +// +// RACTupleSequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACTupleSequence.h" +#import "RACTuple.h" + +@interface RACTupleSequence () + +// The array being sequenced, as taken from RACTuple.backingArray. +@property (nonatomic, strong, readonly) NSArray *tupleBackingArray; + +// The index in the array from which the sequence starts. +@property (nonatomic, assign, readonly) NSUInteger offset; + +@end + +@implementation RACTupleSequence + +#pragma mark Lifecycle + ++ (RACSequence *)sequenceWithTupleBackingArray:(NSArray *)backingArray offset:(NSUInteger)offset { + NSCParameterAssert(offset <= backingArray.count); + + if (offset == backingArray.count) return self.empty; + + RACTupleSequence *seq = [[self alloc] init]; + seq->_tupleBackingArray = backingArray; + seq->_offset = offset; + return seq; +} + +#pragma mark RACSequence + +- (id)head { + id object = self.tupleBackingArray[self.offset]; + return (object == RACTupleNil.tupleNil ? NSNull.null : object); +} + +- (RACSequence *)tail { + RACSequence *sequence = [self.class sequenceWithTupleBackingArray:self.tupleBackingArray offset:self.offset + 1]; + sequence.name = self.name; + return sequence; +} + +- (NSArray *)array { + NSRange range = NSMakeRange(self.offset, self.tupleBackingArray.count - self.offset); + NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:range.length]; + + [self.tupleBackingArray enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:range] options:0 usingBlock:^(id object, NSUInteger index, BOOL *stop) { + id mappedObject = (object == RACTupleNil.tupleNil ? NSNull.null : object); + [array addObject:mappedObject]; + }]; + + return array; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, tuple = %@ }", self.class, self, self.name, self.tupleBackingArray]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.h b/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.h new file mode 100644 index 0000000..9a897ca --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.h @@ -0,0 +1,16 @@ +// +// RACUnarySequence.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACSequence.h" + +// Private class representing a sequence of exactly one value. +@interface RACUnarySequence : RACSequence + ++ (RACUnarySequence *)return:(id)value; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.m b/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.m new file mode 100644 index 0000000..dfd17bb --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACUnarySequence.m @@ -0,0 +1,81 @@ +// +// RACUnarySequence.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-05-01. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "RACUnarySequence.h" +#import +#import "NSObject+RACDescription.h" + +@interface RACUnarySequence () + +// The single value stored in this sequence. +@property (nonatomic, strong, readwrite) id head; + +@end + +@implementation RACUnarySequence + +#pragma mark Properties + +@synthesize head = _head; + +#pragma mark Lifecycle + ++ (RACUnarySequence *)return:(id)value { + RACUnarySequence *sequence = [[self alloc] init]; + sequence.head = value; + return [sequence setNameWithFormat:@"+return: %@", RACDescription(value)]; +} + +#pragma mark RACSequence + +- (RACSequence *)tail { + return nil; +} + +- (RACSequence *)bind:(RACSequenceBindBlock (^)(void))block { + RACStreamBindBlock bindBlock = block(); + BOOL stop = NO; + + RACSequence *result = (id)[bindBlock(self.head, &stop) setNameWithFormat:@"[%@] -bind:", self.name]; + return result ?: self.class.empty; +} + +#pragma mark NSCoding + +- (Class)classForCoder { + // Unary sequences should be encoded as themselves, not array sequences. + return self.class; +} + +- (instancetype)initWithCoder:(NSCoder *)coder { + id value = [coder decodeObjectForKey:@keypath(self.head)]; + return [self.class return:value]; +} + +- (void)encodeWithCoder:(NSCoder *)coder { + if (self.head != nil) [coder encodeObject:self.head forKey:@keypath(self.head)]; +} + +#pragma mark NSObject + +- (NSString *)description { + return [NSString stringWithFormat:@"<%@: %p>{ name = %@, head = %@ }", self.class, self, self.name, self.head]; +} + +- (NSUInteger)hash { + return [self.head hash]; +} + +- (BOOL)isEqual:(RACUnarySequence *)seq { + if (self == seq) return YES; + if (![seq isKindOfClass:RACUnarySequence.class]) return NO; + + return self.head == seq.head || [(NSObject *)self.head isEqual:seq.head]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACUnit.h b/Pods/ReactiveObjC/ReactiveObjC/RACUnit.h new file mode 100644 index 0000000..cb4824c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACUnit.h @@ -0,0 +1,23 @@ +// +// RACUnit.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/27/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/// A unit represents an empty value. +/// +/// It should never be necessary to create a unit yourself. Just use +defaultUnit. +@interface RACUnit : NSObject + +/// A singleton instance. ++ (RACUnit *)defaultUnit; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACUnit.m b/Pods/ReactiveObjC/ReactiveObjC/RACUnit.m new file mode 100644 index 0000000..691e5da --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACUnit.m @@ -0,0 +1,25 @@ +// +// RACUnit.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/27/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACUnit.h" + +@implementation RACUnit + +#pragma mark API + ++ (RACUnit *)defaultUnit { + static dispatch_once_t onceToken; + static RACUnit *defaultUnit = nil; + dispatch_once(&onceToken, ^{ + defaultUnit = [[self alloc] init]; + }); + + return defaultUnit; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.h b/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.h new file mode 100644 index 0000000..c827e6c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.h @@ -0,0 +1,16 @@ +// +// RACValueTransformer.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/6/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +// A private block based transformer. +@interface RACValueTransformer : NSValueTransformer + ++ (instancetype)transformerWithBlock:(id (^)(id value))block; + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.m b/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.m new file mode 100644 index 0000000..6f44e0f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/RACValueTransformer.m @@ -0,0 +1,42 @@ +// +// RACValueTransformer.m +// ReactiveObjC +// +// Created by Josh Abernathy on 3/6/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "RACValueTransformer.h" + +@interface RACValueTransformer () +@property (nonatomic, copy) id (^transformBlock)(id value); +@end + + +@implementation RACValueTransformer + + +#pragma mark NSValueTransformer + ++ (BOOL)allowsReverseTransformation { + return NO; +} + +- (id)transformedValue:(id)value { + return self.transformBlock(value); +} + + +#pragma mark API + +@synthesize transformBlock; + ++ (instancetype)transformerWithBlock:(id (^)(id value))block { + NSCParameterAssert(block != NULL); + + RACValueTransformer *transformer = [[self alloc] init]; + transformer.transformBlock = block; + return transformer; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/ReactiveObjC.h b/Pods/ReactiveObjC/ReactiveObjC/ReactiveObjC.h new file mode 100644 index 0000000..51816e9 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/ReactiveObjC.h @@ -0,0 +1,95 @@ +// +// ReactiveObjC.h +// ReactiveObjC +// +// Created by Josh Abernathy on 3/5/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +//! Project version number for ReactiveObjC. +FOUNDATION_EXPORT double ReactiveObjCVersionNumber; + +//! Project version string for ReactiveObjC. +FOUNDATION_EXPORT const unsigned char ReactiveObjCVersionString[]; + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#if TARGET_OS_WATCH +#elif TARGET_OS_IOS || TARGET_OS_TV + #import + #import + #import + #import + #import + #import + #import + #import + #import + #import + + #if TARGET_OS_IOS + #import + #import + #import + #import + #import + #import + #import + #import + #import + #import + #endif +#elif TARGET_OS_MAC + #import + #import + #import + #import + #import +#endif diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.h new file mode 100644 index 0000000..8308bbd --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.h @@ -0,0 +1,36 @@ +// +// UIActionSheet+RACSignalSupport.h +// ReactiveObjC +// +// Created by Dave Lee on 2013-06-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACDelegateProxy; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIActionSheet (RACSignalSupport) + +/// A delegate proxy which will be set as the receiver's delegate when any of the +/// methods in this category are used. +@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; + +/// Creates a signal for button clicks on the receiver. +/// +/// When this method is invoked, the `rac_delegateProxy` will become the +/// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy +/// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't +/// know how to handle. Setting the receiver's `delegate` afterward is +/// considered undefined behavior. +/// +/// Returns a signal which will send the index of the specific button clicked. +/// The signal will complete when the receiver is deallocated. +- (RACSignal *)rac_buttonClickedSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.m new file mode 100644 index 0000000..6a1a410 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIActionSheet+RACSignalSupport.m @@ -0,0 +1,49 @@ +// +// UIActionSheet+RACSignalSupport.m +// ReactiveObjC +// +// Created by Dave Lee on 2013-06-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIActionSheet+RACSignalSupport.h" +#import "RACDelegateProxy.h" +#import "RACSignal+Operations.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import + +@implementation UIActionSheet (RACSignalSupport) + +static void RACUseDelegateProxy(UIActionSheet *self) { + if (self.delegate == self.rac_delegateProxy) return; + + self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; + self.delegate = (id)self.rac_delegateProxy; +} + +- (RACDelegateProxy *)rac_delegateProxy { + RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); + if (proxy == nil) { + proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIActionSheetDelegate)]; + objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return proxy; +} + +- (RACSignal *)rac_buttonClickedSignal { + RACSignal *signal = [[[[self.rac_delegateProxy + signalForSelector:@selector(actionSheet:clickedButtonAtIndex:)] + reduceEach:^(UIActionSheet *actionSheet, NSNumber *buttonIndex) { + return buttonIndex; + }] + takeUntil:self.rac_willDeallocSignal] + setNameWithFormat:@"%@ -rac_buttonClickedSignal", RACDescription(self)]; + + RACUseDelegateProxy(self); + + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.h new file mode 100644 index 0000000..7508c2e --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.h @@ -0,0 +1,51 @@ +// +// UIAlertView+RACSignalSupport.h +// ReactiveObjC +// +// Created by Henrik Hodne on 6/16/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACDelegateProxy; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIAlertView (RACSignalSupport) + +/// A delegate proxy which will be set as the receiver's delegate when any of the +/// methods in this category are used. +@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; + +/// Creates a signal for button clicks on the receiver. +/// +/// When this method is invoked, the `rac_delegateProxy` will become the +/// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy +/// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't +/// know how to handle. Setting the receiver's `delegate` afterward is considered +/// undefined behavior. +/// +/// Note that this signal will not send a value when the alert is dismissed +/// programatically. +/// +/// Returns a signal which will send the index of the specific button clicked. +/// The signal will complete itself when the receiver is deallocated. +- (RACSignal *)rac_buttonClickedSignal; + +/// Creates a signal for dismissal of the receiver. +/// +/// When this method is invoked, the `rac_delegateProxy` will become the +/// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy +/// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't +/// know how to handle. Setting the receiver's `delegate` afterward is considered +/// undefined behavior. +/// +/// Returns a signal which will send the index of the button associated with the +/// dismissal. The signal will complete itself when the receiver is deallocated. +- (RACSignal *)rac_willDismissSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.m new file mode 100644 index 0000000..0afc94a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIAlertView+RACSignalSupport.m @@ -0,0 +1,63 @@ +// +// UIAlertView+RACSignalSupport.m +// ReactiveObjC +// +// Created by Henrik Hodne on 6/16/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIAlertView+RACSignalSupport.h" +#import "RACDelegateProxy.h" +#import "RACSignal+Operations.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import + +@implementation UIAlertView (RACSignalSupport) + +static void RACUseDelegateProxy(UIAlertView *self) { + if (self.delegate == self.rac_delegateProxy) return; + + self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; + self.delegate = (id)self.rac_delegateProxy; +} + +- (RACDelegateProxy *)rac_delegateProxy { + RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); + if (proxy == nil) { + proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIAlertViewDelegate)]; + objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return proxy; +} + +- (RACSignal *)rac_buttonClickedSignal { + RACSignal *signal = [[[[self.rac_delegateProxy + signalForSelector:@selector(alertView:clickedButtonAtIndex:)] + reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) { + return buttonIndex; + }] + takeUntil:self.rac_willDeallocSignal] + setNameWithFormat:@"%@ -rac_buttonClickedSignal", RACDescription(self)]; + + RACUseDelegateProxy(self); + + return signal; +} + +- (RACSignal *)rac_willDismissSignal { + RACSignal *signal = [[[[self.rac_delegateProxy + signalForSelector:@selector(alertView:willDismissWithButtonIndex:)] + reduceEach:^(UIAlertView *alertView, NSNumber *buttonIndex) { + return buttonIndex; + }] + takeUntil:self.rac_willDeallocSignal] + setNameWithFormat:@"%@ -rac_willDismissSignal", RACDescription(self)]; + + RACUseDelegateProxy(self); + + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h new file mode 100644 index 0000000..4ab1417 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.h @@ -0,0 +1,26 @@ +// +// UIBarButtonItem+RACCommandSupport.h +// ReactiveObjC +// +// Created by Kyle LeNeau on 3/27/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACCommand<__contravariant InputType, __covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIBarButtonItem (RACCommandSupport) + +/// Sets the control's command. When the control is clicked, the command is +/// executed with the sender of the event. The control's enabledness is bound +/// to the command's `canExecute`. +/// +/// Note: this will reset the control's target and action. +@property (nonatomic, strong, nullable) RACCommand<__kindof UIBarButtonItem *, id> *rac_command; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m new file mode 100644 index 0000000..ca3b89a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIBarButtonItem+RACCommandSupport.m @@ -0,0 +1,54 @@ +// +// UIBarButtonItem+RACCommandSupport.m +// ReactiveObjC +// +// Created by Kyle LeNeau on 3/27/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIBarButtonItem+RACCommandSupport.h" +#import +#import "RACCommand.h" +#import "RACDisposable.h" +#import "RACSignal+Operations.h" +#import + +static void *UIControlRACCommandKey = &UIControlRACCommandKey; +static void *UIControlEnabledDisposableKey = &UIControlEnabledDisposableKey; + +@implementation UIBarButtonItem (RACCommandSupport) + +- (RACCommand *)rac_command { + return objc_getAssociatedObject(self, UIControlRACCommandKey); +} + +- (void)setRac_command:(RACCommand *)command { + objc_setAssociatedObject(self, UIControlRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // Check for stored signal in order to remove it and add a new one + RACDisposable *disposable = objc_getAssociatedObject(self, UIControlEnabledDisposableKey); + [disposable dispose]; + + if (command == nil) return; + + disposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; + objc_setAssociatedObject(self, UIControlEnabledDisposableKey, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + [self rac_hijackActionAndTargetIfNeeded]; +} + +- (void)rac_hijackActionAndTargetIfNeeded { + SEL hijackSelector = @selector(rac_commandPerformAction:); + if (self.target == self && self.action == hijackSelector) return; + + if (self.target != nil) NSLog(@"WARNING: UIBarButtonItem.rac_command hijacks the control's existing target and action."); + + self.target = self; + self.action = hijackSelector; +} + +- (void)rac_commandPerformAction:(id)sender { + [self.rac_command execute:sender]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.h new file mode 100644 index 0000000..24e17e6 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.h @@ -0,0 +1,24 @@ +// +// UIButton+RACCommandSupport.h +// ReactiveObjC +// +// Created by Ash Furrow on 2013-06-06. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACCommand<__contravariant InputType, __covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIButton (RACCommandSupport) + +/// Sets the button's command. When the button is clicked, the command is +/// executed with the sender of the event. The button's enabledness is bound +/// to the command's `canExecute`. +@property (nonatomic, strong, nullable) RACCommand<__kindof UIButton *, id> *rac_command; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.m new file mode 100644 index 0000000..28393e0 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIButton+RACCommandSupport.m @@ -0,0 +1,56 @@ +// +// UIButton+RACCommandSupport.m +// ReactiveObjC +// +// Created by Ash Furrow on 2013-06-06. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIButton+RACCommandSupport.h" +#import +#import "RACCommand.h" +#import "RACDisposable.h" +#import "RACSignal+Operations.h" +#import + +static void *UIButtonRACCommandKey = &UIButtonRACCommandKey; +static void *UIButtonEnabledDisposableKey = &UIButtonEnabledDisposableKey; + +@implementation UIButton (RACCommandSupport) + +- (RACCommand *)rac_command { + return objc_getAssociatedObject(self, UIButtonRACCommandKey); +} + +- (void)setRac_command:(RACCommand *)command { + objc_setAssociatedObject(self, UIButtonRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // Check for stored signal in order to remove it and add a new one + RACDisposable *disposable = objc_getAssociatedObject(self, UIButtonEnabledDisposableKey); + [disposable dispose]; + + if (command == nil) return; + + disposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; + objc_setAssociatedObject(self, UIButtonEnabledDisposableKey, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + [self rac_hijackActionAndTargetIfNeeded]; +} + +- (void)rac_hijackActionAndTargetIfNeeded { + SEL hijackSelector = @selector(rac_commandPerformAction:); + + for (NSString *selector in [self actionsForTarget:self forControlEvent:UIControlEventTouchUpInside]) { + if (hijackSelector == NSSelectorFromString(selector)) { + return; + } + } + + [self addTarget:self action:hijackSelector forControlEvents:UIControlEventTouchUpInside]; +} + +- (void)rac_commandPerformAction:(id)sender { + [self.rac_command execute:sender]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h new file mode 100644 index 0000000..798877f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.h @@ -0,0 +1,34 @@ +// +// UICollectionReusableView+RACSignalSupport.h +// ReactiveObjC +// +// Created by Kent Wong on 2013-10-04. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; +@class RACUnit; + +NS_ASSUME_NONNULL_BEGIN + +// This category is only applicable to iOS >= 6.0. +@interface UICollectionReusableView (RACSignalSupport) + +/// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon +/// the receiver. +/// +/// Examples +/// +/// [[[self.cancelButton +/// rac_signalForControlEvents:UIControlEventTouchUpInside] +/// takeUntil:self.rac_prepareForReuseSignal] +/// subscribeNext:^(UIButton *x) { +/// // do other things +/// }]; +@property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.m new file mode 100644 index 0000000..9215c16 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UICollectionReusableView+RACSignalSupport.m @@ -0,0 +1,31 @@ +// +// UICollectionReusableView+RACSignalSupport.m +// ReactiveObjC +// +// Created by Kent Wong on 2013-10-04. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UICollectionReusableView+RACSignalSupport.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACSelectorSignal.h" +#import "RACSignal+Operations.h" +#import "RACUnit.h" +#import + +@implementation UICollectionReusableView (RACSignalSupport) + +- (RACSignal *)rac_prepareForReuseSignal { + RACSignal *signal = objc_getAssociatedObject(self, _cmd); + if (signal != nil) return signal; + + signal = [[[self + rac_signalForSelector:@selector(prepareForReuse)] + mapReplace:RACUnit.defaultUnit] + setNameWithFormat:@"%@ -rac_prepareForReuseSignal", RACDescription(self)]; + + objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.h new file mode 100644 index 0000000..4a9b596 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.h @@ -0,0 +1,23 @@ +// +// UIControl+RACSignalSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIControl (RACSignalSupport) + +/// Creates and returns a signal that sends the sender of the control event +/// whenever one of the control events is triggered. +- (RACSignal<__kindof UIControl *> *)rac_signalForControlEvents:(UIControlEvents)controlEvents; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.m new file mode 100644 index 0000000..1165437 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupport.m @@ -0,0 +1,43 @@ +// +// UIControl+RACSignalSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 4/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "UIControl+RACSignalSupport.h" +#import +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSignal.h" +#import "RACSubscriber.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" + +@implementation UIControl (RACSignalSupport) + +- (RACSignal *)rac_signalForControlEvents:(UIControlEvents)controlEvents { + @weakify(self); + + return [[RACSignal + createSignal:^(id subscriber) { + @strongify(self); + + [self addTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; + + RACDisposable *disposable = [RACDisposable disposableWithBlock:^{ + [subscriber sendCompleted]; + }]; + [self.rac_deallocDisposable addDisposable:disposable]; + + return [RACDisposable disposableWithBlock:^{ + @strongify(self); + [self.rac_deallocDisposable removeDisposable:disposable]; + [self removeTarget:subscriber action:@selector(sendNext:) forControlEvents:controlEvents]; + }]; + }] + setNameWithFormat:@"%@ -rac_signalForControlEvents: %lx", RACDescription(self), (unsigned long)controlEvents]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.h b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.h new file mode 100644 index 0000000..743ddf2 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.h @@ -0,0 +1,33 @@ +// +// UIControl+RACSignalSupportPrivate.h +// ReactiveObjC +// +// Created by Uri Baghin on 06/08/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIControl (RACSignalSupportPrivate) + +/// Adds a RACChannel-based interface to the receiver for the given +/// UIControlEvents and exposes it. +/// +/// controlEvents - A mask of UIControlEvents on which to send new values. +/// key - The key whose value should be read and set when a control +/// event fires and when a value is sent to the +/// RACChannelTerminal respectively. +/// nilValue - The value to be assigned to the key when `nil` is sent to the +/// RACChannelTerminal. This value can itself be nil. +/// +/// Returns a RACChannelTerminal which will send future values from the receiver, +/// and update the receiver when values are sent to the terminal. +- (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(nullable id)nilValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.m b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.m new file mode 100644 index 0000000..867f57e --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIControl+RACSignalSupportPrivate.m @@ -0,0 +1,48 @@ +// +// UIControl+RACSignalSupportPrivate.m +// ReactiveObjC +// +// Created by Uri Baghin on 06/08/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIControl+RACSignalSupportPrivate.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACLifting.h" +#import "RACChannel.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSignal+Operations.h" +#import "UIControl+RACSignalSupport.h" + +@implementation UIControl (RACSignalSupportPrivate) + +- (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(id)nilValue { + NSCParameterAssert(key.length > 0); + key = [key copy]; + RACChannel *channel = [[RACChannel alloc] init]; + + [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + [channel.followingTerminal sendCompleted]; + }]]; + + RACSignal *eventSignal = [[[self + rac_signalForControlEvents:controlEvents] + mapReplace:key] + takeUntil:[[channel.followingTerminal + ignoreValues] + catchTo:RACSignal.empty]]; + [[self + rac_liftSelector:@selector(valueForKey:) withSignals:eventSignal, nil] + subscribe:channel.followingTerminal]; + + RACSignal *valuesSignal = [channel.followingTerminal + map:^(id value) { + return value ?: nilValue; + }]; + [self rac_liftSelector:@selector(setValue:forKey:) withSignals:valuesSignal, [RACSignal return:key], nil]; + + return channel.leadingTerminal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.h new file mode 100644 index 0000000..4e6a57c --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.h @@ -0,0 +1,28 @@ +// +// UIDatePicker+RACSignalSupport.h +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIDatePicker (RACSignalSupport) + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// nilValue - The date to set when the terminal receives `nil`. +/// +/// Returns a RACChannelTerminal that sends the receiver's date whenever the +/// UIControlEventValueChanged control event is fired, and sets the date to the +/// values it receives. +- (RACChannelTerminal *)rac_newDateChannelWithNilValue:(nullable NSDate *)nilValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.m new file mode 100644 index 0000000..bca0621 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIDatePicker+RACSignalSupport.m @@ -0,0 +1,19 @@ +// +// UIDatePicker+RACSignalSupport.m +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIDatePicker+RACSignalSupport.h" +#import +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UIDatePicker (RACSignalSupport) + +- (RACChannelTerminal *)rac_newDateChannelWithNilValue:(NSDate *)nilValue { + return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.date) nilValue:nilValue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h new file mode 100644 index 0000000..5dc3677 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.h @@ -0,0 +1,22 @@ +// +// UIGestureRecognizer+RACSignalSupport.h +// ReactiveObjC +// +// Created by Josh Vera on 5/5/13. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIGestureRecognizer (RACSignalSupport) + +/// Returns a signal that sends the receiver when its gesture occurs. +- (RACSignal<__kindof UIGestureRecognizer *> *)rac_gestureSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m new file mode 100644 index 0000000..e37cfe4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIGestureRecognizer+RACSignalSupport.m @@ -0,0 +1,40 @@ +// +// UIGestureRecognizer+RACSignalSupport.m +// ReactiveObjC +// +// Created by Josh Vera on 5/5/13. +// Copyright (c) 2013 GitHub. All rights reserved. +// + +#import "UIGestureRecognizer+RACSignalSupport.h" +#import +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSignal.h" +#import "RACSubscriber.h" + +@implementation UIGestureRecognizer (RACSignalSupport) + +- (RACSignal *)rac_gestureSignal { + @weakify(self); + + return [[RACSignal + createSignal:^(id subscriber) { + @strongify(self); + + [self addTarget:subscriber action:@selector(sendNext:)]; + [self.rac_deallocDisposable addDisposable:[RACDisposable disposableWithBlock:^{ + [subscriber sendCompleted]; + }]]; + + return [RACDisposable disposableWithBlock:^{ + @strongify(self); + [self removeTarget:subscriber action:@selector(sendNext:)]; + }]; + }] + setNameWithFormat:@"%@ -rac_gestureSignal", RACDescription(self)]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.h new file mode 100644 index 0000000..7cce9bc --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.h @@ -0,0 +1,37 @@ +// +// UIImagePickerController+RACSignalSupport.h +// ReactiveObjC +// +// Created by Timur Kuchkarov on 28.03.14. +// Copyright (c) 2014 GitHub. All rights reserved. +// + +#import + +@class RACDelegateProxy; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIImagePickerController (RACSignalSupport) + +/// A delegate proxy which will be set as the receiver's delegate when any of the +/// methods in this category are used. +@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; + +/// Creates a signal for every new selected image. +/// +/// When this method is invoked, the `rac_delegateProxy` will become the +/// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy +/// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't +/// know how to handle. Setting the receiver's `delegate` afterward is considered +/// undefined behavior. +/// +/// Returns a signal which will send the dictionary with info for the selected image. +/// Caller is responsible for picker controller dismissal. The signal will complete +/// itself when the receiver is deallocated or when user cancels selection. +- (RACSignal *)rac_imageSelectedSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.m new file mode 100644 index 0000000..a5df4ee --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIImagePickerController+RACSignalSupport.m @@ -0,0 +1,53 @@ +// +// UIImagePickerController+RACSignalSupport.m +// ReactiveObjC +// +// Created by Timur Kuchkarov on 28.03.14. +// Copyright (c) 2014 GitHub. All rights reserved. +// + +#import "UIImagePickerController+RACSignalSupport.h" +#import "RACDelegateProxy.h" +#import "RACSignal+Operations.h" +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import + +@implementation UIImagePickerController (RACSignalSupport) + +static void RACUseDelegateProxy(UIImagePickerController *self) { + if (self.delegate == self.rac_delegateProxy) return; + + self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; + self.delegate = (id)self.rac_delegateProxy; +} + +- (RACDelegateProxy *)rac_delegateProxy { + RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); + if (proxy == nil) { + proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UIImagePickerControllerDelegate)]; + objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return proxy; +} + +- (RACSignal *)rac_imageSelectedSignal { + RACSignal *pickerCancelledSignal = [[self.rac_delegateProxy + signalForSelector:@selector(imagePickerControllerDidCancel:)] + merge:self.rac_willDeallocSignal]; + + RACSignal *imagePickerSignal = [[[[self.rac_delegateProxy + signalForSelector:@selector(imagePickerController:didFinishPickingMediaWithInfo:)] + reduceEach:^(UIImagePickerController *pickerController, NSDictionary *userInfo) { + return userInfo; + }] + takeUntil:pickerCancelledSignal] + setNameWithFormat:@"%@ -rac_imageSelectedSignal", RACDescription(self)]; + + RACUseDelegateProxy(self); + + return imagePickerSignal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.h new file mode 100644 index 0000000..cd5d803 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.h @@ -0,0 +1,26 @@ +// +// UIRefreshControl+RACCommandSupport.h +// ReactiveObjC +// +// Created by Dave Lee on 2013-10-17. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACCommand<__contravariant InputType, __covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIRefreshControl (RACCommandSupport) + +/// Manipulate the RACCommand property associated with this refresh control. +/// +/// When this refresh control is activated by the user, the command will be +/// executed. Upon completion or error of the execution signal, -endRefreshing +/// will be invoked. +@property (nonatomic, strong, nullable) RACCommand<__kindof UIRefreshControl *, id> *rac_command; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.m new file mode 100644 index 0000000..e6e9e4f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIRefreshControl+RACCommandSupport.m @@ -0,0 +1,59 @@ +// +// UIRefreshControl+RACCommandSupport.m +// ReactiveObjC +// +// Created by Dave Lee on 2013-10-17. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIRefreshControl+RACCommandSupport.h" +#import +#import "RACCommand.h" +#import "RACCompoundDisposable.h" +#import "RACDisposable.h" +#import "RACSignal.h" +#import "RACSignal+Operations.h" +#import "UIControl+RACSignalSupport.h" +#import + +static void *UIRefreshControlRACCommandKey = &UIRefreshControlRACCommandKey; +static void *UIRefreshControlDisposableKey = &UIRefreshControlDisposableKey; + +@implementation UIRefreshControl (RACCommandSupport) + +- (RACCommand *)rac_command { + return objc_getAssociatedObject(self, UIRefreshControlRACCommandKey); +} + +- (void)setRac_command:(RACCommand *)command { + objc_setAssociatedObject(self, UIRefreshControlRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + // Dispose of any active command associations. + [objc_getAssociatedObject(self, UIRefreshControlDisposableKey) dispose]; + + if (command == nil) return; + + // Like RAC(self, enabled) = command.enabled; but with access to disposable. + RACDisposable *enabledDisposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self]; + + RACDisposable *executionDisposable = [[[[[self + rac_signalForControlEvents:UIControlEventValueChanged] + map:^(UIRefreshControl *x) { + return [[[command + execute:x] + catchTo:[RACSignal empty]] + then:^{ + return [RACSignal return:x]; + }]; + }] + concat] + deliverOnMainThread] + subscribeNext:^(UIRefreshControl *x) { + [x endRefreshing]; + }]; + + RACDisposable *commandDisposable = [RACCompoundDisposable compoundDisposableWithDisposables:@[ enabledDisposable, executionDisposable ]]; + objc_setAssociatedObject(self, UIRefreshControlDisposableKey, commandDisposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.h new file mode 100644 index 0000000..d633be4 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.h @@ -0,0 +1,28 @@ +// +// UISegmentedControl+RACSignalSupport.h +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UISegmentedControl (RACSignalSupport) + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// nilValue - The segment to select when the terminal receives `nil`. +/// +/// Returns a RACChannelTerminal that sends the receiver's currently selected +/// segment's index whenever the UIControlEventValueChanged control event is +/// fired, and sets the selected segment index to the values it receives. +- (RACChannelTerminal *)rac_newSelectedSegmentIndexChannelWithNilValue:(nullable NSNumber *)nilValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.m new file mode 100644 index 0000000..0cdd9bd --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISegmentedControl+RACSignalSupport.m @@ -0,0 +1,19 @@ +// +// UISegmentedControl+RACSignalSupport.m +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UISegmentedControl+RACSignalSupport.h" +#import +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UISegmentedControl (RACSignalSupport) + +- (RACChannelTerminal *)rac_newSelectedSegmentIndexChannelWithNilValue:(NSNumber *)nilValue { + return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.selectedSegmentIndex) nilValue:nilValue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.h new file mode 100644 index 0000000..81ea97f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.h @@ -0,0 +1,28 @@ +// +// UISlider+RACSignalSupport.h +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UISlider (RACSignalSupport) + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// nilValue - The value to set when the terminal receives `nil`. +/// +/// Returns a RACChannelTerminal that sends the receiver's value whenever the +/// UIControlEventValueChanged control event is fired, and sets the value to the +/// values it receives. +- (RACChannelTerminal *)rac_newValueChannelWithNilValue:(nullable NSNumber *)nilValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.m new file mode 100644 index 0000000..86362fe --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISlider+RACSignalSupport.m @@ -0,0 +1,19 @@ +// +// UISlider+RACSignalSupport.m +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UISlider+RACSignalSupport.h" +#import +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UISlider (RACSignalSupport) + +- (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue { + return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.h new file mode 100644 index 0000000..67272a8 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.h @@ -0,0 +1,28 @@ +// +// UIStepper+RACSignalSupport.h +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UIStepper (RACSignalSupport) + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// nilValue - The value to set when the terminal receives `nil`. +/// +/// Returns a RACChannelTerminal that sends the receiver's value whenever the +/// UIControlEventValueChanged control event is fired, and sets the value to the +/// values it receives. +- (RACChannelTerminal *)rac_newValueChannelWithNilValue:(nullable NSNumber *)nilValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.m new file mode 100644 index 0000000..bd7d9ba --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UIStepper+RACSignalSupport.m @@ -0,0 +1,19 @@ +// +// UIStepper+RACSignalSupport.m +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UIStepper+RACSignalSupport.h" +#import +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UIStepper (RACSignalSupport) + +- (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue { + return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.h new file mode 100644 index 0000000..81638a6 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.h @@ -0,0 +1,26 @@ +// +// UISwitch+RACSignalSupport.h +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; + +NS_ASSUME_NONNULL_BEGIN + +@interface UISwitch (RACSignalSupport) + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// Returns a RACChannelTerminal that sends whether the receiver is on whenever +/// the UIControlEventValueChanged control event is fired, and sets it on or off +/// when it receives @YES or @NO respectively. +- (RACChannelTerminal *)rac_newOnChannel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.m new file mode 100644 index 0000000..7439225 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UISwitch+RACSignalSupport.m @@ -0,0 +1,19 @@ +// +// UISwitch+RACSignalSupport.m +// ReactiveObjC +// +// Created by Uri Baghin on 20/07/2013. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UISwitch+RACSignalSupport.h" +#import +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UISwitch (RACSignalSupport) + +- (RACChannelTerminal *)rac_newOnChannel { + return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.on) nilValue:@NO]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.h new file mode 100644 index 0000000..e7f1963 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.h @@ -0,0 +1,33 @@ +// +// UITableViewCell+RACSignalSupport.h +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; +@class RACUnit; + +NS_ASSUME_NONNULL_BEGIN + +@interface UITableViewCell (RACSignalSupport) + +/// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon +/// the receiver. +/// +/// Examples +/// +/// [[[self.cancelButton +/// rac_signalForControlEvents:UIControlEventTouchUpInside] +/// takeUntil:self.rac_prepareForReuseSignal] +/// subscribeNext:^(UIButton *x) { +/// // do other things +/// }]; +@property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.m new file mode 100644 index 0000000..5cf9dfa --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITableViewCell+RACSignalSupport.m @@ -0,0 +1,31 @@ +// +// UITableViewCell+RACSignalSupport.m +// ReactiveObjC +// +// Created by Justin Spahr-Summers on 2013-07-22. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UITableViewCell+RACSignalSupport.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACSelectorSignal.h" +#import "RACSignal+Operations.h" +#import "RACUnit.h" +#import + +@implementation UITableViewCell (RACSignalSupport) + +- (RACSignal *)rac_prepareForReuseSignal { + RACSignal *signal = objc_getAssociatedObject(self, _cmd); + if (signal != nil) return signal; + + signal = [[[self + rac_signalForSelector:@selector(prepareForReuse)] + mapReplace:RACUnit.defaultUnit] + setNameWithFormat:@"%@ -rac_prepareForReuseSignal", RACDescription(self)]; + + objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h new file mode 100644 index 0000000..e1b7124 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.h @@ -0,0 +1,34 @@ +// +// UITableViewHeaderFooterView+RACSignalSupport.h +// ReactiveObjC +// +// Created by Syo Ikeda on 12/30/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import + +@class RACSignal<__covariant ValueType>; +@class RACUnit; + +NS_ASSUME_NONNULL_BEGIN + +// This category is only applicable to iOS >= 6.0. +@interface UITableViewHeaderFooterView (RACSignalSupport) + +/// A signal which will send a RACUnit whenever -prepareForReuse is invoked upon +/// the receiver. +/// +/// Examples +/// +/// [[[self.cancelButton +/// rac_signalForControlEvents:UIControlEventTouchUpInside] +/// takeUntil:self.rac_prepareForReuseSignal] +/// subscribeNext:^(UIButton *x) { +/// // do other things +/// }]; +@property (nonatomic, strong, readonly) RACSignal *rac_prepareForReuseSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.m new file mode 100644 index 0000000..a0ffb43 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITableViewHeaderFooterView+RACSignalSupport.m @@ -0,0 +1,31 @@ +// +// UITableViewHeaderFooterView+RACSignalSupport.m +// ReactiveObjC +// +// Created by Syo Ikeda on 12/30/13. +// Copyright (c) 2013 GitHub, Inc. All rights reserved. +// + +#import "UITableViewHeaderFooterView+RACSignalSupport.h" +#import "NSObject+RACDescription.h" +#import "NSObject+RACSelectorSignal.h" +#import "RACSignal+Operations.h" +#import "RACUnit.h" +#import + +@implementation UITableViewHeaderFooterView (RACSignalSupport) + +- (RACSignal *)rac_prepareForReuseSignal { + RACSignal *signal = objc_getAssociatedObject(self, _cmd); + if (signal != nil) return signal; + + signal = [[[self + rac_signalForSelector:@selector(prepareForReuse)] + mapReplace:RACUnit.defaultUnit] + setNameWithFormat:@"%@ -rac_prepareForReuseSignal", RACDescription(self)]; + + objc_setAssociatedObject(self, _cmd, signal, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.h new file mode 100644 index 0000000..d8ffef3 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.h @@ -0,0 +1,32 @@ +// +// UITextField+RACSignalSupport.h +// ReactiveObjC +// +// Created by Josh Abernathy on 4/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import + +@class RACChannelTerminal; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UITextField (RACSignalSupport) + +/// Creates and returns a signal for the text of the field. It always starts with +/// the current text. The signal sends next when the UIControlEventAllEditingEvents +/// control event is fired on the control. +- (RACSignal *)rac_textSignal; + +/// Creates a new RACChannel-based binding to the receiver. +/// +/// Returns a RACChannelTerminal that sends the receiver's text whenever the +/// UIControlEventAllEditingEvents control event is fired, and sets the text +/// to the values it receives. +- (RACChannelTerminal *)rac_newTextChannel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.m new file mode 100644 index 0000000..771ab5a --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITextField+RACSignalSupport.m @@ -0,0 +1,39 @@ +// +// UITextField+RACSignalSupport.m +// ReactiveObjC +// +// Created by Josh Abernathy on 4/17/12. +// Copyright (c) 2012 GitHub, Inc. All rights reserved. +// + +#import "UITextField+RACSignalSupport.h" +#import +#import +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "RACSignal+Operations.h" +#import "UIControl+RACSignalSupport.h" +#import "UIControl+RACSignalSupportPrivate.h" + +@implementation UITextField (RACSignalSupport) + +- (RACSignal *)rac_textSignal { + @weakify(self); + return [[[[[RACSignal + defer:^{ + @strongify(self); + return [RACSignal return:self]; + }] + concat:[self rac_signalForControlEvents:UIControlEventAllEditingEvents]] + map:^(UITextField *x) { + return x.text; + }] + takeUntil:self.rac_willDeallocSignal] + setNameWithFormat:@"%@ -rac_textSignal", RACDescription(self)]; +} + +- (RACChannelTerminal *)rac_newTextChannel { + return [self rac_channelForControlEvents:UIControlEventAllEditingEvents key:@keypath(self.text) nilValue:@""]; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.h b/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.h new file mode 100644 index 0000000..cf2d8ac --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.h @@ -0,0 +1,37 @@ +// +// UITextView+RACSignalSupport.h +// ReactiveObjC +// +// Created by Cody Krieger on 5/18/12. +// Copyright (c) 2012 Cody Krieger. All rights reserved. +// + +#import + +@class RACDelegateProxy; +@class RACSignal<__covariant ValueType>; + +NS_ASSUME_NONNULL_BEGIN + +@interface UITextView (RACSignalSupport) + +/// A delegate proxy which will be set as the receiver's delegate when any of the +/// methods in this category are used. +@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; + +/// Creates a signal for the text of the receiver. +/// +/// When this method is invoked, the `rac_delegateProxy` will become the +/// receiver's delegate. Any previous delegate will become the -[RACDelegateProxy +/// rac_proxiedDelegate], so that it receives any messages that the proxy doesn't +/// know how to handle. Setting the receiver's `delegate` afterward is +/// considered undefined behavior. +/// +/// Returns a signal which will send the current text upon subscription, then +/// again whenever the receiver's text is changed. The signal will complete when +/// the receiver is deallocated. +- (RACSignal *)rac_textSignal; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.m b/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.m new file mode 100644 index 0000000..05deb01 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/UITextView+RACSignalSupport.m @@ -0,0 +1,56 @@ +// +// UITextView+RACSignalSupport.m +// ReactiveObjC +// +// Created by Cody Krieger on 5/18/12. +// Copyright (c) 2012 Cody Krieger. All rights reserved. +// + +#import "UITextView+RACSignalSupport.h" +#import +#import "NSObject+RACDeallocating.h" +#import "NSObject+RACDescription.h" +#import "RACDelegateProxy.h" +#import "RACSignal+Operations.h" +#import "RACTuple.h" +#import + +@implementation UITextView (RACSignalSupport) + +static void RACUseDelegateProxy(UITextView *self) { + if (self.delegate == self.rac_delegateProxy) return; + + self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; + self.delegate = (id)self.rac_delegateProxy; +} + +- (RACDelegateProxy *)rac_delegateProxy { + RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); + if (proxy == nil) { + proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UITextViewDelegate)]; + objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + } + + return proxy; +} + +- (RACSignal *)rac_textSignal { + @weakify(self); + RACSignal *signal = [[[[[RACSignal + defer:^{ + @strongify(self); + return [RACSignal return:RACTuplePack(self)]; + }] + concat:[self.rac_delegateProxy signalForSelector:@selector(textViewDidChange:)]] + reduceEach:^(UITextView *x) { + return x.text; + }] + takeUntil:self.rac_willDeallocSignal] + setNameWithFormat:@"%@ -rac_textSignal", RACDescription(self)]; + + RACUseDelegateProxy(self); + + return signal; +} + +@end diff --git a/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTKeyPathCoding.h b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTKeyPathCoding.h new file mode 100644 index 0000000..0106319 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTKeyPathCoding.h @@ -0,0 +1,68 @@ +// +// EXTKeyPathCoding.h +// extobjc +// +// Created by Justin Spahr-Summers on 19.06.12. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import +#import "RACmetamacros.h" + +/** + * \@keypath allows compile-time verification of key paths. Given a real object + * receiver and key path: + * + * @code + +NSString *UTF8StringPath = @keypath(str.lowercaseString.UTF8String); +// => @"lowercaseString.UTF8String" + +NSString *versionPath = @keypath(NSObject, version); +// => @"version" + +NSString *lowercaseStringPath = @keypath(NSString.new, lowercaseString); +// => @"lowercaseString" + + * @endcode + * + * ... the macro returns an \c NSString containing all but the first path + * component or argument (e.g., @"lowercaseString.UTF8String", @"version"). + * + * In addition to simply creating a key path, this macro ensures that the key + * path is valid at compile-time (causing a syntax error if not), and supports + * refactoring, such that changing the name of the property will also update any + * uses of \@keypath. + */ +#define keypath(...) \ + metamacro_if_eq(1, metamacro_argcount(__VA_ARGS__))(keypath1(__VA_ARGS__))(keypath2(__VA_ARGS__)) + +#define keypath1(PATH) \ + (((void)(NO && ((void)PATH, NO)), strchr(# PATH, '.') + 1)) + +#define keypath2(OBJ, PATH) \ + (((void)(NO && ((void)OBJ.PATH, NO)), # PATH)) + +/** + * \@collectionKeypath allows compile-time verification of key paths across collections NSArray/NSSet etc. Given a real object + * receiver, collection object receiver and related keypaths: + * + * @code + + NSString *employessFirstNamePath = @collectionKeypath(department.employees, Employee.new, firstName) + // => @"employees.firstName" + + NSString *employessFirstNamePath = @collectionKeypath(Department.new, employees, Employee.new, firstName) + // => @"employees.firstName" + + * @endcode + * + */ +#define collectionKeypath(...) \ + metamacro_if_eq(3, metamacro_argcount(__VA_ARGS__))(collectionKeypath3(__VA_ARGS__))(collectionKeypath4(__VA_ARGS__)) + +#define collectionKeypath3(PATH, COLLECTION_OBJECT, COLLECTION_PATH) ([[NSString stringWithFormat:@"%s.%s",keypath(PATH), keypath(COLLECTION_OBJECT, COLLECTION_PATH)] UTF8String]) + +#define collectionKeypath4(OBJ, PATH, COLLECTION_OBJECT, COLLECTION_PATH) ([[NSString stringWithFormat:@"%s.%s",keypath(OBJ, PATH), keypath(COLLECTION_OBJECT, COLLECTION_PATH)] UTF8String]) + diff --git a/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.h b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.h new file mode 100644 index 0000000..ab4e11d --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.h @@ -0,0 +1,122 @@ +// +// EXTRuntimeExtensions.h +// extobjc +// +// Created by Justin Spahr-Summers on 2011-03-05. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import + +/** + * Describes the memory management policy of a property. + */ +typedef enum { + /** + * The value is assigned. + */ + rac_propertyMemoryManagementPolicyAssign = 0, + + /** + * The value is retained. + */ + rac_propertyMemoryManagementPolicyRetain, + + /** + * The value is copied. + */ + rac_propertyMemoryManagementPolicyCopy +} rac_propertyMemoryManagementPolicy; + +/** + * Describes the attributes and type information of a property. + */ +typedef struct { + /** + * Whether this property was declared with the \c readonly attribute. + */ + BOOL readonly; + + /** + * Whether this property was declared with the \c nonatomic attribute. + */ + BOOL nonatomic; + + /** + * Whether the property is a weak reference. + */ + BOOL weak; + + /** + * Whether the property is eligible for garbage collection. + */ + BOOL canBeCollected; + + /** + * Whether this property is defined with \c \@dynamic. + */ + BOOL dynamic; + + /** + * The memory management policy for this property. This will always be + * #rac_propertyMemoryManagementPolicyAssign if #readonly is \c YES. + */ + rac_propertyMemoryManagementPolicy memoryManagementPolicy; + + /** + * The selector for the getter of this property. This will reflect any + * custom \c getter= attribute provided in the property declaration, or the + * inferred getter name otherwise. + */ + SEL getter; + + /** + * The selector for the setter of this property. This will reflect any + * custom \c setter= attribute provided in the property declaration, or the + * inferred setter name otherwise. + * + * @note If #readonly is \c YES, this value will represent what the setter + * \e would be, if the property were writable. + */ + SEL setter; + + /** + * The backing instance variable for this property, or \c NULL if \c + * \c @synthesize was not used, and therefore no instance variable exists. This + * would also be the case if the property is implemented dynamically. + */ + const char *ivar; + + /** + * If this property is defined as being an instance of a specific class, + * this will be the class object representing it. + * + * This will be \c nil if the property was defined as type \c id, if the + * property is not of an object type, or if the class could not be found at + * runtime. + */ + Class objectClass; + + /** + * The type encoding for the value of this property. This is the type as it + * would be returned by the \c \@encode() directive. + */ + char type[]; +} rac_propertyAttributes; + +/** + * Finds the instance method named \a aSelector on \a aClass and returns it, or + * returns \c NULL if no such instance method exists. Unlike \c + * class_getInstanceMethod(), this does not search superclasses. + * + * @note To get class methods in this manner, use a metaclass for \a aClass. + */ +Method rac_getImmediateInstanceMethod (Class aClass, SEL aSelector); + +/** + * Returns a pointer to a structure containing information about \a property. + * You must \c free() the returned pointer. Returns \c NULL if there is an error + * obtaining information from \a property. + */ +rac_propertyAttributes *rac_copyPropertyAttributes (objc_property_t property); diff --git a/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.m b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.m new file mode 100644 index 0000000..b53d2f7 --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTRuntimeExtensions.m @@ -0,0 +1,234 @@ +// +// EXTRuntimeExtensions.m +// extobjc +// +// Created by Justin Spahr-Summers on 2011-03-05. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import + +#import +#import +#import +#import +#import +#import +#import +#import + +rac_propertyAttributes *rac_copyPropertyAttributes (objc_property_t property) { + const char * const attrString = property_getAttributes(property); + if (!attrString) { + fprintf(stderr, "ERROR: Could not get attribute string from property %s\n", property_getName(property)); + return NULL; + } + + if (attrString[0] != 'T') { + fprintf(stderr, "ERROR: Expected attribute string \"%s\" for property %s to start with 'T'\n", attrString, property_getName(property)); + return NULL; + } + + const char *typeString = attrString + 1; + const char *next = NSGetSizeAndAlignment(typeString, NULL, NULL); + if (!next) { + fprintf(stderr, "ERROR: Could not read past type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + size_t typeLength = (size_t)(next - typeString); + if (!typeLength) { + fprintf(stderr, "ERROR: Invalid type in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + // allocate enough space for the structure and the type string (plus a NUL) + rac_propertyAttributes *attributes = calloc(1, sizeof(rac_propertyAttributes) + typeLength + 1); + if (!attributes) { + fprintf(stderr, "ERROR: Could not allocate rac_propertyAttributes structure for attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + // copy the type string + strncpy(attributes->type, typeString, typeLength); + attributes->type[typeLength] = '\0'; + + // if this is an object type, and immediately followed by a quoted string... + if (typeString[0] == *(@encode(id)) && typeString[1] == '"') { + // we should be able to extract a class name + const char *className = typeString + 2; + next = strchr(className, '"'); + + if (!next) { + fprintf(stderr, "ERROR: Could not read class name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + return NULL; + } + + if (className != next) { + size_t classNameLength = (size_t)(next - className); + char trimmedName[classNameLength + 1]; + + strncpy(trimmedName, className, classNameLength); + trimmedName[classNameLength] = '\0'; + + // attempt to look up the class in the runtime + attributes->objectClass = objc_getClass(trimmedName); + } + } + + if (*next != '\0') { + // skip past any junk before the first flag + next = strchr(next, ','); + } + + while (next && *next == ',') { + char flag = next[1]; + next += 2; + + switch (flag) { + case '\0': + break; + + case 'R': + attributes->readonly = YES; + break; + + case 'C': + attributes->memoryManagementPolicy = rac_propertyMemoryManagementPolicyCopy; + break; + + case '&': + attributes->memoryManagementPolicy = rac_propertyMemoryManagementPolicyRetain; + break; + + case 'N': + attributes->nonatomic = YES; + break; + + case 'G': + case 'S': + { + const char *nextFlag = strchr(next, ','); + SEL name = NULL; + + if (!nextFlag) { + // assume that the rest of the string is the selector + const char *selectorString = next; + next = ""; + + name = sel_registerName(selectorString); + } else { + size_t selectorLength = (size_t)(nextFlag - next); + if (!selectorLength) { + fprintf(stderr, "ERROR: Found zero length selector name in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + goto errorOut; + } + + char selectorString[selectorLength + 1]; + + strncpy(selectorString, next, selectorLength); + selectorString[selectorLength] = '\0'; + + name = sel_registerName(selectorString); + next = nextFlag; + } + + if (flag == 'G') + attributes->getter = name; + else + attributes->setter = name; + } + + break; + + case 'D': + attributes->dynamic = YES; + attributes->ivar = NULL; + break; + + case 'V': + // assume that the rest of the string (if present) is the ivar name + if (*next == '\0') { + // if there's nothing there, let's assume this is dynamic + attributes->ivar = NULL; + } else { + attributes->ivar = next; + next = ""; + } + + break; + + case 'W': + attributes->weak = YES; + break; + + case 'P': + attributes->canBeCollected = YES; + break; + + case 't': + fprintf(stderr, "ERROR: Old-style type encoding is unsupported in attribute string \"%s\" for property %s\n", attrString, property_getName(property)); + + // skip over this type encoding + while (*next != ',' && *next != '\0') + ++next; + + break; + + default: + fprintf(stderr, "ERROR: Unrecognized attribute string flag '%c' in attribute string \"%s\" for property %s\n", flag, attrString, property_getName(property)); + } + } + + if (next && *next != '\0') { + fprintf(stderr, "Warning: Unparsed data \"%s\" in attribute string \"%s\" for property %s\n", next, attrString, property_getName(property)); + } + + if (!attributes->getter) { + // use the property name as the getter by default + attributes->getter = sel_registerName(property_getName(property)); + } + + if (!attributes->setter) { + const char *propertyName = property_getName(property); + size_t propertyNameLength = strlen(propertyName); + + // we want to transform the name to setProperty: style + size_t setterLength = propertyNameLength + 4; + + char setterName[setterLength + 1]; + strncpy(setterName, "set", 3); + strncpy(setterName + 3, propertyName, propertyNameLength); + + // capitalize property name for the setter + setterName[3] = (char)toupper(setterName[3]); + + setterName[setterLength - 1] = ':'; + setterName[setterLength] = '\0'; + + attributes->setter = sel_registerName(setterName); + } + + return attributes; + +errorOut: + free(attributes); + return NULL; +} + +Method rac_getImmediateInstanceMethod (Class aClass, SEL aSelector) { + unsigned methodCount = 0; + Method *methods = class_copyMethodList(aClass, &methodCount); + Method foundMethod = NULL; + + for (unsigned methodIndex = 0;methodIndex < methodCount;++methodIndex) { + if (method_getName(methods[methodIndex]) == aSelector) { + foundMethod = methods[methodIndex]; + break; + } + } + + free(methods); + return foundMethod; +} diff --git a/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTScope.h b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTScope.h new file mode 100644 index 0000000..c8c299f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACEXTScope.h @@ -0,0 +1,118 @@ +// +// EXTScope.h +// extobjc +// +// Created by Justin Spahr-Summers on 2011-05-04. +// Copyright (C) 2012 Justin Spahr-Summers. +// Released under the MIT license. +// + +#import "RACmetamacros.h" + +/** + * \@onExit defines some code to be executed when the current scope exits. The + * code must be enclosed in braces and terminated with a semicolon, and will be + * executed regardless of how the scope is exited, including from exceptions, + * \c goto, \c return, \c break, and \c continue. + * + * Provided code will go into a block to be executed later. Keep this in mind as + * it pertains to memory management, restrictions on assignment, etc. Because + * the code is used within a block, \c return is a legal (though perhaps + * confusing) way to exit the cleanup block early. + * + * Multiple \@onExit statements in the same scope are executed in reverse + * lexical order. This helps when pairing resource acquisition with \@onExit + * statements, as it guarantees teardown in the opposite order of acquisition. + * + * @note This statement cannot be used within scopes defined without braces + * (like a one line \c if). In practice, this is not an issue, since \@onExit is + * a useless construct in such a case anyways. + */ +#define onExit \ + rac_keywordify \ + __strong rac_cleanupBlock_t metamacro_concat(rac_exitBlock_, __LINE__) __attribute__((cleanup(rac_executeCleanupBlock), unused)) = ^ + +/** + * Creates \c __weak shadow variables for each of the variables provided as + * arguments, which can later be made strong again with #strongify. + * + * This is typically used to weakly reference variables in a block, but then + * ensure that the variables stay alive during the actual execution of the block + * (if they were live upon entry). + * + * See #strongify for an example of usage. + */ +#define weakify(...) \ + rac_keywordify \ + metamacro_foreach_cxt(rac_weakify_,, __weak, __VA_ARGS__) + +/** + * Like #weakify, but uses \c __unsafe_unretained instead, for targets or + * classes that do not support weak references. + */ +#define unsafeify(...) \ + rac_keywordify \ + metamacro_foreach_cxt(rac_weakify_,, __unsafe_unretained, __VA_ARGS__) + +/** + * Strongly references each of the variables provided as arguments, which must + * have previously been passed to #weakify. + * + * The strong references created will shadow the original variable names, such + * that the original names can be used without issue (and a significantly + * reduced risk of retain cycles) in the current scope. + * + * @code + + id foo = [[NSObject alloc] init]; + id bar = [[NSObject alloc] init]; + + @weakify(foo, bar); + + // this block will not keep 'foo' or 'bar' alive + BOOL (^matchesFooOrBar)(id) = ^ BOOL (id obj){ + // but now, upon entry, 'foo' and 'bar' will stay alive until the block has + // finished executing + @strongify(foo, bar); + + return [foo isEqual:obj] || [bar isEqual:obj]; + }; + + * @endcode + */ +#define strongify(...) \ + rac_keywordify \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wshadow\"") \ + metamacro_foreach(rac_strongify_,, __VA_ARGS__) \ + _Pragma("clang diagnostic pop") + +/*** implementation details follow ***/ +typedef void (^rac_cleanupBlock_t)(); + +static inline void rac_executeCleanupBlock (__strong rac_cleanupBlock_t *block) { + (*block)(); +} + +#define rac_weakify_(INDEX, CONTEXT, VAR) \ + CONTEXT __typeof__(VAR) metamacro_concat(VAR, _weak_) = (VAR); + +#define rac_strongify_(INDEX, VAR) \ + __strong __typeof__(VAR) VAR = metamacro_concat(VAR, _weak_); + +// Details about the choice of backing keyword: +// +// The use of @try/@catch/@finally can cause the compiler to suppress +// return-type warnings. +// The use of @autoreleasepool {} is not optimized away by the compiler, +// resulting in superfluous creation of autorelease pools. +// +// Since neither option is perfect, and with no other alternatives, the +// compromise is to use @autorelease in DEBUG builds to maintain compiler +// analysis, and to use @try/@catch otherwise to avoid insertion of unnecessary +// autorelease pools. +#if DEBUG +#define rac_keywordify autoreleasepool {} +#else +#define rac_keywordify try {} @catch (...) {} +#endif diff --git a/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACmetamacros.h b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACmetamacros.h new file mode 100644 index 0000000..1a0af4f --- /dev/null +++ b/Pods/ReactiveObjC/ReactiveObjC/extobjc/RACmetamacros.h @@ -0,0 +1,661 @@ +/** + * Macros for metaprogramming + * ExtendedC + * + * Copyright (C) 2012 Justin Spahr-Summers + * Released under the MIT license + */ + +/** + * Executes one or more expressions (which may have a void type, such as a call + * to a function that returns no value) and always returns true. + */ +#define metamacro_exprify(...) \ + ((__VA_ARGS__), true) + +/** + * Returns a string representation of VALUE after full macro expansion. + */ +#define metamacro_stringify(VALUE) \ + metamacro_stringify_(VALUE) + +/** + * Returns A and B concatenated after full macro expansion. + */ +#define metamacro_concat(A, B) \ + metamacro_concat_(A, B) + +/** + * Returns the Nth variadic argument (starting from zero). At least + * N + 1 variadic arguments must be given. N must be between zero and twenty, + * inclusive. + */ +#define metamacro_at(N, ...) \ + metamacro_concat(metamacro_at, N)(__VA_ARGS__) + +/** + * Returns the number of arguments (up to twenty) provided to the macro. At + * least one argument must be provided. + * + * Inspired by P99: http://p99.gforge.inria.fr + */ +#define metamacro_argcount(...) \ + metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1) + +/** + * Identical to #metamacro_foreach_cxt, except that no CONTEXT argument is + * given. Only the index and current argument will thus be passed to MACRO. + */ +#define metamacro_foreach(MACRO, SEP, ...) \ + metamacro_foreach_cxt(metamacro_foreach_iter, SEP, MACRO, __VA_ARGS__) + +/** + * For each consecutive variadic argument (up to twenty), MACRO is passed the + * zero-based index of the current argument, CONTEXT, and then the argument + * itself. The results of adjoining invocations of MACRO are then separated by + * SEP. + * + * Inspired by P99: http://p99.gforge.inria.fr + */ +#define metamacro_foreach_cxt(MACRO, SEP, CONTEXT, ...) \ + metamacro_concat(metamacro_foreach_cxt, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) + +/** + * Identical to #metamacro_foreach_cxt. This can be used when the former would + * fail due to recursive macro expansion. + */ +#define metamacro_foreach_cxt_recursive(MACRO, SEP, CONTEXT, ...) \ + metamacro_concat(metamacro_foreach_cxt_recursive, metamacro_argcount(__VA_ARGS__))(MACRO, SEP, CONTEXT, __VA_ARGS__) + +/** + * In consecutive order, appends each variadic argument (up to twenty) onto + * BASE. The resulting concatenations are then separated by SEP. + * + * This is primarily useful to manipulate a list of macro invocations into instead + * invoking a different, possibly related macro. + */ +#define metamacro_foreach_concat(BASE, SEP, ...) \ + metamacro_foreach_cxt(metamacro_foreach_concat_iter, SEP, BASE, __VA_ARGS__) + +/** + * Iterates COUNT times, each time invoking MACRO with the current index + * (starting at zero) and CONTEXT. The results of adjoining invocations of MACRO + * are then separated by SEP. + * + * COUNT must be an integer between zero and twenty, inclusive. + */ +#define metamacro_for_cxt(COUNT, MACRO, SEP, CONTEXT) \ + metamacro_concat(metamacro_for_cxt, COUNT)(MACRO, SEP, CONTEXT) + +/** + * Returns the first argument given. At least one argument must be provided. + * + * This is useful when implementing a variadic macro, where you may have only + * one variadic argument, but no way to retrieve it (for example, because \c ... + * always needs to match at least one argument). + * + * @code + +#define varmacro(...) \ + metamacro_head(__VA_ARGS__) + + * @endcode + */ +#define metamacro_head(...) \ + metamacro_head_(__VA_ARGS__, 0) + +/** + * Returns every argument except the first. At least two arguments must be + * provided. + */ +#define metamacro_tail(...) \ + metamacro_tail_(__VA_ARGS__) + +/** + * Returns the first N (up to twenty) variadic arguments as a new argument list. + * At least N variadic arguments must be provided. + */ +#define metamacro_take(N, ...) \ + metamacro_concat(metamacro_take, N)(__VA_ARGS__) + +/** + * Removes the first N (up to twenty) variadic arguments from the given argument + * list. At least N variadic arguments must be provided. + */ +#define metamacro_drop(N, ...) \ + metamacro_concat(metamacro_drop, N)(__VA_ARGS__) + +/** + * Decrements VAL, which must be a number between zero and twenty, inclusive. + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_dec(VAL) \ + metamacro_at(VAL, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19) + +/** + * Increments VAL, which must be a number between zero and twenty, inclusive. + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_inc(VAL) \ + metamacro_at(VAL, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21) + +/** + * If A is equal to B, the next argument list is expanded; otherwise, the + * argument list after that is expanded. A and B must be numbers between zero + * and twenty, inclusive. Additionally, B must be greater than or equal to A. + * + * @code + +// expands to true +metamacro_if_eq(0, 0)(true)(false) + +// expands to false +metamacro_if_eq(0, 1)(true)(false) + + * @endcode + * + * This is primarily useful when dealing with indexes and counts in + * metaprogramming. + */ +#define metamacro_if_eq(A, B) \ + metamacro_concat(metamacro_if_eq, A)(B) + +/** + * Identical to #metamacro_if_eq. This can be used when the former would fail + * due to recursive macro expansion. + */ +#define metamacro_if_eq_recursive(A, B) \ + metamacro_concat(metamacro_if_eq_recursive, A)(B) + +/** + * Returns 1 if N is an even number, or 0 otherwise. N must be between zero and + * twenty, inclusive. + * + * For the purposes of this test, zero is considered even. + */ +#define metamacro_is_even(N) \ + metamacro_at(N, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1) + +/** + * Returns the logical NOT of B, which must be the number zero or one. + */ +#define metamacro_not(B) \ + metamacro_at(B, 1, 0) + +// IMPLEMENTATION DETAILS FOLLOW! +// Do not write code that depends on anything below this line. +#define metamacro_stringify_(VALUE) # VALUE +#define metamacro_concat_(A, B) A ## B +#define metamacro_foreach_iter(INDEX, MACRO, ARG) MACRO(INDEX, ARG) +#define metamacro_head_(FIRST, ...) FIRST +#define metamacro_tail_(FIRST, ...) __VA_ARGS__ +#define metamacro_consume_(...) +#define metamacro_expand_(...) __VA_ARGS__ + +// implemented from scratch so that metamacro_concat() doesn't end up nesting +#define metamacro_foreach_concat_iter(INDEX, BASE, ARG) metamacro_foreach_concat_iter_(BASE, ARG) +#define metamacro_foreach_concat_iter_(BASE, ARG) BASE ## ARG + +// metamacro_at expansions +#define metamacro_at0(...) metamacro_head(__VA_ARGS__) +#define metamacro_at1(_0, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at2(_0, _1, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at3(_0, _1, _2, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at4(_0, _1, _2, _3, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at5(_0, _1, _2, _3, _4, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at6(_0, _1, _2, _3, _4, _5, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at7(_0, _1, _2, _3, _4, _5, _6, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at8(_0, _1, _2, _3, _4, _5, _6, _7, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at9(_0, _1, _2, _3, _4, _5, _6, _7, _8, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at10(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at11(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at12(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at13(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at14(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at15(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at17(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at18(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at19(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, ...) metamacro_head(__VA_ARGS__) +#define metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(__VA_ARGS__) + +// metamacro_foreach_cxt expansions +#define metamacro_foreach_cxt0(MACRO, SEP, CONTEXT) +#define metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) + +#define metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ + metamacro_foreach_cxt1(MACRO, SEP, CONTEXT, _0) \ + SEP \ + MACRO(1, CONTEXT, _1) + +#define metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + metamacro_foreach_cxt2(MACRO, SEP, CONTEXT, _0, _1) \ + SEP \ + MACRO(2, CONTEXT, _2) + +#define metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + metamacro_foreach_cxt3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + SEP \ + MACRO(3, CONTEXT, _3) + +#define metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + metamacro_foreach_cxt4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + SEP \ + MACRO(4, CONTEXT, _4) + +#define metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + metamacro_foreach_cxt5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + SEP \ + MACRO(5, CONTEXT, _5) + +#define metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + metamacro_foreach_cxt6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + SEP \ + MACRO(6, CONTEXT, _6) + +#define metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + metamacro_foreach_cxt7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + SEP \ + MACRO(7, CONTEXT, _7) + +#define metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + metamacro_foreach_cxt8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + SEP \ + MACRO(8, CONTEXT, _8) + +#define metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + metamacro_foreach_cxt9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + SEP \ + MACRO(9, CONTEXT, _9) + +#define metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + metamacro_foreach_cxt10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + SEP \ + MACRO(10, CONTEXT, _10) + +#define metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + metamacro_foreach_cxt11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + SEP \ + MACRO(11, CONTEXT, _11) + +#define metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + metamacro_foreach_cxt12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + SEP \ + MACRO(12, CONTEXT, _12) + +#define metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + metamacro_foreach_cxt13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + SEP \ + MACRO(13, CONTEXT, _13) + +#define metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + metamacro_foreach_cxt14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + SEP \ + MACRO(14, CONTEXT, _14) + +#define metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + metamacro_foreach_cxt15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + SEP \ + MACRO(15, CONTEXT, _15) + +#define metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + metamacro_foreach_cxt16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + SEP \ + MACRO(16, CONTEXT, _16) + +#define metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + metamacro_foreach_cxt17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + SEP \ + MACRO(17, CONTEXT, _17) + +#define metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + metamacro_foreach_cxt18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + SEP \ + MACRO(18, CONTEXT, _18) + +#define metamacro_foreach_cxt20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ + metamacro_foreach_cxt19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + SEP \ + MACRO(19, CONTEXT, _19) + +// metamacro_foreach_cxt_recursive expansions +#define metamacro_foreach_cxt_recursive0(MACRO, SEP, CONTEXT) +#define metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) MACRO(0, CONTEXT, _0) + +#define metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ + metamacro_foreach_cxt_recursive1(MACRO, SEP, CONTEXT, _0) \ + SEP \ + MACRO(1, CONTEXT, _1) + +#define metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + metamacro_foreach_cxt_recursive2(MACRO, SEP, CONTEXT, _0, _1) \ + SEP \ + MACRO(2, CONTEXT, _2) + +#define metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + metamacro_foreach_cxt_recursive3(MACRO, SEP, CONTEXT, _0, _1, _2) \ + SEP \ + MACRO(3, CONTEXT, _3) + +#define metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + metamacro_foreach_cxt_recursive4(MACRO, SEP, CONTEXT, _0, _1, _2, _3) \ + SEP \ + MACRO(4, CONTEXT, _4) + +#define metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + metamacro_foreach_cxt_recursive5(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4) \ + SEP \ + MACRO(5, CONTEXT, _5) + +#define metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + metamacro_foreach_cxt_recursive6(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5) \ + SEP \ + MACRO(6, CONTEXT, _6) + +#define metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + metamacro_foreach_cxt_recursive7(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6) \ + SEP \ + MACRO(7, CONTEXT, _7) + +#define metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + metamacro_foreach_cxt_recursive8(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7) \ + SEP \ + MACRO(8, CONTEXT, _8) + +#define metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + metamacro_foreach_cxt_recursive9(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8) \ + SEP \ + MACRO(9, CONTEXT, _9) + +#define metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + metamacro_foreach_cxt_recursive10(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9) \ + SEP \ + MACRO(10, CONTEXT, _10) + +#define metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + metamacro_foreach_cxt_recursive11(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) \ + SEP \ + MACRO(11, CONTEXT, _11) + +#define metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + metamacro_foreach_cxt_recursive12(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11) \ + SEP \ + MACRO(12, CONTEXT, _12) + +#define metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + metamacro_foreach_cxt_recursive13(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12) \ + SEP \ + MACRO(13, CONTEXT, _13) + +#define metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + metamacro_foreach_cxt_recursive14(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13) \ + SEP \ + MACRO(14, CONTEXT, _14) + +#define metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + metamacro_foreach_cxt_recursive15(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14) \ + SEP \ + MACRO(15, CONTEXT, _15) + +#define metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + metamacro_foreach_cxt_recursive16(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15) \ + SEP \ + MACRO(16, CONTEXT, _16) + +#define metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + metamacro_foreach_cxt_recursive17(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16) \ + SEP \ + MACRO(17, CONTEXT, _17) + +#define metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + metamacro_foreach_cxt_recursive18(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17) \ + SEP \ + MACRO(18, CONTEXT, _18) + +#define metamacro_foreach_cxt_recursive20(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19) \ + metamacro_foreach_cxt_recursive19(MACRO, SEP, CONTEXT, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18) \ + SEP \ + MACRO(19, CONTEXT, _19) + +// metamacro_for_cxt expansions +#define metamacro_for_cxt0(MACRO, SEP, CONTEXT) +#define metamacro_for_cxt1(MACRO, SEP, CONTEXT) MACRO(0, CONTEXT) + +#define metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt1(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(1, CONTEXT) + +#define metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt2(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(2, CONTEXT) + +#define metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt3(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(3, CONTEXT) + +#define metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt4(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(4, CONTEXT) + +#define metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt5(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(5, CONTEXT) + +#define metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt6(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(6, CONTEXT) + +#define metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt7(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(7, CONTEXT) + +#define metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt8(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(8, CONTEXT) + +#define metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt9(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(9, CONTEXT) + +#define metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt10(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(10, CONTEXT) + +#define metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt11(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(11, CONTEXT) + +#define metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt12(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(12, CONTEXT) + +#define metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt13(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(13, CONTEXT) + +#define metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt14(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(14, CONTEXT) + +#define metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt15(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(15, CONTEXT) + +#define metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt16(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(16, CONTEXT) + +#define metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt17(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(17, CONTEXT) + +#define metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt18(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(18, CONTEXT) + +#define metamacro_for_cxt20(MACRO, SEP, CONTEXT) \ + metamacro_for_cxt19(MACRO, SEP, CONTEXT) \ + SEP \ + MACRO(19, CONTEXT) + +// metamacro_if_eq expansions +#define metamacro_if_eq0(VALUE) \ + metamacro_concat(metamacro_if_eq0_, VALUE) + +#define metamacro_if_eq0_0(...) __VA_ARGS__ metamacro_consume_ +#define metamacro_if_eq0_1(...) metamacro_expand_ +#define metamacro_if_eq0_2(...) metamacro_expand_ +#define metamacro_if_eq0_3(...) metamacro_expand_ +#define metamacro_if_eq0_4(...) metamacro_expand_ +#define metamacro_if_eq0_5(...) metamacro_expand_ +#define metamacro_if_eq0_6(...) metamacro_expand_ +#define metamacro_if_eq0_7(...) metamacro_expand_ +#define metamacro_if_eq0_8(...) metamacro_expand_ +#define metamacro_if_eq0_9(...) metamacro_expand_ +#define metamacro_if_eq0_10(...) metamacro_expand_ +#define metamacro_if_eq0_11(...) metamacro_expand_ +#define metamacro_if_eq0_12(...) metamacro_expand_ +#define metamacro_if_eq0_13(...) metamacro_expand_ +#define metamacro_if_eq0_14(...) metamacro_expand_ +#define metamacro_if_eq0_15(...) metamacro_expand_ +#define metamacro_if_eq0_16(...) metamacro_expand_ +#define metamacro_if_eq0_17(...) metamacro_expand_ +#define metamacro_if_eq0_18(...) metamacro_expand_ +#define metamacro_if_eq0_19(...) metamacro_expand_ +#define metamacro_if_eq0_20(...) metamacro_expand_ + +#define metamacro_if_eq1(VALUE) metamacro_if_eq0(metamacro_dec(VALUE)) +#define metamacro_if_eq2(VALUE) metamacro_if_eq1(metamacro_dec(VALUE)) +#define metamacro_if_eq3(VALUE) metamacro_if_eq2(metamacro_dec(VALUE)) +#define metamacro_if_eq4(VALUE) metamacro_if_eq3(metamacro_dec(VALUE)) +#define metamacro_if_eq5(VALUE) metamacro_if_eq4(metamacro_dec(VALUE)) +#define metamacro_if_eq6(VALUE) metamacro_if_eq5(metamacro_dec(VALUE)) +#define metamacro_if_eq7(VALUE) metamacro_if_eq6(metamacro_dec(VALUE)) +#define metamacro_if_eq8(VALUE) metamacro_if_eq7(metamacro_dec(VALUE)) +#define metamacro_if_eq9(VALUE) metamacro_if_eq8(metamacro_dec(VALUE)) +#define metamacro_if_eq10(VALUE) metamacro_if_eq9(metamacro_dec(VALUE)) +#define metamacro_if_eq11(VALUE) metamacro_if_eq10(metamacro_dec(VALUE)) +#define metamacro_if_eq12(VALUE) metamacro_if_eq11(metamacro_dec(VALUE)) +#define metamacro_if_eq13(VALUE) metamacro_if_eq12(metamacro_dec(VALUE)) +#define metamacro_if_eq14(VALUE) metamacro_if_eq13(metamacro_dec(VALUE)) +#define metamacro_if_eq15(VALUE) metamacro_if_eq14(metamacro_dec(VALUE)) +#define metamacro_if_eq16(VALUE) metamacro_if_eq15(metamacro_dec(VALUE)) +#define metamacro_if_eq17(VALUE) metamacro_if_eq16(metamacro_dec(VALUE)) +#define metamacro_if_eq18(VALUE) metamacro_if_eq17(metamacro_dec(VALUE)) +#define metamacro_if_eq19(VALUE) metamacro_if_eq18(metamacro_dec(VALUE)) +#define metamacro_if_eq20(VALUE) metamacro_if_eq19(metamacro_dec(VALUE)) + +// metamacro_if_eq_recursive expansions +#define metamacro_if_eq_recursive0(VALUE) \ + metamacro_concat(metamacro_if_eq_recursive0_, VALUE) + +#define metamacro_if_eq_recursive0_0(...) __VA_ARGS__ metamacro_consume_ +#define metamacro_if_eq_recursive0_1(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_2(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_3(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_4(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_5(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_6(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_7(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_8(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_9(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_10(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_11(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_12(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_13(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_14(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_15(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_16(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_17(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_18(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_19(...) metamacro_expand_ +#define metamacro_if_eq_recursive0_20(...) metamacro_expand_ + +#define metamacro_if_eq_recursive1(VALUE) metamacro_if_eq_recursive0(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive2(VALUE) metamacro_if_eq_recursive1(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive3(VALUE) metamacro_if_eq_recursive2(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive4(VALUE) metamacro_if_eq_recursive3(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive5(VALUE) metamacro_if_eq_recursive4(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive6(VALUE) metamacro_if_eq_recursive5(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive7(VALUE) metamacro_if_eq_recursive6(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive8(VALUE) metamacro_if_eq_recursive7(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive9(VALUE) metamacro_if_eq_recursive8(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive10(VALUE) metamacro_if_eq_recursive9(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive11(VALUE) metamacro_if_eq_recursive10(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive12(VALUE) metamacro_if_eq_recursive11(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive13(VALUE) metamacro_if_eq_recursive12(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive14(VALUE) metamacro_if_eq_recursive13(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive15(VALUE) metamacro_if_eq_recursive14(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive16(VALUE) metamacro_if_eq_recursive15(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive17(VALUE) metamacro_if_eq_recursive16(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive18(VALUE) metamacro_if_eq_recursive17(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive19(VALUE) metamacro_if_eq_recursive18(metamacro_dec(VALUE)) +#define metamacro_if_eq_recursive20(VALUE) metamacro_if_eq_recursive19(metamacro_dec(VALUE)) + +// metamacro_take expansions +#define metamacro_take0(...) +#define metamacro_take1(...) metamacro_head(__VA_ARGS__) +#define metamacro_take2(...) metamacro_head(__VA_ARGS__), metamacro_take1(metamacro_tail(__VA_ARGS__)) +#define metamacro_take3(...) metamacro_head(__VA_ARGS__), metamacro_take2(metamacro_tail(__VA_ARGS__)) +#define metamacro_take4(...) metamacro_head(__VA_ARGS__), metamacro_take3(metamacro_tail(__VA_ARGS__)) +#define metamacro_take5(...) metamacro_head(__VA_ARGS__), metamacro_take4(metamacro_tail(__VA_ARGS__)) +#define metamacro_take6(...) metamacro_head(__VA_ARGS__), metamacro_take5(metamacro_tail(__VA_ARGS__)) +#define metamacro_take7(...) metamacro_head(__VA_ARGS__), metamacro_take6(metamacro_tail(__VA_ARGS__)) +#define metamacro_take8(...) metamacro_head(__VA_ARGS__), metamacro_take7(metamacro_tail(__VA_ARGS__)) +#define metamacro_take9(...) metamacro_head(__VA_ARGS__), metamacro_take8(metamacro_tail(__VA_ARGS__)) +#define metamacro_take10(...) metamacro_head(__VA_ARGS__), metamacro_take9(metamacro_tail(__VA_ARGS__)) +#define metamacro_take11(...) metamacro_head(__VA_ARGS__), metamacro_take10(metamacro_tail(__VA_ARGS__)) +#define metamacro_take12(...) metamacro_head(__VA_ARGS__), metamacro_take11(metamacro_tail(__VA_ARGS__)) +#define metamacro_take13(...) metamacro_head(__VA_ARGS__), metamacro_take12(metamacro_tail(__VA_ARGS__)) +#define metamacro_take14(...) metamacro_head(__VA_ARGS__), metamacro_take13(metamacro_tail(__VA_ARGS__)) +#define metamacro_take15(...) metamacro_head(__VA_ARGS__), metamacro_take14(metamacro_tail(__VA_ARGS__)) +#define metamacro_take16(...) metamacro_head(__VA_ARGS__), metamacro_take15(metamacro_tail(__VA_ARGS__)) +#define metamacro_take17(...) metamacro_head(__VA_ARGS__), metamacro_take16(metamacro_tail(__VA_ARGS__)) +#define metamacro_take18(...) metamacro_head(__VA_ARGS__), metamacro_take17(metamacro_tail(__VA_ARGS__)) +#define metamacro_take19(...) metamacro_head(__VA_ARGS__), metamacro_take18(metamacro_tail(__VA_ARGS__)) +#define metamacro_take20(...) metamacro_head(__VA_ARGS__), metamacro_take19(metamacro_tail(__VA_ARGS__)) + +// metamacro_drop expansions +#define metamacro_drop0(...) __VA_ARGS__ +#define metamacro_drop1(...) metamacro_tail(__VA_ARGS__) +#define metamacro_drop2(...) metamacro_drop1(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop3(...) metamacro_drop2(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop4(...) metamacro_drop3(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop5(...) metamacro_drop4(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop6(...) metamacro_drop5(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop7(...) metamacro_drop6(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop8(...) metamacro_drop7(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop9(...) metamacro_drop8(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop10(...) metamacro_drop9(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop11(...) metamacro_drop10(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop12(...) metamacro_drop11(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop13(...) metamacro_drop12(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop14(...) metamacro_drop13(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop15(...) metamacro_drop14(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop16(...) metamacro_drop15(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop17(...) metamacro_drop16(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop18(...) metamacro_drop17(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop19(...) metamacro_drop18(metamacro_tail(__VA_ARGS__)) +#define metamacro_drop20(...) metamacro_drop19(metamacro_tail(__VA_ARGS__)) diff --git a/Pods/SDAutoLayout/README.md b/Pods/SDAutoLayout/README.md index d173788..d5100f3 100644 --- a/Pods/SDAutoLayout/README.md +++ b/Pods/SDAutoLayout/README.md @@ -17,6 +17,8 @@ SDAutoLayout使用者开发的部分app截图 http://www.jianshu.com/p/9bc04d3ef ## 更新记录: +2016.08.12 -- 实现在tableview插入新的cell数据时自动缓存管理 + 2016.06.30 -- 增加多参照view的leftSpaceToView和topSpaceToView约束,例:topSpaceToView(@[self.view3, self.view4], 30) 2016.06.24 -- 修复给button设置约束时在iOS8.x系统中出现的崩溃问题;发布2.1.2版本 diff --git a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h index add085e..6c5c5f1 100644 --- a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h +++ b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h @@ -10,8 +10,8 @@ /* SDAutoLayout - 版本:2.1.3 - 发布:2016.07.06 + 版本:2.1.7 + 发布:2016.08.12 */ diff --git a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h index 5b93c4b..84ff4ff 100644 --- a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h +++ b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h @@ -151,6 +151,8 @@ typedef void (^AutoCellHeightDataSettingBlock)(UITableViewCell *cell); - (void)insertNewDataAtTheBeginingOfSection:(NSInteger)section newDataCount:(NSInteger)count; +- (void)insertNewDataAtIndexPaths:(NSArray *)indexPaths; + - (NSNumber *)heightCacheForIndexPath:(NSIndexPath *)indexPath; - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath model:(id)model keyPath:(NSString *)keyPath; diff --git a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m index 2859308..63f800d 100644 --- a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m +++ b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m @@ -179,7 +179,63 @@ - (void)insertNewDataAtTheBeginingOfSection:(NSInteger)section newDataCount:(NSI } [_cacheDictionary addEntriesFromDictionary:tempHeightCacheDict]; [_subviewFrameCacheDict addEntriesFromDictionary:tempFrameCacheDict]; +} +- (void)insertNewDataAtIndexPaths:(NSArray *)indexPaths +{ + NSMutableDictionary *sectionsdict = [NSMutableDictionary new]; + for (NSIndexPath *indexPath in indexPaths) { + NSString *sectionkey = [@(indexPath.section) stringValue]; + if (![sectionsdict objectForKey:sectionkey]) { + [sectionsdict setValue:[NSMutableArray new] forKey:sectionkey]; + } + NSMutableArray *arr = sectionsdict[sectionkey]; + [arr addObject:indexPath]; + } + for (NSString *sectionkey in sectionsdict.allKeys) { + NSMutableArray *tempHeightCaches = [NSMutableArray new]; + NSMutableArray *tempFrameCaches = [NSMutableArray new]; + NSInteger section = [sectionkey integerValue]; + NSInteger rowCount = [self.modelTableview numberOfRowsInSection:section]; + if (rowCount <= 0) { + continue; + } else { + for (int i = 0; i < rowCount; i++) { + [tempHeightCaches addObject:[NSNull null]]; + [tempFrameCaches addObject:[NSNull null]]; + } + } + + for (NSString *key in _cacheDictionary.allKeys) { + NSArray *res = [key componentsSeparatedByString:@"-"]; + long originalSection = [res.firstObject integerValue]; + long row = [res.lastObject integerValue]; + if (originalSection == section) { + NSNumber *heightCache = _cacheDictionary[key]; + NSArray *frameCache = _subviewFrameCacheDict[key]; + [tempHeightCaches setObject:heightCache atIndexedSubscript:row]; + [tempFrameCaches setObject:frameCache atIndexedSubscript:row]; + [_cacheDictionary removeObjectForKey:key]; + [_subviewFrameCacheDict removeObjectForKey:key]; + } + } + NSMutableArray *objsToInsert = [NSMutableArray new]; + NSMutableIndexSet *indexSet = [NSMutableIndexSet new]; + NSArray *indexPaths = sectionsdict[sectionkey]; + [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath *obj, NSUInteger idx, BOOL *stop) { + [objsToInsert addObject:[NSNull null]]; + [indexSet addIndex:obj.row]; + }]; + [tempHeightCaches insertObjects:objsToInsert atIndexes:indexSet]; + [tempFrameCaches insertObjects:objsToInsert atIndexes:indexSet]; + [tempHeightCaches enumerateObjectsUsingBlock:^(NSNumber *heightCache, NSUInteger idx, BOOL *stop) { + if (![heightCache isKindOfClass:[NSNull class]]) { + NSString *key = [NSString stringWithFormat:@"%zd-%zd", section, idx]; + [_cacheDictionary setValue:heightCache forKey:key]; + [_subviewFrameCacheDict setValue:[tempFrameCaches objectAtIndex:idx] forKey:key]; + } + }]; + } } - (NSNumber *)heightCacheForIndexPath:(NSIndexPath *)indexPath @@ -309,7 +365,7 @@ + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - NSArray *selStringsArray = @[@"reloadData", @"reloadRowsAtIndexPaths:withRowAnimation:", @"deleteRowsAtIndexPaths:withRowAnimation:"]; + NSArray *selStringsArray = @[@"reloadData", @"reloadRowsAtIndexPaths:withRowAnimation:", @"deleteRowsAtIndexPaths:withRowAnimation:", @"insertRowsAtIndexPaths:withRowAnimation:"]; [selStringsArray enumerateObjectsUsingBlock:^(NSString *selString, NSUInteger idx, BOOL *stop) { NSString *mySelString = [@"sd_" stringByAppendingString:selString]; @@ -336,7 +392,7 @@ - (void)sd_reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITabl [self sd_reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation]; } -- (void)sd_deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation +- (void)sd_deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation { for (NSIndexPath *indexPath in indexPaths) { [self.cellAutoHeightManager deleteThenResetHeightCache:indexPath]; @@ -344,14 +400,16 @@ - (void)sd_deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAn [self sd_deleteRowsAtIndexPaths:indexPaths withRowAnimation:animation]; } + +- (void)sd_insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation +{ + [self.cellAutoHeightManager insertNewDataAtIndexPaths:indexPaths]; + [self sd_insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; +} + /* * 下一步即将实现的功能 - - (void)sd_insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation - { - [self sd_insertRowsAtIndexPaths:indexPaths withRowAnimation:animation]; - } - - (void)sd_moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath { [self sd_moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; @@ -361,10 +419,7 @@ - (void)sd_moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath model:(id)model keyPath:(NSString *)keyPath cellClass:(Class)cellClass contentViewWidth:(CGFloat)contentViewWidth { - if (!self.cellAutoHeightManager) { - self.cellAutoHeightManager = [[SDCellAutoHeightManager alloc] init]; - self.cellAutoHeightManager.modelTableview = self; - } + self.cellAutoHeightManager.modelTableview = self; self.cellAutoHeightManager.contentViewWidth = contentViewWidth; @@ -418,7 +473,17 @@ - (CGFloat)cellsTotalHeight - (SDCellAutoHeightManager *)cellAutoHeightManager { - return objc_getAssociatedObject(self, _cmd); + + SDCellAutoHeightManager *cellAutoHeightManager = objc_getAssociatedObject(self, _cmd); + + if (!cellAutoHeightManager) { + + cellAutoHeightManager = [[SDCellAutoHeightManager alloc] init]; + + [self setCellAutoHeightManager:cellAutoHeightManager]; + } + + return cellAutoHeightManager; } - (void)setCellAutoHeightManager:(SDCellAutoHeightManager *)cellAutoHeightManager @@ -452,10 +517,8 @@ @implementation NSObject (SDAnyObjectAutoCellHeight) - (CGFloat)cellHeightForIndexPath:(NSIndexPath *)indexPath cellContentViewWidth:(CGFloat)width tableView:(UITableView *)tableView { - if (!tableView.cellAutoHeightManager) { - tableView.cellAutoHeightManager = [[SDCellAutoHeightManager alloc] init]; - tableView.cellAutoHeightManager.modelTableview = tableView; - } + tableView.cellAutoHeightManager.modelTableview = tableView; + if (tableView.cellAutoHeightManager.contentViewWidth != width) { tableView.cellAutoHeightManager.contentViewWidth = width; } diff --git a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h index c6307f9..142b3e3 100755 --- a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h +++ b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h @@ -47,8 +47,8 @@ SDAutoLayout - 版本:2.1.3 - 发布:2016.07.06 + 版本:2.1.7 + 发布:2016.08.12 */ @@ -66,7 +66,7 @@ typedef SDAutoLayoutModel *(^Margin)(CGFloat value); typedef SDAutoLayoutModel *(^MarginEqualToView)(UIView *toView); typedef SDAutoLayoutModel *(^WidthHeight)(CGFloat value); typedef SDAutoLayoutModel *(^WidthHeightEqualToView)(UIView *toView, CGFloat ratioValue); -typedef SDAutoLayoutModel *(^AutoHeight)(CGFloat ratioValue); +typedef SDAutoLayoutModel *(^AutoHeightWidth)(CGFloat ratioValue); typedef SDAutoLayoutModel *(^SameWidthHeight)(); typedef SDAutoLayoutModel *(^Offset)(CGFloat value); typedef void (^SpaceToSuperView)(UIEdgeInsets insets); @@ -156,7 +156,10 @@ typedef void (^SpaceToSuperView)(UIEdgeInsets insets); /** 设置一个view的高度和它的宽度相同,参数为空“()” */ @property (nonatomic, copy, readonly) SameWidthHeight heightEqualToWidth; /** 自适应高度,传入高宽比值,label可以传0实现文字高度自适应 */ -@property (nonatomic, copy, readonly) AutoHeight autoHeightRatio; +@property (nonatomic, copy, readonly) AutoHeightWidth autoHeightRatio; + +/** 自适应宽度,参数为宽高比值 */ +@property (nonatomic, copy, readonly) AutoHeightWidth autoWidthRatio; @@ -288,7 +291,7 @@ typedef void (^SpaceToSuperView)(UIEdgeInsets insets); - (SDAutoLayoutModel *)sd_resetNewLayout; /** 是否关闭自动布局 */ -@property (nonatomic, getter = sd_isClosingAotuLayout) BOOL sd_closeAotuLayout; +@property (nonatomic, getter = sd_isClosingAutoLayout) BOOL sd_closeAutoLayout; /** 从父view移除并清空约束 */ - (void)removeFromSuperviewAndClearAutoLayoutSettings; @@ -322,6 +325,7 @@ typedef void (^SpaceToSuperView)(UIEdgeInsets insets); @property (nonatomic) SDAutoLayoutModel *ownLayoutModel; @property (nonatomic, strong) NSNumber *sd_maxWidth; @property (nonatomic, strong) NSNumber *autoHeightRatioValue; +@property (nonatomic, strong) NSNumber *autoWidthRatioValue; @end @@ -455,7 +459,7 @@ typedef void (^SpaceToSuperView)(UIEdgeInsets insets); @property (nonatomic) BOOL shouldReadjustFrameBeforeStoreCache; -@property (nonatomic, assign, getter = sd_isClosingAotuLayout) BOOL sd_closeAotuLayout; +@property (nonatomic, assign, getter = sd_isClosingAutoLayout) BOOL sd_closeAutoLayout; /** 设置类似collectionView效果的固定间距自动宽度浮动子view */ diff --git a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m index 670d77e..67a9507 100755 --- a/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m +++ b/Pods/SDAutoLayout/SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m @@ -83,6 +83,7 @@ @implementation SDAutoLayoutModel @synthesize centerXIs = _centerXIs; @synthesize centerYIs = _centerYIs; @synthesize autoHeightRatio = _autoHeightRatio; +@synthesize autoWidthRatio = _autoWidthRatio; @synthesize spaceToSuperView = _spaceToSuperView; @synthesize maxWidthIs = _maxWidthIs; @synthesize maxHeightIs = _maxHeightIs; @@ -361,7 +362,7 @@ - (Margin)centerYIs return _centerYIs; } -- (AutoHeight)autoHeightRatio +- (AutoHeightWidth)autoHeightRatio { __weak typeof(self) weakSelf = self; @@ -374,6 +375,19 @@ - (AutoHeight)autoHeightRatio return _autoHeightRatio; } +- (AutoHeightWidth)autoWidthRatio +{ + __weak typeof(self) weakSelf = self; + + if (!_autoWidthRatio) { + _autoWidthRatio = ^(CGFloat ratioaValue) { + weakSelf.needsAutoResizeView.autoWidthRatioValue = @(ratioaValue); + return weakSelf; + }; + } + return _autoWidthRatio; +} + - (SpaceToSuperView)spaceToSuperView { __weak typeof(self) weakSelf = self; @@ -846,6 +860,16 @@ - (void)setAutoHeightRatioValue:(NSNumber *)autoHeightRatioValue objc_setAssociatedObject(self, @selector(autoHeightRatioValue), autoHeightRatioValue, OBJC_ASSOCIATION_RETAIN); } +- (NSNumber *)autoWidthRatioValue +{ + return objc_getAssociatedObject(self, _cmd); +} + +- (void)setAutoWidthRatioValue:(NSNumber *)autoWidthRatioValue +{ + objc_setAssociatedObject(self, @selector(autoWidthRatioValue), autoWidthRatioValue, OBJC_ASSOCIATION_RETAIN); +} + - (NSNumber *)sd_maxWidth { return objc_getAssociatedObject(self, _cmd); @@ -955,14 +979,14 @@ - (SDAutoLayoutModel *)sd_resetNewLayout return [self sd_layout]; } -- (BOOL)sd_isClosingAotuLayout +- (BOOL)sd_isClosingAutoLayout { - return self.sd_categoryManager.sd_isClosingAotuLayout; + return self.sd_categoryManager.sd_isClosingAutoLayout; } -- (void)setSd_closeAotuLayout:(BOOL)sd_closeAotuLayout +- (void)setSd_closeAutoLayout:(BOOL)sd_closeAutoLayout { - self.sd_categoryManager.sd_closeAotuLayout = sd_closeAotuLayout; + self.sd_categoryManager.sd_closeAutoLayout = sd_closeAutoLayout; } - (void)removeFromSuperviewAndClearAutoLayoutSettings @@ -1201,7 +1225,7 @@ - (void)sd_resizeWithModel:(SDAutoLayoutModel *)model { UIView *view = model.needsAutoResizeView; - if (!view || view.sd_isClosingAotuLayout) return; + if (!view || view.sd_isClosingAutoLayout) return; if (view.sd_maxWidth && (model.rightSpaceToView || model.rightEqualToView)) { // 靠右布局前提设置 [self layoutAutoWidthWidthView:view model:model]; @@ -1221,6 +1245,10 @@ - (void)sd_resizeWithModel:(SDAutoLayoutModel *)model view.fixedHeight = @(view.height_sd); } + if (view.autoWidthRatioValue) { + view.fixedWidth = @(view.height_sd * [view.autoWidthRatioValue floatValue]); + } + [self layoutTopWithView:view model:model]; @@ -1301,7 +1329,10 @@ - (void)layoutAutoWidthWidthView:(UIView *)view model:(SDAutoLayoutModel *)model label.numberOfLines = 1; if (label.text.length) { if (!label.isAttributedContent) { - CGRect rect = [label.text boundingRectWithSize:CGSizeMake(width, label.height_sd) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : label.font} context:nil]; + CGRect rect = [label.text boundingRectWithSize:CGSizeMake(MAXFLOAT, label.height_sd) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : label.font} context:nil]; + if (rect.size.width > width) { + rect.size.width = width; + } label.width_sd = rect.size.width + 0.1; } else{ [label sizeToFit]; diff --git a/Pods/SDWebImage/README.md b/Pods/SDWebImage/README.md index 3777158..e621454 100644 --- a/Pods/SDWebImage/README.md +++ b/Pods/SDWebImage/README.md @@ -1,185 +1,99 @@ -Web Image -========= +

+ +

+ + [![Build Status](http://img.shields.io/travis/rs/SDWebImage/master.svg?style=flat)](https://travis-ci.org/rs/SDWebImage) [![Pod Version](http://img.shields.io/cocoapods/v/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod Platform](http://img.shields.io/cocoapods/p/SDWebImage.svg?style=flat)](http://cocoadocs.org/docsets/SDWebImage/) [![Pod License](http://img.shields.io/cocoapods/l/SDWebImage.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0.html) -[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/3.3/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/3.3) +[![Dependency Status](https://www.versioneye.com/objective-c/sdwebimage/badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage) [![Reference Status](https://www.versioneye.com/objective-c/sdwebimage/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/sdwebimage/references) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/rs/SDWebImage) +[![codecov](https://codecov.io/gh/rs/SDWebImage/branch/master/graph/badge.svg)](https://codecov.io/gh/rs/SDWebImage) -This library provides a category for UIImageView with support for remote images coming from the web. - -It provides: - -- An `UIImageView` category adding web image and cache management to the Cocoa Touch framework -- An asynchronous image downloader -- An asynchronous memory + disk image caching with automatic cache expiration handling -- Animated GIF support -- WebP format support -- A background image decompression -- A guarantee that the same URL won't be downloaded several times -- A guarantee that bogus URLs won't be retried again and again -- A guarantee that main thread will never be blocked -- Performances! -- Use GCD and ARC -- Arm64 support - -NOTE: The version 3.0 of SDWebImage isn't fully backward compatible with 2.0 and requires iOS 5.1.1 -minimum deployment version. If you need iOS < 5.0 support, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). - -[How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) - -Who Uses It ----------- - -Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. - -How To Use ----------- +This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like `UIImageView`, `UIButton`, `MKAnnotationView`. -API documentation is available at [CocoaDocs - SDWebImage](http://cocoadocs.org/docsets/SDWebImage/) +## Features -### Using UIImageView+WebCache category with UITableView +- [x] Categories for `UIImageView`, `UIButton`, `MKAnnotationView` adding web image and cache management +- [x] An asynchronous image downloader +- [x] An asynchronous memory + disk image caching with automatic cache expiration handling +- [x] A background image decompression +- [x] A guarantee that the same URL won't be downloaded several times +- [x] A guarantee that bogus URLs won't be retried again and again +- [x] A guarantee that main thread will never be blocked +- [x] Performances! +- [x] Use GCD and ARC -Just #import the UIImageView+WebCache.h header, and call the sd_setImageWithURL:placeholderImage: -method from the tableView:cellForRowAtIndexPath: UITableViewDataSource method. Everything will be -handled for you, from async downloads to caching management. +## Supported Image Formats -```objective-c -#import +- Image formats supported by UIImage (JPEG, PNG, ...), including GIF +- WebP format, including animated WebP (use the `WebP` subspec) -... +## Requirements -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *MyIdentifier = @"MyIdentifier"; +- iOS 7.0 or later +- tvOS 9.0 or later +- watchOS 2.0 or later +- OS X 10.8 or later +- Xcode 7.3 or later - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:MyIdentifier] autorelease]; - } +#### Backwards compatibility - // Here we use the new provided sd_setImageWithURL: method to load the web image - [cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; - - cell.textLabel.text = @"My Text"; - return cell; -} -``` - -### Using blocks - -With blocks, you can be notified about the image download progress and whenever the image retrieval -has completed with success or not: - -```objective-c -// Here we use the new provided sd_setImageWithURL: method to load the web image -[cell.imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] - placeholderImage:[UIImage imageNamed:@"placeholder.png"] - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - ... completion code here ... - }]; -``` +- For iOS 5 and 6, use [any 3.x version up to 3.7.6](https://github.com/rs/SDWebImage/tree/3.7.6) +- For iOS < 5.0, please use the last [2.0 version](https://github.com/rs/SDWebImage/tree/2.0-compat). -Note: neither your success nor failure block will be call if your image request is canceled before completion. +## Getting Started -### Using SDWebImageManager +- Read this Readme doc +- Read the [How to use section](https://github.com/rs/SDWebImage#how-to-use) +- Read the [documentation @ CocoaDocs](http://cocoadocs.org/docsets/SDWebImage/) +- Read [How is SDWebImage better than X?](https://github.com/rs/SDWebImage/wiki/How-is-SDWebImage-better-than-X%3F) +- Try the example by downloading the project from Github or even easier using CocoaPods try `pod try SDWebImage` +- Get to the [installation steps](https://github.com/rs/SDWebImage#installation) +- Read the [SDWebImage 4.0 Migration Guide](Docs/SDWebImage-4.0-Migration-guide.md) to get an idea of the changes from 3.x to 4.x -The SDWebImageManager is the class behind the UIImageView+WebCache category. It ties the -asynchronous downloader with the image cache store. You can use this class directly to benefit -from web image downloading with caching in another context than a UIView (ie: with Cocoa). +## Who Uses It +- Find out [who uses SDWebImage](https://github.com/rs/SDWebImage/wiki/Who-Uses-SDWebImage) and add your app to the list. -Here is a simple example of how to use SDWebImageManager: +## Communication -```objective-c -SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager downloadImageWithURL:imageURL - options:0 - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - // progression tracking code - } - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; -``` +- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). (Tag 'sdwebimage') +- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/sdwebimage). +- If you **found a bug**, open an issue. +- If you **have a feature request**, open an issue. +- If you **want to contribute**, submit a pull request. -### Using Asynchronous Image Downloader Independently +## Installation -It's also possible to use the async image downloader independently: +## How To Use ```objective-c -SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; -[downloader downloadImageWithURL:imageURL - options:0 - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - // progression tracking code - } - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - if (image && finished) { - // do something with image - } - }]; -``` - -### Using Asynchronous Image Caching Independently +Objective-C: -It is also possible to use the async based image cache store independently. SDImageCache -maintains a memory cache and an optional disk cache. Disk cache write operations are performed -asynchronous so it doesn't add unnecessary latency to the UI. - -The SDImageCache class provides a singleton instance for convenience but you can create your own -instance if you want to create separated cache namespace. - -To lookup the cache, you use the `queryDiskCacheForKey:done:` method. If the method returns nil, it means the cache -doesn't currently own the image. You are thus responsible for generating and caching it. The cache -key is an application unique identifier for the image to cache. It is generally the absolute URL of -the image. - -```objective-c -SDImageCache *imageCache = [[SDImageCache alloc] initWithNamespace:@"myNamespace"]; -[imageCache queryDiskCacheForKey:myCacheKey done:^(UIImage *image) { - // image is not nil if image was found -}]; +#import +... +[imageView sd_setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] + placeholderImage:[UIImage imageNamed:@"placeholder.png"]]; ``` -By default SDImageCache will lookup the disk cache if an image can't be found in the memory cache. -You can prevent this from happening by calling the alternative method `imageFromMemoryCacheForKey:`. +```swift +Swift: -To store an image into the cache, you use the storeImage:forKey: method: +@import SDWebImage -```objective-c -[[SDImageCache sharedImageCache] storeImage:myImage forKey:myCacheKey]; +imageView.sd_setImage(with: URL(string: "http://www.domain.com/path/to/image.jpg"), placeholderImage: UIImage(named: "placeholder.png")) ``` -By default, the image will be stored in memory cache as well as on disk cache (asynchronously). If -you want only the memory cache, use the alternative method storeImage:forKey:toDisk: with a negative -third argument. +- For details about how to use the library and clear examples, see [The detailed How to use](Docs/HowToUse.md) -### Using cache key filter - -Sometime, you may not want to use the image URL as cache key because part of the URL is dynamic -(i.e.: for access control purpose). SDWebImageManager provides a way to set a cache key filter that -takes the NSURL as input, and output a cache key NSString. - -The following example sets a filter in the application delegate that will remove any query-string from -the URL before to use it as a cache key: - -```objective-c -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - SDWebImageManager.sharedManager.cacheKeyFilter = ^(NSURL *url) { - url = [[NSURL alloc] initWithScheme:url.scheme host:url.host path:url.path]; - return [url absoluteString]; - }; - - // Your app init code... - return YES; -} -``` +## Animated Images (GIF) support +- Starting with the 4.0 version, we rely on [FLAnimatedImage](https://github.com/Flipboard/FLAnimatedImage) to take care of our animated images. +- To use it, simply make sure you use `FLAnimatedImageView` instead of `UIImageView`. +- **Note**: there is a backwards compatible feature, so if you are still trying to load a GIF into a `UIImageView`, it will only show the 1st frame as a static image. +- **Important**: FLAnimatedImage only works on the iOS platform, so for all the other platforms (OS X, tvOS, watchOS) we will fallback to the backwards compatibility feature described above Common Problems --------------- @@ -201,21 +115,31 @@ If you don't control the image server you're using, you may not be able to chang ``` objective-c [imageView sd_setImageWithURL:[NSURL URLWithString:@"https://graph.facebook.com/olivier.poitrey/picture"] - placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] - options:SDWebImageRefreshCached]; + placeholderImage:[UIImage imageNamed:@"avatar-placeholder.png"] + options:SDWebImageRefreshCached]; ``` ### Add a progress indicator -See this category: https://github.com/JJSaccolo/UIActivityIndicator-for-SDWebImage +Add these before you call ```sd_setImageWithURL``` + +``` objective-c +[imageView setShowActivityIndicatorView:YES]; +[imageView setIndicatorStyle:UIActivityIndicatorViewStyleGray]; +``` + +``` swift +imageView.setShowActivityIndicatorView(true) +imageView.setIndicatorStyle(.Gray) +``` Installation ------------ There are three ways to use SDWebImage in your project: - using CocoaPods -- copying all the files into your project -- importing the project as a static library +- using Carthage +- by cloning the project into your repository ### Installation with CocoaPods @@ -223,8 +147,8 @@ There are three ways to use SDWebImage in your project: #### Podfile ``` -platform :ios, '6.1' -pod 'SDWebImage', '~>3.7' +platform :ios, '7.0' +pod 'SDWebImage', '~>3.8' ``` If you are using Swift, be sure to add `use_frameworks!` and set your target to iOS 8+: @@ -253,63 +177,8 @@ To install with carthage, follow the instruction on [Carthage](https://github.co github "rs/SDWebImage" ``` -#### Usage -Swift - -If you installed using CocoaPods: -``` -import SDWebImage -``` - -If you installed manually: -``` -import WebImage -``` - -Objective-C - -``` -@import WebImage; -``` - ### Installation by cloning the repository - -In order to gain access to all the files from the repository, you should clone it. -``` -git clone --recursive https://github.com/rs/SDWebImage.git -``` - -### Add the SDWebImage project to your project - -- Download and unzip the last version of the framework from the [download page](https://github.com/rs/SDWebImage/releases) -- Right-click on the project navigator and select "Add Files to "Your Project": -- In the dialog, select SDWebImage.framework: -- Check the "Copy items into destination group's folder (if needed)" checkbox - -### Add dependencies - -- In you application project app’s target settings, find the "Build Phases" section and open the "Link Binary With Libraries" block: -- Click the "+" button again and select the "ImageIO.framework", this is needed by the progressive download feature: - -### Add Linker Flag - -Open the "Build Settings" tab, in the "Linking" section, locate the "Other Linker Flags" setting and add the "-ObjC" flag: - -![Other Linker Flags](http://dl.dropbox.com/u/123346/SDWebImage/10_other_linker_flags.jpg) - -Alternatively, if this causes compilation problems with frameworks that extend optional libraries, such as Parse, RestKit or opencv2, instead of the -ObjC flag use: -``` --force_load SDWebImage.framework/Versions/Current/SDWebImage -``` - -If you're using Cocoa Pods and have any frameworks that extend optional libraries, such as Parsen RestKit or opencv2, instead of the -ObjC flag use: -``` --force_load $(TARGET_BUILD_DIR)/libPods.a -``` -and this: -``` -$(inherited) -``` +- see [Manual install](Docs/ManualInstallation.md) ### Import headers in your source files @@ -324,11 +193,23 @@ In the source files where you need to use the library, import the header file: At this point your workspace should build without error. If you are having problem, post to the Issue and the community can help you solve it. -Future Enhancements -------------------- +## Author +- [Olivier Poitrey](https://github.com/rs) -- LRU memory cache cleanup instead of reset on memory warning +## Collaborators +- [Konstantinos K.](https://github.com/mythodeia) +- [Bogdan Poplauschi](https://github.com/bpoplauschi) ## Licenses All source code is licensed under the [MIT License](https://raw.github.com/rs/SDWebImage/master/LICENSE). + +## Architecture + +

+ +

+ +

+ +

diff --git a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h index 69c76dc..b23b0bd 100644 --- a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h +++ b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.h @@ -1,26 +1,33 @@ -// -// Created by Fabrice Aneche on 06/01/14. -// Copyright (c) 2014 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Fabrice Aneche + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import +#import "SDWebImageCompat.h" + +typedef NS_ENUM(NSInteger, SDImageFormat) { + SDImageFormatUndefined = -1, + SDImageFormatJPEG = 0, + SDImageFormatPNG, + SDImageFormatGIF, + SDImageFormatTIFF, + SDImageFormatWebP +}; @interface NSData (ImageContentType) /** - * Compute the content type for an image data + * Return image format * - * @param data the input data + * @param data the input image data * - * @return the content type as string (i.e. image/jpeg, image/gif) + * @return the image format as `SDImageFormat` (enum) */ -+ (NSString *)sd_contentTypeForImageData:(NSData *)data; - -@end - - -@interface NSData (ImageContentTypeDeprecated) - -+ (NSString *)contentTypeForImageData:(NSData *)data __deprecated_msg("Use `sd_contentTypeForImageData:`"); ++ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data; @end diff --git a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m index 0941cfa..7364715 100644 --- a/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m +++ b/Pods/SDWebImage/SDWebImage/NSData+ImageContentType.m @@ -1,49 +1,46 @@ -// -// Created by Fabrice Aneche on 06/01/14. -// Copyright (c) 2014 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Fabrice Aneche + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "NSData+ImageContentType.h" @implementation NSData (ImageContentType) -+ (NSString *)sd_contentTypeForImageData:(NSData *)data { ++ (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data { + if (!data) { + return SDImageFormatUndefined; + } + uint8_t c; [data getBytes:&c length:1]; switch (c) { case 0xFF: - return @"image/jpeg"; + return SDImageFormatJPEG; case 0x89: - return @"image/png"; + return SDImageFormatPNG; case 0x47: - return @"image/gif"; + return SDImageFormatGIF; case 0x49: case 0x4D: - return @"image/tiff"; + return SDImageFormatTIFF; case 0x52: // R as RIFF for WEBP - if ([data length] < 12) { - return nil; + if (data.length < 12) { + return SDImageFormatUndefined; } - + NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding]; if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) { - return @"image/webp"; + return SDImageFormatWebP; } - - return nil; } - return nil; -} - -@end - - -@implementation NSData (ImageContentTypeDeprecated) - -+ (NSString *)contentTypeForImageData:(NSData *)data { - return [self sd_contentTypeForImageData:data]; + return SDImageFormatUndefined; } @end diff --git a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h new file mode 100644 index 0000000..7515d40 --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.h @@ -0,0 +1,23 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +#if SD_MAC + +#import + +@interface NSImage (WebCache) + +- (CGImageRef)CGImage; +- (NSArray *)images; +- (BOOL)isGIF; + +@end + +#endif diff --git a/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m new file mode 100644 index 0000000..518b498 --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/NSImage+WebCache.m @@ -0,0 +1,32 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "NSImage+WebCache.h" + +#if SD_MAC + +@implementation NSImage (WebCache) + +- (CGImageRef)CGImage { + NSRect imageRect = NSMakeRect(0, 0, self.size.width, self.size.height); + CGImageRef cgImage = [self CGImageForProposedRect:&imageRect context:NULL hints:nil]; + return cgImage; +} + +- (NSArray *)images { + return nil; +} + +- (BOOL)isGIF { + return NO; +} + +@end + +#endif + diff --git a/Pods/SDWebImage/SDWebImage/SDImageCache.h b/Pods/SDWebImage/SDWebImage/SDImageCache.h index 6704541..9ae2eb4 100644 --- a/Pods/SDWebImage/SDWebImage/SDImageCache.h +++ b/Pods/SDWebImage/SDWebImage/SDImageCache.h @@ -9,6 +9,8 @@ #import #import "SDWebImageCompat.h" +@class SDImageCacheConfig; + typedef NS_ENUM(NSInteger, SDImageCacheType) { /** * The image wasn't available the SDWebImage caches, but was downloaded from the web. @@ -24,33 +26,25 @@ typedef NS_ENUM(NSInteger, SDImageCacheType) { SDImageCacheTypeMemory }; -typedef void(^SDWebImageQueryCompletedBlock)(UIImage *image, SDImageCacheType cacheType); +typedef void(^SDCacheQueryCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, SDImageCacheType cacheType); typedef void(^SDWebImageCheckCacheCompletionBlock)(BOOL isInCache); typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger totalSize); + /** * SDImageCache maintains a memory cache and an optional disk cache. Disk cache write operations are performed * asynchronous so it doesn’t add unnecessary latency to the UI. */ @interface SDImageCache : NSObject -/** - * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. - * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. - */ -@property (assign, nonatomic) BOOL shouldDecompressImages; - -/** - * disable iCloud backup [defaults to YES] - */ -@property (assign, nonatomic) BOOL shouldDisableiCloud; +#pragma mark - Properties /** - * use memory cache [defaults to YES] + * Cache Config object - storing all kind of settings */ -@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; +@property (nonatomic, nonnull, readonly) SDImageCacheConfig *config; /** * The maximum "total cost" of the in-memory image cache. The cost function is the number of pixels held in memory. @@ -62,29 +56,21 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot */ @property (assign, nonatomic) NSUInteger maxMemoryCountLimit; -/** - * The maximum length of time to keep an image in the cache, in seconds - */ -@property (assign, nonatomic) NSInteger maxCacheAge; - -/** - * The maximum size of the cache, in bytes. - */ -@property (assign, nonatomic) NSUInteger maxCacheSize; +#pragma mark - Singleton and initialization /** * Returns global shared cache instance * * @return SDImageCache global instance */ -+ (SDImageCache *)sharedImageCache; ++ (nonnull instancetype)sharedImageCache; /** * Init a new cache store with a specific namespace * * @param ns The namespace to use for this cache store */ -- (id)initWithNamespace:(NSString *)ns; +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns; /** * Init a new cache store with a specific namespace and directory @@ -92,9 +78,12 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * @param ns The namespace to use for this cache store * @param directory Directory to cache disk images in */ -- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory; +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns + diskCacheDirectory:(nonnull NSString *)directory NS_DESIGNATED_INITIALIZER; --(NSString *)makeDiskCachePath:(NSString*)fullNamespace; +#pragma mark - Cache paths + +- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace; /** * Add a read-only cache path to search for images pre-cached by SDImageCache @@ -102,99 +91,123 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @param path The path to use for this read-only cache path */ -- (void)addReadOnlyCachePath:(NSString *)path; +- (void)addReadOnlyCachePath:(nonnull NSString *)path; + +#pragma mark - Store Ops /** - * Store an image into memory and disk cache at the given key. + * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param completionBlock A block executed after the operation is finished */ -- (void)storeImage:(UIImage *)image forKey:(NSString *)key; +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + completion:(nullable SDWebImageNoParamsBlock)completionBlock; /** - * Store an image into memory and optionally disk cache at the given key. + * Asynchronously store an image into memory and disk cache at the given key. * - * @param image The image to store - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES + * @param image The image to store + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completionBlock A block executed after the operation is finished */ -- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock; /** - * Store an image into memory and optionally disk cache at the given key. + * Asynchronously store an image into memory and disk cache at the given key. + * + * @param image The image to store + * @param imageData The image data as returned by the server, this representation will be used for disk storage + * instead of converting the given image object into a storable/compressed image format in order + * to save quality and CPU + * @param key The unique image cache key, usually it's image absolute URL + * @param toDisk Store the image to disk cache if YES + * @param completionBlock A block executed after the operation is finished + */ +- (void)storeImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock; + +/** + * Synchronously store image NSData into disk cache at the given key. * - * @param image The image to store - * @param recalculate BOOL indicates if imageData can be used or a new data should be constructed from the UIImage - * @param imageData The image data as returned by the server, this representation will be used for disk storage - * instead of converting the given image object into a storable/compressed image format in order - * to save quality and CPU - * @param key The unique image cache key, usually it's image absolute URL - * @param toDisk Store the image to disk cache if YES + * @warning This method is synchronous, make sure to call it from the ioQueue + * + * @param imageData The image data to store + * @param key The unique image cache key, usually it's image absolute URL */ -- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk; +- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key; + +#pragma mark - Query and Retrieve Ops /** - * Store image NSData into disk cache at the given key. + * Async check if image exists in disk cache already (does not load the image) * - * @param imageData The image data to store - * @param key The unique image cache key, usually it's image absolute URL + * @param key the key describing the url + * @param completionBlock the block to be executed when the check is done. + * @note the completion block will be always executed on the main queue */ -- (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key; +- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** - * Query the disk cache asynchronously. + * Operation that queries the cache asynchronously and call the completion when done. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the wanted image + * @param doneBlock The completion block. Will not get called if the operation is cancelled + * + * @return a NSOperation instance containing the cache op */ -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock; +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock; /** * Query the memory cache synchronously. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the image */ -- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key; +- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key; /** - * Query the disk cache synchronously after checking the memory cache. + * Query the disk cache synchronously. * - * @param key The unique key used to store the wanted image + * @param key The unique key used to store the image */ -- (UIImage *)imageFromDiskCacheForKey:(NSString *)key; +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key; /** - * Remove the image from memory and disk cache synchronously + * Query the cache (memory and or disk) synchronously after checking the memory cache. * - * @param key The unique image cache key + * @param key The unique key used to store the image */ -- (void)removeImageForKey:(NSString *)key; +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key; +#pragma mark - Remove Ops /** * Remove the image from memory and disk cache asynchronously * * @param key The unique image cache key - * @param completion An block that should be executed after the image has been removed (optional) + * @param completion A block that should be executed after the image has been removed (optional) */ -- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion; - -/** - * Remove the image from memory and optionally disk cache asynchronously - * - * @param key The unique image cache key - * @param fromDisk Also remove cache entry from disk if YES - */ -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk; +- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion; /** * Remove the image from memory and optionally disk cache asynchronously * * @param key The unique image cache key * @param fromDisk Also remove cache entry from disk if YES - * @param completion An block that should be executed after the image has been removed (optional) + * @param completion A block that should be executed after the image has been removed (optional) */ -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion; +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion; + +#pragma mark - Cache clean Ops /** * Clear all memory cached images @@ -202,28 +215,18 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot - (void)clearMemory; /** - * Clear all disk cached images. Non-blocking method - returns immediately. - * @param completion An block that should be executed after cache expiration completes (optional) + * Async clear all disk cached images. Non-blocking method - returns immediately. + * @param completion A block that should be executed after cache expiration completes (optional) */ -- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion; +- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion; /** - * Clear all disk cached images - * @see clearDiskOnCompletion: + * Async remove all expired cached image from disk. Non-blocking method - returns immediately. + * @param completionBlock A block that should be executed after cache expiration completes (optional) */ -- (void)clearDisk; +- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock; -/** - * Remove all expired cached image from disk. Non-blocking method - returns immediately. - * @param completionBlock An block that should be executed after cache expiration completes (optional) - */ -- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock; - -/** - * Remove all expired cached image from disk - * @see cleanDiskWithCompletionBlock: - */ -- (void)cleanDisk; +#pragma mark - Cache Info /** * Get the size used by the disk cache @@ -238,25 +241,9 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot /** * Asynchronously calculate the disk cache's size. */ -- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock; - -/** - * Async check if image exists in disk cache already (does not load the image) - * - * @param key the key describing the url - * @param completionBlock the block to be executed when the check is done. - * @note the completion block will be always executed on the main queue - */ -- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock; -/** - * Check if image exists in disk cache already (does not load the image) - * - * @param key the key describing the url - * - * @return YES if an image exists for the given key - */ -- (BOOL)diskImageExistsWithKey:(NSString *)key; +#pragma mark - Cache Paths /** * Get the cache path for a certain key (needs the cache path root folder) @@ -266,7 +253,7 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return the cache path */ -- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path; +- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path; /** * Get the default cache path for a certain key @@ -275,6 +262,6 @@ typedef void(^SDWebImageCalculateSizeBlock)(NSUInteger fileCount, NSUInteger tot * * @return the default cache path */ -- (NSString *)defaultCachePathForKey:(NSString *)key; +- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key; @end diff --git a/Pods/SDWebImage/SDWebImage/SDImageCache.m b/Pods/SDWebImage/SDWebImage/SDImageCache.m index fe24482..acd5ee6 100644 --- a/Pods/SDWebImage/SDWebImage/SDImageCache.m +++ b/Pods/SDWebImage/SDWebImage/SDImageCache.m @@ -10,6 +10,10 @@ #import "SDWebImageDecoder.h" #import "UIImage+MultiFormat.h" #import +#import "UIImage+GIF.h" +#import "NSData+ImageContentType.h" +#import "NSImage+WebCache.h" +#import "SDImageCacheConfig.h" // See https://github.com/rs/SDWebImage/pull/1141 for discussion @interface AutoPurgeCache : NSCache @@ -17,51 +21,40 @@ @interface AutoPurgeCache : NSCache @implementation AutoPurgeCache -- (id)init -{ +- (nonnull instancetype)init { self = [super init]; if (self) { +#if SD_UIKIT [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#endif } return self; } -- (void)dealloc -{ +- (void)dealloc { +#if SD_UIKIT [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; - +#endif } @end -static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week -// PNG signature bytes and data (below) -static unsigned char kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; -static NSData *kPNGSignatureData = nil; - -BOOL ImageDataHasPNGPreffix(NSData *data); - -BOOL ImageDataHasPNGPreffix(NSData *data) { - NSUInteger pngSignatureLength = [kPNGSignatureData length]; - if ([data length] >= pngSignatureLength) { - if ([[data subdataWithRange:NSMakeRange(0, pngSignatureLength)] isEqualToData:kPNGSignatureData]) { - return YES; - } - } - - return NO; -} FOUNDATION_STATIC_INLINE NSUInteger SDCacheCostForImage(UIImage *image) { +#if SD_MAC + return image.size.height * image.size.width; +#elif SD_UIKIT || SD_WATCH return image.size.height * image.size.width * image.scale * image.scale; +#endif } @interface SDImageCache () -@property (strong, nonatomic) NSCache *memCache; -@property (strong, nonatomic) NSString *diskCachePath; -@property (strong, nonatomic) NSMutableArray *customPaths; -@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t ioQueue; +#pragma mark - Properties +@property (strong, nonatomic, nonnull) NSCache *memCache; +@property (strong, nonatomic, nonnull) NSString *diskCachePath; +@property (strong, nonatomic, nullable) NSMutableArray *customPaths; +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t ioQueue; @end @@ -70,7 +63,9 @@ @implementation SDImageCache { NSFileManager *_fileManager; } -+ (SDImageCache *)sharedImageCache { +#pragma mark - Singleton, init, dealloc + ++ (nonnull instancetype)sharedImageCache { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -79,28 +74,25 @@ + (SDImageCache *)sharedImageCache { return instance; } -- (id)init { +- (instancetype)init { return [self initWithNamespace:@"default"]; } -- (id)initWithNamespace:(NSString *)ns { +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns { NSString *path = [self makeDiskCachePath:ns]; return [self initWithNamespace:ns diskCacheDirectory:path]; } -- (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory { +- (nonnull instancetype)initWithNamespace:(nonnull NSString *)ns + diskCacheDirectory:(nonnull NSString *)directory { if ((self = [super init])) { NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns]; - - // initialise PNG signature data - kPNGSignatureData = [NSData dataWithBytes:kPNGSignatureBytes length:8]; - + // Create IO serial queue _ioQueue = dispatch_queue_create("com.hackemist.SDWebImageCache", DISPATCH_QUEUE_SERIAL); - - // Init default values - _maxCacheAge = kDefaultCacheMaxCacheAge; - + + _config = [[SDImageCacheConfig alloc] init]; + // Init the memory cache _memCache = [[AutoPurgeCache alloc] init]; _memCache.name = fullNamespace; @@ -113,20 +105,11 @@ - (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory _diskCachePath = path; } - // Set decompression to YES - _shouldDecompressImages = YES; - - // memory cache enabled - _shouldCacheImagesInMemory = YES; - - // Disable iCloud - _shouldDisableiCloud = YES; - dispatch_sync(_ioQueue, ^{ _fileManager = [NSFileManager new]; }); -#if TARGET_OS_IOS +#if SD_UIKIT // Subscribe to app events [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearMemory) @@ -134,12 +117,12 @@ - (id)initWithNamespace:(NSString *)ns diskCacheDirectory:(NSString *)directory object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(cleanDisk) + selector:@selector(deleteOldFiles) name:UIApplicationWillTerminateNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(backgroundCleanDisk) + selector:@selector(backgroundDeleteOldFiles) name:UIApplicationDidEnterBackgroundNotification object:nil]; #endif @@ -153,7 +136,17 @@ - (void)dealloc { SDDispatchQueueRelease(_ioQueue); } -- (void)addReadOnlyCachePath:(NSString *)path { +- (void)checkIfQueueIsIOQueue { + const char *currentQueueLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL); + const char *ioQueueLabel = dispatch_queue_get_label(self.ioQueue); + if (strcmp(currentQueueLabel, ioQueueLabel) != 0) { + NSLog(@"This method should be called from the ioQueue"); + } +} + +#pragma mark - Cache paths + +- (void)addReadOnlyCachePath:(nonnull NSString *)path { if (!self.customPaths) { self.customPaths = [NSMutableArray new]; } @@ -163,19 +156,17 @@ - (void)addReadOnlyCachePath:(NSString *)path { } } -- (NSString *)cachePathForKey:(NSString *)key inPath:(NSString *)path { +- (nullable NSString *)cachePathForKey:(nullable NSString *)key inPath:(nonnull NSString *)path { NSString *filename = [self cachedFileNameForKey:key]; return [path stringByAppendingPathComponent:filename]; } -- (NSString *)defaultCachePathForKey:(NSString *)key { +- (nullable NSString *)defaultCachePathForKey:(nullable NSString *)key { return [self cachePathForKey:key inPath:self.diskCachePath]; } -#pragma mark SDImageCache (private) - -- (NSString *)cachedFileNameForKey:(NSString *)key { - const char *str = [key UTF8String]; +- (nullable NSString *)cachedFileNameForKey:(nullable NSString *)key { + const char *str = key.UTF8String; if (str == NULL) { str = ""; } @@ -183,83 +174,78 @@ - (NSString *)cachedFileNameForKey:(NSString *)key { CC_MD5(str, (CC_LONG)strlen(str), r); NSString *filename = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%@", r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8], r[9], r[10], - r[11], r[12], r[13], r[14], r[15], [[key pathExtension] isEqualToString:@""] ? @"" : [NSString stringWithFormat:@".%@", [key pathExtension]]]; + r[11], r[12], r[13], r[14], r[15], [key.pathExtension isEqualToString:@""] ? @"" : [NSString stringWithFormat:@".%@", key.pathExtension]]; return filename; } -#pragma mark ImageCache - -// Init the disk cache --(NSString *)makeDiskCachePath:(NSString*)fullNamespace{ - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); +- (nullable NSString *)makeDiskCachePath:(nonnull NSString*)fullNamespace { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); return [paths[0] stringByAppendingPathComponent:fullNamespace]; } -- (void)storeImage:(UIImage *)image recalculateFromImage:(BOOL)recalculate imageData:(NSData *)imageData forKey:(NSString *)key toDisk:(BOOL)toDisk { +#pragma mark - Store Ops + +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + completion:(nullable SDWebImageNoParamsBlock)completionBlock { + [self storeImage:image imageData:nil forKey:key toDisk:YES completion:completionBlock]; +} + +- (void)storeImage:(nullable UIImage *)image + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock { + [self storeImage:image imageData:nil forKey:key toDisk:toDisk completion:completionBlock]; +} + +- (void)storeImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + forKey:(nullable NSString *)key + toDisk:(BOOL)toDisk + completion:(nullable SDWebImageNoParamsBlock)completionBlock { if (!image || !key) { + if (completionBlock) { + completionBlock(); + } return; } // if memory cache is enabled - if (self.shouldCacheImagesInMemory) { + if (self.config.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(image); [self.memCache setObject:image forKey:key cost:cost]; } - + if (toDisk) { dispatch_async(self.ioQueue, ^{ NSData *data = imageData; - - if (image && (recalculate || !data)) { -#if TARGET_OS_IPHONE - // We need to determine if the image is a PNG or a JPEG - // PNGs are easier to detect because they have a unique signature (http://www.w3.org/TR/PNG-Structure.html) - // The first eight bytes of a PNG file always contain the following (decimal) values: - // 137 80 78 71 13 10 26 10 - - // If the imageData is nil (i.e. if trying to save a UIImage directly or the image was transformed on download) - // and the image has an alpha channel, we will consider it PNG to avoid losing the transparency - int alphaInfo = CGImageGetAlphaInfo(image.CGImage); - BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || - alphaInfo == kCGImageAlphaNoneSkipFirst || - alphaInfo == kCGImageAlphaNoneSkipLast); - BOOL imageIsPng = hasAlpha; - - // But if we have an image data, we will look at the preffix - if ([imageData length] >= [kPNGSignatureData length]) { - imageIsPng = ImageDataHasPNGPreffix(imageData); - } - - if (imageIsPng) { - data = UIImagePNGRepresentation(image); - } - else { - data = UIImageJPEGRepresentation(image, (CGFloat)1.0); - } -#else - data = [NSBitmapImageRep representationOfImageRepsInArray:image.representations usingType: NSJPEGFileType properties:nil]; -#endif + + if (!data && image) { + SDImageFormat imageFormatFromData = [NSData sd_imageFormatForImageData:data]; + data = [image sd_imageDataAsFormat:imageFormatFromData]; } - + [self storeImageDataToDisk:data forKey:key]; + if (completionBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + completionBlock(); + }); + } }); + } else { + if (completionBlock) { + completionBlock(); + } } } -- (void)storeImage:(UIImage *)image forKey:(NSString *)key { - [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:YES]; -} - -- (void)storeImage:(UIImage *)image forKey:(NSString *)key toDisk:(BOOL)toDisk { - [self storeImage:image recalculateFromImage:YES imageData:nil forKey:key toDisk:toDisk]; -} - -- (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key { - - if (!imageData) { +- (void)storeImageDataToDisk:(nullable NSData *)imageData forKey:(nullable NSString *)key { + if (!imageData || !key) { return; } + [self checkIfQueueIsIOQueue]; + if (![_fileManager fileExistsAtPath:_diskCachePath]) { [_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL]; } @@ -272,35 +258,21 @@ - (void)storeImageDataToDisk:(NSData *)imageData forKey:(NSString *)key { [_fileManager createFileAtPath:cachePathForKey contents:imageData attributes:nil]; // disable iCloud backup - if (self.shouldDisableiCloud) { - [fileURL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]; + if (self.config.shouldDisableiCloud) { + [fileURL setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; } } -- (BOOL)diskImageExistsWithKey:(NSString *)key { - BOOL exists = NO; - - // this is an exception to access the filemanager on another queue than ioQueue, but we are using the shared instance - // from apple docs on NSFileManager: The methods of the shared NSFileManager object can be called from multiple threads safely. - exists = [[NSFileManager defaultManager] fileExistsAtPath:[self defaultCachePathForKey:key]]; - - // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name - // checking the key with and without the extension - if (!exists) { - exists = [[NSFileManager defaultManager] fileExistsAtPath:[[self defaultCachePathForKey:key] stringByDeletingPathExtension]]; - } - - return exists; -} +#pragma mark - Query and Retrieve Ops -- (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)diskImageExistsWithKey:(nullable NSString *)key completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { dispatch_async(_ioQueue, ^{ BOOL exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key]]; // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension if (!exists) { - exists = [_fileManager fileExistsAtPath:[[self defaultCachePathForKey:key] stringByDeletingPathExtension]]; + exists = [_fileManager fileExistsAtPath:[self defaultCachePathForKey:key].stringByDeletingPathExtension]; } if (completionBlock) { @@ -311,29 +283,33 @@ - (void)diskImageExistsWithKey:(NSString *)key completion:(SDWebImageCheckCacheC }); } -- (UIImage *)imageFromMemoryCacheForKey:(NSString *)key { +- (nullable UIImage *)imageFromMemoryCacheForKey:(nullable NSString *)key { return [self.memCache objectForKey:key]; } -- (UIImage *)imageFromDiskCacheForKey:(NSString *)key { +- (nullable UIImage *)imageFromDiskCacheForKey:(nullable NSString *)key { + UIImage *diskImage = [self diskImageForKey:key]; + if (diskImage && self.config.shouldCacheImagesInMemory) { + NSUInteger cost = SDCacheCostForImage(diskImage); + [self.memCache setObject:diskImage forKey:key cost:cost]; + } + + return diskImage; +} +- (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key { // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; if (image) { return image; } - + // Second check the disk cache... - UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.shouldCacheImagesInMemory) { - NSUInteger cost = SDCacheCostForImage(diskImage); - [self.memCache setObject:diskImage forKey:key cost:cost]; - } - - return diskImage; + image = [self imageFromDiskCacheForKey:key]; + return image; } -- (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { +- (nullable NSData *)diskImageDataBySearchingAllPathsForKey:(nullable NSString *)key { NSString *defaultPath = [self defaultCachePathForKey:key]; NSData *data = [NSData dataWithContentsOfFile:defaultPath]; if (data) { @@ -342,12 +318,12 @@ - (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - data = [NSData dataWithContentsOfFile:[defaultPath stringByDeletingPathExtension]]; + data = [NSData dataWithContentsOfFile:defaultPath.stringByDeletingPathExtension]; if (data) { return data; } - NSArray *customPaths = [self.customPaths copy]; + NSArray *customPaths = [self.customPaths copy]; for (NSString *path in customPaths) { NSString *filePath = [self cachePathForKey:key inPath:path]; NSData *imageData = [NSData dataWithContentsOfFile:filePath]; @@ -357,7 +333,7 @@ - (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { // fallback because of https://github.com/rs/SDWebImage/pull/976 that added the extension to the disk file name // checking the key with and without the extension - imageData = [NSData dataWithContentsOfFile:[filePath stringByDeletingPathExtension]]; + imageData = [NSData dataWithContentsOfFile:filePath.stringByDeletingPathExtension]; if (imageData) { return imageData; } @@ -366,12 +342,12 @@ - (NSData *)diskImageDataBySearchingAllPathsForKey:(NSString *)key { return nil; } -- (UIImage *)diskImageForKey:(NSString *)key { +- (nullable UIImage *)diskImageForKey:(nullable NSString *)key { NSData *data = [self diskImageDataBySearchingAllPathsForKey:key]; if (data) { UIImage *image = [UIImage sd_imageWithData:data]; image = [self scaledImageForKey:key image:image]; - if (self.shouldDecompressImages) { + if (self.config.shouldDecompressImages) { image = [UIImage decodedImageWithImage:image]; } return image; @@ -381,68 +357,69 @@ - (UIImage *)diskImageForKey:(NSString *)key { } } -- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { +- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); } -- (NSOperation *)queryDiskCacheForKey:(NSString *)key done:(SDWebImageQueryCompletedBlock)doneBlock { - if (!doneBlock) { - return nil; - } - +- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key done:(nullable SDCacheQueryCompletedBlock)doneBlock { if (!key) { - doneBlock(nil, SDImageCacheTypeNone); + if (doneBlock) { + doneBlock(nil, nil, SDImageCacheTypeNone); + } return nil; } // First check the in-memory cache... UIImage *image = [self imageFromMemoryCacheForKey:key]; if (image) { - doneBlock(image, SDImageCacheTypeMemory); + NSData *diskData = nil; + if ([image isGIF]) { + diskData = [self diskImageDataBySearchingAllPathsForKey:key]; + } + if (doneBlock) { + doneBlock(image, diskData, SDImageCacheTypeMemory); + } return nil; } NSOperation *operation = [NSOperation new]; dispatch_async(self.ioQueue, ^{ if (operation.isCancelled) { + // do not call the completion if cancelled return; } @autoreleasepool { + NSData *diskData = [self diskImageDataBySearchingAllPathsForKey:key]; UIImage *diskImage = [self diskImageForKey:key]; - if (diskImage && self.shouldCacheImagesInMemory) { + if (diskImage && self.config.shouldCacheImagesInMemory) { NSUInteger cost = SDCacheCostForImage(diskImage); [self.memCache setObject:diskImage forKey:key cost:cost]; } - dispatch_async(dispatch_get_main_queue(), ^{ - doneBlock(diskImage, SDImageCacheTypeDisk); - }); + if (doneBlock) { + dispatch_async(dispatch_get_main_queue(), ^{ + doneBlock(diskImage, diskData, SDImageCacheTypeDisk); + }); + } } }); return operation; } -- (void)removeImageForKey:(NSString *)key { - [self removeImageForKey:key withCompletion:nil]; -} +#pragma mark - Remove Ops -- (void)removeImageForKey:(NSString *)key withCompletion:(SDWebImageNoParamsBlock)completion { +- (void)removeImageForKey:(nullable NSString *)key withCompletion:(nullable SDWebImageNoParamsBlock)completion { [self removeImageForKey:key fromDisk:YES withCompletion:completion]; } -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk { - [self removeImageForKey:key fromDisk:fromDisk withCompletion:nil]; -} - -- (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(SDWebImageNoParamsBlock)completion { - +- (void)removeImageForKey:(nullable NSString *)key fromDisk:(BOOL)fromDisk withCompletion:(nullable SDWebImageNoParamsBlock)completion { if (key == nil) { return; } - if (self.shouldCacheImagesInMemory) { + if (self.config.shouldCacheImagesInMemory) { [self.memCache removeObjectForKey:key]; } @@ -462,6 +439,8 @@ - (void)removeImageForKey:(NSString *)key fromDisk:(BOOL)fromDisk withCompletion } +# pragma mark - Mem Cache settings + - (void)setMaxMemoryCost:(NSUInteger)maxMemoryCost { self.memCache.totalCostLimit = maxMemoryCost; } @@ -478,16 +457,13 @@ - (void)setMaxMemoryCountLimit:(NSUInteger)maxCountLimit { self.memCache.countLimit = maxCountLimit; } +#pragma mark - Cache clean Ops + - (void)clearMemory { [self.memCache removeAllObjects]; } -- (void)clearDisk { - [self clearDiskOnCompletion:nil]; -} - -- (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion -{ +- (void)clearDiskOnCompletion:(nullable SDWebImageNoParamsBlock)completion { dispatch_async(self.ioQueue, ^{ [_fileManager removeItemAtPath:self.diskCachePath error:nil]; [_fileManager createDirectoryAtPath:self.diskCachePath @@ -503,14 +479,14 @@ - (void)clearDiskOnCompletion:(SDWebImageNoParamsBlock)completion }); } -- (void)cleanDisk { - [self cleanDiskWithCompletionBlock:nil]; +- (void)deleteOldFiles { + [self deleteOldFilesWithCompletionBlock:nil]; } -- (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { +- (void)deleteOldFilesWithCompletionBlock:(nullable SDWebImageNoParamsBlock)completionBlock { dispatch_async(self.ioQueue, ^{ NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; - NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; + NSArray *resourceKeys = @[NSURLIsDirectoryKey, NSURLContentModificationDateKey, NSURLTotalFileAllocatedSizeKey]; // This enumerator prefetches useful properties for our cache files. NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtURL:diskCacheURL @@ -518,20 +494,21 @@ - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:NULL]; - NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.maxCacheAge]; - NSMutableDictionary *cacheFiles = [NSMutableDictionary dictionary]; + NSDate *expirationDate = [NSDate dateWithTimeIntervalSinceNow:-self.config.maxCacheAge]; + NSMutableDictionary *> *cacheFiles = [NSMutableDictionary dictionary]; NSUInteger currentCacheSize = 0; // Enumerate all of the files in the cache directory. This loop has two purposes: // // 1. Removing files that are older than the expiration date. // 2. Storing file attributes for the size-based cleanup pass. - NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; + NSMutableArray *urlsToDelete = [[NSMutableArray alloc] init]; for (NSURL *fileURL in fileEnumerator) { - NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:NULL]; + NSError *error; + NSDictionary *resourceValues = [fileURL resourceValuesForKeys:resourceKeys error:&error]; - // Skip directories. - if ([resourceValues[NSURLIsDirectoryKey] boolValue]) { + // Skip directories and errors. + if (error || !resourceValues || [resourceValues[NSURLIsDirectoryKey] boolValue]) { continue; } @@ -544,8 +521,8 @@ - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { // Store a reference to this file and account for its total size. NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize += [totalAllocatedSize unsignedIntegerValue]; - [cacheFiles setObject:resourceValues forKey:fileURL]; + currentCacheSize += totalAllocatedSize.unsignedIntegerValue; + cacheFiles[fileURL] = resourceValues; } for (NSURL *fileURL in urlsToDelete) { @@ -554,22 +531,22 @@ - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { // If our remaining disk cache exceeds a configured maximum size, perform a second // size-based cleanup pass. We delete the oldest files first. - if (self.maxCacheSize > 0 && currentCacheSize > self.maxCacheSize) { + if (self.config.maxCacheSize > 0 && currentCacheSize > self.config.maxCacheSize) { // Target half of our maximum cache size for this cleanup pass. - const NSUInteger desiredCacheSize = self.maxCacheSize / 2; + const NSUInteger desiredCacheSize = self.config.maxCacheSize / 2; // Sort the remaining cache files by their last modification time (oldest first). - NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent - usingComparator:^NSComparisonResult(id obj1, id obj2) { - return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; - }]; + NSArray *sortedFiles = [cacheFiles keysSortedByValueWithOptions:NSSortConcurrent + usingComparator:^NSComparisonResult(id obj1, id obj2) { + return [obj1[NSURLContentModificationDateKey] compare:obj2[NSURLContentModificationDateKey]]; + }]; // Delete files until we fall below our desired cache size. for (NSURL *fileURL in sortedFiles) { if ([_fileManager removeItemAtURL:fileURL error:nil]) { - NSDictionary *resourceValues = cacheFiles[fileURL]; + NSDictionary *resourceValues = cacheFiles[fileURL]; NSNumber *totalAllocatedSize = resourceValues[NSURLTotalFileAllocatedSizeKey]; - currentCacheSize -= [totalAllocatedSize unsignedIntegerValue]; + currentCacheSize -= totalAllocatedSize.unsignedIntegerValue; if (currentCacheSize < desiredCacheSize) { break; @@ -585,7 +562,8 @@ - (void)cleanDiskWithCompletionBlock:(SDWebImageNoParamsBlock)completionBlock { }); } -- (void)backgroundCleanDisk { +#if SD_UIKIT +- (void)backgroundDeleteOldFiles { Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { return; @@ -599,11 +577,14 @@ - (void)backgroundCleanDisk { }]; // Start the long-running task and return immediately. - [self cleanDiskWithCompletionBlock:^{ + [self deleteOldFilesWithCompletionBlock:^{ [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; } +#endif + +#pragma mark - Cache Info - (NSUInteger)getSize { __block NSUInteger size = 0; @@ -611,7 +592,7 @@ - (NSUInteger)getSize { NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; for (NSString *fileName in fileEnumerator) { NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName]; - NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; + NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; size += [attrs fileSize]; } }); @@ -622,12 +603,12 @@ - (NSUInteger)getDiskCount { __block NSUInteger count = 0; dispatch_sync(self.ioQueue, ^{ NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath]; - count = [[fileEnumerator allObjects] count]; + count = fileEnumerator.allObjects.count; }); return count; } -- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock { +- (void)calculateSizeWithCompletionBlock:(nullable SDWebImageCalculateSizeBlock)completionBlock { NSURL *diskCacheURL = [NSURL fileURLWithPath:self.diskCachePath isDirectory:YES]; dispatch_async(self.ioQueue, ^{ @@ -642,7 +623,7 @@ - (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completio for (NSURL *fileURL in fileEnumerator) { NSNumber *fileSize; [fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:NULL]; - totalSize += [fileSize unsignedIntegerValue]; + totalSize += fileSize.unsignedIntegerValue; fileCount += 1; } @@ -655,3 +636,4 @@ - (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completio } @end + diff --git a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h new file mode 100644 index 0000000..fd83527 --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.h @@ -0,0 +1,40 @@ +// +// SDImageCacheConfig.h +// SDWebImage +// +// Created by Bogdan on 09/09/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import +#import "SDWebImageCompat.h" + +@interface SDImageCacheConfig : NSObject + +/** + * Decompressing images that are downloaded and cached can improve performance but can consume lot of memory. + * Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption. + */ +@property (assign, nonatomic) BOOL shouldDecompressImages; + +/** + * disable iCloud backup [defaults to YES] + */ +@property (assign, nonatomic) BOOL shouldDisableiCloud; + +/** + * use memory cache [defaults to YES] + */ +@property (assign, nonatomic) BOOL shouldCacheImagesInMemory; + +/** + * The maximum length of time to keep an image in the cache, in seconds + */ +@property (assign, nonatomic) NSInteger maxCacheAge; + +/** + * The maximum size of the cache, in bytes. + */ +@property (assign, nonatomic) NSUInteger maxCacheSize; + +@end diff --git a/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m new file mode 100644 index 0000000..c154265 --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/SDImageCacheConfig.m @@ -0,0 +1,26 @@ +// +// SDImageCacheConfig.m +// SDWebImage +// +// Created by Bogdan on 09/09/16. +// Copyright © 2016 Dailymotion. All rights reserved. +// + +#import "SDImageCacheConfig.h" + +static const NSInteger kDefaultCacheMaxCacheAge = 60 * 60 * 24 * 7; // 1 week + +@implementation SDImageCacheConfig + +- (instancetype)init { + if (self = [super init]) { + _shouldDecompressImages = YES; + _shouldDisableiCloud = YES; + _shouldCacheImagesInMemory = YES; + _maxCacheAge = kDefaultCacheMaxCacheAge; + _maxCacheSize = 0; + } + return self; +} + +@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h index 3c21b41..f555c27 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.h @@ -10,25 +10,67 @@ #import #ifdef __OBJC_GC__ -#error SDWebImage does not support Objective-C Garbage Collection + #error SDWebImage does not support Objective-C Garbage Collection #endif -#if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 -#error SDWebImage doesn't support Deployment Target version < 5.0 +// Apple's defines from TargetConditionals.h are a bit weird. +// Seems like TARGET_OS_MAC is always defined (on all platforms). +// To determine if we are running on OSX, we can only relly on TARGET_OS_IPHONE=0 and all the other platforms +#if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH + #define SD_MAC 1 +#else + #define SD_MAC 0 #endif -#if !TARGET_OS_IPHONE -#import -#ifndef UIImage -#define UIImage NSImage +// iOS and tvOS are very similar, UIKit exists on both platforms +// Note: watchOS also has UIKit, but it's very limited +#if TARGET_OS_IOS || TARGET_OS_TV + #define SD_UIKIT 1 +#else + #define SD_UIKIT 0 +#endif + +#if TARGET_OS_IOS + #define SD_IOS 1 +#else + #define SD_IOS 0 #endif -#ifndef UIImageView -#define UIImageView NSImageView + +#if TARGET_OS_TV + #define SD_TV 1 +#else + #define SD_TV 0 #endif + +#if TARGET_OS_WATCH + #define SD_WATCH 1 #else + #define SD_WATCH 0 +#endif -#import +#if SD_MAC + #import + #ifndef UIImage + #define UIImage NSImage + #endif + #ifndef UIImageView + #define UIImageView NSImageView + #endif + #ifndef UIView + #define UIView NSView + #endif +#else + #if __IPHONE_OS_VERSION_MIN_REQUIRED != 20000 && __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0 + #error SDWebImage doesn't support Deployment Target version < 5.0 + #endif + + #if SD_UIKIT + #import + #endif + #if SD_WATCH + #import + #endif #endif #ifndef NS_ENUM @@ -45,10 +87,10 @@ #define SDDispatchQueueRelease(q) #define SDDispatchQueueSetterSementics strong #else -#undef SDDispatchQueueRelease -#undef SDDispatchQueueSetterSementics -#define SDDispatchQueueRelease(q) (dispatch_release(q)) -#define SDDispatchQueueSetterSementics assign + #undef SDDispatchQueueRelease + #undef SDDispatchQueueSetterSementics + #define SDDispatchQueueRelease(q) (dispatch_release(q)) + #define SDDispatchQueueSetterSementics assign #endif extern UIImage *SDScaledImageForKey(NSString *key, UIImage *image); @@ -57,16 +99,13 @@ typedef void(^SDWebImageNoParamsBlock)(); extern NSString *const SDWebImageErrorDomain; -#define dispatch_main_sync_safe(block)\ - if ([NSThread isMainThread]) {\ - block();\ - } else {\ - dispatch_sync(dispatch_get_main_queue(), block);\ - } - +#ifndef dispatch_main_async_safe #define dispatch_main_async_safe(block)\ - if ([NSThread isMainThread]) {\ + if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {\ block();\ } else {\ dispatch_async(dispatch_get_main_queue(), block);\ } +#endif + +static int64_t kAsyncTestTimeout = 5; diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m index 57d9413..ade04be 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageCompat.m @@ -1,10 +1,10 @@ -// -// SDWebImageCompat.m -// SDWebImage -// -// Created by Olivier Poitrey on 11/12/12. -// Copyright (c) 2012 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "SDWebImageCompat.h" @@ -12,13 +12,16 @@ #error SDWebImage is ARC only. Either turn on ARC for the project or use -fobjc-arc flag #endif -inline UIImage *SDScaledImageForKey(NSString *key, UIImage *image) { +inline UIImage *SDScaledImageForKey(NSString * _Nullable key, UIImage * _Nullable image) { if (!image) { return nil; } - if ([image.images count] > 0) { - NSMutableArray *scaledImages = [NSMutableArray array]; +#if SD_MAC + return image; +#elif SD_UIKIT || SD_WATCH + if ((image.images).count > 0) { + NSMutableArray *scaledImages = [NSMutableArray array]; for (UIImage *tempImage in image.images) { [scaledImages addObject:SDScaledImageForKey(key, tempImage)]; @@ -27,7 +30,11 @@ return [UIImage animatedImageWithImages:scaledImages duration:image.duration]; } else { +#if SD_WATCH + if ([[WKInterfaceDevice currentDevice] respondsToSelector:@selector(screenScale)]) { +#elif SD_UIKIT if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { +#endif CGFloat scale = 1; if (key.length >= 8) { NSRange range = [key rangeOfString:@"@2x."]; @@ -46,6 +53,7 @@ } return image; } +#endif } NSString *const SDWebImageErrorDomain = @"SDWebImageErrorDomain"; diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h index 0176a7b..8f8df86 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.h @@ -1,8 +1,7 @@ /* * This file is part of the SDWebImage package. * (c) Olivier Poitrey - * - * Created by james on 9/28/11. + * (c) james * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -13,6 +12,8 @@ @interface UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image; ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image; + ++ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image; @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m index 2bb5472..cf5e676 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDecoder.m @@ -1,8 +1,7 @@ /* * This file is part of the SDWebImage package. * (c) Olivier Poitrey - * - * Created by james on 9/28/11. + * (c) james * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -12,53 +11,25 @@ @implementation UIImage (ForceDecode) -+ (UIImage *)decodedImageWithImage:(UIImage *)image { - // while downloading huge amount of images - // autorelease the bitmap context - // and all vars to help system to free memory - // when there are memory warning. - // on iOS7, do not forget to call - // [[SDImageCache sharedImageCache] clearMemory]; - - if (image == nil) { // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error - return nil; +#if SD_UIKIT || SD_WATCH +static const size_t kBytesPerPixel = 4; +static const size_t kBitsPerComponent = 8; + ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { + if (![UIImage shouldDecodeImage:image]) { + return image; } + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; @autoreleasepool{ - // do not decode animated images - if (image.images != nil) { - return image; - } CGImageRef imageRef = image.CGImage; - - CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); - BOOL anyAlpha = (alpha == kCGImageAlphaFirst || - alpha == kCGImageAlphaLast || - alpha == kCGImageAlphaPremultipliedFirst || - alpha == kCGImageAlphaPremultipliedLast); - if (anyAlpha) { - return image; - } - - // current - CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); - CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); - - BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || - imageColorSpaceModel == kCGColorSpaceModelMonochrome || - imageColorSpaceModel == kCGColorSpaceModelCMYK || - imageColorSpaceModel == kCGColorSpaceModelIndexed); - if (unsupportedColorSpace) { - colorspaceRef = CGColorSpaceCreateDeviceRGB(); - } + CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:imageRef]; size_t width = CGImageGetWidth(imageRef); size_t height = CGImageGetHeight(imageRef); - NSUInteger bytesPerPixel = 4; - NSUInteger bytesPerRow = bytesPerPixel * width; - NSUInteger bitsPerComponent = 8; - + size_t bytesPerRow = kBytesPerPixel * width; // kCGImageAlphaNone is not supported in CGBitmapContextCreate. // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast @@ -66,10 +37,13 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image { CGContextRef context = CGBitmapContextCreate(NULL, width, height, - bitsPerComponent, + kBitsPerComponent, bytesPerRow, colorspaceRef, kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); + if (context == NULL) { + return image; + } // Draw the image into the context and retrieve the new bitmap image without alpha CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); @@ -78,10 +52,6 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image { scale:image.scale orientation:image.imageOrientation]; - if (unsupportedColorSpace) { - CGColorSpaceRelease(colorspaceRef); - } - CGContextRelease(context); CGImageRelease(imageRefWithoutAlpha); @@ -89,4 +59,221 @@ + (UIImage *)decodedImageWithImage:(UIImage *)image { } } +/* + * Defines the maximum size in MB of the decoded image when the flag `SDWebImageScaleDownLargeImages` is set + * Suggested value for iPad1 and iPhone 3GS: 60. + * Suggested value for iPad2 and iPhone 4: 120. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 30. + */ +static const CGFloat kDestImageSizeMB = 60.0f; + +/* + * Defines the maximum size in MB of a tile used to decode image when the flag `SDWebImageScaleDownLargeImages` is set + * Suggested value for iPad1 and iPhone 3GS: 20. + * Suggested value for iPad2 and iPhone 4: 40. + * Suggested value for iPhone 3G and iPod 2 and earlier devices: 10. + */ +static const CGFloat kSourceImageTileSizeMB = 20.0f; + +static const CGFloat kBytesPerMB = 1024.0f * 1024.0f; +static const CGFloat kPixelsPerMB = kBytesPerMB / kBytesPerPixel; +static const CGFloat kDestTotalPixels = kDestImageSizeMB * kPixelsPerMB; +static const CGFloat kTileTotalPixels = kSourceImageTileSizeMB * kPixelsPerMB; + +static const CGFloat kDestSeemOverlap = 2.0f; // the numbers of pixels to overlap the seems where tiles meet. + ++ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { + if (![UIImage shouldDecodeImage:image]) { + return image; + } + + if (![UIImage shouldScaleDownImage:image]) { + return [UIImage decodedImageWithImage:image]; + } + + CGContextRef destContext; + + // autorelease the bitmap context and all vars to help system to free memory when there are memory warning. + // on iOS7, do not forget to call [[SDImageCache sharedImageCache] clearMemory]; + @autoreleasepool { + CGImageRef sourceImageRef = image.CGImage; + + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + // Determine the scale ratio to apply to the input image + // that results in an output image of the defined size. + // see kDestImageSizeMB, and how it relates to destTotalPixels. + float imageScale = kDestTotalPixels / sourceTotalPixels; + CGSize destResolution = CGSizeZero; + destResolution.width = (int)(sourceResolution.width*imageScale); + destResolution.height = (int)(sourceResolution.height*imageScale); + + // current color space + CGColorSpaceRef colorspaceRef = [UIImage colorSpaceForImageRef:sourceImageRef]; + + size_t bytesPerRow = kBytesPerPixel * destResolution.width; + + // Allocate enough pixel data to hold the output image. + void* destBitmapData = malloc( bytesPerRow * destResolution.height ); + if (destBitmapData == NULL) { + return image; + } + + // kCGImageAlphaNone is not supported in CGBitmapContextCreate. + // Since the original image here has no alpha info, use kCGImageAlphaNoneSkipLast + // to create bitmap graphics contexts without alpha info. + destContext = CGBitmapContextCreate(destBitmapData, + destResolution.width, + destResolution.height, + kBitsPerComponent, + bytesPerRow, + colorspaceRef, + kCGBitmapByteOrderDefault|kCGImageAlphaNoneSkipLast); + + if (destContext == NULL) { + free(destBitmapData); + return image; + } + CGContextSetInterpolationQuality(destContext, kCGInterpolationHigh); + + // Now define the size of the rectangle to be used for the + // incremental blits from the input image to the output image. + // we use a source tile width equal to the width of the source + // image due to the way that iOS retrieves image data from disk. + // iOS must decode an image from disk in full width 'bands', even + // if current graphics context is clipped to a subrect within that + // band. Therefore we fully utilize all of the pixel data that results + // from a decoding opertion by achnoring our tile size to the full + // width of the input image. + CGRect sourceTile = CGRectZero; + sourceTile.size.width = sourceResolution.width; + // The source tile height is dynamic. Since we specified the size + // of the source tile in MB, see how many rows of pixels high it + // can be given the input image width. + sourceTile.size.height = (int)(kTileTotalPixels / sourceTile.size.width ); + sourceTile.origin.x = 0.0f; + // The output tile is the same proportions as the input tile, but + // scaled to image scale. + CGRect destTile; + destTile.size.width = destResolution.width; + destTile.size.height = sourceTile.size.height * imageScale; + destTile.origin.x = 0.0f; + // The source seem overlap is proportionate to the destination seem overlap. + // this is the amount of pixels to overlap each tile as we assemble the ouput image. + float sourceSeemOverlap = (int)((kDestSeemOverlap/destResolution.height)*sourceResolution.height); + CGImageRef sourceTileImageRef; + // calculate the number of read/write operations required to assemble the + // output image. + int iterations = (int)( sourceResolution.height / sourceTile.size.height ); + // If tile height doesn't divide the image height evenly, add another iteration + // to account for the remaining pixels. + int remainder = (int)sourceResolution.height % (int)sourceTile.size.height; + if(remainder) { + iterations++; + } + // Add seem overlaps to the tiles, but save the original tile height for y coordinate calculations. + float sourceTileHeightMinusOverlap = sourceTile.size.height; + sourceTile.size.height += sourceSeemOverlap; + destTile.size.height += kDestSeemOverlap; + for( int y = 0; y < iterations; ++y ) { + @autoreleasepool { + sourceTile.origin.y = y * sourceTileHeightMinusOverlap + sourceSeemOverlap; + destTile.origin.y = destResolution.height - (( y + 1 ) * sourceTileHeightMinusOverlap * imageScale + kDestSeemOverlap); + sourceTileImageRef = CGImageCreateWithImageInRect( sourceImageRef, sourceTile ); + if( y == iterations - 1 && remainder ) { + float dify = destTile.size.height; + destTile.size.height = CGImageGetHeight( sourceTileImageRef ) * imageScale; + dify -= destTile.size.height; + destTile.origin.y += dify; + } + CGContextDrawImage( destContext, destTile, sourceTileImageRef ); + CGImageRelease( sourceTileImageRef ); + } + } + + CGImageRef destImageRef = CGBitmapContextCreateImage(destContext); + CGContextRelease(destContext); + if (destImageRef == NULL) { + return image; + } + UIImage *destImage = [UIImage imageWithCGImage:destImageRef scale:image.scale orientation:image.imageOrientation]; + CGImageRelease(destImageRef); + if (destImage == nil) { + return image; + } + return destImage; + } +} + ++ (BOOL)shouldDecodeImage:(nullable UIImage *)image { + // Prevent "CGBitmapContextCreateImage: invalid context 0x0" error + if (image == nil) { + return NO; + } + + // do not decode animated images + if (image.images != nil) { + return NO; + } + + CGImageRef imageRef = image.CGImage; + + CGImageAlphaInfo alpha = CGImageGetAlphaInfo(imageRef); + BOOL anyAlpha = (alpha == kCGImageAlphaFirst || + alpha == kCGImageAlphaLast || + alpha == kCGImageAlphaPremultipliedFirst || + alpha == kCGImageAlphaPremultipliedLast); + // do not decode images with alpha + if (anyAlpha) { + return NO; + } + + return YES; +} + ++ (BOOL)shouldScaleDownImage:(nonnull UIImage *)image { + BOOL shouldScaleDown = YES; + + CGImageRef sourceImageRef = image.CGImage; + CGSize sourceResolution = CGSizeZero; + sourceResolution.width = CGImageGetWidth(sourceImageRef); + sourceResolution.height = CGImageGetHeight(sourceImageRef); + float sourceTotalPixels = sourceResolution.width * sourceResolution.height; + float imageScale = kDestTotalPixels / sourceTotalPixels; + if (imageScale < 1) { + shouldScaleDown = YES; + } else { + shouldScaleDown = NO; + } + + return shouldScaleDown; +} + ++ (CGColorSpaceRef)colorSpaceForImageRef:(CGImageRef)imageRef { + // current + CGColorSpaceModel imageColorSpaceModel = CGColorSpaceGetModel(CGImageGetColorSpace(imageRef)); + CGColorSpaceRef colorspaceRef = CGImageGetColorSpace(imageRef); + + BOOL unsupportedColorSpace = (imageColorSpaceModel == kCGColorSpaceModelUnknown || + imageColorSpaceModel == kCGColorSpaceModelMonochrome || + imageColorSpaceModel == kCGColorSpaceModelCMYK || + imageColorSpaceModel == kCGColorSpaceModelIndexed); + if (unsupportedColorSpace) { + colorspaceRef = CGColorSpaceCreateDeviceRGB(); + CFAutorelease(colorspaceRef); + } + return colorspaceRef; +} +#elif SD_MAC ++ (nullable UIImage *)decodedImageWithImage:(nullable UIImage *)image { + return image; +} + ++ (nullable UIImage *)decodedAndScaledDownImageWithImage:(nullable UIImage *)image { + return image; +} +#endif + @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h index d440e04..94bc76e 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.h @@ -49,6 +49,11 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageDownloaderOptions) { * Put the image in the high priority queue. */ SDWebImageDownloaderHighPriority = 1 << 7, + + /** + * Scale down the image + */ + SDWebImageDownloaderScaleDownLargeImages = 1 << 8, }; typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { @@ -63,14 +68,28 @@ typedef NS_ENUM(NSInteger, SDWebImageDownloaderExecutionOrder) { SDWebImageDownloaderLIFOExecutionOrder }; -extern NSString *const SDWebImageDownloadStartNotification; -extern NSString *const SDWebImageDownloadStopNotification; +extern NSString * _Nonnull const SDWebImageDownloadStartNotification; +extern NSString * _Nonnull const SDWebImageDownloadStopNotification; + +typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL); + +typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished); + +typedef NSDictionary SDHTTPHeadersDictionary; +typedef NSMutableDictionary SDHTTPHeadersMutableDictionary; -typedef void(^SDWebImageDownloaderProgressBlock)(NSInteger receivedSize, NSInteger expectedSize); +typedef SDHTTPHeadersDictionary * _Nullable (^SDWebImageDownloaderHeadersFilterBlock)(NSURL * _Nullable url, SDHTTPHeadersDictionary * _Nullable headers); -typedef void(^SDWebImageDownloaderCompletedBlock)(UIImage *image, NSData *data, NSError *error, BOOL finished); +/** + * A token associated with each download. Can be used to cancel a download + */ +@interface SDWebImageDownloadToken : NSObject + +@property (nonatomic, strong, nullable) NSURL *url; +@property (nonatomic, strong, nullable) id downloadOperationCancelToken; + +@end -typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDictionary *headers); /** * Asynchronous downloader dedicated and optimized for image loading. @@ -83,6 +102,9 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi */ @property (assign, nonatomic) BOOL shouldDecompressImages; +/** + * The maximum number of concurrent downloads + */ @property (assign, nonatomic) NSInteger maxConcurrentDownloads; /** @@ -107,22 +129,22 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * * @return global shared instance of downloader class */ -+ (SDWebImageDownloader *)sharedDownloader; ++ (nonnull instancetype)sharedDownloader; /** * Set the default URL credential to be set for request operations. */ -@property (strong, nonatomic) NSURLCredential *urlCredential; +@property (strong, nonatomic, nullable) NSURLCredential *urlCredential; /** * Set username */ -@property (strong, nonatomic) NSString *username; +@property (strong, nonatomic, nullable) NSString *username; /** * Set password */ -@property (strong, nonatomic) NSString *password; +@property (strong, nonatomic, nullable) NSString *password; /** * Set filter to pick headers for downloading image HTTP request. @@ -130,7 +152,14 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * This block will be invoked for each downloading image request, returned * NSDictionary will be used as headers in corresponding HTTP request. */ -@property (nonatomic, copy) SDWebImageDownloaderHeadersFilterBlock headersFilter; +@property (nonatomic, copy, nullable) SDWebImageDownloaderHeadersFilterBlock headersFilter; + +/** + * Creates an instance of a downloader with specified session configuration. + * *Note*: `timeoutIntervalForRequest` is going to be overwritten. + * @return new instance of downloader class + */ +- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration NS_DESIGNATED_INITIALIZER; /** * Set a value for a HTTP header to be appended to each download HTTP request. @@ -138,14 +167,14 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * @param value The value for the header field. Use `nil` value to remove the header. * @param field The name of the header field to set. */ -- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field; +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field; /** * Returns the value of the specified HTTP header field. * * @return The value associated with the header field field, or `nil` if there is no corresponding header field. */ -- (NSString *)valueForHTTPHeaderField:(NSString *)field; +- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field; /** * Sets a subclass of `SDWebImageDownloaderOperation` as the default @@ -155,7 +184,7 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * @param operationClass The subclass of `SDWebImageDownloaderOperation` to set * as default. Passing `nil` will revert to `SDWebImageDownloaderOperation`. */ -- (void)setOperationClass:(Class)operationClass; +- (void)setOperationClass:(nullable Class)operationClass; /** * Creates a SDWebImageDownloader async downloader instance with a given URL @@ -167,6 +196,7 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * @param url The URL to the image to download * @param options The options to be used for this download * @param progressBlock A block called repeatedly while the image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called once the download is completed. * If the download succeeded, the image parameter is set, in case of error, * error parameter is set with the error. The last parameter is always YES @@ -176,12 +206,19 @@ typedef NSDictionary *(^SDWebImageDownloaderHeadersFilterBlock)(NSURL *url, NSDi * before to be called a last time with the full image and finished argument * set to YES. In case of error, the finished argument is always YES. * - * @return A cancellable SDWebImageOperation + * @return A token (SDWebImageDownloadToken) that can be passed to -cancel: to cancel this operation + */ +- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; + +/** + * Cancels a download that was previously queued using -downloadImageWithURL:options:progress:completed: + * + * @param token The token received from -downloadImageWithURL:options:progress:completed: that should be canceled. */ -- (id )downloadImageWithURL:(NSURL *)url - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock; +- (void)cancel:(nullable SDWebImageDownloadToken *)token; /** * Sets the download queue suspension state diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m index 96aefa7..189d163 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloader.m @@ -10,18 +10,22 @@ #import "SDWebImageDownloaderOperation.h" #import -static NSString *const kProgressCallbackKey = @"progress"; -static NSString *const kCompletedCallbackKey = @"completed"; +@implementation SDWebImageDownloadToken +@end + -@interface SDWebImageDownloader () +@interface SDWebImageDownloader () -@property (strong, nonatomic) NSOperationQueue *downloadQueue; -@property (weak, nonatomic) NSOperation *lastAddedOperation; -@property (assign, nonatomic) Class operationClass; -@property (strong, nonatomic) NSMutableDictionary *URLCallbacks; -@property (strong, nonatomic) NSMutableDictionary *HTTPHeaders; +@property (strong, nonatomic, nonnull) NSOperationQueue *downloadQueue; +@property (weak, nonatomic, nullable) NSOperation *lastAddedOperation; +@property (assign, nonatomic, nullable) Class operationClass; +@property (strong, nonatomic, nonnull) NSMutableDictionary *URLOperations; +@property (strong, nonatomic, nullable) SDHTTPHeadersMutableDictionary *HTTPHeaders; // This queue is used to serialize the handling of the network responses of all the download operation in a single queue -@property (SDDispatchQueueSetterSementics, nonatomic) dispatch_queue_t barrierQueue; +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; + +// The session in which data tasks will run +@property (strong, nonatomic) NSURLSession *session; @end @@ -50,7 +54,7 @@ + (void)initialize { } } -+ (SDWebImageDownloader *)sharedDownloader { ++ (nonnull instancetype)sharedDownloader { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -59,14 +63,19 @@ + (SDWebImageDownloader *)sharedDownloader { return instance; } -- (id)init { +- (nonnull instancetype)init { + return [self initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; +} + +- (nonnull instancetype)initWithSessionConfiguration:(nullable NSURLSessionConfiguration *)sessionConfiguration { if ((self = [super init])) { _operationClass = [SDWebImageDownloaderOperation class]; _shouldDecompressImages = YES; _executionOrder = SDWebImageDownloaderFIFOExecutionOrder; _downloadQueue = [NSOperationQueue new]; _downloadQueue.maxConcurrentOperationCount = 6; - _URLCallbacks = [NSMutableDictionary new]; + _downloadQueue.name = @"com.hackemist.SDWebImageDownloader"; + _URLOperations = [NSMutableDictionary new]; #ifdef SD_WEBP _HTTPHeaders = [@{@"Accept": @"image/webp,image/*;q=0.8"} mutableCopy]; #else @@ -74,16 +83,30 @@ - (id)init { #endif _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderBarrierQueue", DISPATCH_QUEUE_CONCURRENT); _downloadTimeout = 15.0; + + sessionConfiguration.timeoutIntervalForRequest = _downloadTimeout; + + /** + * Create the session for this task + * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate + * method calls and completion handler calls. + */ + self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration + delegate:self + delegateQueue:nil]; } return self; } - (void)dealloc { + [self.session invalidateAndCancel]; + self.session = nil; + [self.downloadQueue cancelAllOperations]; SDDispatchQueueRelease(_barrierQueue); } -- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { +- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(nullable NSString *)field { if (value) { self.HTTPHeaders[field] = value; } @@ -92,7 +115,7 @@ - (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field { } } -- (NSString *)valueForHTTPHeaderField:(NSString *)field { +- (nullable NSString *)valueForHTTPHeaderField:(nullable NSString *)field { return self.HTTPHeaders[field]; } @@ -108,16 +131,23 @@ - (NSInteger)maxConcurrentDownloads { return _downloadQueue.maxConcurrentOperationCount; } -- (void)setOperationClass:(Class)operationClass { - _operationClass = operationClass ?: [SDWebImageDownloaderOperation class]; +- (void)setOperationClass:(nullable Class)operationClass { + if (operationClass && [operationClass isSubclassOfClass:[NSOperation class]] && [operationClass conformsToProtocol:@protocol(SDWebImageDownloaderOperationInterface)]) { + _operationClass = operationClass; + } else { + _operationClass = [SDWebImageDownloaderOperation class]; + } } -- (id )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageDownloaderCompletedBlock)completedBlock { - __block SDWebImageDownloaderOperation *operation; - __weak __typeof(self)wself = self; +- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url + options:(SDWebImageDownloaderOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { + __weak SDWebImageDownloader *wself = self; - [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^{ - NSTimeInterval timeoutInterval = wself.downloadTimeout; + return [self addProgressCallback:progressBlock completedBlock:completedBlock forURL:url createCallback:^SDWebImageDownloaderOperation *{ + __strong __typeof (wself) sself = wself; + NSTimeInterval timeoutInterval = sself.downloadTimeout; if (timeoutInterval == 0.0) { timeoutInterval = 15.0; } @@ -126,56 +156,19 @@ - (void)setOperationClass:(Class)operationClass { NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:(options & SDWebImageDownloaderUseNSURLCache ? NSURLRequestUseProtocolCachePolicy : NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:timeoutInterval]; request.HTTPShouldHandleCookies = (options & SDWebImageDownloaderHandleCookies); request.HTTPShouldUsePipelining = YES; - if (wself.headersFilter) { - request.allHTTPHeaderFields = wself.headersFilter(url, [wself.HTTPHeaders copy]); + if (sself.headersFilter) { + request.allHTTPHeaderFields = sself.headersFilter(url, [sself.HTTPHeaders copy]); } else { - request.allHTTPHeaderFields = wself.HTTPHeaders; + request.allHTTPHeaderFields = sself.HTTPHeaders; } - operation = [[wself.operationClass alloc] initWithRequest:request - options:options - progress:^(NSInteger receivedSize, NSInteger expectedSize) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - __block NSArray *callbacksForURL; - dispatch_sync(sself.barrierQueue, ^{ - callbacksForURL = [sself.URLCallbacks[url] copy]; - }); - for (NSDictionary *callbacks in callbacksForURL) { - dispatch_async(dispatch_get_main_queue(), ^{ - SDWebImageDownloaderProgressBlock callback = callbacks[kProgressCallbackKey]; - if (callback) callback(receivedSize, expectedSize); - }); - } - } - completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { - SDWebImageDownloader *sself = wself; - if (!sself) return; - __block NSArray *callbacksForURL; - dispatch_barrier_sync(sself.barrierQueue, ^{ - callbacksForURL = [sself.URLCallbacks[url] copy]; - if (finished) { - [sself.URLCallbacks removeObjectForKey:url]; - } - }); - for (NSDictionary *callbacks in callbacksForURL) { - SDWebImageDownloaderCompletedBlock callback = callbacks[kCompletedCallbackKey]; - if (callback) callback(image, data, error, finished); - } - } - cancelled:^{ - SDWebImageDownloader *sself = wself; - if (!sself) return; - dispatch_barrier_async(sself.barrierQueue, ^{ - [sself.URLCallbacks removeObjectForKey:url]; - }); - }]; - operation.shouldDecompressImages = wself.shouldDecompressImages; + SDWebImageDownloaderOperation *operation = [[sself.operationClass alloc] initWithRequest:request inSession:sself.session options:options]; + operation.shouldDecompressImages = sself.shouldDecompressImages; - if (wself.urlCredential) { - operation.credential = wself.urlCredential; - } else if (wself.username && wself.password) { - operation.credential = [NSURLCredential credentialWithUser:wself.username password:wself.password persistence:NSURLCredentialPersistenceForSession]; + if (sself.urlCredential) { + operation.credential = sself.urlCredential; + } else if (sself.username && sself.password) { + operation.credential = [NSURLCredential credentialWithUser:sself.username password:sself.password persistence:NSURLCredentialPersistenceForSession]; } if (options & SDWebImageDownloaderHighPriority) { @@ -184,53 +177,139 @@ - (void)setOperationClass:(Class)operationClass { operation.queuePriority = NSOperationQueuePriorityLow; } - [wself.downloadQueue addOperation:operation]; - if (wself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { + [sself.downloadQueue addOperation:operation]; + if (sself.executionOrder == SDWebImageDownloaderLIFOExecutionOrder) { // Emulate LIFO execution order by systematically adding new operations as last operation's dependency - [wself.lastAddedOperation addDependency:operation]; - wself.lastAddedOperation = operation; + [sself.lastAddedOperation addDependency:operation]; + sself.lastAddedOperation = operation; } + + return operation; }]; +} - return operation; +- (void)cancel:(nullable SDWebImageDownloadToken *)token { + dispatch_barrier_async(self.barrierQueue, ^{ + SDWebImageDownloaderOperation *operation = self.URLOperations[token.url]; + BOOL canceled = [operation cancel:token.downloadOperationCancelToken]; + if (canceled) { + [self.URLOperations removeObjectForKey:token.url]; + } + }); } -- (void)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock forURL:(NSURL *)url createCallback:(SDWebImageNoParamsBlock)createCallback { +- (nullable SDWebImageDownloadToken *)addProgressCallback:(SDWebImageDownloaderProgressBlock)progressBlock + completedBlock:(SDWebImageDownloaderCompletedBlock)completedBlock + forURL:(nullable NSURL *)url + createCallback:(SDWebImageDownloaderOperation *(^)())createCallback { // The URL will be used as the key to the callbacks dictionary so it cannot be nil. If it is nil immediately call the completed block with no image or data. if (url == nil) { if (completedBlock != nil) { completedBlock(nil, nil, nil, NO); } - return; + return nil; } - dispatch_barrier_sync(self.barrierQueue, ^{ - BOOL first = NO; - if (!self.URLCallbacks[url]) { - self.URLCallbacks[url] = [NSMutableArray new]; - first = YES; - } + __block SDWebImageDownloadToken *token = nil; - // Handle single download of simultaneous download request for the same URL - NSMutableArray *callbacksForURL = self.URLCallbacks[url]; - NSMutableDictionary *callbacks = [NSMutableDictionary new]; - if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; - if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; - [callbacksForURL addObject:callbacks]; - self.URLCallbacks[url] = callbacksForURL; + dispatch_barrier_sync(self.barrierQueue, ^{ + SDWebImageDownloaderOperation *operation = self.URLOperations[url]; + if (!operation) { + operation = createCallback(); + self.URLOperations[url] = operation; - if (first) { - createCallback(); + __weak SDWebImageDownloaderOperation *woperation = operation; + operation.completionBlock = ^{ + SDWebImageDownloaderOperation *soperation = woperation; + if (!soperation) return; + if (self.URLOperations[url] == soperation) { + [self.URLOperations removeObjectForKey:url]; + }; + }; } + id downloadOperationCancelToken = [operation addHandlersForProgress:progressBlock completed:completedBlock]; + + token = [SDWebImageDownloadToken new]; + token.url = url; + token.downloadOperationCancelToken = downloadOperationCancelToken; }); + + return token; } - (void)setSuspended:(BOOL)suspended { - [self.downloadQueue setSuspended:suspended]; + (self.downloadQueue).suspended = suspended; } - (void)cancelAllDownloads { [self.downloadQueue cancelAllOperations]; } +#pragma mark Helper methods + +- (SDWebImageDownloaderOperation *)operationWithTask:(NSURLSessionTask *)task { + SDWebImageDownloaderOperation *returnOperation = nil; + for (SDWebImageDownloaderOperation *operation in self.downloadQueue.operations) { + if (operation.dataTask.taskIdentifier == task.taskIdentifier) { + returnOperation = operation; + break; + } + } + return returnOperation; +} + +#pragma mark NSURLSessionDataDelegate + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; + + [dataOperation URLSession:session dataTask:dataTask didReceiveResponse:response completionHandler:completionHandler]; +} + +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { + + // Identify the operation that runs this task and pass it the delegate method + SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; + + [dataOperation URLSession:session dataTask:dataTask didReceiveData:data]; +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:dataTask]; + + [dataOperation URLSession:session dataTask:dataTask willCacheResponse:proposedResponse completionHandler:completionHandler]; +} + +#pragma mark NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { + // Identify the operation that runs this task and pass it the delegate method + SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; + + [dataOperation URLSession:session task:task didCompleteWithError:error]; +} + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler { + + completionHandler(request); +} + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { + + // Identify the operation that runs this task and pass it the delegate method + SDWebImageDownloaderOperation *dataOperation = [self operationWithTask:task]; + + [dataOperation URLSession:session task:task didReceiveChallenge:challenge completionHandler:completionHandler]; +} + @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h index dd48b22..b190855 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.h @@ -10,34 +10,61 @@ #import "SDWebImageDownloader.h" #import "SDWebImageOperation.h" -extern NSString *const SDWebImageDownloadStartNotification; -extern NSString *const SDWebImageDownloadReceiveResponseNotification; -extern NSString *const SDWebImageDownloadStopNotification; -extern NSString *const SDWebImageDownloadFinishNotification; +extern NSString * _Nonnull const SDWebImageDownloadStartNotification; +extern NSString * _Nonnull const SDWebImageDownloadReceiveResponseNotification; +extern NSString * _Nonnull const SDWebImageDownloadStopNotification; +extern NSString * _Nonnull const SDWebImageDownloadFinishNotification; -@interface SDWebImageDownloaderOperation : NSOperation + + +/** + Describes a downloader operation. If one wants to use a custom downloader op, it needs to inherit from `NSOperation` and conform to this protocol + */ +@protocol SDWebImageDownloaderOperationInterface + +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options; + +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; + +- (BOOL)shouldDecompressImages; +- (void)setShouldDecompressImages:(BOOL)value; + +- (nullable NSURLCredential *)credential; +- (void)setCredential:(nullable NSURLCredential *)value; + +@end + + +@interface SDWebImageDownloaderOperation : NSOperation + +/** + * The request used by the operation's task. + */ +@property (strong, nonatomic, readonly, nullable) NSURLRequest *request; /** - * The request used by the operation's connection. + * The operation's task */ -@property (strong, nonatomic, readonly) NSURLRequest *request; +@property (strong, nonatomic, readonly, nullable) NSURLSessionTask *dataTask; @property (assign, nonatomic) BOOL shouldDecompressImages; /** - * Whether the URL connection should consult the credential storage for authenticating the connection. `YES` by default. - * - * This is the value that is returned in the `NSURLConnectionDelegate` method `-connectionShouldUseCredentialStorage:`. + * Was used to determine whether the URL connection should consult the credential storage for authenticating the connection. + * @deprecated Not used for a couple of versions */ -@property (nonatomic, assign) BOOL shouldUseCredentialStorage; +@property (nonatomic, assign) BOOL shouldUseCredentialStorage __deprecated_msg("Property deprecated. Does nothing. Kept only for backwards compatibility"); /** * The credential used for authentication challenges in `-connection:didReceiveAuthenticationChallenge:`. * * This will be overridden by any shared credentials that exist for the username or password of the request URL, if present. */ -@property (nonatomic, strong) NSURLCredential *credential; +@property (nonatomic, strong, nullable) NSURLCredential *credential; /** * The SDWebImageDownloaderOptions for the receiver. @@ -52,7 +79,7 @@ extern NSString *const SDWebImageDownloadFinishNotification; /** * The response returned by the operation's connection. */ -@property (strong, nonatomic) NSURLResponse *response; +@property (strong, nonatomic, nullable) NSURLResponse *response; /** * Initializes a `SDWebImageDownloaderOperation` object @@ -60,19 +87,36 @@ extern NSString *const SDWebImageDownloadFinishNotification; * @see SDWebImageDownloaderOperation * * @param request the URL request + * @param session the URL session in which this operation will run * @param options downloader options - * @param progressBlock the block executed when a new chunk of data arrives. + * + * @return the initialized instance + */ +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options NS_DESIGNATED_INITIALIZER; + +/** + * Adds handlers for progress and completion. Returns a tokent that can be passed to -cancel: to cancel this set of + * callbacks. + * + * @param progressBlock the block executed when a new chunk of data arrives. * @note the progress block is executed on a background queue - * @param completedBlock the block executed when the download is done. + * @param completedBlock the block executed when the download is done. * @note the completed block is executed on the main queue for success. If errors are found, there is a chance the block will be executed on a background queue - * @param cancelBlock the block executed if the download (operation) is cancelled * - * @return the initialized instance + * @return the token to use to cancel this set of handlers + */ +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock; + +/** + * Cancels a set of callbacks. Once all callbacks are canceled, the operation is cancelled. + * + * @param token the token representing a set of callbacks to cancel + * + * @return YES if the operation was stopped because this was the last token to be canceled. NO otherwise. */ -- (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock - cancelled:(SDWebImageNoParamsBlock)cancelBlock; +- (BOOL)cancel:(nullable id)token; @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m index 5a8bd11..63df1af 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageDownloaderOperation.m @@ -11,25 +11,37 @@ #import "UIImage+MultiFormat.h" #import #import "SDWebImageManager.h" +#import "NSImage+WebCache.h" NSString *const SDWebImageDownloadStartNotification = @"SDWebImageDownloadStartNotification"; NSString *const SDWebImageDownloadReceiveResponseNotification = @"SDWebImageDownloadReceiveResponseNotification"; NSString *const SDWebImageDownloadStopNotification = @"SDWebImageDownloadStopNotification"; NSString *const SDWebImageDownloadFinishNotification = @"SDWebImageDownloadFinishNotification"; -@interface SDWebImageDownloaderOperation () +static NSString *const kProgressCallbackKey = @"progress"; +static NSString *const kCompletedCallbackKey = @"completed"; -@property (copy, nonatomic) SDWebImageDownloaderProgressBlock progressBlock; -@property (copy, nonatomic) SDWebImageDownloaderCompletedBlock completedBlock; -@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; +typedef NSMutableDictionary SDCallbacksDictionary; + +@interface SDWebImageDownloaderOperation () + +@property (strong, nonatomic, nonnull) NSMutableArray *callbackBlocks; @property (assign, nonatomic, getter = isExecuting) BOOL executing; @property (assign, nonatomic, getter = isFinished) BOOL finished; -@property (strong, nonatomic) NSMutableData *imageData; -@property (strong, nonatomic) NSURLConnection *connection; -@property (strong, atomic) NSThread *thread; +@property (strong, nonatomic, nullable) NSMutableData *imageData; + +// This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run +// the task associated with this operation +@property (weak, nonatomic, nullable) NSURLSession *unownedSession; +// This is set if we're using not using an injected NSURLSession. We're responsible of invalidating this one +@property (strong, nonatomic, nullable) NSURLSession *ownedSession; + +@property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask; + +@property (SDDispatchQueueSetterSementics, nonatomic, nullable) dispatch_queue_t barrierQueue; -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if SD_UIKIT @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId; #endif @@ -37,34 +49,76 @@ @interface SDWebImageDownloaderOperation () @implementation SDWebImageDownloaderOperation { size_t width, height; +#if SD_UIKIT || SD_WATCH UIImageOrientation orientation; +#endif BOOL responseFromCached; } @synthesize executing = _executing; @synthesize finished = _finished; -- (id)initWithRequest:(NSURLRequest *)request - options:(SDWebImageDownloaderOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageDownloaderCompletedBlock)completedBlock - cancelled:(SDWebImageNoParamsBlock)cancelBlock { +- (nonnull instancetype)init { + return [self initWithRequest:nil inSession:nil options:0]; +} + +- (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request + inSession:(nullable NSURLSession *)session + options:(SDWebImageDownloaderOptions)options { if ((self = [super init])) { - _request = request; + _request = [request copy]; _shouldDecompressImages = YES; - _shouldUseCredentialStorage = YES; _options = options; - _progressBlock = [progressBlock copy]; - _completedBlock = [completedBlock copy]; - _cancelBlock = [cancelBlock copy]; + _callbackBlocks = [NSMutableArray new]; _executing = NO; _finished = NO; _expectedSize = 0; - responseFromCached = YES; // Initially wrong until `connection:willCacheResponse:` is called or not called + _unownedSession = session; + responseFromCached = YES; // Initially wrong until `- URLSession:dataTask:willCacheResponse:completionHandler: is called or not called + _barrierQueue = dispatch_queue_create("com.hackemist.SDWebImageDownloaderOperationBarrierQueue", DISPATCH_QUEUE_CONCURRENT); } return self; } +- (void)dealloc { + SDDispatchQueueRelease(_barrierQueue); +} + +- (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock { + SDCallbacksDictionary *callbacks = [NSMutableDictionary new]; + if (progressBlock) callbacks[kProgressCallbackKey] = [progressBlock copy]; + if (completedBlock) callbacks[kCompletedCallbackKey] = [completedBlock copy]; + dispatch_barrier_async(self.barrierQueue, ^{ + [self.callbackBlocks addObject:callbacks]; + }); + return callbacks; +} + +- (nullable NSArray *)callbacksForKey:(NSString *)key { + __block NSMutableArray *callbacks = nil; + dispatch_sync(self.barrierQueue, ^{ + // We need to remove [NSNull null] because there might not always be a progress block for each callback + callbacks = [[self.callbackBlocks valueForKey:key] mutableCopy]; + [callbacks removeObjectIdenticalTo:[NSNull null]]; + }); + return [callbacks copy]; // strip mutability here +} + +- (BOOL)cancel:(nullable id)token { + __block BOOL shouldCancel = NO; + dispatch_barrier_sync(self.barrierQueue, ^{ + [self.callbackBlocks removeObjectIdenticalTo:token]; + if (self.callbackBlocks.count == 0) { + shouldCancel = YES; + } + }); + if (shouldCancel) { + [self cancel]; + } + return shouldCancel; +} + - (void)start { @synchronized (self) { if (self.isCancelled) { @@ -73,7 +127,7 @@ - (void)start { return; } -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)]; if (hasApplication && [self shouldContinueWhenAppEntersBackground]) { @@ -91,44 +145,40 @@ - (void)start { }]; } #endif - + NSURLSession *session = self.unownedSession; + if (!self.unownedSession) { + NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration]; + sessionConfig.timeoutIntervalForRequest = 15; + + /** + * Create the session for this task + * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate + * method calls and completion handler calls. + */ + self.ownedSession = [NSURLSession sessionWithConfiguration:sessionConfig + delegate:self + delegateQueue:nil]; + session = self.ownedSession; + } + + self.dataTask = [session dataTaskWithRequest:self.request]; self.executing = YES; - self.connection = [[NSURLConnection alloc] initWithRequest:self.request delegate:self startImmediately:NO]; - self.thread = [NSThread currentThread]; } + + [self.dataTask resume]; - [self.connection start]; - - if (self.connection) { - if (self.progressBlock) { - self.progressBlock(0, NSURLResponseUnknownLength); + if (self.dataTask) { + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { + progressBlock(0, NSURLResponseUnknownLength, self.request.URL); } dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:self]; }); - - if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_5_1) { - // Make sure to run the runloop in our background thread so it can process downloaded data - // Note: we use a timeout to work around an issue with NSURLConnection cancel under iOS 5 - // not waking up the runloop, leading to dead threads (see https://github.com/rs/SDWebImage/issues/466) - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, false); - } - else { - CFRunLoopRun(); - } - - if (!self.isFinished) { - [self.connection cancel]; - [self connection:self.connection didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorTimedOut userInfo:@{NSURLErrorFailingURLErrorKey : self.request.URL}]]; - } - } - else { - if (self.completedBlock) { - self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}], YES); - } + } else { + [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Connection can't be initialized"}]]; } -#if TARGET_OS_IPHONE && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 +#if SD_UIKIT Class UIApplicationClass = NSClassFromString(@"UIApplication"); if(!UIApplicationClass || ![UIApplicationClass respondsToSelector:@selector(sharedApplication)]) { return; @@ -143,28 +193,16 @@ - (void)start { - (void)cancel { @synchronized (self) { - if (self.thread) { - [self performSelector:@selector(cancelInternalAndStop) onThread:self.thread withObject:nil waitUntilDone:NO]; - } - else { - [self cancelInternal]; - } + [self cancelInternal]; } } -- (void)cancelInternalAndStop { - if (self.isFinished) return; - [self cancelInternal]; - CFRunLoopStop(CFRunLoopGetCurrent()); -} - - (void)cancelInternal { if (self.isFinished) return; [super cancel]; - if (self.cancelBlock) self.cancelBlock(); - if (self.connection) { - [self.connection cancel]; + if (self.dataTask) { + [self.dataTask cancel]; dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; }); @@ -185,12 +223,15 @@ - (void)done { } - (void)reset { - self.cancelBlock = nil; - self.completedBlock = nil; - self.progressBlock = nil; - self.connection = nil; + dispatch_barrier_async(self.barrierQueue, ^{ + [self.callbackBlocks removeAllObjects]; + }); + self.dataTask = nil; self.imageData = nil; - self.thread = nil; + if (self.ownedSession) { + [self.ownedSession invalidateAndCancel]; + self.ownedSession = nil; + } } - (void)setFinished:(BOOL)finished { @@ -209,18 +250,21 @@ - (BOOL)isConcurrent { return YES; } -#pragma mark NSURLConnection (delegate) +#pragma mark NSURLSessionDataDelegate -- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask +didReceiveResponse:(NSURLResponse *)response + completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { //'304 Not Modified' is an exceptional one - if (![response respondsToSelector:@selector(statusCode)] || ([((NSHTTPURLResponse *)response) statusCode] < 400 && [((NSHTTPURLResponse *)response) statusCode] != 304)) { + if (![response respondsToSelector:@selector(statusCode)] || (((NSHTTPURLResponse *)response).statusCode < 400 && ((NSHTTPURLResponse *)response).statusCode != 304)) { NSInteger expected = response.expectedContentLength > 0 ? (NSInteger)response.expectedContentLength : 0; self.expectedSize = expected; - if (self.progressBlock) { - self.progressBlock(0, expected); + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { + progressBlock(0, expected, self.request.URL); } - + self.imageData = [[NSMutableData alloc] initWithCapacity:expected]; self.response = response; dispatch_async(dispatch_get_main_queue(), ^{ @@ -228,31 +272,33 @@ - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLRespon }); } else { - NSUInteger code = [((NSHTTPURLResponse *)response) statusCode]; + NSUInteger code = ((NSHTTPURLResponse *)response).statusCode; //This is the case when server returns '304 Not Modified'. It means that remote image is not changed. //In case of 304 we need just cancel the operation and return cached image from the cache. if (code == 304) { [self cancelInternal]; } else { - [self.connection cancel]; + [self.dataTask cancel]; } dispatch_async(dispatch_get_main_queue(), ^{ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; }); + + [self callCompletionBlocksWithError:[NSError errorWithDomain:NSURLErrorDomain code:((NSHTTPURLResponse *)response).statusCode userInfo:nil]]; - if (self.completedBlock) { - self.completedBlock(nil, nil, [NSError errorWithDomain:NSURLErrorDomain code:[((NSHTTPURLResponse *)response) statusCode] userInfo:nil], YES); - } - CFRunLoopStop(CFRunLoopGetCurrent()); [self done]; } + + if (completionHandler) { + completionHandler(NSURLSessionResponseAllow); + } } -- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { +- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { [self.imageData appendData:data]; - if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0 && self.completedBlock) { + if ((self.options & SDWebImageDownloaderProgressiveDownload) && self.expectedSize > 0) { // The following code is from http://www.cocoaintheshell.com/2011/05/progressive-images-download-imageio/ // Thanks to the author @Nyx0uf @@ -277,17 +323,18 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // When we draw to Core Graphics, we lose orientation information, // which means the image below born of initWithCGIImage will be // oriented incorrectly sometimes. (Unlike the image born of initWithData - // in connectionDidFinishLoading.) So save it here and pass it on later. + // in didCompleteWithError.) So save it here and pass it on later. +#if SD_UIKIT || SD_WATCH orientation = [[self class] orientationFromPropertyValue:(orientationValue == -1 ? 1 : orientationValue)]; +#endif } - } if (width + height > 0 && totalSize < self.expectedSize) { // Create the image CGImageRef partialImageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); -#ifdef TARGET_OS_IPHONE +#if SD_UIKIT || SD_WATCH // Workaround for iOS anamorphic image if (partialImageRef) { const size_t partialHeight = CGImageGetHeight(partialImageRef); @@ -308,7 +355,11 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { #endif if (partialImageRef) { +#if SD_UIKIT || SD_WATCH UIImage *image = [UIImage imageWithCGImage:partialImageRef scale:1 orientation:orientation]; +#elif SD_MAC + UIImage *image = [[UIImage alloc] initWithCGImage:partialImageRef size:NSZeroSize]; +#endif NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; UIImage *scaledImage = [self scaledImageForKey:key image:image]; if (self.shouldDecompressImages) { @@ -318,22 +369,126 @@ - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { image = scaledImage; } CGImageRelease(partialImageRef); - dispatch_main_sync_safe(^{ - if (self.completedBlock) { - self.completedBlock(image, nil, nil, NO); - } - }); + + [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO]; } } CFRelease(imageSource); } - if (self.progressBlock) { - self.progressBlock(self.imageData.length, self.expectedSize); + for (SDWebImageDownloaderProgressBlock progressBlock in [self callbacksForKey:kProgressCallbackKey]) { + progressBlock(self.imageData.length, self.expectedSize, self.request.URL); + } +} + +- (void)URLSession:(NSURLSession *)session + dataTask:(NSURLSessionDataTask *)dataTask + willCacheResponse:(NSCachedURLResponse *)proposedResponse + completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler { + + responseFromCached = NO; // If this method is called, it means the response wasn't read from cache + NSCachedURLResponse *cachedResponse = proposedResponse; + + if (self.request.cachePolicy == NSURLRequestReloadIgnoringLocalCacheData) { + // Prevents caching of responses + cachedResponse = nil; + } + if (completionHandler) { + completionHandler(cachedResponse); } } +#pragma mark NSURLSessionTaskDelegate + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { + @synchronized(self) { + self.dataTask = nil; + dispatch_async(dispatch_get_main_queue(), ^{ + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; + if (!error) { + [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:self]; + } + }); + } + + if (error) { + [self callCompletionBlocksWithError:error]; + } else { + if ([self callbacksForKey:kCompletedCallbackKey].count > 0) { + /** + * See #1608 and #1623 - apparently, there is a race condition on `NSURLCache` that causes a crash + * Limited the calls to `cachedResponseForRequest:` only for cases where we should ignore the cached response + * and images for which responseFromCached is YES (only the ones that cannot be cached). + * Note: responseFromCached is set to NO inside `willCacheResponse:`. This method doesn't get called for large images or images behind authentication + */ + if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached && [[NSURLCache sharedURLCache] cachedResponseForRequest:self.request]) { + // hack + [self callCompletionBlocksWithImage:nil imageData:nil error:nil finished:YES]; + } else if (self.imageData) { + UIImage *image = [UIImage sd_imageWithData:self.imageData]; + NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; + image = [self scaledImageForKey:key image:image]; + + // Do not force decoding animated GIFs + if (!image.images) { + if (self.shouldDecompressImages) { + if (self.options & SDWebImageDownloaderScaleDownLargeImages) { +#if SD_UIKIT || SD_WATCH + image = [UIImage decodedAndScaledDownImageWithImage:image]; + [self.imageData setData:UIImagePNGRepresentation(image)]; +#endif + } else { + image = [UIImage decodedImageWithImage:image]; + } + } + } + if (CGSizeEqualToSize(image.size, CGSizeZero)) { + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}]]; + } else { + [self callCompletionBlocksWithImage:image imageData:self.imageData error:nil finished:YES]; + } + } else { + [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]]; + } + } + } + [self done]; +} + +- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { + + NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling; + __block NSURLCredential *credential = nil; + + if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { + if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) { + disposition = NSURLSessionAuthChallengePerformDefaultHandling; + } else { + credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; + disposition = NSURLSessionAuthChallengeUseCredential; + } + } else { + if (challenge.previousFailureCount == 0) { + if (self.credential) { + credential = self.credential; + disposition = NSURLSessionAuthChallengeUseCredential; + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } else { + disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge; + } + } + + if (completionHandler) { + completionHandler(disposition, credential); + } +} + +#pragma mark Helper methods + +#if SD_UIKIT || SD_WATCH + (UIImageOrientation)orientationFromPropertyValue:(NSInteger)value { switch (value) { case 1: @@ -356,111 +511,30 @@ + (UIImageOrientation)orientationFromPropertyValue:(NSInteger)value { return UIImageOrientationUp; } } +#endif -- (UIImage *)scaledImageForKey:(NSString *)key image:(UIImage *)image { +- (nullable UIImage *)scaledImageForKey:(nullable NSString *)key image:(nullable UIImage *)image { return SDScaledImageForKey(key, image); } -- (void)connectionDidFinishLoading:(NSURLConnection *)aConnection { - SDWebImageDownloaderCompletedBlock completionBlock = self.completedBlock; - @synchronized(self) { - CFRunLoopStop(CFRunLoopGetCurrent()); - self.thread = nil; - self.connection = nil; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:self]; - }); - } - - if (![[NSURLCache sharedURLCache] cachedResponseForRequest:_request]) { - responseFromCached = NO; - } - - if (completionBlock) { - if (self.options & SDWebImageDownloaderIgnoreCachedResponse && responseFromCached) { - completionBlock(nil, nil, nil, YES); - } else if (self.imageData) { - UIImage *image = [UIImage sd_imageWithData:self.imageData]; - NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL]; - image = [self scaledImageForKey:key image:image]; - - // Do not force decoding animated GIFs - if (!image.images) { - if (self.shouldDecompressImages) { - image = [UIImage decodedImageWithImage:image]; - } - } - if (CGSizeEqualToSize(image.size, CGSizeZero)) { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image has 0 pixels"}], YES); - } - else { - completionBlock(image, self.imageData, nil, YES); - } - } else { - completionBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}], YES); - } - } - self.completionBlock = nil; - [self done]; -} - -- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { - @synchronized(self) { - CFRunLoopStop(CFRunLoopGetCurrent()); - self.thread = nil; - self.connection = nil; - dispatch_async(dispatch_get_main_queue(), ^{ - [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:self]; - }); - } - - if (self.completedBlock) { - self.completedBlock(nil, nil, error, YES); - } - self.completionBlock = nil; - [self done]; -} - -- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse { - responseFromCached = NO; // If this method is called, it means the response wasn't read from cache - if (self.request.cachePolicy == NSURLRequestReloadIgnoringLocalCacheData) { - // Prevents caching of responses - return nil; - } - else { - return cachedResponse; - } -} - - (BOOL)shouldContinueWhenAppEntersBackground { return self.options & SDWebImageDownloaderContinueInBackground; } -- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection __unused *)connection { - return self.shouldUseCredentialStorage; +- (void)callCompletionBlocksWithError:(nullable NSError *)error { + [self callCompletionBlocksWithImage:nil imageData:nil error:error finished:YES]; } -- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{ - if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { - if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates) && - [challenge.sender respondsToSelector:@selector(performDefaultHandlingForAuthenticationChallenge:)]) { - [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; - } else { - NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; - [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; +- (void)callCompletionBlocksWithImage:(nullable UIImage *)image + imageData:(nullable NSData *)imageData + error:(nullable NSError *)error + finished:(BOOL)finished { + NSArray *completionBlocks = [self callbacksForKey:kCompletedCallbackKey]; + dispatch_main_async_safe(^{ + for (SDWebImageDownloaderCompletedBlock completedBlock in completionBlocks) { + completedBlock(image, imageData, error, finished); } - } else { - if ([challenge previousFailureCount] == 0) { - if (self.credential) { - [[challenge sender] useCredential:self.credential forAuthenticationChallenge:challenge]; - } else { - [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; - } - } else { - [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge]; - } - } + }); } @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageManager.h b/Pods/SDWebImage/SDWebImage/SDWebImageManager.h index 8750730..ba8b755 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageManager.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImageManager.h @@ -87,14 +87,21 @@ typedef NS_OPTIONS(NSUInteger, SDWebImageOptions) { * have the hand before setting the image (apply a filter or add it with cross-fade animation for instance) * Use this flag if you want to manually set the image in the completion when success */ - SDWebImageAvoidAutoSetImage = 1 << 11 + SDWebImageAvoidAutoSetImage = 1 << 11, + + /** + * By default, images are decoded respecting their original size. On iOS, this flag will scale down the + * images to a size compatible with the constrained memory of devices. + * If `SDWebImageProgressiveDownload` flag is set the scale down is deactivated. + */ + SDWebImageScaleDownLargeImages = 1 << 12 }; -typedef void(^SDWebImageCompletionBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL); +typedef void(^SDExternalCompletionBlock)(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL); -typedef void(^SDWebImageCompletionWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL); +typedef void(^SDInternalCompletionBlock)(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL); -typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); +typedef NSString * _Nullable (^SDWebImageCacheKeyFilterBlock)(NSURL * _Nullable url); @class SDWebImageManager; @@ -111,7 +118,7 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * * @return Return NO to prevent the downloading of the image on cache misses. If not implemented, YES is implied. */ -- (BOOL)imageManager:(SDWebImageManager *)imageManager shouldDownloadImageForURL:(NSURL *)imageURL; +- (BOOL)imageManager:(nonnull SDWebImageManager *)imageManager shouldDownloadImageForURL:(nullable NSURL *)imageURL; /** * Allows to transform the image immediately after it has been downloaded and just before to cache it on disk and memory. @@ -123,7 +130,7 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * * @return The transformed image object. */ -- (UIImage *)imageManager:(SDWebImageManager *)imageManager transformDownloadedImage:(UIImage *)image withURL:(NSURL *)imageURL; +- (nullable UIImage *)imageManager:(nonnull SDWebImageManager *)imageManager transformDownloadedImage:(nullable UIImage *)image withURL:(nullable NSURL *)imageURL; @end @@ -138,23 +145,23 @@ typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url); * @code SDWebImageManager *manager = [SDWebImageManager sharedManager]; -[manager downloadImageWithURL:imageURL - options:0 - progress:nil - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (image) { - // do something with image - } - }]; +[manager loadImageWithURL:imageURL + options:0 + progress:nil + completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + if (image) { + // do something with image + } + }]; * @endcode */ @interface SDWebImageManager : NSObject -@property (weak, nonatomic) id delegate; +@property (weak, nonatomic, nullable) id delegate; -@property (strong, nonatomic, readonly) SDImageCache *imageCache; -@property (strong, nonatomic, readonly) SDWebImageDownloader *imageDownloader; +@property (strong, nonatomic, readonly, nullable) SDImageCache *imageCache; +@property (strong, nonatomic, readonly, nullable) SDWebImageDownloader *imageDownloader; /** * The cache filter is a block used each time SDWebImageManager need to convert an URL into a cache key. This can @@ -172,14 +179,20 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * @endcode */ -@property (nonatomic, copy) SDWebImageCacheKeyFilterBlock cacheKeyFilter; +@property (nonatomic, copy, nullable) SDWebImageCacheKeyFilterBlock cacheKeyFilter; /** * Returns global SDWebImageManager instance. * * @return SDWebImageManager shared instance */ -+ (SDWebImageManager *)sharedManager; ++ (nonnull instancetype)sharedManager; + +/** + * Allows to specify instance of cache and image downloader used with image manager. + * @return new instance of `SDWebImageManager` with specified cache and downloader. + */ +- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader NS_DESIGNATED_INITIALIZER; /** * Downloads the image at the given URL if not present in cache or return the cached version otherwise. @@ -187,26 +200,29 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * @param url The URL to the image * @param options A mask to specify options to use for this request * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. * * This parameter is required. * - * This block has no return value and takes the requested UIImage as first parameter. - * In case of error the image parameter is nil and the second parameter may contain an NSError. + * This block has no return value and takes the requested UIImage as first parameter and the NSData representation as second parameter. + * In case of error the image parameter is nil and the third parameter may contain an NSError. * - * The third parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache + * The forth parameter is an `SDImageCacheType` enum indicating if the image was retrieved from the local cache * or from the memory cache or from the network. * - * The last parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is + * The fith parameter is set to NO when the SDWebImageProgressiveDownload option is used and the image is * downloading. This block is thus called repeatedly with a partial image. When image is fully downloaded, the * block is called a last time with the full image and the last parameter set to YES. * + * The last parameter is the original image URL + * * @return Returns an NSObject conforming to SDWebImageOperation. Should be an instance of SDWebImageDownloaderOperation */ -- (id )downloadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock; +- (nullable id )loadImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDInternalCompletionBlock)completedBlock; /** * Saves image to cache for given URL @@ -216,7 +232,7 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * */ -- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url; +- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url; /** * Cancel all current operations @@ -228,24 +244,6 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; */ - (BOOL)isRunning; -/** - * Check if image has already been cached - * - * @param url image url - * - * @return if the image was already cached - */ -- (BOOL)cachedImageExistsForURL:(NSURL *)url; - -/** - * Check if image has already been cached on disk only - * - * @param url image url - * - * @return if the image was already cached (disk only) - */ -- (BOOL)diskImageExistsForURL:(NSURL *)url; - /** * Async check if image has already been cached * @@ -254,8 +252,8 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @note the completion block is always executed on the main queue */ -- (void)cachedImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)cachedImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** * Async check if image has already been cached on disk only @@ -265,34 +263,13 @@ SDWebImageManager *manager = [SDWebImageManager sharedManager]; * * @note the completion block is always executed on the main queue */ -- (void)diskImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock; +- (void)diskImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock; /** *Return the cache key for a given URL */ -- (NSString *)cacheKeyForURL:(NSURL *)url; - -@end - - -#pragma mark - Deprecated - -typedef void(^SDWebImageCompletedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionBlock`"); -typedef void(^SDWebImageCompletedWithFinishedBlock)(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) __deprecated_msg("Block type deprecated. Use `SDWebImageCompletionWithFinishedBlock`"); - - -@interface SDWebImageManager (Deprecated) - -/** - * Downloads the image at the given URL if not present in cache or return the cached version otherwise. - * - * @deprecated This method has been deprecated. Use `downloadImageWithURL:options:progress:completed:` - */ -- (id )downloadWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletedWithFinishedBlock)completedBlock __deprecated_msg("Method deprecated. Use `downloadImageWithURL:options:progress:completed:`"); +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url; @end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImageManager.m b/Pods/SDWebImage/SDWebImage/SDWebImageManager.m index c804ee9..d7d6865 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImageManager.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImageManager.m @@ -8,27 +8,28 @@ #import "SDWebImageManager.h" #import +#import "NSImage+WebCache.h" @interface SDWebImageCombinedOperation : NSObject @property (assign, nonatomic, getter = isCancelled) BOOL cancelled; -@property (copy, nonatomic) SDWebImageNoParamsBlock cancelBlock; -@property (strong, nonatomic) NSOperation *cacheOperation; +@property (copy, nonatomic, nullable) SDWebImageNoParamsBlock cancelBlock; +@property (strong, nonatomic, nullable) NSOperation *cacheOperation; @end @interface SDWebImageManager () -@property (strong, nonatomic, readwrite) SDImageCache *imageCache; -@property (strong, nonatomic, readwrite) SDWebImageDownloader *imageDownloader; -@property (strong, nonatomic) NSMutableSet *failedURLs; -@property (strong, nonatomic) NSMutableArray *runningOperations; +@property (strong, nonatomic, readwrite, nonnull) SDImageCache *imageCache; +@property (strong, nonatomic, readwrite, nonnull) SDWebImageDownloader *imageDownloader; +@property (strong, nonatomic, nonnull) NSMutableSet *failedURLs; +@property (strong, nonatomic, nonnull) NSMutableArray *runningOperations; @end @implementation SDWebImageManager -+ (id)sharedManager { ++ (nonnull instancetype)sharedManager { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -37,42 +38,36 @@ + (id)sharedManager { return instance; } -- (id)init { +- (nonnull instancetype)init { + SDImageCache *cache = [SDImageCache sharedImageCache]; + SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader]; + return [self initWithCache:cache downloader:downloader]; +} + +- (nonnull instancetype)initWithCache:(nonnull SDImageCache *)cache downloader:(nonnull SDWebImageDownloader *)downloader { if ((self = [super init])) { - _imageCache = [self createCache]; - _imageDownloader = [SDWebImageDownloader sharedDownloader]; + _imageCache = cache; + _imageDownloader = downloader; _failedURLs = [NSMutableSet new]; _runningOperations = [NSMutableArray new]; } return self; } -- (SDImageCache *)createCache { - return [SDImageCache sharedImageCache]; -} +- (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url { + if (!url) { + return @""; + } -- (NSString *)cacheKeyForURL:(NSURL *)url { if (self.cacheKeyFilter) { return self.cacheKeyFilter(url); + } else { + return url.absoluteString; } - else { - return [url absoluteString]; - } -} - -- (BOOL)cachedImageExistsForURL:(NSURL *)url { - NSString *key = [self cacheKeyForURL:url]; - if ([self.imageCache imageFromMemoryCacheForKey:key] != nil) return YES; - return [self.imageCache diskImageExistsWithKey:key]; } -- (BOOL)diskImageExistsForURL:(NSURL *)url { - NSString *key = [self cacheKeyForURL:url]; - return [self.imageCache diskImageExistsWithKey:key]; -} - -- (void)cachedImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)cachedImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; BOOL isInMemoryCache = ([self.imageCache imageFromMemoryCacheForKey:key] != nil); @@ -95,8 +90,8 @@ - (void)cachedImageExistsForURL:(NSURL *)url }]; } -- (void)diskImageExistsForURL:(NSURL *)url - completion:(SDWebImageCheckCacheCompletionBlock)completionBlock { +- (void)diskImageExistsForURL:(nullable NSURL *)url + completion:(nullable SDWebImageCheckCacheCompletionBlock)completionBlock { NSString *key = [self cacheKeyForURL:url]; [self.imageCache diskImageExistsWithKey:key completion:^(BOOL isInDiskCache) { @@ -107,14 +102,14 @@ - (void)diskImageExistsForURL:(NSURL *)url }]; } -- (id )downloadImageWithURL:(NSURL *)url - options:(SDWebImageOptions)options - progress:(SDWebImageDownloaderProgressBlock)progressBlock - completed:(SDWebImageCompletionWithFinishedBlock)completedBlock { +- (id )loadImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDInternalCompletionBlock)completedBlock { // Invoking this method without a completedBlock is pointless NSAssert(completedBlock != nil, @"If you mean to prefetch the image, use -[SDWebImagePrefetcher prefetchURLs] instead"); - // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, XCode won't + // Very common mistake is to send the URL using NSString object instead of NSURL. For some strange reason, Xcode won't // throw any warning for this type mismatch. Here we failsafe this error by allowing URLs to be passed as NSString. if ([url isKindOfClass:NSString.class]) { url = [NSURL URLWithString:(NSString *)url]; @@ -129,15 +124,14 @@ - (void)diskImageExistsForURL:(NSURL *)url __weak SDWebImageCombinedOperation *weakOperation = operation; BOOL isFailedUrl = NO; - @synchronized (self.failedURLs) { - isFailedUrl = [self.failedURLs containsObject:url]; + if (url) { + @synchronized (self.failedURLs) { + isFailedUrl = [self.failedURLs containsObject:url]; + } } if (url.absoluteString.length == 0 || (!(options & SDWebImageRetryFailed) && isFailedUrl)) { - dispatch_main_sync_safe(^{ - NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil]; - completedBlock(nil, error, SDImageCacheTypeNone, YES, url); - }); + [self callCompletionBlockForOperation:operation completion:completedBlock error:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorFileDoesNotExist userInfo:nil] url:url]; return operation; } @@ -146,22 +140,17 @@ - (void)diskImageExistsForURL:(NSURL *)url } NSString *key = [self cacheKeyForURL:url]; - operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) { + operation.cacheOperation = [self.imageCache queryCacheOperationForKey:key done:^(UIImage *cachedImage, NSData *cachedData, SDImageCacheType cacheType) { if (operation.isCancelled) { - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } - + [self safelyRemoveOperationFromRunning:operation]; return; } - if ((!image || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { - if (image && options & SDWebImageRefreshCached) { - dispatch_main_sync_safe(^{ - // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image - // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. - completedBlock(image, nil, cacheType, YES, url); - }); + if ((!cachedImage || options & SDWebImageRefreshCached) && (![self.delegate respondsToSelector:@selector(imageManager:shouldDownloadImageForURL:)] || [self.delegate imageManager:self shouldDownloadImageForURL:url])) { + if (cachedImage && options & SDWebImageRefreshCached) { + // If image was found in the cache but SDWebImageRefreshCached is provided, notify about the cached image + // AND try to re-download it in order to let a chance to NSURLCache to refresh it from server. + [self callCompletionBlockForOperation:weakOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; } // download if no image or requested to refresh anyway, and download allowed by delegate @@ -173,25 +162,23 @@ - (void)diskImageExistsForURL:(NSURL *)url if (options & SDWebImageHandleCookies) downloaderOptions |= SDWebImageDownloaderHandleCookies; if (options & SDWebImageAllowInvalidSSLCertificates) downloaderOptions |= SDWebImageDownloaderAllowInvalidSSLCertificates; if (options & SDWebImageHighPriority) downloaderOptions |= SDWebImageDownloaderHighPriority; - if (image && options & SDWebImageRefreshCached) { + if (options & SDWebImageScaleDownLargeImages) downloaderOptions |= SDWebImageDownloaderScaleDownLargeImages; + + if (cachedImage && options & SDWebImageRefreshCached) { // force progressive off if image already cached but forced refreshing downloaderOptions &= ~SDWebImageDownloaderProgressiveDownload; // ignore image read from NSURLCache if image if cached but force refreshing downloaderOptions |= SDWebImageDownloaderIgnoreCachedResponse; } - id subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *data, NSError *error, BOOL finished) { + + SDWebImageDownloadToken *subOperationToken = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed:^(UIImage *downloadedImage, NSData *downloadedData, NSError *error, BOOL finished) { __strong __typeof(weakOperation) strongOperation = weakOperation; if (!strongOperation || strongOperation.isCancelled) { // Do nothing if the operation was cancelled // See #699 for more details // if we would call the completedBlock, there could be a race condition between this block and another completedBlock for the same object, so if this one is called second, we will overwrite the new data - } - else if (error) { - dispatch_main_sync_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(nil, error, SDImageCacheTypeNone, finished, url); - } - }); + } else if (error) { + [self callCompletionBlockForOperation:strongOperation completion:completedBlock error:error url:url]; if ( error.code != NSURLErrorNotConnectedToInternet && error.code != NSURLErrorCancelled @@ -214,95 +201,62 @@ - (void)diskImageExistsForURL:(NSURL *)url BOOL cacheOnDisk = !(options & SDWebImageCacheMemoryOnly); - if (options & SDWebImageRefreshCached && image && !downloadedImage) { + if (options & SDWebImageRefreshCached && cachedImage && !downloadedImage) { // Image refresh hit the NSURLCache cache, do not call the completion block - } - else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { + } else if (downloadedImage && (!downloadedImage.images || (options & SDWebImageTransformAnimatedImage)) && [self.delegate respondsToSelector:@selector(imageManager:transformDownloadedImage:withURL:)]) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ UIImage *transformedImage = [self.delegate imageManager:self transformDownloadedImage:downloadedImage withURL:url]; if (transformedImage && finished) { BOOL imageWasTransformed = ![transformedImage isEqual:downloadedImage]; - [self.imageCache storeImage:transformedImage recalculateFromImage:imageWasTransformed imageData:(imageWasTransformed ? nil : data) forKey:key toDisk:cacheOnDisk]; + // pass nil if the image was transformed, so we can recalculate the data from the image + [self.imageCache storeImage:transformedImage imageData:(imageWasTransformed ? nil : downloadedData) forKey:key toDisk:cacheOnDisk completion:nil]; } - - dispatch_main_sync_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(transformedImage, nil, SDImageCacheTypeNone, finished, url); - } - }); + + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:transformedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; }); - } - else { + } else { if (downloadedImage && finished) { - [self.imageCache storeImage:downloadedImage recalculateFromImage:NO imageData:data forKey:key toDisk:cacheOnDisk]; + [self.imageCache storeImage:downloadedImage imageData:downloadedData forKey:key toDisk:cacheOnDisk completion:nil]; } - - dispatch_main_sync_safe(^{ - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(downloadedImage, nil, SDImageCacheTypeNone, finished, url); - } - }); + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:downloadedImage data:downloadedData error:nil cacheType:SDImageCacheTypeNone finished:finished url:url]; } } if (finished) { - @synchronized (self.runningOperations) { - if (strongOperation) { - [self.runningOperations removeObject:strongOperation]; - } - } + [self safelyRemoveOperationFromRunning:strongOperation]; } }]; operation.cancelBlock = ^{ - [subOperation cancel]; - - @synchronized (self.runningOperations) { - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation) { - [self.runningOperations removeObject:strongOperation]; - } - } - }; - } - else if (image) { - dispatch_main_sync_safe(^{ + [self.imageDownloader cancel:subOperationToken]; __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation && !strongOperation.isCancelled) { - completedBlock(image, nil, cacheType, YES, url); - } - }); - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } - } - else { + [self safelyRemoveOperationFromRunning:strongOperation]; + }; + } else if (cachedImage) { + __strong __typeof(weakOperation) strongOperation = weakOperation; + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:cachedImage data:cachedData error:nil cacheType:cacheType finished:YES url:url]; + [self safelyRemoveOperationFromRunning:operation]; + } else { // Image not in cache and download disallowed by delegate - dispatch_main_sync_safe(^{ - __strong __typeof(weakOperation) strongOperation = weakOperation; - if (strongOperation && !weakOperation.isCancelled) { - completedBlock(nil, nil, SDImageCacheTypeNone, YES, url); - } - }); - @synchronized (self.runningOperations) { - [self.runningOperations removeObject:operation]; - } + __strong __typeof(weakOperation) strongOperation = weakOperation; + [self callCompletionBlockForOperation:strongOperation completion:completedBlock image:nil data:nil error:nil cacheType:SDImageCacheTypeNone finished:YES url:url]; + [self safelyRemoveOperationFromRunning:operation]; } }]; return operation; } -- (void)saveImageToCache:(UIImage *)image forURL:(NSURL *)url { +- (void)saveImageToCache:(nullable UIImage *)image forURL:(nullable NSURL *)url { if (image && url) { NSString *key = [self cacheKeyForURL:url]; - [self.imageCache storeImage:image forKey:key toDisk:YES]; + [self.imageCache storeImage:image forKey:key toDisk:YES completion:nil]; } } - (void)cancelAll { @synchronized (self.runningOperations) { - NSArray *copiedOperations = [self.runningOperations copy]; + NSArray *copiedOperations = [self.runningOperations copy]; [copiedOperations makeObjectsPerformSelector:@selector(cancel)]; [self.runningOperations removeObjectsInArray:copiedOperations]; } @@ -310,18 +264,48 @@ - (void)cancelAll { - (BOOL)isRunning { BOOL isRunning = NO; - @synchronized(self.runningOperations) { + @synchronized (self.runningOperations) { isRunning = (self.runningOperations.count > 0); } return isRunning; } +- (void)safelyRemoveOperationFromRunning:(nullable SDWebImageCombinedOperation*)operation { + @synchronized (self.runningOperations) { + if (operation) { + [self.runningOperations removeObject:operation]; + } + } +} + +- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation + completion:(nullable SDInternalCompletionBlock)completionBlock + error:(nullable NSError *)error + url:(nullable NSURL *)url { + [self callCompletionBlockForOperation:operation completion:completionBlock image:nil data:nil error:error cacheType:SDImageCacheTypeNone finished:YES url:url]; +} + +- (void)callCompletionBlockForOperation:(nullable SDWebImageCombinedOperation*)operation + completion:(nullable SDInternalCompletionBlock)completionBlock + image:(nullable UIImage *)image + data:(nullable NSData *)data + error:(nullable NSError *)error + cacheType:(SDImageCacheType)cacheType + finished:(BOOL)finished + url:(nullable NSURL *)url { + dispatch_main_async_safe(^{ + if (operation && !operation.isCancelled && completionBlock) { + completionBlock(image, data, error, cacheType, finished, url); + } + }); +} + @end @implementation SDWebImageCombinedOperation -- (void)setCancelBlock:(SDWebImageNoParamsBlock)cancelBlock { +- (void)setCancelBlock:(nullable SDWebImageNoParamsBlock)cancelBlock { // check if the operation is already cancelled, then we just call the cancelBlock if (self.isCancelled) { if (cancelBlock) { @@ -350,21 +334,3 @@ - (void)cancel { } @end - - -@implementation SDWebImageManager (Deprecated) - -// deprecated method, uses the non deprecated method -// adapter for the completion block -- (id )downloadWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedWithFinishedBlock)completedBlock { - return [self downloadImageWithURL:url - options:options - progress:progressBlock - completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType, finished); - } - }]; -} - -@end diff --git a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h index 6c31b15..d0a91ed 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h +++ b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.h @@ -23,7 +23,7 @@ * @param finishedCount The total number of images that were prefetched (successful or not) * @param totalCount The total number of images that were to be prefetched */ -- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; +- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didPrefetchURL:(nullable NSURL *)imageURL finishedCount:(NSUInteger)finishedCount totalCount:(NSUInteger)totalCount; /** * Called when all images are prefetched. @@ -31,7 +31,7 @@ * @param totalCount The total number of images that were prefetched (whether successful or not) * @param skippedCount The total number of images that were skipped */ -- (void)imagePrefetcher:(SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; +- (void)imagePrefetcher:(nonnull SDWebImagePrefetcher *)imagePrefetcher didFinishWithTotalCount:(NSUInteger)totalCount skippedCount:(NSUInteger)skippedCount; @end @@ -46,7 +46,7 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * The web image manager */ -@property (strong, nonatomic, readonly) SDWebImageManager *manager; +@property (strong, nonatomic, readonly, nonnull) SDWebImageManager *manager; /** * Maximum number of URLs to prefetch at the same time. Defaults to 3. @@ -61,33 +61,35 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, /** * Queue options for Prefetcher. Defaults to Main Queue. */ -@property (nonatomic, assign) dispatch_queue_t prefetcherQueue; +@property (nonatomic, assign, nonnull) dispatch_queue_t prefetcherQueue; -@property (weak, nonatomic) id delegate; +@property (weak, nonatomic, nullable) id delegate; /** * Return the global image prefetcher instance. */ -+ (SDWebImagePrefetcher *)sharedImagePrefetcher; ++ (nonnull instancetype)sharedImagePrefetcher; /** * Allows you to instantiate a prefetcher with any arbitrary image manager. */ -- (id)initWithImageManager:(SDWebImageManager *)manager; +- (nonnull instancetype)initWithImageManager:(nonnull SDWebImageManager *)manager NS_DESIGNATED_INITIALIZER; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list + * and skips images for failed downloads and proceed to the next image in the list. + * Any previously-running prefetch operations are canceled. * * @param urls list of URLs to prefetch */ -- (void)prefetchURLs:(NSArray *)urls; +- (void)prefetchURLs:(nullable NSArray *)urls; /** * Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching, * currently one image is downloaded at a time, - * and skips images for failed downloads and proceed to the next image in the list + * and skips images for failed downloads and proceed to the next image in the list. + * Any previously-running prefetch operations are canceled. * * @param urls list of URLs to prefetch * @param progressBlock block to be called when progress updates; @@ -97,7 +99,9 @@ typedef void(^SDWebImagePrefetcherCompletionBlock)(NSUInteger noOfFinishedUrls, * first param is the number of completed (successful or not) requests, * second parameter is the number of skipped requests */ -- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock; +- (void)prefetchURLs:(nullable NSArray *)urls + progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock + completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock; /** * Remove and cancel queued list diff --git a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m index f518d44..b66357f 100644 --- a/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m +++ b/Pods/SDWebImage/SDWebImage/SDWebImagePrefetcher.m @@ -10,20 +10,20 @@ @interface SDWebImagePrefetcher () -@property (strong, nonatomic) SDWebImageManager *manager; -@property (strong, nonatomic) NSArray *prefetchURLs; +@property (strong, nonatomic, nonnull) SDWebImageManager *manager; +@property (strong, nonatomic, nullable) NSArray *prefetchURLs; @property (assign, nonatomic) NSUInteger requestedCount; @property (assign, nonatomic) NSUInteger skippedCount; @property (assign, nonatomic) NSUInteger finishedCount; @property (assign, nonatomic) NSTimeInterval startedTime; -@property (copy, nonatomic) SDWebImagePrefetcherCompletionBlock completionBlock; -@property (copy, nonatomic) SDWebImagePrefetcherProgressBlock progressBlock; +@property (copy, nonatomic, nullable) SDWebImagePrefetcherCompletionBlock completionBlock; +@property (copy, nonatomic, nullable) SDWebImagePrefetcherProgressBlock progressBlock; @end @implementation SDWebImagePrefetcher -+ (SDWebImagePrefetcher *)sharedImagePrefetcher { ++ (nonnull instancetype)sharedImagePrefetcher { static dispatch_once_t once; static id instance; dispatch_once(&once, ^{ @@ -32,11 +32,11 @@ + (SDWebImagePrefetcher *)sharedImagePrefetcher { return instance; } -- (id)init { +- (nonnull instancetype)init { return [self initWithImageManager:[SDWebImageManager new]]; } -- (id)initWithImageManager:(SDWebImageManager *)manager { +- (nonnull instancetype)initWithImageManager:(SDWebImageManager *)manager { if ((self = [super init])) { _manager = manager; _options = SDWebImageLowPriority; @@ -57,18 +57,18 @@ - (NSUInteger)maxConcurrentDownloads { - (void)startPrefetchingAtIndex:(NSUInteger)index { if (index >= self.prefetchURLs.count) return; self.requestedCount++; - [self.manager downloadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + [self.manager loadImageWithURL:self.prefetchURLs[index] options:self.options progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!finished) return; self.finishedCount++; if (image) { if (self.progressBlock) { - self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + self.progressBlock(self.finishedCount,(self.prefetchURLs).count); } } else { if (self.progressBlock) { - self.progressBlock(self.finishedCount,[self.prefetchURLs count]); + self.progressBlock(self.finishedCount,(self.prefetchURLs).count); } // Add last failed self.skippedCount++; @@ -96,7 +96,7 @@ - (void)startPrefetchingAtIndex:(NSUInteger)index { } - (void)reportStatus { - NSUInteger total = [self.prefetchURLs count]; + NSUInteger total = (self.prefetchURLs).count; if ([self.delegate respondsToSelector:@selector(imagePrefetcher:didFinishWithTotalCount:skippedCount:)]) { [self.delegate imagePrefetcher:self didFinishWithTotalCount:(total - self.skippedCount) @@ -105,11 +105,13 @@ - (void)reportStatus { } } -- (void)prefetchURLs:(NSArray *)urls { +- (void)prefetchURLs:(nullable NSArray *)urls { [self prefetchURLs:urls progress:nil completed:nil]; } -- (void)prefetchURLs:(NSArray *)urls progress:(SDWebImagePrefetcherProgressBlock)progressBlock completed:(SDWebImagePrefetcherCompletionBlock)completionBlock { +- (void)prefetchURLs:(nullable NSArray *)urls + progress:(nullable SDWebImagePrefetcherProgressBlock)progressBlock + completed:(nullable SDWebImagePrefetcherCompletionBlock)completionBlock { [self cancelPrefetching]; // Prevent duplicate prefetch request self.startedTime = CFAbsoluteTimeGetCurrent(); self.prefetchURLs = urls; diff --git a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h index ecf5ced..c43b749 100644 --- a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h +++ b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.h @@ -7,6 +7,9 @@ */ #import "SDWebImageCompat.h" + +#if SD_UIKIT + #import "SDWebImageManager.h" /** @@ -17,14 +20,16 @@ /** * Get the current image URL. */ -- (NSURL *)sd_currentImageURL; +- (nullable NSURL *)sd_currentImageURL; + +#pragma mark - Image /** * Get the image URL for a control state. * * @param state Which state you want to know the URL for. The values are described in UIControlState. */ -- (NSURL *)sd_imageURLForState:(UIControlState)state; +- (nullable NSURL *)sd_imageURLForState:(UIControlState)state; /** * Set the imageView `image` with an `url`. @@ -34,7 +39,8 @@ * @param url The url for the image. * @param state The state that uses the specified title. The values are described in UIControlState. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state; /** * Set the imageView `image` with an `url` and a placeholder. @@ -46,7 +52,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -58,7 +66,10 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the imageView `image` with an `url`. @@ -73,7 +84,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -89,7 +102,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -106,7 +122,13 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; + +#pragma mark - Background image /** * Set the backgroundImageView `image` with an `url`. @@ -116,7 +138,8 @@ * @param url The url for the image. * @param state The state that uses the specified title. The values are described in UIControlState. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state; /** * Set the backgroundImageView `image` with an `url` and a placeholder. @@ -128,7 +151,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -140,7 +165,10 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the backgroundImageView `image` with an `url`. @@ -155,7 +183,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder. @@ -171,7 +201,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the backgroundImageView `image` with an `url`, placeholder and custom options. @@ -187,7 +220,13 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; + +#pragma mark - Cancel /** * Cancel the current image download @@ -201,29 +240,4 @@ @end - -@interface UIButton (WebCacheDeprecated) - -- (NSURL *)currentImageURL __deprecated_msg("Use `sd_currentImageURL`"); -- (NSURL *)imageURLForState:(UIControlState)state __deprecated_msg("Use `sd_imageURLForState:`"); - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:`"); - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:completed:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:forState:placeholderImage:options:completed:`"); - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:`"); - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:completed:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:completed:`"); -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setBackgroundImageWithURL:forState:placeholderImage:options:completed:`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelImageLoadForState:`"); -- (void)cancelBackgroundImageLoadForState:(UIControlState)state __deprecated_msg("Use `sd_cancelBackgroundImageLoadForState:`"); - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m index ce2175d..63f75e4 100644 --- a/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIButton+WebCache.m @@ -7,14 +7,20 @@ */ #import "UIButton+WebCache.h" + +#if SD_UIKIT + #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" static char imageURLStorageKey; +typedef NSMutableDictionary SDStateImageURLDictionary; + @implementation UIButton (WebCache) -- (NSURL *)sd_currentImageURL { +- (nullable NSURL *)sd_currentImageURL { NSURL *url = self.imageURLStorage[@(self.state)]; if (!url) { @@ -24,126 +30,100 @@ - (NSURL *)sd_currentImageURL { return url; } -- (NSURL *)sd_imageURLForState:(UIControlState)state { +- (nullable NSURL *)sd_imageURLForState:(UIControlState)state { return self.imageURLStorage[@(state)]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state { +#pragma mark - Image + +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { - - [self setImage:placeholder forState:state]; - [self sd_cancelImageLoadForState:state]; - +- (void)sd_setImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock { if (!url) { [self.imageURLStorage removeObjectForKey:@(state)]; - - dispatch_main_async_safe(^{ - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - return; } self.imageURLStorage[@(state)] = url; - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong UIButton *sself = wself; - if (!sself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - [sself setImage:image forState:state]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forState:state]; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:[NSString stringWithFormat:@"UIButtonImageOperation%@", @(state)] + setImageBlock:^(UIImage *image, NSData *imageData) { + [weakSelf setImage:image forState:state]; + } + progress:nil + completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { +#pragma mark - Background image + +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url forState:(UIControlState)state placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:completedBlock]; } -- (void)sd_setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_cancelBackgroundImageLoadForState:state]; - - [self setBackgroundImage:placeholder forState:state]; - - if (url) { - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe(^{ - __strong UIButton *sself = wself; - if (!sself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - [sself setBackgroundImage:image forState:state]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setBackgroundImageLoadOperation:operation forState:state]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); +- (void)sd_setBackgroundImageWithURL:(nullable NSURL *)url + forState:(UIControlState)state + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock { + if (!url) { + [self.imageURLStorage removeObjectForKey:@(state)]; + return; } + + self.imageURLStorage[@(state)] = url; + + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)] + setImageBlock:^(UIImage *image, NSData *imageData) { + [weakSelf setBackgroundImage:image forState:state]; + } + progress:nil + completed:completedBlock]; } - (void)sd_setImageLoadOperation:(id)operation forState:(UIControlState)state { @@ -162,10 +142,9 @@ - (void)sd_cancelBackgroundImageLoadForState:(UIControlState)state { [self sd_cancelImageLoadOperationWithKey:[NSString stringWithFormat:@"UIButtonBackgroundImageOperation%@", @(state)]]; } -- (NSMutableDictionary *)imageURLStorage { - NSMutableDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); - if (!storage) - { +- (SDStateImageURLDictionary *)imageURLStorage { + SDStateImageURLDictionary *storage = objc_getAssociatedObject(self, &imageURLStorageKey); + if (!storage) { storage = [NSMutableDictionary dictionary]; objc_setAssociatedObject(self, &imageURLStorageKey, storage, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } @@ -175,96 +154,4 @@ - (NSMutableDictionary *)imageURLStorage { @end - -@implementation UIButton (WebCacheDeprecated) - -- (NSURL *)currentImageURL { - return [self sd_currentImageURL]; -} - -- (NSURL *)imageURLForState:(UIControlState)state { - return [self sd_imageURLForState:state]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:nil]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:nil options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:0 completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setBackgroundImageWithURL:(NSURL *)url forState:(UIControlState)state placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setBackgroundImageWithURL:url forState:state placeholderImage:placeholder options:options completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentImageLoad { - // in a backwards compatible manner, cancel for current state - [self sd_cancelImageLoadForState:self.state]; -} - -- (void)cancelBackgroundImageLoadForState:(UIControlState)state { - [self sd_cancelBackgroundImageLoadForState:state]; -} - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImage+GIF.h b/Pods/SDWebImage/SDWebImage/UIImage+GIF.h index 084f424..479d572 100755 --- a/Pods/SDWebImage/SDWebImage/UIImage+GIF.h +++ b/Pods/SDWebImage/SDWebImage/UIImage+GIF.h @@ -1,19 +1,24 @@ -// -// UIImage+GIF.h -// LBGIFImage -// -// Created by Laurin Brandner on 06.01.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Laurin Brandner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ -#import +#import "SDWebImageCompat.h" @interface UIImage (GIF) -+ (UIImage *)sd_animatedGIFNamed:(NSString *)name; - +/** + * Compatibility method - creates an animated UIImage from an NSData, it will only contain the 1st frame image + */ + (UIImage *)sd_animatedGIFWithData:(NSData *)data; -- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size; +/** + * Checks if an UIImage instance is a GIF. Will use the `images` array + */ +- (BOOL)isGIF; @end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+GIF.m b/Pods/SDWebImage/SDWebImage/UIImage+GIF.m index bf74a36..9301777 100755 --- a/Pods/SDWebImage/SDWebImage/UIImage+GIF.m +++ b/Pods/SDWebImage/SDWebImage/UIImage+GIF.m @@ -1,13 +1,16 @@ -// -// UIImage+GIF.m -// LBGIFImage -// -// Created by Laurin Brandner on 06.01.12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * (c) Laurin Brandner + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "UIImage+GIF.h" #import +#import "objc/runtime.h" +#import "NSImage+WebCache.h" @implementation UIImage (GIF) @@ -20,142 +23,38 @@ + (UIImage *)sd_animatedGIFWithData:(NSData *)data { size_t count = CGImageSourceGetCount(source); - UIImage *animatedImage; + UIImage *staticImage; if (count <= 1) { - animatedImage = [[UIImage alloc] initWithData:data]; - } - else { - NSMutableArray *images = [NSMutableArray array]; - - NSTimeInterval duration = 0.0f; - - for (size_t i = 0; i < count; i++) { - CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); - if (!image) { - continue; - } - - duration += [self sd_frameDurationAtIndex:i source:source]; - - [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]; - - CGImageRelease(image); - } - - if (!duration) { - duration = (1.0f / 10.0f) * count; - } - - animatedImage = [UIImage animatedImageWithImages:images duration:duration]; + staticImage = [[UIImage alloc] initWithData:data]; + } else { + // we will only retrieve the 1st frame. the full GIF support is available via the FLAnimatedImageView category. + // this here is only code to allow drawing animated images as static ones +#if SD_WATCH + CGFloat scale = 1; + scale = [WKInterfaceDevice currentDevice].screenScale; +#elif SD_UIKIT + CGFloat scale = 1; + scale = [UIScreen mainScreen].scale; +#endif + + CGImageRef CGImage = CGImageSourceCreateImageAtIndex(source, 0, NULL); +#if SD_UIKIT || SD_WATCH + UIImage *frameImage = [UIImage imageWithCGImage:CGImage scale:scale orientation:UIImageOrientationUp]; + staticImage = [UIImage animatedImageWithImages:@[frameImage] duration:0.0f]; +#elif SD_MAC + staticImage = [[UIImage alloc] initWithCGImage:CGImage size:NSZeroSize]; +#endif + CGImageRelease(CGImage); } CFRelease(source); - return animatedImage; + return staticImage; } -+ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { - float frameDuration = 0.1f; - CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil); - NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties; - NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary]; - - NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime]; - if (delayTimeUnclampedProp) { - frameDuration = [delayTimeUnclampedProp floatValue]; - } - else { - - NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime]; - if (delayTimeProp) { - frameDuration = [delayTimeProp floatValue]; - } - } - - // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. - // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify - // a duration of <= 10 ms. See and - // for more information. - - if (frameDuration < 0.011f) { - frameDuration = 0.100f; - } - - CFRelease(cfFrameProperties); - return frameDuration; -} - -+ (UIImage *)sd_animatedGIFNamed:(NSString *)name { - CGFloat scale = [UIScreen mainScreen].scale; - - if (scale > 1.0f) { - NSString *retinaPath = [[NSBundle mainBundle] pathForResource:[name stringByAppendingString:@"@2x"] ofType:@"gif"]; - - NSData *data = [NSData dataWithContentsOfFile:retinaPath]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; - - data = [NSData dataWithContentsOfFile:path]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - return [UIImage imageNamed:name]; - } - else { - NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"]; - - NSData *data = [NSData dataWithContentsOfFile:path]; - - if (data) { - return [UIImage sd_animatedGIFWithData:data]; - } - - return [UIImage imageNamed:name]; - } -} - -- (UIImage *)sd_animatedImageByScalingAndCroppingToSize:(CGSize)size { - if (CGSizeEqualToSize(self.size, size) || CGSizeEqualToSize(size, CGSizeZero)) { - return self; - } - - CGSize scaledSize = size; - CGPoint thumbnailPoint = CGPointZero; - - CGFloat widthFactor = size.width / self.size.width; - CGFloat heightFactor = size.height / self.size.height; - CGFloat scaleFactor = (widthFactor > heightFactor) ? widthFactor : heightFactor; - scaledSize.width = self.size.width * scaleFactor; - scaledSize.height = self.size.height * scaleFactor; - - if (widthFactor > heightFactor) { - thumbnailPoint.y = (size.height - scaledSize.height) * 0.5; - } - else if (widthFactor < heightFactor) { - thumbnailPoint.x = (size.width - scaledSize.width) * 0.5; - } - - NSMutableArray *scaledImages = [NSMutableArray array]; - - for (UIImage *image in self.images) { - UIGraphicsBeginImageContextWithOptions(size, NO, 0.0); - - [image drawInRect:CGRectMake(thumbnailPoint.x, thumbnailPoint.y, scaledSize.width, scaledSize.height)]; - UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); - - [scaledImages addObject:newImage]; - - UIGraphicsEndImageContext(); - } - - return [UIImage animatedImageWithImages:scaledImages duration:self.duration]; +- (BOOL)isGIF { + return (self.images != nil); } @end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h index 186ebc0..bec411e 100644 --- a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h +++ b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.h @@ -1,15 +1,18 @@ -// -// UIImage+MultiFormat.h -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ -#import +#import "SDWebImageCompat.h" +#import "NSData+ImageContentType.h" @interface UIImage (MultiFormat) -+ (UIImage *)sd_imageWithData:(NSData *)data; ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data; +- (nullable NSData *)sd_imageData; +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat; @end diff --git a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m index a830754..378f389 100644 --- a/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m +++ b/Pods/SDWebImage/SDWebImage/UIImage+MultiFormat.m @@ -1,10 +1,10 @@ -// -// UIImage+MultiFormat.m -// SDWebImage -// -// Created by Olivier Poitrey on 07/06/13. -// Copyright (c) 2013 Dailymotion. All rights reserved. -// +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ #import "UIImage+MultiFormat.h" #import "UIImage+GIF.h" @@ -17,38 +17,40 @@ @implementation UIImage (MultiFormat) -+ (UIImage *)sd_imageWithData:(NSData *)data { ++ (nullable UIImage *)sd_imageWithData:(nullable NSData *)data { if (!data) { return nil; } UIImage *image; - NSString *imageContentType = [NSData sd_contentTypeForImageData:data]; - if ([imageContentType isEqualToString:@"image/gif"]) { + SDImageFormat imageFormat = [NSData sd_imageFormatForImageData:data]; + if (imageFormat == SDImageFormatGIF) { image = [UIImage sd_animatedGIFWithData:data]; } #ifdef SD_WEBP - else if ([imageContentType isEqualToString:@"image/webp"]) + else if (imageFormat == SDImageFormatWebP) { image = [UIImage sd_imageWithWebPData:data]; } #endif else { image = [[UIImage alloc] initWithData:data]; +#if SD_UIKIT || SD_WATCH UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data]; if (orientation != UIImageOrientationUp) { image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:orientation]; } +#endif } return image; } - -+(UIImageOrientation)sd_imageOrientationFromImageData:(NSData *)imageData { +#if SD_UIKIT || SD_WATCH ++(UIImageOrientation)sd_imageOrientationFromImageData:(nonnull NSData *)imageData { UIImageOrientation result = UIImageOrientationUp; CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL); if (imageSource) { @@ -112,7 +114,48 @@ + (UIImageOrientation) sd_exifOrientationToiOSOrientation:(int)exifOrientation { } return orientation; } +#endif + +- (nullable NSData *)sd_imageData { + return [self sd_imageDataAsFormat:SDImageFormatUndefined]; +} +- (nullable NSData *)sd_imageDataAsFormat:(SDImageFormat)imageFormat { + NSData *imageData = nil; + if (self) { +#if SD_UIKIT || SD_WATCH + int alphaInfo = CGImageGetAlphaInfo(self.CGImage); + BOOL hasAlpha = !(alphaInfo == kCGImageAlphaNone || + alphaInfo == kCGImageAlphaNoneSkipFirst || + alphaInfo == kCGImageAlphaNoneSkipLast); + + BOOL usePNG = hasAlpha; + + // the imageFormat param has priority here. But if the format is undefined, we relly on the alpha channel + if (imageFormat != SDImageFormatUndefined) { + usePNG = (imageFormat == SDImageFormatPNG); + } + + if (usePNG) { + imageData = UIImagePNGRepresentation(self); + } else { + imageData = UIImageJPEGRepresentation(self, (CGFloat)1.0); + } +#else + NSBitmapImageFileType imageFileType = NSJPEGFileType; + if (imageFormat == SDImageFormatGIF) { + imageFileType = NSGIFFileType; + } else if (imageFormat == SDImageFormatPNG) { + imageFileType = NSPNGFileType; + } + + imageData = [NSBitmapImageRep representationOfImageRepsInArray:self.representations + usingType:imageFileType + properties:@{}]; +#endif + } + return imageData; +} @end diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h index c1d8fea..ceb71c2 100644 --- a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h +++ b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.h @@ -6,8 +6,10 @@ * file that was distributed with this source code. */ -#import #import "SDWebImageCompat.h" + +#if SD_UIKIT + #import "SDWebImageManager.h" /** @@ -22,7 +24,7 @@ * * @param url The url for the image. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -32,7 +34,8 @@ * @param url The url for the image. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options; /** * Set the imageView `highlightedImage` with an `url`. @@ -46,7 +49,8 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -61,7 +65,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `highlightedImage` with an `url` and custom options. @@ -71,30 +77,18 @@ * @param url The url for the image. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; - -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentHighlightedImageLoad; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; @end - -@interface UIImageView (HighlightedWebCacheDeprecated) - -- (void)setHighlightedImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:completed:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:completed:`"); -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setHighlightedImageWithURL:options:progress:completed:`"); - -- (void)cancelCurrentHighlightedImageLoad __deprecated_msg("Use `sd_cancelCurrentHighlightedImageLoad`"); - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m index 921134e..fb13bd8 100644 --- a/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIImageView+HighlightedWebCache.m @@ -7,106 +7,46 @@ */ #import "UIImageView+HighlightedWebCache.h" -#import "UIView+WebCacheOperation.h" -#define UIImageViewHighlightedWebCacheOperationKey @"highlightedImage" +#if SD_UIKIT + +#import "UIView+WebCacheOperation.h" +#import "UIView+WebCache.h" @implementation UIImageView (HighlightedWebCache) -- (void)sd_setHighlightedImageWithURL:(NSURL *)url { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url { [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options { [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:completedBlock]; } -- (void)sd_setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_cancelCurrentHighlightedImageLoad]; - - if (url) { - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - if (!wself) return; - dispatch_main_sync_safe (^ - { - if (!wself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - wself.highlightedImage = image; - [wself setNeedsLayout]; - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:UIImageViewHighlightedWebCacheOperationKey]; - } else { - dispatch_main_async_safe(^{ - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - if (completedBlock) { - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_cancelCurrentHighlightedImageLoad { - [self sd_cancelImageLoadOperationWithKey:UIImageViewHighlightedWebCacheOperationKey]; +- (void)sd_setHighlightedImageWithURL:(nullable NSURL *)url + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + __weak typeof(self)weakSelf = self; + [self sd_internalSetImageWithURL:url + placeholderImage:nil + options:options + operationKey:@"UIImageViewImageOperationHighlighted" + setImageBlock:^(UIImage *image, NSData *imageData) { + weakSelf.highlightedImage = image; + } + progress:progressBlock + completed:completedBlock]; } @end - -@implementation UIImageView (HighlightedWebCacheDeprecated) - -- (void)setHighlightedImageWithURL:(NSURL *)url { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:nil]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:nil]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setHighlightedImageWithURL:(NSURL *)url options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setHighlightedImageWithURL:url options:0 progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)cancelCurrentHighlightedImageLoad { - [self sd_cancelCurrentHighlightedImageLoad]; -} - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h index 37ae1eb..b1d954f 100644 --- a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h +++ b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.h @@ -7,6 +7,9 @@ */ #import "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC + #import "SDWebImageManager.h" /** @@ -44,14 +47,6 @@ */ @interface UIImageView (WebCache) -/** - * Get the current image URL. - * - * Note that because of the limitations of categories this property can get out of sync - * if you use sd_setImage: directly. - */ -- (NSURL *)sd_imageURL; - /** * Set the imageView `image` with an `url`. * @@ -59,7 +54,7 @@ * * @param url The url for the image. */ -- (void)sd_setImageWithURL:(NSURL *)url; +- (void)sd_setImageWithURL:(nullable NSURL *)url; /** * Set the imageView `image` with an `url` and a placeholder. @@ -70,7 +65,8 @@ * @param placeholder The image to be set initially, until the image request finishes. * @see sd_setImageWithURL:placeholderImage:options: */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -81,7 +77,9 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options; /** * Set the imageView `image` with an `url`. @@ -95,7 +93,8 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder. @@ -110,7 +109,9 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -126,7 +127,10 @@ * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url`, placeholder and custom options. @@ -137,13 +141,18 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; /** * Set the imageView `image` with an `url` and optionally a placeholder image. @@ -154,62 +163,34 @@ * @param placeholder The image to be set initially, until the image request finishes. * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue * @param completedBlock A block called when operation has been completed. This block has no return value * and takes the requested UIImage as first parameter. In case of error the image parameter * is nil and the second parameter may contain an NSError. The third parameter is a Boolean * indicating if the image was retrieved from the local cache or from the network. * The fourth parameter is the original image url. */ -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock; +- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +#if SD_UIKIT + +#pragma mark - Animation of multiple images /** * Download an array of images and starts them in an animation loop * * @param arrayOfURLs An array of NSURL */ -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs; - -/** - * Cancel the current download - */ -- (void)sd_cancelCurrentImageLoad; +- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs; - (void)sd_cancelCurrentAnimationImagesLoad; -/** - * Show activity UIActivityIndicatorView - */ -- (void)setShowActivityIndicatorView:(BOOL)show; - -/** - * set desired UIActivityIndicatorViewStyle - * - * @param style The style of the UIActivityIndicatorView - */ -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style; +#endif @end - -@interface UIImageView (WebCacheDeprecated) - -- (NSURL *)imageURL __deprecated_msg("Use `sd_imageURL`"); - -- (void)setImageWithURL:(NSURL *)url __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options`"); - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:completed:`"); -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithURL:placeholderImage:options:progress:completed:`"); - -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock __deprecated_msg("Method deprecated. Use `sd_setImageWithPreviousCachedImageWithURL:placeholderImage:options:progress:completed:`"); - -- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs __deprecated_msg("Use `sd_setAnimationImagesWithURLs:`"); - -- (void)cancelCurrentArrayLoad __deprecated_msg("Use `sd_cancelCurrentAnimationImagesLoad`"); - -- (void)cancelCurrentImageLoad __deprecated_msg("Use `sd_cancelCurrentImageLoad`"); - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m index 889305b..81f687e 100644 --- a/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m +++ b/Pods/SDWebImage/SDWebImage/UIImageView+WebCache.m @@ -7,119 +7,82 @@ */ #import "UIImageView+WebCache.h" + +#if SD_UIKIT || SD_MAC + #import "objc/runtime.h" #import "UIView+WebCacheOperation.h" - -static char imageURLKey; -static char TAG_ACTIVITY_INDICATOR; -static char TAG_ACTIVITY_STYLE; -static char TAG_ACTIVITY_SHOW; +#import "UIView+WebCache.h" @implementation UIImageView (WebCache) -- (void)sd_setImageWithURL:(NSURL *)url { +- (void)sd_setImageWithURL:(nullable NSURL *)url { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options { [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; } -- (void)sd_setImageWithURL:(NSURL *)url completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock { [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock]; } -- (void)sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_cancelCurrentImageLoad]; - objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); - - if (!(options & SDWebImageDelayPlaceholder)) { - dispatch_main_async_safe(^{ - self.image = placeholder; - }); - } - - if (url) { - - // check if activityView is enabled or not - if ([self showActivityIndicatorView]) { - [self addActivityIndicator]; - } - - __weak __typeof(self)wself = self; - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { - [wself removeActivityIndicator]; - if (!wself) return; - dispatch_main_sync_safe(^{ - if (!wself) return; - if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) - { - completedBlock(image, error, cacheType, url); - return; - } - else if (image) { - wself.image = image; - [wself setNeedsLayout]; - } else { - if ((options & SDWebImageDelayPlaceholder)) { - wself.image = placeholder; - [wself setNeedsLayout]; - } - } - if (completedBlock && finished) { - completedBlock(image, error, cacheType, url); - } - }); - }]; - [self sd_setImageLoadOperation:operation forKey:@"UIImageViewImageLoad"]; - } else { - dispatch_main_async_safe(^{ - [self removeActivityIndicator]; - if (completedBlock) { - NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; - completedBlock(nil, error, SDImageCacheTypeNone, url); - } - }); - } -} - -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { +- (void)sd_setImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + [self sd_internalSetImageWithURL:url + placeholderImage:placeholder + options:options + operationKey:nil + setImageBlock:nil + progress:progressBlock + completed:completedBlock]; +} + +- (void)sd_setImageWithPreviousCachedImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:url]; - UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; + UIImage *lastPreviousCachedImage = [[SDImageCache sharedImageCache] imageFromCacheForKey:key]; [self sd_setImageWithURL:url placeholderImage:lastPreviousCachedImage ?: placeholder options:options progress:progressBlock completed:completedBlock]; } -- (NSURL *)sd_imageURL { - return objc_getAssociatedObject(self, &imageURLKey); -} +#if SD_UIKIT -- (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { +#pragma mark - Animation of multiple images + +- (void)sd_setAnimationImagesWithURLs:(nonnull NSArray *)arrayOfURLs { [self sd_cancelCurrentAnimationImagesLoad]; __weak __typeof(self)wself = self; - NSMutableArray *operationsArray = [[NSMutableArray alloc] init]; + NSMutableArray> *operationsArray = [[NSMutableArray alloc] init]; for (NSURL *logoImageURL in arrayOfURLs) { - id operation = [SDWebImageManager.sharedManager downloadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + id operation = [SDWebImageManager.sharedManager loadImageWithURL:logoImageURL options:0 progress:nil completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { if (!wself) return; - dispatch_main_sync_safe(^{ + dispatch_main_async_safe(^{ __strong UIImageView *sself = wself; [sself stopAnimating]; if (sself && image) { - NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; + NSMutableArray *currentImages = [[sself animationImages] mutableCopy]; if (!currentImages) { currentImages = [[NSMutableArray alloc] init]; } @@ -134,148 +97,14 @@ - (void)sd_setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { [operationsArray addObject:operation]; } - [self sd_setImageLoadOperation:[NSArray arrayWithArray:operationsArray] forKey:@"UIImageViewAnimationImages"]; -} - -- (void)sd_cancelCurrentImageLoad { - [self sd_cancelImageLoadOperationWithKey:@"UIImageViewImageLoad"]; + [self sd_setImageLoadOperation:[operationsArray copy] forKey:@"UIImageViewAnimationImages"]; } - (void)sd_cancelCurrentAnimationImagesLoad { [self sd_cancelImageLoadOperationWithKey:@"UIImageViewAnimationImages"]; } - - -#pragma mark - -- (UIActivityIndicatorView *)activityIndicator { - return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); -} - -- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { - objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); -} - -- (void)setShowActivityIndicatorView:(BOOL)show{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, [NSNumber numberWithBool:show], OBJC_ASSOCIATION_RETAIN); -} - -- (BOOL)showActivityIndicatorView{ - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; -} - -- (void)setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ - objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); -} - -- (int)getIndicatorStyle{ - return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; -} - -- (void)addActivityIndicator { - if (!self.activityIndicator) { - self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self getIndicatorStyle]]; - self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; - - dispatch_main_async_safe(^{ - [self addSubview:self.activityIndicator]; - - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterX - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterX - multiplier:1.0 - constant:0.0]]; - [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator - attribute:NSLayoutAttributeCenterY - relatedBy:NSLayoutRelationEqual - toItem:self - attribute:NSLayoutAttributeCenterY - multiplier:1.0 - constant:0.0]]; - }); - } - - dispatch_main_async_safe(^{ - [self.activityIndicator startAnimating]; - }); - -} - -- (void)removeActivityIndicator { - if (self.activityIndicator) { - [self.activityIndicator removeFromSuperview]; - self.activityIndicator = nil; - } -} +#endif @end - -@implementation UIImageView (WebCacheDeprecated) - -- (NSURL *)imageURL { - return [self sd_imageURL]; -} - -- (void)setImageWithURL:(NSURL *)url { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil]; -} - -- (void)setImageWithURL:(NSURL *)url completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock { - [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { - if (completedBlock) { - completedBlock(image, error, cacheType); - } - }]; -} - -- (void)sd_setImageWithPreviousCachedImageWithURL:(NSURL *)url andPlaceholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletionBlock)completedBlock { - [self sd_setImageWithPreviousCachedImageWithURL:url placeholderImage:placeholder options:options progress:progressBlock completed:completedBlock]; -} - -- (void)cancelCurrentArrayLoad { - [self sd_cancelCurrentAnimationImagesLoad]; -} - -- (void)cancelCurrentImageLoad { - [self sd_cancelCurrentImageLoad]; -} - -- (void)setAnimationImagesWithURLs:(NSArray *)arrayOfURLs { - [self sd_setAnimationImagesWithURLs:arrayOfURLs]; -} - -@end +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCache.h b/Pods/SDWebImage/SDWebImage/UIView+WebCache.h new file mode 100644 index 0000000..4c57519 --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/UIView+WebCache.h @@ -0,0 +1,82 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC + +#import "SDWebImageManager.h" + +typedef void(^SDSetImageBlock)(UIImage * _Nullable image, NSData * _Nullable imageData); + +@interface UIView (WebCache) + +/** + * Get the current image URL. + * + * Note that because of the limitations of categories this property can get out of sync + * if you use setImage: directly. + */ +- (nullable NSURL *)sd_imageURL; + +/** + * Set the imageView `image` with an `url` and optionally a placeholder image. + * + * The download is asynchronous and cached. + * + * @param url The url for the image. + * @param placeholder The image to be set initially, until the image request finishes. + * @param options The options to use when downloading the image. @see SDWebImageOptions for the possible values. + * @param operationKey A string to be used as the operation key. If nil, will use the class name + * @param setImageBlock Block used for custom set image code + * @param progressBlock A block called while image is downloading + * @note the progress block is executed on a background queue + * @param completedBlock A block called when operation has been completed. This block has no return value + * and takes the requested UIImage as first parameter. In case of error the image parameter + * is nil and the second parameter may contain an NSError. The third parameter is a Boolean + * indicating if the image was retrieved from the local cache or from the network. + * The fourth parameter is the original image url. + */ +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock; + +/** + * Cancel the current download + */ +- (void)sd_cancelCurrentImageLoad; + +#if SD_UIKIT + +#pragma mark - Activity indicator + +/** + * Show activity UIActivityIndicatorView + */ +- (void)sd_setShowActivityIndicatorView:(BOOL)show; + +/** + * set desired UIActivityIndicatorViewStyle + * + * @param style The style of the UIActivityIndicatorView + */ +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style; + +- (BOOL)sd_showActivityIndicatorView; +- (void)sd_addActivityIndicator; +- (void)sd_removeActivityIndicator; + +#endif + +@end + +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCache.m b/Pods/SDWebImage/SDWebImage/UIView+WebCache.m new file mode 100644 index 0000000..ad2b54c --- /dev/null +++ b/Pods/SDWebImage/SDWebImage/UIView+WebCache.m @@ -0,0 +1,200 @@ +/* + * This file is part of the SDWebImage package. + * (c) Olivier Poitrey + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +#import "UIView+WebCache.h" + +#if SD_UIKIT || SD_MAC + +#import "objc/runtime.h" +#import "UIView+WebCacheOperation.h" + +static char imageURLKey; + +#if SD_UIKIT +static char TAG_ACTIVITY_INDICATOR; +static char TAG_ACTIVITY_STYLE; +#endif +static char TAG_ACTIVITY_SHOW; + +@implementation UIView (WebCache) + +- (nullable NSURL *)sd_imageURL { + return objc_getAssociatedObject(self, &imageURLKey); +} + +- (void)sd_internalSetImageWithURL:(nullable NSURL *)url + placeholderImage:(nullable UIImage *)placeholder + options:(SDWebImageOptions)options + operationKey:(nullable NSString *)operationKey + setImageBlock:(nullable SDSetImageBlock)setImageBlock + progress:(nullable SDWebImageDownloaderProgressBlock)progressBlock + completed:(nullable SDExternalCompletionBlock)completedBlock { + NSString *validOperationKey = operationKey ?: NSStringFromClass([self class]); + [self sd_cancelImageLoadOperationWithKey:validOperationKey]; + objc_setAssociatedObject(self, &imageURLKey, url, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + + if (!(options & SDWebImageDelayPlaceholder)) { + dispatch_main_async_safe(^{ + [self sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + }); + } + + if (url) { + // check if activityView is enabled or not + if ([self sd_showActivityIndicatorView]) { + [self sd_addActivityIndicator]; + } + + __weak __typeof(self)wself = self; + id operation = [SDWebImageManager.sharedManager loadImageWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSData *data, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { + __strong __typeof (wself) sself = wself; + [sself sd_removeActivityIndicator]; + if (!sself) { + return; + } + dispatch_main_async_safe(^{ + if (!sself) { + return; + } + if (image && (options & SDWebImageAvoidAutoSetImage) && completedBlock) { + completedBlock(image, error, cacheType, url); + return; + } else if (image) { + [sself sd_setImage:image imageData:data basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + [sself sd_setNeedsLayout]; + } else { + if ((options & SDWebImageDelayPlaceholder)) { + [sself sd_setImage:placeholder imageData:nil basedOnClassOrViaCustomSetImageBlock:setImageBlock]; + [sself sd_setNeedsLayout]; + } + } + if (completedBlock && finished) { + completedBlock(image, error, cacheType, url); + } + }); + }]; + [self sd_setImageLoadOperation:operation forKey:validOperationKey]; + } else { + dispatch_main_async_safe(^{ + [self sd_removeActivityIndicator]; + if (completedBlock) { + NSError *error = [NSError errorWithDomain:SDWebImageErrorDomain code:-1 userInfo:@{NSLocalizedDescriptionKey : @"Trying to load a nil url"}]; + completedBlock(nil, error, SDImageCacheTypeNone, url); + } + }); + } +} + +- (void)sd_cancelCurrentImageLoad { + [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])]; +} + +- (void)sd_setImage:(UIImage *)image imageData:(NSData *)imageData basedOnClassOrViaCustomSetImageBlock:(SDSetImageBlock)setImageBlock { + if (setImageBlock) { + setImageBlock(image, imageData); + return; + } + +#if SD_UIKIT || SD_MAC + if ([self isKindOfClass:[UIImageView class]]) { + UIImageView *imageView = (UIImageView *)self; + imageView.image = image; + } +#endif + +#if SD_UIKIT + if ([self isKindOfClass:[UIButton class]]) { + UIButton *button = (UIButton *)self; + [button setImage:image forState:UIControlStateNormal]; + } +#endif +} + +- (void)sd_setNeedsLayout { +#if SD_UIKIT + [self setNeedsLayout]; +#elif SD_MAC + [self setNeedsLayout:YES]; +#endif +} + +#pragma mark - Activity indicator + +#pragma mark - +#if SD_UIKIT +- (UIActivityIndicatorView *)activityIndicator { + return (UIActivityIndicatorView *)objc_getAssociatedObject(self, &TAG_ACTIVITY_INDICATOR); +} + +- (void)setActivityIndicator:(UIActivityIndicatorView *)activityIndicator { + objc_setAssociatedObject(self, &TAG_ACTIVITY_INDICATOR, activityIndicator, OBJC_ASSOCIATION_RETAIN); +} +#endif + +- (void)sd_setShowActivityIndicatorView:(BOOL)show { + objc_setAssociatedObject(self, &TAG_ACTIVITY_SHOW, @(show), OBJC_ASSOCIATION_RETAIN); +} + +- (BOOL)sd_showActivityIndicatorView { + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_SHOW) boolValue]; +} + +#if SD_UIKIT +- (void)sd_setIndicatorStyle:(UIActivityIndicatorViewStyle)style{ + objc_setAssociatedObject(self, &TAG_ACTIVITY_STYLE, [NSNumber numberWithInt:style], OBJC_ASSOCIATION_RETAIN); +} + +- (int)sd_getIndicatorStyle{ + return [objc_getAssociatedObject(self, &TAG_ACTIVITY_STYLE) intValue]; +} +#endif + +- (void)sd_addActivityIndicator { +#if SD_UIKIT + if (!self.activityIndicator) { + self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:[self sd_getIndicatorStyle]]; + self.activityIndicator.translatesAutoresizingMaskIntoConstraints = NO; + + dispatch_main_async_safe(^{ + [self addSubview:self.activityIndicator]; + + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterX + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterX + multiplier:1.0 + constant:0.0]]; + [self addConstraint:[NSLayoutConstraint constraintWithItem:self.activityIndicator + attribute:NSLayoutAttributeCenterY + relatedBy:NSLayoutRelationEqual + toItem:self + attribute:NSLayoutAttributeCenterY + multiplier:1.0 + constant:0.0]]; + }); + } + + dispatch_main_async_safe(^{ + [self.activityIndicator startAnimating]; + }); +#endif +} + +- (void)sd_removeActivityIndicator { +#if SD_UIKIT + if (self.activityIndicator) { + [self.activityIndicator removeFromSuperview]; + self.activityIndicator = nil; + } +#endif +} + +@end + +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h index 6719036..f5e95fa 100644 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h +++ b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.h @@ -6,7 +6,10 @@ * file that was distributed with this source code. */ -#import +#import "SDWebImageCompat.h" + +#if SD_UIKIT || SD_MAC + #import "SDWebImageManager.h" @interface UIView (WebCacheOperation) @@ -17,20 +20,22 @@ * @param operation the operation * @param key key for storing the operation */ -- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key; +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key; /** * Cancel all operations for the current UIView and key * * @param key key for identifying the operations */ -- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key; +- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key; /** * Just remove the operations corresponding to the current UIView and key without cancelling them * * @param key key for identifying the operations */ -- (void)sd_removeImageLoadOperationWithKey:(NSString *)key; +- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key; @end + +#endif diff --git a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m index 9219478..a515a74 100644 --- a/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m +++ b/Pods/SDWebImage/SDWebImage/UIView+WebCacheOperation.m @@ -7,14 +7,19 @@ */ #import "UIView+WebCacheOperation.h" + +#if SD_UIKIT || SD_MAC + #import "objc/runtime.h" static char loadOperationKey; +typedef NSMutableDictionary SDOperationsDictionary; + @implementation UIView (WebCacheOperation) -- (NSMutableDictionary *)operationDictionary { - NSMutableDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); +- (SDOperationsDictionary *)operationDictionary { + SDOperationsDictionary *operations = objc_getAssociatedObject(self, &loadOperationKey); if (operations) { return operations; } @@ -23,16 +28,20 @@ - (NSMutableDictionary *)operationDictionary { return operations; } -- (void)sd_setImageLoadOperation:(id)operation forKey:(NSString *)key { - [self sd_cancelImageLoadOperationWithKey:key]; - NSMutableDictionary *operationDictionary = [self operationDictionary]; - [operationDictionary setObject:operation forKey:key]; +- (void)sd_setImageLoadOperation:(nullable id)operation forKey:(nullable NSString *)key { + if (key) { + [self sd_cancelImageLoadOperationWithKey:key]; + if (operation) { + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + operationDictionary[key] = operation; + } + } } -- (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { +- (void)sd_cancelImageLoadOperationWithKey:(nullable NSString *)key { // Cancel in progress downloader from queue - NSMutableDictionary *operationDictionary = [self operationDictionary]; - id operations = [operationDictionary objectForKey:key]; + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + id operations = operationDictionary[key]; if (operations) { if ([operations isKindOfClass:[NSArray class]]) { for (id operation in operations) { @@ -47,9 +56,13 @@ - (void)sd_cancelImageLoadOperationWithKey:(NSString *)key { } } -- (void)sd_removeImageLoadOperationWithKey:(NSString *)key { - NSMutableDictionary *operationDictionary = [self operationDictionary]; - [operationDictionary removeObjectForKey:key]; +- (void)sd_removeImageLoadOperationWithKey:(nullable NSString *)key { + if (key) { + SDOperationsDictionary *operationDictionary = [self operationDictionary]; + [operationDictionary removeObjectForKey:key]; + } } @end + +#endif diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch index b52cf0d..e72247a 100644 --- a/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch +++ b/Pods/Target Support Files/AFNetworking/AFNetworking-prefix.pch @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif #ifndef TARGET_OS_IOS diff --git a/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig index c8073d2..55d6db8 100644 --- a/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig +++ b/Pods/Target Support Files/AFNetworking/AFNetworking.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AFNetworking GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/AFNetworking" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" OTHER_LDFLAGS = -framework "CoreGraphics" -framework "MobileCoreServices" -framework "Security" -framework "SystemConfiguration" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/AFNetworking PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BAAlert/BAAlert-dummy.m b/Pods/Target Support Files/BAAlert/BAAlert-dummy.m new file mode 100644 index 0000000..207f0a5 --- /dev/null +++ b/Pods/Target Support Files/BAAlert/BAAlert-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_BAAlert : NSObject +@end +@implementation PodsDummy_BAAlert +@end diff --git a/Pods/Target Support Files/BAAlert/BAAlert-prefix.pch b/Pods/Target Support Files/BAAlert/BAAlert-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/BAAlert/BAAlert-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/BAAlert/BAAlert.xcconfig b/Pods/Target Support Files/BAAlert/BAAlert.xcconfig new file mode 100644 index 0000000..7de926a --- /dev/null +++ b/Pods/Target Support Files/BAAlert/BAAlert.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BAAlert +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BAAlert" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BAAlert +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BAButton/BAButton-prefix.pch b/Pods/Target Support Files/BAButton/BAButton-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/BAButton/BAButton-prefix.pch +++ b/Pods/Target Support Files/BAButton/BAButton-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/BAButton/BAButton.xcconfig b/Pods/Target Support Files/BAButton/BAButton.xcconfig index 9758716..c955cad 100644 --- a/Pods/Target Support Files/BAButton/BAButton.xcconfig +++ b/Pods/Target Support Files/BAButton/BAButton.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BAButton GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BAButton" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BAButton" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BAButton PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BANetManager/BANetManager-dummy.m b/Pods/Target Support Files/BANetManager/BANetManager-dummy.m new file mode 100644 index 0000000..6a19e4d --- /dev/null +++ b/Pods/Target Support Files/BANetManager/BANetManager-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_BANetManager : NSObject +@end +@implementation PodsDummy_BANetManager +@end diff --git a/Pods/Target Support Files/BANetManager/BANetManager-prefix.pch b/Pods/Target Support Files/BANetManager/BANetManager-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/BANetManager/BANetManager-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/BANetManager/BANetManager.xcconfig b/Pods/Target Support Files/BANetManager/BANetManager.xcconfig new file mode 100644 index 0000000..a71c06c --- /dev/null +++ b/Pods/Target Support Files/BANetManager/BANetManager.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BANetManager +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BANetManager" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" +OTHER_LDFLAGS = -framework "UIKit" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BANetManager +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BAPickView/BAPickView-dummy.m b/Pods/Target Support Files/BAPickView/BAPickView-dummy.m new file mode 100644 index 0000000..decc0f8 --- /dev/null +++ b/Pods/Target Support Files/BAPickView/BAPickView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_BAPickView : NSObject +@end +@implementation PodsDummy_BAPickView +@end diff --git a/Pods/Target Support Files/BAPickView/BAPickView-prefix.pch b/Pods/Target Support Files/BAPickView/BAPickView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/BAPickView/BAPickView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/BAPickView/BAPickView.xcconfig b/Pods/Target Support Files/BAPickView/BAPickView.xcconfig new file mode 100644 index 0000000..7c981cd --- /dev/null +++ b/Pods/Target Support Files/BAPickView/BAPickView.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BAPickView +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BAPickView" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BAPickView +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BATextView/BATextView-dummy.m b/Pods/Target Support Files/BATextView/BATextView-dummy.m new file mode 100644 index 0000000..745b0a6 --- /dev/null +++ b/Pods/Target Support Files/BATextView/BATextView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_BATextView : NSObject +@end +@implementation PodsDummy_BATextView +@end diff --git a/Pods/Target Support Files/BATextView/BATextView-prefix.pch b/Pods/Target Support Files/BATextView/BATextView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/BATextView/BATextView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/BATextView/BATextView.xcconfig b/Pods/Target Support Files/BATextView/BATextView.xcconfig new file mode 100644 index 0000000..8510032 --- /dev/null +++ b/Pods/Target Support Files/BATextView/BATextView.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BATextView +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BATextView" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BATextView +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BATouchID/BATouchID-dummy.m b/Pods/Target Support Files/BATouchID/BATouchID-dummy.m new file mode 100644 index 0000000..246a8a2 --- /dev/null +++ b/Pods/Target Support Files/BATouchID/BATouchID-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_BATouchID : NSObject +@end +@implementation PodsDummy_BATouchID +@end diff --git a/Pods/Target Support Files/BATouchID/BATouchID-prefix.pch b/Pods/Target Support Files/BATouchID/BATouchID-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/BATouchID/BATouchID-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/BATouchID/BATouchID.xcconfig b/Pods/Target Support Files/BATouchID/BATouchID.xcconfig new file mode 100644 index 0000000..46893a2 --- /dev/null +++ b/Pods/Target Support Files/BATouchID/BATouchID.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BATouchID +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BATouchID" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/BATouchID +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/BlocksKit/BlocksKit-dummy.m b/Pods/Target Support Files/BlocksKit/BlocksKit-dummy.m deleted file mode 100644 index 554dbd5..0000000 --- a/Pods/Target Support Files/BlocksKit/BlocksKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_BlocksKit : NSObject -@end -@implementation PodsDummy_BlocksKit -@end diff --git a/Pods/Target Support Files/BlocksKit/BlocksKit-prefix.pch b/Pods/Target Support Files/BlocksKit/BlocksKit-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/BlocksKit/BlocksKit-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/BlocksKit/BlocksKit.xcconfig b/Pods/Target Support Files/BlocksKit/BlocksKit.xcconfig deleted file mode 100644 index 4e75998..0000000 --- a/Pods/Target Support Files/BlocksKit/BlocksKit.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/BlocksKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/BlocksKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = -framework "MessageUI" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-dummy.m b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-dummy.m new file mode 100644 index 0000000..9166203 --- /dev/null +++ b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_DZNEmptyDataSet : NSObject +@end +@implementation PodsDummy_DZNEmptyDataSet +@end diff --git a/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.xcconfig b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.xcconfig new file mode 100644 index 0000000..6b93913 --- /dev/null +++ b/Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = -framework "UIKit" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/DZNEmptyDataSet +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-dummy.m b/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-dummy.m deleted file mode 100644 index f5eb186..0000000 --- a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBAllocationTracker : NSObject -@end -@implementation PodsDummy_FBAllocationTracker -@end diff --git a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-prefix.pch b/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker.xcconfig b/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker.xcconfig deleted file mode 100644 index 631ef16..0000000 --- a/Pods/Target Support Files/FBAllocationTracker/FBAllocationTracker.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBAllocationTracker" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = -l"c++" -framework "Foundation" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-dummy.m b/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-dummy.m deleted file mode 100644 index df22456..0000000 --- a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_FBMemoryProfiler : NSObject -@end -@implementation PodsDummy_FBMemoryProfiler -@end diff --git a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-prefix.pch b/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler.xcconfig b/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler.xcconfig deleted file mode 100644 index 94bab92..0000000 --- a/Pods/Target Support Files/FBMemoryProfiler/FBMemoryProfiler.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" -OTHER_LDFLAGS = -l"c++" -framework "CoreGraphics" -framework "Foundation" -framework "UIKit" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch b/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch +++ b/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector.xcconfig b/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector.xcconfig index 40710d3..05a320e 100644 --- a/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector.xcconfig +++ b/Pods/Target Support Files/FBRetainCycleDetector/FBRetainCycleDetector.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" OTHER_LDFLAGS = -l"c++" -framework "CoreGraphics" -framework "Foundation" -framework "UIKit" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBRetainCycleDetector PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/FMDB/FMDB-dummy.m b/Pods/Target Support Files/FMDB/FMDB-dummy.m new file mode 100644 index 0000000..20ea8f1 --- /dev/null +++ b/Pods/Target Support Files/FMDB/FMDB-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_FMDB : NSObject +@end +@implementation PodsDummy_FMDB +@end diff --git a/Pods/Target Support Files/FMDB/FMDB-prefix.pch b/Pods/Target Support Files/FMDB/FMDB-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/FMDB/FMDB-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/FMDB/FMDB.xcconfig b/Pods/Target Support Files/FMDB/FMDB.xcconfig new file mode 100644 index 0000000..e8f1dfc --- /dev/null +++ b/Pods/Target Support Files/FMDB/FMDB.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/FMDB +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/FMDB" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = -l"sqlite3" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/FMDB +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch b/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch +++ b/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.xcconfig b/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.xcconfig index 25fddee..b973b56 100644 --- a/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.xcconfig +++ b/Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/IQKeyboardManager" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = -framework "CoreGraphics" -framework "Foundation" -framework "UIKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/IQKeyboardManager" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = -framework "CoreGraphics" -framework "Foundation" -framework "QuartzCore" -framework "UIKit" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManager PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch b/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch +++ b/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner.xcconfig b/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner.xcconfig index 2152d81..f3ad25a 100644 --- a/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner.xcconfig +++ b/Pods/Target Support Files/JMRoundedCorner/JMRoundedCorner.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JMRoundedCorner" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/JMRoundedCorner" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/JMRoundedCorner PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig index ce6b6a8..90a2e22 100644 --- a/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig +++ b/Pods/Target Support Files/MBProgressHUD/MBProgressHUD.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MBProgressHUD" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MBProgressHUD" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" OTHER_LDFLAGS = -framework "CoreGraphics" -framework "QuartzCore" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MBProgressHUD PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/MJExtension/MJExtension-prefix.pch b/Pods/Target Support Files/MJExtension/MJExtension-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/MJExtension/MJExtension-prefix.pch +++ b/Pods/Target Support Files/MJExtension/MJExtension-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/MJExtension/MJExtension.xcconfig b/Pods/Target Support Files/MJExtension/MJExtension.xcconfig index ea80e6b..9d6e3ab 100644 --- a/Pods/Target Support Files/MJExtension/MJExtension.xcconfig +++ b/Pods/Target Support Files/MJExtension/MJExtension.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MJExtension GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MJExtension" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MJExtension" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MJExtension PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch b/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch +++ b/Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/MJRefresh/MJRefresh.xcconfig b/Pods/Target Support Files/MJRefresh/MJRefresh.xcconfig index b66c41c..aa65158 100644 --- a/Pods/Target Support Files/MJRefresh/MJRefresh.xcconfig +++ b/Pods/Target Support Files/MJRefresh/MJRefresh.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MJRefresh GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MJRefresh" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MJRefresh" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MJRefresh PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch b/Pods/Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch +++ b/Pods/Target Support Files/MLeaksFinder/MLeaksFinder-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/MLeaksFinder/MLeaksFinder.xcconfig b/Pods/Target Support Files/MLeaksFinder/MLeaksFinder.xcconfig index 4230428..1ef6fb6 100644 --- a/Pods/Target Support Files/MLeaksFinder/MLeaksFinder.xcconfig +++ b/Pods/Target Support Files/MLeaksFinder/MLeaksFinder.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MLeaksFinder" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MLeaksFinder" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" LIBRARY_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MLeaksFinder PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Masonry/Masonry-prefix.pch b/Pods/Target Support Files/Masonry/Masonry-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/Masonry/Masonry-prefix.pch +++ b/Pods/Target Support Files/Masonry/Masonry-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/Masonry/Masonry.xcconfig b/Pods/Target Support Files/Masonry/Masonry.xcconfig index c5c25e7..3e24f51 100644 --- a/Pods/Target Support Files/Masonry/Masonry.xcconfig +++ b/Pods/Target Support Files/Masonry/Masonry.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Masonry GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Masonry" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Masonry" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" OTHER_LDFLAGS = -framework "Foundation" -framework "UIKit" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Masonry PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/MyLayout/MyLayout-prefix.pch b/Pods/Target Support Files/MyLayout/MyLayout-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/MyLayout/MyLayout-prefix.pch +++ b/Pods/Target Support Files/MyLayout/MyLayout-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/MyLayout/MyLayout.xcconfig b/Pods/Target Support Files/MyLayout/MyLayout.xcconfig index 24fd8f0..35215c1 100644 --- a/Pods/Target Support Files/MyLayout/MyLayout.xcconfig +++ b/Pods/Target Support Files/MyLayout/MyLayout.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MyLayout GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MyLayout" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MyLayout" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MyLayout PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/NullSafe/NullSafe-prefix.pch b/Pods/Target Support Files/NullSafe/NullSafe-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/NullSafe/NullSafe-prefix.pch +++ b/Pods/Target Support Files/NullSafe/NullSafe-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/NullSafe/NullSafe.xcconfig b/Pods/Target Support Files/NullSafe/NullSafe.xcconfig index 681392d..1569ff3 100644 --- a/Pods/Target Support Files/NullSafe/NullSafe.xcconfig +++ b/Pods/Target Support Files/NullSafe/NullSafe.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/NullSafe GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/NullSafe" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/NullSafe" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/NullSafe PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown index f866e0c..272e19a 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.markdown @@ -24,6 +24,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## BAAlert + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ## BAButton The MIT License (MIT) @@ -49,84 +74,141 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## BlocksKit +## BANetManager -// -// LICENSE -// BlocksKit -// +The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -## FBAllocationTracker +## BAPickView -BSD License +MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +## BATextView + +The MIT License (MIT) + +Copyright (c) 2017 boai + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## BATouchID + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +## BaiduMapKit + +The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## FBMemoryProfiler +## DZNEmptyDataSet -LICENSE AGREEMENT +The MIT License (MIT) -For FBMemoryProfiler software +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## FBRetainCycleDetector @@ -163,6 +245,37 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## FMDB + +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ## IQKeyboardManager IQKeyboardManager license @@ -379,6 +492,29 @@ freely, subject to the following restrictions: misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +## ReactiveObjC + +**Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ## SDAutoLayout The MIT License (MIT) @@ -429,38 +565,17 @@ THE SOFTWARE. -## UMengSocial +## UMengAnalytics-NO-IDFA Copyright 2011 - 2015 UMeng.com. All rights reserved. -## WebViewJavascriptBridge - -Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +## UMengUShare -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +Copyright 2011 - 2017 UMeng.com. All rights reserved. -## YYKit +## YYCache The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist index 7f23d26..0f9e985 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-acknowledgements.plist @@ -14,7 +14,7 @@
FooterText - Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) + Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,16 +34,49 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title AFNetworking Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAAlert + Type + PSGroupSpecifier + FooterText The MIT License (MIT) -Copyright (c) 2016 博爱1616 +Copyright (c) 2016 博爱1616 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -63,6 +96,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title BAButton Type @@ -70,93 +105,174 @@ SOFTWARE. FooterText - // -// LICENSE -// BlocksKit -// + The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + License + MIT Title - BlocksKit + BANetManager Type PSGroupSpecifier FooterText - BSD License + MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAPickView + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Copyright (c) 2017 boai - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT + Title + BATextView + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BATouchID + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License + MIT Title - FBAllocationTracker + BaiduMapKit Type PSGroupSpecifier FooterText - LICENSE AGREEMENT - -For FBMemoryProfiler software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. - -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. + The MIT License (MIT) + +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - FBMemoryProfiler + DZNEmptyDataSet Type PSGroupSpecifier @@ -193,11 +309,50 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ License + BSD Title FBRetainCycleDetector Type PSGroupSpecifier + + FooterText + If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License + MIT + Title + FMDB + Type + PSGroupSpecifier + FooterText IQKeyboardManager license @@ -225,6 +380,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title IQKeyboardManager Type @@ -255,6 +412,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ License + MIT Title JMRoundedCorner Type @@ -262,7 +421,7 @@ SOFTWARE. FooterText - Copyright © 2009-2016 Matej Bukovinski + Copyright © 2009-2016 Matej Bukovinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -281,6 +440,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MBProgressHUD Type @@ -308,6 +469,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MJExtension Type @@ -335,6 +498,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ License + MIT Title MJRefresh Type @@ -362,6 +527,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ License + MIT Title MLeaksFinder Type @@ -388,6 +555,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title Masonry Type @@ -397,7 +566,7 @@ THE SOFTWARE. FooterText The MIT License (MIT) -Copyright (c) 2015 欧阳大哥 +Copyright (c) 2015 欧阳大哥 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -417,6 +586,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MyLayout Type @@ -445,11 +616,42 @@ freely, subject to the following restrictions: 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. + License + zlib Title NullSafe Type PSGroupSpecifier + + FooterText + **Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + MIT + Title + ReactiveObjC + Type + PSGroupSpecifier + FooterText The MIT License (MIT) @@ -475,6 +677,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDAutoLayout Type @@ -503,6 +707,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDWebImage Type @@ -512,38 +718,21 @@ THE SOFTWARE. FooterText Copyright 2011 - 2015 UMeng.com. All rights reserved. + License + Copyright Title - UMengSocial + UMengAnalytics-NO-IDFA Type PSGroupSpecifier FooterText - Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + Copyright 2011 - 2017 UMeng.com. All rights reserved. + License + Copyright Title - WebViewJavascriptBridge + UMengUShare Type PSGroupSpecifier @@ -572,8 +761,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - YYKit + YYCache Type PSGroupSpecifier diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-frameworks.sh b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-frameworks.sh index 893c16a..0f29f13 100755 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-frameworks.sh +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-frameworks.sh @@ -59,8 +59,13 @@ code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -82,3 +87,6 @@ strip_invalid_archs() { fi } +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-resources.sh b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-resources.sh index 7a9b303..9b70a9d 100755 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-resources.sh +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests-resources.sh @@ -18,17 +18,17 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; esac -realpath() { - DIRECTORY="$(cd "${1%/*}" && pwd)" - FILENAME="${1##*/}" - echo "$DIRECTORY/$FILENAME" -} - install_resource() { if [[ "$1" = /* ]] ; then @@ -70,7 +70,7 @@ EOM xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) - ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) @@ -80,38 +80,26 @@ EOM esac } if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -127,7 +115,7 @@ then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) while read line; do - if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + if [[ $line != "${PODS_ROOT}*" ]]; then XCASSET_FILES+=("$line") fi done <<<"$OTHER_XCASSETS" diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.debug.xcconfig b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.debug.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.debug.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.release.xcconfig b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.release.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.release.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectTests/Pods-BABaseProject-BABaseProjectTests.release.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown index f866e0c..272e19a 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.markdown @@ -24,6 +24,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## BAAlert + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ## BAButton The MIT License (MIT) @@ -49,84 +74,141 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## BlocksKit +## BANetManager -// -// LICENSE -// BlocksKit -// +The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -## FBAllocationTracker +## BAPickView -BSD License +MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +## BATextView + +The MIT License (MIT) + +Copyright (c) 2017 boai + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## BATouchID + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +## BaiduMapKit + +The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## FBMemoryProfiler +## DZNEmptyDataSet -LICENSE AGREEMENT +The MIT License (MIT) -For FBMemoryProfiler software +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## FBRetainCycleDetector @@ -163,6 +245,37 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## FMDB + +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ## IQKeyboardManager IQKeyboardManager license @@ -379,6 +492,29 @@ freely, subject to the following restrictions: misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +## ReactiveObjC + +**Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ## SDAutoLayout The MIT License (MIT) @@ -429,38 +565,17 @@ THE SOFTWARE. -## UMengSocial +## UMengAnalytics-NO-IDFA Copyright 2011 - 2015 UMeng.com. All rights reserved. -## WebViewJavascriptBridge - -Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +## UMengUShare -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +Copyright 2011 - 2017 UMeng.com. All rights reserved. -## YYKit +## YYCache The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist index 7f23d26..0f9e985 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-acknowledgements.plist @@ -14,7 +14,7 @@ FooterText - Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) + Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,16 +34,49 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title AFNetworking Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAAlert + Type + PSGroupSpecifier + FooterText The MIT License (MIT) -Copyright (c) 2016 博爱1616 +Copyright (c) 2016 博爱1616 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -63,6 +96,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title BAButton Type @@ -70,93 +105,174 @@ SOFTWARE. FooterText - // -// LICENSE -// BlocksKit -// + The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + License + MIT Title - BlocksKit + BANetManager Type PSGroupSpecifier FooterText - BSD License + MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAPickView + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Copyright (c) 2017 boai - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT + Title + BATextView + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BATouchID + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License + MIT Title - FBAllocationTracker + BaiduMapKit Type PSGroupSpecifier FooterText - LICENSE AGREEMENT - -For FBMemoryProfiler software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. - -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. + The MIT License (MIT) + +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - FBMemoryProfiler + DZNEmptyDataSet Type PSGroupSpecifier @@ -193,11 +309,50 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License + BSD Title FBRetainCycleDetector Type PSGroupSpecifier + + FooterText + If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License + MIT + Title + FMDB + Type + PSGroupSpecifier + FooterText IQKeyboardManager license @@ -225,6 +380,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title IQKeyboardManager Type @@ -255,6 +412,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title JMRoundedCorner Type @@ -262,7 +421,7 @@ SOFTWARE. FooterText - Copyright © 2009-2016 Matej Bukovinski + Copyright © 2009-2016 Matej Bukovinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -281,6 +440,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MBProgressHUD Type @@ -308,6 +469,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MJExtension Type @@ -335,6 +498,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MJRefresh Type @@ -362,6 +527,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MLeaksFinder Type @@ -388,6 +555,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title Masonry Type @@ -397,7 +566,7 @@ THE SOFTWARE. FooterText The MIT License (MIT) -Copyright (c) 2015 欧阳大哥 +Copyright (c) 2015 欧阳大哥 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -417,6 +586,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MyLayout Type @@ -445,11 +616,42 @@ freely, subject to the following restrictions: 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. + License + zlib Title NullSafe Type PSGroupSpecifier + + FooterText + **Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + MIT + Title + ReactiveObjC + Type + PSGroupSpecifier + FooterText The MIT License (MIT) @@ -475,6 +677,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDAutoLayout Type @@ -503,6 +707,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDWebImage Type @@ -512,38 +718,21 @@ THE SOFTWARE. FooterText Copyright 2011 - 2015 UMeng.com. All rights reserved. + License + Copyright Title - UMengSocial + UMengAnalytics-NO-IDFA Type PSGroupSpecifier FooterText - Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + Copyright 2011 - 2017 UMeng.com. All rights reserved. + License + Copyright Title - WebViewJavascriptBridge + UMengUShare Type PSGroupSpecifier @@ -572,8 +761,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - YYKit + YYCache Type PSGroupSpecifier diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-frameworks.sh b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-frameworks.sh index 893c16a..0f29f13 100755 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-frameworks.sh +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-frameworks.sh @@ -59,8 +59,13 @@ code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -82,3 +87,6 @@ strip_invalid_archs() { fi } +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-resources.sh b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-resources.sh index 7a9b303..9b70a9d 100755 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-resources.sh +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests-resources.sh @@ -18,17 +18,17 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; esac -realpath() { - DIRECTORY="$(cd "${1%/*}" && pwd)" - FILENAME="${1##*/}" - echo "$DIRECTORY/$FILENAME" -} - install_resource() { if [[ "$1" = /* ]] ; then @@ -70,7 +70,7 @@ EOM xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) - ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) @@ -80,38 +80,26 @@ EOM esac } if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -127,7 +115,7 @@ then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) while read line; do - if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + if [[ $line != "${PODS_ROOT}*" ]]; then XCASSET_FILES+=("$line") fi done <<<"$OTHER_XCASSETS" diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.debug.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.release.xcconfig b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.release.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.release.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject-BABaseProjectUITests/Pods-BABaseProject-BABaseProjectUITests.release.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.markdown b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.markdown index f866e0c..272e19a 100644 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.markdown @@ -24,6 +24,31 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## BAAlert + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + ## BAButton The MIT License (MIT) @@ -49,84 +74,141 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -## BlocksKit +## BANetManager -// -// LICENSE -// BlocksKit -// +The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -## FBAllocationTracker +## BAPickView -BSD License +MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +## BATextView + +The MIT License (MIT) + +Copyright (c) 2017 boai + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +## BATouchID + +MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +## BaiduMapKit + +The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -## FBMemoryProfiler +## DZNEmptyDataSet -LICENSE AGREEMENT +The MIT License (MIT) -For FBMemoryProfiler software +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ## FBRetainCycleDetector @@ -163,6 +245,37 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +## FMDB + +If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + ## IQKeyboardManager IQKeyboardManager license @@ -379,6 +492,29 @@ freely, subject to the following restrictions: misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. +## ReactiveObjC + +**Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ## SDAutoLayout The MIT License (MIT) @@ -429,38 +565,17 @@ THE SOFTWARE. -## UMengSocial +## UMengAnalytics-NO-IDFA Copyright 2011 - 2015 UMeng.com. All rights reserved. -## WebViewJavascriptBridge - -Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +## UMengUShare -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +Copyright 2011 - 2017 UMeng.com. All rights reserved. -## YYKit +## YYCache The MIT License (MIT) diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.plist b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.plist index 7f23d26..0f9e985 100644 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-acknowledgements.plist @@ -14,7 +14,7 @@ FooterText - Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) + Copyright (c) 2011–2016 Alamofire Software Foundation (http://alamofire.org/) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -34,16 +34,49 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title AFNetworking Type PSGroupSpecifier + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAAlert + Type + PSGroupSpecifier + FooterText The MIT License (MIT) -Copyright (c) 2016 博爱1616 +Copyright (c) 2016 博爱1616 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -63,6 +96,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title BAButton Type @@ -70,93 +105,174 @@ SOFTWARE. FooterText - // -// LICENSE -// BlocksKit -// + The MIT License (MIT) -Copyright (c) 2011-2014 Zachary Waldowski, Alexsander Akers, and the BlocksKit Contributors +Copyright (c) 2016 博爱1616 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + License + MIT Title - BlocksKit + BANetManager Type PSGroupSpecifier FooterText - BSD License + MIT License -For FBAllocationTracker software +Copyright (c) 2017 BAHome -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BAPickView + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. +Copyright (c) 2017 boai - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT + Title + BATextView + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2017 BAHome + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + BATouchID + Type + PSGroupSpecifier + + + FooterText + The MIT License (MIT) + +Copyright (c) 2015 BaiduLBS + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License + MIT Title - FBAllocationTracker + BaiduMapKit Type PSGroupSpecifier FooterText - LICENSE AGREEMENT - -For FBMemoryProfiler software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Facebook, Inc. ("Facebook") owns all right, title and interest, including all -intellectual property and other proprietary rights, in and to the FBMemoryProfiler -software (the "Software"). Subject to your compliance with these terms, you are -hereby granted a non-exclusive, worldwide, royalty-free copyright license to -(1) use and copy the Software; and (2) reproduce and distribute the Software as part -of your own software ("Your Software"), provided Your Software does not consist -solely of the Software; and (3) modify the Software for your own internal use. -Facebook reserves all rights not expressly granted to you in this license agreement. - -THE SOFTWARE AND DOCUMENTATION, IF ANY, ARE PROVIDED "AS IS" AND ANY EXPRESS OR -IMPLIED WARRANTIES (INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE) ARE DISCLAIMED. -IN NO EVENT SHALL FACEBOOK OR ITS AFFILIATES, OFFICERS, DIRECTORS OR EMPLOYEES -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING -IN ANY WAY OUT OF THE USE OF THE SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGE. + The MIT License (MIT) + +Copyright (c) 2016 Ignacio Romero Zurbuchen iromero@dzen.cl + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - FBMemoryProfiler + DZNEmptyDataSet Type PSGroupSpecifier @@ -193,11 +309,50 @@ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + License + BSD Title FBRetainCycleDetector Type PSGroupSpecifier + + FooterText + If you are using FMDB in your project, I'd love to hear about it. Let Gus know +by sending an email to gus@flyingmeat.com. + +And if you happen to come across either Gus Mueller or Rob Ryan in a bar, you +might consider purchasing a drink of their choosing if FMDB has been useful to +you. + +Finally, and shortly, this is the MIT License. + +Copyright (c) 2008-2014 Flying Meat Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License + MIT + Title + FMDB + Type + PSGroupSpecifier + FooterText IQKeyboardManager license @@ -225,6 +380,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title IQKeyboardManager Type @@ -255,6 +412,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title JMRoundedCorner Type @@ -262,7 +421,7 @@ SOFTWARE. FooterText - Copyright © 2009-2016 Matej Bukovinski + Copyright © 2009-2016 Matej Bukovinski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -281,6 +440,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MBProgressHUD Type @@ -308,6 +469,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MJExtension Type @@ -335,6 +498,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MJRefresh Type @@ -362,6 +527,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MLeaksFinder Type @@ -388,6 +555,8 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title Masonry Type @@ -397,7 +566,7 @@ THE SOFTWARE. FooterText The MIT License (MIT) -Copyright (c) 2015 欧阳大哥 +Copyright (c) 2015 欧阳大哥 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -417,6 +586,8 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title MyLayout Type @@ -445,11 +616,42 @@ freely, subject to the following restrictions: 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. + License + zlib Title NullSafe Type PSGroupSpecifier + + FooterText + **Copyright (c) 2012 - 2016, GitHub, Inc.** +**All rights reserved.** + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + License + MIT + Title + ReactiveObjC + Type + PSGroupSpecifier + FooterText The MIT License (MIT) @@ -475,6 +677,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDAutoLayout Type @@ -503,6 +707,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title SDWebImage Type @@ -512,38 +718,21 @@ THE SOFTWARE. FooterText Copyright 2011 - 2015 UMeng.com. All rights reserved. + License + Copyright Title - UMengSocial + UMengAnalytics-NO-IDFA Type PSGroupSpecifier FooterText - Copyright (c) 2011-2015 Marcus Westin, Antoine Lagadec - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + Copyright 2011 - 2017 UMeng.com. All rights reserved. + License + Copyright Title - WebViewJavascriptBridge + UMengUShare Type PSGroupSpecifier @@ -572,8 +761,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + License + MIT Title - YYKit + YYCache Type PSGroupSpecifier diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-frameworks.sh b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-frameworks.sh index 893c16a..0f29f13 100755 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-frameworks.sh +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-frameworks.sh @@ -59,8 +59,13 @@ code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -82,3 +87,6 @@ strip_invalid_archs() { fi } +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-resources.sh b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-resources.sh index 7a9b303..9b70a9d 100755 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-resources.sh +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject-resources.sh @@ -18,17 +18,17 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; esac -realpath() { - DIRECTORY="$(cd "${1%/*}" && pwd)" - FILENAME="${1##*/}" - echo "$DIRECTORY/$FILENAME" -} - install_resource() { if [[ "$1" = /* ]] ; then @@ -70,7 +70,7 @@ EOM xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" ;; *.xcassets) - ABSOLUTE_XCASSET_FILE=$(realpath "$RESOURCE_PATH") + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") ;; *) @@ -80,38 +80,26 @@ EOM esac } if [[ "$CONFIGURATION" == "Debug" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi if [[ "$CONFIGURATION" == "Release" ]]; then + install_resource "BAAlert/BAAlert/BAAlert/BAAlert.bundle" + install_resource "BAPickView/BAPickView/BAPickView/BAPickView.bundle" + install_resource "BaiduMapKit/BaiduMapKit/BaiduMapAPI_Map.framework/Resources/mapapi.bundle" install_resource "IQKeyboardManager/IQKeyboardManager/Resources/IQKeyboardManager.bundle" install_resource "MJRefresh/MJRefresh/MJRefresh.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj" - install_resource "UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj" + install_resource "UMengUShare/UShareSDK/UMSocialSDK/UMSocialSDKPromptResources.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle" + install_resource "UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK/WeiboSDK.bundle" + install_resource "UMengUShare/UShareSDK/UMSocialUI/UMSocialSDKResources.bundle" fi mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" @@ -127,7 +115,7 @@ then # Find all other xcassets (this unfortunately includes those of path pods and other targets). OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) while read line; do - if [[ $line != "`realpath $PODS_ROOT`*" ]]; then + if [[ $line != "${PODS_ROOT}*" ]]; then XCASSET_FILES+=("$line") fi done <<<"$OTHER_XCASSETS" diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.debug.xcconfig b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.debug.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.debug.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.debug.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.release.xcconfig b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.release.xcconfig index 03c7bd1..b1ecdf4 100644 --- a/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.release.xcconfig +++ b/Pods/Target Support Files/Pods-BABaseProject/Pods-BABaseProject.release.xcconfig @@ -1,9 +1,10 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/ "${PODS_ROOT}/YYKit/Vendor" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit" "${PODS_ROOT}/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK" "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialUI" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -LIBRARY_SEARCH_PATHS = $(inherited) $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/ $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/** $(PODS_ROOT)/UmengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/** "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BlocksKit" "$PODS_CONFIGURATION_BUILD_DIR/FBAllocationTracker" "$PODS_CONFIGURATION_BUILD_DIR/FBMemoryProfiler" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge" "$PODS_CONFIGURATION_BUILD_DIR/YYKit" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BlocksKit" -isystem "${PODS_ROOT}/Headers/Public/FBAllocationTracker" -isystem "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengSocial" -isystem "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" -isystem "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAButton" -l"BlocksKit" -l"FBAllocationTracker" -l"FBMemoryProfiler" -l"FBRetainCycleDetector" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialFacebook" -l"SocialInstagram" -l"SocialLaiWang" -l"SocialLine" -l"SocialQQ" -l"SocialSina" -l"SocialSinaSSO" -l"SocialTumblr" -l"SocialTwitter" -l"SocialWechat" -l"SocialWhatsapp" -l"UMSocial_Sdk_4.4" -l"UMSocial_Sdk_Comment_4.4" -l"WeChatSDK" -l"WebViewJavascriptBridge" -l"WeiboSDK" -l"YYKit" -l"c++" -l"iconv" -l"sqlite3" -l"stdc++" -l"z" -framework "Accelerate" -framework "Accounts" -framework "AssetsLibrary" -framework "CoreData" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreTelephony" -framework "CoreText" -framework "FBSDKCoreKit" -framework "FBSDKLoginKit" -framework "FBSDKShareKit" -framework "Fabric" -framework "Foundation" -framework "ImageIO" -framework "MessageUI" -framework "MobileCoreServices" -framework "QuartzCore" -framework "Security" -framework "Social" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "TwitterCore" -framework "TwitterKit" -framework "UIKit" -framework "WebP" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/UMengAnalytics-NO-IDFA/**" "$PODS_CONFIGURATION_BUILD_DIR/AFNetworking" "$PODS_CONFIGURATION_BUILD_DIR/BAAlert" "$PODS_CONFIGURATION_BUILD_DIR/BAButton" "$PODS_CONFIGURATION_BUILD_DIR/BANetManager" "$PODS_CONFIGURATION_BUILD_DIR/BAPickView" "$PODS_CONFIGURATION_BUILD_DIR/BATextView" "$PODS_CONFIGURATION_BUILD_DIR/BATouchID" "$PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet" "$PODS_CONFIGURATION_BUILD_DIR/FBRetainCycleDetector" "$PODS_CONFIGURATION_BUILD_DIR/FMDB" "$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManager" "$PODS_CONFIGURATION_BUILD_DIR/JMRoundedCorner" "$PODS_CONFIGURATION_BUILD_DIR/MBProgressHUD" "$PODS_CONFIGURATION_BUILD_DIR/MJExtension" "$PODS_CONFIGURATION_BUILD_DIR/MJRefresh" "$PODS_CONFIGURATION_BUILD_DIR/MLeaksFinder" "$PODS_CONFIGURATION_BUILD_DIR/Masonry" "$PODS_CONFIGURATION_BUILD_DIR/MyLayout" "$PODS_CONFIGURATION_BUILD_DIR/NullSafe" "$PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC" "$PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout" "$PODS_CONFIGURATION_BUILD_DIR/SDWebImage" "$PODS_CONFIGURATION_BUILD_DIR/YYCache" $(inherited) "${PODS_ROOT}/BaiduMapKit/BaiduMapKit/thirdlibs" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/UMSocialSDKPlugin" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/AlipayShare" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/QQ" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/Sina/SinaSDK" $(inherited) "${PODS_ROOT}/UMengUShare/UShareSDK/SocialLibraries/WeChat/WechatSDK" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/AFNetworking" -isystem "${PODS_ROOT}/Headers/Public/BAAlert" -isystem "${PODS_ROOT}/Headers/Public/BAButton" -isystem "${PODS_ROOT}/Headers/Public/BANetManager" -isystem "${PODS_ROOT}/Headers/Public/BAPickView" -isystem "${PODS_ROOT}/Headers/Public/BATextView" -isystem "${PODS_ROOT}/Headers/Public/BATouchID" -isystem "${PODS_ROOT}/Headers/Public/BaiduMapKit" -isystem "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" -isystem "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" -isystem "${PODS_ROOT}/Headers/Public/FMDB" -isystem "${PODS_ROOT}/Headers/Public/IQKeyboardManager" -isystem "${PODS_ROOT}/Headers/Public/JMRoundedCorner" -isystem "${PODS_ROOT}/Headers/Public/MBProgressHUD" -isystem "${PODS_ROOT}/Headers/Public/MJExtension" -isystem "${PODS_ROOT}/Headers/Public/MJRefresh" -isystem "${PODS_ROOT}/Headers/Public/MLeaksFinder" -isystem "${PODS_ROOT}/Headers/Public/Masonry" -isystem "${PODS_ROOT}/Headers/Public/MyLayout" -isystem "${PODS_ROOT}/Headers/Public/NullSafe" -isystem "${PODS_ROOT}/Headers/Public/ReactiveObjC" -isystem "${PODS_ROOT}/Headers/Public/SDAutoLayout" -isystem "${PODS_ROOT}/Headers/Public/SDWebImage" -isystem "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" -isystem "${PODS_ROOT}/Headers/Public/UMengUShare" -isystem "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = $(inherited) -ObjC -l"AFNetworking" -l"APOpenSdk" -l"BAAlert" -l"BAButton" -l"BANetManager" -l"BAPickView" -l"BATextView" -l"BATouchID" -l"DZNEmptyDataSet" -l"FBRetainCycleDetector" -l"FMDB" -l"IQKeyboardManager" -l"JMRoundedCorner" -l"MBProgressHUD" -l"MJExtension" -l"MJRefresh" -l"MLeaksFinder" -l"Masonry" -l"MyLayout" -l"NullSafe" -l"ReactiveObjC" -l"SDAutoLayout" -l"SDWebImage" -l"SocialAlipayShare" -l"SocialQQ" -l"SocialSina" -l"SocialWeChat" -l"UMSocialLog" -l"WeChatSDK" -l"WeiboSDK" -l"YYCache" -l"c++" -l"crypto" -l"sqlite3" -l"sqlite3.0" -l"ssl" -l"stdc++.6.0.9" -l"z" -framework "BaiduMapAPI_Base" -framework "BaiduMapAPI_Cloud" -framework "BaiduMapAPI_Location" -framework "BaiduMapAPI_Map" -framework "BaiduMapAPI_Radar" -framework "BaiduMapAPI_Search" -framework "BaiduMapAPI_Utils" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreLocation" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "OpenGLES" -framework "QuartzCore" -framework "Security" -framework "SystemConfiguration" -framework "TencentOpenAPI" -framework "UIKit" -framework "UMMobClick" -framework "UMSocialCore" -framework "UMSocialNetwork" -framework "UShareUI" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods diff --git a/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-dummy.m b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-dummy.m new file mode 100644 index 0000000..c2fc8f2 --- /dev/null +++ b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_ReactiveObjC : NSObject +@end +@implementation PodsDummy_ReactiveObjC +@end diff --git a/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-prefix.pch b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/ReactiveObjC/ReactiveObjC.xcconfig b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC.xcconfig new file mode 100644 index 0000000..9eee986 --- /dev/null +++ b/Pods/Target Support Files/ReactiveObjC/ReactiveObjC.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ReactiveObjC +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/ReactiveObjC" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = -framework "Foundation" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ReactiveObjC +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch b/Pods/Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch +++ b/Pods/Target Support Files/SDAutoLayout/SDAutoLayout-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/SDAutoLayout/SDAutoLayout.xcconfig b/Pods/Target Support Files/SDAutoLayout/SDAutoLayout.xcconfig index 4f6e7c1..c4b818a 100644 --- a/Pods/Target Support Files/SDAutoLayout/SDAutoLayout.xcconfig +++ b/Pods/Target Support Files/SDAutoLayout/SDAutoLayout.xcconfig @@ -1,8 +1,9 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SDAutoLayout GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDAutoLayout" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDAutoLayout" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/SDAutoLayout PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch b/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch index aa992a4..beb2a24 100644 --- a/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +++ b/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch @@ -1,4 +1,12 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig b/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig index aaca7fb..45f4950 100644 --- a/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig +++ b/Pods/Target Support Files/SDWebImage/SDWebImage.xcconfig @@ -1,9 +1,10 @@ CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SDWebImage GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDWebImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SDWebImage" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" OTHER_LDFLAGS = -framework "ImageIO" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/SDWebImage PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m deleted file mode 100644 index 6c5914c..0000000 --- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_WebViewJavascriptBridge : NSObject -@end -@implementation PodsDummy_WebViewJavascriptBridge -@end diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig b/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig deleted file mode 100644 index 3ae940f..0000000 --- a/Pods/Target Support Files/WebViewJavascriptBridge/WebViewJavascriptBridge.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/WebViewJavascriptBridge -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = -framework "UIKit" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/YYCache/YYCache-dummy.m b/Pods/Target Support Files/YYCache/YYCache-dummy.m new file mode 100644 index 0000000..a17e460 --- /dev/null +++ b/Pods/Target Support Files/YYCache/YYCache-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_YYCache : NSObject +@end +@implementation PodsDummy_YYCache +@end diff --git a/Pods/Target Support Files/YYCache/YYCache-prefix.pch b/Pods/Target Support Files/YYCache/YYCache-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Pods/Target Support Files/YYCache/YYCache-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Pods/Target Support Files/YYCache/YYCache.xcconfig b/Pods/Target Support Files/YYCache/YYCache.xcconfig new file mode 100644 index 0000000..7b8c264 --- /dev/null +++ b/Pods/Target Support Files/YYCache/YYCache.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/YYCache +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/YYCache" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAAlert" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BANetManager" "${PODS_ROOT}/Headers/Public/BAPickView" "${PODS_ROOT}/Headers/Public/BATextView" "${PODS_ROOT}/Headers/Public/BATouchID" "${PODS_ROOT}/Headers/Public/BaiduMapKit" "${PODS_ROOT}/Headers/Public/DZNEmptyDataSet" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/FMDB" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/ReactiveObjC" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengAnalytics-NO-IDFA" "${PODS_ROOT}/Headers/Public/UMengUShare" "${PODS_ROOT}/Headers/Public/YYCache" +OTHER_LDFLAGS = -l"sqlite3" -framework "CoreFoundation" -framework "QuartzCore" -framework "UIKit" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/YYCache +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Pods/Target Support Files/YYKit/YYKit-dummy.m b/Pods/Target Support Files/YYKit/YYKit-dummy.m deleted file mode 100644 index 106f7fa..0000000 --- a/Pods/Target Support Files/YYKit/YYKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_YYKit : NSObject -@end -@implementation PodsDummy_YYKit -@end diff --git a/Pods/Target Support Files/YYKit/YYKit-prefix.pch b/Pods/Target Support Files/YYKit/YYKit-prefix.pch deleted file mode 100644 index aa992a4..0000000 --- a/Pods/Target Support Files/YYKit/YYKit-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Pods/Target Support Files/YYKit/YYKit.xcconfig b/Pods/Target Support Files/YYKit/YYKit.xcconfig deleted file mode 100644 index 5a40a3a..0000000 --- a/Pods/Target Support Files/YYKit/YYKit.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/YYKit -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/YYKit/Vendor" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/YYKit" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/AFNetworking" "${PODS_ROOT}/Headers/Public/BAButton" "${PODS_ROOT}/Headers/Public/BlocksKit" "${PODS_ROOT}/Headers/Public/FBAllocationTracker" "${PODS_ROOT}/Headers/Public/FBMemoryProfiler" "${PODS_ROOT}/Headers/Public/FBRetainCycleDetector" "${PODS_ROOT}/Headers/Public/IQKeyboardManager" "${PODS_ROOT}/Headers/Public/JMRoundedCorner" "${PODS_ROOT}/Headers/Public/MBProgressHUD" "${PODS_ROOT}/Headers/Public/MJExtension" "${PODS_ROOT}/Headers/Public/MJRefresh" "${PODS_ROOT}/Headers/Public/MLeaksFinder" "${PODS_ROOT}/Headers/Public/Masonry" "${PODS_ROOT}/Headers/Public/MyLayout" "${PODS_ROOT}/Headers/Public/NullSafe" "${PODS_ROOT}/Headers/Public/SDAutoLayout" "${PODS_ROOT}/Headers/Public/SDWebImage" "${PODS_ROOT}/Headers/Public/UMengSocial" "${PODS_ROOT}/Headers/Public/WebViewJavascriptBridge" "${PODS_ROOT}/Headers/Public/YYKit" -OTHER_LDFLAGS = -l"sqlite3" -l"z" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreText" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SystemConfiguration" -framework "UIKit" -framework "WebP" -PODS_BUILD_DIR = $BUILD_DIR -PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Headers b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Headers new file mode 120000 index 0000000..a177d2a --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Headers @@ -0,0 +1 @@ +Versions/Current/Headers \ No newline at end of file diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/UMMobClick b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/UMMobClick new file mode 120000 index 0000000..4f563f0 --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/UMMobClick @@ -0,0 +1 @@ +Versions/Current/UMMobClick \ No newline at end of file diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClick.h b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClick.h new file mode 100644 index 0000000..c5997c4 --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClick.h @@ -0,0 +1,281 @@ +// +// MobClick.h +// Analytics +// +// Copyright (C) 2010-2016 Umeng.com . All rights reserved. + +#import +#import + +#define XcodeAppVersion [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] +typedef void(^CallbackBlock)(); + +/** + REALTIME只在“集成测试”设备的DEBUG模式下有效,其它情况下的REALTIME会改为使用BATCH策略。 + */ +typedef enum { + REALTIME = 0, //实时发送 (只在“集成测试”设备的DEBUG模式下有效) + BATCH = 1, //启动发送 + SEND_INTERVAL = 6, //最小间隔发送 ([90-86400]s, default 90s) + SMART_POLICY = 8, +} ReportPolicy; + +/** + 统计的场景类别,默认为普通统计;若使用游戏统计API,则需选择游戏场景类别,如E_UM_GAME。 + */ +typedef NS_ENUM (NSUInteger, eScenarioType) +{ + E_UM_NORMAL = 0, // default value + E_UM_GAME = 1, // game +}; + +/** @brief 统计SDK的配置实例,具体参照该类成员的参数定义 + * 示例代码: UMConfigInstance.appKey = @"xxxxxxxxxxxxxx..."; + * UMConfigInstance.token = @"yyyyyyyy...."; + * [MobClick startWithConfigure:UMConfigInstance]; + */ +#define UMConfigInstance [UMAnalyticsConfig sharedInstance] +@interface UMAnalyticsConfig : NSObject +/** required: appkey string */ +@property(nonatomic, copy) NSString *appKey; +/** optional: default: nil*/ +@property(nonatomic, copy) NSString *secret; +/** optional: default: "App Store"*/ +@property(nonatomic, copy) NSString *channelId; +/** optional: default: YES */ +@property(nonatomic) BOOL bCrashReportEnabled; +/** optional: default: BATCH */ +@property(nonatomic) ReportPolicy ePolicy; +/** optional: default: E_UM_NORMAL */ +@property(nonatomic) eScenarioType eSType; + ++ (instancetype)sharedInstance; +@end + +@class CLLocation; +@interface MobClick : NSObject + +#pragma mark basics +///--------------------------------------------------------------------------------------- +/// @name 初始化统计 +///--------------------------------------------------------------------------------------- + +/** 初始化友盟统计模块 + @param UMAnalyticsConfig 实例类,具体参照该类成员的参数定义 + @return void + */ ++ (void) startWithConfigure:(UMAnalyticsConfig *)configure; + +///--------------------------------------------------------------------------------------- +/// @name 设置 +///--------------------------------------------------------------------------------------- + +/** 设置app版本号。由于历史原因需要和xcode3工程兼容,友盟提取的是Build号(CFBundleVersion), + 如果需要和App Store上的版本一致,请调用此方法。 + @param appVersion 版本号,例如设置成`XcodeAppVersion`. + @return void. +*/ ++ (void)setAppVersion:(NSString *)appVersion; + +/** 开启CrashReport收集, 默认YES(开启状态). + @param value 设置为NO,可关闭友盟CrashReport收集功能. + @return void. +*/ ++ (void)setCrashReportEnabled:(BOOL)value; + +/** 设置是否打印sdk的log信息, 默认NO(不打印log). + @param value 设置为YES,umeng SDK 会输出log信息可供调试参考. 除非特殊需要,否则发布产品时需改回NO. + @return void. + */ ++ (void)setLogEnabled:(BOOL)value; + +/** 设置是否对日志信息进行加密, 默认NO(不加密). + @param value 设置为YES, umeng SDK 会将日志信息做加密处理 + @return void. + */ ++ (void)setEncryptEnabled:(BOOL)value; + +/** 当reportPolicy == SEND_INTERVAL 时设定log发送间隔 + @param second 单位为秒,最小90秒,最大86400秒(24hour). + @return void. +*/ ++ (void)setLogSendInterval:(double)second; + + + +#pragma mark event logs +///--------------------------------------------------------------------------------------- +/// @name 页面计时 +///--------------------------------------------------------------------------------------- + +/** 手动页面时长统计, 记录某个页面展示的时长. + @param pageName 统计的页面名称. + @param seconds 单位为秒,int型. + @return void. + */ ++ (void)logPageView:(NSString *)pageName seconds:(int)seconds; + +/** 自动页面时长统计, 开始记录某个页面展示时长. + 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 + 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: + @param pageName 统计的页面名称. + @return void. + */ ++ (void)beginLogPageView:(NSString *)pageName; + +/** 自动页面时长统计, 结束记录某个页面展示时长. + 使用方法:必须配对调用beginLogPageView:和endLogPageView:两个函数来完成自动统计,若只调用某一个函数不会生成有效数据。 + 在该页面展示时调用beginLogPageView:,当退出该页面时调用endLogPageView: + @param pageName 统计的页面名称. + @return void. + */ ++ (void)endLogPageView:(NSString *)pageName; + + +///--------------------------------------------------------------------------------------- +/// @name 事件统计 +///--------------------------------------------------------------------------------------- +/** 结构化事件 + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID。 + + @param keyPath 字符串数组代表的结构化事件路径,其长度最大为8,不能使用unicode 48以内的字符,keyPath[0]必须在网站注册事件ID. + @param value 事件的数值 + @param (optional) label 标签 + @return void. + */ ++ (void)event:(NSArray *)keyPath value:(int)value label:(NSString *)label; + +/** 自定义事件,数量统计. +使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID + + @param eventId 网站上注册的事件Id. + @param label 分类标签。不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签. + @param accumulation 累加值。为减少网络交互,可以自行对某一事件ID的某一分类标签进行累加,再传入次数作为参数。 + @return void. + */ ++ (void)event:(NSString *)eventId; //等同于 event:eventId label:eventId; +/** 自定义事件,数量统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID + */ ++ (void)event:(NSString *)eventId label:(NSString *)label; // label为nil或@""时,等同于 event:eventId label:eventId; + +/** 自定义事件,数量统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID + */ ++ (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes; + ++ (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes counter:(int)number; + +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + beginEvent,endEvent要配对使用,也可以自己计时后通过durations参数传递进来 + + @param eventId 网站上注册的事件Id. + @param label 分类标签。不同的标签会分别进行统计,方便同一事件的不同标签的对比,为nil或空字符串时后台会生成和eventId同名的标签. + @param primarykey 这个参数用于和event_id一起标示一个唯一事件,并不会被统计;对于同一个事件在beginEvent和endEvent 中要传递相同的eventId 和 primarykey + @param millisecond 自己计时需要的话需要传毫秒进来 + @return void. + + @warning 每个event的attributes不能超过10个 + eventId、attributes中key和value都不能使用空格和特殊字符,必须是NSString,且长度不能超过255个字符(否则将截取前255个字符) + id, ts, du是保留字段,不能作为eventId及key的名称 +*/ ++ (void)beginEvent:(NSString *)eventId; + +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)endEvent:(NSString *)eventId; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)beginEvent:(NSString *)eventId label:(NSString *)label; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)endEvent:(NSString *)eventId label:(NSString *)label; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)beginEvent:(NSString *)eventId primarykey :(NSString *)keyName attributes:(NSDictionary *)attributes; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)endEvent:(NSString *)eventId primarykey:(NSString *)keyName; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)event:(NSString *)eventId durations:(int)millisecond; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ + ++ (void)event:(NSString *)eventId label:(NSString *)label durations:(int)millisecond; +/** 自定义事件,时长统计. + 使用前,请先到友盟App管理后台的设置->编辑自定义事件 中添加相应的事件ID,然后在工程中传入相应的事件ID. + */ ++ (void)event:(NSString *)eventId attributes:(NSDictionary *)attributes durations:(int)millisecond; + + +#pragma mark - user methods +/** active user sign-in. + 使用sign-In函数后,如果结束该PUID的统计,需要调用sign-Off函数 + @param puid : user's ID + @param provider : 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。 + @return void. + */ ++ (void)profileSignInWithPUID:(NSString *)puid; ++ (void)profileSignInWithPUID:(NSString *)puid provider:(NSString *)provider; + +/** active user sign-off. + 停止sign-in PUID的统计 + @return void. + */ ++ (void)profileSignOff; + +///--------------------------------------------------------------------------------------- +/// @name 地理位置设置 +/// 需要链接 CoreLocation.framework 并且 #import +///--------------------------------------------------------------------------------------- + +/** 设置经纬度信息 + @param latitude 纬度. + @param longitude 经度. + @return void + */ ++ (void)setLatitude:(double)latitude longitude:(double)longitude; + +/** 设置经纬度信息 + @param location CLLocation 经纬度信息 + @return void + */ ++ (void)setLocation:(CLLocation *)location; + +///--------------------------------------------------------------------------------------- +/// @name Utility函数 +///--------------------------------------------------------------------------------------- + +/** 判断设备是否越狱,依据是否存在apt和Cydia.app + */ ++ (BOOL)isJailbroken; + +/** 判断App是否被破解 + */ ++ (BOOL)isPirated; + +#pragma mark DEPRECATED +/** 友盟模块启动 + [MobClick startWithConfigure:]通常在application:didFinishLaunchingWithOptions:里被调用监听App启动和退出事件, + 如果开发者无法在此处添加友盟的[MobClick startWithConfigure:]方法,App的启动事件可能会无法监听,此时需要手动调用[MobClick startSession:nil]来启动友盟的session。 + 上述情况通常发生在某些第三方框架生成的app里,普通app不用关注该API. + */ ++ (void)startSession:(NSNotification *)notification; + ++ (void)setCrashCBBlock:(CallbackBlock)cbBlock; +@end diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickGameAnalytics.h b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickGameAnalytics.h new file mode 100644 index 0000000..f8b9fa1 --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickGameAnalytics.h @@ -0,0 +1,184 @@ +// +// MobClickGameAnalytics.h +// Analytics +// +// Copyright (C) 2010-2014 Umeng.com . All rights reserved. + +@interface MobClickGameAnalytics : NSObject + +#pragma mark - account function +/** active user sign-in. + 使用sign-In函数后,如果结束该PUID的统计,需要调用sign-Off函数 + @param puid : user's ID + @param provider : 不能以下划线"_"开头,使用大写字母和数字标识; 如果是上市公司,建议使用股票代码。 + @return void. + */ ++ (void)profileSignInWithPUID:(NSString *)puid; ++ (void)profileSignInWithPUID:(NSString *)puid provider:(NSString *)provider; + +/** active user sign-off. + 停止sign-in PUID的统计 + @return void. + */ ++ (void)profileSignOff; + +#pragma mark GameLevel methods +///--------------------------------------------------------------------------------------- +/// @name set game level +///--------------------------------------------------------------------------------------- + +/** 设置玩家的等级. + */ + +/** 设置玩家等级属性. + @param level 玩家等级 + @return void + */ ++ (void)setUserLevelId:(int)level; + +///--------------------------------------------------------------------------------------- +/// @name 关卡统计 +///--------------------------------------------------------------------------------------- + +/** 记录玩家进入关卡,通过关卡及失败的情况. + */ + + +/** 进入关卡. + @param level 关卡 + @return void + */ ++ (void)startLevel:(NSString *)level; + +/** 通过关卡. + @param level 关卡,如果level == nil 则为当前关卡 + @return void + */ ++ (void)finishLevel:(NSString *)level; + +/** 未通过关卡. + @param level 关卡,如果level == nil 则为当前关卡 + @return void + */ + ++ (void)failLevel:(NSString *)level; + + +#pragma mark - +#pragma mark Pay methods + +///--------------------------------------------------------------------------------------- +/// @name 支付统计 +///--------------------------------------------------------------------------------------- + +/** 记录玩家交易兑换货币的情况 + @param currencyAmount 现金或等价物总额 + @param currencyType 为ISO4217定义的3位字母代码,如CNY,USD等(如使用其它自定义等价物作为现金,可使用ISO4217中未定义的3位字母组合传入货币类型) + @param virtualAmount 虚拟币数量 + @param channel 支付渠道 + @param orderId 交易订单ID + @return void + */ ++ (void)exchange:(NSString *)orderId currencyAmount:(double)currencyAmount currencyType:(NSString *)currencyType virtualCurrencyAmount:(double)virtualAmount paychannel:(int)channel; + +/** 玩家支付货币兑换虚拟币. + @param cash 真实货币数量 + @param source 支付渠道 + @param coin 虚拟币数量 + @return void + */ + ++ (void)pay:(double)cash source:(int)source coin:(double)coin; + +/** 玩家支付货币购买道具. + @param cash 真实货币数量 + @param source 支付渠道 + @param item 道具名称 + @param amount 道具数量 + @param price 道具单价 + @return void + */ ++ (void)pay:(double)cash source:(int)source item:(NSString *)item amount:(int)amount price:(double)price; + + +#pragma mark - +#pragma mark Buy methods + +///--------------------------------------------------------------------------------------- +/// @name 虚拟币购买统计 +///--------------------------------------------------------------------------------------- + +/** 记录玩家使用虚拟币的消费情况 + */ + + +/** 玩家使用虚拟币购买道具 +@param item 道具名称 +@param amount 道具数量 +@param price 道具单价 +@return void + */ ++ (void)buy:(NSString *)item amount:(int)amount price:(double)price; + + +#pragma mark - +#pragma mark Use methods + + +///--------------------------------------------------------------------------------------- +/// @name 道具消耗统计 +///--------------------------------------------------------------------------------------- + +/** 记录玩家道具消费情况 + */ + + +/** 玩家使用虚拟币购买道具 +@param item 道具名称 +@param amount 道具数量 +@param price 道具单价 +@return void + */ + ++ (void)use:(NSString *)item amount:(int)amount price:(double)price; + + +#pragma mark - +#pragma mark Bonus methods + + +///--------------------------------------------------------------------------------------- +/// @name 虚拟币及道具奖励统计 +///--------------------------------------------------------------------------------------- + +/** 记录玩家获赠虚拟币及道具的情况 + */ + + +/** 玩家获虚拟币奖励 +@param coin 虚拟币数量 +@param source 奖励方式 +@return void + */ + ++ (void)bonus:(double)coin source:(int)source; + +/** 玩家获道具奖励 +@param item 道具名称 +@param amount 道具数量 +@param price 道具单价 +@param source 奖励方式 +@return void + */ + ++ (void)bonus:(NSString *)item amount:(int)amount price:(double)price source:(int)source; + +#pragma mark DEPRECATED + +//已经被新的setUserLevelId:方法替代,请使用新的API。 ++ (void)setUserLevel:(NSString *)level; + +//已经被新的active user方法替代,请使用新的API。 ++ (void)setUserID:(NSString *)userId sex:(int)sex age:(int)age platform:(NSString *)platform; + +@end diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickSocialAnalytics.h b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickSocialAnalytics.h new file mode 100644 index 0000000..6743c1c --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/Headers/MobClickSocialAnalytics.h @@ -0,0 +1,112 @@ +// +// MobClickSocialAnalytics.h +// SocialSDK +// +// Created by yeahugo on 13-3-4. +// Copyright (c) 2013年 Umeng. All rights reserved. +// + +#import + +typedef NSString * MobClickSocialTypeString; + +extern MobClickSocialTypeString const MobClickSocialTypeSina; //新浪微博 +extern MobClickSocialTypeString const MobClickSocialTypeTencent; //腾讯微博 +extern MobClickSocialTypeString const MobClickSocialTypeRenren; //人人网 +extern MobClickSocialTypeString const MobClickSocialTypeQzone; //Qzone +extern MobClickSocialTypeString const MobClickSocialTypeRenren; //人人网 +extern MobClickSocialTypeString const MobClickSocialTypeDouban; //douban +extern MobClickSocialTypeString const MobClickSocialTypeWxsesion; //微信好友分享 +extern MobClickSocialTypeString const MobClickSocialTypeWxtimeline; //微信朋友圈 +extern MobClickSocialTypeString const MobClickSocialTypeHuaban; //花瓣 +extern MobClickSocialTypeString const MobClickSocialTypeKaixin; //开心 +extern MobClickSocialTypeString const MobClickSocialTypeFacebook; //facebook +extern MobClickSocialTypeString const MobClickSocialTypeTwitter; //twitter +extern MobClickSocialTypeString const MobClickSocialTypeInstagram; //instagram +extern MobClickSocialTypeString const MobClickSocialTypeFlickr; //flickr +extern MobClickSocialTypeString const MobClickSocialTypeQQ; //qq +extern MobClickSocialTypeString const MobClickSocialTypeWxfavorite; //微信收藏 +extern MobClickSocialTypeString const MobClickSocialTypeLwsession; //来往 +extern MobClickSocialTypeString const MobClickSocialTypeLwtimeline; //来往动态 +extern MobClickSocialTypeString const MobClickSocialTypeYxsession; //易信 +extern MobClickSocialTypeString const MobClickSocialTypeYxtimeline; //易信朋友圈 + + +/** + 微博类,发送微博之后在回调方法初始化此对象 + + */ +@interface MobClickSocialWeibo : NSObject + + +/** + 微博平台类型,使用上面定义的几种常量字符串 + */ +@property (nonatomic, copy) NSString *platformType; + +/** + 微博id + */ +@property (nonatomic, copy) NSString *weiboId; + +/** + 用户在微博平台的id + */ +@property (nonatomic, copy) NSString *userId; + +/** + 微博平台的自定义字段,例如定义{‘gender’:0,’name’:’xxx’} + */ +@property (nonatomic, strong) NSDictionary *param; + + +/** + 初始化方法,在发送微博结束的回调方法使用此初始化方法 + + @param platformType 微博平台类型 + @param weiboId 微博id,可以设置为nil + @param userId 用户id + @param param 微博平台自定义字段,可以设置为nil + + @return 微博对象 + */ +-(id)initWithPlatformType:(MobClickSocialTypeString)platformType weiboId:(NSString *)weiboId usid:(NSString *)usid param:(NSDictionary *)param; + +@end + +/** + 发送统计完成的block对象 + */ +typedef void (^MobClickSocialAnalyticsCompletion)(NSDictionary * response, NSError *error); + + +/** +负责统计微博类。 +分享微博完成之后需要先构造`MobClickSocialWeibo`组成微博数组,然后再用类方法发送微博数组 + +``` ++(void)postWeiboCounts:(NSArray *)weibos appKey:(NSString *)appKey topic:(NSString *)topic completion:(MobClickSocialAnalyticsCompletion)completion; +``` + +例如 + + + MobClickSocialWeibo *tencentWeibo = [[MobClickSocialWeibo alloc] initWithPlatformType:UMSocialTypeTencent weiboId:nil userId:@"tencent123" param:@{@"gender":@"1"}]; + [MobClickSocialAnalytics postWeibos:@[tencentWeibo] appKey:@"507fcab25270157b37000010" topic:@"test" completion:^(NSDictionary *result, NSError *error) { + NSLog(@"result is %@", result); + }]; + + */ + +@interface MobClickSocialAnalytics : NSObject +/** + 发送统计微博 + + @param weibos UMSocialWeibo对象组成的数组 + @param appKey 友盟appkey + @param topic 话题,可选,可以设置为nil + @parma completion 发送完成的事件处理block + + */ ++(void)postWeiboCounts:(NSArray *)weibos appKey:(NSString *)appKey topic:(NSString *)topic completion:(MobClickSocialAnalyticsCompletion)completion; +@end diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/UMMobClick b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/UMMobClick new file mode 100644 index 0000000..1f9f84d Binary files /dev/null and b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/A/UMMobClick differ diff --git a/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/Current b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/Pods/UMengAnalytics-NO-IDFA/umsdk_IOS_analyics_no-idfa_v4.2.5/UMMobClick.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h deleted file mode 100644 index 9a5a8bc..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocial.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// UMSocial.h -// SocialSDK -// -// Created by Jiahuan Ye on 13-5-22. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import "UMSocialData.h" //分享内容类 -#import "UMSocialDataService.h" //分享数据级接口类 -#import "UMSocialControllerService.h" //分享界面级接口类 -#import "UMSocialControllerServiceComment.h" //评论界面级接口类 -#import "UMSocialAccountManager.h" //账户管理,和账户类 -#import "UMSocialSnsPlatformManager.h" //平台管理,和平台类 -#import "UMSocialSnsService.h" //提供快速分享 -#import "UMSocialBar.h" //社会化操作栏 -#import "UMSocialConfig.h" //sdk配置类 -#import "UMSocialSnsData.h" //区分不同平台设置不同分享内容 \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h deleted file mode 100644 index 95e7913..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialAccountManager.h +++ /dev/null @@ -1,269 +0,0 @@ -// -// UMSocialAccountManager.h -// SocialSDK -// -// Created by yeahugo on 13-1-15. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import -#import "UMSocialDataService.h" - -/** - 用户微博账户对象,对象数据从授权账号所对应的微博平台获取 - */ -@interface UMSocialAccountEntity : NSObject - - -/** - 微博平台名称,例如"sina"、"tencent",定义在`UMSocialSnsPlatformManager.h` - */ -@property (nonatomic, copy) NSString *platformName; - -/** - 用户昵称 - */ -@property (nonatomic, copy) NSString *userName; - -/** - 用户在微博的id号 - */ -@property (nonatomic, copy) NSString *usid; - -/** - 用户微博头像的url - */ -@property (nonatomic, copy) NSString *iconURL; - -/** - 用户授权后得到的accessToken - */ -@property (nonatomic, copy) NSString *accessToken; - -/** - 用户授权后得到的accessSecret - */ -@property (nonatomic, copy) NSString *accessSecret; - -/** - 用户微博网址url - */ -@property (nonatomic, copy) NSString *profileURL; - -/** - 是否首次授权,sdk内使用 - */ -@property (nonatomic) BOOL isFirstOauth; - - -/** - 添加已授权的腾讯微博和qq空间账号,需要用到的openId - */ -@property (nonatomic, copy) NSString *openId; - -/** - 授权的过期时间 - */ -@property (nonatomic, retain) NSDate *expirationDate; - -/** - 更新授权时间 - */ -@property (nonatomic, retain) NSDate *refreshDate; - -/** - 授权到微信用到的refreshToken - */ -@property (nonatomic, copy) NSString *refreshToken; - -/** - 微信授权完成后得到的unionId - - */ -@property (nonatomic, copy) NSString *unionId; - -/** - 某些平台记录的应用Id - */ -@property (nonatomic, copy) NSString *appId; - -/** - 授权项 - */ -@property (nonatomic, copy) NSArray *permissions; - -/** - 非授权项 - */ -@property (nonatomic, copy) NSArray *dePermissions; - - -/** - 初始化方法 - - @param platformName 微博平台名 - - @return 初始化对象 - */ --(id)initWithPlatformName:(NSString *)platformName; - -/** - 把各属性编码成NSString - - @return 一个`NSString`对象 - */ --(NSString *)description; -@end - - -/** - 男性用户 - - */ -extern NSString *const UMSCustomAccountGenderMale; - -/** - 女性用户 - - */ -extern NSString *const UMSCustomAccountGenderFeMale; - -/** - 开发者自有账户对象,在app登录或者注册完成之后用用户名来初始化这样的对象,可以指定头像等,然后用`UMSocialAccountManager`来添加到友盟的账户体系上,使用我们的评论列表和个人中心的页面时就会显示自有账号的用户名和头像 - - */ -@interface UMSocialCustomAccount : NSObject - -/** - 用户名 - - */ -@property (nonatomic, copy) NSString *userName; - -/** - 用户id - - */ -@property (nonatomic, copy) NSString *usid; - -/** - 性别 - - */ -@property (nonatomic, copy) NSString *gender; - -/** - 生日 - - */ -@property (nonatomic, retain) NSDate *birthday; - -/** - 个人页面地址 - - */ -@property (nonatomic, copy) NSString *profileUrl; - -/** - 头像url - - */ -@property (nonatomic, copy) NSString *iconUrl; - -/** - 自定义数据 - - */ -@property (nonatomic, retain) NSDictionary *customData; - -/** - 初始化自定义用户 - - @param userName 用户名 - - @return 自定义用户对象 - */ --(id)initWithUserName:(NSString *)userName; - -@end - -/** - 账号管理,可以添加开发者应用的自有账号到友盟的账号体系,查询此sns平台是否授权等。 - - */ -@interface UMSocialAccountManager : NSObject - -/** - 存放用户在各个微博平台账户信息的哈希对象,以各个平台名为key,以`UMSocialAccountEntity`对象为value - - */ -+(NSDictionary *)socialAccountDictionary; - -/** - 添加自己获取到的sns账号,必须要有sns用户的usid和accessToken。添加成功后,需要调用`+(void)setSnsAccount:(UMSocialAccountEntity *)snsAccount; `把账户添加到本地缓存。 - - @param snsAccount 已经授权的sns账号对象 - @param completion 回调Block对象 - - */ -+(void)postSnsAccount:(UMSocialAccountEntity *)snsAccount completion:(UMSocialDataServiceCompletion)completion; - - -/** - 添加自有账号到友盟的账号体系,一般是用户在使用自有账号登录之后,再利用此方法上传账号,然后利用我们评论和个人中心的接口就会显示自有账号的昵称和头像等信息 - - @param customAccount 自有账号对象 - @param completion 回调Block对象 - - */ -+(void)postCustomAccount:(UMSocialCustomAccount *)customAccount completion:(UMSocialDataServiceCompletion)completion; - - -/** - 把自有账号添加到本地账号中 - - @param snsAccount 已经授权成功的账户对象 - - */ -+(void)setSnsAccount:(UMSocialAccountEntity *)snsAccount; - - -/** - 判断是否登录,此登录包括以游客身份登录,如果已经登录评论编辑页面点击发送就不会提示登录。 - - */ -+ (BOOL)isLogin; - -/** - 判断是否用sns账号来登录,即绑定一个sns账号作为登录账号,如果是的话,个人中心页面上半部分和评论列表即显示此用户名、头像。 - - */ -+ (BOOL)isLoginWithSnsAccount; - -/** - 判断是否授权此sns平台,此方法不包含授权过期的情况,如果要在分享前判断是否授权并且token没有过期,需要用`isOauthAndTokenNotExpired`方法 - - @param platformType sns平台名,定义在`UMSocialSnsPlatformManager.h` - */ -+ (BOOL)isOauthWithPlatform:(NSString *)platformType; - -/** - 判断此平台是否授权,并且token没有过期 - - @param platformType sns平台名,定义在`UMSocialSnsPlatformManager.h` - */ -+(BOOL)isOauthAndTokenNotExpired:(NSString *)platformType; - -/** - 判断是否以游客身份登录。游客身份的过程是用户进入登录页面,并且选以游客身份登录,如果用户选择其他平台登录或者没有进入登录页面都是非游客身份登录。 - - */ -+ (BOOL)isLoginWithAnonymous; - -/** - 设置是否已经以游客身份来登录,如果以游客身份登录,评论会显示匿名和使用默认头像,如果没有使用游客身份,会弹出登录界面,选择一个sns平台作为登录账号之后再评论。 - - */ -+ (void)setIsLoginWithAnonymous:(BOOL)anonymous; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h deleted file mode 100644 index b145e16..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialBar.h +++ /dev/null @@ -1,158 +0,0 @@ -// -// UMSocialBar.h -// SocialSDK -// -// Created by yeahugo on 13-7-2. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import -#import "UMSocialSnsPlatformManager.h" -#import "UMSocialControllerServiceComment.h" - -/** - 分享 - */ -extern NSString *const UMSocialShare; - -/** - 喜欢 - */ -extern NSString *const UMSocialLike; - -/** - 评论 - */ -extern NSString *const UMSocialComment; - -/** - 个人中心 - */ -extern NSString *const UMSocialAccount; - - -typedef void (^ClickHandler)(void); - - -/** - 代表平台或者功能的按钮 - */ -@interface UMSocialButton : UIButton - -/** - 点击按钮之后的响应事件 - */ -@property (nonatomic, copy) ClickHandler clickHandler; - -/** - 当前``对象,此对象可以获取到授权完成,关闭页面等状态,详情看`UMSocialUIDelegate`的定义 - */ -@property (nonatomic, assign) id socialUIDelegate; - -/** - 按钮名称 - */ -@property (nonatomic, copy) NSString *buttonName; - -/** - 按钮初始化方法 - - @param buttonName 按钮类型,可以指定`UMSocialShare`,`UMSocialComment`,`UMSocialLike`、`UMSocialAccount`分别代表分享、评论、喜欢、个人中心 - 或者`UMShareToSina`、`UMShareToTencent`等代表各个微博平台 - - @param socialData 数据对象,如果是评论或者喜欢,代表不同的评论、喜欢对象。可以传nil,使用默认数据对象 - - @param controller 分享编辑页面、评论页面等将弹到的UIViewController对象 - - */ --(id)initWithButtonName:(NSString *)buttonName - socialData:(UMSocialData *)socialData - controller:(UIViewController *)controller; - -/** -按钮初始化方法 - -@param buttonName 按钮类型,可以指定`UMSocialShare`,`UMSocialComment`,`UMSocialLike`、`UMSocialAccount`分别代表分享、评论、喜欢、个人中心 -或者`UMShareToSina`、`UMShareToTencent`等代表各个微博平台 - -@param controllerService UMSocialControllerService对象,如果是评论或者喜欢,代表不同的评论、喜欢对象。可以传nil,使用默认数据对象 - -@param controller 分享编辑页面、评论页面等将弹到的UIViewController对象 - -*/ --(id)initWithButtonName:(NSString *)buttonName - controllerService:(UMSocialControllerServiceComment *)controllerService - controller:(UIViewController *)controller; - -@end - -/** - 社会化操作栏,默认集成了评论、喜欢、分享、个人中心等功能。 - 你可以根据你的需求对操作栏上的各个按钮进行定制,方法是修改barButtons数组。 - */ -@interface UMSocialBar : UIView - -/** - 代表操作栏上所有按钮的数组,数组的元素是UMSocialButton对象。 - - 你可以增加自定义的按钮,例如 - - ``` - UMSocialButton *customButton = [[UMSocialButton alloc] initWithButtonType:@"custom" socialData:nil controller:nil]; - customButton.clickHandler = ^(){ - NSLog(@"click !!"); - }; - [customButton setImage:[UIImage imageNamed:@"icon"] forState:UIControlStateNormal]; - [_socialBar.barButtons addObject:customButton]; - ``` - - 你可以删除指定的按钮 - - ``` - [_socialBar.barButtons removeObjectAtIndex:1]; - ``` - - 可以修改指定按钮 - - ``` - UMSocialButton *socialButton1 = [_socialBar.barButtons objectAtIndex:1]; - socialButton1.clickHandler = ^(){ - NSLog(@"click!!"); - }; - ``` - */ -@property (nonatomic, retain) NSMutableArray *barButtons; - -/** - `UMSocialData`对象,可以通过该对象设置分享内嵌文字、图片,获取分享数等属性 - */ -@property (nonatomic, retain) UMSocialData *socialData; - -/** - 当前``对象,此对象可以获取到授权完成,关闭页面等状态,详情看`UMSocialUIDelegate`的定义 - */ -@property (nonatomic, assign) id socialUIDelegate; - -/** - 初始化方法 - - @param socialData 标识不同分享对象 - - @param viewController 分享编辑页面等弹出到的UIViewController对象 - */ -- (id)initWithUMSocialData:(UMSocialData *)socialData - withViewController:(UIViewController *)viewController; - -/** - 更新操作栏的数字 - - */ -- (void)updateButtonNumber; - -/* - 从线上获取分享、评论、喜欢等个数,更新按钮文字 - - */ -- (void)requestUpdateButtonNumber; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h deleted file mode 100644 index 64d88fc..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialConfig.h +++ /dev/null @@ -1,301 +0,0 @@ -// -// UMSConfigManager.h -// SocialSDK -// -// Created by Jiahuan Ye on 12-9-15. -// Copyright (c) umeng.com All rights reserved. -// - -#import -#import "UMSocialDataService.h" - - -#ifndef __IPHONE_6_0 -typedef enum { - UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait), - UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft), - UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight), - UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown), - UIInterfaceOrientationMaskLandscape = (UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), - UIInterfaceOrientationMaskAll = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown), - UIInterfaceOrientationMaskAllButUpsideDown = (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight), -} UIInterfaceOrientationMask; -#endif - -typedef enum { - UMSocialiToastPositionTop = 1000001, //提示位置在屏幕上部 - UMSocialiToastPositionBottom, //提示位置在屏幕下部 - UMSocialiToastPositionCenter //提示位置在屏幕中间 -} UMSocialiToastPosition; - -/** - SDK样式主题 - - */ -typedef enum { - UMSocialThemeBlack, //黑色主题 - UMSocialThemeWhite //白色主题 -} UMSocialTheme; - - -/** - 设置分享列表页面的Block类型 - - @param ref 分享列表绘图所用的CGContext对象 - @param backgroundView 分享列表的背景图片 - @param label 平台文字 - */ -typedef void (^UMGridViewConfig)(CGContextRef ref, UIImageView *backgroundView, UILabel *label) ; - -/** - 设置导航栏的样式的Block类型 - - @param bar 导航栏 - @param closeButton 关闭按钮 - @param backButton 返回按钮 - @param postButton 发送按钮 - @param refreshButton 刷新按钮 - @param navigationItem 所在UINavigationController的navigationItem,可以改变相应的标题 - - */ -typedef void (^UMNavigationBarConfig)(UINavigationBar *bar, - UIButton *closeButton, - UIButton *backButton, - UIButton *postButton, - UIButton *refreshButton, - UINavigationItem * navigationItem); - -/** - 设置TableViewCell的样式 - - @param cell UITableViewCell - @param viewControllerType 页面类型 - - */ -typedef void (^UMTableViewCellConfig)(UITableViewCell *cell,UMSViewControllerType viewControllerType); - -/** - SDK设置类,负责改变SDK功能配置 - - */ -@interface UMSocialConfig : NSObject - -/** - 设置显示的sns平台类型 - - @param platformNames 在`UMSocialSnsPlatformManager.h`定义的UMShareToSina、UMShareToTencent、UMShareToQzone、UMShareToRenren、UMShareToDouban、UMShareToEmail、UMShareToSms组成的NSArray - */ -+ (void)setSnsPlatformNames:(NSArray *)platformNames; - -/** -设置sdk所有页面需要支持屏幕方向. - -@param interfaceOrientations 一个bit map(位掩码),ios 6定义的`UIInterfaceOrientationMask` -*/ -+ (void)setSupportedInterfaceOrientations:(UIInterfaceOrientationMask)interfaceOrientations; - -/** - 设置社会化组件UI主题,现在有黑色和白色两种 - - @param theme UI主题 - - */ -+ (void) setTheme:(UMSocialTheme)theme; - - -/** - 设置分享列表页面,Block对象的形参包括有绘制当前线条的CGContex指针,icon背景视图 - 例如下面写法 - ``` - [UMSocialConfig setShareGridViewTheme:^(CGContextRef ref, UIImageView *backgroundView,UILabel *label){ - //改变线颜色和线宽 - CGContextSetRGBStrokeColor(ref, 0, 0, 0, 1.0); - CGContextSetLineWidth(ref, 1.0); - //改变背景颜色 - backgroundView.backgroundColor = [UIColor blackColor]; - - //添加背景图片 - UIImageView *imageView = [[UIImageView alloc] initWithFrame:backgroundView.frame]; - imageView.image = [UIImage imageNamed:@"share_bg.png"]; - [backgroundView addSubview:imageView]; - backgroundView.backgroundColor = [UIColor clearColor]; - -//改变文字标题的文字颜色 - label.textColor = [UIColor blueColor]; - //隐藏文字 - label.hidden = YES; - }]; - ``` - - @param gridViewConfig 设置分享列表样式的block对象 - - */ -+(void)setShareGridViewTheme:(UMGridViewConfig)gridViewConfig; - -/** - 设置导航栏,包括导航栏的UINavigationBar,返回按钮,关闭按钮,发送按钮,刷新按钮和中间的UINavigationItem的样式 - 例如下面写法: - - ``` - [UMSocialConfig setNavigationBarConfig:^(UINavigationBar *bar, - UIButton *closeButton, - UIButton *backButton, - UIButton *postButton, - UIButton *refreshButton, - UINavigationItem * navigationItem){ - UIImage * backgroundImage = [UIImage imageNamed:@"UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg"]; - - if ([bar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)]) { - [bar setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault]; - } - bar.titleTextAttributes = nil; - }]; - ``` - - @param navigationConfig 设置导航栏样式的block对象 - navigationConfig 是一个Block对象,传入的参数包括: - @param bar 导航栏 - @param closeButton 关闭按钮 - @param backButton 返回按钮 - @param postButton 发送按钮 - @param refreshButton 刷新按钮 - @param navigationItem 所在UINavigationController的navigationItem,可以改变相应的标题 - */ -+(void)setNavigationBarConfig:(UMNavigationBarConfig)navigationConfig; - -/** - 设置分享列表页,个人中心页面等的UITableViewCell的样式 - - @param tableViewCellConfig UITableViewCell的样式配置Block - @param cell UITableViewCell - @param viewControllerType 页面类型 - - */ -+(void)setTableViewCellConfig:(UMTableViewCellConfig)tableViewCellConfig; - -/** - 设置分享完成时“发送完成”或者分享错误等提示 - - @param isHidden 是否隐藏该提示 - @param toastPosition 提示的位置,可以设置成在屏幕上部、中间、下部 - */ -+(void)setFinishToastIsHidden:(BOOL)isHidden position:(UMSocialiToastPosition)toastPosition; - -/** - 设置官方微博账号,设置之后可以在授权页面有关注微博的选项,默认勾选,授权之后用户即关注官方微博,仅支持新浪微博和腾讯微博 - - @param weiboUids 腾讯微博和新浪微博的key分别是`UMShareToSina`和`UMShareToTenc`,值分别是官方微博的uid,例如`[UMSocialConfig setFollowWeiboUids:[NSDictionary dictionaryWithObjectsAndKeys:@"yourSinaUid",UMShareToSina,nil]];` - */ -+ (void)setFollowWeiboUids:(NSDictionary *)weiboUids; - -/** - 设置新增加`UMSocialSnsPlatform`对象 - @param snsPlatformArray `UMSocialSnsPlatform`组成的数组对象 - - */ -+ (void)addSocialSnsPlatform:(NSArray *)snsPlatformArray; - -/** - 设置页面的背景颜色 - @param defaultColor 设置页面背景颜色 - - */ -+ (void)setDefaultColor:(UIColor *)defaultColor; - -/** - 设置iPad页面的大小 - @param size 页面大小 - - */ -+ (void)setBoundsSizeForiPad:(CGSize)size; - -/** - 设置分享编辑页面是否等待完成之后再关闭页面还是立即关闭,如果设置成YES,就是等待分享完成之后再关闭,否则立即关闭。 - 2.2版本前默认等待分享完成之后再关闭。 - 2.2版本之后默认设置成立即关闭页面 - - @param shouldShareSynchronous 是否同步分享 - - */ -+ (void)setShouldShareSynchronous:(BOOL)shouldShareSynchronous; - -/** - 设置评论页面是否出现分享按钮,默认出现 - - */ -+ (void)setShouldCommentWithShare:(BOOL)shouldCommentWithShare; - -/** - 设置评论页面是否出现分享地理位置信息的按钮,默认出现 - - */ -+ (void)setShouldCommentWithLocation:(BOOL)shouldCommentWithLocation; - -/** Deprecated API, Use [UMSocialConfig showPlatformWhenNotInstall:nil]; - 显示所有平台,某些平台例如微信和QQ,需要安装客户端才能分享,若没有安装客户端情况下不显示这些平台 - - */ -//+ (void)showAllPlatform:(BOOL)showAllPlatform; - -/** Deprecated API, Use [UMSocialConfig hiddenNotInstallPlatforms:nil]; - 指定显示没有安装客户端的平台,默认需要客户端的分享平台不显示。 - 传nil则显示所有平台。 - - @param showPlatforms 指定要显示的平台 - - */ -+ (void)showNotInstallPlatforms:(NSArray *)showPlatforms; - -/** - 隐藏指定没有安装客户端的平台。 - - @param hiddenPlatforms 指定要隐藏的平台,传nil则隐藏所有没有安装客户端的平台 - - */ -+ (void)hiddenNotInstallPlatforms:(NSArray *)hiddenPlatforms; - -+ (UMSocialConfig *)shareInstance; - -/** deprecated API, Use ''[UMSocialSinaHandler openSSOWithRedirectURL:@"http://sns.whalecloud.com/sina2/callback"];'' - - 设置是否支持新浪微博SSO,默认不支持 - @param supportSinaSSO 设置是否支持新浪微博SSO - @param appRedirectUrl 设置授权回调地址,此授权回调地址必须和你在新浪应用后台填写的回调地址一致,否则不能授权 - 如果在新浪微博后台绑定我们的回调地址“http://sns.whalecloud.com/sina2/callback”,这里可以传nil - - */ -//+ (void)setSupportSinaSSO:(BOOL)supportSinaSSO appRedirectUrl:(NSString *)appRedirectUrl; - - -/** deprecated API, Use ''[UMSocialQQHandler shareToQQWithAppId:@"100424468" url:@"http://www.umeng.com/social"];'' - - 设置手机QQ的app_Id和微信图文分享用到的url地址 - - @param app_Id 手机QQ的AppId - @param url 手机QQ图文分享web类型,用到的url地址,如果传nil,默认使用http://www.umeng.com/social - @param classes 载入QQ互联 SDK,用到的两个类 - */ - -//+ (void)setQQAppId:(NSString *)app_Id url:(NSString *)url importClasses:(NSArray *)classes; - - -/**deprecated API, Use ''[UMSocialQQHandler setSupportQzoneSSO:YES];'' - 设置支持Qzone的SSO授权 - - @param supportQzoneSSO Qzone支持SSO - @param classes 载入QQ互联 SDK,用到的两个类 - */ - -//+ (void)setSupportQzoneSSO:(BOOL)supportQzoneSSO importClasses:(NSArray *)classes; - - -/**deprecated API - 设置是否使用QQ互联的SDK来分享 - - @param useQQSDK 是否使用QQ互联的SDK来分享 - @param classes 载入QQ互联 SDK,用到的两个类 - */ - -//+ (void)setShareQzoneWithQQSDK:(BOOL)useQQSDK url:(NSString *)urlString importClasses:(NSArray *)classes; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h deleted file mode 100644 index ea11d20..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerService.h +++ /dev/null @@ -1,201 +0,0 @@ -// -// UMSocialUIController.h -// SocialSDK -// -// Created by Jiahuan Ye on 12-9-12. -// Copyright (c) umeng.com All rights reserved. -// - -#import -#import "UMSocialDataService.h" - -#define kTagSocialIconActionSheet 1013 -#define kTagSocialShakeView 1014 - -@class UMSocialControllerService; - -/** - `UMSocialControllerService`对象用到的一些回调方法,包括分享完成、授权完成、评论完成等事件,和关闭授权页面、分享页面、评论页面等事件。 - */ -@protocol UMSocialUIDelegate - -@optional - -/** - 自定义关闭授权页面事件 - - @param navigationCtroller 关闭当前页面的navigationCtroller对象 - - */ --(BOOL)closeOauthWebViewController:(UINavigationController *)navigationCtroller socialControllerService:(UMSocialControllerService *)socialControllerService; - -/** - 关闭当前页面之后 - - @param fromViewControllerType 关闭的页面类型 - - */ --(void)didCloseUIViewController:(UMSViewControllerType)fromViewControllerType; - -/** - 各个页面执行授权完成、分享完成、或者评论完成时的回调函数 - - @param response 返回`UMSocialResponseEntity`对象,`UMSocialResponseEntity`里面的viewControllerType属性可以获得页面类型 - */ --(void)didFinishGetUMSocialDataInViewController:(UMSocialResponseEntity *)response; - -/** - 点击分享列表页面,之后的回调方法,你可以通过判断不同的分享平台,来设置分享内容。 - 例如: - - -(void)didSelectSocialPlatform:(NSString *)platformName withSocialData:(UMSocialData *)socialData - { - if (platformName == UMShareToSina) { - socialData.shareText = @"分享到新浪微博的文字内容"; - } - else{ - socialData.shareText = @"分享到其他平台的文字内容"; - } - } - - @param platformName 点击分享平台 - - @prarm socialData 分享内容 - */ --(void)didSelectSocialPlatform:(NSString *)platformName withSocialData:(UMSocialData *)socialData; - - -/** - 配置点击分享列表后是否弹出分享内容编辑页面,再弹出分享,默认需要弹出分享编辑页面 - - @result 设置是否需要弹出分享内容编辑页面,默认需要 - - */ --(BOOL)isDirectShareInIconActionSheet; -@end - - -/** - 用此类的方法可以得到分享的有关UI对象,例如分享列表、评论列表、分享编辑页、分享授权页、个人中心页面等。返回都是`UINavigationController`对象,建议把这个对象present到你要添加到的`UIViewController`上 - */ -@interface UMSocialControllerService : NSObject - -/** - 与`UMSocialControllerService`对象对应的`UMSocialData`对象,可以通过该对象设置分享内嵌文字、图片,获取分享数等属性 - */ -@property (nonatomic, retain) UMSocialData *socialData; - -/** - 用`UMSocialDataService`对象,可以调用发送微博、评论等数据级的方法 - */ -@property (nonatomic, readonly) UMSocialDataService *socialDataService; - -/** - 当前返回的`UINavigationController`对象 - */ -@property (nonatomic, assign) UIViewController *currentViewController; - -/** - 当前返回的`UIViewController`对象 - */ -@property (nonatomic, assign) UINavigationController *currentNavigationController; - - -/** - 当前``对象,此对象可以获取到授权完成,关闭页面等状态,详情看`UMSocialUIDelegate`的定义 - */ -@property (nonatomic, assign) id socialUIDelegate; - -/** - 当前sns平台名 - */ -@property (nonatomic, retain) NSString *currentSnsPlatformName; - -/** - 下一个页面类型 - */ -@property (nonatomic, assign) UMSViewControllerType nextViewController; - -/** - 返回一个以[UMSocialData defaultData]来做初始化参数的`UMSocialControllerService`对象 - - @return `UMSocialControllerService`的默认初始化对象 - */ -+(UMSocialControllerService *)defaultControllerService; - -///--------------------------------------- -/// @name 初始化方法和设置 -///--------------------------------------- - -/** - 初始化一个`UMSocialControllerService`对象 - - @param socialData `UMSocialData`对象 - - @return 初始化对象 - */ -- (id)initWithUMSocialData:(UMSocialData *)socialData; - -/** - 设置分享内容和回调对象 - - @param shareText 分享内嵌文字 - - @param shareImage 分享内嵌图片,可以传入UIImage或者NSData类型 - - @param socialUIDelegate 分享回调对象 - */ -- (void)setShareText:(NSString *)shareText shareImage:(id)shareImage - socialUIDelegate:(id)socialUIDelegate; - -///--------------------------------------- -/// @name 获得评论列表、分享列表等UINavigationController -///--------------------------------------- - -/** - 得到一个分享列表页面,该列表出现的分享列表可以通过实现`UMSocialConfig`的类方法来自定义 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialShareListController; - - -/** - 分享编辑页面 - - @param platformType 要编辑的微博平台,并支持UMSocialSnsTypeEmail和UMSocialSnsTypeSms返回编辑Email页面和短信页面,不支持邮箱或者短信的设备分别返回nil - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialShareEditController:(NSString *)platformType; - -/** - 授权页面,如果你要想得到授权完成之后的事件,你可以实现`UMSocialUIDelegate`里面的`-(void)didCloseUIViewController:(UMSViewControllerType)fromViewControllerType;`方法,当授权关闭页面会调用此方法。另外授权完成之后sdk会自动去取个人账户信息,你可以在回调函数里面去到刚刚授权的微博平台的账户信息。 - - @param shareToType 要授权的微博平台 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialOauthController:(NSString *)platformType; - -/** - 获取用以sns各平台icon平铺来展示的分享列表页面对象 - - @param controller 弹出的分享列表页面,点击sns平台icon之后,出现的分享页面或者授权页面所在的UIViewController - - @return 分享列表页面 - */ -- (id)getSocialIconActionSheetInController:(UIViewController *)controller; - -/** -获取各种页面的`UIViewController`对象 - -@param viewControllerType 页面类型 - -@param snsName 编辑页面、授权页面等需要的平台名 - -@return 页面的`UIViewController`对象 -*/ -- (UIViewController *)getSocialViewController:(UMSViewControllerType)viewControllerType withSnsType:(NSString *)snsName; - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h deleted file mode 100644 index 65d6e75..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialControllerServiceComment.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// UMSocialControllerServiceComment.h -// SocialSDK -// -// Created by yeahugo on 12-12-7. -// Copyright (c) 2012年 Umeng. All rights reserved. -// - -#import -#import "UMSocialControllerService.h" - -/** - 用此类的方法可以得到分享的有关UI对象,例如分享列表、评论列表、分享编辑页、分享授权页、个人中心页面等。返回都是`UINavigationController`对象,建议把这个对象present到你要添加到的`UIViewController`上 - */ -@interface UMSocialControllerServiceComment : UMSocialControllerService - -/** - 返回一个以[UMSocialData defaultData]来做初始化参数的`UMSocialControllerServiceComment`对象 - - @return `UMSocialControllerServiceComment`的默认初始化对象 - */ -+(UMSocialControllerServiceComment *)defaultControllerService; - -/** - 评论列表页面,评论列表页面包括各评论详情、评论编辑 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialCommentListController; - - -/** - 得到个人中心页面,该页面包括用户各个微博授权信息和选择的登录账号 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialAccountController; - - -/** - sns账号设置页面,该页面包括个人的各个微博授权信息 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSnsAccountController; - - -/** - 登录页面,出现你配置出现的所有sns平台,授权之后设置为sdk的登录账号。使用评论功能时会取此登录账号的昵称和头像。 - - @return `UINavigationController`对象 - */ -- (UINavigationController *)getSocialLoginController; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h deleted file mode 100644 index 5685a2f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialData.h +++ /dev/null @@ -1,147 +0,0 @@ -// -// UMSocialData.h -// SocialSDK -// -// Created by Jiahuan Ye on 12-9-12. -// Copyright (c) umeng.com All rights reserved. -// - -#import -#import -#import "UMSocialSnsData.h" - -/** - 一个`UMSocialData`对象标识一个分享资源,用一个*identifier*字符串作为标识,你可以为此对象设置分享内嵌文字、分享图片等,可以获取到对应的分享数、评论数。同时`UMSocialData`类方法用来设置appKey和打开log等全局设置。 - */ -@interface UMSocialData : NSObject - - -///--------------------------------------- -/// @name 对象属性 -///--------------------------------------- - -/** - 标识每个不同`UMSocialData`对象的字符串 - - */ -@property (nonatomic, readonly) NSString *identifier; - -/** - 报表title - 不同`UMSocialData`实例的title,在报表中可看到对应分享操作的title - */ -@property (nonatomic, copy) NSString *title; - -/** - 分享的内嵌文字 - - */ -@property (nonatomic, copy) NSString * shareText; - -/** - 用于用户在评论并分享的时候,该字段内容会自动添加到评论的后面,分享到各个分享平台 - - */ -@property (nonatomic, copy) NSString * commentText; - -/** - 分享的内嵌图片,可以传入`UIImage`或者`NSData`类型 - - */ -@property (nonatomic, retain) id shareImage; - -/** - 用于用户在评论并分享的时候,该字段内容会自动添加到评论中的图片,分享到各个分享平台 - - */ -@property (nonatomic, retain) UIImage * commentImage; - -/** - 保存在本地记录是否喜欢 - - */ -@property (nonatomic, readonly) BOOL isLike; - -/** - 保存在本地的用户微博账户信息,key是微博名,value是自定义的`UMSocialResponseEntity`对象 - - */ -@property (nonatomic, readonly) NSDictionary *socialAccount; - - -/** - 分享到微博多媒体资源,包括指定url的图片、音乐、视频 - - */ -@property (nonatomic, retain) UMSocialUrlResource *urlResource; - -/** - 分享到各个微博的扩展设置 - - */ -@property (nonatomic, retain) UMSocialExtConfig *extConfig; - -///--------------------------------------- -/// @name 对所有对象都起作用的类方法 -///--------------------------------------- - -/**设置app的友盟appKey,此appKey从友盟网站获取 - - @param appKey 友盟appKey - */ - -+ (void)setAppKey:(NSString *)appKey; - - -/**获取设置的友盟appKey - - */ -+ (NSString *)appKey; - -/** - 设置是否打开log输出,默认不打开,如果打开的话可以看到此sdk网络或者其他操作,有利于调试 - - @param openLog 是否打开log输出 - - */ -+ (void)openLog:(BOOL)openLog; - -/** - 获取默认的`UMSocialData`对象,此对象的identifier为"UMSocialDefault" - - */ -+ (UMSocialData *)defaultData; - -///--------------------------------------- -/// @name 对象方法 -///--------------------------------------- - -/** - 初始化一个`UMSocialData`对象 - - @param identifier 一个`UMSocialData`对象的标识符,相同标识符的`UMSocialData`拥有相同的属性 - - @return return 初始化的`UMSocialData`对象 - */ -- (id)initWithIdentifier:(NSString *)identifier; - -/** - 初始化一个`UMSocialData`对象 - - @param identifier 一个`UMSocialData`对象的标识符,相同标识符的`UMSocialData`拥有相同的属性 - - @param title 对每个对象的描述,在报表端显示分享、评论等操作对应的title - - @return return 初始化的`UMSocialData`对象 - */ -- (id)initWithIdentifier:(NSString *)identifier withTitle:(NSString *)title; - -/** - 获得该对象保存在本地的分享数、评论数或者喜欢数 - - @param numberType 数目类型,分享、评论、喜欢分别为`UMSNumberShare`、`UMSNumberComment`、`UMSNumberLike` - - @return 各种动作的数目 - */ -- (NSInteger)getNumber:(UMSNumberType)numberType; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h deleted file mode 100644 index c9584ff..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialDataService.h +++ /dev/null @@ -1,367 +0,0 @@ -// -// UMSocialDataAPI.h -// SocialSDK -// -// Created by Jiahuan Ye on 12-9-13. -// Copyright (c) umeng.com All rights reserved. -// -#import -#import "UMSocialData.h" - -/** - 网络请求结果状态码 - - */ -typedef enum { - UMSResponseCodeSuccess = 200, //成功 - UMSREsponseCodeTokenInvalid = 400, //授权用户token错误 - UMSResponseCodeBaned = 505, //用户被封禁 - UMSResponseCodeFaild = 510, //发送失败(由于内容不符合要求或者其他原因) - UMSResponseCodeArgumentsError = 522, //参数错误,提供的参数不符合要求 - UMSResponseCodeEmptyContent = 5007, //发送内容为空 - UMSResponseCodeShareRepeated = 5016, //分享内容重复 - UMSResponseCodeGetNoUidFromOauth = 5020, //授权之后没有得到用户uid - UMSResponseCodeAccessTokenExpired = 5027, //token过期 - UMSResponseCodeNetworkError = 5050, //网络错误 - UMSResponseCodeGetProfileFailed = 5051, //获取账户失败 - UMSResponseCodeCancel = 5052, //用户取消授权 - UMSResponseCodeNotLogin = 5053, //用户没有登录 - UMSResponseCodeNoApiAuthority = 100031 //QQ空间应用没有在QQ互联平台上申请上传图片到相册的权限 -} UMSResponseCode; - -/** - 网络请求类型 - - */ -typedef enum { - UMSResponseAddComment = 0, //添加评论 - UMSResponseAddLike = 1, //添加喜欢 - UMSResponseGetCommentList = 2, //获取评论列表 - UMSResponseGetSocialData = 3, //获取social enitity信息 - UMSResponseShareToSNS = 4, //分享到一个微博平台 - UMSResponseShareToMutilSNS = 5, //分享到多个微博平台 - UMSResponseBinding = 6, //绑定一个账户作为登录账户 - UMSResponseUnBinding = 7, //解除绑定账户 - UMSResponseUnOauth = 8, //解除授权 - UMSResponseOauth = 9, //授权 - UMSResponseGetAccount = 10, //获取账户信息 - UMSResponseGetSnsInfo = 11, //获取sns详细信息 - UMSResponseGetFriends = 12, //获取朋友列表 - UMSResponseAddFollow = 13, //添加关注 - UMSResponseAddCustomAccount = 14, //添加自定义账户 - UMSResponseAddSnsAccount = 15, //添加已经授权的账户 - UMSResponseGetAppInfo = 16, //获取各个sns绑定app 信息 - UMSResponseIsTokenValid = 17, //获取各个微博平台的token是否有效 - UMSResponseAnalytics = 18, - UMSResponseAddAppInfo = 19 -} UMSResponse; - -/** - 页面类型 - - */ -typedef enum{ - UMSViewControllerCommentList, //评论列表 - UMSViewControllerCommentEdit, //评论编辑页 - UMSViewControllerShareList, //分享列表页,包含sdk支持的所有sns平台 - UMSViewControllerShareEdit, //分享编辑页 - UMSViewControllerAccount, //个人中心页面 - UMSViewControllerSnsAccount, //sns账号设置页面 - UMSViewControllerLoginAccount, //登录账号页面 - UMSViewControllerOauth, //oath授权页面 - UMSViewControllerLogin, //登录页面,登录的可选平台为sdk所支持的sns平台 - UMSViewControllerFriendList, //好友列表页面 - UMSViewControllerActionSheet //icon平铺排列的分享列表页面 -}UMSViewControllerType; - - -/** - 返回的状态对象,可以通过此对象获取返回类型、返回结果、返回数据等。 - - */ -@interface UMSocialResponseEntity : NSObject - -/** - 代表发送结果,UMSResponseCodeSuccess代表成功,参看上面的定义 - - */ -@property (nonatomic, assign) UMSResponseCode responseCode; - -/** - 数据类型 - - */ -@property (nonatomic, assign) UMSResponse responseType; - -/** - 数据返回`UMViewControllerType`类型,如果是UI的回调函数,表示回调函数所在的页面 - - */ -@property (nonatomic, assign) UMSViewControllerType viewControllerType; - -/** - 错误原因 - - */ -@property (nonatomic, retain) NSString *message; - -/** - 返回数据 - - */ -@property (nonatomic, retain) NSDictionary *data; - -/** - 客户端发送出现的错误 - - */ -@property (nonatomic, retain) NSError *error; - -/** - 把各属性编码成NSString - - @return 一个`NSString`对象 - */ --(NSString *)description; -@end - - -/** - 进行网络请求之后的回调函数,你可以通过返回的`UMSocialResponseEntity`对象的`responseType`类型来对不同的请求来做处理。 - - @see `UMSocialResponseEntity.h` - - */ -@protocol UMSocialDataDelegate - -/** - 进行网络请求之后得到的回调方法 - - @param response 回调返回一个`UMSResponseEntity`对象 - - */ --(void)didFinishGetUMSocialDataResponse:(UMSocialResponseEntity *)response; - -@end - -typedef void (^UMSocialDataServiceCompletion)(UMSocialResponseEntity * response); - -@class CLLocation; - -/** - 底层数据接口对象,用一个`UMSocialData`来初始化,此对象的方法有在直接发送微博、发送评论等。可以通过`socialData`属性来获取分享数、评论数,设置分享内嵌文字等。 - */ -@interface UMSocialDataService : NSObject - -///--------------------------------------- -/// @name 属性 -///--------------------------------------- - -@property (nonatomic, copy) UMSocialDataServiceCompletion completion; - -/** - 通过`UMSocialData`对象,可以设置分享文字、图片,并获取到分享数、微博账号等属性 - */ -@property (nonatomic, retain) UMSocialData *socialData; - -/** - 设置实现了``的对象 - */ -@property (nonatomic, readonly) id socialDataDelegate; - -///--------------------------------------- -/// @name 对象初始化和设置方法 -///--------------------------------------- - - -/** - 返回一个以[UMSocialData defaultData]来做初始化参数的`UMSocialDataService`对象 - - @return `UMSocialDataService`的默认初始化对象 - */ -+(UMSocialDataService *)defaultDataService; - -/** - 初始化一个`UMSocialDataService`对象 - - @param socialData 一个`UMSocialData`对象 - - @return 初始化对象 - */ -- (id)initWithUMSocialData:(UMSocialData *)socialData; - -/*! - 设置实现了``的对象, 如果在此视图设置了delegate,离开此视图的时候要设置为nil - - @param delegate 实现了``的对象 - - */ -- (void)setUMSocialDelegate:(id )delegate; - -/** - 获取微博分享数、评论数等数据 - - @param completion 获取到数据之后执行的block对象,返回数据放在completion.data - - */ --(void)requestSocialDataWithCompletion:(UMSocialDataServiceCompletion)completion; - -/** - Deprecated APIs - 发送微博内容到多个微博平台 - - @param platformTypes 分享到的平台,数组的元素是`UMSocialSnsPlatformManager.h`定义的平台名的常量字符串,例如`UMShareToSina`,`UMShareToTencent`等。 - @param content 分享的文字内容 - @param image 分享的图片 - @param location 分享的地理位置信息 - @param urlResource 图片、音乐、视频等url资源 - @param completion 发送完成执行的block对象 - - */ -- (void)postSNSWithTypes:(NSArray *)platformTypes - content:(NSString *)content - image:(id)image - location:(CLLocation *)location - urlResource:(UMSocialUrlResource *)urlResource - completion:(UMSocialDataServiceCompletion)completion; - -/** - 发送微博内容到多个微博平台 - - @param platformTypes 分享到的平台,数组的元素是`UMSocialSnsPlatformManager.h`定义的平台名的常量字符串,例如`UMShareToSina`,`UMShareToTencent`等。 - @param content 分享的文字内容 - @param image 分享的图片,可以传入UIImage类型或者NSData类型 - @param location 分享的地理位置信息 - @param urlResource 图片、音乐、视频等url资源 - @param completion 发送完成执行的block对象 - @param presentedController 如果发送的平台微博只有一个并且没有授权,传入要授权的viewController,将弹出授权页面,进行授权。可以传nil,将不进行授权。 - - */ -- (void)postSNSWithTypes:(NSArray *)platformTypes - content:(NSString *)content - image:(id)image - location:(CLLocation *)location - urlResource:(UMSocialUrlResource *)urlResource - presentedController:(UIViewController *)presentedController - completion:(UMSocialDataServiceCompletion)completion; - -/** - 如果当前`UMSocialData`没有喜欢的话,发送喜欢,否则取消喜欢 - - @param completion 获取到数据之后执行的block对象 - - */ -- (void)postAddLikeOrCancelWithCompletion:(UMSocialDataServiceCompletion)completion; - -/** - 发送评论 - - @param content 评论的文字内容 - @param completion 获取到数据之后执行的block对象 - - */ -- (void)postCommentWithContent:(NSString *)content completion:(UMSocialDataServiceCompletion)completion; - -/** - 发送评论 - - @param content 评论的文字内容 - @param image 评论并发送到微博的图片 - @param templateText 评论并发送到微博跟在微博正文后面用//分隔的文字 - @param location 评论的地理位置信息 - @param shareToSNS 评论并分享到微博平台,key为微博名,定义在`UMSocialSnsPlatformManager.h`中的`UMShareToSina`等,值为相应的usid - @param completion 获取到数据之后执行的block对象 - - */ --(void)postCommentWithContent:(NSString *)content - image:(UIImage *)image - templateText:(NSString *)templateText - location:(CLLocation *)location - shareToSNSWithUsid:(NSDictionary *)shareToSNS - completion:(UMSocialDataServiceCompletion)completion; - -/** - 获取评论 - - @param lastCommentTime 如果要获取最新的评论数,设置为-1,如果获取指定评论,传入评论在这之前的时间戳 - @param completion 获取到数据之后执行的block对象,此block对象的形参内带有请求的评论数据 - - */ -- (void)requestCommentList:(long long)lastCommentTime completion:(UMSocialDataServiceCompletion)completion; - -///--------------------------------------- -/// @name 用户账户信息相关网络请求 -///--------------------------------------- - -/** - 请求获取用户微博账号的数据,获取到的用户数据在回调函数获得,也可以通过已经保存在本地并且更新的`socialData`属性的`socialAccount`属性来获得 - @param completion 获取到数据之后执行的block对象,此block对象的形参带啊有请求的用户账号数据 - - */ -- (void)requestSocialAccountWithCompletion:(UMSocialDataServiceCompletion)completion; - -/** - 请求解除授权 - - @param platformType 要解除授权的微博平台 - @param completion 请求之后执行的block对象 - - */ -- (void)requestUnOauthWithType:(NSString *)platformType completion:(UMSocialDataServiceCompletion)completion; - -/** - 请求绑定账号 - - @param platformType 要绑定账号的微博平台 - @param completion 请求之后执行的block对象 - - */ -- (void)requestBindToSnsWithType:(NSString *)platformType completion:(UMSocialDataServiceCompletion)completion; - -/** - 请求解除绑定账号 - @param completion 请求之后执行的block对象 - - */ -- (void)requestUnBindToSnsWithCompletion:(UMSocialDataServiceCompletion)completion; - -/** - 请求获取用户微博账号的详细数据,获取返回数据和其他方法一样,在中的`didFinishGetUMSocialDataResponse`返回的`UMSocialResponseEntity`对象,数据部分是`data`属性,为`NSDictionary`类型 - - @param platformType 要获取微博信息的微博平台 - @param completion 请求之后执行的block对象 - - */ -- (void)requestSnsInformation:(NSString *)platformType completion:(UMSocialDataServiceCompletion)completion; - -/** - 请求获取用户微博账号的朋友列表,获取返回数据和其他方法一样,在中的`didFinishGetUMSocialDataResponse`返回的`UMSocialResponseEntity`对象,数据部分是`data`属性,为`NSDictionary`类型 - - @param platformType 要获取微博信息的微博平台 - @param completion 请求之后执行的block对象,block对象的形参内带有请求的好友数据 - - */ -- (void)requestSnsFriends:(NSString *)platformType completion:(UMSocialDataServiceCompletion)completion; - -/** - 请求添加关注 - - @param platformType 要添加关注的微博平台,目前添加关注功能只支持新浪微博和腾讯微博 - - @param usids 被关注的usid号 - - @param completion 请求之后执行的block对象 - - */ -- (void)requestAddFollow:(NSString *)platformType followedUsid:(NSArray *)usids completion:(UMSocialDataServiceCompletion)completion; - -/** - 检测用户在各个开放平台上的token是否有效,失效的情况包括token过期,用户手动解除授权,用户修改密码等情况 - - @param snsArray 微博平台数组,只支持传入支持授权的平台,包括新浪微博、腾讯微博、QQ空间等。不支持微信等平台。 - - @return completion 返回结果 - */ -- (void)requestIsTokenValid:(NSArray *)snsArray completion:(UMSocialDataServiceCompletion)completion; -@end - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h deleted file mode 100644 index 9276c0f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsData.h +++ /dev/null @@ -1,687 +0,0 @@ -// -// UMSocialSnsData.h -// SocialSDK -// -// Created by yeahugo on 13-11-25. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import -#import - -typedef enum{ - UMSNumberLike=0, //喜欢 - UMSNumberShare, //分享 - UMSNumberComment //评论 -}UMSNumberType; - -typedef enum { - UMSocialUrlResourceTypeDefault, //无 - UMSocialUrlResourceTypeImage, //图片 - UMSocialUrlResourceTypeVideo, //视频 - UMSocialUrlResourceTypeMusic //音乐 -}UMSocialUrlResourceType; - -/** - 分享到微博的多媒体资源,包括指定url的图片、音乐、视频 - */ -@interface UMSocialUrlResource : NSObject - -/** - url地址 - - */ -@property (nonatomic, copy) NSString *url; - - -/** - 资源类型,图片(UMSocialUrlResourceTypeImage)、视频(UMSocialUrlResourceTypeVideo),音乐(UMSocialUrlResourceTypeMusic) - - */ -@property (nonatomic, assign) UMSocialUrlResourceType resourceType; - -/** - 设置url资源类型和url地址 - - @param resourceType 多媒体资源类型,图片、音乐或者视频 - @param urlString url字符串 - - */ --(void)setResourceType:(UMSocialUrlResourceType)resourceType url:(NSString *)url; - -/** - 初始化对象,指定一种资源和资源URL - - @param resourceType 多媒体资源类型,图片、音乐或者视频 - @param urlString url字符串 - - */ --(id)initWithSnsResourceType:(UMSocialUrlResourceType)resourceType url:(NSString *)url; - -@end - - -/** - 微信内容类型 - */ -typedef enum{ - UMSocialWXMessageTypeNone, - UMSocialWXMessageTypeText, //微信消息文本类型 - UMSocialWXMessageTypeImage, //微信消息图片类型 - UMSocialWXMessageTypeApp, //微信消息应用类型 - UMSocialWXMessageTypeWeb, //微信消息网页类型 - UMSocialWXMessageTypeMusic, //微信消息音乐类型 - UMSocialWXMessageTypeVideo, //微信消息视频类型 - UMSocialWXMessageTypeEmotion, //微信消息表情类型 - UMSocialWXMessageTypeOther //微信消息其他多媒体类型 -}UMSocialWXMessageType; - -/** - 支付宝消息类型 - */ -typedef NS_ENUM(NSInteger, UMSocialAlipayMessageType) { - UMSocialAlipayMessageTypeNone, - UMSocialAlipayMessageTypeText, //支付宝消息文本类型 - UMSocialAlipayMessageTypeImage, //支付宝消息图片类型 - UMSocialAlipayMessageTypeWeb, //支付宝消息网页类型 -}; - -/** - 易信内容类型 - */ -typedef enum{ - UMSocialYXMessageTypeNone, - UMSocialYXMessageTypeText, //微信消息文本类型 - UMSocialYXMessageTypeImage, //微信消息图片类型 - UMSocialYXMessageTypeApp, //微信消息应用类型 - UMSocialYXMessageTypeWeb, //微信消息网页类型 - UMSocialYXMessageTypeMusic, //微信消息音乐类型 - UMSocialYXMessageTypeVideo, //微信消息视频类型 -}UMSocialYXMessageType; - -/** - QQ消息类型 - */ -typedef enum { - UMSocialQQMessageTypeDefault, //非纯图片QQ消息 - UMSocialQQMessageTypeImage //纯图片QQ消息 -}UMSocialQQMessageType; - -///--------------------------------------------------------------------------------------- - -/** - 设置分平台对应内容的基类 - - */ -@interface UMSocialSnsData : NSObject - -/** - 平台名 - - */ -@property (nonatomic, copy) NSString *snsName; - -/** - 分享文字 - - */ -@property (nonatomic, copy) NSString *shareText; - -/** - 分享图片 - - */ -@property (nonatomic, retain) id shareImage; - -/** - url资源类型 - - */ -@property (nonatomic, retain) UMSocialUrlResource *urlResource; - -@end - -///--------------------------------------------------------------------------------------- - -/** - 分享到新浪微博数据 - - */ -@interface UMSocialSinaData : UMSocialSnsData - -@end - - -/** - 分享到腾讯微博数据 - - */ -@interface UMSocialTencentData : UMSocialSnsData - -/** - 如果传入音乐的话,腾讯微博可以指定音乐标题 - - */ -@property (nonatomic, copy) NSString *title; - -/** - 如果传入音乐的话,腾讯微博可以指定音乐作者 - - */ -@property (nonatomic, copy) NSString *author; - -@end - - -/** - 分享到QQ空间数据,分享到QQ空间不支持纯图片的消息格式 - - */ -@interface UMSocialQzoneData : UMSocialSnsData - -/** - 分享内容标题 - - */ -@property (nonatomic, copy) NSString *title; - -/** - 应用链接地址 - - */ -@property (nonatomic, copy) NSString *url; - -@end - -/** - 分享到QQ好友 - - */ -@interface UMSocialQQData : UMSocialSnsData - -/** - 分享到QQ好友的网页消息url - - */ -@property (nonatomic, copy) NSString *url; - -/** - 分享到QQ好友的网页消息标题 - - */ -@property (nonatomic, copy) NSString *title; - -/** - 分享到QQ好友的消息类型 - - */ -@property (nonatomic, assign) UMSocialQQMessageType qqMessageType; - -@end - -/** - 分享到微信好友 - - */ -@interface UMSocialWechatSessionData : UMSocialSnsData - -/** - 图文分享标题 - - */ -@property (nonatomic, copy) NSString * title; - -/** - 微信消息类型,包括'UMSocialWXMessageTypeText'文字,'UMSocialWXMessageTypeImage'图片,'UMSocialWXMessageTypeApp'应用类型 - - */ -@property (nonatomic, assign) UMSocialWXMessageType wxMessageType; - -/** - 微信网页消息url - - */ -@property (nonatomic, copy) NSString * url; - -/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 - * @attention 大小不能超过10M - - */ -@property (nonatomic, retain) NSData *fileData; - -/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 - * @attention 长度不能超过2K - */ -@property (nonatomic, copy) NSString *extInfo; - -@end - - -/** - 分享到微信朋友圈 - - */ -@interface UMSocialWechatTimelineData : UMSocialSnsData - -/** - 图文分享标题 - - */ -@property (nonatomic, copy) NSString * title; - -/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 - * @attention 大小不能超过10M - - */ -@property (nonatomic, retain) NSData *fileData; - -/** - 微信消息类型,包括'UMSocialWXMessageTypeText'文字,'UMSocialWXMessageTypeImage'图片,'UMSocialWXMessageTypeApp'应用类型 - - */ -@property (nonatomic, assign) UMSocialWXMessageType wxMessageType; - -/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 - * @attention 长度不能超过2K - */ -@property (nonatomic, copy) NSString *extInfo; - -/** - 微信网页消息url - - */ -@property (nonatomic, copy) NSString * url; - -@end - - -/** - 分享到微信收藏 - - */ -@interface UMSocialWechatFavorite : UMSocialSnsData - -/** - 图文分享标题 - - */ -@property (nonatomic, copy) NSString * title; - -/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 - * @attention 大小不能超过10M - - */ -@property (nonatomic, retain) NSData *fileData; - -/** - 微信消息类型,包括'UMSocialWXMessageTypeText'文字,'UMSocialWXMessageTypeImage'图片,'UMSocialWXMessageTypeApp'应用类型 - - */ -@property (nonatomic, assign) UMSocialWXMessageType wxMessageType; - -/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 - * @attention 长度不能超过2K - */ -@property (nonatomic, copy) NSString *extInfo; - -/** - 微信网页消息url - - */ -@property (nonatomic, copy) NSString * url; - -@end - - -/** - 分享到支付宝好友 - - */ -@interface UMSocialAlipaySessionData : UMSocialSnsData - -/** - 图文分享标题 - - */ -@property (nonatomic, copy) NSString * title; - -/** - 支付宝消息类型 - - */ -@property (nonatomic, assign) UMSocialAlipayMessageType alipayMessageType; - -/** - 支付宝网页消息url - - */ -@property (nonatomic, copy) NSString * url; - -@end - -/** - 分享到人人网数据 - - */ -@interface UMSocialRenrenData : UMSocialSnsData - -/** - 分享内容链接地址 - */ -@property (nonatomic, copy) NSString *url; - -/** - 应用名称 - */ -@property (nonatomic, copy) NSString *appName; - -@end - -/** - 分享到豆瓣 - */ -@interface UMSocialDoubanData : UMSocialSnsData - -@end - - -/** - 分享到邮箱 - */ -@interface UMSocialEmailData : UMSocialSnsData - -/** - 邮件标题 - - */ -@property (nonatomic, copy) NSString * title; -@end - - -/** - 分享到短信 - */ -@interface UMSocialSmsData : UMSocialSnsData - -@end - -/** - 分享到Facebook - */ -@interface UMSocialFacebookData : UMSocialSnsData - -/** - 分享URL标题 - */ -@property (nonatomic, copy) NSString *title; -/** - 分享URL描述 - */ -@property (nonatomic, copy) NSString *linkDescription; - -/** - 分享URL地址 - */ -@property (nonatomic, copy) NSString *url; - -@end - - -/** - 分享到易信好友 - */ -@interface UMSocialYXSessionData : UMSocialSnsData - -/** - 易信消息类型 - */ -@property (nonatomic, assign) UMSocialYXMessageType yxMessageType; - -/** - 分享网页消息的链接地址 - - */ -@property (nonatomic, copy) NSString *url; - -@end - -/** - 分享到易信朋友圈 - */ -@interface UMSocialYXTimelineData : UMSocialSnsData - -/** - 易信消息类型 - */ -@property (nonatomic, assign) UMSocialYXMessageType yxMessageType; - -/** - 分享网页消息的链接地址 - - */ -@property (nonatomic, copy) NSString *url; - -@end - -/** - 分享到来往好友 - */ -@interface UMSocialLWSessionData : UMSocialSnsData - -/** - 分享网页消息的链接地址 - - */ -@property (nonatomic, copy) NSString *url; - -@end - -/** - 分享到来往好友 - */ -@interface UMSocialLWTimelineData : UMSocialSnsData - -/** - 分享网页消息的链接地址 - - */ -@property (nonatomic, copy) NSString *url; - -@end - -/** - 分享到Instagram - */ -@interface UMSocialInstagramData : UMSocialSnsData - -@end - -/** - 分享到Twitter - */ -@interface UMSocialTwitterData : UMSocialSnsData - -@end - -/** - 分享到Tumblr - */ -@interface UMSocialTumblrData : UMSocialSnsData - -/** - 分享标题 - */ -@property (nonatomic, copy) NSString *title; - -/** - 分享URL - */ -@property (nonatomic, copy) NSString *link; -/** - 分享URL描述 - */ -@property (nonatomic, copy) NSString *linkDescription; - -/** - 分享tag - */ -@property (nonatomic, copy) NSArray *tags; - - -@property (nonatomic, copy) NSString *callbackScheme; - -@end - - -///--------------------------------------------------------------------------------------- - -/** - 分享到各个平台的扩展设置 - - */ -@interface UMSocialExtConfig : NSObject - -/** - 以各个分享平台名为key,各个品台data为value - - */ -@property (nonatomic, retain) NSDictionary *snsDataDictionary; - -/** - 分享到新浪微博内容 - - */ -@property (nonatomic, retain) UMSocialSinaData *sinaData; - -/** - 分享到腾讯微博内容 - - */ -@property (nonatomic, retain) UMSocialTencentData *tencentData; - -/** - 分享到微信好友内容 - - */ -@property (nonatomic, retain) UMSocialWechatSessionData *wechatSessionData; - -/** - 分享到微信朋友圈内容 - - */ -@property (nonatomic, retain) UMSocialWechatTimelineData *wechatTimelineData; - -/** - 微信收藏 - */ -@property (nonatomic, retain) UMSocialWechatFavorite * wechatFavoriteData; - -/** - 分享到支付宝好友内容 - */ -@property (nonatomic, retain) UMSocialAlipaySessionData * alipaySessionData; - -/** - 分享到QQ内容 - - */ -@property (nonatomic, retain) UMSocialQQData *qqData; - -/** - 分享到Qzone内容 - - */ -@property (nonatomic, retain) UMSocialQzoneData * qzoneData; - -/** - 分享到人人网内容 - - */ -@property (nonatomic, retain) UMSocialRenrenData * renrenData; - -/** - 分享到豆瓣内容 - - */ -@property (nonatomic, retain) UMSocialDoubanData * doubanData; - -/** - 分享到邮箱内容 - - */ -@property (nonatomic, retain) UMSocialEmailData *emailData; - - -/** - 分享到短信内容 - - */ -@property (nonatomic, retain) UMSocialSmsData *smsData; - -/** - Facebook内容 - - */ -@property (nonatomic, retain) UMSocialFacebookData * facebookData; - -/** - Twitter内容 - - */ -@property (nonatomic, retain) UMSocialTwitterData *twitterData; - -/** - 易信好友 - */ -@property (nonatomic, retain) UMSocialYXSessionData * yxsessionData; - -/** - 易信朋友圈 - */ -@property (nonatomic, retain) UMSocialYXTimelineData *yxtimelineData; - -/** - 来往好友 - */ -@property (nonatomic, retain) UMSocialLWSessionData * lwsessionData; - -/** - 来往朋友圈 - */ -@property (nonatomic, retain) UMSocialLWTimelineData * lwtimelineData; - -/** - instagram - */ -@property (nonatomic, retain) UMSocialInstagramData * instagramData; - -/** - tumblr - */ -@property (nonatomic, retain) UMSocialTumblrData * tumblrData; - -/** - 标题,用于指定微信分享标题,qzone分享的标题和邮件分享的标题。 - @attention Deprecated - - */ -@property (nonatomic, copy) NSString *title; - - -/** - 分享到微信的消息类型,分别有文字类型,图片类型,app类型(文字和图片都有,点击可以返回app或者到指定url,不过不能全部显示所有文字内容) - @attention Deprecated - - */ -@property (nonatomic, assign) UMSocialWXMessageType wxMessageType; - - -/** - 微信多媒体资源的分享,详细定义见`WXApiObject.h` - @attention Deprecated - - */ -@property (nonatomic, retain) id wxMediaObject; - - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h deleted file mode 100644 index e022422..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsPlatformManager.h +++ /dev/null @@ -1,315 +0,0 @@ -// -// UMSocialSnsPlatformManager.h -// SocialSDK -// -// Created by yeahugo on 13-1-15. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import -#import "UMSocialControllerService.h" - -/** - 新浪微博 - */ -extern NSString *const UMShareToSina; - -/** - 腾讯微博 - */ -extern NSString *const UMShareToTencent; - -/** - 人人网 - */ -extern NSString *const UMShareToRenren; - -/** - 豆瓣 - */ -extern NSString *const UMShareToDouban; - -/** - QQ空间 - */ -extern NSString *const UMShareToQzone; - -/** - 邮箱 - */ -extern NSString *const UMShareToEmail; - -/** - 短信 - */ -extern NSString *const UMShareToSms; - -/** - 微信好友 - */ -extern NSString *const UMShareToWechatSession; - -/** - 微信朋友圈 - */ -extern NSString *const UMShareToWechatTimeline; - -/** - 微信收藏 - */ -extern NSString *const UMShareToWechatFavorite; - -/** - 支付宝好友 - */ -extern NSString *const UMShareToAlipaySession; - -/** - 手机QQ - */ -extern NSString *const UMShareToQQ; - -/** - Facebook - */ -extern NSString *const UMShareToFacebook; - -/** - Twitter - */ -extern NSString *const UMShareToTwitter; - - -/** - 易信好友 - */ -extern NSString *const UMShareToYXSession; - -/** - 易信朋友圈 - */ -extern NSString *const UMShareToYXTimeline; - -/** - 来往好友 - */ -extern NSString *const UMShareToLWSession; - -/** - 来往朋友圈 - */ -extern NSString *const UMShareToLWTimeline; - -/** - 分享到Instragram - */ -extern NSString *const UMShareToInstagram; - -/** - 分享到Whatsapp - */ -extern NSString *const UMShareToWhatsapp; - -/** - 分享到Line - */ -extern NSString *const UMShareToLine; - -/** - 分享到Tumblr - */ -extern NSString *const UMShareToTumblr; - -/** - 分享到Pinterest - */ -extern NSString *const UMShareToPinterest; - -/** - 分享到KakaoTalk - */ -extern NSString *const UMShareToKakaoTalk; - -/** - 分享到Flickr - */ -extern NSString *const UMShareToFlickr; - -/** - 分享平台 - - */ -typedef enum { - UMSocialSnsTypeNone = 0, - UMSocialSnsTypeQzone = 10, - UMSocialSnsTypeSina, //sina weibo - UMSocialSnsTypeTenc, //tencent weibo - UMSocialSnsTypeRenr, //renren - UMSocialSnsTypeDouban, //douban - UMSocialSnsTypeWechatSession, - UMSocialSnsTypeWechatTimeline, - UMSocialSnsTypeWechatFavorite, - UMSocialSnsTypeEmail, - UMSocialSnsTypeSms, - UMSocialSnsTypeMobileQQ, - UMSocialSnsTypeFacebook, - UMSocialSnsTypeTwitter, - UMSocialSnsTypeYiXinSession, - UMSocialSnsTypeYiXinTimeline, - UMSocialSnsTypeLaiWangSession, - UMSocialSnsTypeLaiWangTimeline, - UMSocialSnsTypeInstagram, - UMSocialSnsTypeWhatsApp, - UMSocialSnsTypeLine, - UMSocialSnsTypeTumblr, - UMSocialSnsTypeKakaoTalk, - UMSocialSnsTypeFlickr, - UMSocialSnsTypePinterest, - UMSocialSnsTypeAlipaySession, - UMSocialSnsTypeNew -} UMSocialSnsType; - - -@class UMSocialControllerService; - -/** 定义响应点击平台后的block对象 - - @param presentingController 点击后弹出的分享页面或者授权页面所在的UIViewController对象 - @param socialControllerService 可以用此对象的socialControllerService.socialData可以获取分享内嵌文字、内嵌图片,分享次数等 - @param isPresentInController 如果YES代表弹出(present)到当前UIViewController,否则push到UIViewController的navigationController - - */ -typedef void (^UMSocialSnsPlatformClickHandler)(UIViewController *presentingController, UMSocialControllerService * socialControllerService, BOOL isPresentInController); - -/** 定义响应点击各平台授权登录后的block对象 - - @param presentingController 点击后弹出的分享页面或者授权页面所在的UIViewController对象 - @param socialControllerService 可以用此对象的socialControllerService.socialData可以获取分享内嵌文字、内嵌图片,分享次数等 - @param isPresentInController 如果YES代表弹出(present)到当前UIViewController,否则push到UIViewController的navigationController - @param completion 授权完成之后的回调对象,返回的response参数表示成功与否和拿到的授权信息 - - */ -typedef void (^UMSocialSnsPlatformLoginHandler)(UIViewController *presentingController, UMSocialControllerService * socialControllerService, BOOL isPresentInController, UMSocialDataServiceCompletion completion); - -/** - Sns平台类,用`platformName`作为标识,指定显示名称、显示的图片,点击之后的响应。 - */ -@interface UMSocialSnsPlatform : NSObject - -///--------------------------------------- -/// @name 平台属性 -///--------------------------------------- - -/** - 平台标示符 - */ -@property (nonatomic, copy) NSString *platformName; - -/** - 显示名称 - */ -@property (nonatomic, copy) NSString *displayName; - -/** - 登录名称 - */ -@property (nonatomic, copy) NSString *loginName; - -/** - 分享类型 - */ -@property (nonatomic, assign) UMSocialSnsType shareToType; - -/** - 大图片的文件名,用于`UMSocialIconActionSheet` - */ -@property (nonatomic, copy) NSString *bigImageName; - -/** - 小图片的文件名,用于分享列表、登录、个人中心、评论编辑页面等 - */ -@property (nonatomic, copy) NSString *smallImageName; - -/** - 无色的小图片文件名,用于评论编辑页面显示没有授权状态 - */ -@property (nonatomic ,copy) NSString *smallImageOffName; - -/** - 处理点击分享事件后的block对象 - */ -@property(nonatomic, copy) UMSocialSnsPlatformClickHandler snsClickHandler; - -/** - 处理点击登录事件后的block对象 - */ -@property(nonatomic, copy) UMSocialSnsPlatformLoginHandler loginClickHandler; - -/** - 是否需要登录授权 - */ -@property(nonatomic, assign) BOOL needLogin; - -/** - 标志是否有webView授权 - */ -@property(nonatomic, assign) BOOL haveWebViewAuth; -/** - 初始化方法 - - @param platformName 作为该对象标识的平台名 - */ --(id)initWithPlatformName:(NSString *)platformName; -@end - -/* - Sns平台类管理者类 - */ -@interface UMSocialSnsPlatformManager : NSObject - -/** - sns平台配置数组,此数组由allSnsArray转换,只包含平台名作为元素 - */ -@property (nonatomic, readonly) NSArray *allSnsValuesArray; - -/** - 该NSDictionary以各个平台名为key,UMSocialPlatform对象为value - */ -@property (nonatomic, retain) NSDictionary *allSnsPlatformDictionary; - -/** - `UMSocialSnsPlatformManager`的单例方法 - - @return `UMSocialSnsPlatformManager`的单例对象 - */ -+ (UMSocialSnsPlatformManager *)sharedInstance; - - -/** - 根据平台名,返回平台对象 - - @param platformName sns平台名 - - @return UMSocialSnsPlatform 平台对象 - */ -+(UMSocialSnsPlatform *)getSocialPlatformWithName:(NSString *)snsName; - -/** - 根据平台枚举变量,返回平台对象 - - @param UMSocialSnsType sns平台枚举变量 - - @return NSString 平台名 - */ -+ (NSString *)getSnsPlatformString:(UMSocialSnsType)socialSnsType; - -/** - 把配置平台的次序号转换成平台名 - - @param snsIndex 使用的平台顺序,使用的平台配置在UMSocialConfigDelegate,例如`- (NSArray *)shareToPlatforms;`返回的是UMSocialSnsTypeSina和UMSocialSnsTypeTenc,UMSocialSnsTypeSina就是0,UMSocialSnsTypeTenc就是1 - - @return 平台名字符串 - */ -+(NSString *)getSnsPlatformStringFromIndex:(NSInteger)snsIndex; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h deleted file mode 100644 index d40a0b0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/Header/UMSocialSnsService.h +++ /dev/null @@ -1,123 +0,0 @@ -// -// UMSocialSnsService.h -// SocialSDK -// -// Created by Jiahuan Ye on 13-1-8. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - - -#import -#import - -@class UMSocialControllerService; - -/* - 自定义的类似iOS6.0中`UIActivityViewController`样式的列表,每个sns平台由对应图片和名称组成。注意:如果你要此控件支持多方向,需要在自己的UIViewController中屏幕旋转的`didRotateFromInterfaceOrientation`调用`UMSocialIconActionSheet`的`setNeedsDisplay`方法,来重新布局。 - */ -@interface UMSocialIconActionSheet : UIView - - -/** - 将自己自下往上弹出来 - - @param showView 在此父UIView自下往上弹出来的 - */ --(void)showInView:(UIView *)showView; - -/** - 将自己移除 - - */ --(void)dismiss; -@end - - -@protocol WXApiDelegate ; -@protocol UMSocialUIDelegate; - -/* - 实现快速分享,类方法传入相应的参数,既可以弹出分享列表。现在提供两种列表样式。 - */ -@interface UMSocialSnsService : NSObject - -/** - 当应用从后台唤起时,应调用此方法,需要完成退出当前登录状态的功能 - - */ -+(void)applicationDidBecomeActive; - -/** - 处理app的URL方法 - 若除了 UMSocial SDK外,还需要处理其他url,可以针对url的前缀作处理,例如下面写法: - - if ([url.description hasPrefix:@"xxxx"]) { - //你的处理逻辑 - } - else { - return [UMSocialSnsService handleOpenURL:url]; - } - - @param url 传入的url - - */ -+(BOOL)handleOpenURL:(NSURL *)url; - -/** - - Deprecated API - - 处理app的URL方法 - - @param url 传入的url - - @return wxApiDelegate 实现微信代理对象 - */ -+(BOOL)handleOpenURL:(NSURL *)url wxApiDelegate:(id)wxApiDelegate; - -///--------------------------------------- -/// @name 快速分享 -///--------------------------------------- - -/** - 弹出一个分享列表的UITableViewController - - @param controller 在该controller弹出分享列表的UIActionSheet - @param appKey 友盟appKey - @param shareText 分享编辑页面的内嵌文字 - @param shareImage 可以传入`UIImage`,或者`NSData`类型,分享内嵌图片,用户可以在编辑页面删除 - @param snsNames 你要分享到的sns平台类型,该NSArray值是`UMSocialSnsPlatformManager.h`定义的平台名的字符串常量,有UMShareToSina,UMShareToTencent,UMShareToRenren,UMShareToDouban,UMShareToQzone,UMShareToEmail,UMShareToSms等 - @param delegate 实现分享完成后的回调对象,如果不关注分享完成的状态,可以设为nil - */ -+(void)presentSnsController:(UIViewController *)controller - appKey:(NSString *)appKey - shareText:(NSString *)shareText - shareImage:(id)shareImage - shareToSnsNames:(NSArray *)snsNames - delegate:(id )delegate; - -/** - 弹出一个分享列表的类似iOS6的UIActivityViewController控件 - - @param controller 在该controller弹出分享列表的UIActionSheet - @param appKey 友盟appKey - @param shareText 分享编辑页面的内嵌文字 - @param shareImage 分享内嵌图片,用户可以在编辑页面删除 - @param snsNames 你要分享到的sns平台类型,该NSArray值是`UMSocialSnsPlatformManager.h`定义的平台名的字符串常量,有UMShareToSina,UMShareToTencent,UMShareToRenren,UMShareToDouban,UMShareToQzone,UMShareToEmail,UMShareToSms等 - @param delegate 实现分享完成后的回调对象,如果不关注分享完成的状态,可以设为nil - */ -+(void)presentSnsIconSheetView:(UIViewController *)controller - appKey:(NSString *)appKey - shareText:(NSString *)shareText - shareImage:(id)shareImage - shareToSnsNames:(NSArray *)snsNames - delegate:(id )delegate; - -/** - 得到单例对象的类方法 - - @return `UMSocialSnsService`的单例对象 - */ -+ (UMSocialSnsService *)sharedInstance; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib deleted file mode 100644 index 2e3a140..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentDetailController.xib +++ /dev/null @@ -1,387 +0,0 @@ - - - - 1072 - 12E55 - 4488.2 - 1187.39 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3715.3 - - - IBMKMapView - IBProxyObject - IBUIImageView - IBUILabel - IBUITextView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - - - 1298 - - {320, 167} - - - - NO - IBCocoaTouchFramework - - - - 1312 - - {{12, 59}, {35, 35}} - - - - NO - IBCocoaTouchFramework - - NSImage - UMSocialSDKResourcesNew.bundle/Buttons/UMS_User-Avatar-Placeholder - - - - - 1298 - - {{86, 210}, {148, 35}} - - - NO - YES - 7 - NO - IBCocoaTouchFramework - 用户未分享地理位置 - - 1 - MC40MTk1OTM3ODczIDAuNDIwNjk2MjY1MyAwLjQzNzUxOTkyOTgAA - - - 3 - MQA - - - 1 - MCAwIDAgMC44AA - - 1 - 10 - 1 - - Helvetica - Helvetica - 0 - 14 - - - Helvetica - 14 - 16 - - NO - - - - 1288 - - {{0, 164}, {320, 252}} - - - - YES - YES - IBCocoaTouchFramework - - - - 1313 - - {{61, 136}, {76, 20}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - 100 months - - 2 - MC43MDk4MDM5Mzg5IDAuNzEzNzI1NTA3MyAwLjcyOTQxMTc4MDgAA - - - - 1 - MCAwIDAgMC4yAA - - 1 - 10 - - Helvetica - Helvetica - 0 - 12 - - - Helvetica - 12 - 16 - - NO - - - - 1284 - - {{61, 8}, {240, 128}} - - - - YES - YES - - - - - IBCocoaTouchFramework - NO - Lorem ipsum dolor sit er elit - - - 2 - IBCocoaTouchFramework-SevenAndLater - - - 1 - 13 - - - HelveticaNeue - 13 - 16 - - - - - {{0, 64}, {320, 416}} - - - - - 1 - MC4yMTU2ODYyNzQ1IDAuMjM5MjE1Njg2MyAwLjI3MDU4ODIzNTMAA - - - - NO - NO - - IBCocoaTouchFramework - - - - NO - - - - commentBackgroundImage - - - - 53 - - - - commentTextView - - - - 61 - - - - mapView - - - - 49 - - - - profileImage - - - - 6 - - - - timeLabel - - - - 47 - - - - view - - - - 45 - - - - delegate - - - - 48 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 1 - - - - - - - - - - - - - 8 - - - - - 4 - - - - - 51 - - - - - 9 - - - - - 46 - - - - - 59 - - - - - - - UMSCommentDetailController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - UMImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - 0 - IBCocoaTouchFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - UMSocialSDKResourcesNew.bundle/Buttons/UMS_User-Avatar-Placeholder - {16, 16} - - 3715.3 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib deleted file mode 100644 index 27458c3..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputController.xib +++ /dev/null @@ -1,651 +0,0 @@ - - - - 1072 - 12E55 - 4488.2 - 1187.39 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3715.3 - - - IBMKMapView - IBProxyObject - IBUIButton - IBUIImageView - IBUITextView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - - - 1300 - - - - 1298 - - {320, 155} - - - 3 - MQA - - YES - YES - IBCocoaTouchFramework - - - 2 - IBCocoaTouchFramework-SevenAndLater - - - 1 - 14 - - - HelveticaNeue - 14 - 16 - - - - - 1314 - - - - 1298 - - {320, 49} - - NO - IBCocoaTouchFramework - - - - -2147482332 - - {{94, 7}, {30, 30}} - - NO - 4 - 1001 - IBCocoaTouchFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - 3 - MC41AA - - - NSImage - UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off.png - - - 2 - 15 - - - HelveticaNeue-Bold - 15 - 16 - - - - - 1316 - - {{0, 5}, {60, 37}} - - NO - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - -2147482332 - - {{184, 9}, {30, 30}} - - NO - 4 - 1001 - IBCocoaTouchFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - - -2147482332 - - {{138, 10}, {30, 30}} - - NO - 4 - 1000 - IBCocoaTouchFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off.png - - - - - - - -2147482332 - - {{232, 9}, {30, 30}} - - NO - 4 - 1002 - IBCocoaTouchFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off.png - - - - - - - -2147482332 - - {{278, 9}, {30, 30}} - - NO - 4 - 1003 - IBCocoaTouchFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off.png - - - - - - - {{0, 150}, {320, 50}} - - - 3 - MQA - - 2 - - - IBCocoaTouchFramework - - - - {320, 200} - - - YES - IBCocoaTouchFramework - - - - 1292 - - - - 1292 - - {{7, 47}, {306, 158}} - - YES - YES - IBCocoaTouchFramework - NO - NO - - - - 1316 - - {{227, 5}, {73, 31}} - - NO - IBCocoaTouchFramework - 0 - 0 - - - 取消定位 - - - 2 - 13 - - - HelveticaNeue-Bold - 13 - 16 - - - - - {{0, 190}, {320, 220}} - - IBCocoaTouchFramework - - - - {{0, 64}, {320, 416}} - - - - NO - NO - - IBCocoaTouchFramework - - - - NO - - - - closeLocationButton - - - - 23 - - - - commentTextView - - - - 21 - - - - downView - - - - 20 - - - - mapView - - - - 52 - - - - shareToDoubanButton - - - - 38 - - - - shareToQzoneButton - - - - 51 - - - - shareToRenrenButton - - - - 37 - - - - shareToSinaButton - - - - 36 - - - - shareToTencentButton - - - - 35 - - - - showLocationButton - - - - 27 - - - - toolView - - - - 30 - - - - toolViewImageView - - - - 54 - - - - upView - - - - 43 - - - - view - - - - 9 - - - - delegate - - - - 53 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 1 - - - - - - - - - 4 - - - - - - - UpView - - - 3 - - - - - 6 - - - - - - - - - - - - - - 19 - - - - - 49 - - - - - 26 - - - - - 31 - - - - - 32 - - - - - 33 - - - - - 34 - - - - - 18 - - - - - - - DownView - - - 14 - - - - - 15 - - - - - - - UMSCommentEditController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - 0 - IBCocoaTouchFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {16, 16} - {16, 16} - {16, 16} - {16, 16} - - 3715.3 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib deleted file mode 100644 index bbcc350..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSCommentInputControlleriPad.xib +++ /dev/null @@ -1,582 +0,0 @@ - - - - 1072 - 13A603 - 4514 - 1265 - 695.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3747 - - - IBMKMapView - IBProxyObject - IBUIButton - IBUIImageView - IBUITextView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 1306 - - - - 1314 - - {533, 221} - - - 1 - MSAxIDEAA - - YES - YES - IBIPadFramework - NO - - - 2 - IBIPadFramework-SevenAndLater - - - 1 - 14 - - - HelveticaNeue - 14 - 16 - - - - - 1314 - - - - 1306 - - {533, 44} - - NO - IBIPadFramework - - - - 1316 - - {{40, 0}, {36, 33}} - - NO - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MQA - - - 3 - MC41AA - - - 2 - 15 - - - HelveticaNeue-Bold - 15 - 16 - - - - - -2147482332 - - {{275, 7}, {30, 30}} - - NO - 4 - 1001 - IBIPadFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMS_tencent_off.png - - - - - - - -2147482332 - - {{331, 7}, {30, 30}} - - NO - 4 - 1000 - IBIPadFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMS_sina_off.png - - - - - - - -2147482332 - - {{384, 7}, {30, 30}} - - NO - 4 - 1001 - IBIPadFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - - -2147482332 - - {{439, 7}, {30, 30}} - - NO - 4 - 1002 - IBIPadFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMS_renren_off.png - - - - - - - -2147482332 - - {{493, 7}, {30, 30}} - - NO - 4 - 1003 - IBIPadFramework - 0 - 0 - 10 - 0.0 - 10 - 0.0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMS_douban_off.png - - - - - - - -2147482334 - - {{35, 80}, {460, 250}} - - YES - YES - IBIPadFramework - - - - 1316 - - {{439, 45}, {73, 27}} - - NO - IBIPadFramework - 0 - 0 - - - 取消定位 - - - 2 - 13 - - - HelveticaNeue-Bold - 13 - 16 - - - - - {{0, 220}, {533, 44}} - - - YES - - - - IBIPadFramework - - - - {533, 260} - - 3 - MQA - - 2 - - - IBIPadFramework - - - - NO - - - - closeLocationButton - - - - 1352 - - - - commentTextView - - - - 183 - - - - mapView - - - - 1157 - - - - shareToDoubanButton - - - - 765 - - - - shareToQzoneButton - - - - 761 - - - - shareToRenrenButton - - - - 764 - - - - shareToSinaButton - - - - 762 - - - - shareToTencentButton - - - - 763 - - - - showLocationButton - - - - 801 - - - - toolView - - - - 857 - - - - toolViewImageView - - - - 1383 - - - - view - - - - 191 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 87 - - - - - - - - - 88 - - - - - 802 - - - - - - - - - - - - - - - - 1299 - - - - - 705 - - - - - 706 - - - - - 708 - - - - - 709 - - - - - 707 - - - - - 710 - - - - - 1142 - - - - - 1341 - - - - - - - UMSCommentEditController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - 0 - IBIPadFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {39, 39} - {39, 39} - {39, 39} - {39, 39} - - 3747 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib deleted file mode 100644 index 297560f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSLoginViewController.xib +++ /dev/null @@ -1,165 +0,0 @@ - - - - 1072 - 12E55 - 4488.2 - 1187.39 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3715.3 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - {{0, 44}, {320, 436}} - - - - 3 - MQA - - YES - - NO - NO - - - IBUIScreenMetrics - - YES - - - - - - {320, 480} - {480, 320} - - - IBCocoaTouchFramework - Retina 3.5-inch Full Screen - 0 - - IBCocoaTouchFramework - YES - 0 - YES - 44 - 22 - 22 - - - - NO - - - - view - - - - 9 - - - - dataSource - - - - 10 - - - - delegate - - - - 11 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 8 - - - - - - - UMSLoginViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - 0 - IBCocoaTouchFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 3715.3 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib deleted file mode 100644 index 44ffbfa..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSShareListController.xib +++ /dev/null @@ -1,145 +0,0 @@ - - - - 1072 - 12E55 - 4488.2 - 1187.39 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3715.3 - - - IBProxyObject - IBUITableView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - {{0, 64}, {320, 416}} - - 3 - MQA - - NO - YES - NO - - - NO - NO - - IBCocoaTouchFramework - NO - 0 - YES - 44 - 22 - 22 - - - - NO - - - - view - - - - 5 - - - - dataSource - - - - 6 - - - - delegate - - - - 7 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - - - - - UMSShareListController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - 0 - IBCocoaTouchFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 3715.3 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib deleted file mode 100644 index f6073ed..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewController.xib +++ /dev/null @@ -1,694 +0,0 @@ - - - - 1072 - 13A603 - 4514 - 1265 - 695.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 3746 - - - IBProxyObject - IBUIButton - IBUIImageView - IBUILabel - IBUITextView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - - - 1342 - - {320, 153} - - - - - 1 - MSAxIDEAA - - YES - YES - IBCocoaTouchFramework - - - 2 - IBCocoaTouchFramework-SevenAndLater - - - 1 - 14 - - - HelveticaNeue - 14 - 16 - - - - - 1324 - - - - 1316 - - {320, 50} - - - - - 2 - MC45MzMzMzMzOTY5IDAuOTMzMzMzMzk2OSAwLjkzMzMzMzM5NjkAA - - IBCocoaTouchFramework - - - - 1316 - - {{110, 3}, {55, 37}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MQA - - - 3 - MC41AA - - - 2 - 15 - - - HelveticaNeue-Bold - 15 - 16 - - - - - 1316 - - {{271, 10}, {42, 21}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - Label - - 3 - MC4zMzMzMzMzMzMzAA - - - 0 - 10 - - 1 - 17 - - - HelveticaNeue - 17 - 16 - - - - - 1316 - - {{160, 5}, {58, 35}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - 1297 - - {{225, 7}, {38, 35}} - - - - NO - IBCocoaTouchFramework - - - - 1313 - - {{255, 1}, {18, 18}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal - - - - - - - -2147482332 - {{35, 14}, {60, 20}} - - - - _NS:9 - {251, 251} - NO - YES - 7 - NO - IBCocoaTouchFramework - - - 1 - MCAwIDAAA - darkTextColor - - - 0 - - 1 - 8 - - - HelveticaNeue - 8 - 16 - - NO - - - - -2147482332 - {{5, 10}, {30, 30}} - - - - _NS:9 - NO - IBCocoaTouchFramework - 0 - 0 - - - - - - - {{0, 155}, {320, 44}} - - - - - 3 - MQA - - 2 - - - IBCocoaTouchFramework - - - - 1324 - - {{0, 205}, {320, 211}} - - - - IBCocoaTouchFramework - - - - 1316 - - {{0, 208}, {320, 181}} - - - - - 3 - MCAwAA - - IBCocoaTouchFramework - - - - {{0, 64}, {320, 416}} - - - - - 3 - MQA - - - - - NO - NO - - IBCocoaTouchFramework - - - - NO - - - - _deleteImageButton - - - - 35 - - - - _shareImageButton - - - - 33 - - - - atButton - - - - 21 - - - - changeAccountBackgroundView - - - - 27 - - - - changeAccountButton - - - - 23 - - - - changeAccountView - - - - 26 - - - - countLabel - - - - 13 - - - - textView - - - - 14 - - - - toolBarView - - - - 17 - - - - toolViewBackgroundImage - - - - 18 - - - - view - - - - 16 - - - - followLabel - - - - 60r-GO-noj - - - - followButton - - - - kJT-ao-FBF - - - - addFollow: - - - 7 - - wJu-xn-ETn - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 1 - - - - - - - - - - - 4 - - - - - 10 - - - - - - - - - - - - - - - 9 - - - - - 19 - - - - - 8 - - - - - 22 - - - - - 32 - - - - - 34 - - - - - 24 - - - - - 25 - - - - - AaX-8t-GAq - - - - - 3WK-gL-xa0 - - - - - - - UMShareEditViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - UMShareEditViewController - UIViewController - - id - id - - - - addFollow: - id - - - showFriendList - id - - - - UIButton - UIImageView - UIButton - UIImageView - UIButton - UIView - UILabel - UIButton - UILabel - UITextView - UIView - UIImageView - - - - _deleteImageButton - UIButton - - - _shareImageButton - UIImageView - - - atButton - UIButton - - - changeAccountBackgroundView - UIImageView - - - changeAccountButton - UIButton - - - changeAccountView - UIView - - - countLabel - UILabel - - - followButton - UIButton - - - followLabel - UILabel - - - textView - UITextView - - - toolBarView - UIView - - - toolViewBackgroundImage - UIImageView - - - - IBProjectSource - ./Classes/UMShareEditViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal - {16, 16} - - 3746 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib deleted file mode 100644 index 255f357..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMShareEditViewControlleriPad.xib +++ /dev/null @@ -1,730 +0,0 @@ - - - - 1072 - 14A389 - 6245 - 1343.14 - 755.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 6238 - - - IBProxyObject - IBUIButton - IBUIImageView - IBUILabel - IBUITextView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 1314 - - - - 1314 - - {535, 236} - - - - - 1 - MSAxIDEAA - - YES - YES - IBIPadFramework - NO - Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. - - 2 - IBIPadFramework-SevenAndLater - - - 1 - 14 - - - HelveticaNeue - 14 - 16 - - - - - 1318 - - - - 1314 - - {550, 47} - - - - - 2 - MC45MzMzMzMzOTY5IDAuOTMzMzMzMzk2OSAwLjkzMzMzMzM5NjkAA - - NO - IBIPadFramework - - - - 1316 - - {{13, 5}, {55, 37}} - - - - NO - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MQA - - - 3 - MC41AA - - - NSImage - UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at.png - - - 2 - 15 - - - HelveticaNeue-Bold - 15 - 16 - - - - - 1316 - - {{471, 13}, {42, 21}} - - - - NO - YES - 7 - NO - IBIPadFramework - Label - - 3 - MC42NjY2NjY2NjY3AA - - - 0 - 10 - - 1 - 17 - - - HelveticaNeue - 17 - 16 - - YES - - - - 1316 - - {{76, 6}, {65, 36}} - - - - NO - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - - - - 1313 - - {{421, 5}, {37, 37}} - - - - NO - IBIPadFramework - - - - 1313 - - {{448, 1}, {18, 18}} - - - - NO - IBIPadFramework - 0 - 0 - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - NSImage - UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal - - - - - - - {{0, 244}, {550, 47}} - - - - - 3 - MQA - - 2 - - - IBIPadFramework - - - - 1302 - - {{0, 289}, {550, 217}} - - - - IBIPadFramework - - - - 1316 - - {{112, 289}, {309, 135}} - - - - 3 - MCAwAA - - IBIPadFramework - - - - {540, 506} - - - - - 3 - MQA - - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBIPadFramework - - - - NO - - - - _deleteImageButton - - - - 511 - - - - _shareImageButton - - - - 510 - - - - atButton - - - - 224 - - - - changeAccountBackgroundView - - - - 506 - - - - changeAccountButton - - - - 503 - - - - changeAccountView - - - - 507 - - - - countLabel - - - - 226 - - - - textView - - - - 236 - - - - toolBarView - - - - 223 - - - - toolViewBackgroundImage - - - - 328 - - - - view - - - - 316 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 202 - - - - - - - - - - - 227 - - - - - 203 - - - - - - - - - - - - - 207 - - - - - 205 - - - - - 206 - - - - - 502 - - - - - 508 - - - - - 509 - - - - - 504 - - - - - 505 - - - - - - - UMShareEditViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - {229, 216} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - - - UMShareEditViewController - UIViewController - - id - id - - - - addFollow: - id - - - showFriendList - id - - - - UIButton - UIImageView - UIButton - UIImageView - UIButton - UIView - UILabel - UIButton - UILabel - UITextView - UIView - UIImageView - - - - _deleteImageButton - UIButton - - - _shareImageButton - UIImageView - - - atButton - UIButton - - - changeAccountBackgroundView - UIImageView - - - changeAccountButton - UIButton - - - changeAccountView - UIView - - - countLabel - UILabel - - - followButton - UIButton - - - followLabel - UILabel - - - textView - UITextView - - - toolBarView - UIView - - - toolViewBackgroundImage - UIImageView - - - - IBProjectSource - ../SocialSDK/UI/UMShareEditViewController.h - - - - UMShareEditViewController - - id - id - - - - addFollow: - id - - - showFriendList - id - - - - IBProjectSource - ../SocialSDK/UI/UMShareEditViewController.m - - - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIGestureRecognizer - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIGestureRecognizer.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITextView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITextView.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - YES - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - - {16, 16} - {16, 16} - - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib deleted file mode 100644 index 8ea0004..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/SocialSDKXib/UMSnsAccountViewController.xib +++ /dev/null @@ -1,1023 +0,0 @@ - - - - 1072 - 12E55 - 3084 - 1187.39 - 626.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 2083 - - - IBProxyObject - IBUIButton - IBUIImageView - IBUILabel - IBUITableView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 1298 - - - - 1316 - - - - 1316 - - {{20, 0}, {68, 21}} - - - - - 3 - MCAwAA - - NO - YES - 7 - NO - IBCocoaTouchFramework - 登录账号 - - 2 - MC4zMzMzMzMzNDMzIDAuMzMzMzMzMzQzMyAwLjMzMzMzMzM0MzMAA - - - - 1 - MCAwIDAAA - darkTextColor - - {0, 0} - 0 - 10 - - 1 - 15 - - - Helvetica - 15 - 16 - - - - - 1316 - - {{112, 22}, {90, 89}} - - - - NO - IBCocoaTouchFramework - - - - 1316 - - {{83, 117}, {149, 21}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - - - 2 - MC4zMzMzMzMzNDMzIDAuMzMzMzMzMzQzMyAwLjMzMzMzMzM0MzMAA - - - 0 - 10 - 1 - - - - - - 1316 - - {{62, 133}, {197, 31}} - - - - NO - YES - 7 - IBCocoaTouchFramework - - - 2 - MC4zMzMzMzMzNDMzIDAuMzMzMzMzMzQzMyAwLjMzMzMzMzM0MzMAA - - - 0 - 10 - 2 - 1 - - 1 - 12 - - - Helvetica - 12 - 16 - - 197 - - - - 1316 - - {{112, 141}, {90, 30}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - 3 - MQA - - - 3 - MC41AA - - - - - - - {320, 177} - - - - - IBCocoaTouchFramework - - - - 1295 - - - - 1290 - - {{0, 20}, {320, 241}} - - - - - YES - IBCocoaTouchFramework - NO - NO - NO - NO - 1 - - 2 - MC45MzMzMzMzOTY5IDAuOTMzMzMzMzk2OSAwLjkzMzMzMzM5NjkAA - - 0 - NO - 44 - 22 - 22 - - - - 1332 - - {{20, 0}, {320, 20}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - 分享设置 - - 2 - MC40ODIzNTI5NzIgMC40ODIzNTI5NzIgMC40ODIzNTI5NzIAA - - - - {0, 0} - 0 - 10 - - - - - - {{0, 179}, {320, 237}} - - - - - 2 - MC45MzMzMzMzOTY5IDAuOTMzMzMzMzk2OSAwLjkzMzMzMzM5NjkAA - - IBCocoaTouchFramework - - - - {{0, 64}, {320, 416}} - - - - - 3 - MQA - - 2 - - - - - NO - - - IBUISimulatedFreeformSizeMetricsSentinel - Freeform - - IBCocoaTouchFramework - - - - 1298 - - - - 1320 - - - - 1316 - - {{20, 20}, {100, 21}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - 分享设置 - - 2 - MC42Mjc0NTEwMDI2IDAuNjI3NDUxMDAyNiAwLjYyNzQ1MTAwMjYAA - - - - {0, 0} - 0 - 10 - - 1 - 17 - - - Helvetica - 17 - 16 - - - - - 1298 - - {{0, 49}, {295, 272}} - - - - - YES - IBCocoaTouchFramework - NO - NO - NO - NO - - 3 - MC4zMzMzMzMzMzMzAA - - 0 - NO - 44 - 22 - 22 - - - - {{184, 0}, {384, 300}} - - - - - 2 - MC45MzMzMzMzOTY5IDAuOTMzMzMzMzk2OSAwLjkzMzMzMzM5NjkAA - - IBCocoaTouchFramework - - - - 1320 - - - - 1316 - - {{23, 29}, {68, 21}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - 登录账号 - - 2 - MC42Mjc0NTEwMDI2IDAuNjI3NDUxMDAyNiAwLjYyNzQ1MTAwMjYAA - - - - {0, 0} - 0 - 10 - - - - - - 1316 - - {{52, 84}, {90, 89}} - - - - NO - IBCocoaTouchFramework - - - - 1316 - - {{25, 190}, {145, 21}} - - - - NO - YES - 7 - NO - IBCocoaTouchFramework - - - 2 - MC42Mjc0NTEwMDI2IDAuNjI3NDUxMDAyNiAwLjYyNzQ1MTAwMjYAA - - - 0 - 10 - 1 - - - - - - 1316 - - {{23, 230}, {152, 50}} - - - - NO - YES - 7 - IBCocoaTouchFramework - - - 2 - MC42Mjc0NTEwMDI2IDAuNjI3NDUxMDAyNiAwLjYyNzQ1MTAwMjYAA - - - 0 - 10 - 2 - - 1 - 13 - - - Helvetica - 13 - 16 - - 152 - - - - 1316 - - {{52, 218}, {90, 30}} - - - - NO - IBCocoaTouchFramework - 0 - 0 - - - - - - - - {180, 300} - - - - - IBCocoaTouchFramework - - - - {{0, 64}, {480, 300}} - - - - - - - NO - - - 3 - 3 - - - IBCocoaTouchFramework - - - - NO - - - - _landsCandscapeView - - - - 42 - - - - _loginButton - - - - AzY-H8-fDD - - - - _loginButtonLand - - - - 6Fv-KR-o55 - - - - _loginTextLabel - - - - 62 - - - - _loginTextLabelLand - - - - 63 - - - - _loginView - - - - 58 - - - - _loginViewLand - - - - 59 - - - - _nickNameLabel - - - - 46 - - - - _nickNameLabelLand - - - - 50 - - - - _profileImageView - - - - 48 - - - - _profileImageViewLand - - - - 49 - - - - _snsTableLable - - - - 60 - - - - _snsTableLableLand - - - - 61 - - - - _snsTableView - - - - 5 - - - - _snsTableViewLand - - - - 53 - - - - _snsURLLabel - - - - 20 - - - - _snsURLLabelLand - - - - 51 - - - - view - - - - 41 - - - - dataSource - - - - 56 - - - - delegate - - - - 57 - - - - dataSource - - - - 54 - - - - delegate - - - - 55 - - - - - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 1 - - - - - - - - - 14 - - - - - - - - - - - - 8 - - - - - 6 - - - - - 17 - - - - - 8v1-7D-GU9 - - - - - 18 - - - - - 64 - - - - - - - - - 4 - - - - - 12 - - - - - 30 - - - - - - - - - 65 - - - - - - - - - 33 - - - - - 31 - - - - - 32 - - - - - - - - - - - - 37 - - - - - 36 - - - - - 35 - - - - - 34 - - - - - RjH-Tf-mDI - - - - - - - UMSnsAccountViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - - - - - - - UMSnsAccountViewController - UIViewController - - UIView - UIButton - UIButton - UILabel - UILabel - UIView - UIView - UILabel - UILabel - UIView - UIImageView - UIImageView - UILabel - UILabel - UITableView - UITableView - UILabel - UILabel - - - - _landsCandscapeView - UIView - - - _loginButton - UIButton - - - _loginButtonLand - UIButton - - - _loginTextLabel - UILabel - - - _loginTextLabelLand - UILabel - - - _loginView - UIView - - - _loginViewLand - UIView - - - _nickNameLabel - UILabel - - - _nickNameLabelLand - UILabel - - - _portraitView - UIView - - - _profileImageView - UIImageView - - - _profileImageViewLand - UIImageView - - - _snsTableLable - UILabel - - - _snsTableLableLand - UILabel - - - _snsTableView - UITableView - - - _snsTableViewLand - UITableView - - - _snsURLLabel - UILabel - - - _snsURLLabelLand - UILabel - - - - IBProjectSource - ./Classes/UMSnsAccountViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - 3 - 2083 - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check.png deleted file mode 100644 index 038044b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check@2x.png deleted file mode 100644 index b389d6c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_Check@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location.png deleted file mode 100755 index 2d90656..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location@2x.png deleted file mode 100644 index f370169..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_No_Location@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User-Avatar-Placeholder@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User-Avatar-Placeholder@2x.png deleted file mode 100644 index 39f0af9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User-Avatar-Placeholder@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User_profile_default@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User_profile_default@2x.png deleted file mode 100644 index 1a92a8b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_User_profile_default@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_account_login@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_account_login@2x.png deleted file mode 100644 index f3e7327..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_account_login@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_off.png deleted file mode 100644 index 33e06d1..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on.png deleted file mode 100644 index 2dac4ca..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on@2x.png deleted file mode 100644 index acb7ba7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_add_friend_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_input@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_input@2x.png deleted file mode 100644 index 7d71119..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_input@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell.png deleted file mode 100755 index e5287b3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell_white@2x.png deleted file mode 100644 index 40325d5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_comment_view_cell_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal.png deleted file mode 100644 index af80a6f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal@2x.png deleted file mode 100644 index 2f2c9fc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_delete_image_button_normal@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_find@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_find@2x.png deleted file mode 100644 index 2f0b96d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_find@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_off@2x.png deleted file mode 100644 index e41fc24..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_on@2x.png deleted file mode 100644 index adb3015..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_follow_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_bar_bg_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_bar_bg_white@2x.png deleted file mode 100644 index 4e23963..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_bar_bg_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back.png deleted file mode 100644 index 8813b26..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back@2x.png deleted file mode 100644 index e5245a6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_back@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close.png deleted file mode 100644 index ced1742..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close@2x.png deleted file mode 100644 index 96a89e5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_close@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh.png deleted file mode 100644 index fa3479d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh@2x.png deleted file mode 100644 index af6f7e8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_refresh@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_send.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_send.png deleted file mode 100644 index 0f989c0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_nav_button_send.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off.png deleted file mode 100644 index 4645042..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off@2x.png deleted file mode 100644 index 9220071..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on.png deleted file mode 100644 index 01dc087..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on@2x.png deleted file mode 100644 index 65bf393..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_oauth_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map.png deleted file mode 100755 index db7738c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map@2x.png deleted file mode 100755 index ef70ba6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_map@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off.png deleted file mode 100644 index a1b1ca9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off@2x.png deleted file mode 100644 index e3c7710..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap.png deleted file mode 100644 index 4358ecd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap@2x.png deleted file mode 100644 index f7ed6cb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_place_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake__share_button@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake__share_button@2x.png deleted file mode 100644 index cd0da6e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake__share_button@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close.png deleted file mode 100644 index d863481..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close@2x.png deleted file mode 100644 index c1a0758..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap.png deleted file mode 100644 index f0bfdb9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap@2x.png deleted file mode 100644 index c79aa59..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_shake_close_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account.png deleted file mode 100644 index d450042..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account@2x.png deleted file mode 100644 index 82ce2ae..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_bg@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_bg@2x.png deleted file mode 100644 index 1137cf6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_bg@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap.png deleted file mode 100644 index 3c63b91..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap@2x.png deleted file mode 100644 index 4aef727..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_account_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account@2x.png deleted file mode 100644 index dbd52e2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account_tap@2x.png deleted file mode 100644 index 224c09a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_change_to_account_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_oauth@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_oauth@2x.png deleted file mode 100644 index fa1a57b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_share_oauth@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at.png deleted file mode 100644 index 692db98..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at@2x.png deleted file mode 100644 index e2eee43..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel.png deleted file mode 100644 index 2172965..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel@2x.png deleted file mode 100644 index 838ebf9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_atSel@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at_tap.png deleted file mode 100644 index 2172965..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_at_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg.png deleted file mode 100644 index 060e041..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg@2x.png deleted file mode 100755 index 0576d93..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_umeng_share_toolbarBg@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_image.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_image.png deleted file mode 100644 index 09ef645..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_image.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_music.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_music.png deleted file mode 100644 index ad07270..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_music.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_video.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_video.png deleted file mode 100644 index c4087d6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Buttons/UMS_url_video.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow.png deleted file mode 100644 index 6d2ffbc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow@2x.png deleted file mode 100644 index ec4ec0e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blackArrow@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow.png deleted file mode 100644 index d6240d4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow@2x.png deleted file mode 100644 index a6a7e55..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/blueArrow@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow.png deleted file mode 100644 index d69e9d9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow@2x.png deleted file mode 100644 index 9d42357..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/grayArrow@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow.png deleted file mode 100644 index 4bf5690..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow@2x.png deleted file mode 100644 index 7056974..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/EGO/whiteArrow@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_actionsheet_panel@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_actionsheet_panel@2x.png deleted file mode 100644 index 1420428..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_actionsheet_panel@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal.png deleted file mode 100644 index 28889fc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal@2x.png deleted file mode 100755 index 5faa236..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_normal@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap.png deleted file mode 100644 index 57dc855..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap@2x.png deleted file mode 100755 index eda6d35..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_back_button_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black.png deleted file mode 100644 index 4c94fa6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black@2x.png deleted file mode 100644 index 949f5ad..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_bar_bg_black@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal.png deleted file mode 100644 index 8ef8f1b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal@2x.png deleted file mode 100755 index 39703c8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_normal@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap.png deleted file mode 100644 index 3027c06..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap@2x.png deleted file mode 100755 index 7c139f9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/OtherTheme/UMS_nav_button_tap@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon.png deleted file mode 100755 index c399813..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon@2x.png deleted file mode 100755 index 07725f6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off.png deleted file mode 100755 index c399813..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off@2x.png deleted file mode 100755 index 07725f6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_on@2x.png deleted file mode 100755 index fa6ffa4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon.png deleted file mode 100755 index c399813..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon@2x.png deleted file mode 100755 index 07725f6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_alipay_session_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon.png deleted file mode 100644 index 2f3355f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon@2x.png deleted file mode 100644 index 75aebea..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off.png deleted file mode 100644 index 0af4735..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off@2x.png deleted file mode 100644 index 6ceaa39..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on.png deleted file mode 100644 index 226ac82..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on@2x.png deleted file mode 100644 index 0b4febf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_douban_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon.png deleted file mode 100644 index bbeda67..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon@2x.png deleted file mode 100644 index 48e759c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off.png deleted file mode 100644 index 3ee857a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off@2x.png deleted file mode 100644 index 7891395..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_on@2x.png deleted file mode 100644 index bbeda67..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_email_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon.png deleted file mode 100644 index 7ca623b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon@2x.png deleted file mode 100644 index 7d7b4dc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off.png deleted file mode 100644 index 9d802de..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off@2x.png deleted file mode 100644 index ba4f845..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on.png deleted file mode 100644 index 8ccf814..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on@2x.png deleted file mode 100644 index 8c076a7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_facebook_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_flickr_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_flickr_icon@2x.png deleted file mode 100644 index a7fffa1..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_flickr_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram.png deleted file mode 100644 index 0a3cb64..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram@2x.png deleted file mode 100644 index 652f660..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_instagram@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_session@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_session@2x.png deleted file mode 100644 index 9f20e14..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_session@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_timeline@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_timeline@2x.png deleted file mode 100644 index af47412..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_laiwang_timeline@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_line_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_line_icon@2x.png deleted file mode 100644 index ad14e13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_line_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_pinterest_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_pinterest_icon@2x.png deleted file mode 100644 index add6d36..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_pinterest_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon.png deleted file mode 100644 index 6f50c58..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon@2x.png deleted file mode 100644 index 8f8e912..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off.png deleted file mode 100644 index f8152da..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off@2x.png deleted file mode 100644 index 212aa1e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on.png deleted file mode 100644 index b8a65d9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on@2x.png deleted file mode 100644 index fc7290f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qq_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon.png deleted file mode 100644 index 4df7015..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon@2x.png deleted file mode 100644 index c8d87c6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off.png deleted file mode 100644 index 387e4b3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off@2x.png deleted file mode 100644 index 25ad620..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on.png deleted file mode 100644 index 82d5e1e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on@2x.png deleted file mode 100644 index 0de258d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_qzone_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon.png deleted file mode 100644 index 026ef37..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon@2x.png deleted file mode 100644 index e8f3b96..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off.png deleted file mode 100644 index b849921..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off@2x.png deleted file mode 100644 index cf42b6f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on.png deleted file mode 100644 index 0daab87..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on@2x.png deleted file mode 100644 index 3a5b650..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_renren_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon.png deleted file mode 100644 index 6a71c5a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon@2x.png deleted file mode 100644 index 37f4563..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off.png deleted file mode 100644 index 42dd24f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off@2x.png deleted file mode 100644 index 1bbef53..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on.png deleted file mode 100644 index 5db7d1f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on@2x.png deleted file mode 100644 index 278d320..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sina_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon.png deleted file mode 100644 index d9445fe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon@2x.png deleted file mode 100644 index 5424090..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off.png deleted file mode 100644 index 29220f7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off@2x.png deleted file mode 100644 index 5611eb8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_on@2x.png deleted file mode 100644 index 5424090..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_sms_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon.png deleted file mode 100644 index e34433e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon@2x.png deleted file mode 100644 index e844269..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off.png deleted file mode 100644 index 62e1e7d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off@2x.png deleted file mode 100644 index 9e45118..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on.png deleted file mode 100644 index 4c928b3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on@2x.png deleted file mode 100644 index a7ad17e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tencent_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tumblr_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tumblr_icon@2x.png deleted file mode 100644 index 0e3e2d2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_tumblr_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon.png deleted file mode 100644 index 35a2a16..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon@2x.png deleted file mode 100644 index 70484f5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off.png deleted file mode 100644 index 46e9264..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off@2x.png deleted file mode 100644 index bd69527..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on.png deleted file mode 100644 index fa489cf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on@2x.png deleted file mode 100644 index 77b8ecb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_twitter_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon.png deleted file mode 100644 index 463d1b2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon@2x.png deleted file mode 100644 index d312697..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_favorite_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon.png deleted file mode 100644 index 7bc2f54..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon@2x.png deleted file mode 100644 index 72d6e00..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off.png deleted file mode 100644 index 62703f7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off@2x.png deleted file mode 100644 index 24851eb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_on@2x.png deleted file mode 100644 index 5311c13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon.png deleted file mode 100644 index 7bc2f54..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon@2x.png deleted file mode 100644 index 72d6e00..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_session_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon.png deleted file mode 100644 index b19a0c7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon@2x.png deleted file mode 100644 index da94344..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off.png deleted file mode 100644 index 773b26a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off@2x.png deleted file mode 100644 index 9483f8f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on.png deleted file mode 100644 index 3e3477d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on@2x.png deleted file mode 100644 index 0fadb93..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_wechat_timeline_on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_whatsapp_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_whatsapp_icon@2x.png deleted file mode 100644 index ee505d6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_whatsapp_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_session@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_session@2x.png deleted file mode 100644 index 7c9e1f9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_session@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_timeline@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_timeline@2x.png deleted file mode 100644 index b73c54b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SnsPlatform/UMS_yixin_timeline@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white.png deleted file mode 100644 index 2e5ad01..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white@2x.png deleted file mode 100644 index 8da774e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_normal_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white.png deleted file mode 100644 index ec59f13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white@2x.png deleted file mode 100644 index c83dec3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_account_tap_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white.png deleted file mode 100644 index 2a5c7b8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white@2x.png deleted file mode 100644 index c3613f2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_normal_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white.png deleted file mode 100644 index cbce33b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white@2x.png deleted file mode 100644 index 2984162..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_comment_tap_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white.png deleted file mode 100644 index 71a292c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white@2x.png deleted file mode 100644 index 7493db1..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_off_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white.png deleted file mode 100644 index 8f6773f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white@2x.png deleted file mode 100644 index b9cbc0a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_like_on_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white.png deleted file mode 100644 index f988b04..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white@2x.png deleted file mode 100644 index 1fa0c0d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_normal_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white.png deleted file mode 100644 index 42f51ca..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white@2x.png deleted file mode 100644 index e48f6d9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/SocialSDKBar/UMS_share_tap_white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Sound/shake_sound.mp3 b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Sound/shake_sound.mp3 deleted file mode 100644 index e9b30e8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/UMSocialSDKResourcesNew.bundle/Sound/shake_sound.mp3 and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj/UMSocialLocalizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj/UMSocialLocalizable.strings deleted file mode 100644 index 5f81a2e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/en.lproj/UMSocialLocalizable.strings +++ /dev/null @@ -1,142 +0,0 @@ -/* - Localizable.strings - SocialSDK - - Created by yeahugo on 13-6-17. - Copyright (c) 2013年 Umeng. All rights reserved. -*/ -"button_cancel" = "Cancel"; -"button_ok" = "OK"; -"button_start" = "Start"; - -"button_close" = "Close"; -"button_back" = "Back"; -"button_refresh" = "Refresh"; - -"label_request_account" = "Getting account data, please wait……"; - -"oauth_title" = "Authorization"; -"oauth_text" = "Connecting to authorization web, please wait……"; -"oauth_follow" = "Follow official micro-blog"; -"mask_text" = "please wait……"; - -"oauth_error_title" = "authorise failed"; -"oauth_error_message" = "authorise failed, you can try again later"; -"oauth_error_not_approved" = "authorise failed, for your app haven't approved or you haven't add your weibo uid to test accounts"; - -"shareQQ_error" = "Error"; -"shareQQ_notInstall" = "Mobile QQ havn't be installed in your device"; -"shareQQ_openFail" = "Open Mobile QQ fail"; -"shareInstagram_openFail" = "Open Instagram fail"; -"shareClient_notInstall" = "Client not installed in your device"; - -"shareList_title" = "Share To"; -"shareEdit_title" = "Share To "; -"shareEdit_post" = "Post"; -"shareEdit_change_account" = "Change Account"; -"shareEdit_post_finish" = "Post Finished"; -"shareEdit_post_fail" = "Post Failed"; -"shareEdit_posting" = "Posting"; -"shareEdit_delete_picture" = "Delete Picture"; -"shareEdit_delete_video" = "Delete Video"; -"shareEdit_delete_music" = "Delete Music"; -"shareEdit_error_not_empty" = "Post content can not be empty"; -"shareEdit_error_too_long" = "Post content's length too long"; -"shareEdit_error_auth_expired" = "Post failed, for authorization expired"; -"shareEdit_error_auth_again" = "authorize again"; -"shareEdit_error_text_repeated" = "Text repeated"; -"shareEdit_error_user_baned" = "Sorry, you have been banned"; -"shareEdit_error_fail" = "Share fail"; -"shareEdit_error_no_auth" = "Share fail, for no upload picture authority"; -"shareEdit_error_empty_content" = "Share fail, for the content is empty"; -"shareEdit_addFollow" = "Follow weibo"; -"shareEdit_C" = "符"; -"shareEdit_used" = "常"; - -"shareShake_button" = "Share"; - -"share_wechat" = "Share to Wechat"; -"share_wechat_friend" = "Share to Wechat Friend"; -"share_wechat_moments" = "Share to Wechat Moments"; -"share_wechat_no_title" = "No Wechat"; -"share_wechat_no_message" = "Wechat haven't been install in your device"; -"share_facebook_not_login" = "No login Account"; -"share_facebook_not_login_message" = "Your account haven't login"; -"share_facebook_no_osSupport" = "iOS doesn't support"; -"share_facebook_no_osSupport_message" = "The version of your iOS device doesn't support share the that media"; - -"share_alipay" = "Share to AlipayShare"; -"share_alipay_friend" = "Share to AlipayShare friends"; -"share_alipay_moments" = "Share to AlipayShare Timeline"; -"share_alipay_no_title" = "No Alipay"; -"share_alipay_no_message" = "Alipay not installed in device"; -"share_alipay_version_not_supported" = "The version of Alipay not supported."; - -"share_sms_no_osSupport" = "No SMS"; -"share_sms_no_osSupport_message" = "The device doesn't support SMS"; - -"share_email_no_osSupport" = "No email"; -"share_email_no_osSupport_message" = "Your email service have been turned off, please turn it on before you share your email"; - -"login_title" = "Login"; -"login_as_tourists" = "Login as tourists"; -"login_choose" = "choose your available account"; - -"commentList_title" = "Comment List"; -"commentList_mask_text" = "Requesting comments, please wait……"; -"commentList_comment_here" = "Comment here"; - -"commentDetail_title" = "Detail"; - -"commentEdit_no_location" = "No Location"; -"commentEdit_post_fail" = "Post comment fail"; -"commentEdit_post_success" = "Post comment success"; -"commentEdit_noLocation_title" = "Location service have been turned off"; -"commentEdit_noLocation_message" = "Your device's location service have been turned off, please turn on it before you share your location"; -"commentEdit_title" = "New Comment"; -"commentEdit_wait" = "Please wait"; - -"ego_pull_down" = "Pull down, refresh"; -"ego_refresh" = "Loose to refresh"; -"ego_load_more" = "Loose to load more"; -"ego_pull_up" = "Pull up, load more"; -"ego_refreshing" = "Refreshing"; -"ego_loading_more" = "Loading more"; - -"loading" = "Loading"; - -"shareEdit_error_network_fail_message" = "Network Error"; - -"network_fail_title" = "Network Error"; -"network_fail_message" = "The network state of your device is not available."; - -"account_title" = "User Center"; -"account_title_authorize_status" = "authorize status"; -"account_label_login_tourist" = "login as tourist"; -"account_label_login_account" = "login account"; -"account_lable_not_auth" = "not authorized"; -"account_lable_have_auth" = "authorized"; -"account_title_sns_config" = "sns accounts"; - -"sina" = "Sina"; -"tencent" = "Tencent"; -"renren" = "Renren"; -"qzone" = "Qzone"; -"qq_account" = "QQ Account"; -"douban" = "Douban"; -"wechat" = "Wechat"; -"email" = "Email"; -"sms" = "SMS"; -"wechat_session" = "Wechat"; -"wechat_timeline" = "Moments"; -"alipay_session" = "Alipay"; -"aliay_circle" = "LifeCircle"; -"wechat_favorite" = "Wechat Favorite"; -"facebook" = "Facebook"; -"twitter" = "Twitter"; -"mobile_qq" = "QQ"; -"yx_session" = "YiXin"; -"yx_timeline" = "YX Moments"; -"lw_session" = "LaiWang"; -"lw_timeline" = "LW News"; -"instagram" = "Instagram"; \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_4.4.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_4.4.a deleted file mode 100644 index 6d7b7fd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_4.4.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_Comment_4.4.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_Comment_4.4.a deleted file mode 100644 index e82bd5f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/libUMSocial_Sdk_Comment_4.4.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj/UMSocialLocalizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj/UMSocialLocalizable.strings deleted file mode 100644 index 1e2ac5b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_4.4/zh-Hans.lproj/UMSocialLocalizable.strings +++ /dev/null @@ -1,140 +0,0 @@ -/* - Localizable.strings - SocialSDK - - Created by yeahugo on 13-6-17. - Copyright (c) 2013年 Umeng. All rights reserved. -*/ -"button_cancel" = "取消"; -"button_ok" = "确定"; -"button_start" = "开启"; - -"button_close" = "关闭"; -"button_back" = "返回"; -"button_refresh" = "刷新"; - -"label_request_account" = "正在获取账户信息,请稍等..."; - -"oauth_title" = "授权"; -"oauth_text" = "正在连接授权页面,请稍等..."; -"mask_text" = "正在获取数据,请稍等..."; -"oauth_follow" = "关注官方微博"; - -"oauth_error_title" = "授权失败"; -"oauth_error_message" = "服务器繁忙,授权失败,请稍后再试"; -"oauth_error_not_approved" = "由于没有在开放平台添加此账号作为测试账号或者没有通过审核等原因授权失败"; - -"shareQQ_error" = "抱歉"; -"shareQQ_notInstall" = "没有安装手机QQ客户端"; -"shareQQ_openFail" = "打开手机QQ失败"; -"shareClient_notInstall" = "没有安装客户端"; -"shareInstagram_openFail" = "没有安装Instagram客户端"; - -"shareList_title" = "分享至"; -"shareEdit_title" = "分享至"; -"shareEdit_post" = "发布"; -"shareEdit_change_account" = "切换账号"; -"shareEdit_post_finish" = "发送成功"; -"shareEdit_post_fail" = "发送失败"; -"shareEdit_posting" = "正在发送"; -"shareEdit_delete_picture" = "删除图片"; -"shareEdit_delete_video" = "删除视频"; -"shareEdit_delete_music" = "删除音乐"; -"shareEdit_error_not_empty" = "分享内容不能为空"; -"shareEdit_error_too_long" = "分享内容长度超出限制"; -"shareEdit_error_auth_expired" = "授权过期,分享失败"; -"shareEdit_error_auth_again" = "重新授权"; -"shareEdit_error_text_repeated" = "内容重复,分享失败"; -"shareEdit_error_user_baned" = "对不起,因为违反了用户协议您已被禁言"; -"shareEdit_error_fail" = "分享失败"; -"shareEdit_error_no_auth" = "无上传图片的权限,分享失败"; -"shareEdit_error_empty_content" = "分享内容为空,分享失败"; -"shareEdit_addFollow" = "关注官方微博"; -"shareEdit_C" = "符"; -"shareEdit_used" = "常"; -"shareShake_button" = "分享"; - -"share_wechat" = "分享至微信"; -"share_wechat_friend" = "分享至微信好友"; -"share_wechat_moments" = "分享至微信朋友圈"; -"share_wechat_no_title" = "温馨提示"; -"share_wechat_no_message" = "您的设备没有安装微信"; -"share_facebook_not_login" = "账号未登录"; -"share_facebook_not_login_message" = "账号未登录"; -"share_facebook_no_osSupport" = "系统不支持"; -"share_facebook_no_osSupport_message" = "您的iOS系统版本过低,不支持分享到该平台"; - -"share_alipay" = "分享至支付宝"; -"share_alipay_friend" = "分享至支付宝好友"; -"share_alipay_moments" = "分享至支付宝生活圈"; -"share_alipay_no_title" = "温馨提示"; -"share_alipay_no_message" = "您的设备没有安装支付宝"; -"share_alipay_version_not_supported" = "您的支付宝版本不支持分享"; - -"share_sms_no_osSupport" = "不支持短信"; -"share_sms_no_osSupport_message" = "您的设备不支持短信功能"; - -"share_email_no_osSupport" = "邮件功能未开启"; -"share_email_no_osSupport_message" = "您当前的邮件服务处于未启用状态,请先前往系统设置中配置邮件服务后,再进行分享"; - -"login_title" = "登录"; -"login_as_tourists" = "游客身份"; -"login_choose" = "选择已有账号登录"; - -"commentList_title" = "评论列表"; -"commentList_mask_text" = "正在获取评论数据,请稍等..."; -"commentList_comment_here" = "在这说点什么..."; - -"commentDetail_title" = "评论详情"; - -"commentEdit_no_location" = "取消定位"; -"commentEdit_post_fail" = "评论失败"; -"commentEdit_post_success" = "评论成功"; -"commentEdit_noLocation_title" = "定位服务未开启"; -"commentEdit_noLocation_message" = "您当前的定位服务处于关闭状态,或者没有对此应用开启地理位置服务,请先前往系统设置中开启本应用的定位服务,再进行分享"; -"commentEdit_title" = "新评论"; -"commentEdit_wait" = "评论发送中,请稍等..."; - -"ego_pull_down" = "下拉刷新"; -"ego_pull_up" = "上拉加载更多"; -"ego_refreshing" = "正在刷新"; -"ego_loading_more" = "正在加载更多"; -"ego_refresh" = "松开立即刷新"; -"ego_loadmore" = "松开立即加载更多"; -"shareEdit_error_network_fail_message" = "网络不给力,发送失败了"; - -"loading" = " 加载中 "; - -"network_fail_title" = "温馨提示"; -"network_fail_message" = "当前网络不给力"; - -"account_title" = "个人中心"; -"account_title_authorize_status" = "授权信息"; -"account_label_login_tourist" = "游客登录"; -"account_label_login_account" = "登录账号"; -"account_lable_not_auth" = "尚未授权"; -"account_lable_have_auth" = "已授权"; -"account_title_sns_config" = "分享设置"; - -"sina" = "微博"; -"tencent" = "腾讯微博"; -"renren" = "人人网"; -"qzone" = "QQ空间"; -"qq_account" = "QQ 账号"; -"douban" = "豆瓣"; -"wechat" = "微信"; -"email" = "邮箱"; -"sms" = "短信"; -"wechat_session" = "微信好友"; -"wechat_timeline" = "朋友圈"; -"wechat_favorite" = "微信收藏"; -"alipay_session" = "支付宝好友"; -"aliay_circle" = "生活圈"; -"facebook" = "Facebook"; -"twitter" = "Twitter"; -"mobile_qq" = "QQ"; -"yx_session" = "易信"; -"yx_timeline" = "易信朋友圈"; -"lw_session" = "来往"; -"lw_timeline" = "来往动态"; -"instagram" = "Instagram"; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h deleted file mode 100644 index 366fb52..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPI.h +++ /dev/null @@ -1,140 +0,0 @@ -// -// APOpenAPI.h -// 所有API接口 -// -// Created by Alipay on 15-4-15. -// Copyright (c) 2015年 Alipay. All rights reserved. -// - -#import -#import "APOpenAPIObject.h" - -#pragma mark - APOpenAPIDelegate - -/*! @brief 接收并处理来自支付宝终端程序的事件消息 - * - * 接收并处理来自支付宝终端程序的事件消息,期间支付宝界面会切换到第三方应用程序。 - * APOpenAPIDelegate 会在handleOpenURL:delegate:中使用并触发。 - */ -@protocol APOpenAPIDelegate -@optional - -/*! @brief 收到一个来自支付宝的请求,第三方应用程序处理完后调用sendResp向支付宝发送结果 - * - * 收到一个来自支付宝的请求,异步处理完成后必须调用sendResp发送处理结果给支付宝。 - * @param req 具体请求内容 - */ --(void) onReq:(APBaseReq*)req; - - - -/*! @brief 发送一个sendReq后,收到支付宝的回应 - * - * 收到一个来自支付宝的处理结果。调用一次sendReq后会收到onResp。 - * @param resp具体的回应内容 - */ --(void) onResp:(APBaseResp*)resp; - -@end - -#pragma mark - APOpenAPI - -/*! @brief 支付宝API接口函数类 - * - * 该类封装了支付宝终端SDK的所有接口 - */ -@interface APOpenAPI : NSObject - - -/*! @brief APOpenAPI的成员函数,向支付宝终端程序注册第三方应用。 - * - * 需要在每次启动第三方应用程序时调用。第一次调用后,会在支付宝的可用应用列表中出现。 - * iOS7及以上系统需要调起一次支付宝才会出现在支付宝的可用应用列表中。 - * @attention 请保证在主线程中调用此函数 - * @param appid 支付宝开发者ID - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) registerApp:(NSString *)appid; - - - -/*! @brief APOpenAPI的成员函数,向支付宝终端程序注册第三方应用。 - * - * 需要在每次启动第三方应用程序时调用。第一次调用后,会在支付宝的可用应用列表中出现。 - * @see registerApp - * @param appid 支付宝开发者ID - * @param appdesc 应用附加信息,长度不超过1024字节 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc; - - - -/*! @brief 处理支付宝通过URL启动App时传递的数据 - * - * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 - * @param url 支付宝启动第三方应用时传递过来的URL - * @param delegate APOpenAPIDelegate对象,用来接收支付宝触发的消息。 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) handleOpenURL:(NSURL *) url delegate:(id) delegate; - - - -/*! @brief 检查支付宝是否已被用户安装 - * - * @return 支付宝已安装返回YES,未安装返回NO。 - */ -+(BOOL) isAPAppInstalled; - - - -/*! @brief 判断当前支付宝的版本是否支持OpenApi - * - * @return 支持返回YES,不支持返回NO。 - */ -+(BOOL) isAPAppSupportOpenApi; - - - -/*! @brief 获取支付宝的itunes安装地址 - * - * @return 支付宝的安装地址字符串。 - */ -+(NSString *) getAPAppInstallUrl; - - - -/*! @brief 获取当前支付宝SDK的版本号 - * - * @return 返回当前支付宝SDK的版本号 - */ -+(NSString *) getApiVersion; - - - -/*! @brief 打开支付宝 - * - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) openAPApp; - - -/*! @brief 发送请求到支付宝,等待支付宝返回onResp - * - * 函数调用后,会切换到支付宝的界面。第三方应用程序等待支付宝返回onResp。支付宝在异步处理完成后一定会调用onResp。支持以下类型 - * @param req 具体的发送请求,在调用函数后,请自己释放。 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) sendReq:(APBaseReq*)req; - - -/*! @brief 收到支付宝onReq的请求,发送对应的应答给支付宝,并切换到支付宝界面 - * - * 函数调用后,会切换到支付宝的界面。第三方应用程序收到支付宝onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 - * @param resp 具体的应答内容,调用函数后,请自己释放 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) sendResp:(APBaseResp*)resp; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h deleted file mode 100644 index bb4a53c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/APOpenAPIObject.h +++ /dev/null @@ -1,106 +0,0 @@ -// -// APOpenAPIObject.h -// API对象,包含所有接口和对象数据定义 -// -// Created by Alipay on 15-4-15. -// Copyright (c) 2015年 Alipay. All rights reserved. -// - -#import -#import - -// 错误码 -typedef enum { - APSuccess = 0, // 成功 - APErrCodeCommon = -1, // 通用错误 - APErrCodeUserCancel = -2, // 用户取消 - APErrCodeSentFail = -3, // 发送失败 - APErrCodeAuthDeny = -4, // 授权失败 - APErrCodeUnsupport = -5, // 不支持 -}APErrorCode; - -// 分享场景 -typedef enum { - APSceneSession = 0, // 会话 -}APScene; - -#pragma mark - APBaseReq - -/*! @brief 该类为支付宝SDK所有请求类的基类 - * - */ -@interface APBaseReq : NSObject -/** 请求类型 */ -@property (nonatomic, assign) int type; -/** AppID,发送请求时第三方程序必须填写 */ -@property (nonatomic, retain) NSString* openID; -@end - -#pragma mark - APBaseResp - -/*! @brief 该类为SDK所有响应类的基类 - * - */ -@interface APBaseResp : NSObject -/** 错误码 */ -@property (nonatomic, assign) int errCode; -/** 错误提示字符串 */ -@property (nonatomic, strong) NSString *errStr; -/** 响应类型 */ -@property (nonatomic, assign) int type; -@property (nonatomic, strong) NSString *openID; -@end - -#pragma mark - 发送消息到支付宝 -/*! @brief 第三方程序发送消息至支付宝终端程序的消息结构体 - * - * 第三方程序向支付宝发送信息需要传入SendMessageToAPReq结构体,调用该方法后,支付宝处理完信息会向第三方程序发送一个处理结果。 - * @see SendMessageToAPReq - */ -@class APMediaMessage; -@interface APSendMessageToAPReq : APBaseReq -// 发送消息的多媒体内容 -@property (nonatomic, strong) APMediaMessage* message; -@property (nonatomic, assign) APScene scene; -@end - -/*! @brief 支付宝终端向第三方程序返回的SendMessageToAPReq处理结果。 - * - * 第三方程序向支付宝终端发送SendMessageToAPReq后,支付宝发送回来的处理结果,该结果用SendMessageToAPResp表示。 - */ -@interface APSendMessageToAPResp : APBaseResp - -@end - -#pragma mark - APMediaMessage -/*! @brief 多媒体消息结构体 - * - * 用于支付宝终端和第三方程序之间传递消息的多媒体消息内容 - */ -@interface APMediaMessage : NSObject -// 标题 -@property (nonatomic, strong) NSString *title; -// 描述内容 -@property (nonatomic, strong) NSString *desc; -// 缩略图数据 -@property (nonatomic, strong) NSData *thumbData; -@property (nonatomic, strong) NSString *thumbUrl; -// 多媒体对象 -@property (nonatomic, strong) id mediaObject; -@end - -// 文本 -@interface APShareTextObject : NSObject -@property (nonatomic, strong) NSString *text; -@end; - -// 图片 -@interface APShareImageObject : NSObject -@property (nonatomic, strong) NSData *imageData; -@property (nonatomic, strong) NSString *imageUrl; -@end; - -// 网页 -@interface APShareWebObject : NSObject -@property (nonatomic, strong) NSString *wepageUrl; -@end; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h deleted file mode 100644 index 367080e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/UMSocialAlipayShareHandler.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// UMSocialAlipayShareHandler.h -// SocialSDK -// -// Created by umeng on 11/4/15. -// Copyright © 2015 Umeng. All rights reserved. -// - -#import - -@interface UMSocialAlipayShareHandler : NSObject - -/** - 设置支付宝AppId - - @param appId 支付宝appId - - */ -+ (void)setAlipayShareAppId:(NSString *)appId; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libAPOpenSdk.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libAPOpenSdk.a deleted file mode 100644 index 68419a1..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libAPOpenSdk.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libSocialAlipayShare.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libSocialAlipayShare.a deleted file mode 100644 index e8efaaa..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/AlipayShare/libSocialAlipayShare.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/FBSDKCoreKit b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/FBSDKCoreKit deleted file mode 100644 index 95e4836..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/FBSDKCoreKit and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h deleted file mode 100644 index 4ed0656..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAccessToken.h +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/*! - @abstract Notification indicating that the `currentAccessToken` has changed. - @discussion the userInfo dictionary of the notification will contain keys - `FBSDKAccessTokenChangeOldKey` and - `FBSDKAccessTokenChangeNewKey`. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeNotification; - -/*! - @abstract A key in the notification's userInfo that will be set - if and only if the user ID changed between the old and new tokens. - @discussion Token refreshes can occur automatically with the SDK - which do not change the user. If you're only interested in user - changes (such as logging out), you should check for the existence - of this key. The value is a NSNumber with a boolValue. - - On a fresh start of the app where the SDK reads in the cached value - of an access token, this key will also exist since the access token - is moving from a null state (no user) to a non-null state (user). - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenDidChangeUserID; - -/* - @abstract key in notification's userInfo object for getting the old token. - @discussion If there was no old token, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeOldKey; - -/* - @abstract key in notification's userInfo object for getting the new token. - @discussion If there is no new token, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKAccessTokenChangeNewKey; - - -/*! - @class FBSDKAccessToken - @abstract Represents an immutable access token for using Facebook services. - */ -@interface FBSDKAccessToken : NSObject - -/*! - @abstract Returns the app ID. - */ -@property (readonly, copy, nonatomic) NSString *appID; - -/*! - @abstract Returns the known declined permissions. - */ -@property (readonly, copy, nonatomic) NSSet *declinedPermissions; - -/*! - @abstract Returns the expiration date. - */ -@property (readonly, copy, nonatomic) NSDate *expirationDate; - -/*! - @abstract Returns the known granted permissions. - */ -@property (readonly, copy, nonatomic) NSSet *permissions; - -/*! - @abstract Returns the date the token was last refreshed. -*/ -@property (readonly, copy, nonatomic) NSDate *refreshDate; - -/*! - @abstract Returns the opaque token string. - */ -@property (readonly, copy, nonatomic) NSString *tokenString; - -/*! - @abstract Returns the user ID. - */ -@property (readonly, copy, nonatomic) NSString *userID; - -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)new NS_UNAVAILABLE; - -/*! - @abstract Initializes a new instance. - @param tokenString the opaque token string. - @param permissions the granted permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - @param declinedPermissions the declined permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - @param appID the app ID. - @param userID the user ID. - @param expirationDate the optional expiration date (defaults to distantFuture). - @param refreshDate the optional date the token was last refreshed (defaults to today). - @discussion This initializer should only be used for advanced apps that - manage tokens explicitly. Typical login flows only need to use `FBSDKLoginManager` - along with `+currentAccessToken`. - */ -- (instancetype)initWithTokenString:(NSString *)tokenString - permissions:(NSArray *)permissions - declinedPermissions:(NSArray *)declinedPermissions - appID:(NSString *)appID - userID:(NSString *)userID - expirationDate:(NSDate *)expirationDate - refreshDate:(NSDate *)refreshDate -NS_DESIGNATED_INITIALIZER; - -/*! - @abstract Convenience getter to determine if a permission has been granted - @param permission The permission to check. - */ -- (BOOL)hasGranted:(NSString *)permission; - -/*! - @abstract Compares the receiver to another FBSDKAccessToken - @param token The other token - @return YES if the receiver's values are equal to the other token's values; otherwise NO - */ -- (BOOL)isEqualToAccessToken:(FBSDKAccessToken *)token; - -/*! - @abstract Returns the "global" access token that represents the currently logged in user. - @discussion The `currentAccessToken` is a convenient representation of the token of the - current user and is used by other SDK components (like `FBSDKLoginManager`). - */ -+ (FBSDKAccessToken *)currentAccessToken; - -/*! - @abstract Sets the "global" access token that represents the currently logged in user. - @param token The access token to set. - @discussion This will broadcast a notification and save the token to the app keychain. - */ -+ (void)setCurrentAccessToken:(FBSDKAccessToken *)token; - -/*! - @abstract Refresh the current access token's permission state and extend the token's expiration date, - if possible. - @param completionHandler an optional callback handler that can surface any errors related to permission refreshing. - @discussion On a successful refresh, the currentAccessToken will be updated so you typically only need to - observe the `FBSDKAccessTokenDidChangeNotification` notification. - - If a token is already expired, it cannot be refreshed. - */ -+ (void)refreshCurrentAccessToken:(FBSDKGraphRequestHandler)completionHandler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h deleted file mode 100644 index 375d413..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppEvents.h +++ /dev/null @@ -1,462 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKMacros.h" - -@class FBSDKAccessToken; -@class FBSDKGraphRequest; - -/*! @abstract NSNotificationCenter name indicating a result of a failed log flush attempt. The posted object will be an NSError instance. */ -FBSDK_EXTERN NSString *const FBSDKAppEventsLoggingResultNotification; - -/*! @abstract optional plist key ("FacebookLoggingOverrideAppID") for setting `loggingOverrideAppID` */ -FBSDK_EXTERN NSString *const FBSDKAppEventsOverrideAppIDBundleKey; - -/*! - - @typedef NS_ENUM (NSUInteger, FBSDKAppEventsFlushBehavior) - - @abstract Specifies when `FBSDKAppEvents` sends log events to the server. - - */ -typedef NS_ENUM(NSUInteger, FBSDKAppEventsFlushBehavior) -{ - - /*! Flush automatically: periodically (once a minute or every 100 logged events) and always at app reactivation. */ - FBSDKAppEventsFlushBehaviorAuto = 0, - - /*! Only flush when the `flush` method is called. When an app is moved to background/terminated, the - events are persisted and re-established at activation, but they will only be written with an - explicit call to `flush`. */ - FBSDKAppEventsFlushBehaviorExplicitOnly, - -}; - -/*! - @methodgroup Predefined event names for logging events common to many apps. Logging occurs through the `logEvent` family of methods on `FBSDKAppEvents`. - Common event parameters are provided in the `FBSDKAppEventsParameterNames*` constants. - */ - -/*! Log this event when the user has achieved a level in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAchievedLevel; - -/*! Log this event when the user has entered their payment info. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedPaymentInfo; - -/*! Log this event when the user has added an item to their cart. The valueToSum passed to logEvent should be the item's price. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToCart; - -/*! Log this event when the user has added an item to their wishlist. The valueToSum passed to logEvent should be the item's price. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameAddedToWishlist; - -/*! Log this event when a user has completed registration with the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedRegistration; - -/*! Log this event when the user has completed a tutorial in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameCompletedTutorial; - -/*! Log this event when the user has entered the checkout process. The valueToSum passed to logEvent should be the total price in the cart. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameInitiatedCheckout; - -/*! Log this event when the user has rated an item in the app. The valueToSum passed to logEvent should be the numeric rating. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameRated; - -/*! Log this event when a user has performed a search within the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameSearched; - -/*! Log this event when the user has spent app credits. The valueToSum passed to logEvent should be the number of credits spent. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameSpentCredits; - -/*! Log this event when the user has unlocked an achievement in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameUnlockedAchievement; - -/*! Log this event when a user has viewed a form of content in the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventNameViewedContent; - -/*! - @methodgroup Predefined event name parameters for common additional information to accompany events logged through the `logEvent` family - of methods on `FBSDKAppEvents`. Common event names are provided in the `FBAppEventName*` constants. - */ - -/*! Parameter key used to specify an ID for the specific piece of content being logged about. Could be an EAN, article identifier, etc., depending on the nature of the app. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentID; - -/*! Parameter key used to specify a generic content type/family for the logged event, e.g. "music", "photo", "video". Options to use will vary based upon what the app is all about. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameContentType; - -/*! Parameter key used to specify currency used with logged event. E.g. "USD", "EUR", "GBP". See ISO-4217 for specific values. One reference for these is . */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameCurrency; - -/*! Parameter key used to specify a description appropriate to the event being logged. E.g., the name of the achievement unlocked in the `FBAppEventNameAchievementUnlocked` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameDescription; - -/*! Parameter key used to specify the level achieved in a `FBAppEventNameAchieved` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameLevel; - -/*! Parameter key used to specify the maximum rating available for the `FBAppEventNameRate` event. E.g., "5" or "10". */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameMaxRatingValue; - -/*! Parameter key used to specify how many items are being processed for an `FBAppEventNameInitiatedCheckout` or `FBAppEventNamePurchased` event. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameNumItems; - -/*! Parameter key used to specify whether payment info is available for the `FBAppEventNameInitiatedCheckout` event. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNamePaymentInfoAvailable; - -/*! Parameter key used to specify method user has used to register for the app, e.g., "Facebook", "email", "Twitter", etc */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameRegistrationMethod; - -/*! Parameter key used to specify the string provided by the user for a search operation. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSearchString; - -/*! Parameter key used to specify whether the activity being logged about was successful or not. `FBSDKAppEventParameterValueYes` and `FBSDKAppEventParameterValueNo` are good canonical values to use for this parameter. */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterNameSuccess; - -/* - @methodgroup Predefined values to assign to event parameters that accompany events logged through the `logEvent` family - of methods on `FBSDKAppEvents`. Common event parameters are provided in the `FBSDKAppEventParameterName*` constants. - */ - -/*! Yes-valued parameter value to be used with parameter keys that need a Yes/No value */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueYes; - -/*! No-valued parameter value to be used with parameter keys that need a Yes/No value */ -FBSDK_EXTERN NSString *const FBSDKAppEventParameterValueNo; - - -/*! - - @class FBSDKAppEvents - - @abstract - Client-side event logging for specialized application analytics available through Facebook App Insights - and for use with Facebook Ads conversion tracking and optimization. - - @discussion - The `FBSDKAppEvents` static class has a few related roles: - - + Logging predefined and application-defined events to Facebook App Insights with a - numeric value to sum across a large number of events, and an optional set of key/value - parameters that define "segments" for this event (e.g., 'purchaserStatus' : 'frequent', or - 'gamerLevel' : 'intermediate') - - + Logging events to later be used for ads optimization around lifetime value. - - + Methods that control the way in which events are flushed out to the Facebook servers. - - Here are some important characteristics of the logging mechanism provided by `FBSDKAppEvents`: - - + Events are not sent immediately when logged. They're cached and flushed out to the Facebook servers - in a number of situations: - - when an event count threshold is passed (currently 100 logged events). - - when a time threshold is passed (currently 15 seconds). - - when an app has gone to background and is then brought back to the foreground. - - + Events will be accumulated when the app is in a disconnected state, and sent when the connection is - restored and one of the above 'flush' conditions are met. - - + The `FBSDKAppEvents` class is thread-safe in that events may be logged from any of the app's threads. - - + The developer can set the `flushBehavior` on `FBSDKAppEvents` to force the flushing of events to only - occur on an explicit call to the `flush` method. - - + The developer can turn on console debug output for event logging and flushing to the server by using - the `FBSDKLoggingBehaviorAppEvents` value in `[FBSettings setLoggingBehavior:]`. - - Some things to note when logging events: - - + There is a limit on the number of unique event names an app can use, on the order of 1000. - + There is a limit to the number of unique parameter names in the provided parameters that can - be used per event, on the order of 25. This is not just for an individual call, but for all - invocations for that eventName. - + Event names and parameter names (the keys in the NSDictionary) must be between 2 and 40 characters, and - must consist of alphanumeric characters, _, -, or spaces. - + The length of each parameter value can be no more than on the order of 100 characters. - - */ -@interface FBSDKAppEvents : NSObject - -/* - * Basic event logging - */ - -/*! - - @abstract - Log an event with just an eventName. - - @param eventName The name of the event to record. Limitations on number of events and name length - are given in the `FBSDKAppEvents` documentation. - - */ -+ (void)logEvent:(NSString *)eventName; - -/*! - - @abstract - Log an event with an eventName and a numeric value to be aggregated with other events of this name. - - @param eventName The name of the event to record. Limitations on number of events and name length - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum; - - -/*! - - @abstract - Log an event with an eventName and a set of key/value pairs in the parameters dictionary. - Parameter limitations are described above. - - @param eventName The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - */ -+ (void)logEvent:(NSString *)eventName - parameters:(NSDictionary *)parameters; - -/*! - - @abstract - Log an event with an eventName, a numeric value to be aggregated with other events of this name, - and a set of key/value pairs in the parameters dictionary. - - @param eventName The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. - - @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(double)valueToSum - parameters:(NSDictionary *)parameters; - - -/*! - - @abstract - Log an event with an eventName, a numeric value to be aggregated with other events of this name, - and a set of key/value pairs in the parameters dictionary. Providing session lets the developer - target a particular . If nil is provided, then `[FBSession activeSession]` will be used. - - @param eventName The name of the event to record. Limitations on number of events and name construction - are given in the `FBSDKAppEvents` documentation. Common event names are provided in `FBAppEventName*` constants. - - @param valueToSum Amount to be aggregated into all events of this eventName, and App Insights will report - the cumulative and average value of this amount. Note that this is an NSNumber, and a value of `nil` denotes - that this event doesn't have a value associated with it for summation. - - @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - @param accessToken The optional access token to log the event as. - */ -+ (void)logEvent:(NSString *)eventName - valueToSum:(NSNumber *)valueToSum - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken; - -/* - * Purchase logging - */ - -/*! - - @abstract - Log a purchase of the specified amount, in the specified currency. - - @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency. This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency; - -/*! - - @abstract - Log a purchase of the specified amount, in the specified currency, also providing a set of - additional characteristics describing the purchase. - - @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters; - -/*! - - @abstract - Log a purchase of the specified amount, in the specified currency, also providing a set of - additional characteristics describing the purchase, as well as an to log to. - - @param purchaseAmount Purchase amount to be logged, as expressed in the specified currency.This value - will be rounded to the thousandths place (e.g., 12.34567 becomes 12.346). - - @param currency Currency, is denoted as, e.g. "USD", "EUR", "GBP". See ISO-4217 for - specific values. One reference for these is . - - @param parameters Arbitrary parameter dictionary of characteristics. The keys to this dictionary must - be NSString's, and the values are expected to be NSString or NSNumber. Limitations on the number of - parameters and name construction are given in the `FBSDKAppEvents` documentation. Commonly used parameter names - are provided in `FBSDKAppEventParameterName*` constants. - - @param accessToken The optional access token to log the event as. - - @discussion This event immediately triggers a flush of the `FBSDKAppEvents` event queue, unless the `flushBehavior` is set - to `FBSDKAppEventsFlushBehaviorExplicitOnly`. - - */ -+ (void)logPurchase:(double)purchaseAmount - currency:(NSString *)currency - parameters:(NSDictionary *)parameters - accessToken:(FBSDKAccessToken *)accessToken; - -/*! - - @abstract - Notifies the events system that the app has launched and, when appropriate, logs an "activated app" event. Should typically be placed in the - app delegates' `applicationDidBecomeActive:` method. - - This method also takes care of logging the event indicating the first time this app has been launched, which, among other things, is used to - track user acquisition and app install ads conversions. - - @discussion - `activateApp` will not log an event on every app launch, since launches happen every time the app is backgrounded and then foregrounded. - "activated app" events will be logged when the app has not been active for more than 60 seconds. This method also causes a "deactivated app" - event to be logged when sessions are "completed", and these events are logged with the session length, with an indication of how much - time has elapsed between sessions, and with the number of background/foreground interruptions that session had. This data - is all visible in your app's App Events Insights. - */ -+ (void)activateApp; - -/* - * Control over event batching/flushing - */ - -/*! - - @abstract - Get the current event flushing behavior specifying when events are sent back to Facebook servers. - */ -+ (FBSDKAppEventsFlushBehavior)flushBehavior; - -/*! - - @abstract - Set the current event flushing behavior specifying when events are sent back to Facebook servers. - - @param flushBehavior The desired `FBSDKAppEventsFlushBehavior` to be used. - */ -+ (void)setFlushBehavior:(FBSDKAppEventsFlushBehavior)flushBehavior; - -/*! - @abstract - Set the 'override' App ID for App Event logging. - - @discussion - In some cases, apps want to use one Facebook App ID for login and social presence and another - for App Event logging. (An example is if multiple apps from the same company share an app ID for login, but - want distinct logging.) By default, this value is `nil`, and defers to the `FBSDKAppEventsOverrideAppIDBundleKey` - plist value. If that's not set, it defaults to `[FBSDKSettings appID]`. - - This should be set before any other calls are made to `FBSDKAppEvents`. Thus, you should set it in your application - delegate's `application:didFinishLaunchingWithOptions:` delegate. - - @param appID The Facebook App ID to be used for App Event logging. - */ -+ (void)setLoggingOverrideAppID:(NSString *)appID; - -/*! - @abstract - Get the 'override' App ID for App Event logging. - - @see setLoggingOverrideAppID: - - */ -+ (NSString *)loggingOverrideAppID; - - -/*! - @abstract - Explicitly kick off flushing of events to Facebook. This is an asynchronous method, but it does initiate an immediate - kick off. Server failures will be reported through the NotificationCenter with notification ID `FBSDKAppEventsLoggingResultNotification`. - */ -+ (void)flush; - -/*! - @abstract - Creates a request representing the Graph API call to retrieve a Custom Audience "third party ID" for the app's Facebook user. - Callers will send this ID back to their own servers, collect up a set to create a Facebook Custom Audience with, - and then use the resultant Custom Audience to target ads. - - @param accessToken The access token to use to establish the user's identity for users logged into Facebook through this app. - If `nil`, then the `[FBSDKAccessToken currentAccessToken]` is used. - - @discussion - The JSON in the request's response will include an "custom_audience_third_party_id" key/value pair, with the value being the ID retrieved. - This ID is an encrypted encoding of the Facebook user's ID and the invoking Facebook app ID. - Multiple calls with the same user will return different IDs, thus these IDs cannot be used to correlate behavior - across devices or applications, and are only meaningful when sent back to Facebook for creating Custom Audiences. - - The ID retrieved represents the Facebook user identified in the following way: if the specified access token is valid, - the ID will represent the user associated with that token; otherwise the ID will represent the user logged into the - native Facebook app on the device. If there is no native Facebook app, no one is logged into it, or the user has opted out - at the iOS level from ad tracking, then a `nil` ID will be returned. - - This method returns `nil` if either the user has opted-out (via iOS) from Ad Tracking, the app itself has limited event usage - via the `[FBSDKSettings limitEventAndDataUsage]` flag, or a specific Facebook user cannot be identified. - */ -+ (FBSDKGraphRequest *)requestForCustomAudienceThirdPartyIDWithAccessToken:(FBSDKAccessToken *)accessToken; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h deleted file mode 100644 index 8e65e5b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkResolver.h +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class BFTask; - -// Check if Bolts.framework is available for import -#if __has_include() -// Import it if it's available -# import -#else -// Otherwise - redeclare BFAppLinkResolving protocol to resolve the problem of missing symbols -// Please note: Bolts.framework is still required for AppLink resolving to work, -// but this allows FBSDKCoreKit to weakly link Bolts.framework as well as this enables clang modulemaps to work. - -/*! - Implement this protocol to provide an alternate strategy for resolving - App Links that may include pre-fetching, caching, or querying for App Link - data from an index provided by a service provider. - */ -@protocol BFAppLinkResolving - -/*! - Asynchronously resolves App Link data for a given URL. - - @param url The URL to resolve into an App Link. - @returns A BFTask that will return a BFAppLink for the given URL. - */ -- (BFTask *)appLinkFromURLInBackground:(NSURL *)url; - -@end - -#endif - -/*! - @class FBSDKAppLinkResolver - - @abstract - Provides an implementation of the BFAppLinkResolving protocol that uses the Facebook App Link - Index API to resolve App Links given a URL. It also provides an additional helper method that can resolve - multiple App Links in a single call. - - @discussion - Usage of this type requires a client token. See `[FBSDKSettings setClientToken:]` and linking - Bolts.framework - */ -@interface FBSDKAppLinkResolver : NSObject - -/*! - @abstract Asynchronously resolves App Link data for multiple URLs. - - @param urls An array of NSURLs to resolve into App Links. - @returns A BFTask that will return dictionary mapping input NSURLs to their - corresponding BFAppLink. - - @discussion - You should set the client token before making this call. See `[FBSDKSettings setClientToken:]` - */ -- (BFTask *)appLinksFromURLsInBackground:(NSArray *)urls; - -/*! - @abstract Allocates and initializes a new instance of FBSDKAppLinkResolver. - */ -+ (instancetype)resolver; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h deleted file mode 100644 index 216b71d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKAppLinkUtility.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract Describes the callback for fetchDeferredAppLink. - @param url the url representing the deferred App Link - @param error the error during the request, if any - - @discussion The url may also have a fb_click_time_utc query parameter that - represents when the click occurred that caused the deferred App Link to be created. - */ -typedef void (^FBSDKDeferredAppLinkHandler)(NSURL *url, NSError *error); - -/*! - @abstract Class containing App Links related utility methods. - */ -@interface FBSDKAppLinkUtility : NSObject - -/*! - @abstract - Call this method from the main thread to fetch deferred applink data if you use Mobile App - Engagement Ads (https://developers.facebook.com/docs/ads-for-apps/mobile-app-ads-engagement). - This may require a network round trip. If successful, the handler is invoked with the link - data (this will only return a valid URL once, and future calls will result in a nil URL - value in the callback). - - @param handler the handler to be invoked if there is deferred App Link data - - @discussion The handler may contain an NSError instance to capture any errors. In the - common case where there simply was no app link data, the NSError instance will be nil. - - This method should only be called from a location that occurs after any launching URL has - been processed (e.g., you should call this method from your application delegate's - applicationDidBecomeActive:). - */ -+ (void)fetchDeferredAppLink:(FBSDKDeferredAppLinkHandler)handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h deleted file mode 100644 index 857acd0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKApplicationDelegate.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @class FBSDKApplicationDelegate - - @abstract - The FBSDKApplicationDelegate is designed to post process the results from Facebook Login - or Facebook Dialogs (or any action that requires switching over to the native Facebook - app or Safari). - - @discussion - The methods in this class are designed to mirror those in UIApplicationDelegate, and you - should call them in the respective methods in your AppDelegate implementation. - */ -@interface FBSDKApplicationDelegate : NSObject - -/*! - @abstract Gets the singleton instance. - */ -+ (instancetype)sharedInstance; - -/*! - @abstract - Call this method from the [UIApplicationDelegate application:openURL:sourceApplication:annotation:] method - of the AppDelegate for your app. It should be invoked for the proper processing of responses during interaction - with the native Facebook app or Safari as part of SSO authorization flow or Facebook dialogs. - - @param application The application as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - @param url The URL as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - @param sourceApplication The sourceApplication as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - @param annotation The annotation as passed to [UIApplicationDelegate application:openURL:sourceApplication:annotation:]. - - @return YES if the url was intended for the Facebook SDK, NO if not. - */ -- (BOOL)application:(UIApplication *)application - openURL:(NSURL *)url - sourceApplication:(NSString *)sourceApplication - annotation:(id)annotation; - -/*! - @abstract - Call this method from the [UIApplicationDelegate application:didFinishLaunchingWithOptions:] method - of the AppDelegate for your app. It should be invoked for the proper use of the Facebook SDK. - - @param application The application as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - - @param launchOptions The launchOptions as passed to [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - - @return YES if the url was intended for the Facebook SDK, NO if not. - */ -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKButton.h deleted file mode 100644 index 8132998..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKButton.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract A base class for common SDK buttons. - */ -@interface FBSDKButton : UIButton - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKConstants.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKConstants.h deleted file mode 100644 index 5f53161..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKConstants.h +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract The error domain for all errors from FBSDKCoreKit. - @discussion Error codes from the SDK in the range 0-99 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKErrorDomain; - -/*! - @typedef NS_ENUM(NSInteger, FBSDKErrorCode) - @abstract Error codes for FBSDKErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKErrorCode) -{ - /*! - @abstract Reserved. - */ - FBSDKReservedErrorCode = 0, - - /*! - @abstract The error code for errors from invalid encryption on incoming encryption URLs. - */ - FBSDKEncryptionErrorCode, - - /*! - @abstract The error code for errors from invalid arguments to SDK methods. - */ - FBSDKInvalidArgumentErrorCode, - - /*! - @abstract The error code for unknown errors. - */ - FBSDKUnknownErrorCode, - - /*! - @abstract A request failed due to a network error. Use NSUnderlyingErrorKey to retrieve - the error object from the NSURLConnection for more information. - */ - FBSDKNetworkErrorCode, - - /*! - @abstract The error code for errors encounted during an App Events flush. - */ - FBSDKAppEventsFlushErrorCode, - - /*! - @abstract An endpoint that returns a binary response was used with FBSDKGraphRequestConnection. - @discussion Endpoints that return image/jpg, etc. should be accessed using NSURLRequest - */ - FBSDKGraphRequestNonTextMimeTypeReturnedErrorCode, - - /*! - @abstract The operation failed because the server returned an unexpected response. - @discussion You can get this error if you are not using the most recent SDK, or you are accessing a version of the - Graph API incompatible with the current SDK. - */ - FBSDKGraphRequestProtocolMismatchErrorCode, - - /*! - @abstract The Graph API returned an error. - @discussion See below for useful userInfo keys (beginning with FBSDKGraphRequestError*) - */ - FBSDKGraphRequestGraphAPIErrorCode, - - /*! - @abstract The specified dialog configuration is not available. - @discussion This error may signify that the configuration for the dialogs has not yet been downloaded from the server - or that the dialog is unavailable. Subsequent attempts to use the dialog may succeed as the configuration is loaded. - */ - FBSDKDialogUnavailableErrorCode, - - /*! - @abstract Indicates an operation failed because a required access token was not found. - */ - FBSDKAccessTokenRequiredErrorCode, - - /*! - @abstract Indicates an app switch (typically for a dialog) failed because the destination app is out of date. - */ - FBSDKAppVersionUnsupportedErrorCode, - - /*! - @abstract Indicates an app switch to the browser (typically for a dialog) failed. - */ - FBSDKBrowswerUnavailableErrorCode, -}; - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) - @abstract Describes the category of Facebook error. See `FBSDKGraphRequestErrorCategoryKey`. - */ -typedef NS_ENUM(NSUInteger, FBSDKGraphRequestErrorCategory) -{ - /*! The default error category that is not known to be recoverable. Check `FBSDKLocalizedErrorDescriptionKey` for a user facing message. */ - FBSDKGraphRequestErrorCategoryOther = 0, - /*! Indicates the error is temporary (such as server throttling). While a recoveryAttempter will be provided with the error instance, the attempt is guaranteed to succeed so you can simply retry the operation if you do not want to present an alert. */ - FBSDKGraphRequestErrorCategoryTransient = 1, - /*! Indicates the error can be recovered (such as requiring a login). A recoveryAttempter will be provided with the error instance that can take UI action. */ - FBSDKGraphRequestErrorCategoryRecoverable = 2 -}; - -/* - @methodgroup error userInfo keys - */ - -/*! - @abstract The userInfo key for the invalid collection for errors with FBSDKInvalidArgumentErrorCode. - @discussion If the invalid argument is a collection, the collection can be found with this key and the individual - invalid item can be found with FBSDKErrorArgumentValueKey. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentCollectionKey; - -/*! - @abstract The userInfo key for the invalid argument name for errors with FBSDKInvalidArgumentErrorCode. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentNameKey; - -/*! - @abstract The userInfo key for the invalid argument value for errors with FBSDKInvalidArgumentErrorCode. - */ -FBSDK_EXTERN NSString *const FBSDKErrorArgumentValueKey; - -/*! - @abstract The userInfo key for the message for developers in NSErrors that originate from the SDK. - @discussion The developer message will not be localized and is not intended to be presented within the app. - */ -FBSDK_EXTERN NSString *const FBSDKErrorDeveloperMessageKey; - -/*! - @abstract The userInfo key describing a localized description that can be presented to the user. - */ -FBSDK_EXTERN NSString *const FBSDKErrorLocalizedDescriptionKey; - -/*! - @abstract The userInfo key describing a localized title that can be presented to the user, used with `FBSDKLocalizedErrorDescriptionKey`. - */ -FBSDK_EXTERN NSString *const FBSDKErrorLocalizedTitleKey; - -/* - @methodgroup FBSDKGraphRequest error userInfo keys - */ - -/*! - @abstract The userInfo key describing the error category, for error recovery purposes. - @discussion See `FBSDKGraphErrorRecoveryProcessor` and `[FBSDKGraphRequest disableErrorRecovery]`. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorCategoryKey; - -/* - @abstract The userInfo key for the Graph API error code. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorCode; - -/* - @abstract The userInfo key for the Graph API error subcode. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorGraphErrorSubcode; - -/* - @abstract The userInfo key for the HTTP status code. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorHTTPStatusCodeKey; - -/* - @abstract The userInfo key for the raw JSON response. - */ -FBSDK_EXTERN NSString *const FBSDKGraphRequestErrorParsedJSONResponseKey; - -/*! - @abstract a formal protocol very similar to the informal protocol NSErrorRecoveryAttempting - */ -@protocol FBSDKErrorRecoveryAttempting - -/*! - @abstract attempt the recovery - @param error the error - @param recoveryOptionIndex the selected option index - @param delegate the delegate - @param didRecoverSelector the callback selector, see discussion. - @param contextInfo context info to pass back to callback selector, see discussion. - @discussion - Given that an error alert has been presented document-modally to the user, and the user has chosen one of the error's recovery options, attempt recovery from the error, and send the selected message to the specified delegate. The option index is an index into the error's array of localized recovery options. The method selected by didRecoverSelector must have the same signature as: - - - (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; - - The value passed for didRecover must be YES if error recovery was completely successful, NO otherwise. - */ -- (void)attemptRecoveryFromError:(NSError *)error optionIndex:(NSUInteger)recoveryOptionIndex delegate:(id)delegate didRecoverSelector:(SEL)didRecoverSelector contextInfo:(void *)contextInfo; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCopying.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCopying.h deleted file mode 100644 index f4ad767..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCopying.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract Extension protocol for NSCopying that adds the copy method, which is implemented on NSObject. - @discussion NSObject implicitly conforms to this protocol. - */ -@protocol FBSDKCopying - -/*! - @abstract Implemented by NSObject as a convenience to copyWithZone:. - @return A copy of the receiver. - */ -- (id)copy; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h deleted file mode 100644 index 3b78900..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKCoreKit.h +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#define FBSDK_VERSION_STRING @"4.7.0" -#define FBSDK_TARGET_PLATFORM_VERSION @"v2.5" diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h deleted file mode 100644 index d2b0313..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphErrorRecoveryProcessor.h +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKConstants.h" - -@class FBSDKGraphErrorRecoveryProcessor; -@class FBSDKGraphRequest; - -/*! - @abstract Defines a delegate for `FBSDKGraphErrorRecoveryProcessor`. - */ -@protocol FBSDKGraphErrorRecoveryProcessorDelegate - -/*! - @abstract Indicates the error recovery has been attempted. - @param processor the processor instance. - @param didRecover YES if the recovery was successful. - @param error the error that that was attempted to be recovered from. - */ -- (void)processorDidAttemptRecovery:(FBSDKGraphErrorRecoveryProcessor *)processor didRecover:(BOOL)didRecover error:(NSError *)error; - -@optional -/*! - @abstract Indicates the processor is about to process the error. - @param processor the processor instance. - @param error the error is about to be processed. - @discussion return NO if the processor should not process the error. For example, - if you want to prevent alerts of localized messages but otherwise perform retries and recoveries, - you could return NO for errors where userInfo[FBSDKGraphRequestErrorCategoryKey] equal to FBSDKGraphRequestErrorCategoryOther - */ -- (BOOL)processorWillProcessError:(FBSDKGraphErrorRecoveryProcessor *)processor error:(NSError *)error; - -@end - -/*! - @abstract Defines a type that can process Facebook NSErrors with best practices. - @discussion Facebook NSErrors can contain FBSDKErrorRecoveryAttempting instances to recover from errors, or - localized messages to present to the user. This class will process the instances as follows: - - 1. If the error is temporary as indicated by FBSDKGraphRequestErrorCategoryKey, assume the recovery succeeded and - notify the delegate. - 2. If a FBSDKErrorRecoveryAttempting instance is available, display an alert (dispatched to main thread) - with the recovery options and call the instance's [ attemptRecoveryFromError:optionIndex:...]. - 3. If a FBSDKErrorRecoveryAttempting is not available, check the userInfo for FBSDKLocalizedErrorDescriptionKey - and present that in an alert (dispatched to main thread). - - By default, FBSDKGraphRequests use this type to process errors and retry the request upon a successful - recovery. - - Note that Facebook recovery attempters can present UI or even cause app switches (such as to login). Any such - work is dispatched to the main thread (therefore your request handlers may then run on the main thread). - - Login recovery requires FBSDKLoginKit. Login will use FBSDKLoginBehaviorNative and will prompt the user - for all permissions last granted. If any are declined on the new request, the recovery is not successful but - the `[FBSDKAccessToken currentAccessToken]` might still have been updated. - . - */ -@interface FBSDKGraphErrorRecoveryProcessor : NSObject - -/*! - @abstract Gets the delegate. Note this is a strong reference, and is nil'ed out after recovery is complete. - */ -@property (nonatomic, strong, readonly) iddelegate; - -/*! - @abstract Attempts to process the error, return YES if the error can be processed. - @param error the error to process. - @param request the relateed request that may be reissued. - @param delegate the delegate that will be retained until recovery is complete. - */ -- (BOOL)processError:(NSError *)error request:(FBSDKGraphRequest *)request delegate:(id) delegate; - -/*! - @abstract The callback for FBSDKErrorRecoveryAttempting - @param didRecover if the recovery succeeded - @param contextInfo unused - */ -- (void)didPresentErrorWithRecovery:(BOOL)didRecover contextInfo:(void *)contextInfo; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h deleted file mode 100644 index 5ae03e2..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequest.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKAccessToken; - -/*! - @abstract Represents a request to the Facebook Graph API. - - @discussion `FBSDKGraphRequest` encapsulates the components of a request (the - Graph API path, the parameters, error recovery behavior) and should be - used in conjunction with `FBSDKGraphRequestConnection` to issue the request. - - Nearly all Graph APIs require an access token. Unless specified, the - `[FBSDKAccessToken currentAccessToken]` is used. Therefore, most requests - will require login first (see `FBSDKLoginManager` in FBSDKLoginKit.framework). - - A `- start` method is provided for convenience for single requests. - - By default, FBSDKGraphRequest will attempt to recover any errors returned from - Facebook. You can disable this via `disableErrorRecovery:`. - @see FBSDKGraphErrorRecoveryProcessor - */ -@interface FBSDKGraphRequest : NSObject - -/*! - @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. - @param graphPath the graph path (e.g., @"me"). - @param parameters the optional parameters dictionary. - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters; - -/*! - @abstract Initializes a new instance that use use `[FBSDKAccessToken currentAccessToken]`. - @param graphPath the graph path (e.g., @"me"). - @param parameters the optional parameters dictionary. - @param HTTPMethod the optional HTTP method. nil defaults to @"GET". - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - HTTPMethod:(NSString *)HTTPMethod; - -/*! - @abstract Initializes a new instance. - @param graphPath the graph path (e.g., @"me"). - @param parameters the optional parameters dictionary. - @param tokenString the token string to use. Specifying nil will cause no token to be used. - @param version the optional Graph API version (e.g., @"v2.0"). nil defaults to FBSDK_TARGET_PLATFORM_VERSION. - @param HTTPMethod the optional HTTP method (e.g., @"POST"). nil defaults to @"GET". - */ -- (instancetype)initWithGraphPath:(NSString *)graphPath - parameters:(NSDictionary *)parameters - tokenString:(NSString *)tokenString - version:(NSString *)version - HTTPMethod:(NSString *)HTTPMethod -NS_DESIGNATED_INITIALIZER; - -/*! - @abstract The request parameters. - */ -@property (nonatomic, strong, readonly) NSMutableDictionary *parameters; - -/*! - @abstract The access token string used by the request. - */ -@property (nonatomic, copy, readonly) NSString *tokenString; - -/*! - @abstract The Graph API endpoint to use for the request, for example "me". - */ -@property (nonatomic, copy, readonly) NSString *graphPath; - -/*! - @abstract The HTTPMethod to use for the request, for example "GET" or "POST". - */ -@property (nonatomic, copy, readonly) NSString *HTTPMethod; - -/*! - @abstract The Graph API version to use (e.g., "v2.0") - */ -@property (nonatomic, copy, readonly) NSString *version; - -/*! - @abstract If set, disables the automatic error recovery mechanism. - @param disable whether to disable the automatic error recovery mechanism - @discussion By default, non-batched FBSDKGraphRequest instances will automatically try to recover - from errors by constructing a `FBSDKGraphErrorRecoveryProcessor` instance that - re-issues the request on successful recoveries. The re-issued request will call the same - handler as the receiver but may occur with a different `FBSDKGraphRequestConnection` instance. - - This will override [FBSDKSettings setGraphErrorRecoveryDisabled:]. - */ -- (void)setGraphErrorRecoveryDisabled:(BOOL)disable; - -/*! - @abstract Starts a connection to the Graph API. - @param handler The handler block to call when the request completes. - */ -- (FBSDKGraphRequestConnection *)startWithCompletionHandler:(FBSDKGraphRequestHandler)handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h deleted file mode 100644 index 79ffb3f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestConnection.h +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@class FBSDKGraphRequest; -@class FBSDKGraphRequestConnection; - -/*! - @typedef FBSDKGraphRequestHandler - - @abstract - A block that is passed to addRequest to register for a callback with the results of that - request once the connection completes. - - @discussion - Pass a block of this type when calling addRequest. This will be called once - the request completes. The call occurs on the UI thread. - - @param connection The `FBSDKGraphRequestConnection` that sent the request. - - @param result The result of the request. This is a translation of - JSON data to `NSDictionary` and `NSArray` objects. This - is nil if there was an error. - - @param error The `NSError` representing any error that occurred. - - */ -typedef void (^FBSDKGraphRequestHandler)(FBSDKGraphRequestConnection *connection, - id result, - NSError *error); - -/*! - @protocol - - @abstract - The `FBSDKGraphRequestConnectionDelegate` protocol defines the methods used to receive network - activity progress information from a . - */ -@protocol FBSDKGraphRequestConnectionDelegate - -@optional - -/*! - @method - - @abstract - Tells the delegate the request connection will begin loading - - @discussion - If the is created using one of the convenience factory methods prefixed with - start, the object returned from the convenience method has already begun loading and this method - will not be called when the delegate is set. - - @param connection The request connection that is starting a network request - */ -- (void)requestConnectionWillBeginLoading:(FBSDKGraphRequestConnection *)connection; - -/*! - @method - - @abstract - Tells the delegate the request connection finished loading - - @discussion - If the request connection completes without a network error occuring then this method is called. - Invocation of this method does not indicate success of every made, only that the - request connection has no further activity. Use the error argument passed to the FBSDKGraphRequestHandler - block to determine success or failure of each . - - This method is invoked after the completion handler for each . - - @param connection The request connection that successfully completed a network request - */ -- (void)requestConnectionDidFinishLoading:(FBSDKGraphRequestConnection *)connection; - -/*! - @method - - @abstract - Tells the delegate the request connection failed with an error - - @discussion - If the request connection fails with a network error then this method is called. The `error` - argument specifies why the network connection failed. The `NSError` object passed to the - FBSDKGraphRequestHandler block may contain additional information. - - @param connection The request connection that successfully completed a network request - @param error The `NSError` representing the network error that occurred, if any. May be nil - in some circumstances. Consult the `NSError` for the for reliable - failure information. - */ -- (void)requestConnection:(FBSDKGraphRequestConnection *)connection - didFailWithError:(NSError *)error; - -/*! - @method - - @abstract - Tells the delegate how much data has been sent and is planned to send to the remote host - - @discussion - The byte count arguments refer to the aggregated objects, not a particular . - - Like `NSURLConnection`, the values may change in unexpected ways if data needs to be resent. - - @param connection The request connection transmitting data to a remote host - @param bytesWritten The number of bytes sent in the last transmission - @param totalBytesWritten The total number of bytes sent to the remote host - @param totalBytesExpectedToWrite The total number of bytes expected to send to the remote host - */ -- (void)requestConnection:(FBSDKGraphRequestConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten -totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; - -@end - -/*! - @class FBSDKGraphRequestConnection - - @abstract - The `FBSDKGraphRequestConnection` represents a single connection to Facebook to service a request. - - @discussion - The request settings are encapsulated in a reusable object. The - `FBSDKGraphRequestConnection` object encapsulates the concerns of a single communication - e.g. starting a connection, canceling a connection, or batching requests. - - */ -@interface FBSDKGraphRequestConnection : NSObject - -/*! - @abstract - The delegate object that receives updates. - */ -@property (nonatomic, assign) id delegate; - -/*! - @abstract Gets or sets the timeout interval to wait for a response before giving up. - */ -@property (nonatomic) NSTimeInterval timeout; - -/*! - @abstract - The raw response that was returned from the server. (readonly) - - @discussion - This property can be used to inspect HTTP headers that were returned from - the server. - - The property is nil until the request completes. If there was a response - then this property will be non-nil during the FBSDKGraphRequestHandler callback. - */ -@property (nonatomic, retain, readonly) NSHTTPURLResponse *URLResponse; - -/*! - @methodgroup Class methods - */ - -/*! - @method - - @abstract - This method sets the default timeout on all FBSDKGraphRequestConnection instances. Defaults to 60 seconds. - - @param defaultConnectionTimeout The timeout interval. - */ -+ (void)setDefaultConnectionTimeout:(NSTimeInterval)defaultConnectionTimeout; - -/*! - @methodgroup Adding requests - */ - -/*! - @method - - @abstract - This method adds an object to this connection. - - @param request A request to be included in the round-trip when start is called. - @param handler A handler to call back when the round-trip completes or times out. - - @discussion - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler; - -/*! - @method - - @abstract - This method adds an object to this connection. - - @param request A request to be included in the round-trip when start is called. - - @param handler A handler to call back when the round-trip completes or times out. - The handler will be invoked on the main thread. - - @param name An optional name for this request. This can be used to feed - the results of one request to the input of another in the same - `FBSDKGraphRequestConnection` as described in - [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). - - @discussion - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. This request can be named - to allow for using the request's response in a subsequent request. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchEntryName:(NSString *)name; - -/*! - @method - - @abstract - This method adds an object to this connection. - - @param request A request to be included in the round-trip when start is called. - - @param handler A handler to call back when the round-trip completes or times out. - - @param batchParameters The optional dictionary of parameters to include for this request - as described in [Graph API Batch Requests]( https://developers.facebook.com/docs/reference/api/batch/ ). - Examples include "depends_on", "name", or "omit_response_on_success". - - @discussion - The completion handler is retained until the block is called upon the - completion or cancellation of the connection. This request can be named - to allow for using the request's response in a subsequent request. - */ -- (void)addRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters; - -/*! - @methodgroup Instance methods - */ - -/*! - @method - - @abstract - Signals that a connection should be logically terminated as the - application is no longer interested in a response. - - @discussion - Synchronously calls any handlers indicating the request was cancelled. Cancel - does not guarantee that the request-related processing will cease. It - does promise that all handlers will complete before the cancel returns. A call to - cancel prior to a start implies a cancellation of all requests associated - with the connection. - */ -- (void)cancel; - -/*! - @method - - @abstract - This method starts a connection with the server and is capable of handling all of the - requests that were added to the connection. - - @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. - See `setDelegateQueue:` for other options. - - This method cannot be called twice for an `FBSDKGraphRequestConnection` instance. - */ -- (void)start; - -/*! - @abstract Determines the operation queue that is used to call methods on the connection's delegate. - @param queue The operation queue to use when calling delegate methods. - @discussion By default, a connection is scheduled on the current thread in the default mode when it is created. - You cannot reschedule a connection after it has started. - - This is very similar to `[NSURLConnection setDelegateQueue:]`. - */ -- (void)setDelegateQueue:(NSOperationQueue *)queue; - -/*! - @method - - @abstract - Overrides the default version for a batch request - - @discussion - The SDK automatically prepends a version part, such as "v2.0" to API paths in order to simplify API versioning - for applications. If you want to override the version part while using batch requests on the connection, call - this method to set the version for the batch request. - - @param version This is a string in the form @"v2.0" which will be used for the version part of an API path - */ -- (void)overrideVersionPartWith:(NSString *)version; - -@end - -/*! - @abstract The key in the result dictionary for requests to old versions of the Graph API - whose response is not a JSON object. - - @discussion When a request returns a non-JSON response (such as a "true" literal), that response - will be wrapped into a dictionary using this const as the key. This only applies for very few Graph API - prior to v2.1. - */ -FBSDK_EXTERN NSString *const FBSDKNonJSONResponseProperty; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h deleted file mode 100644 index c179e29..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKGraphRequestDataAttachment.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract A container class for data attachments so that additional metadata can be provided about the attachment. - */ -@interface FBSDKGraphRequestDataAttachment : NSObject - -/*! - @abstract Initializes the receiver with the attachment data and metadata. - @param data The attachment data (retained, not copied) - @param filename The filename for the attachment - @param contentType The content type for the attachment - */ -- (instancetype)initWithData:(NSData *)data - filename:(NSString *)filename - contentType:(NSString *)contentType -NS_DESIGNATED_INITIALIZER; - -/*! - @abstract The content type for the attachment. - */ -@property (nonatomic, copy, readonly) NSString *contentType; - -/*! - @abstract The attachment data. - */ -@property (nonatomic, strong, readonly) NSData *data; - -/*! - @abstract The filename for the attachment. - */ -@property (nonatomic, copy, readonly) NSString *filename; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMacros.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMacros.h deleted file mode 100644 index fd2e2ff..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMacros.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#ifdef __cplusplus -#define FBSDK_EXTERN extern "C" __attribute__((visibility ("default"))) -#else -#define FBSDK_EXTERN extern __attribute__((visibility ("default"))) -#endif - -#define FBSDK_STATIC_INLINE static inline - -#define FBSDK_NO_DESIGNATED_INITIALIZER() \ -@throw [NSException exceptionWithName:NSInvalidArgumentException \ - reason:[NSString stringWithFormat:@"unrecognized selector sent to instance %p", self] \ - userInfo:nil] - -#define FBSDK_NOT_DESIGNATED_INITIALIZER(DESIGNATED_INITIALIZER) \ -@throw [NSException exceptionWithName:NSInvalidArgumentException \ - reason:[NSString stringWithFormat:@"Please use the designated initializer [%p %@]", \ - self, \ - NSStringFromSelector(@selector(DESIGNATED_INITIALIZER))] \ - userInfo:nil] diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h deleted file mode 100644 index 621fac9..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKMutableCopying.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract Extension protocol for NSMutableCopying that adds the mutableCopy method, which is implemented on NSObject. - @discussion NSObject implicitly conforms to this protocol. - */ -@protocol FBSDKMutableCopying - -/*! - @abstract Implemented by NSObject as a convenience to mutableCopyWithZone:. - @return A mutable copy of the receiver. - */ -- (id)mutableCopy; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfile.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfile.h deleted file mode 100644 index 11da3d9..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfile.h +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import "FBSDKMacros.h" -#import "FBSDKProfilePictureView.h" - -/*! - @abstract Notification indicating that the `currentProfile` has changed. - @discussion the userInfo dictionary of the notification will contain keys - `FBSDKProfileChangeOldKey` and - `FBSDKProfileChangeNewKey`. - */ -FBSDK_EXTERN NSString *const FBSDKProfileDidChangeNotification; - -/* @abstract key in notification's userInfo object for getting the old profile. - @discussion If there was no old profile, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKProfileChangeOldKey; - -/* @abstract key in notification's userInfo object for getting the new profile. - @discussion If there is no new profile, the key will not be present. - */ -FBSDK_EXTERN NSString *const FBSDKProfileChangeNewKey; - -/*! - @abstract Represents an immutable Facebook profile - @discussion This class provides a global "currentProfile" instance to more easily - add social context to your application. When the profile changes, a notification is - posted so that you can update relevant parts of your UI and is persisted to NSUserDefaults. - - Typically, you will want to call `enableUpdatesOnAccessTokenChange:YES` so that - it automatically observes changes to the `[FBSDKAccessToken currentAccessToken]`. - - You can use this class to build your own `FBSDKProfilePictureView` or in place of typical requests to "/me". - */ -@interface FBSDKProfile : NSObject - -/*! - @abstract initializes a new instance. - @param userID the user ID - @param firstName the user's first name - @param middleName the user's middle name - @param lastName the user's last name - @param name the user's complete name - @param linkURL the link for this profile - @param refreshDate the optional date this profile was fetched. Defaults to [NSDate date]. - */ -- (instancetype)initWithUserID:(NSString *)userID - firstName:(NSString *)firstName - middleName:(NSString *)middleName - lastName:(NSString *)lastName - name:(NSString *)name - linkURL:(NSURL *)linkURL - refreshDate:(NSDate *)refreshDate NS_DESIGNATED_INITIALIZER; -/*! - @abstract The user id - */ -@property (nonatomic, readonly) NSString *userID; -/*! - @abstract The user's first name - */ -@property (nonatomic, readonly) NSString *firstName; -/*! - @abstract The user's middle name - */ -@property (nonatomic, readonly) NSString *middleName; -/*! - @abstract The user's last name - */ -@property (nonatomic, readonly) NSString *lastName; -/*! - @abstract The user's complete name - */ -@property (nonatomic, readonly) NSString *name; -/*! - @abstract A URL to the user's profile. - @discussion Consider using Bolts and `FBSDKAppLinkResolver` to resolve this - to an app link to link directly to the user's profile in the Facebook app. - */ -@property (nonatomic, readonly) NSURL *linkURL; - -/*! - @abstract The last time the profile data was fetched. - */ -@property (nonatomic, readonly) NSDate *refreshDate; - -/*! - @abstract Gets the current FBSDKProfile instance. - */ -+ (FBSDKProfile *)currentProfile; - -/*! - @abstract Sets the current instance and posts the appropriate notification if the profile parameter is different - than the receiver. - @param profile the profile to set - @discussion This persists the profile to NSUserDefaults. - */ -+ (void)setCurrentProfile:(FBSDKProfile *)profile; - -/*! - @abstract Indicates if `currentProfile` will automatically observe `FBSDKAccessTokenDidChangeNotification` notifications - @param enable YES is observing - @discussion If observing, this class will issue a graph request for public profile data when the current token's userID - differs from the current profile. You can observe `FBSDKProfileDidChangeNotification` for when the profile is updated. - - Note that if `[FBSDKAccessToken currentAccessToken]` is unset, the `currentProfile` instance remains. It's also possible - for `currentProfile` to return nil until the data is fetched. - */ -+ (void)enableUpdatesOnAccessTokenChange:(BOOL)enable; - -/*! - @abstract A convenience method for returning a complete `NSURL` for retrieving the user's profile image. - @param mode The picture mode - @param size The height and width. This will be rounded to integer precision. - */ -- (NSURL *)imageURLForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size; - -/*! - @abstract A convenience method for returning a Graph API path for retrieving the user's profile image. - @deprecated use `imageURLForPictureMode:size:` instead - @discussion You can pass this to a `FBSDKGraphRequest` instance to download the image. - @param mode The picture mode - @param size The height and width. This will be rounded to integer precision. - */ -- (NSString *)imagePathForPictureMode:(FBSDKProfilePictureMode)mode size:(CGSize)size -__attribute__ ((deprecated("use imageURLForPictureMode:size: instead"))); - -/*! - @abstract Returns YES if the profile is equivalent to the receiver. - @param profile the profile to compare to. - */ -- (BOOL)isEqualToProfile:(FBSDKProfile *)profile; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h deleted file mode 100644 index f1f64cb..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKProfilePictureView.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @typedef FBSDKProfilePictureMode enum - @abstract Defines the aspect ratio mode for the source image of the profile picture. - */ -typedef NS_ENUM(NSUInteger, FBSDKProfilePictureMode) -{ - /*! - @abstract A square cropped version of the image will be included in the view. - */ - FBSDKProfilePictureModeSquare, - /*! - @abstract The original picture's aspect ratio will be used for the source image in the view. - */ - FBSDKProfilePictureModeNormal, -}; - -/*! - @abstract A view to display a profile picture. - */ -@interface FBSDKProfilePictureView : UIView - -/*! - @abstract The mode for the receiver to determine the aspect ratio of the source image. - */ -@property (nonatomic, assign) FBSDKProfilePictureMode pictureMode; - -/*! - @abstract The profile ID to show the picture for. - */ -@property (nonatomic, copy) NSString *profileID; - -/*! - @abstract Explicitly marks the receiver as needing to update the image. - @discussion This method is called whenever any properties that affect the source image are modified, but this can also - be used to trigger a manual update of the image if it needs to be re-downloaded. - */ -- (void)setNeedsImageUpdate; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKSettings.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKSettings.h deleted file mode 100644 index edc0040..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKSettings.h +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/* - * Constants defining logging behavior. Use with <[FBSDKSettings setLoggingBehavior]>. - */ - -/*! Include access token in logging. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAccessTokens; - -/*! Log performance characteristics */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorPerformanceCharacteristics; - -/*! Log FBSDKAppEvents interactions */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorAppEvents; - -/*! Log Informational occurrences */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorInformational; - -/*! Log cache errors. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorCacheErrors; - -/*! Log errors from SDK UI controls */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorUIControlErrors; - -/*! Log debug warnings from API response, i.e. when friends fields requested, but user_friends permission isn't granted. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugWarning; - -/*! Log warnings from API response, i.e. when requested feature will be deprecated in next version of API. - Info is the lowest level of severity, using it will result in logging all previously mentioned levels. - */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorGraphAPIDebugInfo; - -/*! Log errors from SDK network requests */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorNetworkRequests; - -/*! Log errors likely to be preventable by the developer. This is in the default set of enabled logging behaviors. */ -FBSDK_EXTERN NSString *const FBSDKLoggingBehaviorDeveloperErrors; - -@interface FBSDKSettings : NSObject - -/*! - @abstract Get the Facebook App ID used by the SDK. - @discussion If not explicitly set, the default will be read from the application's plist (FacebookAppID). - */ -+ (NSString *)appID; - -/*! - @abstract Set the Facebook App ID to be used by the SDK. - @param appID The Facebook App ID to be used by the SDK. - */ -+ (void)setAppID:(NSString *)appID; - -/*! - @abstract Get the default url scheme suffix used for sessions. - @discussion If not explicitly set, the default will be read from the application's plist (FacebookUrlSchemeSuffix). - */ -+ (NSString *)appURLSchemeSuffix; - -/*! - @abstract Set the app url scheme suffix used by the SDK. - @param appURLSchemeSuffix The url scheme suffix to be used by the SDK. - */ -+ (void)setAppURLSchemeSuffix:(NSString *)appURLSchemeSuffix; - -/*! - @abstract Retrieve the Client Token that has been set via [FBSDKSettings setClientToken]. - @discussion If not explicitly set, the default will be read from the application's plist (FacebookClientToken). - */ -+ (NSString *)clientToken; - -/*! - @abstract Sets the Client Token for the Facebook App. - @discussion This is needed for certain API calls when made anonymously, without a user-based access token. - @param clientToken The Facebook App's "client token", which, for a given appid can be found in the Security - section of the Advanced tab of the Facebook App settings found at - */ -+ (void)setClientToken:(NSString *)clientToken; - -/*! - @abstract A convenient way to toggle error recovery for all FBSDKGraphRequest instances created after this is set. - @param disableGraphErrorRecovery YES or NO. - */ -+ (void)setGraphErrorRecoveryDisabled:(BOOL)disableGraphErrorRecovery; - -/*! - @abstract Get the Facebook Display Name used by the SDK. - @discussion If not explicitly set, the default will be read from the application's plist (FacebookDisplayName). - */ -+ (NSString *)displayName; - -/*! - @abstract Set the default Facebook Display Name to be used by the SDK. - @discussion This should match the Display Name that has been set for the app with the corresponding Facebook App ID, - in the Facebook App Dashboard. - @param displayName The Facebook Display Name to be used by the SDK. - */ -+ (void)setDisplayName:(NSString *)displayName; - -/*! - @abstract Get the Facebook domain part. - @discussion If not explicitly set, the default will be read from the application's plist (FacebookDomainPart). - */ -+ (NSString *)facebookDomainPart; - -/*! - @abstract Set the subpart of the Facebook domain. - @discussion This can be used to change the Facebook domain (e.g. @"beta") so that requests will be sent to - graph.beta.facebook.com - @param facebookDomainPart The domain part to be inserted into facebook.com. - */ -+ (void)setFacebookDomainPart:(NSString *)facebookDomainPart; - -/*! - @abstract The quality of JPEG images sent to Facebook from the SDK. - @discussion If not explicitly set, the default is 0.9. - @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ -+ (CGFloat)JPEGCompressionQuality; - -/*! - @abstract Set the quality of JPEG images sent to Facebook from the SDK. - @param JPEGCompressionQuality The quality for JPEG images, expressed as a value from 0.0 to 1.0. - @see [UIImageJPEGRepresentation](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIKitFunctionReference/#//apple_ref/c/func/UIImageJPEGRepresentation) */ -+ (void)setJPEGCompressionQuality:(CGFloat)JPEGCompressionQuality; - -/*! - @abstract - Gets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - */ -+ (BOOL)limitEventAndDataUsage; - -/*! - @abstract - Sets whether data such as that generated through FBSDKAppEvents and sent to Facebook should be restricted from being used for other than analytics and conversions. Defaults to NO. This value is stored on the device and persists across app launches. - - @param limitEventAndDataUsage The desired value. - */ -+ (void)setLimitEventAndDataUsage:(BOOL)limitEventAndDataUsage; - -/*! - @abstract Retrieve the current iOS SDK version. - */ -+ (NSString *)sdkVersion; - -/*! - @abstract Retrieve the current Facebook SDK logging behavior. - */ -+ (NSSet *)loggingBehavior; - -/*! - @abstract Set the current Facebook SDK logging behavior. This should consist of strings defined as - constants with FBSDKLoggingBehavior*. - - @param loggingBehavior A set of strings indicating what information should be logged. If nil is provided, the logging - behavior is reset to the default set of enabled behaviors. Set to an empty set in order to disable all logging. - - @discussion You can also define this via an array in your app plist with key "FacebookLoggingBehavior" or add and remove individual values via enableLoggingBehavior: or disableLogginBehavior: - */ -+ (void)setLoggingBehavior:(NSSet *)loggingBehavior; - -/*! - @abstract Enable a particular Facebook SDK logging behavior. - - @param loggingBehavior The LoggingBehavior to enable. This should be a string defined as a constant with FBSDKLoggingBehavior*. - */ -+ (void)enableLoggingBehavior:(NSString *)loggingBehavior; - -/*! - @abstract Disable a particular Facebook SDK logging behavior. - - @param loggingBehavior The LoggingBehavior to disable. This should be a string defined as a constant with FBSDKLoggingBehavior*. - */ -+ (void)disableLoggingBehavior:(NSString *)loggingBehavior; - -/*! - @abstract Set the user defaults key used by legacy token caches. - - @param tokenInformationKeyName the key used by legacy token caches. - - @discussion Use this only if you customized FBSessionTokenCachingStrategy in v3.x of - the Facebook SDK for iOS. -*/ -+ (void)setLegacyUserDefaultTokenInformationKeyName:(NSString *)tokenInformationKeyName; - -/*! - @abstract Get the user defaults key used by legacy token caches. -*/ -+ (NSString *)legacyUserDefaultTokenInformationKeyName; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h deleted file mode 100644 index 7d2e0ac..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKTestUsersManager.h +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -/*! - @typedef - - @abstract Callback block for returning an array of FBSDKAccessToken instances (and possibly `NSNull` instances); or an error. - */ -typedef void (^FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)(NSArray *tokens, NSError *error) ; - -/*! - @typedef - - @abstract Callback block for removing a test user. - */ -typedef void (^FBSDKTestUsersManagerRemoveTestAccountHandler)(NSError *error) ; - - -/*! - @class FBSDKTestUsersManager - @abstract Provides methods for managing test accounts for testing Facebook integration. - - @discussion Facebook allows developers to create test accounts for testing their applications' - Facebook integration (see https://developers.facebook.com/docs/test_users/). This class - simplifies use of these accounts for writing tests. It is not designed for use in - production application code. - - This class will make Graph API calls on behalf of your app to manage test accounts and requires - an app id and app secret. You will typically use this class to write unit or integration tests. - Make sure you NEVER include your app secret in your production app. - */ -@interface FBSDKTestUsersManager : NSObject - -/*! - @abstract construct or return the shared instance - @param appID the Facebook app id - @param appSecret the Facebook app secret - */ -+ (instancetype)sharedInstanceForAppID:(NSString *)appID appSecret:(NSString *)appSecret; - -/*! - @abstract retrieve FBSDKAccessToken instances for test accounts with the specific permissions. - @param arraysOfPermissions an array of permissions sets, such as @[ [NSSet setWithObject:@"email"], [NSSet setWithObject:@"user_birthday"]] - if you needed two test accounts with email and birthday permissions, respectively. You can pass in empty nested sets - if you need two arbitrary test accounts. For convenience, passing nil is treated as @[ [NSSet set] ] - for fetching a single test user. - @param createIfNotFound if YES, new test accounts are created if no test accounts existed that fit the permissions - requirement - @param handler the callback to invoke which will return an array of `FBAccessTokenData` instances or an `NSError`. - If param `createIfNotFound` is NO, the array may contain `[NSNull null]` instances. - - @discussion If you are requesting test accounts with differing number of permissions, try to order - `arrayOfPermissionsArrays` so that the most number of permissions come first to minimize creation of new - test accounts. - */ -- (void)requestTestAccountTokensWithArraysOfPermissions:(NSArray *)arraysOfPermissions - createIfNotFound:(BOOL)createIfNotFound - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; - -/*! - @abstract add a test account with the specified permissions - @param permissions the set of permissions, e.g., [NSSet setWithObjects:@"email", @"user_friends"] - @param handler the callback handler - */ -- (void)addTestAccountWithPermissions:(NSSet *)permissions - completionHandler:(FBSDKTestUsersManagerRetrieveTestAccountTokensHandler)handler; - -/*! - @abstract remove a test account for the given user id - @param userId the user id - @param handler the callback handler - */ -- (void)removeTestAccount:(NSString *)userId completionHandler:(FBSDKTestUsersManagerRemoveTestAccountHandler)handler; - -/*! - @abstract Make two test users friends with each other. - @param first the token of the first user - @param second the token of the second user - @param callback the callback handler - */ -- (void)makeFriendsWithFirst:(FBSDKAccessToken *)first second:(FBSDKAccessToken *)second callback:(void (^)(NSError *))callback; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKUtility.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKUtility.h deleted file mode 100644 index 46c490b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Headers/FBSDKUtility.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract Class to contain common utility methods. - */ -@interface FBSDKUtility : NSObject - -/*! - @abstract Parses a query string into a dictionary. - @param queryString The query string value. - @return A dictionary with the key/value pairs. - */ -+ (NSDictionary *)dictionaryWithQueryString:(NSString *)queryString; - -/*! - @abstract Constructs a query string from a dictionary. - @param dictionary The dictionary with key/value pairs for the query string. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @result Query string representation of the parameters. - */ -+ (NSString *)queryStringWithDictionary:(NSDictionary *)dictionary error:(NSError *__autoreleasing *)errorRef; - -/*! - @abstract Decodes a value from an URL. - @param value The value to decode. - @result The decoded value. - */ -+ (NSString *)URLDecode:(NSString *)value; - -/*! - @abstract Encodes a value for an URL. - @param value The value to encode. - @result The encoded value. - */ -+ (NSString *)URLEncode:(NSString *)value; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Info.plist deleted file mode 100644 index b6dda8e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Info.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Modules/module.modulemap deleted file mode 100644 index 3c3e6e6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/Modules/module.modulemap +++ /dev/null @@ -1,31 +0,0 @@ -framework module FBSDKCoreKit { - umbrella header "FBSDKCoreKit.h" - - export * - module * { export * } - - explicit module FBSDKButton { - header "FBSDKButton.h" - export * - } - - explicit module FBSDKAppLinkResolver { - header "FBSDKAppLinkResolver.h" - export * - } - - explicit module FBSDKGraphErrorRecoveryProcessor { - header "FBSDKGraphErrorRecoveryProcessor.h" - export * - } - - explicit module FBSDKGraphRequestDataAttachment { - header "FBSDKGraphRequestDataAttachment.h" - export * - } - - explicit module FBSDKTestUsersManager { - header "FBSDKTestUsersManager.h" - export * - } -} diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h deleted file mode 100644 index 7fa7d7f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKAccessTokenCacheV4.h +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKAccessToken.h" -#import "FBSDKAccessTokenCaching.h" - -@interface FBSDKAccessTokenCacheV4 : NSObject - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h deleted file mode 100644 index 7d488e7..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPICrypto.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKBridgeAPIRequest.h" - -@interface FBSDKBridgeAPICrypto : NSObject - -+ (void)addCipherKeyToQueryParameters:(NSMutableDictionary *)queryParameters; -+ (NSDictionary *)decryptResponseForRequest:(FBSDKBridgeAPIRequest *)request - queryParameters:(NSDictionary *)queryParameters - error:(NSError *__autoreleasing *)errorRef; -+ (void)reset; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h deleted file mode 100644 index 679577c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocol.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIProtocolType.h" - -@class FBSDKBridgeAPIRequest; - -FBSDK_EXTERN NSString *const FBSDKBridgeAPIAppIDKey; -FBSDK_EXTERN NSString *const FBSDKBridgeAPISchemeSuffixKey; -FBSDK_EXTERN NSString *const FBSDKBridgeAPIVersionKey; - -@protocol FBSDKBridgeAPIProtocol - -- (NSURL *)requestURLWithActionID:(NSString *)actionID - scheme:(NSString *)scheme - methodName:(NSString *)methodName - methodVersion:(NSString *)methodVersion - parameters:(NSDictionary *)parameters - error:(NSError *__autoreleasing *)errorRef; -- (NSDictionary *)responseParametersForActionID:(NSString *)actionID - queryParameters:(NSDictionary *)queryParameters - cancelled:(BOOL *)cancelledRef - error:(NSError *__autoreleasing *)errorRef; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h deleted file mode 100644 index 8fd34bd..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolNativeV1.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import "FBSDKBridgeAPIProtocol.h" - -typedef struct -{ - __unsafe_unretained NSString *bridgeArgs; - __unsafe_unretained NSString *methodArgs; - __unsafe_unretained NSString *methodVersion; -} FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1OutputKeysStruct FBSDKBridgeAPIProtocolNativeV1OutputKeys; - -typedef struct -{ - __unsafe_unretained NSString *actionID; - __unsafe_unretained NSString *appIcon; - __unsafe_unretained NSString *appName; - __unsafe_unretained NSString *sdkVersion; -} FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterOutputKeys; - -typedef struct -{ - __unsafe_unretained NSString *bridgeArgs; - __unsafe_unretained NSString *methodResults; -} FBSDKBridgeAPIProtocolNativeV1InputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1InputKeysStruct FBSDKBridgeAPIProtocolNativeV1InputKeys; - -typedef struct -{ - __unsafe_unretained NSString *actionID; - __unsafe_unretained NSString *error; -} FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct; -FBSDK_EXTERN const FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeysStruct FBSDKBridgeAPIProtocolNativeV1BridgeParameterInputKeys; - -@interface FBSDKBridgeAPIProtocolNativeV1 : NSObject - -- (instancetype)initWithAppScheme:(NSString *)appScheme; -- (instancetype)initWithAppScheme:(NSString *)appScheme - pasteboard:(UIPasteboard *)pasteboard - dataLengthThreshold:(NSUInteger)dataLengthThreshold - includeAppIcon:(BOOL)includeAppIcon -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, copy, readonly) NSString *appScheme; -@property (nonatomic, assign, readonly) NSUInteger dataLengthThreshold; -@property (nonatomic, assign, readonly) BOOL includeAppIcon; -@property (nonatomic, strong, readonly) UIPasteboard *pasteboard; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h deleted file mode 100644 index c7b28f4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKBridgeAPIProtocolWebV1.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import "FBSDKBridgeAPIProtocol.h" - -@interface FBSDKBridgeAPIProtocolWebV1 : NSObject - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h deleted file mode 100644 index f37bd86..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKError.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@interface FBSDKError : NSObject - -+ (NSString *)errorDomain; - -+ (BOOL)errorIsNetworkError:(NSError *)error; - -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message; -+ (NSError *)errorWithCode:(NSInteger)code message:(NSString *)message underlyingError:(NSError *)underlyingError; -+ (NSError *)errorWithCode:(NSInteger)code - userInfo:(NSDictionary *)userInfo - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name value:(id)value message:(NSString *)message; -+ (NSError *)invalidArgumentErrorWithName:(NSString *)name - value:(id)value - message:(NSString *)message - underlyingError:(NSError *)underlyingError; -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message; -+ (NSError *)invalidCollectionErrorWithName:(NSString *)name - collection:(id)collection - item:(id)item - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name message:(NSString *)message; -+ (NSError *)requiredArgumentErrorWithName:(NSString *)name - message:(NSString *)message - underlyingError:(NSError *)underlyingError; - -+ (NSError *)unknownErrorWithMessage:(NSString *)message; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h deleted file mode 100644 index b61c782..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestBody.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -@class FBSDKGraphRequestDataAttachment; -@class FBSDKLogger; - -@interface FBSDKGraphRequestBody : NSObject - -@property (nonatomic, retain, readonly) NSData *data; - -- (void)appendWithKey:(NSString *)key - formValue:(NSString *)value - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - imageValue:(UIImage *)image - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - dataValue:(NSData *)data - logger:(FBSDKLogger *)logger; - -- (void)appendWithKey:(NSString *)key - dataAttachmentValue:(FBSDKGraphRequestDataAttachment *)dataAttachment - logger:(FBSDKLogger *)logger; - -+ (NSString *)mimeContentType; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h deleted file mode 100644 index cd218c4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKGraphRequestMetadata.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -// Internal only class to facilitate FBSDKGraphRequest processing, specifically -// associating FBSDKGraphRequest and FBSDKGraphRequestHandler instances and necessary -// data for retry processing. -@interface FBSDKGraphRequestMetadata : NSObject - -@property (nonatomic, retain) FBSDKGraphRequest *request; -@property (nonatomic, copy) FBSDKGraphRequestHandler completionHandler; -@property (nonatomic, copy) NSDictionary *batchParameters; - -- (instancetype)initWithRequest:(FBSDKGraphRequest *)request - completionHandler:(FBSDKGraphRequestHandler)handler - batchParameters:(NSDictionary *)batchParameters -NS_DESIGNATED_INITIALIZER; - -- (void)invokeCompletionHandlerForConnection:(FBSDKGraphRequestConnection *)connection - withResults:(id)results - error:(NSError *)error; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h deleted file mode 100644 index cbe80a0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKURLConnection.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKURLConnection; - -typedef void (^FBSDKURLConnectionHandler)(FBSDKURLConnection *connection, - NSError *error, - NSURLResponse *response, - NSData *responseData); - -@protocol FBSDKURLConnectionDelegate - -@optional - -- (void)facebookURLConnection:(FBSDKURLConnection *)connection - didSendBodyData:(NSInteger)bytesWritten - totalBytesWritten:(NSInteger)totalBytesWritten - totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite; - -@end - -@interface FBSDKURLConnection : NSObject - -- (FBSDKURLConnection *)initWithRequest:(NSURLRequest *)request - completionHandler:(FBSDKURLConnectionHandler)handler -NS_DESIGNATED_INITIALIZER; - -@property (nonatomic, assign) id delegate; - -- (void)cancel; -- (void)start; -- (void)setDelegateQueue:(NSOperationQueue *)queue; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h deleted file mode 100644 index 9ad7427..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKCoreKit.framework/PrivateHeaders/FBSDKWebDialogView.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKWebDialogViewDelegate; - -@interface FBSDKWebDialogView : UIView - -@property (nonatomic, assign) id delegate; - -- (void)loadURL:(NSURL *)URL; -- (void)stopLoading; - -@end - -@protocol FBSDKWebDialogViewDelegate - -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didCompleteWithResults:(NSDictionary *)results; -- (void)webDialogView:(FBSDKWebDialogView *)webDialogView didFailWithError:(NSError *)error; -- (void)webDialogViewDidCancel:(FBSDKWebDialogView *)webDialogView; -- (void)webDialogViewDidFinishLoad:(FBSDKWebDialogView *)webDialogView; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/FBSDKLoginKit b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/FBSDKLoginKit deleted file mode 100644 index d6b45c5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/FBSDKLoginKit and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h deleted file mode 100644 index 51499d4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginButton.h +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -#import "FBSDKTooltipView.h" - -@protocol FBSDKLoginButtonDelegate; - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) - @abstract Indicates the desired login tooltip behavior. - */ -typedef NS_ENUM(NSUInteger, FBSDKLoginButtonTooltipBehavior) -{ - /*! The default behavior. The tooltip will only be displayed if - the app is eligible (determined by possible server round trip) */ - FBSDKLoginButtonTooltipBehaviorAutomatic = 0, - /*! Force display of the tooltip (typically for UI testing) */ - FBSDKLoginButtonTooltipBehaviorForceDisplay = 1, - /*! Force disable. In this case you can still exert more refined - control by manually constructing a `FBSDKLoginTooltipView` instance. */ - FBSDKLoginButtonTooltipBehaviorDisable = 2 -}; - -/*! - @abstract A button that initiates a log in or log out flow upon tapping. - @discussion `FBSDKLoginButton` works with `[FBSDKAccessToken currentAccessToken]` to - determine what to display, and automatically starts authentication when tapped (i.e., - you do not need to manually subscribe action targets). - - Like `FBSDKLoginManager`, you should make sure your app delegate is connected to - `FBSDKApplicationDelegate` in order for the button's delegate to receive messages. - - `FBSDKLoginButton` has a fixed height, but you may change the width. `initWithFrame:CGRectZero` - will size the button to its minimum frame. -*/ -@interface FBSDKLoginButton : FBSDKButton - -/*! - @abstract The default audience to use, if publish permissions are requested at login time. - */ -@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; -/*! - @abstract Gets or sets the delegate. - */ -@property (weak, nonatomic) IBOutlet id delegate; -/*! - @abstract Gets or sets the login behavior to use - */ -@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; -/*! - @abstract The publish permissions to request. - - @discussion Use `defaultAudience` to specify the default audience to publish to. - Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - */ -@property (copy, nonatomic) NSArray *publishPermissions; -/*! - @abstract The read permissions to request. - - @discussion Note, that if read permissions are specified, then publish permissions should not be specified. This is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - */ -@property (copy, nonatomic) NSArray *readPermissions; -/*! - @abstract Gets or sets the desired tooltip behavior. - */ -@property (assign, nonatomic) FBSDKLoginButtonTooltipBehavior tooltipBehavior; -/*! - @abstract Gets or sets the desired tooltip color style. - */ -@property (assign, nonatomic) FBSDKTooltipColorStyle tooltipColorStyle; - -@end - -/*! - @protocol - @abstract A delegate for `FBSDKLoginButton` - */ -@protocol FBSDKLoginButtonDelegate - -@required -/*! - @abstract Sent to the delegate when the button was used to login. - @param loginButton the sender - @param result The results of the login - @param error The error (if any) from the login - */ -- (void) loginButton:(FBSDKLoginButton *)loginButton -didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result - error:(NSError *)error; - -/*! - @abstract Sent to the delegate when the button was used to logout. - @param loginButton The button that was clicked. -*/ -- (void)loginButtonDidLogOut:(FBSDKLoginButton *)loginButton; - -@optional -/*! - @abstract Sent to the delegate when the button is about to login. - @param loginButton the sender - @return YES if the login should be allowed to proceed, NO otherwise - */ -- (BOOL) loginButtonWillLogin:(FBSDKLoginButton *)loginButton; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h deleted file mode 100644 index 100c09a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginConstants.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract The error domain for all errors from FBSDKLoginKit - @discussion Error codes from the SDK in the range 300-399 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKLoginErrorDomain; - -/*! - @typedef NS_ENUM(NSInteger, FBSDKLoginErrorCode) - @abstract Error codes for FBSDKLoginErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKLoginErrorCode) -{ - /*! - @abstract Reserved. - */ - FBSDKLoginReservedErrorCode = 300, - /*! - @abstract The error code for unknown errors. - */ - FBSDKLoginUnknownErrorCode, - - /*! - @abstract The user's password has changed and must log in again - */ - FBSDKLoginPasswordChangedErrorCode, - /*! - @abstract The user must log in to their account on www.facebook.com to restore access - */ - FBSDKLoginUserCheckpointedErrorCode, - /*! - @abstract Indicates a failure to request new permissions because the user has changed. - */ - FBSDKLoginUserMismatchErrorCode, - /*! - @abstract The user must confirm their account with Facebook before logging in - */ - FBSDKLoginUnconfirmedUserErrorCode, - - /*! - @abstract The Accounts framework failed without returning an error, indicating the - app's slider in the iOS Facebook Settings (device Settings -> Facebook -> App Name) has - been disabled. - */ - FBSDKLoginSystemAccountAppDisabledErrorCode, - /*! - @abstract An error occurred related to Facebook system Account store - */ - FBSDKLoginSystemAccountUnavailableErrorCode, - /*! - @abstract The login response was missing a valid challenge string. - */ - FBSDKLoginBadChallengeString, -}; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h deleted file mode 100644 index 4723940..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginKit.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h deleted file mode 100644 index ee35bd8..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManager.h +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import -#import - -@class FBSDKLoginManagerLoginResult; - -/*! - @abstract Describes the call back to the FBSDKLoginManager - @param result the result of the authorization - @param error the authorization error, if any. - */ -typedef void (^FBSDKLoginManagerRequestTokenHandler)(FBSDKLoginManagerLoginResult *result, NSError *error); - - -/*! - @typedef FBSDKDefaultAudience enum - - @abstract - Passed to open to indicate which default audience to use for sessions that post data to Facebook. - - @discussion - Certain operations such as publishing a status or publishing a photo require an audience. When the user - grants an application permission to perform a publish operation, a default audience is selected as the - publication ceiling for the application. This enumerated value allows the application to select which - audience to ask the user to grant publish permission for. - */ -typedef NS_ENUM(NSUInteger, FBSDKDefaultAudience) -{ - /*! Indicates that the user's friends are able to see posts made by the application */ - FBSDKDefaultAudienceFriends = 0, - /*! Indicates that only the user is able to see posts made by the application */ - FBSDKDefaultAudienceOnlyMe, - /*! Indicates that all Facebook users are able to see posts made by the application */ - FBSDKDefaultAudienceEveryone, -}; - -/*! - @typedef FBSDKLoginBehavior enum - - @abstract - Passed to the \c FBSDKLoginManager to indicate how Facebook Login should be attempted. - - @discussion - Facebook Login authorizes the application to act on behalf of the user, using the user's - Facebook account. Usually a Facebook Login will rely on an account maintained outside of - the application, by the native Facebook application, the browser, or perhaps the device - itself. This avoids the need for a user to enter their username and password directly, and - provides the most secure and lowest friction way for a user to authorize the application to - interact with Facebook. - - The \c FBSDKLoginBehavior enum specifies which log-in methods may be used. The SDK - will determine the best behavior based on the current device (such as iOS version). - */ -typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior) -{ - /*! - @abstract This is the default behavior, and indicates logging in through the native - Facebook app may be used. The SDK may still use Safari instead. - */ - FBSDKLoginBehaviorNative = 0, - /*! - @abstract Attempts log in through the Safari or SFSafariViewController, if available. - */ - FBSDKLoginBehaviorBrowser, - /*! - @abstract Attempts log in through the Facebook account currently signed in through - the device Settings. - @note If the account is not available to the app (either not configured by user or - as determined by the SDK) this behavior falls back to \c FBSDKLoginBehaviorNative. - */ - FBSDKLoginBehaviorSystemAccount, - /*! - @abstract Attemps log in through a modal \c UIWebView pop up - - @note This behavior is only available to certain types of apps. Please check the Facebook - Platform Policy to verify your app meets the restrictions. - */ - FBSDKLoginBehaviorWeb, -}; - -/*! - @abstract `FBSDKLoginManager` provides methods for logging the user in and out. - @discussion `FBSDKLoginManager` works directly with `[FBSDKAccessToken currentAccessToken]` and - sets the "currentAccessToken" upon successful authorizations (or sets `nil` in case of `logOut`). - - You should check `[FBSDKAccessToken currentAccessToken]` before calling logIn* to see if there is - a cached token available (typically in your viewDidLoad). - - If you are managing your own token instances outside of "currentAccessToken", you will need to set - "currentAccessToken" before calling logIn* to authorize futher permissions on your tokens. - */ -@interface FBSDKLoginManager : NSObject - -/*! - @abstract the default audience. - @discussion you should set this if you intend to ask for publish permissions. - */ -@property (assign, nonatomic) FBSDKDefaultAudience defaultAudience; - -/*! - @abstract the login behavior - */ -@property (assign, nonatomic) FBSDKLoginBehavior loginBehavior; - -/*! - @deprecated use logInWithReadPermissions:fromViewController:handler: instead - */ -- (void)logInWithReadPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -__attribute__ ((deprecated("use logInWithReadPermissions:fromViewController:handler: instead"))); - -/*! - @deprecated use logInWithPublishPermissions:fromViewController:handler: instead - */ -- (void)logInWithPublishPermissions:(NSArray *)permissions handler:(FBSDKLoginManagerRequestTokenHandler)handler -__attribute__ ((deprecated("use logInWithPublishPermissions:fromViewController:handler: instead"))); - -/*! - @abstract Logs the user in or authorizes additional permissions. - @param permissions the optional array of permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - @param fromViewController the view controller to present from. If nil, the topmost view controller will be - automatically determined as best as possible. - @param handler the callback. - @discussion Use this method when asking for read permissions. You should only ask for permissions when they - are needed and explain the value to the user. You can inspect the result.declinedPermissions to also - provide more information to the user if they decline permissions. - - If `[FBSDKAccessToken currentAccessToken]` is not nil, it will be treated as a reauthorization for that user - and will pass the "rerequest" flag to the login dialog. - - This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` - already contains the permissions you need before asking to reduce unnecessary app switching. For example, - you could make that check at viewDidLoad. - */ -- (void)logInWithReadPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler; - -/*! - @abstract Logs the user in or authorizes additional permissions. - @param permissions the optional array of permissions. Note this is converted to NSSet and is only - an NSArray for the convenience of literal syntax. - @param fromViewController the view controller to present from. If nil, the topmost view controller will be - automatically determined as best as possible. - @param handler the callback. - @discussion Use this method when asking for publish permissions. You should only ask for permissions when they - are needed and explain the value to the user. You can inspect the result.declinedPermissions to also - provide more information to the user if they decline permissions. - - If `[FBSDKAccessToken currentAccessToken]` is not nil, it will be treated as a reauthorization for that user - and will pass the "rerequest" flag to the login dialog. - - This method will present UI the user. You typically should check if `[FBSDKAccessToken currentAccessToken]` - already contains the permissions you need before asking to reduce unnecessary app switching. For example, - you could make that check at viewDidLoad. - */ -- (void)logInWithPublishPermissions:(NSArray *)permissions - fromViewController:(UIViewController *)fromViewController - handler:(FBSDKLoginManagerRequestTokenHandler)handler; - -/*! - @abstract Logs the user out - @discussion This calls [FBSDKAccessToken setCurrentAccessToken:nil] and [FBSDKProfile setCurrentProfile:nil]. - */ -- (void)logOut; - -/*! - @method - - @abstract Issues an asychronous renewCredentialsForAccount call to the device's Facebook account store. - - @param handler The completion handler to call when the renewal is completed. This can be invoked on an arbitrary thread. - - @discussion This can be used to explicitly renew account credentials and is provided as a convenience wrapper around - `[ACAccountStore renewCredentialsForAccount:completion]`. Note the method will not issue the renewal call if the the - Facebook account has not been set on the device, or if access had not been granted to the account (though the handler - wil receive an error). - - If the `[FBSDKAccessToken currentAccessToken]` was from the account store, a succesful renewal will also set - a new "currentAccessToken". - */ -+ (void)renewSystemCredentials:(void (^)(ACAccountCredentialRenewResult result, NSError *error))handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h deleted file mode 100644 index 36a1af6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginManagerLoginResult.h +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKAccessToken; - -/*! - @abstract Describes the result of a login attempt. - */ -@interface FBSDKLoginManagerLoginResult : NSObject - -/*! - @abstract the access token. - */ -@property (copy, nonatomic) FBSDKAccessToken *token; - -/*! - @abstract whether the login was cancelled by the user. - */ -@property (readonly, nonatomic) BOOL isCancelled; - -/*! - @abstract the set of permissions granted by the user in the associated request. - @discussion inspect the token's permissions set for a complete list. - */ -@property (copy, nonatomic) NSSet *grantedPermissions; - -/*! - @abstract the set of permissions declined by the user in the associated request. - @discussion inspect the token's permissions set for a complete list. - */ -@property (copy, nonatomic) NSSet *declinedPermissions; - -/*! - @abstract Initializes a new instance. - @param token the access token - @param isCancelled whether the login was cancelled by the user - @param grantedPermissions the set of granted permissions - @param declinedPermissions the set of declined permissions - */ -- (instancetype)initWithToken:(FBSDKAccessToken *)token - isCancelled:(BOOL)isCancelled - grantedPermissions:(NSSet *)grantedPermissions - declinedPermissions:(NSSet *)declinedPermissions -NS_DESIGNATED_INITIALIZER; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h deleted file mode 100644 index e6a9411..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKLoginTooltipView.h +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKLoginTooltipViewDelegate; - -/*! - @class FBSDKLoginTooltipView - - @abstract Represents a tooltip to be displayed next to a Facebook login button - to highlight features for new users. - - @discussion The `FBSDKLoginButton` may display this view automatically. If you do - not use the `FBSDKLoginButton`, you can manually call one of the `present*` methods - as appropriate and customize behavior via `FBSDKLoginTooltipViewDelegate` delegate. - - By default, the `FBSDKLoginTooltipView` is not added to the superview until it is - determined the app has migrated to the new login experience. You can override this - (e.g., to test the UI layout) by implementing the delegate or setting `forceDisplay` to YES. - - */ -@interface FBSDKLoginTooltipView : FBSDKTooltipView - -/*! @abstract the delegate */ -@property (nonatomic, assign) id delegate; - -/*! @abstract if set to YES, the view will always be displayed and the delegate's - `loginTooltipView:shouldAppear:` will NOT be called. */ -@property (nonatomic, assign) BOOL forceDisplay; - -@end - -/*! - @protocol - - @abstract - The `FBSDKLoginTooltipViewDelegate` protocol defines the methods used to receive event - notifications from `FBSDKLoginTooltipView` objects. - */ -@protocol FBSDKLoginTooltipViewDelegate - -@optional - -/*! - @abstract - Asks the delegate if the tooltip view should appear - - @param view The tooltip view. - @param appIsEligible The value fetched from the server identifying if the app - is eligible for the new login experience. - - @discussion Use this method to customize display behavior. - */ -- (BOOL)loginTooltipView:(FBSDKLoginTooltipView *)view shouldAppear:(BOOL)appIsEligible; - -/*! - @abstract - Tells the delegate the tooltip view will appear, specifically after it's been - added to the super view but before the fade in animation. - - @param view The tooltip view. - */ -- (void)loginTooltipViewWillAppear:(FBSDKLoginTooltipView *)view; - -/*! - @abstract - Tells the delegate the tooltip view will not appear (i.e., was not - added to the super view). - - @param view The tooltip view. - */ -- (void)loginTooltipViewWillNotAppear:(FBSDKLoginTooltipView *)view; - - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h deleted file mode 100644 index aff1067..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Headers/FBSDKTooltipView.h +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @typedef FBSDKTooltipViewArrowDirection enum - - @abstract - Passed on construction to determine arrow orientation. - */ -typedef NS_ENUM(NSUInteger, FBSDKTooltipViewArrowDirection) -{ - /*! View is located above given point, arrow is pointing down. */ - FBSDKTooltipViewArrowDirectionDown = 0, - /*! View is located below given point, arrow is pointing up. */ - FBSDKTooltipViewArrowDirectionUp = 1, -}; - -/*! - @typedef FBSDKTooltipColorStyle enum - - @abstract - Passed on construction to determine color styling. - */ -typedef NS_ENUM(NSUInteger, FBSDKTooltipColorStyle) -{ - /*! Light blue background, white text, faded blue close button. */ - FBSDKTooltipColorStyleFriendlyBlue = 0, - /*! Dark gray background, white text, light gray close button. */ - FBSDKTooltipColorStyleNeutralGray = 1, -}; - -/*! - @class FBSDKTooltipView - - @abstract - Tooltip bubble with text in it used to display tips for UI elements, - with a pointed arrow (to refer to the UI element). - - @discussion - The tooltip fades in and will automatically fade out. See `displayDuration`. - */ -@interface FBSDKTooltipView : UIView - -/*! - @abstract Gets or sets the amount of time in seconds the tooltip should be displayed. - - @discussion Set this to zero to make the display permanent until explicitly dismissed. - Defaults to six seconds. - */ -@property (nonatomic, assign) CFTimeInterval displayDuration; - -/*! - @abstract Gets or sets the color style after initialization. - - @discussion Defaults to value passed to -initWithTagline:message:colorStyle:. - */ -@property (nonatomic, assign) FBSDKTooltipColorStyle colorStyle; - -/*! - @abstract Gets or sets the message. - */ -@property (nonatomic, copy) NSString *message; - -/*! - @abstract Gets or sets the optional phrase that comprises the first part of the label (and is highlighted differently). - */ -@property (nonatomic, copy) NSString *tagline; - -/*! - @abstract - Designated initializer. - - @param tagline First part of the label, that will be highlighted with different color. Can be nil. - - @param message Main message to display. - - @param colorStyle Color style to use for tooltip. - - @discussion - If you need to show a tooltip for login, consider using the `FBSDKLoginTooltipView` view. - - @see FBSDKLoginTooltipView - */ -- (instancetype)initWithTagline:(NSString *)tagline message:(NSString *)message colorStyle:(FBSDKTooltipColorStyle)colorStyle; - -/*! - @abstract - Show tooltip at the top or at the bottom of given view. - Tooltip will be added to anchorView.window.rootViewController.view - - @param anchorView view to show at, must be already added to window view hierarchy, in order to decide - where tooltip will be shown. (If there's not enough space at the top of the anchorView in window bounds - - tooltip will be shown at the bottom of it) - - @discussion - Use this method to present the tooltip with automatic positioning or - use -presentInView:withArrowPosition:direction: for manual positioning - If anchorView is nil or has no window - this method does nothing. - */ -- (void)presentFromView:(UIView *)anchorView; - -/*! - @abstract - Adds tooltip to given view, with given position and arrow direction. - - @param view View to be used as superview. - - @param arrowPosition Point in view's cordinates, where arrow will be pointing - - @param arrowDirection whenever arrow should be pointing up (message bubble is below the arrow) or - down (message bubble is above the arrow). - */ -- (void)presentInView:(UIView *)view withArrowPosition:(CGPoint)arrowPosition direction:(FBSDKTooltipViewArrowDirection)arrowDirection; - -/*! - @abstract - Remove tooltip manually. - - @discussion - Calling this method isn't necessary - tooltip will dismiss itself automatically after the `displayDuration`. - */ -- (void)dismiss; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Info.plist deleted file mode 100644 index ad88b51..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Info.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Modules/module.modulemap deleted file mode 100644 index 4b1d57b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKLoginKit.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FBSDKLoginKit { - umbrella header "FBSDKLoginKit.h" - - export * - module * { export * } -} diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/FBSDKShareKit b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/FBSDKShareKit deleted file mode 100644 index 2f1ec34..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/FBSDKShareKit and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupAddDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupAddDialog.h deleted file mode 100644 index 05b26ff..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupAddDialog.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKAppGroupAddDialogDelegate; - -/*! - @abstract A dialog for creating app groups. - */ -@interface FBSDKAppGroupAddDialog : NSObject - -/*! - @abstract Convenience method to build up an app group dialog with content and a delegate. - @param content The content for the app group. - @param delegate The receiver's delegate. - */ -+ (instancetype)showWithContent:(FBSDKAppGroupContent *)content - delegate:(id)delegate; - -/*! - @abstract The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/*! - @abstract The content for app group. - */ -@property (nonatomic, copy) FBSDKAppGroupContent *content; - -/*! - @abstract A Boolean value that indicates whether the receiver can initiate an app group dialog. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see validateWithError: - @result YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/*! - @abstract Begins the app group dialog from the receiver. - @result YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/*! - @abstract Validates the content on the receiver. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @return YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/*! - @abstract A delegate for FBSDKAppGroupAddDialog. - @discussion The delegate is notified with the results of the app group request as long as the application has - permissions to receive the information. For example, if the person is not signed into the containing app, the shower - may not be able to distinguish between completion of an app group request and cancellation. - */ -@protocol FBSDKAppGroupAddDialogDelegate - -/*! - @abstract Sent to the delegate when the app group request completes without error. - @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. - @param results The results from the dialog. This may be nil or empty. - */ -- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didCompleteWithResults:(NSDictionary *)results; - -/*! - @abstract Sent to the delegate when the app group request encounters an error. - @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. - @param error The error. - */ -- (void)appGroupAddDialog:(FBSDKAppGroupAddDialog *)appGroupAddDialog didFailWithError:(NSError *)error; - -/*! - @abstract Sent to the delegate when the app group dialog is cancelled. - @param appGroupAddDialog The FBSDKAppGroupAddDialog that completed. - */ -- (void)appGroupAddDialogDidCancel:(FBSDKAppGroupAddDialog *)appGroupAddDialog; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupContent.h deleted file mode 100644 index a5c5823..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupContent.h +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) - @abstract Specifies the privacy of a group. - */ -typedef NS_ENUM(NSUInteger, FBSDKAppGroupPrivacy) -{ - /*! Anyone can see the group, who's in it and what members post. */ - FBSDKAppGroupPrivacyOpen = 0, - /*! Anyone can see the group and who's in it, but only members can see posts. */ - FBSDKAppGroupPrivacyClosed, -}; - -/*! - @abstract Converts an FBSDKAppGroupPrivacy to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKAppGroupPrivacy(FBSDKAppGroupPrivacy privacy); - -/*! - @abstract A model for creating an app group. - */ -@interface FBSDKAppGroupContent : NSObject - -/*! - @abstract The description of the group. - */ -@property (nonatomic, copy) NSString *groupDescription; - -/*! - @abstract The name of the group. - */ -@property (nonatomic, copy) NSString *name; - -/*! - @abstract The privacy for the group. - */ -@property (nonatomic, assign) FBSDKAppGroupPrivacy privacy; - -/*! - @abstract Compares the receiver to another app group content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToAppGroupContent:(FBSDKAppGroupContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupJoinDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupJoinDialog.h deleted file mode 100644 index 70e4e7a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppGroupJoinDialog.h +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@protocol FBSDKAppGroupJoinDialogDelegate; - -/*! - @abstract A dialog for joining app groups. - */ -@interface FBSDKAppGroupJoinDialog : NSObject - -/*! - @abstract Convenience method to build up an app group dialog with content and a delegate. - @param groupID The ID for the group. - @param delegate The receiver's delegate. - */ -+ (instancetype)showWithGroupID:(NSString *)groupID - delegate:(id)delegate; - -/*! - @abstract The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/*! - @abstract The ID for group. - */ -@property (nonatomic, copy) NSString *groupID; - -/*! - @abstract A Boolean value that indicates whether the receiver can initiate an app group dialog. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see validateWithError: - @result YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/*! - @abstract Begins the app group dialog from the receiver. - @result YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/*! - @abstract Validates the content on the receiver. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @return YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/*! - @abstract A delegate for FBSDKAppGroupJoinDialog. - @discussion The delegate is notified with the results of the app group request as long as the application has - permissions to receive the information. For example, if the person is not signed into the containing app, the shower - may not be able to distinguish between completion of an app group request and cancellation. - */ -@protocol FBSDKAppGroupJoinDialogDelegate - -/*! - @abstract Sent to the delegate when the app group request completes without error. - @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. - @param results The results from the dialog. This may be nil or empty. - */ -- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didCompleteWithResults:(NSDictionary *)results; - -/*! - @abstract Sent to the delegate when the app group request encounters an error. - @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. - @param error The error. - */ -- (void)appGroupJoinDialog:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog didFailWithError:(NSError *)error; - -/*! - @abstract Sent to the delegate when the app group dialog is cancelled. - @param appGroupJoinDialog The FBSDKAppGroupJoinDialog that completed. - */ -- (void)appGroupJoinDialogDidCancel:(FBSDKAppGroupJoinDialog *)appGroupJoinDialog; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteContent.h deleted file mode 100644 index 1feb828..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteContent.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A model for app invite. - */ -@interface FBSDKAppInviteContent : NSObject - -/*! - @abstract A URL to a preview image that will be displayed with the app invite - - @discussion This is optional. If you don't include it a fallback image will be used. -*/ -@property (nonatomic, copy) NSURL *appInvitePreviewImageURL; - -/*! - @abstract An app link target that will be used as a target when the user accept the invite. - - @discussion This is a requirement. - */ -@property (nonatomic, copy) NSURL *appLinkURL; - -/*! - @deprecated Use `appInvitePreviewImageURL` instead. - */ -@property (nonatomic, copy) NSURL *previewImageURL __attribute__ ((deprecated("use appInvitePreviewImageURL instead"))); - -/*! - @abstract Compares the receiver to another app invite content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToAppInviteContent:(FBSDKAppInviteContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteDialog.h deleted file mode 100644 index 0859d4c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKAppInviteDialog.h +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import -#import - -#import - -@protocol FBSDKAppInviteDialogDelegate; - -/*! - @abstract A dialog for sending App Invites. - */ -@interface FBSDKAppInviteDialog : NSObject - -/*! - @abstract Convenience method to show a FBSDKAppInviteDialog - @param viewController A UIViewController to present the dialog from. - @param content The content for the app invite. - @param delegate The receiver's delegate. -*/ -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(FBSDKAppInviteContent *)content - delegate:(id)delegate; - - -/*! - @deprecated use showFromViewController:withContent:delegate: instead - */ -+ (instancetype)showWithContent:(FBSDKAppInviteContent *)content delegate:(id)delegate -__attribute__ ((deprecated("use showFromViewController:withContent:delegate: instead"))); - -/*! - @abstract A UIViewController to present the dialog from. - @discussion If not specified, the top most view controller will be automatically determined as best as possible. - */ -@property (nonatomic, weak) UIViewController *fromViewController; - -/*! - @abstract The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/*! - @abstract The content for app invite. - */ -@property (nonatomic, copy) FBSDKAppInviteContent *content; - -/*! - @abstract A Boolean value that indicates whether the receiver can initiate an app invite. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see validateWithError: - @result YES if the receiver can show the dialog, otherwise NO. - */ -- (BOOL)canShow; - -/*! - @abstract Begins the app invite from the receiver. - @result YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/*! - @abstract Validates the content on the receiver. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @return YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/*! - @abstract A delegate for FBSDKAppInviteDialog. - @discussion The delegate is notified with the results of the app invite as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the shower may not be able - to distinguish between completion of an app invite and cancellation. - */ -@protocol FBSDKAppInviteDialogDelegate - -/*! - @abstract Sent to the delegate when the app invite completes without error. - @param appInviteDialog The FBSDKAppInviteDialog that completed. - @param results The results from the dialog. This may be nil or empty. - */ -- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didCompleteWithResults:(NSDictionary *)results; - -/*! - @abstract Sent to the delegate when the app invite encounters an error. - @param appInviteDialog The FBSDKAppInviteDialog that completed. - @param error The error. - */ -- (void)appInviteDialog:(FBSDKAppInviteDialog *)appInviteDialog didFailWithError:(NSError *)error; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestContent.h deleted file mode 100644 index 13edc06..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestContent.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKGameRequestActionType) - @abstract Additional context about the nature of the request. - */ -typedef NS_ENUM(NSUInteger, FBSDKGameRequestActionType) -{ - /*! No action type */ - FBSDKGameRequestActionTypeNone = 0, - /*! Send action type: The user is sending an object to the friends. */ - FBSDKGameRequestActionTypeSend, - /*! Ask For action type: The user is asking for an object from friends. */ - FBSDKGameRequestActionTypeAskFor, - /*! Turn action type: It is the turn of the friends to play against the user in a match. (no object) */ - FBSDKGameRequestActionTypeTurn, -}; - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKGameRequestFilters) - @abstract Filter for who can be displayed in the multi-friend selector. - */ -typedef NS_ENUM(NSUInteger, FBSDKGameRequestFilter) -{ - /*! No filter, all friends can be displayed. */ - FBSDKGameRequestFilterNone = 0, - /*! Friends using the app can be displayed. */ - FBSDKGameRequestFilterAppUsers, - /*! Friends not using the app can be displayed. */ - FBSDKGameRequestFilterAppNonUsers, -}; - -/*! - @abstract A model for a game request. - */ -@interface FBSDKGameRequestContent : NSObject - -/*! - @abstract Used when defining additional context about the nature of the request. - @discussion The parameter 'objectID' is required if the action type is either - 'FBSDKGameRequestSendActionType' or 'FBSDKGameRequestAskForActionType'. - @seealso objectID - */ -@property (nonatomic, assign) FBSDKGameRequestActionType actionType; - -/*! - @abstract Compares the receiver to another game request content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToGameRequestContent:(FBSDKGameRequestContent *)content; - -/*! - @abstract Additional freeform data you may pass for tracking. This will be stored as part of - the request objects created. The maximum length is 255 characters. - */ -@property (nonatomic, copy) NSString *data; - -/*! - @abstract This controls the set of friends someone sees if a multi-friend selector is shown. - It is FBSDKGameRequestNoFilter by default, meaning that all friends can be shown. - If specify as FBSDKGameRequestAppUsersFilter, only friends who use the app will be shown. - On the other hands, use FBSDKGameRequestAppNonUsersFilter to filter only friends who do not use the app. - @discussion The parameter name is preserved to be consistent with the counter part on desktop. - */ -@property (nonatomic, assign) FBSDKGameRequestFilter filters; - -/*! - @abstract A plain-text message to be sent as part of the request. This text will surface in the App Center view - of the request, but not on the notification jewel. Required parameter. - */ -@property (nonatomic, copy) NSString *message; - -/*! - @abstract The Open Graph object ID of the object being sent. - @seealso actionType - */ -@property (nonatomic, copy) NSString *objectID; - -/*! - @abstract An array of user IDs, usernames or invite tokens (NSString) of people to send request. - @discussion These may or may not be a friend of the sender. If this is specified by the app, - the sender will not have a choice of recipients. If not, the sender will see a multi-friend selector - - This is equivalent to the "to" parameter when using the web game request dialog. - */ -@property (nonatomic, copy) NSArray *recipients; - -/*! - @abstract An array of user IDs that will be included in the dialog as the first suggested friends. - Cannot be used together with filters. - @discussion This is equivalent to the "suggestions" parameter when using the web game request dialog. -*/ -@property (nonatomic, copy) NSArray *recipientSuggestions; - -/*! - @deprecated Use `recipientSuggestions` instead. -*/ -@property (nonatomic, copy) NSArray *suggestions __attribute__ ((deprecated("use recipientSuggestions instead"))); - -/*! - @abstract The title for the dialog. - */ -@property (nonatomic, copy) NSString *title; - -/*! - @deprecated Use `recipients` instead. - */ -@property (nonatomic, copy) NSArray *to __attribute__ ((deprecated("use recipients instead"))); - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestDialog.h deleted file mode 100644 index 2f5acc5..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKGameRequestDialog.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKGameRequestDialogDelegate; - -/*! - @abstract A dialog for sending game requests. - */ -@interface FBSDKGameRequestDialog : NSObject - -/*! - @abstract Convenience method to build up a game request with content and a delegate. - @param content The content for the game request. - @param delegate The receiver's delegate. - */ -+ (instancetype)showWithContent:(FBSDKGameRequestContent *)content delegate:(id)delegate; - -/*! - @abstract The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/*! - @abstract The content for game request. - */ -@property (nonatomic, copy) FBSDKGameRequestContent *content; - -/*! - @abstract Specifies whether frictionless requests are enabled. - */ -@property (nonatomic, assign) BOOL frictionlessRequestsEnabled; - -/*! - @abstract A Boolean value that indicates whether the receiver can initiate a game request. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see validateWithError: - @result YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/*! - @abstract Begins the game request from the receiver. - @result YES if the receiver was able to show the dialog, otherwise NO. - */ -- (BOOL)show; - -/*! - @abstract Validates the content on the receiver. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @return YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError *__autoreleasing *)errorRef; - -@end - -/*! - @abstract A delegate for FBSDKGameRequestDialog. - @discussion The delegate is notified with the results of the game request as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the shower may not be able - to distinguish between completion of a game request and cancellation. - */ -@protocol FBSDKGameRequestDialogDelegate - -/*! - @abstract Sent to the delegate when the game request completes without error. - @param gameRequestDialog The FBSDKGameRequestDialog that completed. - @param results The results from the dialog. This may be nil or empty. - */ -- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didCompleteWithResults:(NSDictionary *)results; - -/*! - @abstract Sent to the delegate when the game request encounters an error. - @param gameRequestDialog The FBSDKGameRequestDialog that completed. - @param error The error. - */ -- (void)gameRequestDialog:(FBSDKGameRequestDialog *)gameRequestDialog didFailWithError:(NSError *)error; - -/*! - @abstract Sent to the delegate when the game request dialog is cancelled. - @param gameRequestDialog The FBSDKGameRequestDialog that completed. - */ -- (void)gameRequestDialogDidCancel:(FBSDKGameRequestDialog *)gameRequestDialog; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeButton.h deleted file mode 100644 index 0b01c4e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeButton.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/*! - @abstract A button to like an object. - @discussion Tapping the receiver will invoke an API call to the Facebook app through a fast-app-switch that allows - the object to be liked. Upon return to the calling app, the view will update with the new state. If the - currentAccessToken has "publish_actions" permission and the object is an Open Graph object, then the like can happen - seamlessly without the fast-app-switch. - */ -@interface FBSDKLikeButton : FBSDKButton - -/*! - @abstract If YES, a sound is played when the receiver is toggled. - - @default YES - */ -@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeControl.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeControl.h deleted file mode 100644 index bbc88f2..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeControl.h +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/*! - @typedef NS_ENUM (NSUInteger, FBSDKLikeControlAuxiliaryPosition) - - @abstract Specifies the position of the auxiliary view relative to the like button. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlAuxiliaryPosition) -{ - /*! The auxiliary view is inline with the like button. */ - FBSDKLikeControlAuxiliaryPositionInline, - /*! The auxiliary view is above the like button. */ - FBSDKLikeControlAuxiliaryPositionTop, - /*! The auxiliary view is below the like button. */ - FBSDKLikeControlAuxiliaryPositionBottom, -}; - -/*! - @abstract Converts an FBSDKLikeControlAuxiliaryPosition to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlAuxiliaryPosition(FBSDKLikeControlAuxiliaryPosition auxiliaryPosition); - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) - - @abstract Specifies the horizontal alignment for FBSDKLikeControlStyleStandard with - FBSDKLikeControlAuxiliaryPositionTop or FBSDKLikeControlAuxiliaryPositionBottom. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlHorizontalAlignment) -{ - /*! The subviews are left aligned. */ - FBSDKLikeControlHorizontalAlignmentLeft, - /*! The subviews are center aligned. */ - FBSDKLikeControlHorizontalAlignmentCenter, - /*! The subviews are right aligned. */ - FBSDKLikeControlHorizontalAlignmentRight, -}; - -/*! - @abstract Converts an FBSDKLikeControlHorizontalAlignment to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlHorizontalAlignment(FBSDKLikeControlHorizontalAlignment horizontalAlignment); - -/*! - @typedef NS_ENUM (NSUInteger, FBSDKLikeControlStyle) - - @abstract Specifies the style of a like control. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeControlStyle) -{ - /*! Displays the button and the social sentence. */ - FBSDKLikeControlStyleStandard = 0, - /*! Displays the button and a box that contains the like count. */ - FBSDKLikeControlStyleBoxCount, -}; - -/*! - @abstract Converts an FBSDKLikeControlStyle to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeControlStyle(FBSDKLikeControlStyle style); - -/*! - @class FBSDKLikeControl - - @abstract UI control to like an object in the Facebook graph. - - @discussion Taps on the like button within this control will invoke an API call to the Facebook app through a - fast-app-switch that allows the user to like the object. Upon return to the calling app, the view will update - with the new state and send actions for the UIControlEventValueChanged event. - */ -@interface FBSDKLikeControl : UIControl - -/*! - @abstract The foreground color to use for the content of the receiver. - */ -@property (nonatomic, strong) UIColor *foregroundColor; - -/*! - @abstract The position for the auxiliary view for the receiver. - - @see FBSDKLikeControlAuxiliaryPosition - */ -@property (nonatomic, assign) FBSDKLikeControlAuxiliaryPosition likeControlAuxiliaryPosition; - -/*! - @abstract The text alignment of the social sentence. - - @discussion This value is only valid for FBSDKLikeControlStyleStandard with - FBSDKLikeControlAuxiliaryPositionTop|Bottom. - */ -@property (nonatomic, assign) FBSDKLikeControlHorizontalAlignment likeControlHorizontalAlignment; - -/*! - @abstract The style to use for the receiver. - - @see FBSDKLikeControlStyle - */ -@property (nonatomic, assign) FBSDKLikeControlStyle likeControlStyle; - -/*! - @abstract The preferred maximum width (in points) for autolayout. - - @discussion This property affects the size of the receiver when layout constraints are applied to it. During layout, - if the text extends beyond the width specified by this property, the additional text is flowed to one or more new - lines, thereby increasing the height of the receiver. - */ -@property (nonatomic, assign) CGFloat preferredMaxLayoutWidth; - -/*! - @abstract If YES, a sound is played when the receiver is toggled. - - @default YES - */ -@property (nonatomic, assign, getter = isSoundEnabled) BOOL soundEnabled; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeObjectType.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeObjectType.h deleted file mode 100644 index dadff43..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLikeObjectType.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @typedef NS_ENUM (NSUInteger, FBSDKLikeObjectType) - @abstract Specifies the type of object referenced by the objectID for likes. - */ -typedef NS_ENUM(NSUInteger, FBSDKLikeObjectType) -{ - /*! The objectID refers to an unknown object type. */ - FBSDKLikeObjectTypeUnknown = 0, - /*! The objectID refers to an Open Graph object. */ - FBSDKLikeObjectTypeOpenGraph, - /*! The objectID refers to an Page object. */ - FBSDKLikeObjectTypePage, -}; - -/*! - @abstract Converts an FBLikeControlObjectType to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKLikeObjectType(FBSDKLikeObjectType objectType); diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLiking.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLiking.h deleted file mode 100644 index e2d4a4a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKLiking.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -/*! - @abstract The common interface for components that initiate liking. - @see FBSDKLikeButton - @see FBSDKLikeControl - */ -@protocol FBSDKLiking - -/*! - @abstract The objectID for the object to like. - - @discussion This value may be an Open Graph object ID or a string representation of an URL that describes an - Open Graph object. The objects may be public objects, like pages, or objects that are defined by your application. - */ -@property (nonatomic, copy) NSString *objectID; - -/*! - @abstract The type of object referenced by the objectID. - - @discussion If the objectType is unknown, the control will determine the objectType by querying the server with the - objectID. Specifying a value for the objectType is an optimization that should be used if the type is known by the - consumer. Consider setting the objectType if it is known when setting the objectID. - */ -@property (nonatomic, assign) FBSDKLikeObjectType objectType; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKMessageDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKMessageDialog.h deleted file mode 100644 index 2819eb7..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKMessageDialog.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A dialog for sharing content through Messenger. - */ -@interface FBSDKMessageDialog : NSObject - -/*! - @abstract Convenience method to show a Message Share Dialog with content and a delegate. - @param content The content to be shared. - @param delegate The receiver's delegate. - */ -+ (instancetype)showWithContent:(id)content delegate:(id)delegate; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSendButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSendButton.h deleted file mode 100644 index 347f0e4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSendButton.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/*! - @abstract A button to send content through Messenger. - @discussion Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot - be shown, the button will be disable. - */ -@interface FBSDKSendButton : FBSDKButton - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareAPI.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareAPI.h deleted file mode 100644 index ddbeafe..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareAPI.h +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/*! - @abstract A utility class for sharing through the graph API. Using this class requires an access token in - [FBSDKAccessToken currentAccessToken] that has been granted the "publish_actions" permission. - @discussion FBSDKShareAPI network requests are scheduled on the current run loop in the default run loop mode - (like NSURLConnection). If you want to use FBSDKShareAPI in a background thread, you must manage the run loop - yourself. - */ -@interface FBSDKShareAPI : NSObject - -/*! - @abstract Convenience method to build up a share API with content and a delegate. - @param content The content to be shared. - @param delegate The receiver's delegate. - */ -+ (instancetype)shareWithContent:(id)content delegate:(id)delegate; - -/*! - @abstract The message the person has provided through the custom dialog that will accompany the share content. - */ -@property (nonatomic, copy) NSString *message; - -/*! - @abstract The graph node to which content should be shared. - */ -@property (nonatomic, copy) NSString *graphNode; - -/*! - @abstract A Boolean value that indicates whether the receiver can send the share. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see [FBSDKSharing validateWithError:] - @result YES if the receiver can send, otherwise NO. - */ -- (BOOL)canShare; - -/*! - @abstract Creates an User Owned Open Graph object without an action. - @param openGraphObject The open graph object to create. - @discussion Use this method to create an object alone, when an action is not going to be posted with the object. If - the object will be used within an action, just put the object in the action and share that as the shareContent and the - object will be created in the process. The delegate will be messaged with the results. - - Also see https://developers.facebook.com/docs/sharing/opengraph/object-api#objectapi-creatinguser - - @result YES if the receiver was able to send the request to create the object, otherwise NO. - */ -- (BOOL)createOpenGraphObject:(FBSDKShareOpenGraphObject *)openGraphObject; - -/*! - @abstract Begins the send from the receiver. - @result YES if the receiver was able to send the share, otherwise NO. - */ -- (BOOL)share; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareButton.h deleted file mode 100644 index d6b46fd..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareButton.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/*! - @abstract A button to share content. - @discussion Tapping the receiver will invoke the FBSDKShareDialog with the attached shareContent. If the dialog cannot - be shown, the button will be disabled. - */ -@interface FBSDKShareButton : FBSDKButton - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareConstants.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareConstants.h deleted file mode 100644 index 4f2af4f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareConstants.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract The error domain for all errors from FBSDKShareKit. - @discussion Error codes from the SDK in the range 200-299 are reserved for this domain. - */ -FBSDK_EXTERN NSString *const FBSDKShareErrorDomain; - -/*! - @typedef NS_ENUM(NSInteger, FBSDKShareErrorCode) - @abstract Error codes for FBSDKShareErrorDomain. - */ -typedef NS_ENUM(NSInteger, FBSDKShareErrorCode) -{ - /*! - @abstract Reserved. - */ - FBSDKShareReservedErrorCode = 200, - - /*! - @abstract The error code for errors from uploading open graph objects. - */ - FBSDKShareOpenGraphErrorCode, - - /*! - @abstract The error code for when a sharing dialog is not available. - @discussion Use the canShare methods to check for this case before calling show. - */ - FBSDKShareDialogNotAvailableErrorCode, -}; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialog.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialog.h deleted file mode 100644 index 29489a6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialog.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/*! - @abstract A dialog for sharing content on Facebook. - */ -@interface FBSDKShareDialog : NSObject - -/*! - @abstract Convenience method to show an FBSDKShareDialog with a fromViewController, content and a delegate. - @param viewController A UIViewController to present the dialog from, if appropriate. - @param content The content to be shared. - @param delegate The receiver's delegate. - */ -+ (instancetype)showFromViewController:(UIViewController *)viewController - withContent:(id)content - delegate:(id)delegate; - -/*! - @abstract A UIViewController to present the dialog from. - @discussion If not specified, the top most view controller will be automatically determined as best as possible. - */ -@property (nonatomic, weak) UIViewController *fromViewController; - -/*! - @abstract The mode with which to display the dialog. - @discussion Defaults to FBSDKShareDialogModeAutomatic, which will automatically choose the best available mode. - */ -@property (nonatomic, assign) FBSDKShareDialogMode mode; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialogMode.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialogMode.h deleted file mode 100644 index bdea19e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareDialogMode.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @typedef NS_ENUM(NSUInteger, FBSDKShareDialogMode) - @abstract Modes for the FBSDKShareDialog. - @discussion The automatic mode will progressively check the availability of different modes and open the most - appropriate mode for the dialog that is available. - */ -typedef NS_ENUM(NSUInteger, FBSDKShareDialogMode) -{ - /*! - @abstract Acts with the most appropriate mode that is available. - */ - FBSDKShareDialogModeAutomatic = 0, - /*! - @Displays the dialog in the main native Facebook app. - */ - FBSDKShareDialogModeNative, - /*! - @Displays the dialog in the iOS integrated share sheet. - */ - FBSDKShareDialogModeShareSheet, - /*! - @Displays the dialog in Safari. - */ - FBSDKShareDialogModeBrowser, - /*! - @Displays the dialog in a UIWebView within the app. - */ - FBSDKShareDialogModeWeb, - /*! - @Displays the feed dialog in Safari. - */ - FBSDKShareDialogModeFeedBrowser, - /*! - @Displays the feed dialog in a UIWebView within the app. - */ - FBSDKShareDialogModeFeedWeb, -}; - -/*! - @abstract Converts an FBLikeControlObjectType to an NSString. - */ -FBSDK_EXTERN NSString *NSStringFromFBSDKShareDialogMode(FBSDKShareDialogMode dialogMode); diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareKit.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareKit.h deleted file mode 100644 index c2406c8..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareKit.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareLinkContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareLinkContent.h deleted file mode 100644 index 9995df6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareLinkContent.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A model for status and link content to be shared. - */ -@interface FBSDKShareLinkContent : NSObject - -/*! - @abstract The description of the link. - @discussion If not specified, this field is automatically populated by information scraped from the contentURL, - typically the title of the page. This value may be discarded for specially handled links (ex: iTunes URLs). - @return The description of the link - */ -@property (nonatomic, copy) NSString *contentDescription; - -/*! - @abstract The title to display for this link. - @discussion This value may be discarded for specially handled links (ex: iTunes URLs). - @return The link title - */ -@property (nonatomic, copy) NSString *contentTitle; - -/*! - @abstract The URL of a picture to attach to this content. - @return The network URL of an image - */ -@property (nonatomic, copy) NSURL *imageURL; - -/*! - @abstract Compares the receiver to another link content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareLinkContent:(FBSDKShareLinkContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphAction.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphAction.h deleted file mode 100644 index 5f6db0a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphAction.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import -#import - -/*! - @abstract An Open Graph Action for sharing. - @discussion The property keys MUST have namespaces specified on them, such as `og:image`. - */ -@interface FBSDKShareOpenGraphAction : FBSDKShareOpenGraphValueContainer - -/*! - @abstract Convenience method to build a new action and set the object for the specified key. - @param actionType The action type of the receiver - @param object The Open Graph object represented by this action - @param key The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType object:(FBSDKShareOpenGraphObject *)object key:(NSString *)key; - -/*! - @abstract Convenience method to build a new action and set the object for the specified key. - @param actionType The action type of the receiver - @param objectID The ID of an existing Open Graph object - @param key The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType objectID:(NSString *)objectID key:(NSString *)key; - -/*! - @abstract Convenience method to build a new action and set the object for the specified key. - @param actionType The action type of the receiver - @param objectURL The URL to a page that defines the Open Graph object with meta tags - @param key The key for the object - */ -+ (instancetype)actionWithType:(NSString *)actionType objectURL:(NSURL *)objectURL key:(NSString *)key; - -/*! - @abstract Gets the action type. - @return The action type - */ -@property (nonatomic, copy) NSString *actionType; - -/*! - @abstract Compares the receiver to another Open Graph Action. - @param action The other action - @return YES if the receiver's values are equal to the other action's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphAction:(FBSDKShareOpenGraphAction *)action; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphContent.h deleted file mode 100644 index 4393b0c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphContent.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import - -/*! - @abstract A model for Open Graph content to be shared. - */ -@interface FBSDKShareOpenGraphContent : NSObject - -/*! - @abstract Open Graph Action to be shared. - @return The action - */ -@property (nonatomic, copy) FBSDKShareOpenGraphAction *action; - -/*! - @abstract Property name that points to the primary Open Graph Object in the action. - @discussion The value that this action points to will be use for rendering the preview for the share. - @return The property name for the Open Graph Object in the action - */ -@property (nonatomic, copy) NSString *previewPropertyName; - -/*! - @abstract Compares the receiver to another Open Graph content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphContent:(FBSDKShareOpenGraphContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphObject.h deleted file mode 100644 index 3a1e1a5..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphObject.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -#import - -/*! - @abstract An Open Graph Object for sharing. - @discussion The property keys MUST have namespaces specified on them, such as `og:image`, - and `og:type` is required. - - See https://developers.facebook.com/docs/sharing/opengraph/object-properties for other properties. - - You can specify nested namespaces inline to define complex properties. For example, the following - code will generate a fitness.course object with a location: - - FBSDKShareOpenGraphObject *course = [FBSDKShareOpenGraphObject objectWithProperties: - @{ - @"og:type": @"fitness.course", - @"og:title": @"Sample course", - @"fitness:metrics:location:latitude": @"41.40338", - @"fitness:metrics:location:longitude": @"2.17403", - }]; - */ -@interface FBSDKShareOpenGraphObject : FBSDKShareOpenGraphValueContainer - -/*! - @abstract Convenience method to build a new action and set the object for the specified key. - @param properties Properties for the Open Graph object, which will be parsed into the proper models - */ -+ (instancetype)objectWithProperties:(NSDictionary *)properties; - -/*! - @abstract Compares the receiver to another Open Graph Object. - @param object The other object - @return YES if the receiver's values are equal to the other object's values; otherwise NO - */ -- (BOOL)isEqualToShareOpenGraphObject:(FBSDKShareOpenGraphObject *)object; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphValueContainer.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphValueContainer.h deleted file mode 100644 index 4687828..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareOpenGraphValueContainer.h +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -@class FBSDKShareOpenGraphObject; -@class FBSDKSharePhoto; - -/*! - @abstract Protocol defining operations on open graph actions and objects. - @discussion The property keys MUST have namespaces specified on them, such as `og:image`. - */ -@protocol FBSDKShareOpenGraphValueContaining - -/*! - @abstract Gets an NSArray out of the receiver. - @param key The key for the value - @return The NSArray value or nil - */ -- (NSArray *)arrayForKey:(NSString *)key; - -/*! - @abstract Applies a given block object to the entries of the receiver. - @param block A block object to operate on entries in the receiver - */ -- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(NSString *key, id object, BOOL *stop))block; - -/*! - @abstract Returns an enumerator object that lets you access each key in the receiver. - @return An enumerator object that lets you access each key in the receiver - */ -- (NSEnumerator *)keyEnumerator; - -/*! - @abstract Gets an NSNumber out of the receiver. - @param key The key for the value - @return The NSNumber value or nil - */ -- (NSNumber *)numberForKey:(NSString *)key; - -/*! - @abstract Returns an enumerator object that lets you access each value in the receiver. - @return An enumerator object that lets you access each value in the receiver - */ -- (NSEnumerator *)objectEnumerator; - -/*! - @abstract Gets an FBSDKShareOpenGraphObject out of the receiver. - @param key The key for the value - @return The FBSDKShareOpenGraphObject value or nil - */ -- (FBSDKShareOpenGraphObject *)objectForKey:(NSString *)key; - -/*! - @abstract Enables subscript access to the values in the receiver. - @param key The key for the value - @return The value - */ -- (id)objectForKeyedSubscript:(NSString *)key; - -/*! - @abstract Parses properties out of a dictionary into the receiver. - @param properties The properties to parse. - */ -- (void)parseProperties:(NSDictionary *)properties; - -/*! - @abstract Gets an FBSDKSharePhoto out of the receiver. - @param key The key for the value - @return The FBSDKSharePhoto value or nil - */ -- (FBSDKSharePhoto *)photoForKey:(NSString *)key; - -/*! - @abstract Removes a value from the receiver for the specified key. - @param key The key for the value - */ -- (void)removeObjectForKey:(NSString *)key; - -/*! - @abstract Sets an NSArray on the receiver. - @discussion This method will throw if the array contains any values that is not an NSNumber, NSString, NSURL, - FBSDKSharePhoto or FBSDKShareOpenGraphObject. - @param array The NSArray value - @param key The key for the value - */ -- (void)setArray:(NSArray *)array forKey:(NSString *)key; - -/*! - @abstract Sets an NSNumber on the receiver. - @param number The NSNumber value - @param key The key for the value - */ -- (void)setNumber:(NSNumber *)number forKey:(NSString *)key; - -/*! - @abstract Sets an FBSDKShareOpenGraphObject on the receiver. - @param object The FBSDKShareOpenGraphObject value - @param key The key for the value - */ -- (void)setObject:(FBSDKShareOpenGraphObject *)object forKey:(NSString *)key; - -/*! - @abstract Sets an FBSDKSharePhoto on the receiver. - @param photo The FBSDKSharePhoto value - @param key The key for the value - */ -- (void)setPhoto:(FBSDKSharePhoto *)photo forKey:(NSString *)key; - -/*! - @abstract Sets an NSString on the receiver. - @param string The NSString value - @param key The key for the value - */ -- (void)setString:(NSString *)string forKey:(NSString *)key; - -/*! - @abstract Sets an NSURL on the receiver. - @param URL The NSURL value - @param key The key for the value - */ -- (void)setURL:(NSURL *)URL forKey:(NSString *)key; - -/*! - @abstract Gets an NSString out of the receiver. - @param key The key for the value - @return The NSString value or nil - */ -- (NSString *)stringForKey:(NSString *)key; - -/*! - @abstract Gets an NSURL out of the receiver. - @param key The key for the value - @return The NSURL value or nil - */ -- (NSURL *)URLForKey:(NSString *)key; - -@end - -/*! - @abstract A base class to container Open Graph values. - */ -@interface FBSDKShareOpenGraphValueContainer : NSObject - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhoto.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhoto.h deleted file mode 100644 index c3b91a6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhoto.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A photo for sharing. - */ -@interface FBSDKSharePhoto : NSObject - -/*! - @abstract Convenience method to build a new photo object with an image. - @param image If the photo is resident in memory, this method supplies the data - @param userGenerated Specifies whether the photo represented by the receiver was generated by the user or by the - application - */ -+ (instancetype)photoWithImage:(UIImage *)image userGenerated:(BOOL)userGenerated; - -/*! - @abstract Convenience method to build a new photo object with an imageURL. - @param imageURL The URL to the photo - @param userGenerated Specifies whether the photo represented by the receiver was generated by the user or by the - application - @discussion This method should only be used when adding photo content to open graph stories. - For example, if you're trying to share a photo from the web by itself, download the image and use - `photoWithImage:userGenerated:` instead. - */ -+ (instancetype)photoWithImageURL:(NSURL *)imageURL userGenerated:(BOOL)userGenerated; - -/*! - @abstract If the photo is resident in memory, this method supplies the data. - @return UIImage representation of the photo - */ -@property (nonatomic, strong) UIImage *image; - -/*! - @abstract The URL to the photo. - @return URL that points to a network location or the location of the photo on disk - */ -@property (nonatomic, copy) NSURL *imageURL; - -/*! - @abstract Specifies whether the photo represented by the receiver was generated by the user or by the application. - @return YES if the photo is user-generated, otherwise NO - */ -@property (nonatomic, assign, getter=isUserGenerated) BOOL userGenerated; - -/*! - @abstract Compares the receiver to another photo. - @param photo The other photo - @return YES if the receiver's values are equal to the other photo's values; otherwise NO - */ -- (BOOL)isEqualToSharePhoto:(FBSDKSharePhoto *)photo; - -/*! - @abstract The user generated caption for the photo. Note that the 'caption' must come from - * the user, as pre-filled content is forbidden by the Platform Policies (2.3). - @return the Photo's caption if exists else returns null. - */ -@property (nonatomic, copy) NSString *caption; - - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhotoContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhotoContent.h deleted file mode 100644 index 1fd0782..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharePhotoContent.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A model for photo content to be shared. - */ -@interface FBSDKSharePhotoContent : NSObject - -/*! - @abstract Photos to be shared. - @return Array of the photos (FBSDKSharePhoto) - */ -@property (nonatomic, copy) NSArray *photos; - -/*! - @abstract Compares the receiver to another photo content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToSharePhotoContent:(FBSDKSharePhotoContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideo.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideo.h deleted file mode 100644 index 2b6ae0c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideo.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A video for sharing. - */ -@interface FBSDKShareVideo : NSObject - -/*! - @abstract Convenience method to build a new video object with a videoURL. - @param videoURL The URL to the video - application - */ -+ (instancetype)videoWithVideoURL:(NSURL *)videoURL; - -/*! - @abstract The file URL to the video. - @return URL that points to the location of the video on disk - */ -@property (nonatomic, copy) NSURL *videoURL; - -/*! - @abstract Compares the receiver to another video. - @param video The other video - @return YES if the receiver's values are equal to the other video's values; otherwise NO - */ -- (BOOL)isEqualToShareVideo:(FBSDKShareVideo *)video; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideoContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideoContent.h deleted file mode 100644 index bead676..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKShareVideoContent.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import -#import -#import - -/*! - @abstract A model for video content to be shared. - */ -@interface FBSDKShareVideoContent : NSObject - -/*! - @abstract The photo that represents the video. - @return The photo - */ -@property (nonatomic, copy) FBSDKSharePhoto *previewPhoto; - -/*! - @abstract The video to be shared. - @return The video - */ -@property (nonatomic, copy) FBSDKShareVideo *video; - -/*! - @abstract Compares the receiver to another video content. - @param content The other content - @return YES if the receiver's values are equal to the other content's values; otherwise NO - */ -- (BOOL)isEqualToShareVideoContent:(FBSDKShareVideoContent *)content; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharing.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharing.h deleted file mode 100644 index d6d373e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharing.h +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -@protocol FBSDKSharingDelegate; - -/*! - @abstract The common interface for components that initiate sharing. - @see FBSDKShareDialog - @see FBSDKMessageDialog - @see FBSDKShareAPI - */ -@protocol FBSDKSharing - -/*! - @abstract The receiver's delegate or nil if it doesn't have a delegate. - */ -@property (nonatomic, weak) id delegate; - -/*! - @abstract The content to be shared. - */ -@property (nonatomic, copy) id shareContent; - -/*! - @abstract A Boolean value that indicates whether the receiver should fail if it finds an error with the share content. - @discussion If NO, the sharer will still be displayed without the data that was mis-configured. For example, an - invalid placeID specified on the shareContent would produce a data error. - */ -@property (nonatomic, assign) BOOL shouldFailOnDataError; - -/*! - @abstract Validates the content on the receiver. - @param errorRef If an error occurs, upon return contains an NSError object that describes the problem. - @return YES if the content is valid, otherwise NO. - */ -- (BOOL)validateWithError:(NSError **)errorRef; - -@end - -/*! - @abstract The common interface for dialogs that initiate sharing. - */ -@protocol FBSDKSharingDialog - -/*! - @abstract A Boolean value that indicates whether the receiver can initiate a share. - @discussion May return NO if the appropriate Facebook app is not installed and is required or an access token is - required but not available. This method does not validate the content on the receiver, so this can be checked before - building up the content. - @see [FBSDKSharing validateWithError:] - @result YES if the receiver can share, otherwise NO. - */ -- (BOOL)canShow; - -/*! - @abstract Shows the dialog. - @result YES if the receiver was able to begin sharing, otherwise NO. - */ -- (BOOL)show; - -@end - -/*! - @abstract A delegate for FBSDKSharing. - @discussion The delegate is notified with the results of the sharer as long as the application has permissions to - receive the information. For example, if the person is not signed into the containing app, the sharer may not be able - to distinguish between completion of a share and cancellation. - */ -@protocol FBSDKSharingDelegate - -/*! - @abstract Sent to the delegate when the share completes without error or cancellation. - @param sharer The FBSDKSharing that completed. - @param results The results from the sharer. This may be nil or empty. - */ -- (void)sharer:(id)sharer didCompleteWithResults:(NSDictionary *)results; - -/*! - @abstract Sent to the delegate when the sharer encounters an error. - @param sharer The FBSDKSharing that completed. - @param error The error. - */ -- (void)sharer:(id)sharer didFailWithError:(NSError *)error; - -/*! - @abstract Sent to the delegate when the sharer is cancelled. - @param sharer The FBSDKSharing that completed. - */ -- (void)sharerDidCancel:(id)sharer; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingButton.h deleted file mode 100644 index a3af423..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingButton.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract The common interface for sharing buttons. - @see FBSDKSendButton - @see FBSDKShareButton - */ -@protocol FBSDKSharingButton - -/*! - @abstract The content to be shared. - */ -@property (nonatomic, copy) id shareContent; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingContent.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingContent.h deleted file mode 100644 index 5f70083..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Headers/FBSDKSharingContent.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2014-present, Facebook, Inc. All rights reserved. -// -// You are hereby granted a non-exclusive, worldwide, royalty-free license to use, -// copy, modify, and distribute this software in source code or binary form for use -// in connection with the web services and APIs provided by Facebook. -// -// As with any software that integrates with the Facebook platform, your use of -// this software is subject to the Facebook Developer Principles and Policies -// [http://developers.facebook.com/policy/]. This copyright notice shall be -// included in all copies or substantial portions of the software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -#import - -#import - -/*! - @abstract A base interface for content to be shared. - */ -@protocol FBSDKSharingContent - -/*! - @abstract URL for the content being shared. - @discussion This URL will be checked for all link meta tags for linking in platform specific ways. See documentation - for App Links (https://developers.facebook.com/docs/applinks/) - @return URL representation of the content link - */ -@property (nonatomic, copy) NSURL *contentURL; - -/*! - @abstract List of IDs for taggable people to tag with this content. - @description See documentation for Taggable Friends - (https://developers.facebook.com/docs/graph-api/reference/user/taggable_friends) - @return Array of IDs for people to tag (NSString) - */ -@property (nonatomic, copy) NSArray *peopleIDs; - -/*! - @abstract The ID for a place to tag with this content. - @return The ID for the place to tag - */ -@property (nonatomic, copy) NSString *placeID; - -/*! - @abstract A value to be added to the referrer URL when a person follows a link from this shared content on feed. - @return The ref for the content. - */ -@property (nonatomic, copy) NSString *ref; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Info.plist deleted file mode 100644 index 3fad48d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Info.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Modules/module.modulemap deleted file mode 100644 index faa8711..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/FBSDKShareKit.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module FBSDKShareKit { - umbrella header "FBSDKShareKit.h" - - export * - module * { export * } -} diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h deleted file mode 100644 index ff42dd0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/UMSocialFacebookHandler.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// UMSocialFacebookHandler.h -// SocialSDK -// -// Created by yeahugo on 13-12-23. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import - -@interface UMSocialFacebookHandler : NSObject - -/** - 设置facebook应用id,和url地址 - - @param appID facebook应用ID - @param urlString 分享纯文字用到的url地址 - - */ -+(void)setFacebookAppID:(NSString *)appID shareFacebookWithURL:(NSString *)urlString; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/libSocialFacebook.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/libSocialFacebook.a deleted file mode 100644 index 9f21235..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Facebook/libSocialFacebook.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h deleted file mode 100644 index 40af9ba..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/UMSocialInstagramHandler.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// UMSocialInstragramHandler.h -// SocialSDK -// -// Created by yeahugo on 14-1-8. -// Copyright (c) 2014年 Umeng. All rights reserved. -// - -#import -#import - -@interface UMSocialInstagramHandler : NSObject - -/** - 打开分享到Instagram - - @param isScale 是否等比例缩放,因为分享到instagram,需要传入正方形图片,若等比例缩放则采用传入的color填充周围的空白,若不需要等比例缩放则缩放成正方形 - @param color 等比例缩放设置的颜色,设成nil则默认为黑色 - - @return color - */ -+(void)openInstagramWithScale:(BOOL)isScale paddingColor:(UIColor *)color; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/libSocialInstagram.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/libSocialInstagram.a deleted file mode 100644 index aca6b04..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Instagram/libSocialInstagram.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h deleted file mode 100644 index 8fa78c7..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/UMSocialLaiwangHandler.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// UMSocialLaiwangHandler.h -// SocialSDK -// -// Created by yeahugo on 13-12-23. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import - -@interface UMSocialLaiwangHandler : NSObject - -/** - 设置来往appID,appSecret,description,url - - @param laiwangAppID 来往AppID - @param appSecret 来往appSecret - @param description 显示应用来源名称 - @param urlString 分享url地址 - - */ -+(void)setLaiwangAppId:(NSString *)laiwangAppId - appSecret:(NSString *)appSecret - appDescription:(NSString *)description - urlStirng:(NSString *)urlString; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/libSocialLaiWang.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/libSocialLaiWang.a deleted file mode 100644 index e896307..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/LaiWang/libSocialLaiWang.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h deleted file mode 100644 index 502fea1..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/UMSocialLineHandler.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// UMSocialLineHandler.h -// SocialSDK -// -// Created by Gavin Ye on 8/21/14. -// Copyright (c) 2014 Umeng. All rights reserved. -// - -#import - -typedef enum { - UMSocialLineMessageTypeText, - UMSocialLineMessageTypeImage, -}UMSocialLineMessageType; - -@interface UMSocialLineHandler : NSObject - -+(void)openLineShare:(UMSocialLineMessageType)messageType; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/libSocialLine.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/libSocialLine.a deleted file mode 100644 index b25b871..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Line/libSocialLine.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h deleted file mode 100644 index f8d2369..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/UMSocialSinaHandler.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// UMSocialSinaHandler.h -// SocialSDK -// -// Created by yeahugo on 14-6-11. -// Copyright (c) 2014年 Umeng. All rights reserved. -// - -#import - -@interface UMSocialSinaHandler : NSObject - -+(void)openSSOWithRedirectURL:(NSString *)redirectURL; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/libSocialSina.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/libSocialSina.a deleted file mode 100644 index d2204a2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Sina/libSocialSina.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h deleted file mode 100644 index e375275..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/UMSocialSinaSSOHandler.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// UMSocialSinaSSOHandler.h -// SocialSDK -// -// Created by Gavin Ye on 3/27/15. -// Copyright (c) 2015 Umeng. All rights reserved. -// - -#import - -/** - 使用最新版本的新浪微博官方SDK处理新浪微博SSO授权 - - */ -@interface UMSocialSinaSSOHandler : NSObject - -/** - 设置使用最新新浪微博SDK来处理SSO授权(通过客户端设置appkey进行访问) - - @param appKey 新浪App Key - @param redirectURL 回调URL - - */ - -+(void)openNewSinaSSOWithAppKey:(NSString *)appKey - RedirectURL:(NSString *)redirectURL; -/** - 设置使用最新新浪微博SDK来处理SSO授权 - - @param redirectURL 回调URL - - */ -+(void)openNewSinaSSOWithRedirectURL:(NSString *)redirectURL; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h deleted file mode 100755 index 9874000..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboGame.h +++ /dev/null @@ -1,168 +0,0 @@ -// -// WBHttpRequest+WeiboGame.h -// WeiboSDK -// -// Created by insomnia on 15/3/11. -// Copyright (c) 2015年 SINA iOS Team. All rights reserved. -// - -#import "WBHttpRequest.h" - -@interface WBHttpRequest (WeiboGame) - -/*! - @method - - @abstract - 新增游戏对象。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)addGameObject:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 游戏成就对象入库/更新。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)addGameAchievementObject:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 用户获得游戏成就关系入库/更新。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)addGameAchievementGain:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 用户游戏得分关系入库/更新。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)addGameScoreGain:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - - -/*! - @method - - @abstract - 读取玩家游戏分数。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)requestForGameScore:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 读取玩家互粉好友游戏分数。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)requestForFriendsGameScore:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 读取玩家获取成就列表。 在http://open.weibo.com/wiki/%E6%B8%B8%E6%88%8F%E6%8E%A5%E5%8F%A3 中有关于该接口的细节说明。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)requestForGameAchievementGain:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h deleted file mode 100755 index e0c0b13..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboShare.h +++ /dev/null @@ -1,93 +0,0 @@ -// -// WBHttpRequest+WeiboShare.h -// WeiboSDK -// -// Created by DannionQiu on 14/10/31. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import "WBHttpRequest.h" - -@class WBImageObject; - -@interface WBHttpRequest (WeiboShare) - -/*! - @method - - @abstract - 获得当前授权用户的微博id列表。 - - @param userID 当前授权用户的uid - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 -*/ -+ (WBHttpRequest *)requestForStatusIDsFromCurrentUser:(NSString*)userID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 转发微博。转发微博id所对应的微博。 - - @param statusID 微博id,微博的唯一标识符。 - - @param text 添加的转发文本,内容不超过140个汉字,不填则默认为“转发微博”。 - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - */ -+ (WBHttpRequest *)requestForRepostAStatus:(NSString*)statusID - repostText:(NSString*)text - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - 发表一个微博(无图或者带一张图片的微博)。 - - @param statusText 要发布的微博文本内容,内容不超过140个汉字。 - - @param imageObject 要上传的图片,仅支持JPEG、GIF、PNG格式,图片大小小于5M。这个参数可为nil。由于只能传一张图片,若imageObject和url都有值,请看@caution。 - - @param url 图片的URL地址,必须以http开头。这个参数可为nil,由于只能传一张图片,若imageObject和url都有值,请看@caution。 - - @param accessToken 当前授权用户的accessToken - - @param otherProperties 一个NSDictionary字典,承载任意想额外添加到请求中的参数。 - - @param queue 指定发送请求的NSOperationQueue,如果这个参数为nil,则请求会发送在MainQueue( [NSOperationQueue mainQueue] )中。 - - @param handler 完成请求后会回调handler,处理完成请求后的逻辑。 - - @caution 注意,如果参数imageObject和url都有值,则发布带有imageObject所对应的图片,忽略url所对应的图片。 - */ -+ (WBHttpRequest *)requestForShareAStatus:(NSString*)statusText - contatinsAPicture:(WBImageObject*)imageObject - orPictureUrl:(NSString*)url - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h deleted file mode 100755 index 47657a4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest+WeiboUser.h +++ /dev/null @@ -1,439 +0,0 @@ -// -// WBHttpRequest+WeiboUser.h -// WeiboSDK -// -// Created by DannionQiu on 14-9-23. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import "WBHttpRequest.h" - -@interface WBHttpRequest (WeiboUser) - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/friends". - - @discussion - Simplifies preparing a request and sending request to retrieve the user's friends. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the - user's friends. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/friends/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFriendsListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/friends/ids". - - @discussion - Simplifies preparing a request and sending request to retrieve the user's friends' UserID. - - A successful Open API call will return an NSDictionary of objects which contanis an array of NSString representing the - user's friends' UserID. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/friends/ids/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFriendsUserIDListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/friends/in_common". - - @discussion - Simplifies preparing a request and sending request to retrieve the common friends list between two users.. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the - user's friends. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/friends/in_common/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForCommonFriendsListBetweenUser:(NSString*)currentUserID - andUser:(NSString*)anotherUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/friends/bilateral". - - @discussion - Simplifies preparing a request and sending request to retrieve the list of the users that are following the specified user and are being followed by the specified user. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the - users that are following the specified user and are being followed by the specified user. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/friends/bilateral/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForBilateralFriendsListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/followers". - - @discussion - Simplifies preparing a request and sending request to retrieve the user's followers. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the - user's followers. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/followers/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFollowersListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/followers/ids". - - @discussion - Simplifies preparing a request and sending request to retrieve the user's followers' UserID. - - A successful Open API call will return an NSDictionary of objects which contanis an array of NSString representing the - user's followers' UserID. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/followers/ids/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFollowersUserIDListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/followers/active". - - @discussion - Simplifies preparing a request and sending request to retrieve the active(high quality) followers list of a user. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the active(high quality) followers list of a user. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/followers/active/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForActiveFollowersListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/friends_chain/followers". - - @discussion - Simplifies preparing a request and sending request to retrieve the users that are being followed by the authenticating user and are following the specified user. - - A successful Open API call will return an NSDictionary of objects which contanis an array of objects representing the users that are being followed by the authenticating user and are following the specified user. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/friends_chain/followers/en - - @param currentUserID should be the current User's UserID which has been authorized. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForBilateralFollowersListOfUser:(NSString*)currentUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/show". - - @discussion - Simplifies preparing a request and sending request to retrieve the relationship of two users. - - A successful Open API call will return an NSDictionary of objects which contanis the relationship of two users. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/show - - @param targetUserID a User ID - - @param sourceUserID a User ID - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFriendshipDetailBetweenTargetUser:(NSString*)targetUserID - andSourceUser:(NSString*)sourceUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/create". - - @discussion - Simplifies preparing a request and sending request to Follow a user. - - A successful Open API call will return an object representing the user to be followed. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/create/en - - @param theUserToBeFollowed the userID of the user which you want to follow. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForFollowAUser:(NSString*)theUserToBeFollowed - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/destroy". - - @discussion - Simplifies preparing a request and sending request to cancel following a user. - - A successful Open API call will return an object representing the user to be followed. - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/destroy/en - - @param theUserThatYouDontLike the userID of the user which you want to cancel following. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForCancelFollowAUser:(NSString*)theUserThatYouDontLike - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "friendships/followers/destroy". - - @discussion - Simplifies preparing a request and sending request to remove a follower of the authenticating user. - - A successful Open API call will return an object representing the user to be followed. - - this API requires advanced level authorization. You can see more details about advanced level authorization in http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#scope - - You can see more details about this API in http://open.weibo.com/wiki/2/friendships/followers/destroy/en - - @param theUserThatYouDontLike the userID of the follower which you want to remove. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForRemoveFollowerUser:(NSString*)theUserThatYouDontLike - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "messages/invite". - - @discussion - Simplifies preparing a request and sending request to send invitation to a bilateral friend of the authenticating user. - - A successful Open API call will return an NSDictionary of objects which contanis objects representing sender and receiver and other invitation details. - - You can see more details about this API in http://open.weibo.com/wiki/2/messages/invite - - @param theUserThatShouldBeYourBilateralFriend the userID of the follower which you want to remove. - - @param accessToken The token string. - - @param text The text content in your invitation message. should not be nil. - - @param url The url in your invitation message. can be nil. - - @param logoUrl The logoUrl in your invitation message. can be nil. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForInviteBilateralFriend:(NSString*)theUserThatShouldBeYourBilateralFriend - withAccessToken:(NSString*)accessToken - inviteText:(NSString*)text - inviteUrl:(NSString*)url - inviteLogoUrl:(NSString*)logoUrl - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - - -/*! - @method - - @abstract - Creates a request representing a Open API call to the "users/show". - - @discussion - Simplifies preparing a request and sending request to retrieve user profile by user ID.. - - A successful Open API call will return a object representing the user profile by user ID. - - You can see more details about this API in http://open.weibo.com/wiki/2/users/show/en - - @param aUserID a User ID. - - @param accessToken The token string. - - @param otherProperties Any additional properties for the Open API Request. - - @param queue specify the queue that you want to send request on, if this param is nil, the request will be start on MainQueue( [NSOperationQueue mainQueue] ). - - @param handler the comletion block which will be executed after received response from Open API server. - */ -+ (WBHttpRequest *)requestForUserProfile:(NSString*)aUserID - withAccessToken:(NSString*)accessToken - andOtherProperties:(NSDictionary*)otherProperties - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h deleted file mode 100755 index dcd5325..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBHttpRequest.h +++ /dev/null @@ -1,182 +0,0 @@ -// -// WBHttpRequest.h -// WeiboSDK -// -// Created by DannionQiu on 14-9-18. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import -#import - -#pragma mark - WBHttpRequest and WBHttpRequestDelegate -@class WBHttpRequest; - -/** - 接收并处理来自微博sdk对于网络请求接口的调用响应 以及openAPI - 如inviteFriend、logOutWithToken的请求 - */ -@protocol WBHttpRequestDelegate - -/** - 收到一个来自微博Http请求的响应 - - @param response 具体的响应对象 - */ -@optional -- (void)request:(WBHttpRequest *)request didReceiveResponse:(NSURLResponse *)response; - -/** - 收到一个来自微博Http请求失败的响应 - - @param error 错误信息 - */ -@optional -- (void)request:(WBHttpRequest *)request didFailWithError:(NSError *)error; - -/** - 收到一个来自微博Http请求的网络返回 - - @param result 请求返回结果 - */ -@optional -- (void)request:(WBHttpRequest *)request didFinishLoadingWithResult:(NSString *)result; - -/** - 收到一个来自微博Http请求的网络返回 - - @param data 请求返回结果 - */ -@optional -- (void)request:(WBHttpRequest *)request didFinishLoadingWithDataResult:(NSData *)data; - -/** - 收到快速SSO授权的重定向 - - @param URI - */ -@optional -- (void)request:(WBHttpRequest *)request didReciveRedirectResponseWithURI:(NSURL *)redirectUrl; - -@end - - -/** - 微博封装Http请求的消息结构 - - */ -@interface WBHttpRequest : NSObject -{ - NSURLConnection *connection; - NSMutableData *responseData; -} - -/** - 用户自定义请求地址URL - */ -@property (nonatomic, strong) NSString *url; - -/** - 用户自定义请求方式 - - 支持"GET" "POST" - */ -@property (nonatomic, strong) NSString *httpMethod; - -/** - 用户自定义请求参数字典 - */ -@property (nonatomic, strong) NSDictionary *params; - -/** - WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 - */ -@property (nonatomic, weak) id delegate; - -/** - 用户自定义TAG - - 用于区分回调Request - */ -@property (nonatomic, strong) NSString* tag; - -/** - 统一HTTP请求接口 - 调用此接口后,将发送一个HTTP网络请求 - @param url 请求url地址 - @param httpMethod 支持"GET" "POST" - @param params 向接口传递的参数结构 - @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 - @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 - */ -+ (WBHttpRequest *)requestWithURL:(NSString *)url - httpMethod:(NSString *)httpMethod - params:(NSDictionary *)params - delegate:(id)delegate - withTag:(NSString *)tag; - -/** - 统一微博Open API HTTP请求接口 - 调用此接口后,将发送一个HTTP网络请求(用于访问微博open api) - @param accessToken 应用获取到的accessToken,用于身份验证 - @param url 请求url地址 - @param httpMethod 支持"GET" "POST" - @param params 向接口传递的参数结构 - @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 - @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 - */ -+ (WBHttpRequest *)requestWithAccessToken:(NSString *)accessToken - url:(NSString *)url - httpMethod:(NSString *)httpMethod - params:(NSDictionary *)params - delegate:(id)delegate - withTag:(NSString *)tag; - - - -/** - 取消网络请求接口 - 调用此接口后,将取消当前网络请求,建议同时[WBHttpRequest setDelegate:nil]; - 注意:该方法只对使用delegate的request方法有效。无法取消任何使用block的request的网络请求接口。 - */ -- (void)disconnect; - -#pragma mark - block extension - -typedef void (^WBRequestHandler)(WBHttpRequest *httpRequest, - id result, - NSError *error); - -/** - 统一微博Open API HTTP请求接口 - 调用此接口后,将发送一个HTTP网络请求(用于访问微博open api) - @param url 请求url地址 - @param httpMethod 支持"GET" "POST" - @param params 向接口传递的参数结构 - @param queue 发起请求的NSOperationQueue对象,如queue为nil,则在主线程([NSOperationQueue mainQueue])发起请求。 - @param handler 接口请求返回调用的block方法 - */ -+ (WBHttpRequest *)requestWithURL:(NSString *)url - httpMethod:(NSString *)httpMethod - params:(NSDictionary *)params - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - - -/** - 统一HTTP请求接口 - 调用此接口后,将发送一个HTTP网络请求 - @param url 请求url地址 - @param httpMethod 支持"GET" "POST" - @param params 向接口传递的参数结构 - @param queue 发起请求的NSOperationQueue对象,如queue为nil,则在主线程([NSOperationQueue mainQueue])发起请求。 - @param handler 接口请求返回调用的block方法 - */ -+ (WBHttpRequest *)requestWithAccessToken:(NSString *)accessToken - url:(NSString *)url - httpMethod:(NSString *)httpMethod - params:(NSDictionary *)params - queue:(NSOperationQueue*)queue - withCompletionHandler:(WBRequestHandler)handler; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h deleted file mode 100755 index 8f92123..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKBasicButton.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// WBSDKBasicButton.h -// WeiboSDK -// -// Created by DannionQiu on 14/10/24. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import - -@class WBSDKBasicButton; -typedef void (^WBSDKButtonHandler)(WBSDKBasicButton *button, - BOOL isSuccess, - NSDictionary *resultDict); - -@interface WBSDKBasicButton : UIButton - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h deleted file mode 100755 index dfd7f67..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKCommentButton.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// WBSDKCommentButton.h -// WeiboSDK -// -// Created by DannionQiu on 14/10/26. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import "WBSDKBasicButton.h" - -@interface WBSDKCommentButton : WBSDKBasicButton - -/** - 初始化一个社会化评论按钮 - @param frame 按钮的frame值 - @param accessToken 用户授权后获取的Token - @param keyWord 社会化评论的热点词 - @param urlString 社会化评论链接,可传空 - @param category 领域ID, 此参数为必选参数。 - @param handler 回调函数,当用户点击按钮,进行完与社会化评论组件相关的交互之后,回调的函数。 - */ -- (id)initWithFrame:(CGRect)frame - accessToken:(NSString*)accessToken - keyword:(NSString*)keyWord - urlString:(NSString*)urlString - category:(NSString*)category - completionHandler:(WBSDKButtonHandler)handler; - -@property (nonatomic, strong)NSString* keyWord; -@property (nonatomic, strong)NSString* accessToken; -@property (nonatomic, strong)NSString* urlString; -@property (nonatomic, strong)NSString* category; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h deleted file mode 100755 index 8abe189..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WBSDKRelationshipButton.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// WBSDKRelationshipButton.h -// WeiboSDK -// -// Created by DannionQiu on 14/10/26. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import "WBSDKBasicButton.h" - -enum -{ - WBSDKRelationshipButtonStateFollow, - WBSDKRelationshipButtonStateUnfollow -}; -typedef NSUInteger WBSDKRelationshipButtonState; - - - -@interface WBSDKRelationshipButton : WBSDKBasicButton - -/** - 初始化一个关注组件按钮 - @param frame 按钮的frame值 - @param accessToken 用户授权后获取的Token - @param currentUserID 当前用户的uid值 - @param followerUserID 希望当前用户加关注的用户uid值 - @param handler 回调函数,当用户点击按钮,进行完关注组件相关的交互之后,回调的函数。 - */ -- (id)initWithFrame:(CGRect)frame - accessToken:(NSString*)accessToken - currentUser:(NSString*)currentUserID - followUser:(NSString*)followerUserID - completionHandler:(WBSDKButtonHandler)handler; - -@property (nonatomic, strong)NSString* accessToken; -@property (nonatomic, strong)NSString* currentUserID; -@property (nonatomic, strong)NSString* followUserID; - - -@property (nonatomic, assign)WBSDKRelationshipButtonState currentRelationShip; - - -/** - 获取最新的关注状态 - 该方法会调用OpenApi,获取当前用户与目标用户之间的关注状态,并将按钮的状态改变为正确的状态。 - */ -- (void)checkCurrentRelationship; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_error_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_error_icon@2x.png deleted file mode 100755 index d1b9064..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_error_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_success_icon@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_success_icon@2x.png deleted file mode 100755 index bd75226..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/alert_success_icon@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close.png deleted file mode 100755 index 1fd28ac..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close@2x.png deleted file mode 100755 index 78eaa11..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/close@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue@2x.png deleted file mode 100755 index 1652d54..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_disable@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_disable@2x.png deleted file mode 100755 index 3779ce9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_disable@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_highlighted@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_highlighted@2x.png deleted file mode 100755 index 3404f94..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_big_blue_highlighted@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white.png deleted file mode 100755 index 732cc94..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white_highlighted.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white_highlighted.png deleted file mode 100755 index 5ef5cf3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_button_white_highlighted.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_icon_arrow@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_icon_arrow@2x.png deleted file mode 100755 index 2891f50..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/common_icon_arrow@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background.png deleted file mode 100755 index dcfc0ea..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background@2x.png deleted file mode 100755 index 8879d32..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_keyboardbutton_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background.png deleted file mode 100755 index c582e4c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background@2x.png deleted file mode 100755 index d2ed222..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/compose_toolbar_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/empty_failed.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/empty_failed.png deleted file mode 100755 index 4da51e0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/empty_failed.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_background@2x.png deleted file mode 100755 index 8fe6aa9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background@2x.png deleted file mode 100755 index db8e5b6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background_highlighted@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background_highlighted@2x.png deleted file mode 100755 index 1b1143d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/login_country_background_highlighted@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background.png deleted file mode 100755 index 4eeec60..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background@2x.png deleted file mode 100755 index 00cb3d9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7.png deleted file mode 100755 index 0a9e7c3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7@2x.png deleted file mode 100755 index 9e46e44..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/navigationbar_background_os7@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/progresshud_background@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/progresshud_background@2x.png deleted file mode 100755 index 4067605..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/progresshud_background@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo.png deleted file mode 100755 index c656b5e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@2x.png deleted file mode 100755 index 7e0f11c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@3x.png deleted file mode 100755 index 0d04420..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/sdk_weibo_logo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention.png deleted file mode 100755 index ee95e72..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@2x.png deleted file mode 100755 index 70b222e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@3x.png deleted file mode 100755 index 02cf0df..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_addattention@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention.png deleted file mode 100755 index e5b8011..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@2x.png deleted file mode 100755 index b5cb584..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@3x.png deleted file mode 100755 index 6ef6f80..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/timeline_relationship_icon_attention@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@2x.png deleted file mode 100755 index ab80b1b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@3x.png deleted file mode 100755 index 5886944..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@2x.png deleted file mode 100755 index bf472da..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@3x.png deleted file mode 100755 index 1fd16b5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/images/verify_code_button_highlighted@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/others/countryList b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/others/countryList deleted file mode 100755 index 86e85d9..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.bundle/others/countryList +++ /dev/null @@ -1 +0,0 @@ -{"香港地区":{"code":"00852","rule":{"mcc":["454"]}},"台湾地区":{"code":"00886","rule":{"mcc":["466"]}},"澳门地区":{"code":"00853","rule":{"mcc":["455"]}},"日本":{"code":"0081","rule":{"mcc":["440","441"]}},"韩国":{"code":"0082","rule":{"mcc":["450"]}},"新加坡":{"code":"0065","rule":{"mcc":["525"]}},"马来西亚":{"code":"0060","rule":{"mcc":["502"]}},"美国":{"code":"001","rule":{"mcc":["310","311","316"]}},"加拿大":{"code":"001","rule":{"mcc":["302"]}},"澳大利亚":{"code":"0061","rule":{"mcc":["505"]}},"英国":{"code":"0044","rule":{"mcc":["234"]}},"法国":{"code":"0033","rule":{"mcc":["208"]}},"俄罗斯":{"code":"007","rule":{"mcc":["250"]}},"印度":{"code":"0091","rule":{"mcc":["404"]}},"泰国":{"code":"0066","rule":{"mcc":["520"]}},"德国":{"code":"0049","rule":{"mcc":["262"]}}} \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h deleted file mode 100755 index f04b789..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboSDK.h +++ /dev/null @@ -1,755 +0,0 @@ -// -// WeiboSDKHeaders.h -// WeiboSDKDemo -// -// Created by Wade Cheng on 4/3/13. -// Copyright (c) 2013 SINA iOS Team. All rights reserved. -// - -#import -#import - -#import "WBHttpRequest.h" -#import "WBHttpRequest+WeiboUser.h" -#import "WBHttpRequest+WeiboShare.h" -#import "WBHttpRequest+WeiboToken.h" -#import "WBHttpRequest+WeiboGame.h" -#import "WBSDKRelationshipButton.h" -#import "WBSDKCommentButton.h" - - -typedef NS_ENUM(NSInteger, WeiboSDKResponseStatusCode) -{ - WeiboSDKResponseStatusCodeSuccess = 0,//成功 - WeiboSDKResponseStatusCodeUserCancel = -1,//用户取消发送 - WeiboSDKResponseStatusCodeSentFail = -2,//发送失败 - WeiboSDKResponseStatusCodeAuthDeny = -3,//授权失败 - WeiboSDKResponseStatusCodeUserCancelInstall = -4,//用户取消安装微博客户端 - WeiboSDKResponseStatusCodePayFail = -5,//支付失败 - WeiboSDKResponseStatusCodeShareInSDKFailed = -8,//分享失败 详情见response UserInfo - WeiboSDKResponseStatusCodeUnsupport = -99,//不支持的请求 - WeiboSDKResponseStatusCodeUnknown = -100, -}; - -@protocol WeiboSDKDelegate; -@protocol WBHttpRequestDelegate; -@class WBBaseRequest; -@class WBBaseResponse; -@class WBMessageObject; -@class WBImageObject; -@class WBBaseMediaObject; -@class WBHttpRequest; -@class WBOrderObject; -/** - 微博SDK接口类 - */ -@interface WeiboSDK : NSObject - -/** - 检查用户是否安装了微博客户端程序 - @return 已安装返回YES,未安装返回NO - */ -+ (BOOL)isWeiboAppInstalled; - -/** - 检查用户是否可以通过微博客户端进行分享 - @return 可以使用返回YES,不可以使用返回NO - */ -+ (BOOL)isCanShareInWeiboAPP; - -/** - 检查用户是否可以使用微博客户端进行SSO授权 - @return 可以使用返回YES,不可以使用返回NO - */ -+ (BOOL)isCanSSOInWeiboApp; - -/** - 打开微博客户端程序 - @return 成功打开返回YES,失败返回NO - */ -+ (BOOL)openWeiboApp; - -/** - 获取微博客户端程序的itunes安装地址 - @return 微博客户端程序的itunes安装地址 - */ -+ (NSString *)getWeiboAppInstallUrl; - -/** - 获取当前微博客户端程序所支持的SDK最高版本 - @return 当前微博客户端程序所支持的SDK最高版本号,返回 nil 表示未安装微博客户端 - */ -+ (NSString *)getWeiboAppSupportMaxSDKVersion __attribute__((deprecated)); - -/** - 获取当前微博SDK的版本号 - @return 当前微博SDK的版本号 - */ -+ (NSString *)getSDKVersion; - - -extern NSString * const WeiboSDKGetAidSucessNotification; -extern NSString * const WeiboSDKGetAidFailNotification; -/** - 获取当前微博SDK的aid - 返回的aid值可能为 nil ,当值为 nil 时会尝试获取 aid 值。 - 当获取成功( aid 值变为有效值)时,SDK会发出名为 WeiboSDKGetAidSucessNotification 的通知,通知中带有 aid 值。 - 当获取失败时,SDK会发出名为 WeiboSDKGetAidFailNotification 的通知,通知中带有 NSError 对象。 - @return aid 用于广告的与设备信息相关的标识符 - */ -+ (NSString *)getWeiboAid; - -/** - 向微博客户端程序注册第三方应用 - @param appKey 微博开放平台第三方应用appKey - @return 注册成功返回YES,失败返回NO - */ -+ (BOOL)registerApp:(NSString *)appKey; - -/** - 处理微博客户端程序通过URL启动第三方应用时传递的数据 - - 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用 - @param url 启动第三方应用的URL - @param delegate WeiboSDKDelegate对象,用于接收微博触发的消息 - @see WeiboSDKDelegate - */ -+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; - -/** - 发送请求给微博客户端程序,并切换到微博 - - 请求发送给微博客户端程序之后,微博客户端程序会进行相关的处理,处理完成之后一定会调用 [WeiboSDKDelegate didReceiveWeiboResponse:] 方法将处理结果返回给第三方应用 - - @param request 具体的发送请求 - - @see [WeiboSDKDelegate didReceiveWeiboResponse:] - @see WBBaseResponse - */ -+ (BOOL)sendRequest:(WBBaseRequest *)request; - -/** - 收到微博客户端程序的请求后,发送对应的应答给微博客户端端程序,并切换到微博 - - 第三方应用收到微博的请求后,异步处理该请求,完成后必须调用该函数将应答返回给微博 - - @param response 具体的应答内容 - @see WBBaseRequest - */ -+ (BOOL)sendResponse:(WBBaseResponse *)response; - -/** - 设置WeiboSDK的调试模式 - - 当开启调试模式时,WeiboSDK会在控制台输出详细的日志信息,开发者可以据此调试自己的程序。默认为 NO - @param enabled 开启或关闭WeiboSDK的调试模式 - */ -+ (void)enableDebugMode:(BOOL)enabled; - -/** - 取消授权,登出接口 - 调用此接口后,token将失效 - @param token 第三方应用之前申请的Token - @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 - @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 - - */ -+ (void)logOutWithToken:(NSString *)token delegate:(id)delegate withTag:(NSString*)tag; - -/** - 邀请好友使用应用 - 调用此接口后,将发送私信至好友,成功将返回微博标准私信结构 - @param data 邀请数据。必须为json字串的形式,必须做URLEncode,采用UTF-8编码。 - data参数支持的参数: - 参数名称 值的类型 是否必填 说明描述 - text string true 要回复的私信文本内容。文本大小必须小于300个汉字。 - url string false 邀请点击后跳转链接。默认为当前应用地址。 - invite_logo string false 邀请Card展示时的图标地址,大小必须为80px X 80px,仅支持PNG、JPG格式。默认为当前应用logo地址。 - @param uid 被邀请人,需为当前用户互粉好友。 - @param access_token 第三方应用之前申请的Token - @param delegate WBHttpRequestDelegate对象,用于接收微博SDK对于发起的接口请求的请求的响应 - @param tag 用户自定义TAG,将通过回调WBHttpRequest实例的tag属性返回 - - */ -+ (void)inviteFriend:(NSString* )data withUid:(NSString *)uid withToken:(NSString *)access_token delegate:(id)delegate withTag:(NSString*)tag; - -/* - 第三方调用微博短信注册或者登陆 - @param navTitle 为登陆页navigationBar的title,如果为空的话,默认为“验证码登陆” -*/ -+ (void)messageRegister:(NSString *)navTitle; -@end - -/** - 接收并处理来至微博客户端程序的事件消息 - */ -@protocol WeiboSDKDelegate - -/** - 收到一个来自微博客户端程序的请求 - - 收到微博的请求后,第三方应用应该按照请求类型进行处理,处理完后必须通过 [WeiboSDK sendResponse:] 将结果回传给微博 - @param request 具体的请求对象 - */ -- (void)didReceiveWeiboRequest:(WBBaseRequest *)request; - -/** - 收到一个来自微博客户端程序的响应 - - 收到微博的响应后,第三方应用可以通过响应类型、响应的数据和 WBBaseResponse.userInfo 中的数据完成自己的功能 - @param response 具体的响应对象 - */ -- (void)didReceiveWeiboResponse:(WBBaseResponse *)response; - -@end - - -#pragma mark - DataTransferObject and Base Request/Response - -/** - 微博客户端程序和第三方应用之间传输数据信息的基类 - */ -@interface WBDataTransferObject : NSObject - -/** - 自定义信息字典,用于数据传输过程中存储相关的上下文环境数据 - - 第三方应用给微博客户端程序发送 request 时,可以在 userInfo 中存储请求相关的信息。 - - @warning userInfo中的数据必须是实现了 `NSCoding` 协议的对象,必须保证能序列化和反序列化 - @warning 序列化后的数据不能大于10M - */ -@property (nonatomic, strong) NSDictionary *userInfo; - - -/** - 发送该数据对象的SDK版本号 - - 如果数据对象是自己生成的,则sdkVersion为当前SDK的版本号;如果是接收到的数据对象,则sdkVersion为数据发送方SDK版本号 - */ -@property (strong, nonatomic, readonly) NSString *sdkVersion; - - -/** - 当用户没有安装微博客户端程序时是否提示用户打开微博安装页面 - - 如果设置为YES,当用户未安装微博时会弹出Alert询问用户是否要打开微博App的安装页面。默认为YES - */ -@property (nonatomic, assign) BOOL shouldOpenWeiboAppInstallPageIfNotInstalled; - - -@end - - -/** - 微博SDK所有请求类的基类 - */ -@interface WBBaseRequest : WBDataTransferObject - -/** - 返回一个 WBBaseRequest 对象 - - @return 返回一个*自动释放的*WBBaseRequest对象 - */ -+ (id)request; - -@end - - -/** - 微博SDK所有响应类的基类 - */ -@interface WBBaseResponse : WBDataTransferObject - -/** - 对应的 request 中的自定义信息字典 - - 如果当前 response 是由微博客户端响应给第三方应用的,则 requestUserInfo 中会包含原 request.userInfo 中的所有数据 - - @see WBBaseRequest.userInfo - */ -@property (strong, nonatomic, readonly) NSDictionary *requestUserInfo; - -/** - 响应状态码 - - 第三方应用可以通过statusCode判断请求的处理结果 - */ -@property (nonatomic, assign) WeiboSDKResponseStatusCode statusCode; - -/** - 返回一个 WBBaseResponse 对象 - - @return 返回一个*自动释放的*WBBaseResponse对象 - */ -+ (id)response; - -@end - -#pragma mark - Authorize Request/Response - -/** - 第三方应用向微博客户端请求认证的消息结构 - - 第三方应用向微博客户端申请认证时,需要调用 [WeiboSDK sendRequest:] 函数, 向微博客户端发送一个 WBAuthorizeRequest 的消息结构。 - 微博客户端处理完后会向第三方应用发送一个结构为 WBAuthorizeResponse 的处理结果。 - */ -@interface WBAuthorizeRequest : WBBaseRequest - -/** - 微博开放平台第三方应用授权回调页地址,默认为`http://` - - 参考 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#.E5.AE.A2.E6.88.B7.E7.AB.AF.E9.BB.98.E8.AE.A4.E5.9B.9E.E8.B0.83.E9.A1.B5 - - @warning 必须保证和在微博开放平台应用管理界面配置的“授权回调页”地址一致,如未进行配置则默认为`http://` - @warning 不能为空,长度小于1K - */ -@property (nonatomic, strong) NSString *redirectURI; - -/** - 微博开放平台第三方应用scope,多个scrope用逗号分隔 - - 参考 http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E#scope - - @warning 长度小于1K - */ -@property (nonatomic, strong) NSString *scope; - -/** - 当用户没有安装微博客户端或微博客户端过低无法支持SSO的时候是否弹出SDK自带的Webview进行授权 - - 如果设置为YES,当用户没有安装微博客户端或微博客户端过低无法支持SSO的时候会自动弹出SDK自带的Webview进行授权。 - - 如果设置为NO,会根据 shouldOpenWeiboAppInstallPageIfNotInstalled 属性判断是否弹出安装/更新微博的对话框 - - 默认为YES - */ -@property (nonatomic, assign) BOOL shouldShowWebViewForAuthIfCannotSSO; - -@end - - -/** - 微博客户端处理完第三方应用的认证申请后向第三方应用回送的处理结果 - - WBAuthorizeResponse 结构中仅包含常用的 userID 、accessToken 和 expirationDate 信息,其他的认证信息(比如部分应用可以获取的 refresh_token 信息)会统一存放到 userInfo 中 - */ -@interface WBAuthorizeResponse : WBBaseResponse - -/** - 用户ID - */ -@property (nonatomic, strong) NSString *userID; - -/** - 认证口令 - */ -@property (nonatomic, strong) NSString *accessToken; - -/** - 认证过期时间 - */ -@property (nonatomic, strong) NSDate *expirationDate; - -/** - 当认证口令过期时用于换取认证口令的更新口令 - */ -@property (nonatomic, strong) NSString *refreshToken; - -@end - -#pragma mark - ProvideMessageForWeibo Request/Response - -/** - 微博客户端向第三方程序请求提供内容的消息结构 - */ -@interface WBProvideMessageForWeiboRequest : WBBaseRequest - -@end - -/** - 微博客户端向第三方应用请求提供内容,第三方应用向微博客户端返回的消息结构 - */ -@interface WBProvideMessageForWeiboResponse : WBBaseResponse - -/** - 提供给微博客户端的消息 - */ -@property (nonatomic, strong) WBMessageObject *message; - -/** - 返回一个 WBProvideMessageForWeiboResponse 对象 - @param message 需要回送给微博客户端程序的消息对象 - @return 返回一个*自动释放的*WBProvideMessageForWeiboResponse对象 - */ -+ (id)responseWithMessage:(WBMessageObject *)message; - -@end - -#pragma mark - SendMessageToWeibo Request/Response - -/** - 第三方应用发送消息至微博客户端程序的消息结构体 - */ -@interface WBSendMessageToWeiboRequest : WBBaseRequest - -/** - 发送给微博客户端的消息 - */ -@property (nonatomic, strong) WBMessageObject *message; - -/** - 返回一个 WBSendMessageToWeiboRequest 对象 - 此方法生成对象被[WeiboSDK sendRequest:]会唤起微博客户端的发布器进行分享,如果未安装微博客户端或客户端版本太低 - 会根据 shouldOpenWeiboAppInstallPageIfNotInstalled 属性判断是否弹出安装/更新微博的对话框 - @param message 需要发送给微博客户端的消息对象 - @return 返回一个*自动释放的*WBSendMessageToWeiboRequest对象 - */ -+ (id)requestWithMessage:(WBMessageObject *)message; - -/** - 返回一个 WBSendMessageToWeiboRequest 对象 - - 当用户安装了可以支持微博客户端內分享的微博客户端时,会自动唤起微博并分享 - 当用户没有安装微博客户端或微博客户端过低无法支持通过客户端內分享的时候会自动唤起SDK內微博发布器 - - @param message 需要发送给微博的消息对象 - @param authRequest 授权相关信息,与access_token二者至少有一个不为空,当access_token为空并且需要弹出SDK內发布器时会通过此信息先进行授权后再分享 - @param access_token 第三方应用之前申请的Token,当此值不为空并且无法通过客户端分享的时候,会使用此token进行分享。 - @return 返回一个*自动释放的*WBSendMessageToWeiboRequest对象 - */ -+ (id)requestWithMessage:(WBMessageObject *)message - authInfo:(WBAuthorizeRequest *)authRequest - access_token:(NSString *)access_token; - -@end - -/** - WBSendMessageToWeiboResponse - */ -@interface WBSendMessageToWeiboResponse : WBBaseResponse - -/** - 可能在分享过程中用户进行了授权操作,当此值不为空时,为用户相应授权信息 - */ -@property (nonatomic,strong) WBAuthorizeResponse *authResponse; -@end - -#pragma mark - AppRecomend Request/Response - -/** - 第三方应用私信好友推荐app的请求 - */ -@interface WBSDKAppRecommendRequest : WBBaseRequest -/** - 返回一个 WBSDKAppRecommendRequest 对象 - - @param uids 为推荐的好友列表,为空时跳转到用户自选的页面 - @param access_token 第三方应用之前申请的Token,当此值不为空并且无法通过客户端分享的时候,会使用此token私信。 - @return 返回一个*自动释放的*WBSDKAppRecommendRequest对象 - */ -+ (id)requestWithUIDs:(NSArray *)uids access_token:(NSString *)access_token; - -/** - 私信对象列表 - */ -@property (nonatomic, strong) NSArray* uids; -/** - 用于认证的Token - */ -@property (nonatomic, strong) NSString *access_token; -@end - -/** - 第三方应用私信好友推荐app的响应 - - WBSDKAppRecommendResponse 结构中仅包含常用的 userID 、accessToken 和 expirationDate 信息,其他的认证信息(比如部分应用可以获取的 refresh_token 信息)会统一存放到 userInfo 中 - */ -@interface WBSDKAppRecommendResponse : WBBaseResponse -@property (nonatomic,strong) WBAuthorizeResponse *authResponse; -/** - 用户ID - */ -@property (nonatomic, strong) NSString *userID; - -/** - 认证口令 - */ -@property (nonatomic, strong) NSString *accessToken; - -/** - 认证过期时间 - */ -@property (nonatomic, strong) NSDate *expirationDate; - -/** - 当认证口令过期时用于换取认证口令的更新口令 - */ -@property (nonatomic, strong) NSString *refreshToken; -@end - -#pragma mark - Payment Request/Response - -/** - 第三方应用发送消息至微博客户端程序的消息结构体 - */ -@interface WBPaymentRequest : WBBaseRequest - -/** - 发送给微博客户端的订单 - */ -@property (nonatomic, strong) WBOrderObject *order; - -/** - 返回一个 WBPaymentRequest 对象 - @param message 需要发送给微博客户端程序的消息对象 - @return 返回一个*自动释放的*WBSendMessageToWeiboRequest对象 - */ -+ (id)requestWithOrder:(WBOrderObject *)order; - -@end - -/** - WBPaymentResponse - */ -@interface WBPaymentResponse : WBBaseResponse - -/** - 支付返回状态码 - */ -@property (nonatomic, strong) NSString *payStatusCode; - -/** - 支付返回状态信息 - */ -@property (nonatomic, strong) NSString *payStatusMessage; - -@end - -#pragma mark - MessageObject / ImageObject - -/** - 微博客户端程序和第三方应用之间传递的消息结构 - - 一个消息结构由三部分组成:文字、图片和多媒体数据。三部分内容中至少有一项不为空,图片和多媒体数据不能共存。 - */ -@interface WBMessageObject : NSObject - -/** - 消息的文本内容 - - @warning 长度小于140个汉字 - */ -@property (nonatomic, strong) NSString *text; - -/** - 消息的图片内容 - - @see WBImageObject - */ -@property (nonatomic, strong) WBImageObject *imageObject; - -/** - 消息的多媒体内容 - - @see WBBaseMediaObject - */ -@property (nonatomic, strong) WBBaseMediaObject *mediaObject; - -/** - 返回一个 WBMessageObject 对象 - - @return 返回一个*自动释放的*WBMessageObject对象 - */ -+ (id)message; - -@end - -/** - 消息中包含的图片数据对象 - */ -@interface WBImageObject : NSObject - -/** - 图片真实数据内容 - - @warning 大小不能超过10M - */ -@property (nonatomic, strong) NSData *imageData; - -/** - 返回一个 WBImageObject 对象 - - @return 返回一个*自动释放的*WBImageObject对象 - */ -+ (id)object; - -/** - 返回一个 UIImage 对象 - - @return 返回一个*自动释放的*UIImage对象 - */ -- (UIImage *)image; - -@end - -#pragma mark - Message Media Objects - -/** - 消息中包含的多媒体数据对象基类 - */ -@interface WBBaseMediaObject : NSObject - -/** - 对象唯一ID,用于唯一标识一个多媒体内容 - - 当第三方应用分享多媒体内容到微博时,应该将此参数设置为被分享的内容在自己的系统中的唯一标识 - @warning 不能为空,长度小于255 - */ -@property (nonatomic, strong) NSString *objectID; - -/** - 多媒体内容标题 - @warning 不能为空且长度小于1k - */ -@property (nonatomic, strong) NSString *title; - -/** - 多媒体内容描述 - @warning 长度小于1k - */ -@property (nonatomic, strong) NSString *description; - -/** - 多媒体内容缩略图 - @warning 大小小于32k - */ -@property (nonatomic, strong) NSData *thumbnailData; - -/** - 点击多媒体内容之后呼起第三方应用特定页面的scheme - @warning 长度小于255 - */ -@property (nonatomic, strong) NSString *scheme; - -/** - 返回一个 WBBaseMediaObject 对象 - - @return 返回一个*自动释放的*WBBaseMediaObject对象 - */ -+ (id)object; - -@end - -#pragma mark - Message Video Objects - -/** - 消息中包含的视频数据对象 - */ -@interface WBVideoObject : WBBaseMediaObject - -/** - 视频网页的url - - @warning 不能为空且长度不能超过255 - */ -@property (nonatomic, strong) NSString *videoUrl; - -/** - 视频lowband网页的url - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *videoLowBandUrl; - -/** - 视频数据流url - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *videoStreamUrl; - -/** - 视频lowband数据流url - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *videoLowBandStreamUrl; - -@end - -#pragma mark - Message Music Objects - -/** - 消息中包含的音乐数据对象 - */ -@interface WBMusicObject : WBBaseMediaObject - -/** - 音乐网页url地址 - - @warning 不能为空且长度不能超过255 - */ -@property (nonatomic, strong) NSString *musicUrl; - -/** - 音乐lowband网页url地址 - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *musicLowBandUrl; - -/** - 音乐数据流url - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *musicStreamUrl; - - -/** - 音乐lowband数据流url - - @warning 长度不能超过255 - */ -@property (nonatomic, strong) NSString *musicLowBandStreamUrl; - -@end - -#pragma mark - Message WebPage Objects - -/** - 消息中包含的网页数据对象 - */ -@interface WBWebpageObject : WBBaseMediaObject - -/** - 网页的url地址 - - @warning 不能为空且长度不能超过255 - */ -@property (nonatomic, strong) NSString *webpageUrl; - -@end - -#pragma mark - OrderObject - -/** - 微博客户端程序和第三方应用之间传递的订单结构 - */ -@interface WBOrderObject : NSObject - -/** - 订单编号 - */ -@property (nonatomic, strong) NSString *orderString; - - -/** - 返回一个 WBOrderObject 对象 - - @return 返回一个*自动释放的*WBOrderObject对象 - */ -+ (id)order; - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h deleted file mode 100755 index 8c356c6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/WeiboUser.h +++ /dev/null @@ -1,77 +0,0 @@ -// -// WeiboUser.h -// WeiboSDK -// -// Created by DannionQiu on 14-9-23. -// Copyright (c) 2014年 SINA iOS Team. All rights reserved. -// - -#import - -/*@ - You can get the latest WeiboUser field description on http://open.weibo.com/wiki/2/friendships/friends/en . -*/ -@interface WeiboUser : NSObject - -- (instancetype)initWithDictionary:(NSDictionary*)paraDict; -+ (instancetype)userWithDictionary:(NSDictionary*)paraDict; - -// Validate the dictionary to be converted. -+ (BOOL)isValidForDictionary:(NSDictionary *)dict; - -- (BOOL)updateWithDictionary:(NSDictionary*)paraDict; - - -@property(readwrite, strong, nonatomic) NSString* userID; -@property(readwrite, strong, nonatomic) NSString* userClass; -@property(readwrite, strong, nonatomic) NSString* screenName; -@property(readwrite, strong, nonatomic) NSString* name; -@property(readwrite, strong, nonatomic) NSString* province; -@property(readwrite, strong, nonatomic) NSString* city; -@property(readwrite, strong, nonatomic) NSString* location; -@property(readwrite, strong, nonatomic) NSString* userDescription; -@property(readwrite, strong, nonatomic) NSString* url; -@property(readwrite, strong, nonatomic) NSString* profileImageUrl; -@property(readwrite, strong, nonatomic) NSString* coverImageUrl; -@property(readwrite, strong, nonatomic) NSString* coverImageForPhoneUrl; -@property(readwrite, strong, nonatomic) NSString* profileUrl; -@property(readwrite, strong, nonatomic) NSString* userDomain; -@property(readwrite, strong, nonatomic) NSString* weihao; -@property(readwrite, strong, nonatomic) NSString* gender; -@property(readwrite, strong, nonatomic) NSString* followersCount; -@property(readwrite, strong, nonatomic) NSString* friendsCount; -@property(readwrite, strong, nonatomic) NSString* pageFriendsCount; -@property(readwrite, strong, nonatomic) NSString* statusesCount; -@property(readwrite, strong, nonatomic) NSString* favouritesCount; -@property(readwrite, strong, nonatomic) NSString* createdTime; -@property(readwrite, assign, nonatomic) BOOL isFollowingMe; -@property(readwrite, assign, nonatomic) BOOL isFollowingByMe; -@property(readwrite, assign, nonatomic) BOOL isAllowAllActMsg; -@property(readwrite, assign, nonatomic) BOOL isAllowAllComment; -@property(readwrite, assign, nonatomic) BOOL isGeoEnabled; -@property(readwrite, assign, nonatomic) BOOL isVerified; -@property(readwrite, strong, nonatomic) NSString* verifiedType; -@property(readwrite, strong, nonatomic) NSString* remark; -@property(readwrite, strong, nonatomic) NSString* statusID; -@property(readwrite, strong, nonatomic) NSString* ptype; -@property(readwrite, strong, nonatomic) NSString* avatarLargeUrl; -@property(readwrite, strong, nonatomic) NSString* avatarHDUrl; -@property(readwrite, strong, nonatomic) NSString* verifiedReason; -@property(readwrite, strong, nonatomic) NSString* verifiedTrade; -@property(readwrite, strong, nonatomic) NSString* verifiedReasonUrl; -@property(readwrite, strong, nonatomic) NSString* verifiedSource; -@property(readwrite, strong, nonatomic) NSString* verifiedSourceUrl; -@property(readwrite, strong, nonatomic) NSString* verifiedState; -@property(readwrite, strong, nonatomic) NSString* verifiedLevel; -@property(readwrite, strong, nonatomic) NSString* onlineStatus; -@property(readwrite, strong, nonatomic) NSString* biFollowersCount; -@property(readwrite, strong, nonatomic) NSString* language; -@property(readwrite, strong, nonatomic) NSString* star; -@property(readwrite, strong, nonatomic) NSString* mbtype; -@property(readwrite, strong, nonatomic) NSString* mbrank; -@property(readwrite, strong, nonatomic) NSString* block_word; -@property(readwrite, strong, nonatomic) NSString* block_app; -@property(readwrite, strong, nonatomic) NSString* credit_score; -@property(readwrite, strong, nonatomic) NSDictionary* originParaDict; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libSocialSinaSSO.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libSocialSinaSSO.a deleted file mode 100644 index 422d654..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libSocialSinaSSO.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libWeiboSDK.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libWeiboSDK.a deleted file mode 100755 index 12fc343..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/SinaSSO/libWeiboSDK.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterface.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterface.h deleted file mode 100644 index 436e235..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterface.h +++ /dev/null @@ -1,108 +0,0 @@ -/// -/// \file QQApiInterface.h -/// \brief QQApi接口简化封装 -/// -/// Created by Tencent on 12-5-15. -/// Copyright (c) 2012年 Tencent. All rights reserved. -/// - -#import -#import "QQApiInterfaceObject.h" - -/** - \brief 处理来至QQ的请求及响应的回调协议 - */ -@protocol QQApiInterfaceDelegate - -/** - 处理来至QQ的请求 - */ -- (void)onReq:(QQBaseReq *)req; - -/** - 处理来至QQ的响应 - */ -- (void)onResp:(QQBaseResp *)resp; - -/** - 处理QQ在线状态的回调 - */ -- (void)isOnlineResponse:(NSDictionary *)response; - -@end - -/** - \brief 对QQApi的简单封装类 - */ -@interface QQApiInterface : NSObject - -/** - 处理由手Q唤起的跳转请求 - \param url 待处理的url跳转请求 - \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象 - \return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败 - */ -+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; - -/** - 向手Q发起分享请求 - \param req 分享内容的请求 - \return 请求发送结果码 - */ -+ (QQApiSendResultCode)sendReq:(QQBaseReq *)req; - -/** - 向手Q QZone结合版发起分享请求 - \note H5分享只支持单张网络图片的传递 - \param req 分享内容的请求 - \return 请求发送结果码 - */ -+ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req; - -/** - 向手Q 群部落发起分享请求 - \note H5分享只支持单张网络图片的传递 - \param req 分享内容的请求 - \return 请求发送结果码 - */ -+ (QQApiSendResultCode)SendReqToQQGroupTribe:(QQBaseReq *)req; - -/** - 向手Q发送应答消息 - \param resp 应答消息 - \return 应答发送结果码 - */ -+ (QQApiSendResultCode)sendResp:(QQBaseResp *)resp; - -/** - 检测是否已安装QQ - \return 如果QQ已安装则返回YES,否则返回NO - */ -+ (BOOL)isQQInstalled; - -/** - 批量检测QQ号码是否在线 - */ -+ (void)getQQUinOnlineStatues:(NSArray *)QQUins delegate:(id)delegate; - -/** - 检测QQ是否支持API调用 - \return 如果当前安装QQ版本支持API调用则返回YES,否则返回NO - */ -+ (BOOL)isQQSupportApi; - -/** - 启动QQ - \return 成功返回YES,否则返回NO - */ -+ (BOOL)openQQ; - -/** - 获取QQ下载地址 - - 如果App通过QQApiInterface#isQQInstalledQQApiInterface#isQQSupportApi检测发现QQ没安装或当前版本QQ不支持API调用,可引导用户通过打开此链接下载最新版QQ。 - \return iPhoneQQ下载地址 - */ -+ (NSString *)getQQInstallUrl; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h deleted file mode 100644 index 250f7d0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h +++ /dev/null @@ -1,601 +0,0 @@ -/// -/// \file QQApiInterfaceObject.h -/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类 -/// -/// Created by Tencent on 12-5-15. -/// Copyright (c) 2012年 Tencent. All rights reserved. -/// - -#ifndef QQApiInterface_QQAPIOBJECT_h -#define QQApiInterface_QQAPIOBJECT_h - -#import - - -typedef enum -{ - EQQAPISENDSUCESS = 0, - EQQAPIQQNOTINSTALLED = 1, - EQQAPIQQNOTSUPPORTAPI = 2, - EQQAPIMESSAGETYPEINVALID = 3, - EQQAPIMESSAGECONTENTNULL = 4, - EQQAPIMESSAGECONTENTINVALID = 5, - EQQAPIAPPNOTREGISTED = 6, - EQQAPIAPPSHAREASYNC = 7, - EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, - EQQAPISENDFAILD = -1, - //qzone分享不支持text类型分享 - EQQAPIQZONENOTSUPPORTTEXT = 10000, - //qzone分享不支持image类型分享 - EQQAPIQZONENOTSUPPORTIMAGE = 10001, -} QQApiSendResultCode; - -#pragma mark - QQApiObject(分享对象类型) - -// QQApiObject control flags -enum -{ - kQQAPICtrlFlagQZoneShareOnStart = 0x01, - kQQAPICtrlFlagQZoneShareForbid = 0x02, - kQQAPICtrlFlagQQShare = 0x04, - kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏 - kQQAPICtrlFlagQQShareDataline = 0x10, //数据线 -}; - -// QQApiObject -/** \brief 所有在QQ及插件间发送的数据对象的根类。 - */ -@interface QQApiObject : NSObject -@property(nonatomic,retain) NSString* title; ///< 标题,最长128个字符 -@property(nonatomic,retain) NSString* description; ///<简要描述,最长512个字符 - -@property (nonatomic, assign) uint64_t cflag; - -@end - -// QQApiResultObject -/** \brief 用于请求回应的数据类型。 -

可能错误码及描述如下:

-
- - - - - - - -
errorerrorDescription注释
0nil成功
-1param error参数错误
-2group code is invalid该群不在自己的群列表里面
-3upload photo failed上传图片失败
-4user give up the current operation用户放弃当前操作
-5client internal error客户端内部处理错误
- */ -@interface QQApiResultObject : QQApiObject -@property(nonatomic,retain) NSString* error; ///<错误 -@property(nonatomic,retain) NSString* errorDescription; ///<错误描述 -@property(nonatomic,retain) NSString* extendInfo; ///<扩展信息 -@end - -// QQApiTextObject -/** \brief 文本对象 - */ -@interface QQApiTextObject : QQApiObject -@property(nonatomic,retain)NSString* text; ///<文本内容,必填,最长1536个字符 - --(id)initWithText:(NSString*)text; ///<初始化方法 -+(id)objectWithText:(NSString*)text;///<工厂方法,获取一个QQApiTextObject对象. -@end - -// QQApiURLObject -typedef enum QQApiURLTargetType{ - QQApiURLTargetTypeNotSpecified = 0x00, - QQApiURLTargetTypeAudio = 0x01, - QQApiURLTargetTypeVideo = 0x02, - QQApiURLTargetTypeNews = 0x03 -}QQApiURLTargetType; - -/** @brief URL对象类型。 - - 包括URL地址,URL地址所指向的目标类型及预览图像。 - */ -@interface QQApiURLObject : QQApiObject -/** - URL地址所指向的目标类型. - @note 参见QQApi.h 中的 QQApiURLTargetType 定义. - */ -@property(nonatomic)QQApiURLTargetType targetContentType; - -@property(nonatomic,retain)NSURL* url; ///QQApiExtendObject对象 - @param data 数据内容 - @param previewImageData 用于预览的图片 - @param title 标题 - @param description 此对象,分享的描述 - @return - 一个自动释放的QQApiExtendObject实例 - */ -+ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description; - -/** - helper方法获取一个autorelease的QQApiExtendObject对象 - @param data 数据内容 - @param previewImageData 用于预览的图片 - @param title 标题 - @param description 此对象,分享的描述 - @param imageDataArray 发送的多张图片队列 - @return - 一个自动释放的QQApiExtendObject实例 - */ -+ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray; - -@end - -// QQApiImageObject -/** @brief 图片对象 - 用于分享图片内容的对象,是一个指定为图片类型的QQApiExtendObject - */ -@interface QQApiImageObject : QQApiExtendObject -@end - -// QQApiImageArrayForQZoneObject -/** @brief 图片对象 - 用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说QQApiObject - */ -@interface QQApiImageArrayForQZoneObject : QQApiObject - -@property(nonatomic,retain) NSArray* imageDataArray;///图片数组 - -/** - 初始化方法 - @param imageDataArray 图片数组 - @param title 写说说的内容,可以为空 - */ -- (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title; - -/** - helper方法获取一个autorelease的QQApiExtendObject对象 - @param title 写说说的内容,可以为空 - @param imageDataArray 发送的多张图片队列 - @return - 一个自动释放的QQApiExtendObject实例 - */ -+ (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title; - -@end - -// QQApiVideoForQZoneObject -/** @brief 视频对象 - 用于分享视频到空间,走写说说路径QQApiObject - assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier - */ -@interface QQApiVideoForQZoneObject : QQApiObject - -@property(nonatomic, retain) NSString *assetURL; - -- (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title; - -+ (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title; - -@end - -// QQApiWebImageObject -/** @brief 图片对象 - 用于分享网络图片内容的对象,是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持, - 原有的手q分享是不支持该类型的。 - */ -@interface QQApiWebImageObject : QQApiObject - -@property(nonatomic, retain) NSURL *previewImageURL; ///<预览图像URL - -/** - 初始化方法 - @param previewImageURL 用于预览的图片 - @param title 标题 - @param description 此对象,分享的描述 - */ -- (id)initWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; - -/** - helper方法获取一个autorelease的QQApiWebImageObject对象 - @param previewImageURL 用于预览的图片 - @param title 标题 - @param description 此对象,分享的描述 - */ -+ (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; - -@end - -// QQApiGroupTribeImageObject -/** @brief 群部落图片对象 - 用于分享图片内容的对象,是一个指定为图片类型的 可以指定一些其他的附加数据QQApiExtendObject - */ -@interface QQApiGroupTribeImageObject : QQApiImageObject -{ - NSString *_bid; - NSString *_bname; -} -// 群部落id -@property (nonatomic, retain)NSString* bid; - -// 群部落名称 -@property (nonatomic, retain)NSString* bname; - -@end - - -//QQApiFileObject -/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能) - 用于分享文件内容的对象,是一个指定为文件类型的QQApiExtendObject - */ -@interface QQApiFileObject : QQApiExtendObject -{ - NSString* _fileName; -} -@property(nonatomic, retain)NSString* fileName; -@end - -// QQApiAudioObject -/** @brief 音频URL对象 - 用于分享目标内容为音频的URL的对象 - */ -@interface QQApiAudioObject : QQApiURLObject - -@property (nonatomic, retain) NSURL *flashURL; ///<音频URL地址,最长512个字符 - -/** - 获取一个autorelease的QQApiAudioObject - @param url 音频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param data 分享内容的预览图像 - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; - -/** - 获取一个autorelease的QQApiAudioObject - @param url 音频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param previewURL 分享内容的预览图像URL - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; - -@end - -// QQApiVideoObject -/** @brief 视频URL对象 - 用于分享目标内容为视频的URL的对象 - - QQApiVideoObject类型的分享,目前在Android和PC QQ上接收消息时,展现有待完善,待手机QQ版本以后更新支持 - 目前如果要分享视频,推荐使用 QQApiNewsObject 类型 - */ -@interface QQApiVideoObject : QQApiURLObject - -@property (nonatomic, retain) NSURL *flashURL; ///<视频URL地址,最长512个字符 - -/** - 获取一个autorelease的QQApiVideoObject - @param url 视频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param data 分享内容的预览图像 - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; - -/** - 获取一个autorelease的QQApiVideoObject - @param url 视频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param previewURL 分享内容的预览图像URL - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; - -@end - -// QQApiNewsObject -/** @brief 新闻URL对象 - 用于分享目标内容为新闻的URL的对象 - */ -@interface QQApiNewsObject : QQApiURLObject -/** - 获取一个autorelease的QQApiNewsObject - @param url 视频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param data 分享内容的预览图像 - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; - -/** - 获取一个autorelease的QQApiNewsObject - @param url 视频内容的目标URL - @param title 分享内容的标题 - @param description 分享内容的描述 - @param previewURL 分享内容的预览图像URL - @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE - */ -+(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; - -@end - -// QQApiPayObject -/** \brief 支付对象 - */ -@interface QQApiPayObject : QQApiObject -@property(nonatomic,retain)NSString* OrderNo; ///<支付订单号,必填 -@property(nonatomic,retain)NSString* AppInfo; ///<支付来源信息,必填 - --(id)initWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo; ///<初始化方法 -+(id)objectWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo;///<工厂方法,获取一个QQApiPayObject对象. -@end - -// QQApiCommonContentObject; -/** @brief 通用模板类型对象 - 用于分享一个固定显示模板的图文混排对象 - @note 图片列表和文本列表不能同时为空 - */ -@interface QQApiCommonContentObject : QQApiObject -/** - 预定义的界面布局类型 - */ -@property(nonatomic,assign) unsigned int layoutType; -@property(nonatomic,assign) NSData* previewImageData;///<预览图 -@property(nonatomic,retain) NSArray* textArray;///<文本列表 -@property(nonatomic,retain) NSArray* pictureDataArray;///<图片列表 -+(id)objectWithLayoutType:(int)layoutType textArray:(NSArray*)textArray pictureArray:(NSArray*)pictureArray previewImageData:(NSData*)data; -/** - 将一个NSDictionary对象转化为QQApiCommomContentObject,如果无法转换,则返回空 - */ -+(id)objectWithDictionary:(NSDictionary*)dic; --(NSDictionary*)toDictionary; -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Ad item object definition -//////////////////////////////////////////////////////////////////////////////////////////////////////////// -/** @brief 广告数据对象 - */ -@interface QQApiAdItem : NSObject -@property(nonatomic,retain) NSString* title; ///<名称 -@property(nonatomic,retain) NSString* description;///<描述 -@property(nonatomic,retain) NSData* imageData;///<广告图片 -@property(nonatomic,retain) NSURL* target;///<广告目标链接 -@end - -// QQApiWPAObject -/** \brief 发起WPA对象 - */ -@interface QQApiWPAObject : QQApiObject -@property(nonatomic,retain)NSString* uin; ///<想要对话的QQ号 - --(id)initWithUin:(NSString*)uin; ///<初始化方法 -+(id)objectWithUin:(NSString*)uin;///<工厂方法,获取一个QQApiWPAObject对象. -@end - -// QQApiAddFriendObject -/** \brief 添加好友 - */ -@interface QQApiAddFriendObject : QQApiObject -@property (nonatomic,retain)NSString* openID; -@property (nonatomic,retain)NSString* subID; -@property (nonatomic,retain)NSString* remark; - --(id)initWithOpenID:(NSString*)openID; ///<初始化方法 -+(id)objecWithOpenID:(NSString*)openID; ///<工厂方法,获取一个QQApiAddFriendObject对象. - -@end - -// QQApiGameConsortiumBindingGroupObject -/** \brief 游戏公会绑定群 - */ -@interface QQApiGameConsortiumBindingGroupObject : QQApiObject -@property (nonatomic,retain)NSString* signature; -@property (nonatomic,retain)NSString* unionid; -@property (nonatomic,retain)NSString* zoneID; -@property (nonatomic,retain)NSString* appDisplayName; - --(id)initWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<初始化方法 -+(id)objectWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<工厂方法,获取一个QQApiAddFriendObject对象. - -@end - -// QQApiGroupChatObject -/** \brief 发起群会话对象 - */ -@interface QQApiGroupChatObject : QQApiObject -@property(nonatomic,retain)NSString* groupID; ///<想要对话的群号 - --(id)initWithGroup:(NSString*)groupID; ///<初始化方法 -+(id)objectWithGroup:(NSString*)groupID;///<工厂方法,获取一个QQApiGroupChatObject对象. -@end - -#pragma mark - QQApi请求消息类型 - -/** - QQApi请求消息类型 - */ -enum QQApiInterfaceReqType -{ - EGETMESSAGEFROMQQREQTYPE = 0, ///< 手Q -> 第三方应用,请求第三方应用向手Q发送消息 - ESENDMESSAGETOQQREQTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用向手Q分享消息 - ESHOWMESSAGEFROMQQREQTYPE = 2 ///< 手Q -> 第三方应用,请求第三方应用展现消息中的数据 -}; - -/** - QQApi应答消息类型 - */ -enum QQApiInterfaceRespType -{ - ESHOWMESSAGEFROMQQRESPTYPE = 0, ///< 第三方应用 -> 手Q,第三方应用应答消息展现结果 - EGETMESSAGEFROMQQRESPTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用回应发往手Q的消息 - ESENDMESSAGETOQQRESPTYPE = 2 ///< 手Q -> 第三方应用,手Q应答处理分享消息的结果 -}; - -/** - QQApi请求消息基类 - */ -@interface QQBaseReq : NSObject - -/** 请求消息类型,参见\ref QQApiInterfaceReqType */ -@property (nonatomic, assign) int type; - -@end - -/** - QQApi应答消息基类 - */ -@interface QQBaseResp : NSObject - -/** 请求处理结果 */ -@property (nonatomic, copy) NSString* result; - -/** 具体错误描述信息 */ -@property (nonatomic, copy) NSString* errorDescription; - -/** 应答消息类型,参见\ref QQApiInterfaceRespType */ -@property (nonatomic, assign) int type; - -/** 扩展信息 */ -@property (nonatomic, assign) NSString* extendInfo; - -@end - -/** - GetMessageFromQQReq请求帮助类 - */ -@interface GetMessageFromQQReq : QQBaseReq - -/** - 创建一个GetMessageFromQQReq请求实例 - */ -+ (GetMessageFromQQReq *)req; - -@end - -/** - GetMessageFromQQResp应答帮助类 - */ -@interface GetMessageFromQQResp : QQBaseResp - -/** - 创建一个GetMessageFromQQResp应答实例 - \param message 具体分享消息实例 - \return 新创建的GetMessageFromQQResp应答实例 - */ -+ (GetMessageFromQQResp *)respWithContent:(QQApiObject *)message; - -/** 具体分享消息 */ -@property (nonatomic, retain) QQApiObject *message; - -@end - -/** - SendMessageToQQReq请求帮助类 - */ -@interface SendMessageToQQReq : QQBaseReq - -/** - 创建一个SendMessageToQQReq请求实例 - \param message 具体分享消息实例 - \return 新创建的SendMessageToQQReq请求实例 - */ -+ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message; - -/** 具体分享消息 */ -@property (nonatomic, retain) QQApiObject *message; - -@end - -/** - SendMessageToQQResp应答帮助类 - */ -@interface SendMessageToQQResp : QQBaseResp - -/** - 创建一个SendMessageToQQResp应答实例 - \param result 请求处理结果 - \param errDesp 具体错误描述信息 - \param extendInfo 扩展信息 - \return 新创建的SendMessageToQQResp应答实例 - */ -+ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString*)extendInfo; - -@end - -/** - ShowMessageFromQQReq请求帮助类 - */ -@interface ShowMessageFromQQReq : QQBaseReq - -/** - 创建一个ShowMessageFromQQReq请求实例 - \param message 具体待展现消息实例 - \return 新创建的ShowMessageFromQQReq请求实例 - */ -+ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message; - -/** 具体待展现消息 */ -@property (nonatomic, retain) QQApiObject *message; - -@end - -/** - ShowMessageFromQQResp应答帮助类 - */ -@interface ShowMessageFromQQResp : QQBaseResp - -/** - 创建一个ShowMessageFromQQResp应答实例 - \param result 展现消息结果 - \param errDesp 具体错误描述信息 - \return 新创建的ShowMessageFromQQResp应答实例 - */ -+ (ShowMessageFromQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp; - -@end - -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentApiInterface.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentApiInterface.h deleted file mode 100644 index 40f007e..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentApiInterface.h +++ /dev/null @@ -1,103 +0,0 @@ -// -// TencentMessage.h -// TencentOpenApi_IOS -// -// Created by qqconnect on 13-5-29. -// Copyright (c) 2013年 Tencent. All rights reserved. -// - -#ifndef QQ_OPEN_SDK_LITE - -#import -#import "TencentMessageObject.h" - -typedef enum -{ - kIphoneQQ, - kIphoneQZONE, - kThirdApp, -} -TecnentPlatformType; - -typedef enum -{ - kTencentApiSuccess, - kTencentApiPlatformUninstall, - kTencentApiPlatformNotSupport, - kTencentApiParamsError, - kTencentApiFail, -} -TencentApiRetCode; - -@class TencentApiReq; -@class TencentApiResp; - -/** - * \brief TencentApiInterface的回调 - * - * TencentApiInterface的回调接口 - * \note v1.0版本只支持腾讯业务拉起第三方请求内容 - */ -@protocol TencentApiInterfaceDelegate - -@optional -/** - * 请求获得内容 当前版本只支持第三方相应腾讯业务请求 - */ -- (BOOL)onTencentReq:(TencentApiReq *)req; - -/** - * 响应请求答复 当前版本只支持腾讯业务相应第三方的请求答复 - */ -- (BOOL)onTencentResp:(TencentApiResp *)resp; - -@end - -/** - * \brief TencentApiInterface的回调 - * - * TencentApiInterface的调用接口 - * \note v1.0版本只支持第三方答复内容 - */ -@interface TencentApiInterface : NSObject - -/** - * 发送答复返回腾讯业务 - * \param resp 答复内容 - * \return 返回码 - */ -+ (TencentApiRetCode)sendRespMessageToTencentApp:(TencentApiResp *)resp; - -/** - * 是否可以处理拉起协议 - * \param url - * \param delegate 指定的回调 - * \return 是否是腾讯API认识的消息类型 - */ -+ (BOOL)canOpenURL:(NSURL *)url delegate:(id)delegate; - -/** - * 处理应用拉起协议 - * \param url - * \param delegate 指定的回调 - * \return 是否是腾讯API认识的消息类型 - */ -+ (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; - -/** - * 用户设备是否安装腾讯APP - * \param platform 指定的腾讯业务 - * \return YES:安装 NO:未安装 - */ -+ (BOOL)isTencentAppInstall:(TecnentPlatformType)platform; - -/** - * 用户设备是否支持调用SDK - * \param platform 指定的腾讯业务 - * \return YES:支持 NO:不支持 - */ -+ (BOOL)isTencentAppSupportTencentApi:(TecnentPlatformType)platform; - -@end - -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentMessageObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentMessageObject.h deleted file mode 100644 index de514f7..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentMessageObject.h +++ /dev/null @@ -1,412 +0,0 @@ -// -// TencentMessageObject.h -// TencentOpenApi_IOS -// -// Created by qqconnect on 13-5-27. -// Copyright (c) 2013年 Tencent. All rights reserved. -// - -#ifndef QQ_OPEN_SDK_LITE - -#import -#import -#import "sdkdef.h" - -#define kTextLimit (1024 * 1024) -#define kDataLimit (1024 * 1024 * 10) -#define kPreviewDataLimit (1024 * 1024) - -@class TencentApiReq; -@class TencentApiResp; - -/** - * 必填的NSArray型参数 - */ -typedef NSArray *TCRequiredArray; - -/** - * 必填的NSDictionary型参数 - */ -typedef NSDictionary *TCRequiredDictionary; - -/** - * 必填的TencentApiReq型参数 - */ -typedef TencentApiReq *TCRequiredReq; - -/** - * 可选的UIImage类型参数 - */ -typedef NSData *TCOptionalData; - - -/** - * 可选的NSArray型参数 - */ -typedef NSArray *TCOptionalArray; - -/** - * 可选的TencentApiReq型参数 - */ -typedef TencentApiReq *TCOptionalReq; - -/** - * TencentReqMessageType 请求类型枚举参数 - */ -typedef enum -{ - /** TX APP请求内容填充(需要第三方开发者填充完成内容后需要主动调用sendRespMessageToTencentApp)*/ - ReqFromTencentAppQueryContent, - /** TX APP请求展现内容 (不用调用答复) */ - ReqFromTencentAppShowContent, - /** 第三方 APP 请求内容 */ - ReqFromThirdAppQueryContent, - /** 第三方 APP 请求展现内容(类似分享)*/ - ReqFromThirdAppShowContent, -} -TencentReqMessageType; - -typedef enum -{ - RespFromTencentAppQueryContent, - RespFromTencentAppShowContent, - RespFromThirdAppQueryContent, - RespFromThirdAppShowContent, -} -TencentRespMessageType; - -/** - * TencentObjVersion 腾讯API消息类型枚举 - */ -typedef enum -{ - /** 文本类型 */ - TencentTextObj, - /** 图片类型 */ - TencentImageObj, - /** 音频类型 */ - TencentAudioObj, - /** 视频类型 */ - TencentVideoObj, - /** 图片视频类 */ - TencentImageAndVideoObj, -} -TencentObjVersion; - -/** - * \brief 请求包 - * - * TencentApiReq用来向其他业务发送请求包 - */ -@interface TencentApiReq : NSObject - -/** - * 根据序列号生成一个请求包 - * \param apiSeq 请求序列号 - * \param type 请求类型 - * \return tencentApiReq实例 - */ -+ (TencentApiReq *)reqFromSeq:(NSInteger)apiSeq type:(TencentReqMessageType)type; - -/** 请求类型 */ -@property (readonly, assign)TCRequiredInt nMessageType; - -/** 请求平台 */ -@property (readonly, assign)NSInteger nPlatform; - -/** 请求的SDK版本号 */ -@property (readonly, assign)NSInteger nSdkVersion; - -/** 请求序列号 */ -@property (readonly, assign)TCRequiredInt nSeq; - -/** 第三方的APPID */ -@property (nonatomic, retain)TCRequiredStr sAppID; - -/** 请求内容 TencentBaseMessageObj对象数组 */ -@property (nonatomic, retain)TCOptionalArray arrMessage; - -/** 请求的描述 可以用于告诉对方这个请求的特定场景 */ -@property (nonatomic, retain)TCOptionalStr sDescription; - -@end - -/** - * \brief 答复包 - * - * TencentApiResp用来向其他业务发送答复包 - */ -@interface TencentApiResp : NSObject - -/** - * 根据序列号生成一个答复包 - * \param req 答复对应的请求包(如果req不是TencentApiReq或者他的子类,会抛出异常) - * \return 答复包体 - */ -+ (TencentApiResp *)respFromReq:(TencentApiReq *)req; - -/** 返回码 */ -@property (nonatomic, assign)TCOptionalInt nRetCode; - -/** 返回消息 */ -@property (nonatomic, retain)TCOptionalStr sRetMsg; - -/** 答复对应的请求包 */ -@property (nonatomic, retain)TCOptionalReq objReq; - -@end - -/** - * \brief 消息体 - * - * TencentBaseMessageObj 应用之间传递消息体 - */ -@interface TencentBaseMessageObj : NSObject - -/** 消息类型 */ -@property (nonatomic, assign)NSInteger nVersion; - -/** 消息描述 */ -@property (nonatomic, retain)NSString *sName; - -/** 消息的扩展信息 主要是可以用来进行一些请求消息体的描述 譬如图片要求的width height 文字的关键字什么的, 也可以不用填写*/ -@property (nonatomic, retain)NSDictionary *dictExpandInfo; - -/** - * 消息是否有效 - */ -- (BOOL)isVaild; - -@end - -#pragma mark TencentTextMessage -/** - * \brief 文本的消息体 - * - * TencentTextMessageObjV1 应用之间传递的文本消息体 - */ -@interface TencentTextMessageObjV1 : TencentBaseMessageObj - -/** - * 文本 - * \note 文本长度不能超过4096个字 - */ -@property (nonatomic, retain) NSString *sText; - - -/** - * 初始化文本消息 - * \param text 文本 - * \return 初始化返回的文本消息 - */ -- (id)initWithText:(NSString *)text; - -@end - - -#pragma mark TecentImageMessage - -/** - * TencentApiImageSourceType 图片数据类型(请求方对数据类型可能会有限制) - */ -typedef enum -{ - /** 图片数据是url或二进制数据 */ - AllImage, - /** 图片数据是url */ - UrlImage, - /** 图片数据是二进制数据 */ - DataImage, -}TencentApiImageSourceType; - -/** - * \brief 图片的消息体 - * - * TencentImageMessageObjV1 应用之间传递的图片消息体 - */ -@interface TencentImageMessageObjV1 : TencentBaseMessageObj - -/** - * 图片数据 - * \note 图片不能大于10M - */ -@property (nonatomic, retain) NSData *dataImage; - -/** - * 缩略图的数据 - * \note 图片不能大于1M - */ -@property (nonatomic, retain) NSData *dataThumbImage; - -/** 图片URL */ -@property (nonatomic, retain) NSString *sUrl; - -/** 图片的描述 */ -@property (nonatomic, retain) NSString *sDescription; - -/** 图片的size */ -@property (nonatomic, assign) CGSize szImage; - -/** - * 图片来源 - * \note TencentApiImageSourceType对应的类型 - */ -@property (readonly, assign) NSInteger nType; - -/** - * 初始化图片消息 - * \param dataImage 图片类型 - * \return 初始化返回的图片消息 - */ -- (id)initWithImageData:(NSData *)dataImage; - -/** - * 初始化图片消息 - * \param url 图片url - * \return 初始化返回的图片消息 - */ -- (id)initWithImageUrl:(NSString *)url; - -/** - * 初始化图片消息 - * \param type 图片类型 - * \return 初始化返回的图片消息 - */ -- (id)initWithType:(TencentApiImageSourceType)type; -@end - - -#pragma mark TencentAudioMessage -/** - * \brief 音频的消息体 - * - * TencentAudioMessageObjV1 应用之间传递的音频消息体 - */ -@interface TencentAudioMessageObjV1 : TencentBaseMessageObj - -/** 音频URL */ -@property (nonatomic, retain) NSString *sUrl; - -/** - * 音频的预览图 - * \note图片不能大于1M - */ -@property (nonatomic, retain) NSData *dataImagePreview; - -/** 音频的预览图URL */ -@property (nonatomic, retain) NSString *sImagePreviewUrl; - -/** 音频的描述 */ -@property (nonatomic, retain) NSString *sDescription; - -/** - * 初始化图片消息 - * \param url 音频URL - * \return 初始化返回的音频消息 - */ -- (id)initWithAudioUrl:(NSString *)url; - -@end - - -#pragma mark TencentVideoMessage - -/** - * TencentApiVideoSourceType 视频数据类型(请求方对数据类型可能会有限制) - */ - -typedef enum -{ - /** 视频来源于本地或网络 */ - AllVideo, - /** 视频来源于本地 */ - LocalVideo, - /** 视频来源于网络 */ - NetVideo, -}TencentApiVideoSourceType; - -/** - * \brief 视频的消息体 - * - * TencentVideoMessageV1 应用之间传递的视频消息体 - */ -@interface TencentVideoMessageV1 : TencentBaseMessageObj - -/** - * 视频URL - * \note 不能超过1024 - */ -@property (nonatomic, retain) NSString *sUrl; - -/** - * 视频来源 主要是用来让发起方指定视频的来源 - * \note TencentApiVideoSourceType 对应的类型 只读参数 - */ -@property (readonly, assign) NSInteger nType; - -/** - * 视频的预览图 - * \note 图片不能大于1M - */ -@property (nonatomic, retain) NSData *dataImagePreview; - -/** 视频的预览图URL */ -@property (nonatomic, retain) NSString *sImagePreviewUrl; - -/** 视频的描述 */ -@property (nonatomic, retain) NSString *sDescription; - -/** - * 初始化视频消息 - * \param url 视频URL - * \param type 视频来源类型 - * \return 初始化返回的视频消息 - */ -- (id)initWithVideoUrl:(NSString *)url type:(TencentApiVideoSourceType)type; - - -/** - * 初始化视频消息 - * \param type 视频来源类型 - * \return 初始化返回的视频消息 - */ -- (id)initWithType:(TencentApiVideoSourceType)type; -@end - -#pragma mark TencentImageMessageObj -/** - * \brief 视频图片消息体 - * - * TencentVideoMessageV1 这是一个扩展的类 是一个图片视频类 - * \note 图片视频可以任选一个内容填充 但是注意只能填一个 当有一种类型被填充后 另外一个种类型就无法填充了 - */ -@interface TencentImageAndVideoMessageObjV1 : TencentBaseMessageObj - -/** 图片消息 */ -@property (nonatomic, retain) TencentImageMessageObjV1 *objImageMessage; - -/** 视频消息 */ -@property (nonatomic, retain) TencentVideoMessageV1 *objVideoMessage; - -/** - * 初始化图片消息 - * \param dataImage 图片数据 - * \param url 视频url - * \return 初始化返回的图片视频消息 - */ -- (id)initWithMessage:(NSData *)dataImage videoUrl:(NSString *)url; - -/** - * 设置图片 - * \param dataImage 图片数据 - */ -- (void)setDataImage:(NSData *)dataImage; - -/** - * 设置视频 - * \param videoUrl 视频URL - */ -- (void)setVideoUrl:(NSString *)videoUrl; -@end - -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuth.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuth.h deleted file mode 100644 index 6235655..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuth.h +++ /dev/null @@ -1,669 +0,0 @@ -/// -/// \file TencentOAuth.h -/// \brief QQ互联开放平台授权登录及相关开放接口实现类 -/// -/// Created by Tencent on 12-12-21. -/// Copyright (c) 2012年 Tencent. All rights reserved. -/// - -#import -#import "sdkdef.h" -#import "TencentOAuthObject.h" - -@protocol TencentSessionDelegate; -@protocol TencentLoginDelegate; -@protocol TencentApiInterfaceDelegate; -@protocol TencentWebViewDelegate; - -@class TencentApiReq; -@class TencentApiResp; - -typedef enum -{ - kTencentNotAuthorizeState, - kTencentSSOAuthorizeState, - kTencentWebviewAuthorzieState, -} TencentAuthorizeState; - -typedef enum -{ - kAuthModeClientSideToken, - kAuthModeServerSideCode, -} TencentAuthMode; - -#pragma mark - TencentOAuth(授权登录及相关开放接口调用) - -/** - * \brief TencentOpenAPI授权登录及相关开放接口调用 - * - * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用 - */ -@interface TencentOAuth : NSObject -{ - NSMutableDictionary* _apiRequests; - NSString* _accessToken; - NSDate* _expirationDate; - id _sessionDelegate; - NSString* _localAppId; - NSString* _openId; - NSString* _redirectURI; - NSArray* _permissions; -} - -/** Access Token凭证,用于后续访问各开放接口 */ -@property(nonatomic, copy) NSString* accessToken; - -/** Access Token的失效期 */ -@property(nonatomic, copy) NSDate* expirationDate; - -/** 已实现的开放接口的回调委托对象 */ -@property(nonatomic, assign) id sessionDelegate; - -/** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */ -@property(nonatomic, copy) NSString* localAppId; - -/** 用户授权登录后对该用户的唯一标识 */ -@property(nonatomic, copy) NSString* openId; - -/** 用户登录成功过后的跳转页面地址 */ -@property(nonatomic, copy) NSString* redirectURI; - -/** 第三方应用在互联开放平台申请的appID */ -@property(nonatomic, retain) NSString* appId; - -/** 主要是互娱的游戏设置uin */ -@property(nonatomic, retain) NSString* uin; - -/** 主要是互娱的游戏设置鉴定票据 */ -@property(nonatomic, retain) NSString* skey; - -/** 登陆透传的数据 */ -@property(nonatomic, copy) NSDictionary* passData; - -/** 授权方式(Client Side Token或者Server Side Code) */ -@property(nonatomic, assign) TencentAuthMode authMode; - -/** - * 用来获得当前sdk的版本号 - * \return 返回sdk版本号 - **/ - -+ (NSString*)sdkVersion; - -/** - * 用来获得当前sdk的小版本号 - * \return 返回sdk小版本号 - **/ - -+ (NSString*)sdkSubVersion; - -/** - * 用来获得当前sdk的是否精简版 - * \return 返回YES表示精简版 - **/ - -+ (BOOL)isLiteSDK; - -/** - * 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果 - * \return - * kTencentNotAuthorizeState:无授权 - * kTencentSSOAuthorizeState:有人发起了sso授权但无返回 - * kTencentWebviewAuthorzieState:有人发起了webview授权还未返回 - **/ - -+ (TencentAuthorizeState *)authorizeState; - -/** - * 用来获得当前手机qq的版本号 - * \return 返回手机qq版本号 - **/ -+ (QQVersion)iphoneQQVersion; - -/** - * 初始化TencentOAuth对象 - * \param appId 第三方应用在互联开放平台申请的唯一标识 - * \param delegate 第三方应用用于接收请求返回结果的委托对象 - * \return 初始化后的授权登录对象 - */ -- (id)initWithAppId:(NSString *)appId - andDelegate:(id)delegate; - - -/** - * 判断用户手机上是否安装手机QQ - * \return YES:安装 NO:没安装 - */ -+ (BOOL)iphoneQQInstalled; - -/** - * 判断用户手机上的手机QQ是否支持SSO登录 - * \return YES:支持 NO:不支持 - */ -+ (BOOL)iphoneQQSupportSSOLogin; - -/** - * 判断用户手机上是否安装手机QZone - * \return YES:安装 NO:没安装 - */ -+ (BOOL)iphoneQZoneInstalled; - -/** - * 判断用户手机上的手机QZone是否支持SSO登录 - * \return YES:支持 NO:不支持 - */ -+ (BOOL)iphoneQZoneSupportSSOLogin; - -/** - * 登录授权 - * - * \param permissions 授权信息列 - */ -- (BOOL)authorize:(NSArray *)permissions; - -/** - * 登录授权 - * \param permissions 授权信息列表 - * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 - */ -- (BOOL)authorize:(NSArray *)permissions - inSafari:(BOOL)bInSafari; - -/** - * 登录授权 - * \param permissions 授权信息列表 - * \param localAppId 应用APPID - * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 - */ -- (BOOL)authorize:(NSArray *)permissions - localAppId:(NSString *)localAppId - inSafari:(BOOL)bInSafari; - -/** - * 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权 - * \param permissions 需增量授权的信息列表 - * \return 增量授权调用是否成功 - */ -- (BOOL)incrAuthWithPermissions:(NSArray *)permissions; - -/** - * 重新授权,因token废除或失效导致接口调用失败,需用户重新授权 - * \param permissions 授权信息列表,同登录授权 - * \return 授权调用是否成功 - */ -- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions; - -/** - * (静态方法)处理应用拉起协议 - * \param url 处理被其他应用呼起时的逻辑 - * \return 处理结果,YES表示成功,NO表示失败 - */ -+ (BOOL)HandleOpenURL:(NSURL *)url; - -/** - * (静态方法)sdk是否可以处理应用拉起协议 - * \param url 处理被其他应用呼起时的逻辑 - * \return 处理结果,YES表示可以 NO表示不行 - */ -+ (BOOL)CanHandleOpenURL:(NSURL *)url; - -/** - * (静态方法)获取TencentOAuth调用的上一次错误信息 - */ -+ (NSString *)getLastErrorMsg; - -/** - * 以Server Side Code模式授权登录时,通过此接口获取返回的code值; - * 以Client Side Token模式授权登录时,忽略此接口。 - */ -- (NSString *)getServerSideCode; - -/** - * 退出登录(退出登录后,TecentOAuth失效,需要重新初始化) - * \param delegate 第三方应用用于接收请求返回结果的委托对象 - */ -- (void)logout:(id)delegate; - -/** - * 判断登录态是否有效 - * \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权 - */ -- (BOOL)isSessionValid; - -/** - * 获取用户个人信息 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getUserInfo; - -/** - * SDK内置webview实现定向分享时,第三方应用可以根据应用是否在白名单里来开启该配置开关,默认为关闭; - * 在白名单里的应用调用该接口后,即打开sdk内置webview的二级白名单开关(相对与sdk后台的白名单), - * 那么在sdk后台白名单校验请求失败的情况下,会继续先尝试采用内置webview进行分享。 - */ -- (void)openSDKWebViewQQShareEnable; - - -/** - * 获取用户QZone相册列表 - * \attention 需\ref apply_perm - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getListAlbum; - -/** - * 获取用户QZone相片列表 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCListPhotoDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getListPhotoWithParams:(NSMutableDictionary *)params; - - -/** - * 分享到QZone - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddShareDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)addShareWithParams:(NSMutableDictionary *)params; - - -/** - * 上传照片到QZone指定相册 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCUploadPicDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)uploadPicWithParams:(NSMutableDictionary *)params; - -/** - * 在QZone相册中创建一个新的相册 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddAlbumDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)addAlbumWithParams:(NSMutableDictionary *)params; - -/** - * 检查是否是QZone某个用户的粉丝 - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCCheckPageFansDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)checkPageFansWithParams:(NSMutableDictionary *)params; - -/** - * 在QZone中发表一篇日志 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddOneBlogDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)addOneBlogWithParams:(NSMutableDictionary *)params; - -/** - * 在QZone中发表一条说说 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddTopicDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)addTopicWithParams:(NSMutableDictionary *)params; - -/** - * 设置QQ头像 使用默认的效果处理设置头像的界面 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)setUserHeadpic:(NSMutableDictionary *)params; - - -/** - * 设置QQ头像 会返回设置头像由第三方自己处理界面的弹出方式 - * \attention 需\ref apply_perm - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic - * \param viewController 设置头像的界面 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)setUserHeadpic:(NSMutableDictionary *)params andViewController:(UIViewController **)viewController; - -/** - * 获取QQ会员信息(仅包括是否为QQ会员,是否为年费QQ会员) - * \attention 需\ref apply_perm - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getVipInfo; - -/** - * 获取QQ会员详细信息 - * \attention 需\ref apply_perm - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getVipRichInfo; - -/** - * 获取微博好友名称输入提示,即通过字符串查找匹配的微博好友 - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCMatchNickTipsDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)matchNickTips:(NSMutableDictionary *)params; - -/** - * 获取最近的微博好友 - * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCGetIntimateFriendsDic - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)getIntimateFriends:(NSMutableDictionary *)params; - -/** - * QZone定向分享,可以@到具体好友,完成后将触发responseDidReceived:forMessage:回调,message:“SendStory” - * \param params 参数字典 - * \param fopenIdArray 第三方应用预传人好友列表,好友以openid标识 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)sendStory:(NSMutableDictionary *)params friendList:(NSArray *)fopenIdArray; - -/** - * 发送应用邀请,完成后将触发responseDidReceived:forMessage:回调,message:“AppInvitation” - * \param desc 应用的描述文字,不超过35字符,如果为nil或@“”则显示默认描述 - * \param imageUrl 应用的图标,如果为nil或者@“”则显示默认图标 - * \param source 透传参数,由开发者自定义该参数内容 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)sendAppInvitationWithDescription:(NSString *)desc imageURL:(NSString *)imageUrl source:(NSString *)source; - -/** - * 发起PK或者发送炫耀,完成后将触发responseDidReceived:forMessage:回调,message:“AppChallenge” - * \param receiver 必须指定一位进行PK或者炫耀的好友,填写其OpenID,填写多个OpenID将截取第一个 - * \param type 类型,"pk"或者“brag” - * \param imageUrl 炫耀/挑战场景图的URL - * \param message 炫耀/挑战中的内容描述,不超过50个字符,超过限制则自动截断 - * \param source 透传参数,由开发者自定义该参数内容 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)sendChallenge:(NSString *)receiver type:(NSString *)type imageURL:(NSString *)imageUrl message:(NSString *)message source:(NSString *)source; - -/** - * 赠送或者请求礼物,完成后将触发responseDidReceived:forMessage:回调,message:“AppGiftRequest” - * \param receiver 赠送或者请求礼物的好友的OpenID,支持填写多个,OpenID之用","分隔,为nil时将由用户通过好友选择器选择好友 - * \param exclude 用户通过好友选择器选择好友场景下,希望排除的好友(不显示在好友选择器) - * \param specified 用户通过好友选择器选择好友场景下,希望出现的指定好友 - * \param only 是否只显示specified指定的好友 - * \param type 类型,"request"或者“freegift” - * \param title 免费礼物或请求名称,不超过6个字符 - * \param message 礼物或请求的默认赠言,控制在35个汉字以内,超过限制自动截断 - * \param imageUrl 请求或礼物配图的URL,如果不传,则默认在弹框中显示应用的icon - * \param source 透传参数,由开发者自定义该参数内容 - * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 - */ -- (BOOL)sendGiftRequest:(NSString *)receiver exclude:(NSString *)exclude specified:(NSString *)specified only:(BOOL)only type:(NSString *)type title:(NSString *)title message:(NSString *)message imageURL:(NSString *)imageUrl source:(NSString *)source; - - -/** - * 退出指定API调用 - * \param userData 用户调用某条API的时候传入的保留参数 - * \return 处理结果,YES表示成功 NO表示失败 - */ -- (BOOL)cancel:(id)userData; - -/** - * CGI类任务创建接口 - * \param apiURL CGI请求的URL地址 - * \param method CGI请求方式:"GET","POST" - * \param params CGI请求参数字典 - * \param callback CGI请求结果的回调接口对象 - * \return CGI请求任务实例,用于取消任务,返回nil代表任务创建失败 - */ -- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id)callback; - -/** - * TencentOpenApi发送任务统一接口 - * \param request 请求发送的任务 - * \param callback 任务发送后的回调地址 - */ -- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id)callback; - -- (NSString *)getUserOpenID; - -@end - -#pragma mark - TencentLoginDelegate(授权登录回调协议) - -/** - * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议 - * - * 第三方应用实现登录的回调协议 - */ -@protocol TencentLoginDelegate - -@required - -/** - * 登录成功后的回调 - */ -- (void)tencentDidLogin; - -/** - * 登录失败后的回调 - * \param cancelled 代表用户是否主动退出登录 - */ -- (void)tencentDidNotLogin:(BOOL)cancelled; - -/** - * 登录时网络有问题的回调 - */ -- (void)tencentDidNotNetWork; - -@optional -/** - * 登录时权限信息的获得 - */ -- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams; - -@end - -#pragma mark - TencentSessionDelegate(开放接口回调协议) - -/** - * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议 - * - * 第三方应用需要实现每条需要调用的API的回调协议 - */ -@protocol TencentSessionDelegate - -@optional - -/** - * 退出登录的回调 - */ -- (void)tencentDidLogout; - -/** - * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。 - * \param tencentOAuth 登录授权对象。 - * \param permissions 需增量授权的权限列表。 - * \return 是否仍然回调返回原始的api请求结果。 - * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号 - */ -- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions; - -/** - * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。 - * \param tencentOAuth 登录授权对象。 - * \return 是否仍然回调返回原始的api请求结果。 - * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号 - */ -- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth; - -/** - * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。 - * \param tencentOAuth token及有效期限等信息更新后的授权实例对象 - * \note 第三方应用需更新已保存的token及有效期限等信息。 - */ -- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth; - -/** - * 用户增量授权过程中因取消或网络问题导致授权失败 - * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType - */ -- (void)tencentFailedUpdate:(UpdateFailType)reason; - -/** - * 获取用户个人信息回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success - * 错误返回示例: \snippet example/getUserInfoResponse.exp fail - */ -- (void)getUserInfoResponse:(APIResponse*) response; - - -/** - * 获取用户QZone相册列表回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/getListAlbumResponse.exp success - * 错误返回示例: \snippet example/getListAlbumResponse.exp fail - */ -- (void)getListAlbumResponse:(APIResponse*) response; - -/** - * 获取用户QZone相片列表 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/getListPhotoResponse.exp success - * 错误返回示例: \snippet example/getListPhotoResponse.exp fail - */ -- (void)getListPhotoResponse:(APIResponse*) response; - -/** - * 检查是否是QZone某个用户的粉丝回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/checkPageFansResponse.exp success - * 错误返回示例: \snippet example/checkPageFansResponse.exp fail - */ -- (void)checkPageFansResponse:(APIResponse*) response; - -/** - * 分享到QZone回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/addShareResponse.exp success - * 错误返回示例: \snippet example/addShareResponse.exp fail - */ -- (void)addShareResponse:(APIResponse*) response; - -/** - * 在QZone相册中创建一个新的相册回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/addAlbumResponse.exp success - * 错误返回示例: \snippet example/addAlbumResponse.exp fail - */ -- (void)addAlbumResponse:(APIResponse*) response; - -/** - * 上传照片到QZone指定相册回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/uploadPicResponse.exp success - * 错误返回示例: \snippet example/uploadPicResponse.exp fail - */ -- (void)uploadPicResponse:(APIResponse*) response; - - -/** - * 在QZone中发表一篇日志回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/addOneBlogResponse.exp success - * 错误返回示例: \snippet example/addOneBlogResponse.exp fail - */ -- (void)addOneBlogResponse:(APIResponse*) response; - -/** - * 在QZone中发表一条说说回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/addTopicResponse.exp success - * 错误返回示例: \snippet example/addTopicResponse.exp fail - */ -- (void)addTopicResponse:(APIResponse*) response; - -/** - * 设置QQ头像回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/setUserHeadpicResponse.exp success - * 错误返回示例: \snippet example/setUserHeadpicResponse.exp fail - */ -- (void)setUserHeadpicResponse:(APIResponse*) response; - -/** - * 获取QQ会员信息回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/getVipInfoResponse.exp success - * 错误返回示例: \snippet example/getVipInfoResponse.exp fail - */ -- (void)getVipInfoResponse:(APIResponse*) response; - -/** - * 获取QQ会员详细信息回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - */ -- (void)getVipRichInfoResponse:(APIResponse*) response; - -/** - * 获取微博好友名称输入提示回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/matchNickTipsResponse.exp success - * 错误返回示例: \snippet example/matchNickTipsResponse.exp fail - */ -- (void)matchNickTipsResponse:(APIResponse*) response; - -/** - * 获取最近的微博好友回调 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \remarks 正确返回示例: \snippet example/getIntimateFriendsResponse.exp success - * 错误返回示例: \snippet example/getIntimateFriendsResponse.exp fail - */ -- (void)getIntimateFriendsResponse:(APIResponse*) response; - -/** - * sendStory分享的回调(已废弃,使用responseDidReceived:forMessage:) - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - */ -- (void)sendStoryResponse:(APIResponse*) response; - - -/** - * 社交API统一回调接口 - * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse - * \param message 响应的消息,目前支持‘SendStory’,‘AppInvitation’,‘AppChallenge’,‘AppGiftRequest’ - */ -- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message; - -/** - * post请求的上传进度 - * \param tencentOAuth 返回回调的tencentOAuth对象 - * \param bytesWritten 本次回调上传的数据字节数 - * \param totalBytesWritten 总共已经上传的字节数 - * \param totalBytesExpectedToWrite 总共需要上传的字节数 - * \param userData 用户自定义数据 - */ -- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData; - - -/** - * 通知第三方界面需要被关闭 - * \param tencentOAuth 返回回调的tencentOAuth对象 - * \param viewController 需要关闭的viewController - */ -- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController; - -@end - -#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调) - -/** - * \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议 - * - * 第三方应用可以根据自己APP的旋转方向限制,通过此协议设置 - */ -@protocol TencentWebViewDelegate -@optional -- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; -- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit; -- (BOOL) tencentWebViewShouldAutorotateWithWebkit; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuthObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuthObject.h deleted file mode 100644 index a533639..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/TencentOAuthObject.h +++ /dev/null @@ -1,504 +0,0 @@ -/// -/// \file TencentOAuthObject.h -/// 对开放接口的调用提供参数字典封装的辅助类 -/// -/// Created by Tencent on 12-12-28. -/// Copyright (c) 2012年 Tencent. All rights reserved. -/// - -#import -#import -#import "sdkdef.h" - - -#pragma mark - -#pragma mark TCAddTopicDic - -/** - * \brief 发表说说的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCAddTopicDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCAddTopicDic *) dictionary; - -/** - * 发布心情时引用的信息的类型。 - * \note 1表示图片; 2表示网页; 3表示视频 - */ -@property (nonatomic, retain) TCOptionalStr paramRichtype; - -/** - * 发布心情时引用的信息的值。有richtype时必须有richval - * - * \note - * -# 当richtype为图片(即richtype为1,应用场景为发布心情时引用某张图片)时,\n - * richval需要传入该图片的相关参数。引用的图片来源分为两种:一种为网站图片,\n - * 一种为QQ空间相册中的某张图片。 - * - 当引用的图片来自网站,richval包含下列参数的值:\n - * | 参数名称 | 是否必须 | 类型 | 描述 | - * | ------ | ------- | ------ | ----------------- | - * | url | 必须 | string | 网站图片的URL | - * | height | 必须 | string | 图片高度,单位: px | - * | width | 必须 | string | 图片宽度,单位: px | - * \n - * 输入时每个值中间用“&”分隔,如下所示:\n - * “url=http://qq.com/logo.png&width=25&height=21” - * - * - 当引用的图片来自QQ空间相册,richval包含下列参数的值。\n - * 这些值都需要通过调用相册OpenAPI来获得。参数意义如下:\n - * | 参数名称 | 是否必须 | 类型 | 描述 | - * | --------- | ------ | ------ | ---------------------------------- | - * | albumid | 必须 | string | 图片所属空间相册的ID | - * | pictureid | 必须 | string | 图片ID | - * | sloc | 必须 | string | 小图ID | - * | pictype | | string | 图片类型(JPG = 1;GIF = 2;PNG = 3) | - * | picheight | | string | 图片高度,单位: px | - * | picwidth | | string | 图片宽度,单位: px | - * 输入时每个值中间用逗号分隔,如下所示 :\n - * “albumid,pictureid,sloc,pictype,picheight,picwidth” - * -# 当richtype为网页(即richtype为2,应用场景为针对某网页发表评论)时,\n - * richval需要传入该网页的URL,发表为feeds时,后台会自动将该URL转换为短URL。 - * -# 当richtype为视频(即richtype为3,应用场景为针对某视频发表评论)时,\n - * richval需要传入该视频的URL,发表为feeds时,后台会对该URL进行解析,\n - * 在feeds上显示播放器,视频源及缩略图。 - */ -@property (nonatomic, retain) TCOptionalStr paramRichval; - -/** - * 发布的心情的内容。 - */ -@property (nonatomic, retain) TCRequiredStr paramCon; - -/** - * 地址文。例如:广东省深圳市南山区高新科技园腾讯大厦。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 - */ -@property (nonatomic, retain) TCOptionalStr paramLbs_nm; - -/** - * 经度。-180.0到+180.0,+表示东经。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 - */ -@property (nonatomic, retain) TCOptionalStr paramLbs_x; - -/** - * 纬度。-90.0到+90.0,+表示北纬。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 - */ -@property (nonatomic, retain) TCOptionalStr paramLbs_y; - -/** - * 第三方应用的平台类型。 - * \note 1表示QQ空间; 2表示腾讯朋友; 3表示腾讯微博平台; 4表示腾讯Q+平台。 - */ -@property (nonatomic, retain) TCOptionalStr paramThirdSource; -@end - - -#pragma mark - -#pragma mark TCAddOneBlogDic -/** - * \brief 发表日志的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCAddOneBlogDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCAddOneBlogDic *) dictionary; - -/** - * 日志标题(纯文本,最大长度128个字节,utf-8编码)。 - */ -@property (nonatomic, retain) TCRequiredStr paramTitle; - -/** - * content 文章内容(html数据,最大长度100*1024个字节,utf-8编码) - */ -@property (nonatomic, retain) TCRequiredStr paramContent; -@end - -#pragma mark - -#pragma mark TCAddAlbumDic -/** - * \brief 创建空间相册的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCAddAlbumDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCAddAlbumDic *) dictionary; - -/** - * albumname 必须 string 相册名 不能超过30个字符。 - */ -@property (nonatomic, retain) TCRequiredStr paramAlbumname; - - -/** - * albumdesc string 相册描述,不能超过200个字符。 - */ -@property (nonatomic, retain) TCOptionalStr paramAlbumdesc; - -/** - * priv string 相册权限 - * - * \note 其取值含义为: 1=公开;3=只主人可见; 4=QQ好友可见; 5=问答加密。\n - * 不传则相册默认为公开权限。\n - * 如果priv取值为5,即相册是问答加密的,则必须包含问题和答案两个参数:\n - * - question: 问题,不能超过30个字符。 - * - answer: 答案,不能超过30个字符。 - */ -@property (nonatomic, retain) TCOptionalStr paramPriv; - -/** - * question 问题,不能超过30个字符。 - * \note 如果priv取值为5,必须包含这个参数: - **/ -@property (nonatomic, retain) TCOptionalStr paramQuestion; - -/** - * answer 答案,不能超过30个字符。 - * \note 如果priv取值为5,必须包含这个参数: - **/ -@property (nonatomic, retain) TCOptionalStr paramAnswer; - -@end - -#pragma mark - -#pragma mark TCUploadPicDic -/** - * \brief 上传一张照片到QQ空间相册的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCUploadPicDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCUploadPicDic *) dictionary; - -/** - * photodesc string 照片描述,注意照片描述不能超过200个字符。 - */ -@property (nonatomic, retain) TCOptionalStr paramPhotodesc; -/** - * string 照片的命名,必须以.jpg, .gif, .png, .jpeg, .bmp此类后缀结尾。 - */ -@property (nonatomic, retain) TCOptionalStr paramTitle; - -/** - * string 相册id。可不填,不填时则根据“mobile”标识选择默认上传的相册。 - */ -@property (nonatomic, retain) TCOptionalStr paramAlbumid; - -/** - * 标志位 - * - * \note 0表示PC,1表示手机。用于当不传相册id时(即albumid为空时)控制是否传到手机相册。\n - * -# 如果传1,则当albumid为空时,图片会上传到手机相册; - * -# 如果不传或传0,则当albumid为空时,图片会上传到贴图相册; - */ -@property (nonatomic, assign) TCOptionalStr paramMobile; - -/** - * x string 照片拍摄时的地理位置的经度。请使用原始数据(纯经纬度,0-360)。 - */ -@property (nonatomic, retain) TCOptionalStr paramX; - -/** - * y string 照片拍摄时的地理位置的纬度。请使用原始数据(纯经纬度,0-360)。 - */ -@property (nonatomic, retain) TCOptionalStr paramY; - -/** - * picture 必须 string 上传照片的文件名以及图片的内容(在发送请求时,图片内容以二进制数据流的形式发送,见下面的请求示例),注意照片名称不能超过30个字符。 - */ -@property (nonatomic, retain) TCRequiredImage paramPicture; - -/** - * needfeed int 标识上传照片时是否要发feed - * \note(0:不发feed; 1:发feed)。如果不填则默认为发feed。 - */ -@property (nonatomic, assign)TCOptionalStr paramNeedfeed; - -/** - * successnum int 批量上传照片时,已成功上传的张数,指明上传完成情况。 - * \note 单张上传时可以不填,不填则默认为0。 - */ -@property (nonatomic, assign)TCOptionalStr paramSuccessnum; - -/** - * picnum int 批量上传照片的总张数,如果不填则默认为1。 - * \note - * - 如果picnum=1,为单张上传,发送单张上传feed; - * - 如果picnum>1,为批量上传,发送批量上传feed。 - * 批量上传方式:picnum为一次上传照片的张数,successnum初始值为0,每调用一次照片上传接口后递增其值。 - * 信息中心中的feed表现形式:批量上传时最新的7张在feed中展示。其中最新上传的一张图片展示为大图,剩下的 - * 六张按从新到旧的顺序展示为小图,其他图片不在feed中展示。 - */ -@property (nonatomic, assign)TCOptionalStr paramPicnum; - -@end - -#pragma mark - -#pragma mark TCAddShareDic -/** - * \brief 同步分享到QQ空间,腾讯微博的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCAddShareDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCAddShareDic *) dictionary; - -/** - * title 必须 string feeds的标题 最长36个中文字,超出部分会被截断。 - */ -@property (nonatomic, retain) TCRequiredStr paramTitle; - - -/** - * url 必须 string 分享所在网页资源的链接,点击后跳转至第三方网页,对应上文接口说明中2的超链接。请以http://开头。 - */ -@property (nonatomic, retain) TCRequiredStr paramUrl; - - -/** - * comment string 用户评论内容,也叫发表分享时的分享理由 禁止使用系统生产的语句进行代替。 - * 最长40个中文字,超出部分会被截断。 - */ -@property (nonatomic, retain) TCOptionalStr paramComment; - - -/** - * summary string 所分享的网页资源的摘要内容,或者是网页的概要描述 最长80个中文字,超出部分会被截断。 - */ -@property (nonatomic, retain) TCOptionalStr paramSummary; - -/** - * images string 所分享的网页资源的代表性图片链接",请以http://开头,长度限制255字符。多张图片以竖线(|)分隔,目前只有第一张图片有效,图片规格100*100为佳。 - */ -@property (nonatomic, retain) TCOptionalStr paramImages; - -/** - * type string 分享内容的类型。 - * - * \note 4表示网页;5表示视频(type=5时,必须传入playurl) - */ -@property (nonatomic, retain) TCOptionalStr paramType; - -/** - * playurl string 长度限制为256字节。仅在type=5的时候有效,表示视频的swf播放地址。 - */ -@property (nonatomic, retain) TCOptionalStr paramPlayurl; - -/** - * site 必须 string 分享的来源网站名称,请填写网站申请接入时注册的网站名称 - */ -@property (nonatomic, retain) TCRequiredStr paramSite; - -/** - * fromurl 必须 string 分享的来源网站对应的网站地址url 请以http://开头。 - */ -@property (nonatomic, retain) TCRequiredStr paramFromurl; - -/** - * nswb string 值为1时,表示分享不默认同步到微博,其他值或者不传此参数表示默认同步到微博。 - */ -@property (nonatomic, retain) TCOptionalStr paramNswb; - -@end - -#pragma mark - -#pragma mark TCCheckPageFansDic -/** - * \brief 验证是否认证空间粉丝tttyttyyyu的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCCheckPageFansDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCCheckPageFansDic *) dictionary; - -/** - * 表示认证空间的QQ号码 - */ -@property (nonatomic, retain) TCRequiredStr paramPage_id; -@end - -#pragma mark - -#pragma mark TCSetUserHeadpic -/** - * \brief 设置用户头像 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCSetUserHeadpic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCSetUserHeadpic *) dictionary; - -/** - * 设置用户头像的图片 - */ -@property (nonatomic, retain) TCRequiredImage paramImage; - -/** - * 图片的文件名 - */ -@property (nonatomic, retain) TCOptionalStr paramFileName; -@end - -#pragma mark - -#pragma mark TCListPhotoDic - -/** - * \brief 获取用户QQ空间相册中的照片列表 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCListPhotoDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCListPhotoDic *) dictionary; - -/** - * 表示要获取的照片列表所在的相册ID - */ -@property (nonatomic, retain) TCRequiredStr paramAlbumid; - -@end - -#pragma mark - -#pragma mark TCMatchNickTipsDic -/** - * \brief 微博获取好友输入提示的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCMatchNickTipsDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCMatchNickTipsDic *) dictionary; - -/** - * 匹配字符串(目前匹配范围为我收听的人) - */ -@property (nonatomic, retain) TCRequiredStr paramMatch; - -/** - * 请求个数(1-10) - */ -@property (nonatomic, retain) TCRequiredStr paramReqnum; - -@end - - -#pragma mark - -#pragma mark TCGetIntimateFriendsDic -/** - * \brief 微博获取最近联系人列表的参数字典定义 - * - * 可以直接填写相应参数后将对象当作参数传入API中 - */ -@interface TCGetIntimateFriendsDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCGetIntimateFriendsDic *) dictionary; - -/** - * 请求个数(1-20) - */ -@property (nonatomic, retain) TCRequiredStr paramReqnum; - -@end - -#pragma mark - -#pragma mark TCSendStoryDic -/** - * \brief QQ空间定向分享的参数字典定义 - * - * 该分享支持@到指定好友,最多支持10个好友。 - * 其中第三方应用可预传最多5个指定好友的openid,其余好友由用户自行选择。 - * 该分享形式仅提供跳QZone分享和本地Html5分享两种形式。 - * sendStroy不支持userData参数 - */ -@interface TCSendStoryDic : TCAPIRequest - -/** - * 返回一个对象用来进行API参数的填充 - * - * \note 不用释放,返回的对象是自动释放的 - */ -+ (TCSendStoryDic *) dictionary; - -/** - * 分享的标题 - */ -@property (nonatomic, retain) TCRequiredStr paramTitle; - -/** - * 故事摘要,最多不超过50个汉字,可以为空 - */ -@property (nonatomic, retain) TCOptionalStr paramSummary; - -/** - * 默认展示在输入框里的分享理由,最多120个汉字,可以为空 - */ -@property (nonatomic, retain) TCOptionalStr paramDescription; - -/** - * 图片url - */ -@property (nonatomic, retain) TCOptionalStr paramPics; - -/** - * 如果不填,则默认为"进入应用" - */ -@property (nonatomic, retain) TCRequiredStr paramAct; - -/** - * 点击分享的Url - */ -@property (nonatomic, retain) TCOptionalStr paramShareUrl; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/WeiBoAPI.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/WeiBoAPI.h deleted file mode 100644 index c8c9ff2..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/WeiBoAPI.h +++ /dev/null @@ -1,83 +0,0 @@ -// -// WeiBoAPI.h -// TencentOpenApi_IOS -// -// Created by qqconnect on 13-6-25. -// Copyright (c) 2013年 Tencent. All rights reserved. -// - -#ifndef QQ_OPEN_SDK_LITE - -#import -#import "sdkdef.h" - -/** 微博相关接口基类 */ -@interface WeiBo_baseRequest : TCAPIRequest - -@end - - -/** - * \brief 发表一条微博信息(纯文本)到腾讯微博平台上。 - * \note 注意连续两次发布的微博内容不可以重复。 - */ - -@interface WeiBo_add_t_POST : WeiBo_baseRequest - -/** - * 表示要发表的微博内容。 - * \note 必须为UTF-8编码,最长为140个汉字,也就是420字节。 - * 如果微博内容中有URL,后台会自动将该URL转换为短URL,每个URL折算成11个字节。 - * 若在此处@好友,需正确填写好友的微博账号,而非昵称。 - */ -@property (nonatomic, retain) TCRequiredStr param_content; - -/** - * 用户ip。 - * \note 必须正确填写用户侧真实ip,不能为内网ip及以127或255开头的ip,以分析用户所在地。 - */ -@property (nonatomic, retain) TCOptionalStr param_clientip; - -/** - * 用户所在地理位置的经度。 - * \note 为实数,最多支持10位有效数字。有效范围:-180.0到+180.0,+表示东经,默认为0.0。 - */ -@property (nonatomic, retain) TCOptionalStr param_longitude; - -/** - * 用户所在地理位置的纬度。 - * \note 为实数,最多支持10位有效数字。有效范围:-90.0到+90.0,+表示北纬,默认为0.0。 - */ -@property (nonatomic, retain) TCOptionalStr param_latitude; - -/** - * 容错标志,支持按位操作,默认为0。 - * \note 0×2:图片数据大小错误则报错; - * 0×4:检查图片格式不支持则报错; - * 0×8:上传图片失败则报错; - * 0×20:微博内容长度超过140字则报错; - * 0:以上错误均做容错处理,即发表普通微博; - * 0×2|0×4|0×8|0×20:同旧模式,以上各种情况均报错,不做兼容处理。 - * 0x2,0x4,0x8 只对 \ref WeiBo_add_pic_t_POST 有效 - */ -@property (nonatomic, retain) TCRequiredStr param_compatibleflag; - -@end - -/** - * \brief 上传一张图片,并发布一条消息到腾讯微博平台上。 - * \note 除了图片参数 其他参数参照 \ref WeiBo_add_t_POST - */ -@interface WeiBo_add_pic_t_POST : WeiBo_add_t_POST - -/** - * 要上传的图片的文件名以及图片的内容 - * \note 图片仅支持gif、jpeg、jpg、png、bmp及ico格式 - * (所有图片都会重新压缩,gif被重新压缩后不会再有动画效果),图片size小于4M - */ - -@property (nonatomic, retain) TCRequiredImage param_pic; - -@end - -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/sdkdef.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/sdkdef.h deleted file mode 100644 index 287f998..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/Headers/sdkdef.h +++ /dev/null @@ -1,454 +0,0 @@ -/// -/// \file sdkdef.h -/// \brief SDK中相关常量定义 -/// -/// Created by Tencent on 12-12-25. -/// Copyright (c) 2012年 Tencent. All rights reserved. -/// - -#import -#import - -/** - * \brief 设置sdk的log等级 - */ -typedef enum { - TCOLogLevel_Disabled = -1, // 关闭所有log - TCOLogLevel_Error = 0, - TCOLogLevel_Warning, - TCOLogLevel_Info, - TCOLogLevel_Debug, -} TCOLogLevel; - -/** - * \brief 手机qq的当前版本 - */ -typedef enum QQVersion -{ - kQQUninstall, - kQQVersion3_0, - kQQVersion4_0, //支持sso登陆 - kQQVersion4_2_1, //ios7兼容 - kQQVersion4_5, //4.5版本,wpa会话 - kQQVersion4_6, //4.6版本,sso登陆信令通道切换 - kQQVersion4_7, //4.7版本 不确定新支持了什么样的属性 -} QQVersion; - -/** - * \brief APIResponse.retCode可能的枚举常量 - */ -typedef enum -{ - URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确 - * \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致 - */ - - URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */ -} REPONSE_RESULT; - -/** - * \brief 增量授权失败原因 - * - * \note 增量授权失败不影响原token的有效性(原token已失效的情况除外) - */ -typedef enum -{ - kUpdateFailUnknown = 1, ///< 未知原因 - kUpdateFailUserCancel, ///< 用户取消 - kUpdateFailNetwork, ///< 网络问题 -} UpdateFailType; - -/** - * \brief 封装服务器返回的结果 - * - * APIResponse用于封装所有请求的返回结果,包括错误码、错误信息、原始返回数据以及返回数据的json格式字典 - */ -@interface APIResponse : NSObject { - int _detailRetCode; - int _retCode; - int _seq; - NSString *_errorMsg; - NSDictionary *_jsonResponse; - NSString *_message; - id _userData; -} - -/** - * 新增的详细错误码\n - * detailRetCode主要用于区分不同的错误情况,参见\ref OpenSDKError - */ -@property (nonatomic, assign) int detailRetCode; - -/** - * 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n - * retCode具体取值可参考\ref REPONSE_RESULT - */ -@property (nonatomic, assign) int retCode; - -/** - * 网络请求对应的递增序列号,方便内部管理 - */ -@property (nonatomic, assign) int seq; - -/** - * 错误提示语 - */ -@property (nonatomic, retain) NSString *errorMsg; - -/** - * 服务器返回数据的json格式字典\n - * 字典内具体参数的命名和含义请参考\ref api_spec - */ -@property (nonatomic, retain) NSDictionary *jsonResponse; - -/** - * 服务器返回的原始数据字符串 - */ -@property (nonatomic, retain) NSString *message; - -/** - * 用户保留数据 - */ -@property (nonatomic, retain) id userData; - -@end - - -/** - * 用户自定义的保留字段 - */ -FOUNDATION_EXTERN NSString * const PARAM_USER_DATA; - -/** - * \name 应用邀请参数字段定义 - */ -///@{ - -/** 应用邀请展示图片url的key */ -FOUNDATION_EXTERN NSString * const PARAM_APP_ICON; - -/** 应用邀请描述文本的key */ -FOUNDATION_EXTERN NSString * const PARAM_APP_DESC; - -/** 应用邀请好友列表的key */ -FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS; - -///@} - -/** - * \name sendStory新分享参数字段定义 - */ -///@{ - -/** 预填入接受人列表的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER; - -/** 分享feeds标题的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE; - -/** 分享feeds评论内容的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT; - -/** 分享feeds摘要的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY; - -/** 分享feeds展示图片url的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE; - -/** 分享feeds跳转链接url的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL; - -/** 分享feeds点击操作默认行为的key */ -FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT; - -///@} - -/** - * \name 设置头像参数字段定义 - */ -///@{ - -/** 头像图片数据的key */ -FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC; - -/** 头像图片文件名的key */ -FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME; - -///@} - -/** - * \name 服务器返回数据的参数字段定义 - */ -///@{ - -/** 服务器返回码的key */ -FOUNDATION_EXTERN NSString * const PARAM_RETCODE; - -/** 服务器返回错误信息的key */ -FOUNDATION_EXTERN NSString * const PARAM_MESSAGE; - -/** 服务器返回额外数据的key */ -FOUNDATION_EXTERN NSString * const PARAM_DATA; - -///@} - -/** - * \name 错误信息相关常量定义 - */ -///@{ - -/** 详细错误信息字典中额外信息的key */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo; - -/** 详细错误信息字典中返回码的key */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode; - -/** 详细错误信息字典中错误语句的key */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg; - -/** 不支持的接口 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI; - -/** 操作成功 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess; - -/** 未知错误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown; - -/** 用户取消 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel; - -/** 请重新登录 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin; - -/** 应用没有操作权限 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny; - -/** 网络异常或没有网络 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork; - -/** URL格式或协议错误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL; - -/** 解析数据出错 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse; - -/** 传入参数有误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam; - -/** 连接超时 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout; - -/** 安全问题 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity; - -/** 文件读写错误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO; - -/** 服务器端错误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer; - -/** 页面错误 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage; - -/** 设置头像图片过大 */ -FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge; - -///@} - -/** - * \brief SDK新增详细错误常量 - */ -typedef enum -{ - kOpenSDKInvalid = -1, ///< 无效的错误码 - kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口 - - /** - * \name CommonErrorCode - * 公共错误码 - */ - ///@{ - kOpenSDKErrorSuccess = 0, ///< 成功 - kOpenSDKErrorUnknown, ///< 未知错误 - kOpenSDKErrorUserCancel, ///< 用户取消 - kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录 - kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限 - ///@} - - /** - * \name NetworkRelatedErrorCode - * 网络相关错误码 - */ - ///@{ - kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器 - kOpenSDKErrorURL, ///< URL格式或协议错误 - kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错 - kOpenSDKErrorParam, ///< 传入参数错误 - kOpenSDKErrorConnTimeout, ///< http连接超时 - kOpenSDKErrorSecurity, ///< 安全问题 - kOpenSDKErrorIO, ///< 下载和文件IO错误 - kOpenSDKErrorServer, ///< 服务器端错误 - ///@} - - /** - * \name WebViewRelatedError - * webview特有错误 - */ - ///@{ - kOpenSDKErrorWebPage, ///< 页面错误 - ///@} - - /** - * \name SetUserHeadRelatedErrorCode - * 设置头像自定义错误码段 - */ - ///@{ - kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码 - ///@} -} OpenSDKError; - -/** - * \name SDK版本(v1.3)支持的授权列表常量 - */ -///@{ - -/** 发表一条说说到QQ空间(需要申请权限) */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC; - -/** 发表一篇日志到QQ空间(需要申请权限) */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG; - -/** 创建一个QQ空间相册(需要申请权限) */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM; - -/** 上传一张照片到QQ空间相册(需要申请权限) */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC; - -/** 获取用户QQ空间相册列表(需要申请权限) */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM; - -/** 同步分享到QQ空间、腾讯微博 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE; - -/** 验证是否认证空间粉丝 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS; - -/** 上传图片并发表消息到腾讯微博 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_PIC_T; - -/** 删除一条微博信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_DEL_T; - -/** 获取一条微博的转播或评论信息列表 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_REPOST_LIST; - -/** 获取登录用户自己的详细信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO; - -/** 获取其他用户的详细信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO; - -/** 获取登录用户的听众列表 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_FANSLIST; - -/** 获取登录用户的收听列表 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_IDOLLIST; - -/** 收听腾讯微博上的用户 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_IDOL; - -/** 取消收听腾讯微博上的用户 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_DEL_IDOL; - -/** 获取微博中最近at的好友 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INTIMATE_FRIENDS_WEIBO; - -/** 获取微博中匹配昵称的好友 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_MATCH_NICK_TIPS_WEIBO; - -/** 获取会员用户基本信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO; - -/** 获取会员用户详细信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO; - -/** 获取用户信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO; - -/** 移动端获取用户信息 */ -FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO; -///@} - - -/** - * \name CGI接口相关参数类型定义 - */ -///@{ - -/** 必填的字符串类型参数 */ -typedef NSString *TCRequiredStr; - -/** 必填的UIImage类型参数 */ -typedef UIImage *TCRequiredImage; - -/** 必填的整型参数 */ -typedef NSInteger TCRequiredInt; - -/** 必填的数字类型 */ -typedef NSNumber *TCRequiredNumber; - -/** 必填的NSData参数 */ -typedef NSData *TCRequiredData; - -/** 可选的字符串类型参数 */ -typedef NSString *TCOptionalStr; - -/** 可选的UIImage类型参数 */ -typedef UIImage *TCOptionalImage; - -/** 可选的整型参数 */ -typedef NSInteger TCOptionalInt; - -/** 可选的数字类型 */ -typedef NSNumber *TCOptionalNumber; - -/** 可选的不定类型参数 */ -typedef id TCRequiredId; -///@} - - -/** - * \brief CGI请求的参数字典封装辅助基类 - * - * 将相应属性的值以key-value的形式保存到参数字典中 - */ -@interface TCAPIRequest : NSMutableDictionary - -/** CGI请求的URL地址 */ -@property (nonatomic, readonly) NSURL *apiURL; - -/** CGI请求方式:"GET","POST" */ -@property (nonatomic, readonly) NSString *method; - -/** - * API参数中的保留字段,可以塞入任意字典支持的类型,再调用完成后会带回给调用方 - */ -@property (nonatomic, retain) TCRequiredId paramUserData; - -/** - * APIResponse,API的返回结果 - */ -@property (nonatomic, readonly) APIResponse *response; - -/** 取消相应的CGI请求任务 */ -- (void)cancel; - -@end - -@protocol TCAPIRequestDelegate -@optional -- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response; - -@end - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/TencentOpenAPI b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/TencentOpenAPI deleted file mode 100644 index 065ffda..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenAPI.framework/TencentOpenAPI and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/error.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/error.png deleted file mode 100644 index 0d5800b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/error.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/qqicon.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/qqicon.png deleted file mode 100644 index 6b2da46..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/qqicon.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/success.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/success.png deleted file mode 100644 index 4a26634..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/success.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h deleted file mode 100644 index 77eb2cf..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/UMSocialQQHandler.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// UMSocialQQHandler.h -// SocialSDK -// -// Created by yeahugo on 13-8-5. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import - -#import //QQ互联 SDK -#import - -@interface UMSocialQQHandler : NSObject - -/** - 设置分享到手机QQ和QQ空间的应用ID - - @param appId QQ互联应用Id - @param appKey QQ互联应用Key - - @param url 分享URL链接 - */ -+(void)setQQWithAppId:(NSString *)appId appKey:(NSString *)appKey url:(NSString *)url; - -/** - 设置在没有安装QQ客户端的情况下,是否支持单独授权到QQ互联 - - @param supportWebView 是否支持没有安装QQ客户端的情况下,是否支持单独授权 - */ -+(void)setSupportWebView:(BOOL)supportWebView; - -/** - deprecated API,默认使用Qzone SSO授权 - 设置QQ空间是否用手机QQ客户端进行SSO授权,默认使用webview授权 - - @param supportQzoneSSO 是否用手机QQ授权 - */ -//+ (void)setSupportQzoneSSO:(BOOL)supportQzoneSSO; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/libSocialQQ.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/libSocialQQ.a deleted file mode 100644 index 8f3e500..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/libSocialQQ.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h deleted file mode 100644 index f7a6868..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/UMSocialTumblrHandler.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// UMSocialThumblrHandler.h -// SocialSDK -// -// Created by Gavin Ye on 8/20/14. -// Copyright (c) 2014 Umeng. All rights reserved. -// - -#import - -@interface UMSocialTumblrHandler : NSObject - -+(void)openTumblr; -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/libSocialTumblr.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/libSocialTumblr.a deleted file mode 100644 index 91cbe47..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Tumblr/libSocialTumblr.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Fabric b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Fabric deleted file mode 100755 index 7ef9378..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Fabric and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/FABAttributes.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/FABAttributes.h deleted file mode 100644 index 7200ea4..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/FABAttributes.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// FABAttributes.h -// Fabric -// -// Created by Priyanka Joshi on 3/3/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#pragma once - -#define FAB_UNAVAILABLE(x) __attribute__((unavailable(x))) - -#if __has_feature(nullability) -#define FAB_NONNULL __nonnull -#define FAB_NULLABLE __nullable -#define FAB_START_NONNULL _Pragma("clang assume_nonnull begin") -#define FAB_END_NONNULL _Pragma("clang assume_nonnull end") -#else -#define FAB_NONNULL -#define FAB_NULLABLE -#define FAB_START_NONNULL -#define FAB_END_NONNULL -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/Fabric.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/Fabric.h deleted file mode 100644 index 7b1b31a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Headers/Fabric.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// Fabric.h -// -// Copyright (c) 2014 Twitter. All rights reserved. -// - -#import -#import "FABAttributes.h" - -FAB_START_NONNULL - -/** - * Fabric Base. Coordinates configuration and starts all provided kits. - */ -@interface Fabric : NSObject - -/** - * Initialize Fabric and all provided kits. Call this method within your App Delegate's - * `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. - * - * For example, in Objective-C: - * - * `[Fabric with:@[TwitterKit, CrashlyticsKit, MoPubKit]];` - * - * Swift: - * - * `Fabric.with([Twitter(), Crashlytics(), MoPub()])` - * - * Only the first call to this method is honored. Subsequent calls are no-ops. - * - * @param kits An array of kit instances. Kits may provide a macro such as CrashlyticsKit which can be passed in as array elements in objective-c. - * - * @return Returns the shared Fabric instance. In most cases this can be ignored. - */ -+ (instancetype)with:(NSArray *)kits; - -/** - * Returns the Fabric singleton object. - */ -+ (instancetype)sharedSDK; - -/** - * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. - */ -@property (nonatomic, assign) BOOL debug; - -/** - * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. - */ -- (id)init FAB_UNAVAILABLE("Use +sharedSDK to retrieve the shared Fabric instance."); - -/** - * Returns Fabrics's instance of the specified kit. - * - * @param klass The class of the kit. - * - * @return The kit instance of class klass which was provided to with: or nil. - */ -- (id FAB_NULLABLE)kitForClass:(Class)klass; - -/** - * Returns a dictionary containing the kit configuration info for the provided kit. - * The configuration information is parsed from the application's Info.plist. This - * method is primarily intended to be used by kits to retrieve their configuration. - * - * @param kitInstance An instance of the kit whose configuration should be returned. - * - * @return A dictionary containing kit specific configuration information or nil if none exists. - */ -- (NSDictionary * FAB_NULLABLE)configurationDictionaryForKit:(id)kitInstance; - -@end - -FAB_END_NONNULL - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Info.plist deleted file mode 100644 index bf020d8..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Info.plist +++ /dev/null @@ -1,55 +0,0 @@ - - - - - BuildMachineOSBuild - 13F34 - CFBundleDevelopmentRegion - en - CFBundleExecutable - Fabric - CFBundleIdentifier - io.fabric.sdk.ios - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Fabric - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.2.8 - CFBundleSignature - ???? - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 20 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12B411 - DTPlatformName - iphoneos - DTPlatformVersion - 8.1 - DTSDKBuild - 12B411 - DTSDKName - iphoneos8.1 - DTXcode - 0611 - DTXcodeBuild - 6A2008a - MinimumOSVersion - 5.0 - NSHumanReadableCopyright - Copyright © 2015 Twitter. All rights reserved. - UIDeviceFamily - - 1 - 2 - - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Modules/module.modulemap deleted file mode 100644 index 2a31223..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Fabric { - umbrella header "Fabric.h" - - export * - module * { export * } -} \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/run b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/run deleted file mode 100755 index b3ca4de..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/Fabric.framework/run and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAPIErrorCode.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAPIErrorCode.h deleted file mode 100644 index d7b0439..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAPIErrorCode.h +++ /dev/null @@ -1,148 +0,0 @@ -// -// TWTRAPIErrorCode.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -/** - * The NSError domain of errors surfaced by the Twitter API. - */ -FOUNDATION_EXPORT NSString * const TWTRAPIErrorDomain; - -/** - * Error codes surfaced by the Twitter API. - * @see https://dev.twitter.com/docs/error-codes-responses - */ -typedef NS_ENUM(NSUInteger, TWTRAPIErrorCode) { - /** - * Your call could not be completed as dialed. - */ - TWTRAPIErrorCodeCouldNotAuthenticate = 32, - - /** - * Corresponds with an HTTP 404 - the specified resource was not found. - */ - TWTRAPIErrorCodePageNotExist = 34, - - /** - * Not authorized to use this endpoint. - */ - TWTRAPIErrorCodeNotAuthorizedForEndpoint = 37, - - /** - * Corresponds with an HTTP 403 — the access token being used belongs to a suspended user and they can't complete the action you're trying to take - */ - TWTRAPIErrorCodeAccountSuspended = 64, - - /** - * Corresponds to a HTTP request to a retired v1-era URL. - */ - TWTRAPIErrorCodeAPIVersionRetired = 68, - - /** - * The request limit for this resource has been reached for the current rate limit window. - */ - TWTRAPIErrorCodeRateLimitExceeded = 88, - - /** - * The access token used in the request is incorrect or has expired. Used in API v1.1. - */ - TWTRAPIErrorCodeInvalidOrExpiredToken = 89, - - /** - * Only SSL connections are allowed in the API, you should update your request to a secure connection. See [how to connect using SSL](https://dev.twitter.com/docs/security/using-ssl). - */ - TWTRAPIErrorCodeSSLInvalid = 92, - - /** - * Corresponds with an HTTP 503 - Twitter is temporarily over capacity. - */ - TWTRAPIErrorCodeOverCapacity = 130, - - /** - * Corresponds with an HTTP 500 - An unknown internal error occurred. - */ - TWTRAPIErrorCodeInternalError = 131, - - /** - * Corresponds with a HTTP 401 - it means that your oauth_timestamp is either ahead or behind our acceptable range. - */ - TWTRAPIErrorCodeCouldNotAuthenticateTimestampOutOfRange = 135, - - /** - * You have already favorited this status. - */ - TWTRAPIErrorCodeAlreadyFavorited = 139, - - /** - * Corresponds with HTTP 403 — returned when a user cannot follow another user due to some kind of limit. - */ - TWTRAPIErrorCodeCannotFollowOverLimit = 161, - - /** - * Corresponds with HTTP 403 — returned when a Tweet cannot be viewed by the authenticating user, usually due to the Tweet's author having protected their Tweets. - */ - TWTRAPIErrorCodeNotAuthorizedToSeeStatus = 179, - - /** - * Corresponds with HTTP 403 — returned when a Tweet cannot be posted due to the user having no allowance remaining to post. Despite the text in the error message indicating that this error is only returned when a daily limit is reached, this error will be returned whenever a posting limitation has been reached. Posting allowances have roaming windows of time of unspecified duration. - */ - TWTRAPIErrorCodeOverDailyStatusUpdateLimit = 185, - - /** - * The status text has been Tweeted already by the authenticated account. - */ - TWTRAPIErrorCodeStatusIsDuplicate = 187, - - /** - * Typically sent with 1.1 responses with HTTP code 400. The method requires authentication but it was not presented or was wholly invalid. - */ - TWTRAPIErrorCodeBadAuthenticationData = 215, - - /** - * We constantly monitor and adjust our filters to block spam and malicious activity on the Twitter platform. These systems are tuned in real-time. If you get this response our systems have flagged the Tweet or DM as possibly fitting this profile. If you feel that the Tweet or DM you attempted to create was flagged in error, please report the details around that to us by filing a ticket at https://support.twitter.com/forms/platform - */ - TWTRAPIErrorCodeRequestIsAutomated = 226, - - /** - * Returned as a challenge in xAuth when the user has login verification enabled on their account and needs to be directed to twitter.com to [generate a temporary password](https://twitter.com/settings/applications). - */ - TWTRAPIErrorCodeUserMustVerifyLogin = 231, - - /** - * "Bad guest token." The token has probably expired. Try calling `-[Twitter logInGuestWithCompletion:]` again later. - */ - TWTRAPIErrorCodeBadGuestToken = 239, - - /** - * Corresponds to a HTTP request to a retired URL. - */ - TWTRAPIErrorCodeEndpointRetired = 251, - - /** - * Corresponds with HTTP 403 — returned when the application is restricted from POST, PUT, or DELETE actions. See [How to appeal application suspension and other disciplinary actions](https://support.twitter.com/articles/72585). - */ - TWTRAPIErrorCodeApplicationCannotPerformWriteAction = 261, - - /** - * Corresponds with HTTP 403. The authenticated user account cannot mute itself. - */ - TWTRAPIErrorCodeCannotMuteSelf = 271, - - /** - * Corresponds with HTTP 403. The authenticated user account is not muting the account a call is attempting to unmute. - */ - TWTRAPIErrorCodeCannotMuteSpecifiedUser = 272, - - /** - * You have already retweeted this tweet. - */ - TWTRAPIErrorCodeAlreadyRetweeted = 327, - - /** - * Returned in API v1.1 when a request cannot be served due to the application's rate limit having been exhausted for the resource. See [Rate Limiting in API v1.1](https://dev.twitter.com/docs/rate-limiting/1.1). - */ - TWTRAPIErrorCodeTooManyRequests = 429 -}; \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthConfig.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthConfig.h deleted file mode 100644 index 3613a61..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthConfig.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// TWTRAuthConfig.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -/** - * Authentication configuration details. Encapsulates credentials required to authenticate a Twitter application. You can obtain your credentials at https://apps.twitter.com/. - */ -@interface TWTRAuthConfig : NSObject - -/** - * The consumer key of the Twitter application. - */ -@property (nonatomic, copy, readonly) NSString *consumerKey; -/** - * The consumer secret of the Twitter application. - */ -@property (nonatomic, copy, readonly) NSString *consumerSecret; - -/** - * Returns an `TWTRAuthConfig` object initialized by copying the values from the consumer key and consumer secret. - * - * @param consumerKey The consumer key. - * @param consumerSecret The consumer secret. - */ -- (instancetype)initWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; - -/** - * Unavailable. Use `initWithConsumerKey:consumerSecret:` instead. - */ -- (instancetype)init __attribute__((unavailable("Use -initWithConsumerKey:consumerSecret: instead."))); - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthSession.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthSession.h deleted file mode 100644 index 5fd522f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRAuthSession.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// TWTRAuthSession.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -/** - * Encapsulates the authorization details of an OAuth Session. - */ -@protocol TWTRAuthSession - -@property (nonatomic, readonly, copy) NSString *authToken; -@property (nonatomic, readonly, copy) NSString *authTokenSecret; -@property (nonatomic, readonly, copy) NSString *userID; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRConstants.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRConstants.h deleted file mode 100644 index 85cb9e0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRConstants.h +++ /dev/null @@ -1,99 +0,0 @@ -// -// TWTRConstants.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -#pragma mark - Error messages - -/** - * The NSError domain of errors surfaced by the Twitter SDK. - */ -FOUNDATION_EXPORT NSString * const TWTRErrorDomain; - -/** - * Error codes surfaced by the Twitter SDK. - */ -typedef NS_ENUM(NSInteger, TWTRErrorCode) { - /** - * Unknown error. - */ - TWTRErrorCodeUnknown = -1, - /** - * Authentication has not been set up yet. You must call -[Twitter logInWithCompletion:] or -[Twitter logInGuestWithCompletion:] - */ - TWTRErrorCodeNoAuthentication = 0, - /** - * Twitter has not been initialized yet. Call +[Fabric with:@[TwitterKit]] or -[Twitter startWithConsumerKey:consumerSecret:]. - */ - TWTRErrorCodeNotInitialized = 1, - /** - * User has declined to grant permission to information such as their email address. - */ - TWTRErrorCodeUserDeclinedPermission = 2, - /** - * User has granted permission to their email address but no address is associated with their account. - */ - TWTRErrorCodeUserHasNoEmailAddress = 3, - /** - * A resource has been requested by ID, but that ID was not found. - */ - TWTRErrorCodeInvalidResourceID = 4, - /** - * A request has been issued for an invalid URL. - */ - TWTRErrorCodeInvalidURL = 5, - /** - * Type mismatch in parsing JSON from the Twitter API. - */ - TWTRErrorCodeMismatchedJSONType = 6, - /** - * Fail to save to keychain. - */ - TWTRErrorCodeKeychainSerializationFailure = 7, - /** - * Fail to save to disk. - */ - TWTRErrorCodeDiskSerializationError = 8, - /** - * Error authenticating with the webview. - */ - TWTRErrorCodeWebViewError = 9, - /** - * A required parameter is missing. - */ - TWTRErrorCodeMissingParameter = 10, -}; - -/** - * The NSError domain of errors surfaced by the Twitter SDK during the login operation. - */ -FOUNDATION_EXPORT NSString * const TWTRLogInErrorDomain; - -/** - * Error codes surfaced by the Twitter SDK with the `TWTRLogInErrorDomain` error domain. - */ -typedef NS_ENUM(NSInteger, TWTRLogInErrorCode) { - /** - * Unknown error. - */ - TWTRLogInErrorCodeUnknown = -1, - /** - * User denied login. - */ - TWTRLogInErrorCodeDenied = 0, - /** - * User canceled login. - */ - TWTRLogInErrorCodeCanceled = 1, - /** - * No Twitter account found. - */ - TWTRLogInErrorCodeNoAccounts = 2, - /** - * Reverse auth with linked account failed. - */ - TWTRLogInErrorCodeReverseAuthFailed = 3 -}; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h deleted file mode 100644 index e4ae5dd..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRCoreOAuthSigning.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// TWTRCoreOAuthSigning.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -FOUNDATION_EXPORT NSString * const TWTROAuthEchoRequestURLStringKey; -FOUNDATION_EXPORT NSString * const TWTROAuthEchoAuthorizationHeaderKey; - -@protocol TWTRCoreOAuthSigning - -/** - * @name OAuth Echo - */ - -/** - * OAuth Echo is a means to securely delegate OAuth authorization to a third party while interacting with an API. - * For example, you may wish to verify a user's credentials from your app's server (the third party) rather than your app. - * This method provides you with the OAuth signature to add to the third party's request to `URLString`, as well as the formed - * URL with the query string to send that request to. - * This is equivalent to calling `-URLRequestWithMethod:URL:parameters:error:` and getting the URL and the `Authorization` HTTP header out of the request. - * - * @param method Request method, GET, POST, PUT, DELETE, etc. - * @param URLString The full URL of the Twitter endpoint you plan to send a request to. E.g. https://api.twitter.com/1.1/account/verify_credentials.json - * @param parameters Request parameters. - * @param error Error in the `TWTRErrorDomain` domain. The code will be `TWTRErrorCodeInvalidURL` if the `URLString`'s host is not api.twitter.com - * - * @return `nil` if there's an error or a missing required parameter, or a dictionary with the fully formed request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. - * - * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo - */ -- (NSDictionary *)OAuthEchoHeadersForRequestMethod:(NSString *)method URLString:(NSString *)URLString parameters:(NSDictionary *)parameters error:(NSError **)error __attribute__((nonnull(1, 2))); - -/** - * This method provides you with the OAuth signature, as well as the formed URL with the query string, to send a request to `verify_credentials`. - * - * @return A dictionary with the fully formed Request URL under `TWTROAuthEchoRequestURLStringKey` (`NSString`), and the `Authorization` header in `TWTROAuthEchoAuthorizationHeaderKey` (`NSString`), to be used to sign the request. - * - * @see More information about OAuth Echo: https://dev.twitter.com/oauth/echo - * @see More information about Verify Credentials: https://dev.twitter.com/rest/reference/get/account/verify_credentials - */ -- (NSDictionary *)OAuthEchoHeadersToVerifyCredentials; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRGuestSession.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRGuestSession.h deleted file mode 100644 index 3d42201..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TWTRGuestSession.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// TWTRGuestSession.h -// TwitterKit -// -// Created by Joey Carmello on 3/31/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -@class TWTRGuestSession; - -/** - * Completion block called when guest login succeeds or fails. - * - * @param guestSession A `TWTRGuestSession` containing the OAuth tokens or nil. - * @param error Error that will be non nil if the authentication request failed. - */ -typedef void (^TWTRGuestLogInCompletion)(TWTRGuestSession *guestSession, NSError *error); - -/** - * `TWTRGuestSession` represents a guest session authenticated with the Twitter API. See `TWTRSession` for user sessions. - */ -@interface TWTRGuestSession : NSObject - -/** - * The bearer access token for guest auth. - */ -@property (nonatomic, copy, readonly) NSString *accessToken; - -/** - * The guest access token. - */ -@property (nonatomic, copy, readonly) NSString *guestToken; - -/** - * Returns an `TWTRGuestSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. - * - * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter guest-only authentication. - */ -- (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; - -/** - * Unavailable. Use `-initWithSessionDictionary:` instead. - */ -- (instancetype)init __attribute__((unavailable("Use -initWithSessionDictionary: instead."))); - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TwitterCore.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TwitterCore.h deleted file mode 100644 index c2e76bf..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Headers/TwitterCore.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// TwitterCore.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#if __has_feature(modules) -@import CoreData; -@import Foundation; -@import UIKit; -#else -#import -#import -#import -#endif - -#import "TWTRAPIErrorCode.h" -#import "TWTRAuthConfig.h" -#import "TWTRAuthSession.h" -#import "TWTRConstants.h" -#import "TWTRCoreOAuthSigning.h" -#import "TWTRGuestSession.h" diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Info.plist deleted file mode 100644 index b374d4d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - BuildMachineOSBuild - 14D136 - CFBundleDevelopmentRegion - English - CFBundleGetInfoString - TwitterCore Framework - CFBundleIdentifier - com.twittercore.sdk.ios - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - TwitterCore - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.8.1 - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 1.8.1 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12F69 - DTPlatformName - iphoneos - DTPlatformVersion - 8.3 - DTSDKBuild - 12F69 - DTSDKName - iphoneos8.3 - DTXcode - 0632 - DTXcodeBuild - 6D2105 - MinimumOSVersion - 7.0 - NSHumanReadableCopyright - Copyright 2015 Twitter Inc. - UIDeviceFamily - - 1 - 2 - - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Modules/module.modulemap deleted file mode 100644 index 64a5d10..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/Modules/module.modulemap +++ /dev/null @@ -1,7 +0,0 @@ -framework module TwitterCore { - umbrella header "TwitterCore.h" - - export * - module * { export * } -} - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/TwitterCore b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/TwitterCore deleted file mode 100755 index 7913f1e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterCore.framework/TwitterCore and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRAPIClient.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRAPIClient.h deleted file mode 100644 index 5732bd6..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRAPIClient.h +++ /dev/null @@ -1,136 +0,0 @@ -// -// TWTRAPIClient.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import "TWTRDefines.h" - -NS_ASSUME_NONNULL_BEGIN - -FOUNDATION_EXPORT NSString * const TWTRTweetsNotLoadedKey; - -@class TWTRUser; -@class TWTRTweet; -@class TWTRAuthConfig; -@class TWTRGuestSession; -@protocol TWTRAuthSession; - -/** - * @name Completion Block Types - */ - -/** - * Completion block called when the load user request succeeds or fails. - * - * @param user The Twitter User. - * @param error Error that will be set if the API request failed. - */ -typedef void (^TWTRLoadUserCompletion)(TWTRUser * __twtr_nullable user, NSError * __twtr_nullable error); - -/** - * Completion block called when the load Tweet request succeeds or fails. - * - * @param tweet The Twitter Tweet. - * @param error Error that will be set if the API request failed. - */ -typedef void (^TWTRLoadTweetCompletion)(TWTRTweet * __twtr_nullable tweet, NSError * __twtr_nullable error); - -/** - * Completion block called when the load Tweets request succeeds or fails. - * - * @param tweets Tweets that were successfully retrieved. - * @param error Error that will be set if the API request failed. - */ -typedef void (^TWTRLoadTweetsCompletion)(NSArray * __twtr_nullable tweets, NSError * __twtr_nullable error); - -/** - * Completion block called when the network request succeeds or fails. - * - * @param response Metadata associated with the response to a URL load request. - * @param data Content data of the response. - * @param connectionError Error object describing the network error that occurred. - */ -typedef void (^TWTRNetworkCompletion)(NSURLResponse * __twtr_nullable response, NSData * __twtr_nullable data, NSError * __twtr_nullable connectionError); - -/** - * Completion block called when a JSON request to the Twitter API succeeds or fails. - * - * @param response Metadata associated with the response to a URL load request. - * @param responseObject Content data of the response. - * @param error Error object describing the network error that occurred. - */ -typedef void (^TWTRJSONRequestCompletion)(NSURLResponse * __twtr_nullable response, id __twtr_nullable responseObject, NSError * __twtr_nullable error); - -/** - * Client for consuming the Twitter REST API. Provides methods for common API requests, as well as the ability to create and send custom requests. - */ -@interface TWTRAPIClient : NSObject - -/** - * @name Initialization - */ - -- (instancetype)init __attribute__((unavailable(("Use one of the other `-init...` methods that allow you to provide signing parameters")))); - -/** - * This method is deprecated since TwitterKit v1.4.0. To get an API client, use the one provided by the `Twitter` class. - */ -- (instancetype)initWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret __attribute__((deprecated)); - -/** - * @name Making Requests - */ - -/** - * Returns a signed URL request. - * - * @param method Request method, GET, POST, PUT, DELETE, etc. - * @param URL Request URL. This is the full Twitter API URL. E.g. https://api.twitter.com/1.1/statuses/user_timeline.json - * @param parameters Request parameters. - * @param error Error that will be set if there was an error signing the request. - */ -- (NSURLRequest *)URLRequestWithMethod:(NSString *)method URL:(NSString *)URLString parameters:(NSDictionary *)parameters error:(NSError **)error; - -/** - * Sends a Twitter request. - * - * @param request The request that will be sent asynchronously. - * @param completion Completion block to be called on response. Called on main queue. - */ -- (void)sendTwitterRequest:(NSURLRequest *)request completion:(TWTRNetworkCompletion)completion; - -/** - * @name Common API Actions - */ - -/** - * Loads a Twitter User. - * - * @param userIDString The Twitter user ID of the desired user. - * @param completion Completion block to be called on response. Called on main queue. - */ -- (void)loadUserWithID:(NSString *)userIDString completion:(TWTRLoadUserCompletion)completion; - -/** - * Loads a single Tweet from the network or cache. - * - * @param tweetIDString The ID of the desired Tweet. - * @param completion Completion bock to be called on response. Called on main queue. - */ -- (void)loadTweetWithID:(NSString *)tweetIDString completion:(TWTRLoadTweetCompletion)completion; - -/** - * Loads a series of Tweets in a batch. The completion block will be passed an array of zero or more - * Tweets that loaded successfully. If some Tweets fail to load the array will contain less Tweets than - * number of requested IDs. If any Tweets fail to load, the IDs of the Tweets that did not load will - * be provided in the userInfo dictionary property of the error parameter under `TWTRTweetsNotLoadedKey`. - * - * @param tweetIDStrings An array of Tweet IDs. - * @param completion Completion block to be called on response. Called on main queue. - */ -- (void)loadTweetsWithIDs:(NSArray *)tweetIDStrings completion:(TWTRLoadTweetsCompletion)completion; - -@end - -NS_ASSUME_NONNULL_END \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h deleted file mode 100644 index 85f7b65..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRCollectionTimelineDataSource.h +++ /dev/null @@ -1,43 +0,0 @@ -// -// TWTRCollectionTimelineDataSource.h -// TwitterKit -// -// Created by Steven Hepting on 2/10/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRTimelineDataSource.h" - -@class TWTRAPIClient; - -@interface TWTRCollectionTimelineDataSource : NSObject - -/** - * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. - */ -@property (nonatomic, assign, readonly) NSInteger maxTweetsPerRequest; - -/** - * Convenience initializer. - * - * @param collectionID (required) The ID of this collection. For example, the ID of this collection: https://twitter.com/TwitterMusic/timelines/393773266801659904 is @"393773266801659904" - * - * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters is missing. - */ -- (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); - -/** - * Designated initializer setting all supported values for Collection Timeline Data Source. - * - * @param collectionID (required) The Collection ID value. e.g. @"393773266801659904" - * @param apiClient (required) The API client to use for all network requests. - * @param maxTweetsPerRequest (optional) Number of Tweets to request per batch. A value of 0 uses the server default. - * - * @return An instance of TWTRCollectionTimelineDataSource or nil if any of the required parameters are missing. - */ -- (instancetype)initWithCollectionID:(NSString *)collectionID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest __attribute__((nonnull)) NS_DESIGNATED_INITIALIZER; - -- (instancetype)init __unavailable; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRComposer.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRComposer.h deleted file mode 100644 index f80ff55..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRComposer.h +++ /dev/null @@ -1,86 +0,0 @@ -// -// TWTRComposer.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * Possible values for the result parameter of the completionHandler property. - */ -typedef NS_ENUM(NSInteger, TWTRComposerResult) { - /** - * The composer is dismissed without sending the Tweet (i.e. the user selects Cancel, or the account is unavailable). - */ - TWTRComposerResultCancelled, - - /** - * The composer is dismissed and the message is being sent in the background, after the user selects Done. - */ - TWTRComposerResultDone -}; - -/** - * Completion block called when the user finishes composing a Tweet. - */ -typedef void (^TWTRComposerCompletion)(TWTRComposerResult result); - -/** - * The TWTRComposer class presents a view to the user to compose a Tweet. - */ -@interface TWTRComposer : NSObject - -/** - * Sets the initial text for the Tweet composition prior to showing it. - * - * @param text The text to tweet. - * - * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). - */ -- (BOOL)setText:(twtr_nullable NSString *)text; - -/** - * Sets an image attachment. - * - * @param image The image to attach. - * - * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). - */ -- (BOOL)setImage:(twtr_nullable UIImage *)image; - -/** - * Adds a URL to the contents of the Tweet message. - * - * @param url The URL. - * - * @return This will return NO if the receiver has already been presented (and therefore cannot be changed). - */ -- (BOOL)setURL:(twtr_nullable NSURL *)url; - -/** - * Presents the composer, with an optional completion handler from the specified view controller. - * @param fromController The controller in which to present the composer from. - * @param completion completion The completion handler, which has a single parameter indicating whether the user finished or cancelled the Tweet composition. - */ -- (void)showFromViewController:(UIViewController *)fromController completion:(TWTRComposerCompletion)completion; - -@end - -@interface TWTRComposer (TWTRDeprecated) - -/** - * Presents the composer, with an optional completion handler. - * - * @param completion The completion handler, which has a single parameter indicating whether the user finished or cancelled the Tweet composition. - * - * @warning This method is deprecated. Use `-showFromViewController:completion:` instead. - */ -- (void)showWithCompletion:(TWTRComposerCompletion)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRDefines.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRDefines.h deleted file mode 100644 index 1c7968c..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRDefines.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// TWTRDefines.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#pragma once - -#if __has_feature(nullability) - #define twtr_nullable nullable - #define twtr_nonnull nonnull - #define twtr_null_unspecified null_unspecified - #define twtr_null_resettable null_resettable - #define __twtr_nullable __nullable - #define __twtr_nonnull __nonnull - #define __twtr_null_unspecified __null_unspecified -#else - #define twtr_nullable - #define twtr_nonnull - #define twtr_null_unspecified - #define twtr_null_resettable - #define __twtr_nullable - #define __twtr_nonnull - #define __twtr_null_unspecified -#endif - -#ifndef NS_ASSUME_NONNULL_BEGIN - #define NS_ASSUME_NONNULL_BEGIN -#endif - -#ifndef NS_ASSUME_NONNULL_END - #define NS_ASSUME_NONNULL_END -#endif diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h deleted file mode 100644 index 7a8f0be..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRListTimelineDataSource.h +++ /dev/null @@ -1,90 +0,0 @@ -// -// TWTRListTimelineDataSource.h -// TwitterKit -// -// Created by Kang Chen on 6/18/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRDefines.h" -#import "TWTRTimelineDataSource.h" - -@class TWTRAPIClient; - -NS_ASSUME_NONNULL_BEGIN - -/** - * Data source representing a list of Tweets. These Tweets are ordered chronologically with the most recent first. - * - * @see https://dev.twitter.com/rest/reference/get/lists/statuses - */ -@interface TWTRListTimelineDataSource : NSObject - -/** - * The ID of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. - */ -@property (nonatomic, copy, readonly) NSString *listID; - -/** - * The slug of the list to show Tweets for. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. - */ -@property (nonatomic, copy, readonly) NSString *listSlug; - -/** - * Screen name of the owner of the list as specified by the `listSlug`. Either the `listID` or the `listSlug` and `listOwnerScreenName` are required. - */ -@property (nonatomic, copy, readonly) NSString *listOwnerScreenName; - -/** - * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. - */ -@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; - -/** - * Whether to request retweets in the set of Tweets from the server. - * - * Defaults to YES. - */ -@property (nonatomic, assign, readonly) BOOL includeRetweets; - -/** - * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. - * - * @param listID (required) The ID of the list. - * @param client (required) The API client to use for making network requests. - * - * @return A full initialized list timeline datasource. - */ -- (instancetype)initWithListID:(NSString *)listID APIClient:(TWTRAPIClient *)client; - -/** - * Convenience initializer. Uses default values for `maxTweetsPerRequest` and `includeRetweets`. - * - * @param listSlug (required) The slug of the list. - * @param listOwnerScreenName (required) The list owner's screen name. - * @param client (required) The API client to use for making network requests. - * - * @return A full initialized list timeline datasource. - */ -- (instancetype)initWithListSlug:(NSString *)listSlug listOwnerScreenName:(NSString *)listOwnerScreenName APIClient:(TWTRAPIClient *)client; - -/** - * Designated initializer for creating list timeline data sources taking all parameters. - * - * @param listID (optional) The ID of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. - * @param listSlug (optional) The slug of the list. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. - * @param listOwnerScreenName (optional) The list owner's screen name. Provide either the `listID` or `listSlug` and `listOwnerScreenName`. - * @param client (required) The API client to use for making networking requests - * @param maxTweetsPerRequest (optional) The number of Tweets per batch to request. A value of 0 will use the server default. - * @param includeRetweets (optional) Whether retweets should be requested. - * - * @return A fully initialized list timeline datasource. - */ -- (instancetype)initWithListID:(NSString * __twtr_nullable)listID listSlug:(NSString * __twtr_nullable)listSlug listOwnerScreenName:(NSString * __twtr_nullable)listOwnerScreenName APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeRetweets:(BOOL)includeRetweets NS_DESIGNATED_INITIALIZER; - -- (instancetype)init __unavailable; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRLogInButton.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRLogInButton.h deleted file mode 100644 index 8ade449..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRLogInButton.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// TWTRLogInButton.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRSession.h" - -/** - * A Button which launches the sign in to Twitter flow when tapped. - */ -@interface TWTRLogInButton : UIButton - -/** - * The completion block to be called with a `TWTRSession` if successful, - * and a `NSError` if logging in failed or was canceled. - */ -@property (nonatomic, copy) TWTRLogInCompletion logInCompletion; - -/** - * Returns a new log in button which launches Twitter log in when tapped and - * calls `completion` when logging in succeeds or fails. - * - * Internally, this button simply calls `-[Twitter logInWithCompletion:]`. - * - * @param completion The completion to be called with a `TWTRSession` if successful, - * and a `NSError` if logging in failed or was canceled. - * @return An initialized `TWTRLogInButton`. - */ -+ (instancetype)buttonWithLogInCompletion:(TWTRLogInCompletion)completion; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTROAuthSigning.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTROAuthSigning.h deleted file mode 100644 index 31454ef..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTROAuthSigning.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// TWTROAuthSigning.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -@class TWTRAuthConfig; -@class TWTRSession; - -/** - * This class provides tools to generate OAuth signatures. - */ -@interface TWTROAuthSigning : NSObject - -/** - * @name Initialization - */ - -/** - * Instantiate a `TWTROAuthSigning` object with the parameters it needs to generate the OAuth signatures. - * - * @param authConfig (required) Encapsulates credentials required to authenticate a Twitter application. - * @param authSession (required) Encapsulated credentials associated with a user session. - * - * @return An initialized `TWTROAuthSigning` object or nil if any of the parameters are missing. - * - * @note If you want to generate OAuth Echo headers to verify Digits' credentials, see `DGTOAuthSigning`. - * - * @see TWTRAuthConfig - * @see TWTRSession - */ -- (instancetype)initWithAuthConfig:(TWTRAuthConfig *)authConfig authSession:(TWTRSession *)authSession NS_DESIGNATED_INITIALIZER; - -/** - * Unavailable. Use `-initWithAuthConfig:authSession:` instead. - */ -- (instancetype)init __attribute__((unavailable("Use -initWithAuthConfig:authSession: instead."))); - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h deleted file mode 100644 index bb8d2a7..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSearchTimelineDataSource.h +++ /dev/null @@ -1,81 +0,0 @@ -// -// TWTRSearchTimelineDataSource.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRTimelineDataSource.h" - -@class TWTRAPIClient; - -/** -Data source representing a Search Timeline. Provides TWTRTweet objects to a TWTRTimelineViewController in pages determined by the TWTRTimelineCursor object passed in to the `loadNext:` and `loadPrevious:` methods. - -## Search Queries: - - * `watching now` containing both “watching” and “now”. Default. - * `“happy hour”` containing the exact phrase “happy hour”. - * `love OR hate` containing either “love” or “hate” (or both). - * `beer -root` containing “beer” but not “root”. - * `#haiku` containing the hashtag “haiku”. - * `from:alexiskold`sent from person “alexiskold”. - * `to:techcrunch` sent to person “techcrunch”. - * `@mashable` referencing person “mashable”. - * `flight :(` containing “flight” and with a negative attitude. - * `traffic ?` containing “traffic” and asking a question. - * `movie -scary :)`containing “movie”, but not “scary”, and with a positive attitude. - * `hilarious filter:links` containing “hilarious” and linking to URL. - * `news source:twitterfeed`containing “news” and entered via TwitterFeed - * `superhero since:2010-12-27` containing “superhero” and sent since date “2010-12-27” (year-month-day). - * `ftw until:2010-12-27` containing “ftw” and sent before the date “2010-12-27”. - - @see https://dev.twitter.com/rest/public/search - Not implemented: `geocode`, `result_type` - */ -@interface TWTRSearchTimelineDataSource : NSObject - -/** - * The search query. This matches what you would type into https://twitter.com/search - */ -@property (nonatomic, copy, readonly) NSString *searchQuery; - -/** - * Restricts tweets returned to a given language, specified by its ISO 639-1 code (for example: en, es). Language detection is best-effort. The server defaults to returning Tweets in all languages. - * - * @see http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes - */ -@property (nonatomic, copy, readonly) NSString *languageCode; - -/** - * The number of Tweets to request in each network request for more Tweets. By default requests 30 tweets. If set to `0` the parameter will not be set on the request and the Twitter API will use the default size for the endpoint. - */ -@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; - -/** - * Convenience initializer. Uses default values for `languageCode` and `maxTweetsPerRequest`. - * - * @param searchQuery (required) The query string that you would type into https://twitter.com/search - * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. - * - * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. - */ - -- (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); - -/** - * Designated initializer for creating search timeline data sources taking all parameters. - * - * @param searchQuery (required) The query string that you would type into https://twitter.com/search - * @param client (required) An instance of `TWTRAPIClient` with which API calls will be made. - * @param languageCode (optional) The ISO 639-1 language code to restrict Tweets to. A `nil` value will not add the parameter to the server request and so use the server default. - * @param maxTweetsPerRequest (optional) The number of tweets to request in each query to the Twitter API. A value of 0 will not add to the parameters and thus use the server default. - * - * @return A fully initialized search timeline datasource or `nil` if any of the required parameters are missing. - */ -- (instancetype)initWithSearchQuery:(NSString *)searchQuery APIClient:(TWTRAPIClient *)client languageCode:(NSString *)languageCode maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest __attribute__((nonnull(1,2))) NS_DESIGNATED_INITIALIZER; - -- (instancetype)init __unavailable; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSession.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSession.h deleted file mode 100644 index 0195691..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRSession.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// TWTRSession.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import -#import - -/** - * TWTRSession represents a user's session authenticated with the Twitter API. - */ -@interface TWTRSession : NSObject - -/** - * The authorization token. - */ -@property (nonatomic, copy, readonly) NSString *authToken; -/** - * The authorization token secret. - */ -@property (nonatomic, copy, readonly) NSString *authTokenSecret; -/** - * The username associated with the access token. - */ -@property (nonatomic, copy, readonly) NSString *userName; -/** - * The user ID associated with the access token. - */ -@property (nonatomic, copy, readonly) NSString *userID; - -/** - * Returns an `TWTRSession` object initialized by copying the values from the dictionary or nil if the dictionary is missing. - * - * @param sessionDictionary (required) The dictionary received after successfull authentication from Twitter OAuth. - */ -- (instancetype)initWithSessionDictionary:(NSDictionary *)sessionDictionary; - -/** - * Unavailable. Use -initWithSessionDictionary: instead. - */ -- (instancetype)init __attribute__((unavailable("Use -initWithSessionDictionary: instead."))); - -@end - -/** - * Completion block called when user login succeeds or fails. - * - * @param session Contains the OAuth tokens and minimal information associated with the logged in user or nil. - * @param error Error that will be non nil if the authentication request failed. - */ -typedef void (^TWTRLogInCompletion)(TWTRSession *session, NSError *error); diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRShareEmailViewController.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRShareEmailViewController.h deleted file mode 100644 index 0a83735..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRShareEmailViewController.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// TWTRShareEmailViewController.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -/** - * A completion block to be called when the user accepts or denies access to their email address. - * - * @param email The user's email address. This will be nil if the user does not grant access to their email address or your application is not allowed to request email addresses. - * @param error An error that details why a user's email address could not be provided. - */ -typedef void (^TWTRShareEmailCompletion)(NSString *email, NSError *error); - -/** - * The `TWTRShareEmailViewController` class presents a view to the user to request their email address. This is a subclass of `UINavigationController` and must be presented modally. - * - * @note Using `TWTRShareEmailViewController` requires your application to be whitelisted by Twitter. To request access, please visit https://support.twitter.com/forms/platform. - */ -@interface TWTRShareEmailViewController : UINavigationController - -/** - * Completion block called when the user accepts or denies access to their email address. - */ -@property (nonatomic, copy) TWTRShareEmailCompletion completion; - -/** - * Initializer for `TWTRShareEmailViewController`. - * - * @param completion The completion block called when the user either accepts or denies access to their email address. Called on the main thread. - */ -- (instancetype)initWithCompletion:(TWTRShareEmailCompletion)completion; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineDataSource.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineDataSource.h deleted file mode 100644 index 512492f..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineDataSource.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// TWTRTimelineDataSource.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import "TWTRDefines.h" -#import "TWTRTimelineType.h" -@class TWTRTimelineCursor; - -NS_ASSUME_NONNULL_BEGIN - -typedef void (^TWTRLoadTimelineCompletion)(NSArray * __twtr_nullable tweets, TWTRTimelineCursor * __twtr_nullable cursor, NSError *__twtr_nullable error); - -/** - * Responsible for building network parameters for requesting a timeline of Tweets. - * - * Implementations of this protocol don't need to be thread-safe. All the methods will be invoked on the main thread. - */ -@protocol TWTRTimelineDataSource - -/** - * Load Tweets before a given position. For time-based timelines this generally - * corresponds to Tweets older than a position. - * - * @param position (optional) The position or Tweet ID before the page - * of Tweets to be loaded. - * @param completion (required) Invoked with the Tweets and the cursor in case of success, or nil - * and an error in case of error. This must be called on the main thread. - */ -- (void)loadPreviousTweetsBeforePosition:(NSString * __twtr_nullable)position completion:(TWTRLoadTimelineCompletion)completion; - -/* - * The type of the timeline that this data source represents. - */ -@property (nonatomic, readonly) TWTRTimelineType timelineType; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineType.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineType.h deleted file mode 100644 index a1bafb1..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineType.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// TWTRTimelineType.h -// TwitterKit -// -// Created by Steven Hepting on 3/30/15. -// Copyright (c) 2015 Twitter. All rights reserved. -// - -/* - * Type of timelines that may be loaded and shown to the user. - */ -typedef NS_ENUM(NSUInteger, TWTRTimelineType) { - /* - * User Timeline - */ - TWTRTimelineTypeUser = 1, - /* - * Search Timeline - */ - TWTRTimelineTypeSearch, - /** - * Collection Timeline - */ - TWTRTimelineTypeCollection, - /** - * List Timeline - */ - TWTRTimelineTypeList, -}; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineViewController.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineViewController.h deleted file mode 100644 index ef2c182..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTimelineViewController.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// TWTRTimelineViewController.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRTimelineDataSource.h" - -/** - This class is a `UITableViewController` subclass that displays `TWTRTweetTableViewCell` cells. It handles cell-reuse, cell-configuration, and loading more tweets from the given timeline once the last cell is reached. - - ## Usage - - Initialize this class with any object that conforms to the `TWTRTimelineDataSource` protocol. We provide two such classes, `TWTRUserTimelineDataSource` and `TWTRSearchTimelineDataSource`. These provide `TWTRTweet` objects to this table view which then configures the instances of `TWTRTweetTableViewCell`. - - // Create the data source - TWTRAPIClient *client = [Twitter sharedInstance].APIClient; - TWTRUserTimelineDataSource *dataSource = [[TWTRUserTimelineDataSource alloc] initWithScreenName:@"jack" APIClient:client]; - - // Create the timeline view controller - TWTRTimelineViewController *timeline = [[TWTRTimelineViewController alloc] initWithDataSource:dataSource]; - - ## Loading More - - This class loads the first batch of `TWTRTweet` objects from the Twitter API when `viewWillAppear:` is received. It also handles loading more tweets automatically once the last cell has been shown. - - */ -@interface TWTRTimelineViewController : UITableViewController - -/** - Initializes a timeline view controller. Does not start loading tweets until - `viewWillAppear:` is called. - - This method must be used to initialize this class. The `init` method is unavailable. - - @param dataSource Required. A timeline data source object that conforms to the `TWTRTimelineDataSource` protocol. - - @return A fully initialized `TWTRTimelineViewController` or nil if the data source is missing. - */ -- (instancetype)initWithDataSource:(id)dataSource NS_DESIGNATED_INITIALIZER; - -/** - The source of `TWTRTweet` objects for this `TWTRTimelineViewController`. - - May be set to update the tweets being shown by this table view. Must be set on the main thread. - */ -@property (nonatomic, strong) id dataSource; - -- (instancetype)initWithStyle:(UITableViewStyle)style __attribute__((unavailable("Use -initWithDataSource: instead"))); - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweet.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweet.h deleted file mode 100644 index ece874a..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweet.h +++ /dev/null @@ -1,126 +0,0 @@ -// -// TWTRTweet.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -@class TWTRTweet; -@class TWTRUser; - -/** - * `TWTRTweet` is an immutable representation of a Tweet. - */ -@interface TWTRTweet : NSObject - -# pragma mark - Properties - -/** - * The ID of the Twitter Tweet. - * @warning This represents the id_str field, which could differ from the value of the id field. - */ -@property (nonatomic, copy, readonly) NSString *tweetID; - -/** - * The date when this Tweet was created. - */ -@property (nonatomic, copy, readonly) NSDate *createdAt; - -/** - * The text of the Tweet. - */ -@property (nonatomic, copy, readonly) NSString *text; - -/** - * The Author of the Tweet. - */ -@property (nonatomic, strong, readonly) TWTRUser *author; - -/** - * The number of times this Tweet was favorited. - */ -@property (nonatomic, assign, readonly) long long favoriteCount; - -/** - * The number of times this Tweet was retweeted. - */ -@property (nonatomic, assign, readonly) long long retweetCount; - -/** - * The Tweet this Tweet was a reply to. - */ -@property (nonatomic, copy, readonly) NSString *inReplyToTweetID; - -/** - * The User ID this Tweet was a reply to. - */ -@property (nonatomic, copy, readonly) NSString *inReplyToUserID; - -/** - * The screen name of the user this Tweet was a reply to. - * @note This doesn't contain the `@` sign before the screen name. - */ -@property (nonatomic, copy, readonly) NSString *inReplyToScreenName; - -/** - * The permalink URL for this Tweet. - * - * Suitable for loading in a `UIWebView`, `WKWebView` or passing to Safari: - * - * `[[UIApplication sharedApplication] openURL:tweet.permalink];` - */ -@property (nonatomic, copy, readonly) NSURL *permalink; - -/** - * Whether this Tweet was favorited by the authenticated user. - * - * @warning The value of this property depends on the authenticated user. - */ -@property (nonatomic, assign, readonly) BOOL isFavorited; - -/** - * Whether this Tweet was retweeted by the authenticated user. - * - * @warning The value of this property depends on the authenticated user. - */ -@property (nonatomic, assign, readonly) BOOL isRetweeted; - -/** - * The Tweet ID of the authenticated user's retweet of this Tweet. This will be `nil` if there is no - * authenticated user or the user has not retweeted this Tweet. - * - * @warning The value of this property depends on the authenticated user. - */ -@property (nonatomic, copy, readonly) NSString *retweetID; - -/** - * The original, fully-hydrated Tweet that was retweeted. This corresponds to the `retweeted_status` API field. - * This is `nil` unless `self.isRetweet == YES`. - */ -@property (nonatomic, strong, readonly) TWTRTweet *retweetedTweet; - -/** - * Indicates whether this Tweet is a retweet of another Tweet. - */ -@property (nonatomic, assign, readonly) BOOL isRetweet; - -# pragma mark - Init - -/** - * Creates a TWTRTweet instance from the dictionary of Twitter API JSON response. - * - * @param dictionary A parsed dictionary of a single Twitter Tweet API JSON response. - * @return TWTRTweet instance. - */ -- (instancetype)initWithJSONDictionary:(NSDictionary *)dictionary; - -/** - * Creates an array of TWTRTweet instances from the array of Twitter API JSON response. - * - * @param array A parsed array of Tweet API JSON responses. - * @return An array of TWTRTweet instances. - */ -+ (NSArray *)tweetsWithJSONArray:(NSArray *)array; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h deleted file mode 100644 index 61cc0d9..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetTableViewCell.h +++ /dev/null @@ -1,63 +0,0 @@ -// -// TWTRTweetTableViewCell.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -@class TWTRTweet; -@class TWTRTweetView; - -/** - * A table view cell subclass which displays a Tweet. - */ -@interface TWTRTweetTableViewCell : UITableViewCell - -/** - * The Tweet view inside this cell. Holds all relevant text and images. - */ -@property (nonatomic, strong, readonly) TWTRTweetView *tweetView; - -/** - * Configures the existing Tweet view with a Tweet. Updates labels, images, and thumbnails. - * - * @param tweet The `TWTRTweet` model object for the Tweet to display. - */ -- (void)configureWithTweet:(TWTRTweet *)tweet; - -/** - * Returns the height calculated using a given width. Usable from a background thread. This is the preferred approach to calculating height for tableview cells. - - - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - TWTRTweet *tweet = self.tweets[indexPath.row]; - - // Grab the height for this cell - CGFloat height = [TWTRTweetTableViewCell heightForTweet:tweet width:CGRectGetWidth(self.view.bounds)]; - return height; - } - - * @param width The table view cell width. - */ -+ (CGFloat)heightForTweet:(TWTRTweet *)tweet width:(CGFloat)width; - -/** - DEPRECATED - - Returns the height calculated using a given width. Generally just for use with prototype cells. - - - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - TWTRTweet *tweet = self.tweets[indexPath.row]; - - // Grab the height for this cell - CGFloat height = [TWTRTweetTableViewCell heightForTweet:tweet width:CGRectGetWidth(self.view.bounds)]; - return height; - } - - @deprecated Use +heightForTweet:width: instead. Deprecated in version 1.3.0 - - @param width The table view cell width. - */ -- (CGFloat)calculatedHeightForWidth:(CGFloat)width __attribute__((deprecated("Use +heightForTweet:width: instead."))); - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetView.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetView.h deleted file mode 100644 index 4ccf79d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetView.h +++ /dev/null @@ -1,172 +0,0 @@ -// -// TWTRTweetView.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRTweetViewDelegate.h" - -@class TWTRTweet; - -/** - * The style for Tweet views. - */ -typedef NS_ENUM(NSUInteger, TWTRTweetViewStyle) { - /** - * A full-size Tweet view. Displays images if present. - */ - TWTRTweetViewStyleRegular, - /** - * A small Tweet view, primarily designed to be used in table views. - */ - TWTRTweetViewStyleCompact -}; - -/** - * A default combination of colors for Tweet views. - */ -typedef NS_ENUM(NSUInteger, TWTRTweetViewTheme) { - /** - * Official light theme. - */ - TWTRTweetViewThemeLight, - /** - * Official dark theme. - */ - TWTRTweetViewThemeDark, -}; - -/** - `TWTRTweetView` displays a single Tweet to the user. It handles background taps and other actions displayed to the user. - - [[[Twitter sharedInstance] APIClient] loadTweetWithID:@"20" completion:^(TWTRTweet *tweet, NSError *error) { - if (tweet) { - TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; - [self.view addSubview:tweetView]; - } else { - NSLog(@"Error loading Tweet: %@", [error localizedDescription]); - } - }]; - - ## Interaction - - The `TWTRTweetViewDelegate` is notified: - - - When the background is tapped. - - When a link is selected. - - When the share button is tapped. - - When the share action completes. - - ## Usage in UITableView - - To allow for usage in a `UITableView`, the `configureWithTweet:` method allows configuration of an existing `TWTRTweetView` without having to create a new instance. - - ## Sizing - - When using Auto Layout, feel free to set a width or margin on the Tweet view. The height will be calculated automatically. For old-fashioned frame based layout you may use the standard `sizeThatFits:` method to calculate the appropriate height for a given width: - - // Find the height for a given width (20pts on either side) - CGFloat desiredHeight = [tweetView sizeThatFits:CGSizeMake(self.view.frame.size.width - 40, CGFLOAT_MAX)].height; - - ## UIAppearance - - You may use UIAppearance proxy objects to style certain aspects of Tweet views before those views are added to the view hierarchy. - - // Using UIAppearance Proxy - [TWTRTweetView appearance].theme = TWTRTweetViewThemeDark; - - // Setting colors directly - [TWTRTweetView appearance].primaryTextColor = [UIColor yellowColor]; - [TWTRTweetView appearance].backgroundColor = [UIColor blueColor]; - - _Note:_ You can't change the theme through an appearance proxy after the view has already been added to the view hierarchy. Direct `theme` property access will work though. - */ -@interface TWTRTweetView : UIView - -/** - * Background color of the Tweet view and all text labels (fullname, username, Tweet text, timestamp). - */ -@property (nonatomic, strong) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; - -/** - * Color of Tweet text and full name. - */ -@property (nonatomic, strong) UIColor *primaryTextColor UI_APPEARANCE_SELECTOR; - -/** - * Color of links in Tweet text. - */ -@property (nonatomic, strong) UIColor *linkTextColor UI_APPEARANCE_SELECTOR; - -/** - * Set whether the border should be shown. - */ -@property (nonatomic, assign) BOOL showBorder UI_APPEARANCE_SELECTOR; - -/** - * Setting the theme of the Tweet view will change the color properties accordingly. - * - * Set to `TWTRTweetViewThemeLight` by default. - */ -@property (nonatomic, assign) TWTRTweetViewTheme theme UI_APPEARANCE_SELECTOR; - -/** - * The style of the Tweet. i.e. `TWTRTweetViewStyleRegular` or `TWTRTweetViewStyleCompact`. - */ -@property (nonatomic, assign, readonly) TWTRTweetViewStyle style; - -/** - * The optional delegate to allow presenting a webview with Tweet details. - */ -@property (nonatomic, weak) IBOutlet id delegate; - -/** - * Convenience initializer to configure a compact style Tweet view. - * - * @param tweet The Tweet to display. - * - * @return The fully-configured Tweet view. - */ -- (instancetype)initWithTweet:(TWTRTweet *)tweet; - -/** - * Designated initializer. Initializes view with both Tweet and style. - * - * @param tweet The Tweet to display. - * @param style The style of the Tweet view (regular or compact). - * - * @return The fully configured Tweet view. - */ -- (instancetype)initWithTweet:(TWTRTweet *)tweet style:(TWTRTweetViewStyle)style; - -/** - * Initialization with a frame parameter is not supported. - */ -- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("Use -initWithTweet: instead"))); - -/** - Find the size that fits into a desired space. This is a system method on UIView but implemented on `TWTRTweetView` - - TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; - - // Make it 280 points wide - CGSize desiredSize = [tweetView sizeThatFits:CGSizeMake(280, CGFLOAT_MAX)]; - tweetView.frame = CGRectMake(PADDING_X, PADDING_Y, 280, desiredSize.height); - - [self.view addSubview:tweetView]; - - @param size The space available. Should generally leave one orientation unconstrained, and the minimum width supported is 200pts. - - @return The size that will fit into the space available. - */ -- (CGSize)sizeThatFits:(CGSize)size; - -/** - * Update all images and label text to fully represent the given Tweet. - * - * @param tweet The Tweet to display. - */ -- (void)configureWithTweet:(TWTRTweet *)tweet; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h deleted file mode 100644 index 6714837..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRTweetViewDelegate.h +++ /dev/null @@ -1,65 +0,0 @@ -// -// TWTRTweetViewDelegate.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -@class TWTRTweetView; -@class TWTRTweet; - -/** - Delegate for `TWTRTweetView` to receive updates on the user interacting with this particular Tweet view. - - // Create the tweet view - TWTRTweetView *tweetView = [[TWTRTweetView alloc] initWithTweet:tweet]; - // Set the delegate - tweetView.delegate = self; - */ -@protocol TWTRTweetViewDelegate - -@optional - -/** - * The tweet view was tapped. Implement to show your own webview if desired using the `permalinkURL` property on the `TWTRTweet` object passed in. - * - * @param tweetView The Tweet view that was tapped. - * @param tweet The Tweet model object being shown. - */ -- (void)tweetView:(TWTRTweetView *)tweetView didSelectTweet:(TWTRTweet *)tweet; - -/** - * A URL in the text of a tweet was tapped. Implement to show your own webview rather than opening Safari. - * - * @param tweetView The Tweet view that was tapped. - * @param url The URL that was tapped. - */ -- (void)tweetView:(TWTRTweetView *)tweetView didTapURL:(NSURL *)url; - -/** - * The Tweet view "Share" button was tapped and the `UIActivityViewController` was shown. - * - * @param tweetView The Tweet view that was tapped. - * @param tweet The Tweet model object being shown. - */ -- (void)tweetView:(TWTRTweetView *)tweetView willShareTweet:(TWTRTweet *)tweet; - -/** - * The share action for a Tweet was completed. - * - * @param tweetView The Tweet view that was tapped. - * @param tweet The Tweet model object being shown. - * @param shareType The share action that was completed. (e.g. `UIActivityTypePostToFacebook`, `UIActivityTypePostToTwitter`, or `UIActivityTypeMail`) - */ -- (void)tweetView:(TWTRTweetView *)tweetView didShareTweet:(TWTRTweet *)tweet withType:(NSString *)shareType; - -/** - * The share action for a Tweet was cancelled. - * - * @param tweetView The tweet view handling the share action. - * @param tweet The tweet model object represented. - */ -- (void)tweetView:(TWTRTweetView *)tweetView cancelledShareTweet:(TWTRTweet *)tweet; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUser.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUser.h deleted file mode 100644 index 87d00b0..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUser.h +++ /dev/null @@ -1,85 +0,0 @@ -// -// TWTRUser.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import - -/** - * Represents a user on Twitter. - */ -@interface TWTRUser : NSObject - -# pragma mark - Properties - -/** - * The ID of the Twitter User. - */ -@property (nonatomic, copy, readonly) NSString *userID; - -/** - * The user's name as it appears on their profile. - * - * @warning This can be modified by the user at any time. - */ -@property (nonatomic, copy, readonly) NSString *name; - -/** - * The user's username on Twitter. - * - * @warning This can be modified by the user at any time. - */ -@property (nonatomic, copy, readonly) NSString *screenName; - -/** - * Whether the user has been verified by Twitter. - */ -@property (nonatomic, assign, readonly) BOOL isVerified; - -/** - * Whether the user is protected. - */ -@property (nonatomic, assign, readonly) BOOL isProtected; - -/** - * The HTTPS URL of the user's profile image. - */ -@property (nonatomic, copy, readonly) NSString *profileImageURL; - -/** - * The URL of a smaller version of the user's profile image. - */ -@property (nonatomic, copy, readonly) NSString *profileImageMiniURL; - -/** - * The URL of a larger version of the user's profile image. - */ -@property (nonatomic, copy, readonly) NSString *profileImageLargeURL; - -/** - * The formatted version of the user's `screenName` with the `@` sign for display purposes. - */ -@property (nonatomic, copy, readonly) NSString *formattedScreenName; - -# pragma mark - Init - -/** - * Creates a Twitter user object from the dictionary of Twitter API JSON response. - * - * @param dictionary A parsed dictionary of a single Twitter Tweet API JSON response. - * - * @return An initialized TWTRUser instance. - */ -- (instancetype)initWithJSONDictionary:(NSDictionary *)dictionary; - -/** - * Creates an array of Twitter User instances from the array of Twitter API JSON response. - * - * @param array A parsed array of Twitter User API JSON responses. - * - * @return An array of initialized TWTRTweet instances. - */ -+ (NSArray *)usersWithJSONArray:(NSArray *)array; - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h deleted file mode 100644 index 21b865d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TWTRUserTimelineDataSource.h +++ /dev/null @@ -1,75 +0,0 @@ -// -// TWTRUserTimelineDataSource.h -// TwitterKit -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRTimelineDataSource.h" - -@class TWTRAPIClient; - -/** - * This Timeline Data Source provides a list of Tweets roughly consistent with the list on a Users profile page. The difference is that this data source will filter out Tweets that are direct replies to other users by default. - * - * These Tweets are ordered chronologically with the most recent first. - */ -@interface TWTRUserTimelineDataSource : NSObject - -/** - * The screen name of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. - */ -@property (nonatomic, copy, readonly) NSString *screenName; - -/** - * The userID of the User whose Tweets are being shown. Either the `screenName` or the `userID` are required. - */ -@property (nonatomic, copy, readonly) NSString *userID; - -/** - * The number of Tweets to request in each query to the Twitter Timeline API when fetching the next batch of Tweets. Will request 30 Tweets by default. Setting this value to 0 will use the server default. - */ -@property (nonatomic, assign, readonly) NSUInteger maxTweetsPerRequest; - -/** - * Whether to request replies in the set of Tweets from the server. - * - * Defaults to NO. - */ -@property (nonatomic, assign, readonly) BOOL includeReplies; - -/** - * Whether to request retweets in the set of Tweets from the server. - * - * Defaults to YES. - */ -@property (nonatomic, assign, readonly) BOOL includeRetweets; - -/** - * Convenience initializer. Uses default values for `maxTweetsPerRequest`, `includeReplies` and `includeRetweets`. - * - * @param screenName (required) The screen name of a Twitter User - * @param client (required) The API client to use for making network requests. - * - * @return A fully initialized user timeline datasource or nil. - */ -- (instancetype)initWithScreenName:(NSString *)screenName APIClient:(TWTRAPIClient *)client __attribute__((nonnull)); - -/** - * The designated initialzer accepted values for properties. - * - * @param userID (optional) The user ID of the Twitter User - * @param screenName (optional) The screen name of the Twitter User - * @param APIClient (required) The API client to use for making network requests. - * @param maxTweetsPerRequest (optional) The number of Tweets per batch to request. A value of 0 will use the server default. - * @param includeReplies (optional) Whether replies should be requested - * @param includeRetweets (optional) Whether retweets should be requested - * - * @return A fully initialized user timeline datasource or nil. - */ -- (instancetype)initWithScreenName:(NSString *)screenName userID:(NSString *)userID APIClient:(TWTRAPIClient *)client maxTweetsPerRequest:(NSUInteger)maxTweetsPerRequest includeReplies:(BOOL)includeReplies includeRetweets:(BOOL)includeRetweets __attribute__((nonnull(3))) NS_DESIGNATED_INITIALIZER; - -- (instancetype)init __unavailable; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/Twitter.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/Twitter.h deleted file mode 100644 index 575acaa..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/Twitter.h +++ /dev/null @@ -1,141 +0,0 @@ -// -// Twitter.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#import -#import "TWTRAPIClient.h" -#import "TWTRSession.h" - -/** - * The central class of the Twitter Kit. - * @note This class can only be used from the main thread. - */ -@interface Twitter : NSObject - -/** - * Returns the Twitter singleton. - * - * @return The Twitter singleton. - */ -+ (Twitter *)sharedInstance; - -/** - * Start Twitter with your consumer key and secret. These will override any credentials - * present in your applications Info.plist. - * - * You do not need to call this method unless you wish to provide credentials other than those - * in your Info.plist. - * - * @param consumerKey Your Twitter application's consumer key. - * @param consumerSecret Your Twitter application's consumer secret. - */ -- (void)startWithConsumerKey:(NSString *)consumerKey consumerSecret:(NSString *)consumerSecret; - -/** - * Client for consuming the Twitter REST API. - * - * This API client is configured with your consumer key and secret if they are available to the Twitter - * object (either via initialization of the Twitter instance or your application's Info.plist). - * - * @warning To make authenticated requests, you need to call `loginWithCompletion:` or `loginGuestWithCompletion:`. - */ -@property (nonatomic, strong, readonly) TWTRAPIClient *APIClient; - -/** - * The current version of this kit. - */ -@property (nonatomic, copy, readonly) NSString *version; - -/** - * The Twitter application consumer key. - * @deprecated This property is deprecated and will be removed in a later release. Please use `authConfig`. - */ -@property (nonatomic, copy, readonly) NSString *consumerKey __attribute__((deprecated("Use `authConfig`. This property will be removed in a later release."))); - -/** - * The Twitter application consumer secret. - * @deprecated This property is deprecated and will be removed in a later release. Please use `authConfig`. - */ -@property (nonatomic, copy, readonly) NSString *consumerSecret __attribute__((deprecated("Use `authConfig`. This property will be removed in a later release."))); - -/** - * Authentication configuration details. Encapsulates the `consumerKey` and `consumerSecret` credentials required to authenticate a Twitter application. - */ -@property (nonatomic, strong, readonly) TWTRAuthConfig *authConfig; - -/** - * @name Authentication - */ - -/** - * Triggers user authentication with Twitter. - * - * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. - * - * @param completion The completion block will be called after authentication is successful or if there is an error. - * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. - */ -- (void)logInWithCompletion:(TWTRLogInCompletion)completion; - -/** - * Triggers user authentication with Twitter. Allows the developer to specify the presenting view controller. - * - * This method will present UI to allow the user to log in if there are no saved Twitter login credentials. - * - * @param viewController The view controller that will be used to present the authentication view. - * @param completion The completion block will be called after authentication is successful or if there is an error. - * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. - */ -- (void)logInWithViewController:(UIViewController *)viewController completion:(TWTRLogInCompletion)completion; - -/** - * Log in a guest user. This can be used when the user is not a Twitter user. - * - * This method will not present any UI to the user. - * - * @param completion The completion block will be called after authentication is successful or if there is an error. - * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. - */ -- (void)logInGuestWithCompletion:(TWTRGuestLogInCompletion)completion; - -/** - * Triggers user authentication with Twitter given an existing session. - * - * Use this method if you have already authenticated with Twitter and are migrating to TwitterKit. This - * method will verify that the `authToken` and `authTokenSecret` are still valid and log the user in with - * the existing credentials. - * - * @param authToken The existing authToken to use for authentication. - * @param authTokenSecret The existing authTokenSecret to use for authentication. - * @param completion The completion block will be called after authentication is successful or if there is an error. - * @warning This method requires that you have set up your `consumerKey` and `consumerSecret`. - */ -- (void)logInWithExistingAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret completion:(TWTRLogInCompletion)completion; - -/** - * Returns the current user session or nil if there is no logged in user. - * - * @return Returns the current user session or nil if there is no logged in user. - */ -- (TWTRSession *)session; - -/** - * Returns the current guest session or nil if there is no logged in guest. - * - * @return Returns the current guest session or nil if there is no logged in guest. - */ -- (TWTRGuestSession *)guestSession; - -/** - * Deletes the local Twitter user session from this app. This will not remove the system Twitter account nor make a network request to invalidate the session. - */ -- (void)logOut; - -/** - * Deletes the local guest session. Does not make a network request to invalidate the session. - */ -- (void)logOutGuest; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TwitterKit.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TwitterKit.h deleted file mode 100644 index 8f228ba..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Headers/TwitterKit.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// TwitterKit.h -// -// Copyright (c) 2015 Twitter. All rights reserved. -// - -#if __has_feature(modules) -@import Accounts; -@import Foundation; -@import Social; -@import UIKit; -#else -#import -#import -#import -#import -#endif - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 70000 -//#error "TwitterKit doesn't support iOS 6.x and lower. Please, change your minimum deployment target to iOS 7.0" -#endif - -#import - -#import "Twitter.h" -#import "TWTRAPIClient.h" -#import "TWTRCollectionTimelineDataSource.h" -#import "TWTRComposer.h" -#import "TWTRDefines.h" -#import "TWTRListTimelineDataSource.h" -#import "TWTRLogInButton.h" -#import "TWTROAuthSigning.h" -#import "TWTRSearchTimelineDataSource.h" -#import "TWTRSession.h" -#import "TWTRShareEmailViewController.h" -#import "TWTRTimelineDataSource.h" -#import "TWTRTimelineType.h" -#import "TWTRTimelineViewController.h" -#import "TWTRTweet.h" -#import "TWTRTweetTableViewCell.h" -#import "TWTRTweetView.h" -#import "TWTRTweetViewDelegate.h" -#import "TWTRUser.h" -#import "TWTRUserTimelineDataSource.h" - -#if __has_include() -#import -#endif - -/** - * `TwitterKit` can be used as an element in the array passed to the `+[Fabric with:]`. - */ -#define TwitterKit [Twitter sharedInstance] diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Info.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Info.plist deleted file mode 100644 index 861f163..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Info.plist +++ /dev/null @@ -1,53 +0,0 @@ - - - - - BuildMachineOSBuild - 14D136 - CFBundleDevelopmentRegion - English - CFBundleGetInfoString - Twitter Kit Framework - CFBundleIdentifier - com.twitter.sdk.ios - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - TwitterKit - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.8.1 - CFBundleSupportedPlatforms - - iPhoneOS - - CFBundleVersion - 1.8.1 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 12F69 - DTPlatformName - iphoneos - DTPlatformVersion - 8.3 - DTSDKBuild - 12F69 - DTSDKName - iphoneos8.3 - DTXcode - 0632 - DTXcodeBuild - 6D2105 - MinimumOSVersion - 7.0 - NSHumanReadableCopyright - Copyright 2014 Twitter Inc. - UIDeviceFamily - - 1 - 2 - - - diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Modules/module.modulemap b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Modules/module.modulemap deleted file mode 100644 index 7eb9c17..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Modules/module.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module TwitterKit { - umbrella header "TwitterKit.h" - - export * - module * { export * } -} diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom deleted file mode 100644 index a9a786b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist deleted file mode 100644 index 45677dc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings deleted file mode 100644 index 6e2f181..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings deleted file mode 100644 index dc0aa93..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings deleted file mode 100644 index 2ff222f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings deleted file mode 100644 index 00b8488..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings deleted file mode 100644 index e0074d0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare.png deleted file mode 100644 index ebaa1eb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@2x.png deleted file mode 100644 index 2546629..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@3x.png deleted file mode 100644 index 18defd7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/emailshare@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings deleted file mode 100644 index 7fcb20a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings deleted file mode 100644 index 8e51c5d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings +++ /dev/null @@ -1,53 +0,0 @@ -/* Label for button to bring up share dialog to share this Tweet in a single Tweet view */ -"tw__share_tweet" = "Share Tweet"; -/* Subject format used to prefill certain sharing options such as Email includes full name (%1$@) and screenname (%2$@) */ -"tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; -/* Generic share text format used in all sharing options includes screenname (%1$@) and URL to the Tweet (%2$@) */ -"tw__share_tweet_generic_template_format" = "Check out @%1$@\'s Tweet: %2$@"; -/* Label for Sign in with Twitter button */ -"tw__sign_in_with_twitter_button" = "Log in with Twitter"; -/* Label Email Share Screen negative button */ -"tw__email_share_negative_button" = "Not now"; -/* Label Email Share Screen affirmative button */ -"tw__email_share_affirmative_button" = "Allow"; -/* Heading that appears above the detail message on the share your email screen */ -"tw__email_share_heading" = "Share your email address"; -/* Detail message that includes the app name and username on the share your email screen */ -"tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; -/* Fallback string for detail message in case the app name is not available */ -"tw__email_share_detail_message_this_app" = "this app"; -/* Fallback string for detail message in case the user is not signed in */ -"tw__email_share_detail_message_not_signed_in" = "(not signed in)"; -/* Label for attributing this Tweet was retweeted by the user %@ */ -"tw__tweet_retweeted_by_user" = "Retweeted by %@"; - -/* Timestamps */ - -/* Really short abbreviation for days (plural). 5 days would be '5d' */ -"TIME_SHORT_DAYS_FORMAT" = "%dd"; -/* Really short abbreviation for day (singular). 1 day would be '1d' */ -"TIME_SHORT_DAY_FORMAT" = "%dd"; -/* Really short abbreviation for hours (plural). 5 hours would be '5h' */ -"TIME_SHORT_HOURS_FORMAT" = "%dh"; -/* Really short abbreviation for hour (singular). 1 hour would be '1h' */ -"TIME_SHORT_HOUR_FORMAT" = "%dh"; -/* Really short abbreviation for minutes (plural). 5 minutes would be '5m' */ -"TIME_SHORT_MINUTES_FORMAT" = "%dm"; -/* Really short abbreviation for minute (singular). 1 minute would be '1m' */ -"TIME_SHORT_MINUTE_FORMAT" = "%dm"; -/* Really short abbreviation for seconds (plural). 5 seconds would be '5s' */ -"TIME_SHORT_SECONDS_FORMAT" = "%ds"; -/* Really short abbreviation for second (singular). '1s' */ -"TIME_SHORT_SECOND_FORMAT" = "%ds"; - -/* Accessibility Labels */ - -/* Text spoken out with VoiceOver when a tweet has an image showing */ -"tw__single_image" = "One image attached"; -/* Text spoken out with VoiceOver for selecting the profile image on a regular tweet view */ -"tw__tweet_profile_accessibility" = "Profile"; -/* Text spoken out with VoiceOver for selecting the attached image on a regular tweet view */ -"tw__tweet_image_accessibility" = "Attachment"; - -/* Test String (just for unit tests) */ -"tw__test_string" = "Test"; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings deleted file mode 100644 index e645165..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings deleted file mode 100644 index d85e9c2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings deleted file mode 100644 index fad15a3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings deleted file mode 100644 index 7ff8acd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings deleted file mode 100644 index 9b9680d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings deleted file mode 100644 index 6bd07c7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings deleted file mode 100644 index d3401d6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings deleted file mode 100644 index f2312a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings deleted file mode 100644 index 029a45d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings deleted file mode 100644 index 7f7f5a5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings deleted file mode 100644 index a3f237b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings deleted file mode 100644 index a0171a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings deleted file mode 100644 index 878848e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings deleted file mode 100644 index 0f2f331..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings deleted file mode 100644 index cf0dfcf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings deleted file mode 100644 index 74f567e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings deleted file mode 100644 index 9cbeefd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings deleted file mode 100644 index 6dd56c5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings deleted file mode 100644 index 42519ac..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings deleted file mode 100644 index 33781fe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings deleted file mode 100644 index 91b6041..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings deleted file mode 100644 index 730f875..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off.png deleted file mode 100644 index d00f348..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png deleted file mode 100644 index 106944f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png deleted file mode 100644 index 6e89caf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on.png deleted file mode 100644 index 07e4396..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png deleted file mode 100644 index 7ce8c73..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png deleted file mode 100644 index b97284b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png deleted file mode 100644 index 525a3b8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png deleted file mode 100644 index 66627a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png deleted file mode 100644 index 6c1093a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png deleted file mode 100644 index b7e4f7c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png deleted file mode 100644 index bbfbee7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png deleted file mode 100644 index 3074978..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo.png deleted file mode 100644 index ea6f7cd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png deleted file mode 100644 index 2c17c4d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png deleted file mode 100644 index b969d88..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png deleted file mode 100644 index 2f2d32e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png deleted file mode 100644 index 61692b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png deleted file mode 100644 index 4dda258..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png deleted file mode 100644 index 745d9b6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png deleted file mode 100644 index 6033368..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png deleted file mode 100644 index 0707a13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png deleted file mode 100644 index 74d94a2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png deleted file mode 100644 index f783dbe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png deleted file mode 100644 index 31a34ee..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png deleted file mode 100644 index 40d6a35..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png deleted file mode 100644 index 0bfc026..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png deleted file mode 100644 index 8dc8747..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png deleted file mode 100644 index ad4c4b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png deleted file mode 100644 index 47ea38b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png deleted file mode 100644 index db471c6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings deleted file mode 100644 index feba7b0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings deleted file mode 100644 index 74eb578..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings deleted file mode 100644 index 3eb0a19..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings deleted file mode 100644 index 15b99c9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings deleted file mode 100644 index e01bc78..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/TwitterKit b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/TwitterKit deleted file mode 100755 index 8fb7e56..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/TwitterKit and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom deleted file mode 100644 index a9a786b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist deleted file mode 100644 index 45677dc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings deleted file mode 100644 index 6e2f181..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings deleted file mode 100644 index dc0aa93..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings deleted file mode 100644 index 2ff222f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings deleted file mode 100644 index 00b8488..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings deleted file mode 100644 index e0074d0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png deleted file mode 100644 index ebaa1eb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png deleted file mode 100644 index 2546629..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png deleted file mode 100644 index 18defd7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/emailshare@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings deleted file mode 100644 index 7fcb20a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings deleted file mode 100644 index 8e51c5d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings +++ /dev/null @@ -1,53 +0,0 @@ -/* Label for button to bring up share dialog to share this Tweet in a single Tweet view */ -"tw__share_tweet" = "Share Tweet"; -/* Subject format used to prefill certain sharing options such as Email includes full name (%1$@) and screenname (%2$@) */ -"tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; -/* Generic share text format used in all sharing options includes screenname (%1$@) and URL to the Tweet (%2$@) */ -"tw__share_tweet_generic_template_format" = "Check out @%1$@\'s Tweet: %2$@"; -/* Label for Sign in with Twitter button */ -"tw__sign_in_with_twitter_button" = "Log in with Twitter"; -/* Label Email Share Screen negative button */ -"tw__email_share_negative_button" = "Not now"; -/* Label Email Share Screen affirmative button */ -"tw__email_share_affirmative_button" = "Allow"; -/* Heading that appears above the detail message on the share your email screen */ -"tw__email_share_heading" = "Share your email address"; -/* Detail message that includes the app name and username on the share your email screen */ -"tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; -/* Fallback string for detail message in case the app name is not available */ -"tw__email_share_detail_message_this_app" = "this app"; -/* Fallback string for detail message in case the user is not signed in */ -"tw__email_share_detail_message_not_signed_in" = "(not signed in)"; -/* Label for attributing this Tweet was retweeted by the user %@ */ -"tw__tweet_retweeted_by_user" = "Retweeted by %@"; - -/* Timestamps */ - -/* Really short abbreviation for days (plural). 5 days would be '5d' */ -"TIME_SHORT_DAYS_FORMAT" = "%dd"; -/* Really short abbreviation for day (singular). 1 day would be '1d' */ -"TIME_SHORT_DAY_FORMAT" = "%dd"; -/* Really short abbreviation for hours (plural). 5 hours would be '5h' */ -"TIME_SHORT_HOURS_FORMAT" = "%dh"; -/* Really short abbreviation for hour (singular). 1 hour would be '1h' */ -"TIME_SHORT_HOUR_FORMAT" = "%dh"; -/* Really short abbreviation for minutes (plural). 5 minutes would be '5m' */ -"TIME_SHORT_MINUTES_FORMAT" = "%dm"; -/* Really short abbreviation for minute (singular). 1 minute would be '1m' */ -"TIME_SHORT_MINUTE_FORMAT" = "%dm"; -/* Really short abbreviation for seconds (plural). 5 seconds would be '5s' */ -"TIME_SHORT_SECONDS_FORMAT" = "%ds"; -/* Really short abbreviation for second (singular). '1s' */ -"TIME_SHORT_SECOND_FORMAT" = "%ds"; - -/* Accessibility Labels */ - -/* Text spoken out with VoiceOver when a tweet has an image showing */ -"tw__single_image" = "One image attached"; -/* Text spoken out with VoiceOver for selecting the profile image on a regular tweet view */ -"tw__tweet_profile_accessibility" = "Profile"; -/* Text spoken out with VoiceOver for selecting the attached image on a regular tweet view */ -"tw__tweet_image_accessibility" = "Attachment"; - -/* Test String (just for unit tests) */ -"tw__test_string" = "Test"; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings deleted file mode 100644 index e645165..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings deleted file mode 100644 index d85e9c2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings deleted file mode 100644 index fad15a3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings deleted file mode 100644 index 7ff8acd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings deleted file mode 100644 index 9b9680d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings deleted file mode 100644 index 6bd07c7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings deleted file mode 100644 index d3401d6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings deleted file mode 100644 index f2312a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings deleted file mode 100644 index 029a45d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings deleted file mode 100644 index 7f7f5a5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings deleted file mode 100644 index a3f237b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings deleted file mode 100644 index a0171a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings deleted file mode 100644 index 878848e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings deleted file mode 100644 index 0f2f331..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings deleted file mode 100644 index cf0dfcf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings deleted file mode 100644 index 74f567e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings deleted file mode 100644 index 9cbeefd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings deleted file mode 100644 index 6dd56c5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings deleted file mode 100644 index 42519ac..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings deleted file mode 100644 index 33781fe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings deleted file mode 100644 index 91b6041..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings deleted file mode 100644 index 730f875..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png deleted file mode 100644 index d00f348..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png deleted file mode 100644 index 106944f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png deleted file mode 100644 index 6e89caf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png deleted file mode 100644 index 07e4396..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png deleted file mode 100644 index 7ce8c73..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png deleted file mode 100644 index b97284b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png deleted file mode 100644 index 525a3b8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png deleted file mode 100644 index 66627a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png deleted file mode 100644 index 6c1093a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png deleted file mode 100644 index b7e4f7c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png deleted file mode 100644 index bbfbee7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png deleted file mode 100644 index 3074978..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png deleted file mode 100644 index ea6f7cd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png deleted file mode 100644 index 2c17c4d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png deleted file mode 100644 index b969d88..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png deleted file mode 100644 index 2f2d32e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png deleted file mode 100644 index 61692b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png deleted file mode 100644 index 4dda258..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png deleted file mode 100644 index 745d9b6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png deleted file mode 100644 index 6033368..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png deleted file mode 100644 index 0707a13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png deleted file mode 100644 index 74d94a2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png deleted file mode 100644 index f783dbe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png deleted file mode 100644 index 31a34ee..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png deleted file mode 100644 index 40d6a35..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png deleted file mode 100644 index 0bfc026..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png deleted file mode 100644 index 8dc8747..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png deleted file mode 100644 index ad4c4b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png deleted file mode 100644 index 47ea38b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png deleted file mode 100644 index db471c6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings deleted file mode 100644 index feba7b0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings deleted file mode 100644 index 74eb578..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings deleted file mode 100644 index 3eb0a19..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings deleted file mode 100644 index 15b99c9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings deleted file mode 100644 index e01bc78..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/A/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom deleted file mode 100644 index a9a786b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/TFSScribe.mom and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist deleted file mode 100644 index 45677dc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/TFSScribe.momd/VersionInfo.plist and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings deleted file mode 100644 index 6e2f181..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ar.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings deleted file mode 100644 index dc0aa93..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/bn.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings deleted file mode 100644 index 2ff222f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/cs.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings deleted file mode 100644 index 00b8488..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/da.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings deleted file mode 100644 index e0074d0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/de.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare.png deleted file mode 100644 index ebaa1eb..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@2x.png deleted file mode 100644 index 2546629..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@3x.png deleted file mode 100644 index 18defd7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/emailshare@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings deleted file mode 100644 index 7fcb20a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en-gb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings deleted file mode 100644 index 8e51c5d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/en.lproj/Localizable.strings +++ /dev/null @@ -1,53 +0,0 @@ -/* Label for button to bring up share dialog to share this Tweet in a single Tweet view */ -"tw__share_tweet" = "Share Tweet"; -/* Subject format used to prefill certain sharing options such as Email includes full name (%1$@) and screenname (%2$@) */ -"tw__share_tweet_subject_format" = "Tweet from %1$@ (@%2$@)"; -/* Generic share text format used in all sharing options includes screenname (%1$@) and URL to the Tweet (%2$@) */ -"tw__share_tweet_generic_template_format" = "Check out @%1$@\'s Tweet: %2$@"; -/* Label for Sign in with Twitter button */ -"tw__sign_in_with_twitter_button" = "Log in with Twitter"; -/* Label Email Share Screen negative button */ -"tw__email_share_negative_button" = "Not now"; -/* Label Email Share Screen affirmative button */ -"tw__email_share_affirmative_button" = "Allow"; -/* Heading that appears above the detail message on the share your email screen */ -"tw__email_share_heading" = "Share your email address"; -/* Detail message that includes the app name and username on the share your email screen */ -"tw__email_share_detail_message_format" = "Get updates and other information from %@ when you allow them access to your email on your Twitter account @%@."; -/* Fallback string for detail message in case the app name is not available */ -"tw__email_share_detail_message_this_app" = "this app"; -/* Fallback string for detail message in case the user is not signed in */ -"tw__email_share_detail_message_not_signed_in" = "(not signed in)"; -/* Label for attributing this Tweet was retweeted by the user %@ */ -"tw__tweet_retweeted_by_user" = "Retweeted by %@"; - -/* Timestamps */ - -/* Really short abbreviation for days (plural). 5 days would be '5d' */ -"TIME_SHORT_DAYS_FORMAT" = "%dd"; -/* Really short abbreviation for day (singular). 1 day would be '1d' */ -"TIME_SHORT_DAY_FORMAT" = "%dd"; -/* Really short abbreviation for hours (plural). 5 hours would be '5h' */ -"TIME_SHORT_HOURS_FORMAT" = "%dh"; -/* Really short abbreviation for hour (singular). 1 hour would be '1h' */ -"TIME_SHORT_HOUR_FORMAT" = "%dh"; -/* Really short abbreviation for minutes (plural). 5 minutes would be '5m' */ -"TIME_SHORT_MINUTES_FORMAT" = "%dm"; -/* Really short abbreviation for minute (singular). 1 minute would be '1m' */ -"TIME_SHORT_MINUTE_FORMAT" = "%dm"; -/* Really short abbreviation for seconds (plural). 5 seconds would be '5s' */ -"TIME_SHORT_SECONDS_FORMAT" = "%ds"; -/* Really short abbreviation for second (singular). '1s' */ -"TIME_SHORT_SECOND_FORMAT" = "%ds"; - -/* Accessibility Labels */ - -/* Text spoken out with VoiceOver when a tweet has an image showing */ -"tw__single_image" = "One image attached"; -/* Text spoken out with VoiceOver for selecting the profile image on a regular tweet view */ -"tw__tweet_profile_accessibility" = "Profile"; -/* Text spoken out with VoiceOver for selecting the attached image on a regular tweet view */ -"tw__tweet_image_accessibility" = "Attachment"; - -/* Test String (just for unit tests) */ -"tw__test_string" = "Test"; diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings deleted file mode 100644 index e645165..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/es.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings deleted file mode 100644 index d85e9c2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fa.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings deleted file mode 100644 index fad15a3..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings deleted file mode 100644 index 7ff8acd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/fr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings deleted file mode 100644 index 9b9680d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/he.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings deleted file mode 100644 index 6bd07c7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings deleted file mode 100644 index d3401d6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/hu.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings deleted file mode 100644 index f2312a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/id.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings deleted file mode 100644 index 029a45d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/it.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings deleted file mode 100644 index 7f7f5a5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ja.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings deleted file mode 100644 index a3f237b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ko.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings deleted file mode 100644 index a0171a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ms.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings deleted file mode 100644 index 878848e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nb.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings deleted file mode 100644 index 0f2f331..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/nl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings deleted file mode 100644 index cf0dfcf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings deleted file mode 100644 index 74f567e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/pt.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings deleted file mode 100644 index 9cbeefd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ro.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings deleted file mode 100644 index 6dd56c5..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ru.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings deleted file mode 100644 index 42519ac..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/sv.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings deleted file mode 100644 index 33781fe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/th.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings deleted file mode 100644 index 91b6041..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tl.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings deleted file mode 100644 index 730f875..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/tr.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off.png deleted file mode 100644 index d00f348..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png deleted file mode 100644 index 106944f..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png deleted file mode 100644 index 6e89caf..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-off@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on.png deleted file mode 100644 index 07e4396..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png deleted file mode 100644 index 7ce8c73..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png deleted file mode 100644 index b97284b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-on@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png deleted file mode 100644 index 525a3b8..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png deleted file mode 100644 index 66627a9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png deleted file mode 100644 index 6c1093a..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-favorite-pressed@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png deleted file mode 100644 index b7e4f7c..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png deleted file mode 100644 index bbfbee7..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png deleted file mode 100644 index 3074978..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo-white@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo.png deleted file mode 100644 index ea6f7cd..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png deleted file mode 100644 index 2c17c4d..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png deleted file mode 100644 index b969d88..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-logo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png deleted file mode 100644 index 2f2d32e..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png deleted file mode 100644 index 61692b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png deleted file mode 100644 index 4dda258..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-dark@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png deleted file mode 100644 index 745d9b6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png deleted file mode 100644 index 6033368..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png deleted file mode 100644 index 0707a13..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-retweeted-by-light@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png deleted file mode 100644 index 74d94a2..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png deleted file mode 100644 index f783dbe..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png deleted file mode 100644 index 31a34ee..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twtr-icn-tweet-verified@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png deleted file mode 100644 index 40d6a35..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png deleted file mode 100644 index 0bfc026..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png deleted file mode 100644 index 8dc8747..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo-error@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png deleted file mode 100644 index ad4c4b4..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png deleted file mode 100644 index 47ea38b..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@2x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png deleted file mode 100644 index db471c6..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/twttr-icn-tweet-place-holder-photo@3x.png and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings deleted file mode 100644 index feba7b0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/uk.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings deleted file mode 100644 index 74eb578..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/ur.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings deleted file mode 100644 index 3eb0a19..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/vi.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings deleted file mode 100644 index 15b99c9..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hans.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings deleted file mode 100644 index e01bc78..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/TwitterKit.framework/Versions/Current/Resources/TwitterKitResources.bundle/zh-Hant.lproj/Localizable.strings and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h deleted file mode 100644 index 6c94d11..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/UMSocialTwitterHandler.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// UMSocialTwitterHandler.h -// SocialSDK -// -// Created by yeahugo on 14-1-13. -// Copyright (c) 2014年 Umeng. All rights reserved. -// - -#import - -@interface UMSocialTwitterHandler : NSObject - -/** - 使用友盟提供的方法来分享到twitter - - */ -+(void)openTwitter; - -/** - 设置twitter应用key、secret - - */ -+(void)setTwitterAppKey:(NSString *)appKey withSecret:(NSString *)secret; - - -@end \ No newline at end of file diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/libSocialTwitter.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/libSocialTwitter.a deleted file mode 100644 index 02da8f0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Twitter/libSocialTwitter.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h deleted file mode 100644 index 55cf07d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/UMSocialWechatHandler.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// ; -// SocialSDK -// -// Created by yeahugo on 13-8-6. -// Copyright (c) 2013年 Umeng. All rights reserved. -// - -#import - -@interface UMSocialWechatHandler : NSObject - -/** - 设置微信AppId和url地址 - - @param app_Id 微信应用Id - @param url 微信消息url地址 - - */ -+ (void)setWXAppId:(NSString *)app_Id appSecret:(NSString *)appSecret url:(NSString *)url; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h deleted file mode 100644 index b76371b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApi.h +++ /dev/null @@ -1,157 +0,0 @@ -// -// WXApi.h -// 所有Api接口 -// -// Created by Wechat on 12-2-28. -// Copyright (c) 2012年 Tencent. All rights reserved. -// - -#import -#import "WXApiObject.h" - - -#pragma mark - WXApiDelegate -/*! @brief 接收并处理来自微信终端程序的事件消息 - * - * 接收并处理来自微信终端程序的事件消息,期间微信界面会切换到第三方应用程序。 - * WXApiDelegate 会在handleOpenURL:delegate:中使用并触发。 - */ -@protocol WXApiDelegate -@optional - -/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果 - * - * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。 - * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。 - * @param req 具体请求内容,是自动释放的 - */ --(void) onReq:(BaseReq*)req; - - - -/*! @brief 发送一个sendReq后,收到微信的回应 - * - * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。 - * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。 - * @param resp具体的回应内容,是自动释放的 - */ --(void) onResp:(BaseResp*)resp; - -@end - - - -#pragma mark - WXApi - -/*! @brief 微信Api接口函数类 - * - * 该类封装了微信终端SDK的所有接口 - */ -@interface WXApi : NSObject - -/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 - * - * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 - * iOS7及以上系统需要调起一次微信才会出现在微信的可用应用列表中。 - * @attention 请保证在主线程中调用此函数 - * @param appid 微信开发者ID - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) registerApp:(NSString *)appid; - - - -/*! @brief WXApi的成员函数,向微信终端程序注册第三方应用。 - * - * 需要在每次启动第三方应用程序时调用。第一次调用后,会在微信的可用应用列表中出现。 - * @see registerApp - * @param appid 微信开发者ID - * @param appdesc 应用附加信息,长度不超过1024字节 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc; - - - -/*! @brief 处理微信通过URL启动App时传递的数据 - * - * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 - * @param url 微信启动第三方应用时传递过来的URL - * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) handleOpenURL:(NSURL *) url delegate:(id) delegate; - - - -/*! @brief 检查微信是否已被用户安装 - * - * @return 微信已安装返回YES,未安装返回NO。 - */ -+(BOOL) isWXAppInstalled; - - - -/*! @brief 判断当前微信的版本是否支持OpenApi - * - * @return 支持返回YES,不支持返回NO。 - */ -+(BOOL) isWXAppSupportApi; - - - -/*! @brief 获取微信的itunes安装地址 - * - * @return 微信的安装地址字符串。 - */ -+(NSString *) getWXAppInstallUrl; - - - -/*! @brief 获取当前微信SDK的版本号 - * - * @return 返回当前微信SDK的版本号 - */ -+(NSString *) getApiVersion; - - - -/*! @brief 打开微信 - * - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) openWXApp; - - - -/*! @brief 发送请求到微信,等待微信返回onResp - * - * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型 - * SendAuthReq、SendMessageToWXReq、PayReq等。 - * @param req 具体的发送请求,在调用函数后,请自己释放。 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) sendReq:(BaseReq*)req; - -/*! @brief 发送Auth请求到微信,支持用户没安装微信,等待微信返回onResp - * - * 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持SendAuthReq类型。 - * @param req 具体的发送请求,在调用函数后,请自己释放。 - * @param viewController 当前界面对象。 - * @param delegate WXApiDelegate对象,用来接收微信触发的消息。 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id) delegate; - - -/*! @brief 收到微信onReq的请求,发送对应的应答给微信,并切换到微信界面 - * - * 函数调用后,会切换到微信的界面。第三方应用程序收到微信onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 - * GetMessageFromWXResp、ShowMessageFromWXResp等。 - * @param resp 具体的应答内容,调用函数后,请自己释放 - * @return 成功返回YES,失败返回NO。 - */ -+(BOOL) sendResp:(BaseResp*)resp; - - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h deleted file mode 100644 index aba8c3d..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/WXApiObject.h +++ /dev/null @@ -1,669 +0,0 @@ -// -// MMApiObject.h -// Api对象,包含所有接口和对象数据定义 -// -// Created by Wechat on 12-2-28. -// Copyright (c) 2012年 Tencent. All rights reserved. -// - -#import -#import - -/*! @brief 错误码 - * - */ -enum WXErrCode { - WXSuccess = 0, /**< 成功 */ - WXErrCodeCommon = -1, /**< 普通错误类型 */ - WXErrCodeUserCancel = -2, /**< 用户点击取消并返回 */ - WXErrCodeSentFail = -3, /**< 发送失败 */ - WXErrCodeAuthDeny = -4, /**< 授权失败 */ - WXErrCodeUnsupport = -5, /**< 微信不支持 */ -}; - - - -/*! @brief 请求发送场景 - * - */ -enum WXScene { - WXSceneSession = 0, /**< 聊天界面 */ - WXSceneTimeline = 1, /**< 朋友圈 */ - WXSceneFavorite = 2, /**< 收藏 */ -}; - - - -enum WXAPISupport { - WXAPISupportSession = 0, -}; - - - -/*! @brief 跳转profile类型 - * - */ -enum WXBizProfileType{ - WXBizProfileType_Normal = 0, //**< 普通公众号 */ - WXBizProfileType_Device = 1, //**< 硬件公众号 */ -}; - - - -/*! @brief 跳转mp网页类型 - * - */ -enum WXMPWebviewType { - WXMPWebviewType_Ad = 0, /**< 广告网页 **/ -}; - -#pragma mark - BaseReq -/*! @brief 该类为微信终端SDK所有请求类的基类 - * - */ -@interface BaseReq : NSObject - -/** 请求类型 */ -@property (nonatomic, assign) int type; -/** 由用户微信号和AppID组成的唯一标识,发送请求时第三方程序必须填写,用于校验微信用户是否换号登录*/ -@property (nonatomic, retain) NSString* openID; - -@end - - - -#pragma mark - BaseResp -/*! @brief 该类为微信终端SDK所有响应类的基类 - * - */ -@interface BaseResp : NSObject -/** 错误码 */ -@property (nonatomic, assign) int errCode; -/** 错误提示字符串 */ -@property (nonatomic, retain) NSString *errStr; -/** 响应类型 */ -@property (nonatomic, assign) int type; - -@end - - - -#pragma mark - WXMediaMessage -@class WXMediaMessage; - -/*! @brief 第三方向微信终端发起支付的消息结构体 - * - * 第三方向微信终端发起支付的消息结构体,微信终端处理后会向第三方返回处理结果 - * @see PayResp - */ -@interface PayReq : BaseReq - -/** 商家向财付通申请的商家id */ -@property (nonatomic, retain) NSString *partnerId; -/** 预支付订单 */ -@property (nonatomic, retain) NSString *prepayId; -/** 随机串,防重发 */ -@property (nonatomic, retain) NSString *nonceStr; -/** 时间戳,防重发 */ -@property (nonatomic, assign) UInt32 timeStamp; -/** 商家根据财付通文档填写的数据和签名 */ -@property (nonatomic, retain) NSString *package; -/** 商家根据微信开放平台文档对数据做的签名 */ -@property (nonatomic, retain) NSString *sign; - -@end - - - -#pragma mark - PayResp -/*! @brief 微信终端返回给第三方的关于支付结果的结构体 - * - * 微信终端返回给第三方的关于支付结果的结构体 - */ -@interface PayResp : BaseResp - -/** 财付通返回给商家的信息 */ -@property (nonatomic, retain) NSString *returnKey; - -@end - - -#pragma mark - SendAuthReq -/*! @brief 第三方程序向微信终端请求认证的消息结构 - * - * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数, - * 向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 - * @see SendAuthResp - */ -@interface SendAuthReq : BaseReq -/** 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。微信终端处理完后会向第三方程序发送一个处理结果。 - * @see SendAuthResp - * @note scope字符串长度不能超过1K - */ -@property (nonatomic, retain) NSString* scope; -/** 第三方程序本身用来标识其请求的唯一性,最后跳转回第三方程序时,由微信终端回传。 - * @note state字符串长度不能超过1K - */ -@property (nonatomic, retain) NSString* state; -@end - - - -#pragma mark - SendAuthResp -/*! @brief 微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果。 - * - * 第三方程序要向微信申请认证,并请求某些权限,需要调用WXApi的sendReq成员函数,向微信终端发送一个SendAuthReq消息结构。 - * 微信终端处理完后会向第三方程序发送一个SendAuthResp。 - * @see onResp - */ -@interface SendAuthResp : BaseResp -@property (nonatomic, retain) NSString* code; -/** 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传 - * @note state字符串长度不能超过1K - */ -@property (nonatomic, retain) NSString* state; -@property (nonatomic, retain) NSString* lang; -@property (nonatomic, retain) NSString* country; -@end - - - -#pragma mark - SendMessageToWXReq -/*! @brief 第三方程序发送消息至微信终端程序的消息结构体 - * - * 第三方程序向微信发送信息需要传入SendMessageToWXReq结构体,信息类型包括文本消息和多媒体消息, - * 分别对应于text和message成员。调用该方法后,微信处理完信息会向第三方程序发送一个处理结果。 - * @see SendMessageToWXResp - */ -@interface SendMessageToWXReq : BaseReq -/** 发送消息的文本内容 - * @note 文本长度必须大于0且小于10K - */ -@property (nonatomic, retain) NSString* text; -/** 发送消息的多媒体内容 - * @see WXMediaMessage - */ -@property (nonatomic, retain) WXMediaMessage* message; -/** 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ -@property (nonatomic, assign) BOOL bText; -/** 发送的目标场景,可以选择发送到会话(WXSceneSession)或者朋友圈(WXSceneTimeline)。 默认发送到会话。 - * @see WXScene - */ -@property (nonatomic, assign) int scene; - -@end - - - -#pragma mark - SendMessageToWXResp -/*! @brief 微信终端向第三方程序返回的SendMessageToWXReq处理结果。 - * - * 第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。 - */ -@interface SendMessageToWXResp : BaseResp -@property(nonatomic, retain) NSString* lang; -@property(nonatomic, retain) NSString* country; -@end - - -#pragma mark - GetMessageFromWXReq -/*! @brief 微信终端向第三方程序请求提供内容的消息结构体。 - * - * 微信终端向第三方程序请求提供内容,微信终端会向第三方程序发送GetMessageFromWXReq消息结构体, - * 需要第三方程序调用sendResp返回一个GetMessageFromWXResp消息结构体。 - */ -@interface GetMessageFromWXReq : BaseReq -@property (nonatomic, retain) NSString* lang; -@property (nonatomic, retain) NSString* country; -@end - - - -#pragma mark - GetMessageFromWXResp -/*! @brief 微信终端向第三方程序请求提供内容,第三方程序向微信终端返回的消息结构体。 - * - * 微信终端向第三方程序请求提供内容,第三方程序调用sendResp向微信终端返回一个GetMessageFromWXResp消息结构体。 - */ -@interface GetMessageFromWXResp : BaseResp -/** 向微信终端提供的文本内容 - @note 文本长度必须大于0且小于10K - */ -@property (nonatomic, retain) NSString* text; -/** 向微信终端提供的多媒体内容。 - * @see WXMediaMessage - */ -@property (nonatomic, retain) WXMediaMessage* message; -/** 向微信终端提供内容的消息类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息 */ -@property (nonatomic, assign) BOOL bText; -@end - - - -#pragma mark - ShowMessageFromWXReq -/*! @brief 微信通知第三方程序,要求第三方程序显示的消息结构体。 - * - * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 - * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 - */ -@interface ShowMessageFromWXReq : BaseReq -/** 微信终端向第三方程序发送的要求第三方程序处理的多媒体内容 - * @see WXMediaMessage - */ -@property (nonatomic, retain) WXMediaMessage* message; -@property (nonatomic, retain) NSString* lang; -@property (nonatomic, retain) NSString* country; -@end - - - -#pragma mark - ShowMessageFromWXResp -/*! @brief 微信通知第三方程序,要求第三方程序显示或处理某些消息,第三方程序处理完后向微信终端发送的处理结果。 - * - * 微信需要通知第三方程序显示或处理某些内容时,会向第三方程序发送ShowMessageFromWXReq消息结构体。 - * 第三方程序处理完内容后调用sendResp向微信终端发送ShowMessageFromWXResp。 - */ -@interface ShowMessageFromWXResp : BaseResp -@end - - - -#pragma mark - LaunchFromWXReq -/*! @brief 微信终端打开第三方程序携带的消息结构体 - * - * 微信向第三方发送的结构体,第三方不需要返回 - */ -@interface LaunchFromWXReq : BaseReq -@property (nonatomic, retain) WXMediaMessage* message; -@property (nonatomic, retain) NSString* lang; -@property (nonatomic, retain) NSString* country; -@end - -#pragma mark - OpenTempSessionReq -/* ! @brief 第三方通知微信,打开临时会话 - * - * 第三方通知微信,打开临时会话 - */ -@interface OpenTempSessionReq : BaseReq -/** 需要打开的用户名 - * @attention 长度不能超过512字节 - */ -@property (nonatomic, retain) NSString* username; -/** 开发者自定义参数,拉起临时会话后会发给开发者后台,可以用于识别场景 - * @attention 长度不能超过32位 - */ -@property (nonatomic, retain) NSString* sessionFrom; -@end - -#pragma mark - OpenTempSessionResp -/*! @brief 微信终端向第三方程序返回的OpenTempSessionReq处理结果。 - * - * 第三方程序向微信终端发送OpenTempSessionReq后,微信发送回来的处理结果,该结果用OpenTempSessionResp表示。 - */ -@interface OpenTempSessionResp : BaseResp - -@end - -#pragma mark - OpenWebviewReq -/* ! @brief 第三方通知微信启动内部浏览器,打开指定网页 - * - * 第三方通知微信启动内部浏览器,打开指定Url对应的网页 - */ -@interface OpenWebviewReq : BaseReq -/** 需要打开的网页对应的Url - * @attention 长度不能超过1024 - */ -@property(nonatomic,retain)NSString* url; - -@end - -#pragma mark - OpenWebviewResp -/*! @brief 微信终端向第三方程序返回的OpenWebviewReq处理结果 - * - * 第三方程序向微信终端发送OpenWebviewReq后,微信发送回来的处理结果,该结果用OpenWebviewResp表示 - */ -@interface OpenWebviewResp : BaseResp - -@end - -#pragma mark - OpenRankListReq -/* ! @brief 第三方通知微信,打开硬件排行榜 - * - * 第三方通知微信,打开硬件排行榜 - */ -@interface OpenRankListReq : BaseReq - -@end - -#pragma mark - OpenRanklistResp -/*! @brief 微信终端向第三方程序返回的OpenRankListReq处理结果。 - * - * 第三方程序向微信终端发送OpenRankListReq后,微信发送回来的处理结果,该结果用OpenRankListResp表示。 - */ -@interface OpenRankListResp : BaseResp - -@end - -#pragma mark - JumpToBizProfileReq -/* ! @brief 第三方通知微信,打开指定微信号profile页面 - * - * 第三方通知微信,打开指定微信号profile页面 - */ -@interface JumpToBizProfileReq : BaseReq -/** 跳转到该公众号的profile - * @attention 长度不能超过512字节 - */ -@property (nonatomic, retain) NSString* username; -/** 如果用户加了该公众号为好友,extMsg会上传到服务器 - * @attention 长度不能超过1024字节 - */ -@property (nonatomic, retain) NSString* extMsg; -/** - * 跳转的公众号类型 - * @see WXBizProfileType - */ -@property (nonatomic, assign) int profileType; -@end - - - -#pragma mark - JumpToBizWebviewReq -/* ! @brief 第三方通知微信,打开指定usrname的profile网页版 - * - */ -@interface JumpToBizWebviewReq : BaseReq -/** 跳转的网页类型,目前只支持广告页 - * @see WXMPWebviewType - */ -@property(nonatomic, assign) int webType; -/** 跳转到该公众号的profile网页版 - * @attention 长度不能超过512字节 - */ -@property(nonatomic, retain) NSString* tousrname; -/** 如果用户加了该公众号为好友,extMsg会上传到服务器 - * @attention 长度不能超过1024字节 - */ -@property(nonatomic, retain) NSString* extMsg; - -@end - -#pragma mark - WXCardItem - -@interface WXCardItem : NSObject -/** 卡id - * @attention 长度不能超过1024字节 - */ -@property (nonatomic,retain) NSString* cardId; -/** ext信息 - * @attention 长度不能超过2024字节 - * 具体见http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E9.99.84.E5.BD.954-.E5.8D.A1.E5.88.B8.E6.89.A9.E5.B1.95.E5.AD.97.E6.AE.B5.E5.8F.8A.E7.AD.BE.E5.90.8D.E7.94.9F.E6.88.90.E7.AE.97.E6.B3.95 卡券扩展字段cardExt说明 - */ -@property (nonatomic,retain) NSString* extMsg; -/** - * @attention 卡的状态,req不需要填。resp:0为未添加,1为已添加。 - */ -@property (nonatomic,assign) UInt32 cardState; -@end; - -#pragma mark - AddCardToWXCardPackageReq -/* ! @brief 请求添加卡券至微信卡包 - * - */ - -@interface AddCardToWXCardPackageReq : BaseReq -/** 卡列表 - * @attention 个数不能超过40个 类型WXCardItem - */ -@property (nonatomic,retain) NSArray* cardAry; - -@end - - -#pragma mark - AddCardToWXCardPackageResp -/** ! @brief 微信返回第三方添加卡券结果 - * - */ - -@interface AddCardToWXCardPackageResp : BaseResp -/** 卡列表 - * @attention 个数不能超过40个 类型WXCardItem - */ -@property (nonatomic,retain) NSArray* cardAry; -@end - -#pragma mark - WXMediaMessage - -/*! @brief 多媒体消息结构体 - * - * 用于微信终端和第三方程序之间传递消息的多媒体消息内容 - */ -@interface WXMediaMessage : NSObject - -+(WXMediaMessage *) message; - -/** 标题 - * @note 长度不能超过512字节 - */ -@property (nonatomic, retain) NSString *title; -/** 描述内容 - * @note 长度不能超过1K - */ -@property (nonatomic, retain) NSString *description; -/** 缩略图数据 - * @note 大小不能超过32K - */ -@property (nonatomic, retain) NSData *thumbData; -/** - * @note 长度不能超过64字节 - */ -@property (nonatomic, retain) NSString *mediaTagName; -/** - * - */ -@property (nonatomic, retain) NSString *messageExt; -@property (nonatomic, retain) NSString *messageAction; -/** - * 多媒体数据对象,可以为WXImageObject,WXMusicObject,WXVideoObject,WXWebpageObject等。 - */ -@property (nonatomic, retain) id mediaObject; - -/*! @brief 设置消息缩略图的方法 - * - * @param image 缩略图 - * @note 大小不能超过32K - */ -- (void) setThumbImage:(UIImage *)image; - -@end - - - -#pragma mark - WXImageObject -/*! @brief 多媒体消息中包含的图片数据对象 - * - * 微信终端和第三方程序之间传递消息中包含的图片数据对象。 - * @note imageData和imageUrl成员不能同时为空 - * @see WXMediaMessage - */ -@interface WXImageObject : NSObject -/*! @brief 返回一个WXImageObject对象 - * - * @note 返回的WXImageObject对象是自动释放的 - */ -+(WXImageObject *) object; - -/** 图片真实数据内容 - * @note 大小不能超过10M - */ -@property (nonatomic, retain) NSData *imageData; -/** 图片url - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *imageUrl; - -@end - - -#pragma mark - WXMusicObject -/*! @brief 多媒体消息中包含的音乐数据对象 - * - * 微信终端和第三方程序之间传递消息中包含的音乐数据对象。 - * @note musicUrl和musicLowBandUrl成员不能同时为空。 - * @see WXMediaMessage - */ -@interface WXMusicObject : NSObject -/*! @brief 返回一个WXMusicObject对象 - * - * @note 返回的WXMusicObject对象是自动释放的 - */ -+(WXMusicObject *) object; - -/** 音乐网页的url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *musicUrl; -/** 音乐lowband网页的url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *musicLowBandUrl; -/** 音乐数据url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *musicDataUrl; - -/**音乐lowband数据url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *musicLowBandDataUrl; - -@end - - - -#pragma mark - WXVideoObject -/*! @brief 多媒体消息中包含的视频数据对象 - * - * 微信终端和第三方程序之间传递消息中包含的视频数据对象。 - * @note videoUrl和videoLowBandUrl不能同时为空。 - * @see WXMediaMessage - */ -@interface WXVideoObject : NSObject -/*! @brief 返回一个WXVideoObject对象 - * - * @note 返回的WXVideoObject对象是自动释放的 - */ -+(WXVideoObject *) object; - -/** 视频网页的url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *videoUrl; -/** 视频lowband网页的url地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *videoLowBandUrl; - -@end - - - -#pragma mark - WXWebpageObject -/*! @brief 多媒体消息中包含的网页数据对象 - * - * 微信终端和第三方程序之间传递消息中包含的网页数据对象。 - * @see WXMediaMessage - */ -@interface WXWebpageObject : NSObject -/*! @brief 返回一个WXWebpageObject对象 - * - * @note 返回的WXWebpageObject对象是自动释放的 - */ -+(WXWebpageObject *) object; - -/** 网页的url地址 - * @note 不能为空且长度不能超过10K - */ -@property (nonatomic, retain) NSString *webpageUrl; - -@end - - - -#pragma mark - WXAppExtendObject -/*! @brief 多媒体消息中包含的App扩展数据对象 - * - * 第三方程序向微信终端发送包含WXAppExtendObject的多媒体消息, - * 微信需要处理该消息时,会调用该第三方程序来处理多媒体消息内容。 - * @note url,extInfo和fileData不能同时为空 - * @see WXMediaMessage - */ -@interface WXAppExtendObject : NSObject -/*! @brief 返回一个WXAppExtendObject对象 - * - * @note 返回的WXAppExtendObject对象是自动释放的 - */ -+(WXAppExtendObject *) object; - -/** 若第三方程序不存在,微信终端会打开该url所指的App下载地址 - * @note 长度不能超过10K - */ -@property (nonatomic, retain) NSString *url; -/** 第三方程序自定义简单数据,微信终端会回传给第三方程序处理 - * @note 长度不能超过2K - */ -@property (nonatomic, retain) NSString *extInfo; -/** App文件数据,该数据发送给微信好友,微信好友需要点击后下载数据,微信终端会回传给第三方程序处理 - * @note 大小不能超过10M - */ -@property (nonatomic, retain) NSData *fileData; - -@end - - - -#pragma mark - WXEmoticonObject -/*! @brief 多媒体消息中包含的表情数据对象 - * - * 微信终端和第三方程序之间传递消息中包含的表情数据对象。 - * @see WXMediaMessage - */ -@interface WXEmoticonObject : NSObject - -/*! @brief 返回一个WXEmoticonObject对象 - * - * @note 返回的WXEmoticonObject对象是自动释放的 - */ -+(WXEmoticonObject *) object; - -/** 表情真实数据内容 - * @note 大小不能超过10M - */ -@property (nonatomic, retain) NSData *emoticonData; - -@end - - - -#pragma mark - WXFileObject -/*! @brief 多媒体消息中包含的文件数据对象 - * - * @see WXMediaMessage - */ -@interface WXFileObject : NSObject - -/*! @brief 返回一个WXFileObject对象 - * - * @note 返回的WXFileObject对象是自动释放的 - */ -+(WXFileObject *) object; - -/** 文件后缀名 - * @note 长度不超过64字节 - */ -@property (nonatomic, retain) NSString *fileExtension; - -/** 文件真实数据内容 - * @note 大小不能超过10M - */ -@property (nonatomic, retain) NSData *fileData; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libSocialWechat.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libSocialWechat.a deleted file mode 100644 index 23a6afc..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libSocialWechat.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libWeChatSDK.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libWeChatSDK.a deleted file mode 100644 index c398890..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Wechat/libWeChatSDK.a and /dev/null differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h deleted file mode 100644 index 5b8954b..0000000 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/UMSocialWhatsappHandler.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// UMSocialWhatsappHandler.h -// SocialSDK -// -// Created by Gavin Ye on 8/21/14. -// Copyright (c) 2014 Umeng. All rights reserved. -// - -#import - -typedef enum { - UMSocialWhatsappMessageTypeText, - UMSocialWhatsappMessageTypeImage, -}UMSocialWhatsappMessageType; - -@interface UMSocialWhatsappHandler : NSObject - -+(void)openWhatsapp:(UMSocialWhatsappMessageType)messageType; - -@end diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/libSocialWhatsapp.a b/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/libSocialWhatsapp.a deleted file mode 100644 index 3d2aac0..0000000 Binary files a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/Whatsapp/libSocialWhatsapp.a and /dev/null differ diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h new file mode 100755 index 0000000..9d0b870 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPI.h @@ -0,0 +1,146 @@ +// +// APOpenAPI.h +// 所有API接口 +// +// Created by Alipay on 15-4-15. +// Copyright (c) 2015年 Alipay. All rights reserved. +// + +#import +#import "APOpenAPIObject.h" + +#pragma mark - APOpenAPIDelegate + +/*! @brief 接收并处理来自支付宝终端程序的事件消息 + * + * 接收并处理来自支付宝终端程序的事件消息,期间支付宝界面会切换到第三方应用程序。 + * APOpenAPIDelegate 会在handleOpenURL:delegate:中使用并触发。 + */ +@protocol APOpenAPIDelegate +@optional + +/*! @brief 收到一个来自支付宝的请求,第三方应用程序处理完后调用sendResp向支付宝发送结果 + * + * 收到一个来自支付宝的请求,异步处理完成后必须调用sendResp发送处理结果给支付宝。 + * @param req 具体请求内容 + */ +-(void) onReq:(APBaseReq*)req; + + + +/*! @brief 发送一个sendReq后,收到支付宝的回应 + * + * 收到一个来自支付宝的处理结果。调用一次sendReq后会收到onResp。 + * @param resp具体的回应内容 + */ +-(void) onResp:(APBaseResp*)resp; + +@end + +#pragma mark - APOpenAPI + +/*! @brief 支付宝API接口函数类 + * + * 该类封装了支付宝终端SDK的所有接口 + */ +@interface APOpenAPI : NSObject + + +/*! @brief APOpenAPI的成员函数,向支付宝终端程序注册第三方应用。 + * + * 需要在每次启动第三方应用程序时调用。第一次调用后,会在支付宝的可用应用列表中出现。 + * iOS7及以上系统需要调起一次支付宝才会出现在支付宝的可用应用列表中。 + * @attention 请保证在主线程中调用此函数 + * @param appid 支付宝开发者ID + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) registerApp:(NSString *)appid; + + + +/*! @brief APOpenAPI的成员函数,向支付宝终端程序注册第三方应用。 + * + * 需要在每次启动第三方应用程序时调用。第一次调用后,会在支付宝的可用应用列表中出现。 + * @see registerApp + * @param appid 支付宝开发者ID + * @param appdesc 应用附加信息,长度不超过1024字节 + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) registerApp:(NSString *)appid withDescription:(NSString *)appdesc; + + + +/*! @brief 处理支付宝通过URL启动App时传递的数据 + * + * 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。 + * @param url 支付宝启动第三方应用时传递过来的URL + * @param delegate APOpenAPIDelegate对象,用来接收支付宝触发的消息。 + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) handleOpenURL:(NSURL *) url delegate:(id) delegate; + + + +/*! @brief 检查支付宝是否已被用户安装 + * + * @return 支付宝已安装返回YES,未安装返回NO。 + */ ++(BOOL) isAPAppInstalled; + + + +/*! @brief 判断当前支付宝的版本是否支持OpenApi + * + * @return 支持返回YES,不支持返回NO。 + */ ++(BOOL) isAPAppSupportOpenApi; + + +/*! @brief 判断当前支付宝的版本是否支持分享到生活圈 + * + * @return 支持返回YES,不支持返回NO。 + */ ++(BOOL) isAPAppSupportShareTimeLine; + + +/*! @brief 获取支付宝的itunes安装地址 + * + * @return 支付宝的安装地址字符串。 + */ ++(NSString *) getAPAppInstallUrl; + + + +/*! @brief 获取当前支付宝SDK的版本号 + * + * @return 返回当前支付宝SDK的版本号 + */ ++(NSString *) getApiVersion; + + + +/*! @brief 打开支付宝 + * + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) openAPApp; + + +/*! @brief 发送请求到支付宝,等待支付宝返回onResp + * + * 函数调用后,会切换到支付宝的界面。第三方应用程序等待支付宝返回onResp。支付宝在异步处理完成后一定会调用onResp。支持以下类型 + * @param req 具体的发送请求,在调用函数后,请自己释放。 + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) sendReq:(APBaseReq*)req; + + +/*! @brief 收到支付宝onReq的请求,发送对应的应答给支付宝,并切换到支付宝界面 + * + * 函数调用后,会切换到支付宝的界面。第三方应用程序收到支付宝onReq的请求,异步处理该请求,完成后必须调用该函数。可能发送的相应有 + * @param resp 具体的应答内容,调用函数后,请自己释放 + * @return 成功返回YES,失败返回NO。 + */ ++(BOOL) sendResp:(APBaseResp*)resp; + +@end diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h new file mode 100755 index 0000000..beee0a1 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/APOpenAPIObject.h @@ -0,0 +1,110 @@ +// +// APOpenAPIObject.h +// API对象,包含所有接口和对象数据定义 +// +// Created by Alipay on 15-4-15. +// Copyright (c) 2015年 Alipay. All rights reserved. +// + +#import +#import + +// 错误码 +typedef enum { + APSuccess = 0, // 成功 + APErrCodeCommon = -1, // 通用错误 + APErrCodeUserCancel = -2, // 用户取消 + APErrCodeSentFail = -3, // 发送失败 + APErrCodeAuthDeny = -4, // 授权失败 + APErrCodeUnsupport = -5, // 不支持 +}APErrorCode; + +// 分享场景 +typedef enum { + APSceneSession = 0, // 会话 + APSceneTimeLine = 1, //生活圈 +}APScene; + +#pragma mark - APBaseReq + +/*! @brief 该类为支付宝SDK所有请求类的基类 + * + */ +@interface APBaseReq : NSObject +/** 请求类型 */ +@property (nonatomic, assign) int type; +/** AppID,发送请求时第三方程序必须填写 */ +@property (nonatomic, retain) NSString* openID; +@end + +#pragma mark - APBaseResp + +/*! @brief 该类为SDK所有响应类的基类 + * + */ +@interface APBaseResp : NSObject +/** 错误码 */ +@property (nonatomic, assign) int errCode; +/** 错误提示字符串 */ +@property (nonatomic, strong) NSString *errStr; +/** 响应类型 */ +@property (nonatomic, assign) int type; +@property (nonatomic, strong) NSString *openID; +@end + +#pragma mark - 发送消息到支付宝 +/*! @brief 第三方程序发送消息至支付宝终端程序的消息结构体 + * + * 第三方程序向支付宝发送信息需要传入SendMessageToAPReq结构体,调用该方法后,支付宝处理完信息会向第三方程序发送一个处理结果。 + * @see SendMessageToAPReq + */ +@class APMediaMessage; +@interface APSendMessageToAPReq : APBaseReq +// 发送消息的多媒体内容 +@property (nonatomic, strong) APMediaMessage* message; +// 支付宝9.9.5版本至现在版本,分享入口已合并,这个scene并没有被使用,用户会在跳转进支付宝后选择分享场景(好友、动态、圈子等),但为保证老版本上无问题、建议还是照常传入 +@property (nonatomic, assign) APScene scene; +@end + +/*! @brief 支付宝终端向第三方程序返回的SendMessageToAPReq处理结果。 + * + * 第三方程序向支付宝终端发送SendMessageToAPReq后,支付宝发送回来的处理结果,该结果用SendMessageToAPResp表示。 + */ +@interface APSendMessageToAPResp : APBaseResp + +@end + +#pragma mark - APMediaMessage +/*! @brief 多媒体消息结构体 + * + * 用于支付宝终端和第三方程序之间传递消息的多媒体消息内容 + */ +@interface APMediaMessage : NSObject +// 标题 +@property (nonatomic, strong) NSString *title; +// 描述内容 +@property (nonatomic, strong) NSString *desc; +// 缩略图数据,thumbData是UIImage类型,thumbUrl是url类型,二者只有一个生效,UIImage优先级高于url +@property (nonatomic, strong) NSData *thumbData; +@property (nonatomic, strong) NSString *thumbUrl; +// 多媒体对象 +@property (nonatomic, strong) id mediaObject; +@end + +// 文本 +@interface APShareTextObject : NSObject +@property (nonatomic, strong) NSString *text; +@end; + +// 图片 +@interface APShareImageObject : NSObject +// 缩略图数据,imageData是UIImage类型,imageUrl是远端互联网url图片地址类型,二者只有一个生效,UIImage优先级高于url +@property (nonatomic, strong) NSData *imageData; +@property (nonatomic, strong) NSString *imageUrl; +@end; + +// 网页 +@interface APShareWebObject : NSObject +//网页链接url,标题和描述在APMediaMessage中设置 +@property (nonatomic, strong) NSString *wepageUrl; +@end; diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h new file mode 100644 index 0000000..051a351 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/UMSocialAlipayHandler.h @@ -0,0 +1,17 @@ +// +// UMSAlipayShareTableViewController.h +// SocialSDK +// +// Created by umeng on 16/4/18. +// Copyright © 2016年 dongjianxiong. All rights reserved. +// + +#import + +@interface UMSocialAlipayHandler : UMSocialHandler + + ++ (UMSocialAlipayHandler *)defaultManager; + + +@end diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libAPOpenSdk.a b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libAPOpenSdk.a new file mode 100755 index 0000000..2f7cf56 Binary files /dev/null and b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libAPOpenSdk.a differ diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libSocialAlipayShare.a b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libSocialAlipayShare.a new file mode 100644 index 0000000..cf839a0 Binary files /dev/null and b/Pods/UMengUShare/UShareSDK/SocialLibraries/AlipayShare/libSocialAlipayShare.a differ diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterface.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterface.h new file mode 100644 index 0000000..7354c81 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterface.h @@ -0,0 +1,134 @@ +/// +/// \file QQApiInterface.h +/// \brief QQApi接口简化封装 +/// +/// Created by Tencent on 12-5-15. +/// Copyright (c) 2012年 Tencent. All rights reserved. +/// + +#import +#import "QQApiInterfaceObject.h" + +/** + \brief 处理来至QQ的请求及响应的回调协议 + */ +@protocol QQApiInterfaceDelegate + +/** + 处理来至QQ的请求 + */ +- (void)onReq:(QQBaseReq *)req; + +/** + 处理来至QQ的响应 + */ +- (void)onResp:(QQBaseResp *)resp; + +/** + 处理QQ在线状态的回调 + */ +- (void)isOnlineResponse:(NSDictionary *)response; + +@end + +/** + \brief 对QQApi的简单封装类 + */ +@interface QQApiInterface : NSObject + +/** + 处理由手Q唤起的跳转请求 + \param url 待处理的url跳转请求 + \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象 + \return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败 + */ ++ (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; + +/** + 向手Q发起分享请求 + \param req 分享内容的请求 + \return 请求发送结果码 + */ ++ (QQApiSendResultCode)sendReq:(QQBaseReq *)req; + +/** + 向手Q QZone结合版发起分享请求 + \note H5分享只支持单张网络图片的传递 + \param req 分享内容的请求 + \return 请求发送结果码 + */ ++ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req; + +/** + 向手Q 群部落发起分享请求 + \note H5分享只支持单张网络图片的传递 + \param req 分享内容的请求 + \return 请求发送结果码 + */ ++ (QQApiSendResultCode)SendReqToQQGroupTribe:(QQBaseReq *)req; + +/** + 向手Q发送应答消息 + \param resp 应答消息 + \return 应答发送结果码 + */ ++ (QQApiSendResultCode)sendResp:(QQBaseResp *)resp; + +/** + 检测是否已安装QQ + \return 如果QQ已安装则返回YES,否则返回NO + */ ++ (BOOL)isQQInstalled; + +/** + 检测是否已安装TIM + \return 如果TIM已安装则返回YES,否则返回NO + */ ++ (BOOL)isTIMInstalled; + +/** + 批量检测QQ号码是否在线 + */ ++ (void)getQQUinOnlineStatues:(NSArray *)QQUins delegate:(id)delegate; + +/** + 检测QQ是否支持API调用 + \return 如果当前安装QQ版本支持API调用则返回YES,否则返回NO + */ ++ (BOOL)isQQSupportApi; + +/** + 检测TIM是否支持API调用 + \return 如果当前安装TIM版本支持API调用则返回YES,否则返回NO + */ ++ (BOOL)isTIMSupportApi; + +/** + 启动QQ + \return 成功返回YES,否则返回NO + */ ++ (BOOL)openQQ; + +/** + 启动TIM + \return 成功返回YES,否则返回NO + */ ++ (BOOL)openTIM; + +/** + 获取QQ下载地址 + + 如果App通过QQApiInterface#isQQInstalledQQApiInterface#isQQSupportApi检测发现QQ没安装或当前版本QQ不支持API调用,可引导用户通过打开此链接下载最新版QQ。 + \return iPhoneQQ下载地址 + */ ++ (NSString *)getQQInstallUrl; + +/** + 获取TIM下载地址 + + 如果App通过QQApiInterface#isTIMInstalledQQApiInterface#isTIMSupportApi检测发现TIM没安装或当前版本TIM不支持API调用,可引导用户通过打开此链接下载最新版TIM。 + \return iPhoneTIM下载地址 + */ ++ (NSString *)getTIMInstallUrl; + +@end diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h new file mode 100644 index 0000000..d63e875 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h @@ -0,0 +1,628 @@ +/// +/// \file QQApiInterfaceObject.h +/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类 +/// +/// Created by Tencent on 12-5-15. +/// Copyright (c) 2012年 Tencent. All rights reserved. +/// + +#ifndef QQApiInterface_QQAPIOBJECT_h +#define QQApiInterface_QQAPIOBJECT_h + +#import + + +typedef enum +{ + EQQAPISENDSUCESS = 0, + EQQAPIQQNOTINSTALLED = 1, + EQQAPIQQNOTSUPPORTAPI = 2, + EQQAPIMESSAGETYPEINVALID = 3, + EQQAPIMESSAGECONTENTNULL = 4, + EQQAPIMESSAGECONTENTINVALID = 5, + EQQAPIAPPNOTREGISTED = 6, + EQQAPIAPPSHAREASYNC = 7, + EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8, + EQQAPISENDFAILD = -1, + EQQAPISHAREDESTUNKNOWN = -2, //未指定分享到QQ或TIM + + EQQAPITIMNOTINSTALLED = 11, //TIM未安装 + EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持 + //qzone分享不支持text类型分享 + EQQAPIQZONENOTSUPPORTTEXT = 10000, + //qzone分享不支持image类型分享 + EQQAPIQZONENOTSUPPORTIMAGE = 10001, + //当前QQ版本太低,需要更新至新版本才可以支持 + EQQAPIVERSIONNEEDUPDATE = 10002, + ETIMAPIVERSIONNEEDUPDATE = 10004, +} QQApiSendResultCode; + +#pragma mark - QQApiObject(分享对象类型) + +// QQApiObject control flags +enum +{ + kQQAPICtrlFlagQZoneShareOnStart = 0x01, + kQQAPICtrlFlagQZoneShareForbid = 0x02, + kQQAPICtrlFlagQQShare = 0x04, + kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏 + kQQAPICtrlFlagQQShareDataline = 0x10, //数据线 +}; + +// 分享到QQ或TIM +typedef enum ShareDestType { + ShareDestTypeUnknown, + ShareDestTypeQQ, + ShareDestTypeTIM, +}ShareDestType; + +// QQApiObject +/** \brief 所有在QQ及插件间发送的数据对象的根类。 + */ +__attribute__((visibility("default"))) @interface QQApiObject : NSObject +@property(nonatomic,retain) NSString* title; ///< 标题,最长128个字符 +@property(nonatomic,retain) NSString* description; ///<简要描述,最长512个字符 + +@property (nonatomic, assign) uint64_t cflag; +@property (nonatomic, assign) ShareDestType shareDestType; //分享到QQ或TIM,必须指定 +@end + +// QQApiResultObject +/** \brief 用于请求回应的数据类型。 +

可能错误码及描述如下:

+ + + + + + + + +
errorerrorDescription注释
0nil成功
-1param error参数错误
-2group code is invalid该群不在自己的群列表里面
-3upload photo failed上传图片失败
-4user give up the current operation用户放弃当前操作
-5client internal error客户端内部处理错误
+ */ +__attribute__((visibility("default"))) @interface QQApiResultObject : QQApiObject +@property(nonatomic,retain) NSString* error; ///<错误 +@property(nonatomic,retain) NSString* errorDescription; ///<错误描述 +@property(nonatomic,retain) NSString* extendInfo; ///<扩展信息 +@end + +// QQApiTextObject +/** \brief 文本对象 + */ +@interface QQApiTextObject : QQApiObject +@property(nonatomic,retain)NSString* text; ///<文本内容,必填,最长1536个字符 + +-(id)initWithText:(NSString*)text; ///<初始化方法 ++(id)objectWithText:(NSString*)text;///<工厂方法,获取一个QQApiTextObject对象. +@end + +// QQApiURLObject +typedef enum QQApiURLTargetType{ + QQApiURLTargetTypeNotSpecified = 0x00, + QQApiURLTargetTypeAudio = 0x01, + QQApiURLTargetTypeVideo = 0x02, + QQApiURLTargetTypeNews = 0x03 +}QQApiURLTargetType; + +/** @brief URL对象类型。 + + 包括URL地址,URL地址所指向的目标类型及预览图像。 + */ +__attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject +/** + URL地址所指向的目标类型. + @note 参见QQApi.h 中的 QQApiURLTargetType 定义. + */ +@property(nonatomic)QQApiURLTargetType targetContentType; + +@property(nonatomic,retain)NSURL* url; ///QQApiExtendObject对象 + @param data 数据内容 + @param previewImageData 用于预览的图片 + @param title 标题 + @param description 此对象,分享的描述 + @return + 一个自动释放的QQApiExtendObject实例 + */ ++ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description; + +/** + helper方法获取一个autorelease的QQApiExtendObject对象 + @param data 数据内容 + @param previewImageData 用于预览的图片 + @param title 标题 + @param description 此对象,分享的描述 + @param imageDataArray 发送的多张图片队列 + @return + 一个自动释放的QQApiExtendObject实例 + */ ++ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray; + +@end + +// QQApiImageObject +/** @brief 图片对象 + 用于分享图片内容的对象,是一个指定为图片类型的QQApiExtendObject + */ +@interface QQApiImageObject : QQApiExtendObject +@end + +// QQApiImageArrayForQZoneObject +/** @brief 图片对象 + 用于分享图片到空间,走写说说路径,是一个指定为图片类型的,当图片数组为空时,默认走文本写说说QQApiObject + */ +@interface QQApiImageArrayForQZoneObject : QQApiObject + +@property(nonatomic,retain) NSArray* imageDataArray;///图片数组 + +/** + 初始化方法 + @param imageDataArray 图片数组 + @param title 写说说的内容,可以为空 + */ +- (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title; + +/** + helper方法获取一个autorelease的QQApiExtendObject对象 + @param title 写说说的内容,可以为空 + @param imageDataArray 发送的多张图片队列 + @return + 一个自动释放的QQApiExtendObject实例 + */ ++ (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title; + +@end + +// QQApiVideoForQZoneObject +/** @brief 视频对象 + 用于分享视频到空间,走写说说路径QQApiObject + assetURL可传ALAsset的ALAssetPropertyAssetURL,或者PHAsset的localIdentifier + */ +@interface QQApiVideoForQZoneObject : QQApiObject + +@property(nonatomic, retain) NSString *assetURL; + +- (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title; + ++ (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title; + +@end + +// QQApiWebImageObject +/** @brief 图片对象 + 用于分享网络图片内容的对象,是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持, + 原有的手q分享是不支持该类型的。 + */ +@interface QQApiWebImageObject : QQApiObject + +@property(nonatomic, retain) NSURL *previewImageURL; ///<预览图像URL + +/** + 初始化方法 + @param previewImageURL 用于预览的图片 + @param title 标题 + @param description 此对象,分享的描述 + */ +- (id)initWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; + +/** + helper方法获取一个autorelease的QQApiWebImageObject对象 + @param previewImageURL 用于预览的图片 + @param title 标题 + @param description 此对象,分享的描述 + */ ++ (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description; + +@end + +// QQApiGroupTribeImageObject +/** @brief 群部落图片对象 + 用于分享图片内容的对象,是一个指定为图片类型的 可以指定一些其他的附加数据QQApiExtendObject + */ +@interface QQApiGroupTribeImageObject : QQApiImageObject +{ + NSString *_bid; + NSString *_bname; +} +// 群部落id +@property (nonatomic, retain)NSString* bid; + +// 群部落名称 +@property (nonatomic, retain)NSString* bname; + +@end + + +//QQApiFileObject +/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能) + 用于分享文件内容的对象,是一个指定为文件类型的QQApiExtendObject + */ +@interface QQApiFileObject : QQApiExtendObject +{ + NSString* _fileName; +} +@property(nonatomic, retain)NSString* fileName; +@end + +// QQApiAudioObject +/** @brief 音频URL对象 + 用于分享目标内容为音频的URL的对象 + */ +@interface QQApiAudioObject : QQApiURLObject + +@property (nonatomic, retain) NSURL *flashURL; ///<音频URL地址,最长512个字符 + +/** + 获取一个autorelease的QQApiAudioObject + @param url 音频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param data 分享内容的预览图像 + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; + +/** + 获取一个autorelease的QQApiAudioObject + @param url 音频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param previewURL 分享内容的预览图像URL + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; + +@end + +// QQApiVideoObject +/** @brief 视频URL对象 + 用于分享目标内容为视频的URL的对象 + + QQApiVideoObject类型的分享,目前在Android和PC QQ上接收消息时,展现有待完善,待手机QQ版本以后更新支持 + 目前如果要分享视频,推荐使用 QQApiNewsObject 类型 + */ +@interface QQApiVideoObject : QQApiURLObject + +@property (nonatomic, retain) NSURL *flashURL; ///<视频URL地址,最长512个字符 + +/** + 获取一个autorelease的QQApiVideoObject + @param url 视频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param data 分享内容的预览图像 + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; + +/** + 获取一个autorelease的QQApiVideoObject + @param url 视频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param previewURL 分享内容的预览图像URL + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; + +@end + +// QQApiNewsObject +/** @brief 新闻URL对象 + 用于分享目标内容为新闻的URL的对象 + */ +@interface QQApiNewsObject : QQApiURLObject +/** + 获取一个autorelease的QQApiNewsObject + @param url 视频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param data 分享内容的预览图像 + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data; + +/** + 获取一个autorelease的QQApiNewsObject + @param url 视频内容的目标URL + @param title 分享内容的标题 + @param description 分享内容的描述 + @param previewURL 分享内容的预览图像URL + @note 如果url为空,调用QQApi#sendMessage:时将返回FALSE + */ ++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL; + +@end + +// QQApiPayObject +/** \brief 支付对象 + */ +@interface QQApiPayObject : QQApiObject +@property(nonatomic,retain)NSString* OrderNo; ///<支付订单号,必填 +@property(nonatomic,retain)NSString* AppInfo; ///<支付来源信息,必填 + +-(id)initWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo; ///<初始化方法 ++(id)objectWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo;///<工厂方法,获取一个QQApiPayObject对象. +@end + +// QQApiCommonContentObject; +/** @brief 通用模板类型对象 + 用于分享一个固定显示模板的图文混排对象 + @note 图片列表和文本列表不能同时为空 + */ +@interface QQApiCommonContentObject : QQApiObject +/** + 预定义的界面布局类型 + */ +@property(nonatomic,assign) unsigned int layoutType; +@property(nonatomic,assign) NSData* previewImageData;///<预览图 +@property(nonatomic,retain) NSArray* textArray;///<文本列表 +@property(nonatomic,retain) NSArray* pictureDataArray;///<图片列表 ++(id)objectWithLayoutType:(int)layoutType textArray:(NSArray*)textArray pictureArray:(NSArray*)pictureArray previewImageData:(NSData*)data; +/** + 将一个NSDictionary对象转化为QQApiCommomContentObject,如果无法转换,则返回空 + */ ++(id)objectWithDictionary:(NSDictionary*)dic; +-(NSDictionary*)toDictionary; +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Ad item object definition +//////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** @brief 广告数据对象 + */ +@interface QQApiAdItem : NSObject +@property(nonatomic,retain) NSString* title; ///<名称 +@property(nonatomic,retain) NSString* description;///<描述 +@property(nonatomic,retain) NSData* imageData;///<广告图片 +@property(nonatomic,retain) NSURL* target;///<广告目标链接 +@end + +// QQApiWPAObject +/** \brief 发起WPA对象 + */ +@interface QQApiWPAObject : QQApiObject +@property(nonatomic,retain)NSString* uin; ///<想要对话的QQ号 + +-(id)initWithUin:(NSString*)uin; ///<初始化方法 ++(id)objectWithUin:(NSString*)uin;///<工厂方法,获取一个QQApiWPAObject对象. +@end + +// QQApiAddFriendObject +/** \brief 添加好友 + */ +@interface QQApiAddFriendObject : QQApiObject +@property (nonatomic,retain)NSString* openID; +@property (nonatomic,retain)NSString* subID; +@property (nonatomic,retain)NSString* remark; + +-(id)initWithOpenID:(NSString*)openID; ///<初始化方法 ++(id)objecWithOpenID:(NSString*)openID; ///<工厂方法,获取一个QQApiAddFriendObject对象. + +@end + +// QQApiGameConsortiumBindingGroupObject +/** \brief 游戏公会绑定群 + */ +@interface QQApiGameConsortiumBindingGroupObject : QQApiObject +@property (nonatomic,retain)NSString* signature; +@property (nonatomic,retain)NSString* unionid; +@property (nonatomic,retain)NSString* zoneID; +@property (nonatomic,retain)NSString* appDisplayName; + +-(id)initWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<初始化方法 ++(id)objectWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<工厂方法,获取一个QQApiAddFriendObject对象. + +@end + +// QQApiGameConsortiumBindingGroupObject +/** \brief 加入群 + */ +@interface QQApiJoinGroupObject : QQApiObject +@property (nonatomic,retain)NSString* groupUin; +@property (nonatomic,retain)NSString* groupKey; + +- (id)initWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<初始化方法 ++ (id)objectWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<同时提供群号和群KEY 工厂方法,获取一个QQApiAddFriendObject对象. ++ (id)objectWithGroupKey:(NSString*)groupKey; ///<只需要群的KEY 工厂方法,获取一个QQApiAddFriendObject对象. + +@end + +// QQApiGroupChatObject +/** \brief 发起群会话对象 + */ +@interface QQApiGroupChatObject : QQApiObject +@property(nonatomic,retain)NSString* groupID; ///<想要对话的群号 + +-(id)initWithGroup:(NSString*)groupID; ///<初始化方法 ++(id)objectWithGroup:(NSString*)groupID;///<工厂方法,获取一个QQApiGroupChatObject对象. +@end + +#pragma mark - QQApi请求消息类型 + +/** + QQApi请求消息类型 + */ +enum QQApiInterfaceReqType +{ + EGETMESSAGEFROMQQREQTYPE = 0, ///< 手Q -> 第三方应用,请求第三方应用向手Q发送消息 + ESENDMESSAGETOQQREQTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用向手Q分享消息 + ESHOWMESSAGEFROMQQREQTYPE = 2 ///< 手Q -> 第三方应用,请求第三方应用展现消息中的数据 +}; + +/** + QQApi应答消息类型 + */ +enum QQApiInterfaceRespType +{ + ESHOWMESSAGEFROMQQRESPTYPE = 0, ///< 第三方应用 -> 手Q,第三方应用应答消息展现结果 + EGETMESSAGEFROMQQRESPTYPE = 1, ///< 第三方应用 -> 手Q,第三方应用回应发往手Q的消息 + ESENDMESSAGETOQQRESPTYPE = 2 ///< 手Q -> 第三方应用,手Q应答处理分享消息的结果 +}; + +/** + QQApi请求消息基类 + */ +@interface QQBaseReq : NSObject + +/** 请求消息类型,参见\ref QQApiInterfaceReqType */ +@property (nonatomic, assign) int type; + +@end + +/** + QQApi应答消息基类 + */ +@interface QQBaseResp : NSObject + +/** 请求处理结果 */ +@property (nonatomic, copy) NSString* result; + +/** 具体错误描述信息 */ +@property (nonatomic, copy) NSString* errorDescription; + +/** 应答消息类型,参见\ref QQApiInterfaceRespType */ +@property (nonatomic, assign) int type; + +/** 扩展信息 */ +@property (nonatomic, assign) NSString* extendInfo; + +@end + +/** + GetMessageFromQQReq请求帮助类 + */ +@interface GetMessageFromQQReq : QQBaseReq + +/** + 创建一个GetMessageFromQQReq请求实例 + */ ++ (GetMessageFromQQReq *)req; + +@end + +/** + GetMessageFromQQResp应答帮助类 + */ +@interface GetMessageFromQQResp : QQBaseResp + +/** + 创建一个GetMessageFromQQResp应答实例 + \param message 具体分享消息实例 + \return 新创建的GetMessageFromQQResp应答实例 + */ ++ (GetMessageFromQQResp *)respWithContent:(QQApiObject *)message; + +/** 具体分享消息 */ +@property (nonatomic, retain) QQApiObject *message; + +@end + +/** + SendMessageToQQReq请求帮助类 + */ +@interface SendMessageToQQReq : QQBaseReq + +/** + 创建一个SendMessageToQQReq请求实例 + \param message 具体分享消息实例 + \return 新创建的SendMessageToQQReq请求实例 + */ ++ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message; + +/** 具体分享消息 */ +@property (nonatomic, retain) QQApiObject *message; + +@end + +/** + SendMessageToQQResp应答帮助类 + */ +@interface SendMessageToQQResp : QQBaseResp + +/** + 创建一个SendMessageToQQResp应答实例 + \param result 请求处理结果 + \param errDesp 具体错误描述信息 + \param extendInfo 扩展信息 + \return 新创建的SendMessageToQQResp应答实例 + */ ++ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString*)extendInfo; + +@end + +/** + ShowMessageFromQQReq请求帮助类 + */ +@interface ShowMessageFromQQReq : QQBaseReq + +/** + 创建一个ShowMessageFromQQReq请求实例 + \param message 具体待展现消息实例 + \return 新创建的ShowMessageFromQQReq请求实例 + */ ++ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message; + +/** 具体待展现消息 */ +@property (nonatomic, retain) QQApiObject *message; + +@end + +/** + ShowMessageFromQQResp应答帮助类 + */ +@interface ShowMessageFromQQResp : QQBaseResp + +/** + 创建一个ShowMessageFromQQResp应答实例 + \param result 展现消息结果 + \param errDesp 具体错误描述信息 + \return 新创建的ShowMessageFromQQResp应答实例 + */ ++ (ShowMessageFromQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp; + +@end + +#endif diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentApiInterface.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentApiInterface.h new file mode 100644 index 0000000..958226c --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentApiInterface.h @@ -0,0 +1,104 @@ +// +// TencentMessage.h +// TencentOpenApi_IOS +// +// Created by qqconnect on 13-5-29. +// Copyright (c) 2013年 Tencent. All rights reserved. +// + +#ifndef QQ_OPEN_SDK_LITE + +#import +#import "TencentMessageObject.h" + +typedef enum +{ + kIphoneQQ, + kIphoneQZONE, + kIphoneTIM, + kThirdApp, +} +TecnentPlatformType; + +typedef enum +{ + kTencentApiSuccess, + kTencentApiPlatformUninstall, + kTencentApiPlatformNotSupport, + kTencentApiParamsError, + kTencentApiFail, +} +TencentApiRetCode; + +@class TencentApiReq; +@class TencentApiResp; + +/** + * \brief TencentApiInterface的回调 + * + * TencentApiInterface的回调接口 + * \note v1.0版本只支持腾讯业务拉起第三方请求内容 + */ +@protocol TencentApiInterfaceDelegate + +@optional +/** + * 请求获得内容 当前版本只支持第三方相应腾讯业务请求 + */ +- (BOOL)onTencentReq:(TencentApiReq *)req; + +/** + * 响应请求答复 当前版本只支持腾讯业务相应第三方的请求答复 + */ +- (BOOL)onTencentResp:(TencentApiResp *)resp; + +@end + +/** + * \brief TencentApiInterface的回调 + * + * TencentApiInterface的调用接口 + * \note v1.0版本只支持第三方答复内容 + */ +@interface TencentApiInterface : NSObject + +/** + * 发送答复返回腾讯业务 + * \param resp 答复内容 + * \return 返回码 + */ ++ (TencentApiRetCode)sendRespMessageToTencentApp:(TencentApiResp *)resp; + +/** + * 是否可以处理拉起协议 + * \param url + * \param delegate 指定的回调 + * \return 是否是腾讯API认识的消息类型 + */ ++ (BOOL)canOpenURL:(NSURL *)url delegate:(id)delegate; + +/** + * 处理应用拉起协议 + * \param url + * \param delegate 指定的回调 + * \return 是否是腾讯API认识的消息类型 + */ ++ (BOOL)handleOpenURL:(NSURL *)url delegate:(id)delegate; + +/** + * 用户设备是否安装腾讯APP + * \param platform 指定的腾讯业务 + * \return YES:安装 NO:未安装 + */ ++ (BOOL)isTencentAppInstall:(TecnentPlatformType)platform; + +/** + * 用户设备是否支持调用SDK + * \param platform 指定的腾讯业务 + * \return YES:支持 NO:不支持 + */ ++ (BOOL)isTencentAppSupportTencentApi:(TecnentPlatformType)platform; + +@end + +#endif diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentMessageObject.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentMessageObject.h new file mode 100644 index 0000000..f89ff90 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentMessageObject.h @@ -0,0 +1,412 @@ +// +// TencentMessageObject.h +// TencentOpenApi_IOS +// +// Created by qqconnect on 13-5-27. +// Copyright (c) 2013年 Tencent. All rights reserved. +// + +#ifndef QQ_OPEN_SDK_LITE + +#import +#import +#import "sdkdef.h" + +#define kTextLimit (1024 * 1024) +#define kDataLimit (1024 * 1024 * 10) +#define kPreviewDataLimit (1024 * 1024) + +@class TencentApiReq; +@class TencentApiResp; + +/** + * 必填的NSArray型参数 + */ +typedef NSArray *TCRequiredArray; + +/** + * 必填的NSDictionary型参数 + */ +typedef NSDictionary *TCRequiredDictionary; + +/** + * 必填的TencentApiReq型参数 + */ +typedef TencentApiReq *TCRequiredReq; + +/** + * 可选的UIImage类型参数 + */ +typedef NSData *TCOptionalData; + + +/** + * 可选的NSArray型参数 + */ +typedef NSArray *TCOptionalArray; + +/** + * 可选的TencentApiReq型参数 + */ +typedef TencentApiReq *TCOptionalReq; + +/** + * TencentReqMessageType 请求类型枚举参数 + */ +typedef enum +{ + /** TX APP请求内容填充(需要第三方开发者填充完成内容后需要主动调用sendRespMessageToTencentApp)*/ + ReqFromTencentAppQueryContent, + /** TX APP请求展现内容 (不用调用答复) */ + ReqFromTencentAppShowContent, + /** 第三方 APP 请求内容 */ + ReqFromThirdAppQueryContent, + /** 第三方 APP 请求展现内容(类似分享)*/ + ReqFromThirdAppShowContent, +} +TencentReqMessageType; + +typedef enum +{ + RespFromTencentAppQueryContent, + RespFromTencentAppShowContent, + RespFromThirdAppQueryContent, + RespFromThirdAppShowContent, +} +TencentRespMessageType; + +/** + * TencentObjVersion 腾讯API消息类型枚举 + */ +typedef enum +{ + /** 文本类型 */ + TencentTextObj, + /** 图片类型 */ + TencentImageObj, + /** 音频类型 */ + TencentAudioObj, + /** 视频类型 */ + TencentVideoObj, + /** 图片视频类 */ + TencentImageAndVideoObj, +} +TencentObjVersion; + +/** + * \brief 请求包 + * + * TencentApiReq用来向其他业务发送请求包 + */ +@interface TencentApiReq : NSObject + +/** + * 根据序列号生成一个请求包 + * \param apiSeq 请求序列号 + * \param type 请求类型 + * \return tencentApiReq实例 + */ ++ (TencentApiReq *)reqFromSeq:(NSInteger)apiSeq type:(TencentReqMessageType)type; + +/** 请求类型 */ +@property (readonly, assign, nonatomic)TCRequiredInt nMessageType; + +/** 请求平台 */ +@property (readonly, assign, nonatomic)NSInteger nPlatform; + +/** 请求的SDK版本号 */ +@property (readonly, assign, nonatomic)NSInteger nSdkVersion; + +/** 请求序列号 */ +@property (readonly, assign, nonatomic)TCRequiredInt nSeq; + +/** 第三方的APPID */ +@property (nonatomic, retain)TCRequiredStr sAppID; + +/** 请求内容 TencentBaseMessageObj对象数组 */ +@property (nonatomic, retain)TCOptionalArray arrMessage; + +/** 请求的描述 可以用于告诉对方这个请求的特定场景 */ +@property (nonatomic, retain)TCOptionalStr sDescription; + +@end + +/** + * \brief 答复包 + * + * TencentApiResp用来向其他业务发送答复包 + */ +@interface TencentApiResp : NSObject + +/** + * 根据序列号生成一个答复包 + * \param req 答复对应的请求包(如果req不是TencentApiReq或者他的子类,会抛出异常) + * \return 答复包体 + */ ++ (TencentApiResp *)respFromReq:(TencentApiReq *)req; + +/** 返回码 */ +@property (nonatomic, assign)TCOptionalInt nRetCode; + +/** 返回消息 */ +@property (nonatomic, retain)TCOptionalStr sRetMsg; + +/** 答复对应的请求包 */ +@property (nonatomic, retain)TCOptionalReq objReq; + +@end + +/** + * \brief 消息体 + * + * TencentBaseMessageObj 应用之间传递消息体 + */ +@interface TencentBaseMessageObj : NSObject + +/** 消息类型 */ +@property (nonatomic, assign)NSInteger nVersion; + +/** 消息描述 */ +@property (nonatomic, retain)NSString *sName; + +/** 消息的扩展信息 主要是可以用来进行一些请求消息体的描述 譬如图片要求的width height 文字的关键字什么的, 也可以不用填写*/ +@property (nonatomic, retain)NSDictionary *dictExpandInfo; + +/** + * 消息是否有效 + */ +- (BOOL)isVaild; + +@end + +#pragma mark TencentTextMessage +/** + * \brief 文本的消息体 + * + * TencentTextMessageObjV1 应用之间传递的文本消息体 + */ +@interface TencentTextMessageObjV1 : TencentBaseMessageObj + +/** + * 文本 + * \note 文本长度不能超过4096个字 + */ +@property (nonatomic, retain) NSString *sText; + + +/** + * 初始化文本消息 + * \param text 文本 + * \return 初始化返回的文本消息 + */ +- (id)initWithText:(NSString *)text; + +@end + + +#pragma mark TecentImageMessage + +/** + * TencentApiImageSourceType 图片数据类型(请求方对数据类型可能会有限制) + */ +typedef enum +{ + /** 图片数据是url或二进制数据 */ + AllImage, + /** 图片数据是url */ + UrlImage, + /** 图片数据是二进制数据 */ + DataImage, +}TencentApiImageSourceType; + +/** + * \brief 图片的消息体 + * + * TencentImageMessageObjV1 应用之间传递的图片消息体 + */ +@interface TencentImageMessageObjV1 : TencentBaseMessageObj + +/** + * 图片数据 + * \note 图片不能大于10M + */ +@property (nonatomic, retain) NSData *dataImage; + +/** + * 缩略图的数据 + * \note 图片不能大于1M + */ +@property (nonatomic, retain) NSData *dataThumbImage; + +/** 图片URL */ +@property (nonatomic, retain) NSString *sUrl; + +/** 图片的描述 */ +@property (nonatomic, retain) NSString *sDescription; + +/** 图片的size */ +@property (nonatomic, assign) CGSize szImage; + +/** + * 图片来源 + * \note TencentApiImageSourceType对应的类型 + */ +@property (readonly, assign) NSInteger nType; + +/** + * 初始化图片消息 + * \param dataImage 图片类型 + * \return 初始化返回的图片消息 + */ +- (id)initWithImageData:(NSData *)dataImage; + +/** + * 初始化图片消息 + * \param url 图片url + * \return 初始化返回的图片消息 + */ +- (id)initWithImageUrl:(NSString *)url; + +/** + * 初始化图片消息 + * \param type 图片类型 + * \return 初始化返回的图片消息 + */ +- (id)initWithType:(TencentApiImageSourceType)type; +@end + + +#pragma mark TencentAudioMessage +/** + * \brief 音频的消息体 + * + * TencentAudioMessageObjV1 应用之间传递的音频消息体 + */ +@interface TencentAudioMessageObjV1 : TencentBaseMessageObj + +/** 音频URL */ +@property (nonatomic, retain) NSString *sUrl; + +/** + * 音频的预览图 + * \note图片不能大于1M + */ +@property (nonatomic, retain) NSData *dataImagePreview; + +/** 音频的预览图URL */ +@property (nonatomic, retain) NSString *sImagePreviewUrl; + +/** 音频的描述 */ +@property (nonatomic, retain) NSString *sDescription; + +/** + * 初始化图片消息 + * \param url 音频URL + * \return 初始化返回的音频消息 + */ +- (id)initWithAudioUrl:(NSString *)url; + +@end + + +#pragma mark TencentVideoMessage + +/** + * TencentApiVideoSourceType 视频数据类型(请求方对数据类型可能会有限制) + */ + +typedef enum +{ + /** 视频来源于本地或网络 */ + AllVideo, + /** 视频来源于本地 */ + LocalVideo, + /** 视频来源于网络 */ + NetVideo, +}TencentApiVideoSourceType; + +/** + * \brief 视频的消息体 + * + * TencentVideoMessageV1 应用之间传递的视频消息体 + */ +@interface TencentVideoMessageV1 : TencentBaseMessageObj + +/** + * 视频URL + * \note 不能超过1024 + */ +@property (nonatomic, retain) NSString *sUrl; + +/** + * 视频来源 主要是用来让发起方指定视频的来源 + * \note TencentApiVideoSourceType 对应的类型 只读参数 + */ +@property (readonly, assign, nonatomic) NSInteger nType; + +/** + * 视频的预览图 + * \note 图片不能大于1M + */ +@property (nonatomic, retain) NSData *dataImagePreview; + +/** 视频的预览图URL */ +@property (nonatomic, retain) NSString *sImagePreviewUrl; + +/** 视频的描述 */ +@property (nonatomic, retain) NSString *sDescription; + +/** + * 初始化视频消息 + * \param url 视频URL + * \param type 视频来源类型 + * \return 初始化返回的视频消息 + */ +- (id)initWithVideoUrl:(NSString *)url type:(TencentApiVideoSourceType)type; + + +/** + * 初始化视频消息 + * \param type 视频来源类型 + * \return 初始化返回的视频消息 + */ +- (id)initWithType:(TencentApiVideoSourceType)type; +@end + +#pragma mark TencentImageMessageObj +/** + * \brief 视频图片消息体 + * + * TencentVideoMessageV1 这是一个扩展的类 是一个图片视频类 + * \note 图片视频可以任选一个内容填充 但是注意只能填一个 当有一种类型被填充后 另外一个种类型就无法填充了 + */ +@interface TencentImageAndVideoMessageObjV1 : TencentBaseMessageObj + +/** 图片消息 */ +@property (nonatomic, retain) TencentImageMessageObjV1 *objImageMessage; + +/** 视频消息 */ +@property (nonatomic, retain) TencentVideoMessageV1 *objVideoMessage; + +/** + * 初始化图片消息 + * \param dataImage 图片数据 + * \param url 视频url + * \return 初始化返回的图片视频消息 + */ +- (id)initWithMessage:(NSData *)dataImage videoUrl:(NSString *)url; + +/** + * 设置图片 + * \param dataImage 图片数据 + */ +- (void)setDataImage:(NSData *)dataImage; + +/** + * 设置视频 + * \param videoUrl 视频URL + */ +- (void)setVideoUrl:(NSString *)videoUrl; +@end + +#endif diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h new file mode 100644 index 0000000..ed60e07 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuth.h @@ -0,0 +1,676 @@ +/// +/// \file TencentOAuth.h +/// \brief QQ互联开放平台授权登录及相关开放接口实现类 +/// +/// Created by Tencent on 12-12-21. +/// Copyright (c) 2012年 Tencent. All rights reserved. +/// + +#import +#import "sdkdef.h" +#import "TencentOAuthObject.h" +#import "TencentApiInterface.h" + +@protocol TencentSessionDelegate; +@protocol TencentLoginDelegate; +@protocol TencentApiInterfaceDelegate; +@protocol TencentWebViewDelegate; + +@class TencentApiReq; +@class TencentApiResp; + +typedef enum +{ + kTencentNotAuthorizeState, + kTencentSSOAuthorizeState, + kTencentWebviewAuthorzieState, +} TencentAuthorizeState; + +typedef enum +{ + kAuthModeClientSideToken, + kAuthModeServerSideCode, +} TencentAuthMode; + +#pragma mark - TencentOAuth(授权登录及相关开放接口调用) + +/** + * \brief TencentOpenAPI授权登录及相关开放接口调用 + * + * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用 + */ +@interface TencentOAuth : NSObject +{ + NSMutableDictionary* _apiRequests; + NSString* _accessToken; + NSDate* _expirationDate; + id _sessionDelegate; + NSString* _localAppId; + NSString* _openId; + NSString* _redirectURI; + NSArray* _permissions; +} + +/** Access Token凭证,用于后续访问各开放接口 */ +@property(nonatomic, copy) NSString* accessToken; + +/** Access Token的失效期 */ +@property(nonatomic, copy) NSDate* expirationDate; + +/** 已实现的开放接口的回调委托对象 */ +@property(nonatomic, assign) id sessionDelegate; + +/** 第三方应用在开发过程中设置的URLSchema,用于浏览器登录后后跳到第三方应用 */ +@property(nonatomic, copy) NSString* localAppId; + +/** 用户授权登录后对该用户的唯一标识 */ +@property(nonatomic, copy) NSString* openId; + +/** 用户登录成功过后的跳转页面地址 */ +@property(nonatomic, copy) NSString* redirectURI; + +/** 第三方应用在互联开放平台申请的appID */ +@property(nonatomic, retain) NSString* appId; + +/** 主要是互娱的游戏设置uin */ +@property(nonatomic, retain) NSString* uin; + +/** 主要是互娱的游戏设置鉴定票据 */ +@property(nonatomic, retain) NSString* skey; + +/** 登陆透传的数据 */ +@property(nonatomic, copy) NSDictionary* passData; + +/** 授权方式(Client Side Token或者Server Side Code) */ +@property(nonatomic, assign) TencentAuthMode authMode; + +/** union id */ +@property(nonatomic, retain) NSString* unionid; + +/** 第三方在授权登录/分享 时选择 QQ,还是TIM 。在授权前一定要指定其中一个类型*/ +@property(nonatomic, assign) TencentAuthShareType authShareType; + +/** + * 用来获得当前sdk的版本号 + * \return 返回sdk版本号 + **/ + ++ (NSString*)sdkVersion; + +/** + * 用来获得当前sdk的小版本号 + * \return 返回sdk小版本号 + **/ + ++ (NSString*)sdkSubVersion; + +/** + * 用来获得当前sdk的是否精简版 + * \return 返回YES表示精简版 + **/ + ++ (BOOL)isLiteSDK; + +/** + * 主要是用来帮助判断是否有登陆被发起,但是还没有过返回结果 + * \return + * kTencentNotAuthorizeState:无授权 + * kTencentSSOAuthorizeState:有人发起了sso授权但无返回 + * kTencentWebviewAuthorzieState:有人发起了webview授权还未返回 + **/ + ++ (TencentAuthorizeState *)authorizeState; + +/** + * 用来获得当前手机qq的版本号 + * \return 返回手机qq版本号 + **/ ++ (QQVersion)iphoneQQVersion; + + +/** + * 用来获得当前手机TIM的版本号 + * \return 返回手机qq版本号 + **/ ++ (QQVersion)iphoneTIMVersion; + +/** + * 初始化TencentOAuth对象 + * \param appId 第三方应用在互联开放平台申请的唯一标识 + * \param delegate 第三方应用用于接收请求返回结果的委托对象 + * \return 初始化后的授权登录对象 + */ +- (id)initWithAppId:(NSString *)appId + andDelegate:(id)delegate; + + +/** + * 判断用户手机上是否安装手机QQ + * \return YES:安装 NO:没安装 + */ ++ (BOOL)iphoneQQInstalled; + +/** + * 判断用户手机上是否安装手机TIM + * \return YES:安装 NO:没安装 + */ ++ (BOOL)iphoneTIMInstalled; + +/** + * 判断用户手机上的手机QQ是否支持SSO登录 + * \return YES:支持 NO:不支持 + */ ++ (BOOL)iphoneQQSupportSSOLogin; + +/** + * 判断用户手机上的手机TIM是否支持SSO登录 + * \return YES:支持 NO:不支持 + */ ++ (BOOL)iphoneTIMSupportSSOLogin; + +/** + * 判断用户手机上是否安装手机QZone + * \return YES:安装 NO:没安装 + */ ++ (BOOL)iphoneQZoneInstalled; + +/** + * 判断用户手机上的手机QZone是否支持SSO登录 + * \return YES:支持 NO:不支持 + */ ++ (BOOL)iphoneQZoneSupportSSOLogin; + +/** + * 登录授权 + * + * \param permissions 授权信息列 + */ +- (BOOL)authorize:(NSArray *)permissions; + +/** + * 登录授权 + * \param permissions 授权信息列表 + * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 + */ +- (BOOL)authorize:(NSArray *)permissions + inSafari:(BOOL)bInSafari; + +/** + * 登录授权 + * \param permissions 授权信息列表 + * \param localAppId 应用APPID + * \param bInSafari 是否使用safari进行登录.IOS SDK 1.3版本开始此参数废除 + */ +- (BOOL)authorize:(NSArray *)permissions + localAppId:(NSString *)localAppId + inSafari:(BOOL)bInSafari; + +/** + * 增量授权,因用户没有授予相应接口调用的权限,需要用户确认是否授权 + * \param permissions 需增量授权的信息列表 + * \return 增量授权调用是否成功 + */ +- (BOOL)incrAuthWithPermissions:(NSArray *)permissions; + +/** + * 重新授权,因token废除或失效导致接口调用失败,需用户重新授权 + * \param permissions 授权信息列表,同登录授权 + * \return 授权调用是否成功 + */ +- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions; + +/** + * 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户 + * \return NO未登录,信息不足;YES条件满足,发送请求成功,请等待回调 + */ +- (BOOL)RequestUnionId; + +/** + * (静态方法)处理应用拉起协议 + * \param url 处理被其他应用呼起时的逻辑 + * \return 处理结果,YES表示成功,NO表示失败 + */ ++ (BOOL)HandleOpenURL:(NSURL *)url; + +/** + * (静态方法)sdk是否可以处理应用拉起协议 + * \param url 处理被其他应用呼起时的逻辑 + * \return 处理结果,YES表示可以 NO表示不行 + */ ++ (BOOL)CanHandleOpenURL:(NSURL *)url; + +/** + * (静态方法)获取TencentOAuth调用的上一次错误信息 + */ ++ (NSString *)getLastErrorMsg; + +/** + * 以Server Side Code模式授权登录时,通过此接口获取返回的code值; + * 以Client Side Token模式授权登录时,忽略此接口。 + */ +- (NSString *)getServerSideCode; + +/** + * 退出登录(退出登录后,TecentOAuth失效,需要重新初始化) + * \param delegate 第三方应用用于接收请求返回结果的委托对象 + */ +- (void)logout:(id)delegate; + +/** + * 判断登录态是否有效 + * \return 处理结果,YES表示有效,NO表示无效,请用户重新登录授权 + */ +- (BOOL)isSessionValid; + +/** + * 获取用户个人信息 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)getUserInfo; + +/** + * SDK内置webview实现定向分享时,第三方应用可以根据应用是否在白名单里来开启该配置开关,默认为关闭; + * 在白名单里的应用调用该接口后,即打开sdk内置webview的二级白名单开关(相对与sdk后台的白名单), + * 那么在sdk后台白名单校验请求失败的情况下,会继续先尝试采用内置webview进行分享。 + */ +- (void)openSDKWebViewQQShareEnable; + + +/** + * 获取用户QZone相册列表 + * \attention 需\ref apply_perm + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)getListAlbum; + +/** + * 获取用户QZone相片列表 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCListPhotoDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)getListPhotoWithParams:(NSMutableDictionary *)params; + + +/** + * 分享到QZone + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddShareDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)addShareWithParams:(NSMutableDictionary *)params; + + +/** + * 上传照片到QZone指定相册 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCUploadPicDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)uploadPicWithParams:(NSMutableDictionary *)params; + +/** + * 在QZone相册中创建一个新的相册 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddAlbumDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)addAlbumWithParams:(NSMutableDictionary *)params; + +/** + * 检查是否是QZone某个用户的粉丝 + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCCheckPageFansDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)checkPageFansWithParams:(NSMutableDictionary *)params; + +/** + * 在QZone中发表一篇日志 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddOneBlogDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)addOneBlogWithParams:(NSMutableDictionary *)params; + +/** + * 在QZone中发表一条说说 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddTopicDic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)addTopicWithParams:(NSMutableDictionary *)params; + +/** + * 设置QQ头像 使用默认的效果处理设置头像的界面 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)setUserHeadpic:(NSMutableDictionary *)params; + + +/** + * 设置QQ头像 会返回设置头像由第三方自己处理界面的弹出方式 + * \attention 需\ref apply_perm + * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic + * \param viewController 设置头像的界面 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)setUserHeadpic:(NSMutableDictionary *)params andViewController:(UIViewController **)viewController; + +/** + * 获取QQ会员信息(仅包括是否为QQ会员,是否为年费QQ会员) + * \attention 需\ref apply_perm + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)getVipInfo; + +/** + * 获取QQ会员详细信息 + * \attention 需\ref apply_perm + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)getVipRichInfo; + +/** + * QZone定向分享,可以@到具体好友,完成后将触发responseDidReceived:forMessage:回调,message:“SendStory” + * \param params 参数字典 + * \param fopenIdArray 第三方应用预传人好友列表,好友以openid标识 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)sendStory:(NSMutableDictionary *)params friendList:(NSArray *)fopenIdArray; + +/** + * 发送应用邀请,完成后将触发responseDidReceived:forMessage:回调,message:“AppInvitation” + * \param desc 应用的描述文字,不超过35字符,如果为nil或@“”则显示默认描述 + * \param imageUrl 应用的图标,如果为nil或者@“”则显示默认图标 + * \param source 透传参数,由开发者自定义该参数内容 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)sendAppInvitationWithDescription:(NSString *)desc imageURL:(NSString *)imageUrl source:(NSString *)source; + +/** + * 发起PK或者发送炫耀,完成后将触发responseDidReceived:forMessage:回调,message:“AppChallenge” + * \param receiver 必须指定一位进行PK或者炫耀的好友,填写其OpenID,填写多个OpenID将截取第一个 + * \param type 类型,"pk"或者“brag” + * \param imageUrl 炫耀/挑战场景图的URL + * \param message 炫耀/挑战中的内容描述,不超过50个字符,超过限制则自动截断 + * \param source 透传参数,由开发者自定义该参数内容 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)sendChallenge:(NSString *)receiver type:(NSString *)type imageURL:(NSString *)imageUrl message:(NSString *)message source:(NSString *)source; + +/** + * 赠送或者请求礼物,完成后将触发responseDidReceived:forMessage:回调,message:“AppGiftRequest” + * \param receiver 赠送或者请求礼物的好友的OpenID,支持填写多个,OpenID之用","分隔,为nil时将由用户通过好友选择器选择好友 + * \param exclude 用户通过好友选择器选择好友场景下,希望排除的好友(不显示在好友选择器) + * \param specified 用户通过好友选择器选择好友场景下,希望出现的指定好友 + * \param only 是否只显示specified指定的好友 + * \param type 类型,"request"或者“freegift” + * \param title 免费礼物或请求名称,不超过6个字符 + * \param message 礼物或请求的默认赠言,控制在35个汉字以内,超过限制自动截断 + * \param imageUrl 请求或礼物配图的URL,如果不传,则默认在弹框中显示应用的icon + * \param source 透传参数,由开发者自定义该参数内容 + * \return 处理结果,YES表示API调用成功,NO表示API调用失败,登录态失败,重新登录 + */ +- (BOOL)sendGiftRequest:(NSString *)receiver exclude:(NSString *)exclude specified:(NSString *)specified only:(BOOL)only type:(NSString *)type title:(NSString *)title message:(NSString *)message imageURL:(NSString *)imageUrl source:(NSString *)source; + + +/** + * 退出指定API调用 + * \param userData 用户调用某条API的时候传入的保留参数 + * \return 处理结果,YES表示成功 NO表示失败 + */ +- (BOOL)cancel:(id)userData; + +/** + * CGI类任务创建接口 + * \param apiURL CGI请求的URL地址 + * \param method CGI请求方式:"GET","POST" + * \param params CGI请求参数字典 + * \param callback CGI请求结果的回调接口对象 + * \return CGI请求任务实例,用于取消任务,返回nil代表任务创建失败 + */ +- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id)callback; + +/** + * TencentOpenApi发送任务统一接口 + * \param request 请求发送的任务 + * \param callback 任务发送后的回调地址 + */ +- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id)callback; + +- (NSString *)getUserOpenID; + +@end + +#pragma mark - TencentLoginDelegate(授权登录回调协议) + +/** + * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议 + * + * 第三方应用实现登录的回调协议 + */ +@protocol TencentLoginDelegate + +@required + +/** + * 登录成功后的回调 + */ +- (void)tencentDidLogin; + +/** + * 登录失败后的回调 + * \param cancelled 代表用户是否主动退出登录 + */ +- (void)tencentDidNotLogin:(BOOL)cancelled; + +/** + * 登录时网络有问题的回调 + */ +- (void)tencentDidNotNetWork; + +@optional +/** + * 登录时权限信息的获得 + */ +- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams; + +/** + * unionID获得 + */ +- (void)didGetUnionID; + +@end + +#pragma mark - TencentSessionDelegate(开放接口回调协议) + +/** + * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议 + * + * 第三方应用需要实现每条需要调用的API的回调协议 + */ +@protocol TencentSessionDelegate + +@optional + +/** + * 退出登录的回调 + */ +- (void)tencentDidLogout; + +/** + * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。 + * \param tencentOAuth 登录授权对象。 + * \param permissions 需增量授权的权限列表。 + * \return 是否仍然回调返回原始的api请求结果。 + * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号 + */ +- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions; + +/** + * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。 + * \param tencentOAuth 登录授权对象。 + * \return 是否仍然回调返回原始的api请求结果。 + * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号 + */ +- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth; + +/** + * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。 + * \param tencentOAuth token及有效期限等信息更新后的授权实例对象 + * \note 第三方应用需更新已保存的token及有效期限等信息。 + */ +- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth; + +/** + * 用户增量授权过程中因取消或网络问题导致授权失败 + * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType + */ +- (void)tencentFailedUpdate:(UpdateFailType)reason; + +/** + * 获取用户个人信息回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success + * 错误返回示例: \snippet example/getUserInfoResponse.exp fail + */ +- (void)getUserInfoResponse:(APIResponse*) response; + + +/** + * 获取用户QZone相册列表回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/getListAlbumResponse.exp success + * 错误返回示例: \snippet example/getListAlbumResponse.exp fail + */ +- (void)getListAlbumResponse:(APIResponse*) response; + +/** + * 获取用户QZone相片列表 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/getListPhotoResponse.exp success + * 错误返回示例: \snippet example/getListPhotoResponse.exp fail + */ +- (void)getListPhotoResponse:(APIResponse*) response; + +/** + * 检查是否是QZone某个用户的粉丝回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/checkPageFansResponse.exp success + * 错误返回示例: \snippet example/checkPageFansResponse.exp fail + */ +- (void)checkPageFansResponse:(APIResponse*) response; + +/** + * 分享到QZone回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/addShareResponse.exp success + * 错误返回示例: \snippet example/addShareResponse.exp fail + */ +- (void)addShareResponse:(APIResponse*) response; + +/** + * 在QZone相册中创建一个新的相册回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/addAlbumResponse.exp success + * 错误返回示例: \snippet example/addAlbumResponse.exp fail + */ +- (void)addAlbumResponse:(APIResponse*) response; + +/** + * 上传照片到QZone指定相册回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/uploadPicResponse.exp success + * 错误返回示例: \snippet example/uploadPicResponse.exp fail + */ +- (void)uploadPicResponse:(APIResponse*) response; + + +/** + * 在QZone中发表一篇日志回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/addOneBlogResponse.exp success + * 错误返回示例: \snippet example/addOneBlogResponse.exp fail + */ +- (void)addOneBlogResponse:(APIResponse*) response; + +/** + * 在QZone中发表一条说说回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/addTopicResponse.exp success + * 错误返回示例: \snippet example/addTopicResponse.exp fail + */ +- (void)addTopicResponse:(APIResponse*) response; + +/** + * 设置QQ头像回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/setUserHeadpicResponse.exp success + * 错误返回示例: \snippet example/setUserHeadpicResponse.exp fail + */ +- (void)setUserHeadpicResponse:(APIResponse*) response; + +/** + * 获取QQ会员信息回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \remarks 正确返回示例: \snippet example/getVipInfoResponse.exp success + * 错误返回示例: \snippet example/getVipInfoResponse.exp fail + */ +- (void)getVipInfoResponse:(APIResponse*) response; + +/** + * 获取QQ会员详细信息回调 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + */ +- (void)getVipRichInfoResponse:(APIResponse*) response; + +/** + * sendStory分享的回调(已废弃,使用responseDidReceived:forMessage:) + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + */ +- (void)sendStoryResponse:(APIResponse*) response; + + +/** + * 社交API统一回调接口 + * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse + * \param message 响应的消息,目前支持‘SendStory’,‘AppInvitation’,‘AppChallenge’,‘AppGiftRequest’ + */ +- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message; + +/** + * post请求的上传进度 + * \param tencentOAuth 返回回调的tencentOAuth对象 + * \param bytesWritten 本次回调上传的数据字节数 + * \param totalBytesWritten 总共已经上传的字节数 + * \param totalBytesExpectedToWrite 总共需要上传的字节数 + * \param userData 用户自定义数据 + */ +- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData; + + +/** + * 通知第三方界面需要被关闭 + * \param tencentOAuth 返回回调的tencentOAuth对象 + * \param viewController 需要关闭的viewController + */ +- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController; + +@end + +#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调) + +/** + * \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议 + * + * 第三方应用可以根据自己APP的旋转方向限制,通过此协议设置 + */ +@protocol TencentWebViewDelegate +@optional +- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation; +- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit; +- (BOOL) tencentWebViewShouldAutorotateWithWebkit; +@end diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuthObject.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuthObject.h new file mode 100644 index 0000000..2fc3a65 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/TencentOAuthObject.h @@ -0,0 +1,452 @@ +/// +/// \file TencentOAuthObject.h +/// 对开放接口的调用提供参数字典封装的辅助类 +/// +/// Created by Tencent on 12-12-28. +/// Copyright (c) 2012年 Tencent. All rights reserved. +/// + +#import +#import +#import "sdkdef.h" + + +#pragma mark - +#pragma mark TCAddTopicDic + +/** + * \brief 发表说说的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCAddTopicDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCAddTopicDic *) dictionary; + +/** + * 发布心情时引用的信息的类型。 + * \note 1表示图片; 2表示网页; 3表示视频 + */ +@property (nonatomic, retain) TCOptionalStr paramRichtype; + +/** + * 发布心情时引用的信息的值。有richtype时必须有richval + * + * \note + * -# 当richtype为图片(即richtype为1,应用场景为发布心情时引用某张图片)时,\n + * richval需要传入该图片的相关参数。引用的图片来源分为两种:一种为网站图片,\n + * 一种为QQ空间相册中的某张图片。 + * - 当引用的图片来自网站,richval包含下列参数的值:\n + * | 参数名称 | 是否必须 | 类型 | 描述 | + * | ------ | ------- | ------ | ----------------- | + * | url | 必须 | string | 网站图片的URL | + * | height | 必须 | string | 图片高度,单位: px | + * | width | 必须 | string | 图片宽度,单位: px | + * \n + * 输入时每个值中间用“&”分隔,如下所示:\n + * “url=http://qq.com/logo.png&width=25&height=21” + * + * - 当引用的图片来自QQ空间相册,richval包含下列参数的值。\n + * 这些值都需要通过调用相册OpenAPI来获得。参数意义如下:\n + * | 参数名称 | 是否必须 | 类型 | 描述 | + * | --------- | ------ | ------ | ---------------------------------- | + * | albumid | 必须 | string | 图片所属空间相册的ID | + * | pictureid | 必须 | string | 图片ID | + * | sloc | 必须 | string | 小图ID | + * | pictype | | string | 图片类型(JPG = 1;GIF = 2;PNG = 3) | + * | picheight | | string | 图片高度,单位: px | + * | picwidth | | string | 图片宽度,单位: px | + * 输入时每个值中间用逗号分隔,如下所示 :\n + * “albumid,pictureid,sloc,pictype,picheight,picwidth” + * -# 当richtype为网页(即richtype为2,应用场景为针对某网页发表评论)时,\n + * richval需要传入该网页的URL,发表为feeds时,后台会自动将该URL转换为短URL。 + * -# 当richtype为视频(即richtype为3,应用场景为针对某视频发表评论)时,\n + * richval需要传入该视频的URL,发表为feeds时,后台会对该URL进行解析,\n + * 在feeds上显示播放器,视频源及缩略图。 + */ +@property (nonatomic, retain) TCOptionalStr paramRichval; + +/** + * 发布的心情的内容。 + */ +@property (nonatomic, retain) TCRequiredStr paramCon; + +/** + * 地址文。例如:广东省深圳市南山区高新科技园腾讯大厦。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 + */ +@property (nonatomic, retain) TCOptionalStr paramLbs_nm; + +/** + * 经度。-180.0到+180.0,+表示东经。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 + */ +@property (nonatomic, retain) TCOptionalStr paramLbs_x; + +/** + * 纬度。-90.0到+90.0,+表示北纬。lbs_nm,lbs_x,lbs_y通常一起使用,来明确标识一个地址。 + */ +@property (nonatomic, retain) TCOptionalStr paramLbs_y; + +/** + * 第三方应用的平台类型。 + * \note 1表示QQ空间; 2表示腾讯朋友; 3表示腾讯微博平台; 4表示腾讯Q+平台。 + */ +@property (nonatomic, retain) TCOptionalStr paramThirdSource; +@end + + +#pragma mark - +#pragma mark TCAddOneBlogDic +/** + * \brief 发表日志的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCAddOneBlogDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCAddOneBlogDic *) dictionary; + +/** + * 日志标题(纯文本,最大长度128个字节,utf-8编码)。 + */ +@property (nonatomic, retain) TCRequiredStr paramTitle; + +/** + * content 文章内容(html数据,最大长度100*1024个字节,utf-8编码) + */ +@property (nonatomic, retain) TCRequiredStr paramContent; +@end + +#pragma mark - +#pragma mark TCAddAlbumDic +/** + * \brief 创建空间相册的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCAddAlbumDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCAddAlbumDic *) dictionary; + +/** + * albumname 必须 string 相册名 不能超过30个字符。 + */ +@property (nonatomic, retain) TCRequiredStr paramAlbumname; + + +/** + * albumdesc string 相册描述,不能超过200个字符。 + */ +@property (nonatomic, retain) TCOptionalStr paramAlbumdesc; + +/** + * priv string 相册权限 + * + * \note 其取值含义为: 1=公开;3=只主人可见; 4=QQ好友可见; 5=问答加密。\n + * 不传则相册默认为公开权限。\n + * 如果priv取值为5,即相册是问答加密的,则必须包含问题和答案两个参数:\n + * - question: 问题,不能超过30个字符。 + * - answer: 答案,不能超过30个字符。 + */ +@property (nonatomic, retain) TCOptionalStr paramPriv; + +/** + * question 问题,不能超过30个字符。 + * \note 如果priv取值为5,必须包含这个参数: + **/ +@property (nonatomic, retain) TCOptionalStr paramQuestion; + +/** + * answer 答案,不能超过30个字符。 + * \note 如果priv取值为5,必须包含这个参数: + **/ +@property (nonatomic, retain) TCOptionalStr paramAnswer; + +@end + +#pragma mark - +#pragma mark TCUploadPicDic +/** + * \brief 上传一张照片到QQ空间相册的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCUploadPicDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCUploadPicDic *) dictionary; + +/** + * photodesc string 照片描述,注意照片描述不能超过200个字符。 + */ +@property (nonatomic, retain) TCOptionalStr paramPhotodesc; +/** + * string 照片的命名,必须以.jpg, .gif, .png, .jpeg, .bmp此类后缀结尾。 + */ +@property (nonatomic, retain) TCOptionalStr paramTitle; + +/** + * string 相册id。可不填,不填时则根据“mobile”标识选择默认上传的相册。 + */ +@property (nonatomic, retain) TCOptionalStr paramAlbumid; + +/** + * 标志位 + * + * \note 0表示PC,1表示手机。用于当不传相册id时(即albumid为空时)控制是否传到手机相册。\n + * -# 如果传1,则当albumid为空时,图片会上传到手机相册; + * -# 如果不传或传0,则当albumid为空时,图片会上传到贴图相册; + */ +@property (nonatomic, assign) TCOptionalStr paramMobile; + +/** + * x string 照片拍摄时的地理位置的经度。请使用原始数据(纯经纬度,0-360)。 + */ +@property (nonatomic, retain) TCOptionalStr paramX; + +/** + * y string 照片拍摄时的地理位置的纬度。请使用原始数据(纯经纬度,0-360)。 + */ +@property (nonatomic, retain) TCOptionalStr paramY; + +/** + * picture 必须 string 上传照片的文件名以及图片的内容(在发送请求时,图片内容以二进制数据流的形式发送,见下面的请求示例),注意照片名称不能超过30个字符。 + */ +@property (nonatomic, retain) TCRequiredImage paramPicture; + +/** + * needfeed int 标识上传照片时是否要发feed + * \note(0:不发feed; 1:发feed)。如果不填则默认为发feed。 + */ +@property (nonatomic, assign)TCOptionalStr paramNeedfeed; + +/** + * successnum int 批量上传照片时,已成功上传的张数,指明上传完成情况。 + * \note 单张上传时可以不填,不填则默认为0。 + */ +@property (nonatomic, assign)TCOptionalStr paramSuccessnum; + +/** + * picnum int 批量上传照片的总张数,如果不填则默认为1。 + * \note + * - 如果picnum=1,为单张上传,发送单张上传feed; + * - 如果picnum>1,为批量上传,发送批量上传feed。 + * 批量上传方式:picnum为一次上传照片的张数,successnum初始值为0,每调用一次照片上传接口后递增其值。 + * 信息中心中的feed表现形式:批量上传时最新的7张在feed中展示。其中最新上传的一张图片展示为大图,剩下的 + * 六张按从新到旧的顺序展示为小图,其他图片不在feed中展示。 + */ +@property (nonatomic, assign)TCOptionalStr paramPicnum; + +@end + +#pragma mark - +#pragma mark TCAddShareDic +/** + * \brief 同步分享到QQ空间,腾讯微博的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCAddShareDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCAddShareDic *) dictionary; + +/** + * title 必须 string feeds的标题 最长36个中文字,超出部分会被截断。 + */ +@property (nonatomic, retain) TCRequiredStr paramTitle; + + +/** + * url 必须 string 分享所在网页资源的链接,点击后跳转至第三方网页,对应上文接口说明中2的超链接。请以http://开头。 + */ +@property (nonatomic, retain) TCRequiredStr paramUrl; + + +/** + * comment string 用户评论内容,也叫发表分享时的分享理由 禁止使用系统生产的语句进行代替。 + * 最长40个中文字,超出部分会被截断。 + */ +@property (nonatomic, retain) TCOptionalStr paramComment; + + +/** + * summary string 所分享的网页资源的摘要内容,或者是网页的概要描述 最长80个中文字,超出部分会被截断。 + */ +@property (nonatomic, retain) TCOptionalStr paramSummary; + +/** + * images string 所分享的网页资源的代表性图片链接",请以http://开头,长度限制255字符。多张图片以竖线(|)分隔,目前只有第一张图片有效,图片规格100*100为佳。 + */ +@property (nonatomic, retain) TCOptionalStr paramImages; + +/** + * type string 分享内容的类型。 + * + * \note 4表示网页;5表示视频(type=5时,必须传入playurl) + */ +@property (nonatomic, retain) TCOptionalStr paramType; + +/** + * playurl string 长度限制为256字节。仅在type=5的时候有效,表示视频的swf播放地址。 + */ +@property (nonatomic, retain) TCOptionalStr paramPlayurl; + +/** + * site 必须 string 分享的来源网站名称,请填写网站申请接入时注册的网站名称 + */ +@property (nonatomic, retain) TCRequiredStr paramSite; + +/** + * fromurl 必须 string 分享的来源网站对应的网站地址url 请以http://开头。 + */ +@property (nonatomic, retain) TCRequiredStr paramFromurl; + +/** + * nswb string 值为1时,表示分享不默认同步到微博,其他值或者不传此参数表示默认同步到微博。 + */ +@property (nonatomic, retain) TCOptionalStr paramNswb; + +@end + +#pragma mark - +#pragma mark TCCheckPageFansDic +/** + * \brief 验证是否认证空间粉丝tttyttyyyu的参数字典定义 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCCheckPageFansDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCCheckPageFansDic *) dictionary; + +/** + * 表示认证空间的QQ号码 + */ +@property (nonatomic, retain) TCRequiredStr paramPage_id; +@end + +#pragma mark - +#pragma mark TCSetUserHeadpic +/** + * \brief 设置用户头像 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCSetUserHeadpic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCSetUserHeadpic *) dictionary; + +/** + * 设置用户头像的图片 + */ +@property (nonatomic, retain) TCRequiredImage paramImage; + +/** + * 图片的文件名 + */ +@property (nonatomic, retain) TCOptionalStr paramFileName; +@end + +#pragma mark - +#pragma mark TCListPhotoDic + +/** + * \brief 获取用户QQ空间相册中的照片列表 + * + * 可以直接填写相应参数后将对象当作参数传入API中 + */ +@interface TCListPhotoDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCListPhotoDic *) dictionary; + +/** + * 表示要获取的照片列表所在的相册ID + */ +@property (nonatomic, retain) TCRequiredStr paramAlbumid; + +@end + +#pragma mark - +#pragma mark TCSendStoryDic +/** + * \brief QQ空间定向分享的参数字典定义 + * + * 该分享支持@到指定好友,最多支持10个好友。 + * 其中第三方应用可预传最多5个指定好友的openid,其余好友由用户自行选择。 + * 该分享形式仅提供跳QZone分享和本地Html5分享两种形式。 + * sendStroy不支持userData参数 + */ +@interface TCSendStoryDic : TCAPIRequest + +/** + * 返回一个对象用来进行API参数的填充 + * + * \note 不用释放,返回的对象是自动释放的 + */ ++ (TCSendStoryDic *) dictionary; + +/** + * 分享的标题 + */ +@property (nonatomic, retain) TCRequiredStr paramTitle; + +/** + * 故事摘要,最多不超过50个汉字,可以为空 + */ +@property (nonatomic, retain) TCOptionalStr paramSummary; + +/** + * 默认展示在输入框里的分享理由,最多120个汉字,可以为空 + */ +@property (nonatomic, retain) TCOptionalStr paramDescription; + +/** + * 图片url + */ +@property (nonatomic, retain) TCOptionalStr paramPics; + +/** + * 如果不填,则默认为"进入应用" + */ +@property (nonatomic, retain) TCRequiredStr paramAct; + +/** + * 点击分享的Url + */ +@property (nonatomic, retain) TCOptionalStr paramShareUrl; + +@end diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/sdkdef.h b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/sdkdef.h new file mode 100644 index 0000000..9415899 --- /dev/null +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Headers/sdkdef.h @@ -0,0 +1,445 @@ +/// +/// \file sdkdef.h +/// \brief SDK中相关常量定义 +/// +/// Created by Tencent on 12-12-25. +/// Copyright (c) 2012年 Tencent. All rights reserved. +/// + +#import +#import + +/** + * \brief 设置sdk的log等级 + */ +typedef enum { + TCOLogLevel_Disabled = -1, // 关闭所有log + TCOLogLevel_Error = 0, + TCOLogLevel_Warning, + TCOLogLevel_Info, + TCOLogLevel_Debug, +} TCOLogLevel; + +/** + * \brief 手机qq的当前版本 + */ +typedef enum QQVersion +{ + kQQUninstall, + kQQVersion3_0, + kQQVersion4_0, //支持sso登陆 + kQQVersion4_2_1, //ios7兼容 + kQQVersion4_5, //4.5版本,wpa会话 + kQQVersion4_6, //4.6版本,sso登陆信令通道切换 + kQQVersion4_7, //4.7版本 不确定新支持了什么样的属性 +} QQVersion; + + +/** + * \breif TIM的当前版本 + */ +typedef enum TIMVersion { + kTIMUinstall, + kTIMVersion1_1, +}TIMVersion; + +/** + * \breif 授权/分享 方式 + */ +typedef enum TencentAuthShareType { + AuthShareType_Unknow, + AuthShareType_QQ, + AuthShareType_TIM, +}TencentAuthShareType; + +/** + * \brief APIResponse.retCode可能的枚举常量 + */ +typedef enum +{ + URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器,并且服务器返回数据格式正确 + * \note 这里包括所请求业务操作失败的情况,例如没有授权等原因导致 + */ + + URLREQUEST_FAILED = 1, /**< 网络异常,或服务器返回的数据格式不正确导致无法解析 */ +} REPONSE_RESULT; + +/** + * \brief 增量授权失败原因 + * + * \note 增量授权失败不影响原token的有效性(原token已失效的情况除外) + */ +typedef enum +{ + kUpdateFailUnknown = 1, ///< 未知原因 + kUpdateFailUserCancel, ///< 用户取消 + kUpdateFailNetwork, ///< 网络问题 +} UpdateFailType; + +/** + * \brief 封装服务器返回的结果 + * + * APIResponse用于封装所有请求的返回结果,包括错误码、错误信息、原始返回数据以及返回数据的json格式字典 + */ +@interface APIResponse : NSObject { + int _detailRetCode; + int _retCode; + int _seq; + NSString *_errorMsg; + NSDictionary *_jsonResponse; + NSString *_message; + id _userData; +} + +/** + * 新增的详细错误码\n + * detailRetCode主要用于区分不同的错误情况,参见\ref OpenSDKError + */ +@property (nonatomic, assign) int detailRetCode; + +/** + * 网络请求是否成功送达服务器,以及服务器返回的数据格式是否正确\n + * retCode具体取值可参考\ref REPONSE_RESULT + */ +@property (nonatomic, assign) int retCode; + +/** + * 网络请求对应的递增序列号,方便内部管理 + */ +@property (nonatomic, assign) int seq; + +/** + * 错误提示语 + */ +@property (nonatomic, retain) NSString *errorMsg; + +/** + * 服务器返回数据的json格式字典\n + * 字典内具体参数的命名和含义请参考\ref api_spec + */ +@property (nonatomic, retain) NSDictionary *jsonResponse; + +/** + * 服务器返回的原始数据字符串 + */ +@property (nonatomic, retain) NSString *message; + +/** + * 用户保留数据 + */ +@property (nonatomic, retain) id userData; + +@end + + +/** + * 用户自定义的保留字段 + */ +FOUNDATION_EXTERN NSString * const PARAM_USER_DATA; + +/** + * \name 应用邀请参数字段定义 + */ +///@{ + +/** 应用邀请展示图片url的key */ +FOUNDATION_EXTERN NSString * const PARAM_APP_ICON; + +/** 应用邀请描述文本的key */ +FOUNDATION_EXTERN NSString * const PARAM_APP_DESC; + +/** 应用邀请好友列表的key */ +FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS; + +///@} + +/** + * \name sendStory新分享参数字段定义 + */ +///@{ + +/** 预填入接受人列表的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER; + +/** 分享feeds标题的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE; + +/** 分享feeds评论内容的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT; + +/** 分享feeds摘要的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY; + +/** 分享feeds展示图片url的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE; + +/** 分享feeds跳转链接url的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL; + +/** 分享feeds点击操作默认行为的key */ +FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT; + +///@} + +/** + * \name 设置头像参数字段定义 + */ +///@{ + +/** 头像图片数据的key */ +FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC; + +/** 头像图片文件名的key */ +FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME; + +///@} + +/** + * \name 服务器返回数据的参数字段定义 + */ +///@{ + +/** 服务器返回码的key */ +FOUNDATION_EXTERN NSString * const PARAM_RETCODE; + +/** 服务器返回错误信息的key */ +FOUNDATION_EXTERN NSString * const PARAM_MESSAGE; + +/** 服务器返回额外数据的key */ +FOUNDATION_EXTERN NSString * const PARAM_DATA; + +///@} + +/** + * \name 错误信息相关常量定义 + */ +///@{ + +/** 详细错误信息字典中额外信息的key */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo; + +/** 详细错误信息字典中返回码的key */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode; + +/** 详细错误信息字典中错误语句的key */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg; + +/** 不支持的接口 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI; + +/** 操作成功 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess; + +/** 未知错误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown; + +/** 用户取消 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel; + +/** 请重新登录 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin; + +/** 应用没有操作权限 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny; + +/** 网络异常或没有网络 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork; + +/** URL格式或协议错误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL; + +/** 解析数据出错 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse; + +/** 传入参数有误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam; + +/** 连接超时 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout; + +/** 安全问题 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity; + +/** 文件读写错误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO; + +/** 服务器端错误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer; + +/** 页面错误 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage; + +/** 设置头像图片过大 */ +FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge; + +///@} + +/** + * \brief SDK新增详细错误常量 + */ +typedef enum +{ + kOpenSDKInvalid = -1, ///< 无效的错误码 + kOpenSDKErrorUnsupportedAPI = -2, ///< 不支持的接口 + + /** + * \name CommonErrorCode + * 公共错误码 + */ + ///@{ + kOpenSDKErrorSuccess = 0, ///< 成功 + kOpenSDKErrorUnknown, ///< 未知错误 + kOpenSDKErrorUserCancel, ///< 用户取消 + kOpenSDKErrorReLogin, ///< token无效或用户未授权相应权限需要重新登录 + kOpenSDKErrorOperationDeny, ///< 第三方应用没有该api操作的权限 + ///@} + + /** + * \name NetworkRelatedErrorCode + * 网络相关错误码 + */ + ///@{ + kOpenSDKErrorNetwork, ///< 网络错误,网络不通或连接不到服务器 + kOpenSDKErrorURL, ///< URL格式或协议错误 + kOpenSDKErrorDataParse, ///< 数据解析错误,服务器返回的数据解析出错 + kOpenSDKErrorParam, ///< 传入参数错误 + kOpenSDKErrorConnTimeout, ///< http连接超时 + kOpenSDKErrorSecurity, ///< 安全问题 + kOpenSDKErrorIO, ///< 下载和文件IO错误 + kOpenSDKErrorServer, ///< 服务器端错误 + ///@} + + /** + * \name WebViewRelatedError + * webview特有错误 + */ + ///@{ + kOpenSDKErrorWebPage, ///< 页面错误 + ///@} + + /** + * \name SetUserHeadRelatedErrorCode + * 设置头像自定义错误码段 + */ + ///@{ + kOpenSDKErrorUserHeadPicLarge = 0x010000, ///< 图片过大 设置头像自定义错误码 + ///@} +} OpenSDKError; + +/** + * \name SDK版本(v1.3)支持的授权列表常量 + */ +///@{ + +/** 发表一条说说到QQ空间(需要申请权限) */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC; + +/** 发表一篇日志到QQ空间(需要申请权限) */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG; + +/** 创建一个QQ空间相册(需要申请权限) */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM; + +/** 上传一张照片到QQ空间相册(需要申请权限) */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC; + +/** 获取用户QQ空间相册列表(需要申请权限) */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM; + +/** 同步分享到QQ空间、腾讯微博 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE; + +/** 验证是否认证空间粉丝 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS; + +/** 获取登录用户自己的详细信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO; + +/** 获取其他用户的详细信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO; + +/** 获取会员用户基本信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO; + +/** 获取会员用户详细信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO; + +/** 获取用户信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO; + +/** 移动端获取用户信息 */ +FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO; +///@} + + +/** + * \name CGI接口相关参数类型定义 + */ +///@{ + +/** 必填的字符串类型参数 */ +typedef NSString *TCRequiredStr; + +/** 必填的UIImage类型参数 */ +typedef UIImage *TCRequiredImage; + +/** 必填的整型参数 */ +typedef NSInteger TCRequiredInt; + +/** 必填的数字类型 */ +typedef NSNumber *TCRequiredNumber; + +/** 必填的NSData参数 */ +typedef NSData *TCRequiredData; + +/** 可选的字符串类型参数 */ +typedef NSString *TCOptionalStr; + +/** 可选的UIImage类型参数 */ +typedef UIImage *TCOptionalImage; + +/** 可选的整型参数 */ +typedef NSInteger TCOptionalInt; + +/** 可选的数字类型 */ +typedef NSNumber *TCOptionalNumber; + +/** 可选的不定类型参数 */ +typedef id TCRequiredId; +///@} + + +/** + * \brief CGI请求的参数字典封装辅助基类 + * + * 将相应属性的值以key-value的形式保存到参数字典中 + */ +@interface TCAPIRequest : NSMutableDictionary + +/** CGI请求的URL地址 */ +@property (nonatomic, readonly) NSURL *apiURL; + +/** CGI请求方式:"GET","POST" */ +@property (nonatomic, readonly) NSString *method; + +/** + * API参数中的保留字段,可以塞入任意字典支持的类型,再调用完成后会带回给调用方 + */ +@property (nonatomic, retain) TCRequiredId paramUserData; + +/** + * APIResponse,API的返回结果 + */ +@property (nonatomic, readonly) APIResponse *response; + +/** 取消相应的CGI请求任务 */ +- (void)cancel; + +@end + +@protocol TCAPIRequestDelegate +@optional +- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response; + +@end + diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/ios_open_sdk_2.9.3.2_iphone b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.0.470_iphone_release similarity index 100% rename from Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/ios_open_sdk_2.9.3.2_iphone rename to Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.0.470_iphone_release diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/TencentOpenAPI b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/TencentOpenAPI new file mode 100644 index 0000000..a8860c6 Binary files /dev/null and b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenAPI.framework/TencentOpenAPI differ diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/Info.plist b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/Info.plist new file mode 100644 index 0000000..e225be2 Binary files /dev/null and b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/Info.plist differ diff --git a/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/error.png b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/error.png new file mode 100644 index 0000000..b0ce461 Binary files /dev/null and b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/error.png differ diff --git a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/local.html b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/local.html similarity index 96% rename from Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/local.html rename to Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/local.html index b9a5716..73f1a73 100644 --- a/Pods/UMengSocial/Umeng_SDK_Social_iOS_ARM64_4.4/UMSocial_Sdk_Extra_Frameworks/TencentOpenAPI/TencentOpenApi_IOS_Bundle.bundle/local.html +++ b/Pods/UMengUShare/UShareSDK/SocialLibraries/QQ/QQSDK/TencentOpenApi_IOS_Bundle.bundle/local.html @@ -56,7 +56,7 @@

AppGiftRequest : type == "request" ? "发送应用请求" : "发送免费礼物", SendStory : "发送分享" }[iface]; - document.write('